xref: /haiku/src/apps/deskbar/BarWindow.cpp (revision fe624b3937dc8b7a4551dbc66b5e5c81dfb468d6)
141281cf3SAxel Dörfler /*
241281cf3SAxel Dörfler Open Tracker License
341281cf3SAxel Dörfler 
441281cf3SAxel Dörfler Terms and Conditions
541281cf3SAxel Dörfler 
641281cf3SAxel Dörfler Copyright (c) 1991-2000, Be Incorporated. All rights reserved.
741281cf3SAxel Dörfler 
841281cf3SAxel Dörfler Permission is hereby granted, free of charge, to any person obtaining a copy of
941281cf3SAxel Dörfler this software and associated documentation files (the "Software"), to deal in
1041281cf3SAxel Dörfler the Software without restriction, including without limitation the rights to
1141281cf3SAxel Dörfler use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
1241281cf3SAxel Dörfler of the Software, and to permit persons to whom the Software is furnished to do
1341281cf3SAxel Dörfler so, subject to the following conditions:
1441281cf3SAxel Dörfler 
1541281cf3SAxel Dörfler The above copyright notice and this permission notice applies to all licensees
1641281cf3SAxel Dörfler and shall be included in all copies or substantial portions of the Software.
1741281cf3SAxel Dörfler 
1841281cf3SAxel Dörfler THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1941281cf3SAxel Dörfler IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
2041281cf3SAxel Dörfler FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
2141281cf3SAxel Dörfler BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2241281cf3SAxel Dörfler AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
2341281cf3SAxel Dörfler WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2441281cf3SAxel Dörfler 
2541281cf3SAxel Dörfler Except as contained in this notice, the name of Be Incorporated shall not be
2641281cf3SAxel Dörfler used in advertising or otherwise to promote the sale, use or other dealings in
2741281cf3SAxel Dörfler this Software without prior written authorization from Be Incorporated.
2841281cf3SAxel Dörfler 
291075cc34SFredrik Holmqvist Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered
301075cc34SFredrik Holmqvist trademarks of Be Incorporated in the United States and other countries. Other
311075cc34SFredrik Holmqvist brand product names are registered trademarks or trademarks of their respective
321075cc34SFredrik Holmqvist holders.
3341281cf3SAxel Dörfler All rights reserved.
3441281cf3SAxel Dörfler */
3541281cf3SAxel Dörfler 
365b576468SAxel Dörfler 
375b576468SAxel Dörfler #include "BarWindow.h"
385b576468SAxel Dörfler 
3941281cf3SAxel Dörfler #include <stdio.h>
405b576468SAxel Dörfler 
4141281cf3SAxel Dörfler #include <Application.h>
423cf2d117SJohn Scipione #include <Catalog.h>
4341281cf3SAxel Dörfler #include <Directory.h>
4441281cf3SAxel Dörfler #include <FindDirectory.h>
4541281cf3SAxel Dörfler #include <Path.h>
4641281cf3SAxel Dörfler #include <Debug.h>
4741281cf3SAxel Dörfler #include <File.h>
48cd7548f5SJonas Sundström #include <Locale.h>
4941281cf3SAxel Dörfler #include <MenuItem.h>
5041281cf3SAxel Dörfler #include <MessageFilter.h>
511cd61330SJohn Scipione #include <MessagePrivate.h>
5241281cf3SAxel Dörfler #include <Screen.h>
5341281cf3SAxel Dörfler 
5441281cf3SAxel Dörfler #include "BarApp.h"
5541281cf3SAxel Dörfler #include "BarMenuBar.h"
5641281cf3SAxel Dörfler #include "BarView.h"
57323b6546SOliver Tappe #include "DeskbarMenu.h"
5841281cf3SAxel Dörfler #include "PublicCommands.h"
5941281cf3SAxel Dörfler #include "StatusView.h"
6041281cf3SAxel Dörfler #include "tracker_private.h"
6141281cf3SAxel Dörfler 
6241281cf3SAxel Dörfler 
63546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT
64546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "MainWindow"
65cd7548f5SJonas Sundström 
66cd7548f5SJonas Sundström 
671075cc34SFredrik Holmqvist // This is a very ugly hack to be able to call the private
681075cc34SFredrik Holmqvist // BMenuBar::StartMenuBar() method from the TBarWindow::ShowBeMenu() method.
6941281cf3SAxel Dörfler // Don't do this at home -- but why the hell is this method private?
7041281cf3SAxel Dörfler #if __MWERKS__
714a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack StartMenuBar__8BMenuBarFlbbP5BRect
724a71b881SAxel Dörfler #elif __GNUC__ <= 2
734a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack StartMenuBar__8BMenuBarlbT2P5BRect
744a71b881SAxel Dörfler #elif __GNUC__ > 2
75e9632898SAlex Smith 	#if B_HAIKU_64_BIT
76e9632898SAlex Smith 		#define BMenuBar_StartMenuBar_Hack _ZN8BMenuBar12StartMenuBarEibbP5BRect
77e9632898SAlex Smith 	#else
784a71b881SAxel Dörfler 		#define BMenuBar_StartMenuBar_Hack _ZN8BMenuBar12StartMenuBarElbbP5BRect
79e9632898SAlex Smith 	#endif
8041281cf3SAxel Dörfler #else
8141281cf3SAxel Dörfler #	error "You may want to port this ugly hack to your compiler ABI"
8241281cf3SAxel Dörfler #endif
831075cc34SFredrik Holmqvist extern "C" void
841075cc34SFredrik Holmqvist 	BMenuBar_StartMenuBar_Hack(BMenuBar*, int32, bool, bool, BRect*);
8541281cf3SAxel Dörfler 
8641281cf3SAxel Dörfler 
87323b6546SOliver Tappe TDeskbarMenu* TBarWindow::sDeskbarMenu = NULL;
8841281cf3SAxel Dörfler 
8941281cf3SAxel Dörfler 
9041281cf3SAxel Dörfler TBarWindow::TBarWindow()
9172f5ac30SAxel Dörfler 	:
92066522e8SJonas Sundström 	BWindow(BRect(-1000.0f, -1000.0f, -1000.0f, -1000.0f),
93560ff447SJonas Sundström 		B_TRANSLATE_SYSTEM_NAME("Deskbar"), B_BORDERED_WINDOW,
9441281cf3SAxel Dörfler 		B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
9574c7ad20SIngo Weinhold 		| B_NOT_MINIMIZABLE | B_NOT_MOVABLE | B_NOT_RESIZABLE
9674c7ad20SIngo Weinhold 		| B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
9722812ba2SRene Gollent 		B_ALL_WORKSPACES),
9822812ba2SRene Gollent 	fShowingMenu(false)
9941281cf3SAxel Dörfler {
10041281cf3SAxel Dörfler 	desk_settings* settings = ((TBarApp*)be_app)->Settings();
10141281cf3SAxel Dörfler 	if (settings->alwaysOnTop)
10241281cf3SAxel Dörfler 		SetFeel(B_FLOATING_ALL_WINDOW_FEEL);
103*fe624b39SJohn Scipione 
10472f5ac30SAxel Dörfler 	fBarView = new TBarView(Bounds(), settings->vertical, settings->left,
105573f748cSJohn Scipione 		settings->top, settings->state, settings->width);
10641281cf3SAxel Dörfler 	AddChild(fBarView);
10741281cf3SAxel Dörfler 
10835c6651cSKarsten Heimrich 	RemoveShortcut('H', B_COMMAND_KEY | B_CONTROL_KEY);
10941281cf3SAxel Dörfler 	AddShortcut('F', B_COMMAND_KEY, new BMessage(kFindButton));
11041281cf3SAxel Dörfler }
11141281cf3SAxel Dörfler 
11241281cf3SAxel Dörfler 
11341281cf3SAxel Dörfler void
11441281cf3SAxel Dörfler TBarWindow::MenusBeginning()
11541281cf3SAxel Dörfler {
11641281cf3SAxel Dörfler 	BPath path;
11741281cf3SAxel Dörfler 	entry_ref ref;
11841281cf3SAxel Dörfler 
11941281cf3SAxel Dörfler 	find_directory (B_USER_DESKBAR_DIRECTORY, &path);
12041281cf3SAxel Dörfler 	get_ref_for_path(path.Path(), &ref);
12141281cf3SAxel Dörfler 
12241281cf3SAxel Dörfler 	BEntry entry(&ref, true);
12341281cf3SAxel Dörfler 	if (entry.InitCheck() == B_OK && entry.IsDirectory()) {
12441281cf3SAxel Dörfler 		//	need the entry_ref to the actual item
12541281cf3SAxel Dörfler 		entry.GetRef(&ref);
126323b6546SOliver Tappe 		//	set the nav directory to the deskbar folder
127323b6546SOliver Tappe 		sDeskbarMenu->SetNavDir(&ref);
12841281cf3SAxel Dörfler 	} else if (!entry.Exists()) {
129323b6546SOliver Tappe 		//	the deskbar folder does not exist
13041281cf3SAxel Dörfler 		//	create one now
13141281cf3SAxel Dörfler 		BDirectory dir;
13241281cf3SAxel Dörfler 		if (entry.GetParent(&dir) == B_OK) {
133323b6546SOliver Tappe 			BDirectory deskbarDir;
134323b6546SOliver Tappe 			dir.CreateDirectory("deskbar", &deskbarDir);
135323b6546SOliver Tappe 			if (deskbarDir.GetEntry(&entry) == B_OK
13641281cf3SAxel Dörfler 				&& entry.GetRef(&ref) == B_OK)
137323b6546SOliver Tappe 				sDeskbarMenu->SetNavDir(&ref);
13841281cf3SAxel Dörfler 		}
13941281cf3SAxel Dörfler 	} else {
14041281cf3SAxel Dörfler 		//	this really should never happen
14141281cf3SAxel Dörfler 		TRESPASS();
14241281cf3SAxel Dörfler 		return;
14341281cf3SAxel Dörfler 	}
14441281cf3SAxel Dörfler 
145323b6546SOliver Tappe 	sDeskbarMenu->NeedsToRebuild();
146323b6546SOliver Tappe 	sDeskbarMenu->ResetTargets();
14741281cf3SAxel Dörfler 
14822812ba2SRene Gollent 	fShowingMenu = true;
14941281cf3SAxel Dörfler 	BWindow::MenusBeginning();
15041281cf3SAxel Dörfler }
15141281cf3SAxel Dörfler 
15241281cf3SAxel Dörfler 
15341281cf3SAxel Dörfler void
15441281cf3SAxel Dörfler TBarWindow::MenusEnded()
15541281cf3SAxel Dörfler {
15622812ba2SRene Gollent 	fShowingMenu = false;
15741281cf3SAxel Dörfler 	BWindow::MenusEnded();
15841281cf3SAxel Dörfler 
159323b6546SOliver Tappe 	if (sDeskbarMenu->LockLooper()) {
1603702e473SStephan Aßmus 		// TODO: is this ok?
161323b6546SOliver Tappe 		sDeskbarMenu->RemoveItems(0, sDeskbarMenu->CountItems(), true);
162323b6546SOliver Tappe 		sDeskbarMenu->UnlockLooper();
16341281cf3SAxel Dörfler 	}
1644446e07aSStefano Ceccherini }
16541281cf3SAxel Dörfler 
16641281cf3SAxel Dörfler 
16741281cf3SAxel Dörfler void
16841281cf3SAxel Dörfler TBarWindow::MessageReceived(BMessage* message)
16941281cf3SAxel Dörfler {
17041281cf3SAxel Dörfler 	switch (message->what) {
17141281cf3SAxel Dörfler 		case kFindButton:
17241281cf3SAxel Dörfler 		{
17341281cf3SAxel Dörfler 			BMessenger tracker(kTrackerSignature);
17441281cf3SAxel Dörfler 			tracker.SendMessage(message);
17541281cf3SAxel Dörfler 			break;
17641281cf3SAxel Dörfler 		}
17741281cf3SAxel Dörfler 
17841281cf3SAxel Dörfler 		case 'gloc':
17941281cf3SAxel Dörfler 			GetLocation(message);
18041281cf3SAxel Dörfler 			break;
18141281cf3SAxel Dörfler 
18241281cf3SAxel Dörfler 		case 'sloc':
18341281cf3SAxel Dörfler 			SetLocation(message);
18441281cf3SAxel Dörfler 			break;
18541281cf3SAxel Dörfler 
18641281cf3SAxel Dörfler 		case 'gexp':
18741281cf3SAxel Dörfler 			IsExpanded(message);
18841281cf3SAxel Dörfler 			break;
18941281cf3SAxel Dörfler 
19041281cf3SAxel Dörfler 		case 'sexp':
19141281cf3SAxel Dörfler 			Expand(message);
19241281cf3SAxel Dörfler 			break;
19341281cf3SAxel Dörfler 
19441281cf3SAxel Dörfler 		case 'info':
19541281cf3SAxel Dörfler 			ItemInfo(message);
19641281cf3SAxel Dörfler 			break;
19741281cf3SAxel Dörfler 
19841281cf3SAxel Dörfler 		case 'exst':
19941281cf3SAxel Dörfler 			ItemExists(message);
20041281cf3SAxel Dörfler 			break;
20141281cf3SAxel Dörfler 
20241281cf3SAxel Dörfler 		case 'cwnt':
20341281cf3SAxel Dörfler 			CountItems(message);
20441281cf3SAxel Dörfler 			break;
20541281cf3SAxel Dörfler 
20641281cf3SAxel Dörfler 		case 'adon':
20741281cf3SAxel Dörfler 		case 'icon':
20841281cf3SAxel Dörfler 			AddItem(message);
20941281cf3SAxel Dörfler 			break;
21041281cf3SAxel Dörfler 
21141281cf3SAxel Dörfler 		case 'remv':
21241281cf3SAxel Dörfler 			RemoveItem(message);
21341281cf3SAxel Dörfler 			break;
21441281cf3SAxel Dörfler 
21541281cf3SAxel Dörfler 		case 'iloc':
21641281cf3SAxel Dörfler 			GetIconFrame(message);
21741281cf3SAxel Dörfler 			break;
21841281cf3SAxel Dörfler 
21941281cf3SAxel Dörfler 		default:
22041281cf3SAxel Dörfler 			BWindow::MessageReceived(message);
22141281cf3SAxel Dörfler 			break;
22241281cf3SAxel Dörfler 	}
22341281cf3SAxel Dörfler }
22441281cf3SAxel Dörfler 
22541281cf3SAxel Dörfler 
22641281cf3SAxel Dörfler void
2275b576468SAxel Dörfler TBarWindow::Minimize(bool minimize)
2285b576468SAxel Dörfler {
2295b576468SAxel Dörfler 	// Don't allow the Deskbar to be minimized
2305b576468SAxel Dörfler 	if (!minimize)
2315b576468SAxel Dörfler 		BWindow::Minimize(false);
2325b576468SAxel Dörfler }
2335b576468SAxel Dörfler 
2345b576468SAxel Dörfler 
2355b576468SAxel Dörfler void
23641281cf3SAxel Dörfler TBarWindow::SaveSettings()
23741281cf3SAxel Dörfler {
23841281cf3SAxel Dörfler 	fBarView->SaveSettings();
23941281cf3SAxel Dörfler }
24041281cf3SAxel Dörfler 
24141281cf3SAxel Dörfler 
24241281cf3SAxel Dörfler bool
24341281cf3SAxel Dörfler TBarWindow::QuitRequested()
24441281cf3SAxel Dörfler {
24541281cf3SAxel Dörfler 	be_app->PostMessage(B_QUIT_REQUESTED);
24641281cf3SAxel Dörfler 
24741281cf3SAxel Dörfler 	return BWindow::QuitRequested();
24841281cf3SAxel Dörfler }
24941281cf3SAxel Dörfler 
25041281cf3SAxel Dörfler 
25141281cf3SAxel Dörfler void
25241281cf3SAxel Dörfler TBarWindow::WorkspaceActivated(int32 workspace, bool active)
25341281cf3SAxel Dörfler {
25441281cf3SAxel Dörfler 	BWindow::WorkspaceActivated(workspace, active);
25541281cf3SAxel Dörfler 
256d0a49328SJohn Scipione 	if (active && !(fBarView->ExpandoState() && fBarView->Vertical()))
25741281cf3SAxel Dörfler 		fBarView->UpdatePlacement();
25841281cf3SAxel Dörfler 	else {
25941281cf3SAxel Dörfler 		BRect screenFrame = (BScreen(fBarView->Window())).Frame();
26041281cf3SAxel Dörfler 		fBarView->SizeWindow(screenFrame);
26141281cf3SAxel Dörfler 		fBarView->PositionWindow(screenFrame);
26241281cf3SAxel Dörfler 		fBarView->Invalidate();
26341281cf3SAxel Dörfler 	}
26441281cf3SAxel Dörfler }
26541281cf3SAxel Dörfler 
26641281cf3SAxel Dörfler 
26741281cf3SAxel Dörfler void
26841281cf3SAxel Dörfler TBarWindow::ScreenChanged(BRect size, color_space depth)
26941281cf3SAxel Dörfler {
27041281cf3SAxel Dörfler 	BWindow::ScreenChanged(size, depth);
27141281cf3SAxel Dörfler 
27241281cf3SAxel Dörfler 	fBarView->UpdatePlacement();
27341281cf3SAxel Dörfler }
27441281cf3SAxel Dörfler 
27541281cf3SAxel Dörfler 
27641281cf3SAxel Dörfler void
277323b6546SOliver Tappe TBarWindow::SetDeskbarMenu(TDeskbarMenu* menu)
27841281cf3SAxel Dörfler {
279323b6546SOliver Tappe 	sDeskbarMenu = menu;
28041281cf3SAxel Dörfler }
28141281cf3SAxel Dörfler 
28241281cf3SAxel Dörfler 
283323b6546SOliver Tappe TDeskbarMenu*
284323b6546SOliver Tappe TBarWindow::DeskbarMenu()
28541281cf3SAxel Dörfler {
286323b6546SOliver Tappe 	return sDeskbarMenu;
28741281cf3SAxel Dörfler }
28841281cf3SAxel Dörfler 
28941281cf3SAxel Dörfler 
29041281cf3SAxel Dörfler void
291323b6546SOliver Tappe TBarWindow::ShowDeskbarMenu()
29241281cf3SAxel Dörfler {
29341281cf3SAxel Dörfler 	BMenuBar* menuBar = fBarView->BarMenuBar();
29441281cf3SAxel Dörfler 	if (menuBar == NULL)
29541281cf3SAxel Dörfler 		menuBar = KeyMenuBar();
29641281cf3SAxel Dörfler 
29741281cf3SAxel Dörfler 	if (menuBar == NULL)
29841281cf3SAxel Dörfler 		return;
29941281cf3SAxel Dörfler 
3004a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(menuBar, 0, true, true, NULL);
30141281cf3SAxel Dörfler }
30241281cf3SAxel Dörfler 
30341281cf3SAxel Dörfler 
30441281cf3SAxel Dörfler void
30541281cf3SAxel Dörfler TBarWindow::ShowTeamMenu()
30641281cf3SAxel Dörfler {
30741281cf3SAxel Dörfler 	int32 index = 0;
30841281cf3SAxel Dörfler 	if (fBarView->BarMenuBar() == NULL)
30941281cf3SAxel Dörfler 		index = 2;
31041281cf3SAxel Dörfler 
31141281cf3SAxel Dörfler 	if (KeyMenuBar() == NULL)
31241281cf3SAxel Dörfler 		return;
31341281cf3SAxel Dörfler 
3144a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(KeyMenuBar(), index, true, true, NULL);
31541281cf3SAxel Dörfler }
31641281cf3SAxel Dörfler 
31741281cf3SAxel Dörfler 
3181075cc34SFredrik Holmqvist // determines the actual location of the window
31941281cf3SAxel Dörfler 
32041281cf3SAxel Dörfler deskbar_location
32141281cf3SAxel Dörfler TBarWindow::DeskbarLocation() const
32241281cf3SAxel Dörfler {
32341281cf3SAxel Dörfler 	bool left = fBarView->Left();
32441281cf3SAxel Dörfler 	bool top = fBarView->Top();
32541281cf3SAxel Dörfler 
32641281cf3SAxel Dörfler 	if (fBarView->AcrossTop())
32741281cf3SAxel Dörfler 		return B_DESKBAR_TOP;
32841281cf3SAxel Dörfler 
32941281cf3SAxel Dörfler 	if (fBarView->AcrossBottom())
33041281cf3SAxel Dörfler 		return B_DESKBAR_BOTTOM;
33141281cf3SAxel Dörfler 
33241281cf3SAxel Dörfler 	if (left && top)
33341281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_TOP;
33441281cf3SAxel Dörfler 
33541281cf3SAxel Dörfler 	if (!left && top)
33641281cf3SAxel Dörfler 		return B_DESKBAR_RIGHT_TOP;
33741281cf3SAxel Dörfler 
33841281cf3SAxel Dörfler 	if (left && !top)
33941281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_BOTTOM;
34041281cf3SAxel Dörfler 
34141281cf3SAxel Dörfler 	return B_DESKBAR_RIGHT_BOTTOM;
34241281cf3SAxel Dörfler }
34341281cf3SAxel Dörfler 
34441281cf3SAxel Dörfler 
34541281cf3SAxel Dörfler void
34641281cf3SAxel Dörfler TBarWindow::GetLocation(BMessage* message)
34741281cf3SAxel Dörfler {
34841281cf3SAxel Dörfler 	BMessage reply('rply');
34941281cf3SAxel Dörfler 	reply.AddInt32("location", (int32)DeskbarLocation());
350d0a49328SJohn Scipione 	reply.AddBool("expanded", fBarView->ExpandoState());
35141281cf3SAxel Dörfler 
35241281cf3SAxel Dörfler 	message->SendReply(&reply);
35341281cf3SAxel Dörfler }
35441281cf3SAxel Dörfler 
35541281cf3SAxel Dörfler 
35641281cf3SAxel Dörfler void
35741281cf3SAxel Dörfler TBarWindow::SetDeskbarLocation(deskbar_location location, bool newExpandState)
35841281cf3SAxel Dörfler {
35941281cf3SAxel Dörfler 	// left top and right top are the only two that
36041281cf3SAxel Dörfler 	// currently pay attention to expand, ignore for all others
36141281cf3SAxel Dörfler 
36241281cf3SAxel Dörfler 	bool left = false, top = true, vertical, expand;
36341281cf3SAxel Dörfler 
36441281cf3SAxel Dörfler 	switch (location) {
36541281cf3SAxel Dörfler 		case B_DESKBAR_TOP:
36641281cf3SAxel Dörfler 			left = true;
36741281cf3SAxel Dörfler 			top = true;
36841281cf3SAxel Dörfler 			vertical = false;
36941281cf3SAxel Dörfler 			expand = true;
37041281cf3SAxel Dörfler 			break;
37141281cf3SAxel Dörfler 
37241281cf3SAxel Dörfler 		case B_DESKBAR_BOTTOM:
37341281cf3SAxel Dörfler 			left = true;
37441281cf3SAxel Dörfler 			top = false;
37541281cf3SAxel Dörfler 			vertical = false;
37641281cf3SAxel Dörfler 			expand = true;
37741281cf3SAxel Dörfler 			break;
37841281cf3SAxel Dörfler 
37941281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_TOP:
38041281cf3SAxel Dörfler 			left = true;
38141281cf3SAxel Dörfler 			top = true;
38241281cf3SAxel Dörfler 			vertical = true;
38341281cf3SAxel Dörfler 			expand = newExpandState;
38441281cf3SAxel Dörfler 			break;
38541281cf3SAxel Dörfler 
38641281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_TOP:
38741281cf3SAxel Dörfler 			left = false;
38841281cf3SAxel Dörfler 			top = true;
38941281cf3SAxel Dörfler 			vertical = true;
39041281cf3SAxel Dörfler 			expand = newExpandState;
39141281cf3SAxel Dörfler 			break;
39241281cf3SAxel Dörfler 
39341281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_BOTTOM:
39441281cf3SAxel Dörfler 			left = true;
39541281cf3SAxel Dörfler 			top = false;
39641281cf3SAxel Dörfler 			vertical = true;
39741281cf3SAxel Dörfler 			expand = false;
39841281cf3SAxel Dörfler 			break;
39941281cf3SAxel Dörfler 
40041281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_BOTTOM:
40141281cf3SAxel Dörfler 			left = false;
40241281cf3SAxel Dörfler 			top = false;
40341281cf3SAxel Dörfler 			vertical = true;
40441281cf3SAxel Dörfler 			expand = false;
40541281cf3SAxel Dörfler 			break;
40641281cf3SAxel Dörfler 
40741281cf3SAxel Dörfler 		default:
40841281cf3SAxel Dörfler 			left = true;
40941281cf3SAxel Dörfler 			top = true;
41041281cf3SAxel Dörfler 			vertical = false;
41141281cf3SAxel Dörfler 			expand = true;
41241281cf3SAxel Dörfler 			break;
41341281cf3SAxel Dörfler 	}
41441281cf3SAxel Dörfler 
41541281cf3SAxel Dörfler 	fBarView->ChangeState(expand, vertical, left, top);
41641281cf3SAxel Dörfler }
41741281cf3SAxel Dörfler 
4185b576468SAxel Dörfler 
41941281cf3SAxel Dörfler void
42041281cf3SAxel Dörfler TBarWindow::SetLocation(BMessage* message)
42141281cf3SAxel Dörfler {
42241281cf3SAxel Dörfler 	deskbar_location location;
42341281cf3SAxel Dörfler 	bool expand;
42441281cf3SAxel Dörfler 	if (message->FindInt32("location", (int32*)&location) == B_OK
42541281cf3SAxel Dörfler 		&& message->FindBool("expand", &expand) == B_OK)
42641281cf3SAxel Dörfler 		SetDeskbarLocation(location, expand);
42741281cf3SAxel Dörfler }
42841281cf3SAxel Dörfler 
42941281cf3SAxel Dörfler 
43041281cf3SAxel Dörfler void
43141281cf3SAxel Dörfler TBarWindow::IsExpanded(BMessage* message)
43241281cf3SAxel Dörfler {
43341281cf3SAxel Dörfler 	BMessage reply('rply');
434d0a49328SJohn Scipione 	reply.AddBool("expanded", fBarView->ExpandoState());
43541281cf3SAxel Dörfler 	message->SendReply(&reply);
43641281cf3SAxel Dörfler }
43741281cf3SAxel Dörfler 
43841281cf3SAxel Dörfler 
43941281cf3SAxel Dörfler void
44041281cf3SAxel Dörfler TBarWindow::Expand(BMessage* message)
44141281cf3SAxel Dörfler {
44241281cf3SAxel Dörfler 	bool expand;
44341281cf3SAxel Dörfler 	if (message->FindBool("expand", &expand) == B_OK) {
44441281cf3SAxel Dörfler 		bool vertical = fBarView->Vertical();
44541281cf3SAxel Dörfler 		bool left = fBarView->Left();
44641281cf3SAxel Dörfler 		bool top = fBarView->Top();
44741281cf3SAxel Dörfler 		fBarView->ChangeState(expand, vertical, left, top);
44841281cf3SAxel Dörfler 	}
44941281cf3SAxel Dörfler }
45041281cf3SAxel Dörfler 
45141281cf3SAxel Dörfler 
45241281cf3SAxel Dörfler void
45341281cf3SAxel Dörfler TBarWindow::ItemInfo(BMessage* message)
45441281cf3SAxel Dörfler {
45541281cf3SAxel Dörfler 	BMessage replyMsg;
45641281cf3SAxel Dörfler 	const char* name;
45741281cf3SAxel Dörfler 	int32 id;
45841281cf3SAxel Dörfler 	DeskbarShelf shelf;
45941281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK) {
46041281cf3SAxel Dörfler 		if (fBarView->ItemInfo(id, &name, &shelf) == B_OK) {
46141281cf3SAxel Dörfler 			replyMsg.AddString("name", name);
46241281cf3SAxel Dörfler #if SHELF_AWARE
46341281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
46441281cf3SAxel Dörfler #endif
46541281cf3SAxel Dörfler 		}
46641281cf3SAxel Dörfler 	} else if (message->FindString("name", &name) == B_OK) {
46741281cf3SAxel Dörfler 		if (fBarView->ItemInfo(name, &id, &shelf) == B_OK) {
46841281cf3SAxel Dörfler 			replyMsg.AddInt32("id", id);
46941281cf3SAxel Dörfler #if SHELF_AWARE
47041281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
47141281cf3SAxel Dörfler #endif
47241281cf3SAxel Dörfler 		}
47341281cf3SAxel Dörfler 	}
47441281cf3SAxel Dörfler 
47541281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
47641281cf3SAxel Dörfler }
47741281cf3SAxel Dörfler 
47841281cf3SAxel Dörfler 
47941281cf3SAxel Dörfler void
48041281cf3SAxel Dörfler TBarWindow::ItemExists(BMessage* message)
48141281cf3SAxel Dörfler {
48241281cf3SAxel Dörfler 	BMessage replyMsg;
48341281cf3SAxel Dörfler 	const char* name;
48441281cf3SAxel Dörfler 	int32 id;
48541281cf3SAxel Dörfler 	DeskbarShelf shelf;
48641281cf3SAxel Dörfler 
48741281cf3SAxel Dörfler #if SHELF_AWARE
48841281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
48941281cf3SAxel Dörfler #endif
49041281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
49141281cf3SAxel Dörfler 
49241281cf3SAxel Dörfler 	bool exists = false;
49341281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
49441281cf3SAxel Dörfler 		exists = fBarView->ItemExists(id, shelf);
49541281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
49641281cf3SAxel Dörfler 		exists = fBarView->ItemExists(name, shelf);
49741281cf3SAxel Dörfler 
49841281cf3SAxel Dörfler 	replyMsg.AddBool("exists", exists);
49941281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
50041281cf3SAxel Dörfler }
50141281cf3SAxel Dörfler 
50241281cf3SAxel Dörfler 
50341281cf3SAxel Dörfler void
50441281cf3SAxel Dörfler TBarWindow::CountItems(BMessage* message)
50541281cf3SAxel Dörfler {
50641281cf3SAxel Dörfler 	DeskbarShelf shelf;
50741281cf3SAxel Dörfler 
50841281cf3SAxel Dörfler #if SHELF_AWARE
50941281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
51041281cf3SAxel Dörfler #endif
51141281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
51241281cf3SAxel Dörfler 
51341281cf3SAxel Dörfler 	BMessage reply('rply');
51441281cf3SAxel Dörfler 	reply.AddInt32("count", fBarView->CountItems(shelf));
51541281cf3SAxel Dörfler 	message->SendReply(&reply);
51641281cf3SAxel Dörfler }
51741281cf3SAxel Dörfler 
51841281cf3SAxel Dörfler 
51941281cf3SAxel Dörfler void
52041281cf3SAxel Dörfler TBarWindow::AddItem(BMessage* message)
52141281cf3SAxel Dörfler {
5223e6ff860SRene Gollent 	DeskbarShelf shelf = B_DESKBAR_TRAY;
52341281cf3SAxel Dörfler 	entry_ref ref;
52441281cf3SAxel Dörfler 	int32 id = 999;
52541281cf3SAxel Dörfler 	BMessage reply;
52641281cf3SAxel Dörfler 	status_t err = B_ERROR;
52741281cf3SAxel Dörfler 
52841281cf3SAxel Dörfler 	BMessage archivedView;
52941281cf3SAxel Dörfler 	if (message->FindMessage("view", &archivedView) == B_OK) {
53041281cf3SAxel Dörfler #if SHELF_AWARE
5313e6ff860SRene Gollent 		message->FindInt32("shelf", &shelf);
53241281cf3SAxel Dörfler #endif
533ced3755cSAxel Dörfler 		BMessage* archive = new BMessage(archivedView);
534ced3755cSAxel Dörfler 		err = fBarView->AddItem(archive, shelf, &id);
535ced3755cSAxel Dörfler 		if (err < B_OK)
536ced3755cSAxel Dörfler 			delete archive;
53741281cf3SAxel Dörfler 	} else if (message->FindRef("addon", &ref) == B_OK) {
53841281cf3SAxel Dörfler 		BEntry entry(&ref);
5393e6ff860SRene Gollent 		err = entry.InitCheck();
5403e6ff860SRene Gollent 		if (err == B_OK)
5413e6ff860SRene Gollent 			err = fBarView->AddItem(&entry, shelf, &id);
54241281cf3SAxel Dörfler 	}
54341281cf3SAxel Dörfler 
54441281cf3SAxel Dörfler 	if (err == B_OK)
54541281cf3SAxel Dörfler 		reply.AddInt32("id", id);
54641281cf3SAxel Dörfler 	else
54741281cf3SAxel Dörfler 		reply.AddInt32("error", err);
54841281cf3SAxel Dörfler 
54941281cf3SAxel Dörfler 	message->SendReply(&reply);
55041281cf3SAxel Dörfler }
55141281cf3SAxel Dörfler 
55241281cf3SAxel Dörfler 
55341281cf3SAxel Dörfler void
55441281cf3SAxel Dörfler TBarWindow::RemoveItem(BMessage* message)
55541281cf3SAxel Dörfler {
55641281cf3SAxel Dörfler 	int32 id;
55741281cf3SAxel Dörfler 	const char* name;
55841281cf3SAxel Dörfler 
55941281cf3SAxel Dörfler 	// ids ought to be unique across all shelves, assuming, of course,
56041281cf3SAxel Dörfler 	// that sometime in the future there may be more than one
56141281cf3SAxel Dörfler #if SHELF_AWARE
56241281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) == B_OK) {
56341281cf3SAxel Dörfler 		if (message->FindString("name", &name) == B_OK)
56441281cf3SAxel Dörfler 			fBarView->RemoveItem(name, shelf);
56541281cf3SAxel Dörfler 	} else {
56641281cf3SAxel Dörfler #endif
56741281cf3SAxel Dörfler 		if (message->FindInt32("id", &id) == B_OK) {
56841281cf3SAxel Dörfler 			fBarView->RemoveItem(id);
56941281cf3SAxel Dörfler 		// remove the following two lines if and when the
57041281cf3SAxel Dörfler 		// shelf option returns
57141281cf3SAxel Dörfler 		} else if (message->FindString("name", &name) == B_OK)
57241281cf3SAxel Dörfler 			fBarView->RemoveItem(name, B_DESKBAR_TRAY);
57341281cf3SAxel Dörfler 
57441281cf3SAxel Dörfler #if SHELF_AWARE
57541281cf3SAxel Dörfler 	}
57641281cf3SAxel Dörfler #endif
57741281cf3SAxel Dörfler }
57841281cf3SAxel Dörfler 
57941281cf3SAxel Dörfler 
58041281cf3SAxel Dörfler void
58141281cf3SAxel Dörfler TBarWindow::GetIconFrame(BMessage* message)
58241281cf3SAxel Dörfler {
58341281cf3SAxel Dörfler 	BRect frame(0, 0, 0, 0);
58441281cf3SAxel Dörfler 
58541281cf3SAxel Dörfler 	const char* name;
58641281cf3SAxel Dörfler 	int32 id;
58741281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
58841281cf3SAxel Dörfler 		frame = fBarView->IconFrame(id);
58941281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
59041281cf3SAxel Dörfler 		frame = fBarView->IconFrame(name);
59141281cf3SAxel Dörfler 
59241281cf3SAxel Dörfler 	BMessage reply('rply');
59341281cf3SAxel Dörfler 	reply.AddRect("frame", frame);
59441281cf3SAxel Dörfler 	message->SendReply(&reply);
59541281cf3SAxel Dörfler }
59671bd3ba5SJonas Sundström 
5974c139440SAxel Dörfler 
5984c139440SAxel Dörfler bool
59922812ba2SRene Gollent TBarWindow::IsShowingMenu() const
60022812ba2SRene Gollent {
60122812ba2SRene Gollent 	return fShowingMenu;
60222812ba2SRene Gollent }
60322812ba2SRene Gollent 
60422812ba2SRene Gollent 
60522812ba2SRene Gollent bool
6064c139440SAxel Dörfler TBarWindow::_IsFocusMessage(BMessage* message)
6074c139440SAxel Dörfler {
6084c139440SAxel Dörfler 	BMessage::Private messagePrivate(message);
6094c139440SAxel Dörfler 	if (!messagePrivate.UsePreferredTarget())
6104c139440SAxel Dörfler 		return false;
6114c139440SAxel Dörfler 
6124c139440SAxel Dörfler 	bool feedFocus;
6134c139440SAxel Dörfler 	if (message->HasInt32("_token")
6144c139440SAxel Dörfler 		&& (message->FindBool("_feed_focus", &feedFocus) != B_OK || !feedFocus))
6154c139440SAxel Dörfler 		return false;
6164c139440SAxel Dörfler 
6174c139440SAxel Dörfler 	return true;
6184c139440SAxel Dörfler }
619