xref: /haiku/src/apps/deskbar/BarWindow.cpp (revision 85529c12b84a608d8cdc3e880922e3f60f2a4113)
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"
5726ea7066SIngo Weinhold #include "DeskbarUtils.h"
58323b6546SOliver Tappe #include "DeskbarMenu.h"
5941281cf3SAxel Dörfler #include "PublicCommands.h"
6041281cf3SAxel Dörfler #include "StatusView.h"
6141281cf3SAxel Dörfler #include "tracker_private.h"
6241281cf3SAxel Dörfler 
6341281cf3SAxel Dörfler 
64546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT
65546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "MainWindow"
66cd7548f5SJonas Sundström 
67cd7548f5SJonas Sundström 
681075cc34SFredrik Holmqvist // This is a very ugly hack to be able to call the private
691075cc34SFredrik Holmqvist // BMenuBar::StartMenuBar() method from the TBarWindow::ShowBeMenu() method.
7041281cf3SAxel Dörfler // Don't do this at home -- but why the hell is this method private?
7141281cf3SAxel Dörfler #if __MWERKS__
724a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack StartMenuBar__8BMenuBarFlbbP5BRect
734a71b881SAxel Dörfler #elif __GNUC__ <= 2
744a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack StartMenuBar__8BMenuBarlbT2P5BRect
754a71b881SAxel Dörfler #elif __GNUC__ > 2
76e9632898SAlex Smith 	#if B_HAIKU_64_BIT
77e9632898SAlex Smith 		#define BMenuBar_StartMenuBar_Hack _ZN8BMenuBar12StartMenuBarEibbP5BRect
78e9632898SAlex Smith 	#else
794a71b881SAxel Dörfler 		#define BMenuBar_StartMenuBar_Hack _ZN8BMenuBar12StartMenuBarElbbP5BRect
80e9632898SAlex Smith 	#endif
8141281cf3SAxel Dörfler #else
8241281cf3SAxel Dörfler #	error "You may want to port this ugly hack to your compiler ABI"
8341281cf3SAxel Dörfler #endif
841075cc34SFredrik Holmqvist extern "C" void
851075cc34SFredrik Holmqvist 	BMenuBar_StartMenuBar_Hack(BMenuBar*, int32, bool, bool, BRect*);
8641281cf3SAxel Dörfler 
8741281cf3SAxel Dörfler 
88323b6546SOliver Tappe TDeskbarMenu* TBarWindow::sDeskbarMenu = NULL;
8941281cf3SAxel Dörfler 
9041281cf3SAxel Dörfler 
9141281cf3SAxel Dörfler TBarWindow::TBarWindow()
9272f5ac30SAxel Dörfler 	:
93066522e8SJonas Sundström 	BWindow(BRect(-1000.0f, -1000.0f, -1000.0f, -1000.0f),
94560ff447SJonas Sundström 		B_TRANSLATE_SYSTEM_NAME("Deskbar"), B_BORDERED_WINDOW,
9541281cf3SAxel Dörfler 		B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
9674c7ad20SIngo Weinhold 		| B_NOT_MINIMIZABLE | B_NOT_MOVABLE | B_NOT_RESIZABLE
9774c7ad20SIngo Weinhold 		| B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
9822812ba2SRene Gollent 		B_ALL_WORKSPACES),
9922812ba2SRene Gollent 	fShowingMenu(false)
10041281cf3SAxel Dörfler {
10141281cf3SAxel Dörfler 	desk_settings* settings = ((TBarApp*)be_app)->Settings();
10241281cf3SAxel Dörfler 	if (settings->alwaysOnTop)
10341281cf3SAxel Dörfler 		SetFeel(B_FLOATING_ALL_WINDOW_FEEL);
104fe624b39SJohn Scipione 
10572f5ac30SAxel Dörfler 	fBarView = new TBarView(Bounds(), settings->vertical, settings->left,
106573f748cSJohn Scipione 		settings->top, settings->state, settings->width);
10741281cf3SAxel Dörfler 	AddChild(fBarView);
10841281cf3SAxel Dörfler 
10935c6651cSKarsten Heimrich 	RemoveShortcut('H', B_COMMAND_KEY | B_CONTROL_KEY);
11041281cf3SAxel Dörfler 	AddShortcut('F', B_COMMAND_KEY, new BMessage(kFindButton));
11141281cf3SAxel Dörfler }
11241281cf3SAxel Dörfler 
11341281cf3SAxel Dörfler 
11441281cf3SAxel Dörfler void
11541281cf3SAxel Dörfler TBarWindow::MenusBeginning()
11641281cf3SAxel Dörfler {
11741281cf3SAxel Dörfler 	BPath path;
11841281cf3SAxel Dörfler 	entry_ref ref;
11926ea7066SIngo Weinhold 	BEntry entry;
12041281cf3SAxel Dörfler 
12126ea7066SIngo Weinhold 	if (GetDeskbarSettingsDirectory(path) == B_OK
12226ea7066SIngo Weinhold 		&& path.Append(kDeskbarMenuEntriesFileName) == B_OK
12326ea7066SIngo Weinhold 		&& entry.SetTo(path.Path(), true) == B_OK
12426ea7066SIngo Weinhold 		&& entry.Exists()
12526ea7066SIngo Weinhold 		&& entry.GetRef(&ref) == B_OK) {
126323b6546SOliver Tappe 		sDeskbarMenu->SetNavDir(&ref);
12726ea7066SIngo Weinhold 	} else if (GetDeskbarDataDirectory(path) == B_OK
12826ea7066SIngo Weinhold 		&& path.Append(kDeskbarMenuEntriesFileName) == B_OK
12926ea7066SIngo Weinhold 		&& entry.SetTo(path.Path(), true) == B_OK
13026ea7066SIngo Weinhold 		&& entry.Exists()
13126ea7066SIngo Weinhold 		&& entry.GetRef(&ref) == B_OK) {
132323b6546SOliver Tappe 		sDeskbarMenu->SetNavDir(&ref);
13341281cf3SAxel Dörfler 	} else {
13441281cf3SAxel Dörfler 		//	this really should never happen
13541281cf3SAxel Dörfler 		TRESPASS();
13641281cf3SAxel Dörfler 		return;
13741281cf3SAxel Dörfler 	}
13841281cf3SAxel Dörfler 
139323b6546SOliver Tappe 	sDeskbarMenu->ResetTargets();
14041281cf3SAxel Dörfler 
14122812ba2SRene Gollent 	fShowingMenu = true;
14241281cf3SAxel Dörfler 	BWindow::MenusBeginning();
14341281cf3SAxel Dörfler }
14441281cf3SAxel Dörfler 
14541281cf3SAxel Dörfler 
14641281cf3SAxel Dörfler void
14741281cf3SAxel Dörfler TBarWindow::MenusEnded()
14841281cf3SAxel Dörfler {
14922812ba2SRene Gollent 	fShowingMenu = false;
15041281cf3SAxel Dörfler 	BWindow::MenusEnded();
15141281cf3SAxel Dörfler 
152323b6546SOliver Tappe 	if (sDeskbarMenu->LockLooper()) {
153*85529c12SJessica Hamilton 		sDeskbarMenu->ForceRebuild();
154323b6546SOliver Tappe 		sDeskbarMenu->UnlockLooper();
15541281cf3SAxel Dörfler 	}
1564446e07aSStefano Ceccherini }
15741281cf3SAxel Dörfler 
15841281cf3SAxel Dörfler 
15941281cf3SAxel Dörfler void
16041281cf3SAxel Dörfler TBarWindow::MessageReceived(BMessage* message)
16141281cf3SAxel Dörfler {
16241281cf3SAxel Dörfler 	switch (message->what) {
16341281cf3SAxel Dörfler 		case kFindButton:
16441281cf3SAxel Dörfler 		{
16541281cf3SAxel Dörfler 			BMessenger tracker(kTrackerSignature);
16641281cf3SAxel Dörfler 			tracker.SendMessage(message);
16741281cf3SAxel Dörfler 			break;
16841281cf3SAxel Dörfler 		}
16941281cf3SAxel Dörfler 
17041281cf3SAxel Dörfler 		case 'gloc':
17141281cf3SAxel Dörfler 			GetLocation(message);
17241281cf3SAxel Dörfler 			break;
17341281cf3SAxel Dörfler 
17441281cf3SAxel Dörfler 		case 'sloc':
17541281cf3SAxel Dörfler 			SetLocation(message);
17641281cf3SAxel Dörfler 			break;
17741281cf3SAxel Dörfler 
17841281cf3SAxel Dörfler 		case 'gexp':
17941281cf3SAxel Dörfler 			IsExpanded(message);
18041281cf3SAxel Dörfler 			break;
18141281cf3SAxel Dörfler 
18241281cf3SAxel Dörfler 		case 'sexp':
18341281cf3SAxel Dörfler 			Expand(message);
18441281cf3SAxel Dörfler 			break;
18541281cf3SAxel Dörfler 
18641281cf3SAxel Dörfler 		case 'info':
18741281cf3SAxel Dörfler 			ItemInfo(message);
18841281cf3SAxel Dörfler 			break;
18941281cf3SAxel Dörfler 
19041281cf3SAxel Dörfler 		case 'exst':
19141281cf3SAxel Dörfler 			ItemExists(message);
19241281cf3SAxel Dörfler 			break;
19341281cf3SAxel Dörfler 
19441281cf3SAxel Dörfler 		case 'cwnt':
19541281cf3SAxel Dörfler 			CountItems(message);
19641281cf3SAxel Dörfler 			break;
19741281cf3SAxel Dörfler 
19841281cf3SAxel Dörfler 		case 'adon':
19941281cf3SAxel Dörfler 		case 'icon':
20041281cf3SAxel Dörfler 			AddItem(message);
20141281cf3SAxel Dörfler 			break;
20241281cf3SAxel Dörfler 
20341281cf3SAxel Dörfler 		case 'remv':
20441281cf3SAxel Dörfler 			RemoveItem(message);
20541281cf3SAxel Dörfler 			break;
20641281cf3SAxel Dörfler 
20741281cf3SAxel Dörfler 		case 'iloc':
20841281cf3SAxel Dörfler 			GetIconFrame(message);
20941281cf3SAxel Dörfler 			break;
21041281cf3SAxel Dörfler 
21141281cf3SAxel Dörfler 		default:
21241281cf3SAxel Dörfler 			BWindow::MessageReceived(message);
21341281cf3SAxel Dörfler 			break;
21441281cf3SAxel Dörfler 	}
21541281cf3SAxel Dörfler }
21641281cf3SAxel Dörfler 
21741281cf3SAxel Dörfler 
21841281cf3SAxel Dörfler void
2195b576468SAxel Dörfler TBarWindow::Minimize(bool minimize)
2205b576468SAxel Dörfler {
2215b576468SAxel Dörfler 	// Don't allow the Deskbar to be minimized
2225b576468SAxel Dörfler 	if (!minimize)
2235b576468SAxel Dörfler 		BWindow::Minimize(false);
2245b576468SAxel Dörfler }
2255b576468SAxel Dörfler 
2265b576468SAxel Dörfler 
2275b576468SAxel Dörfler void
22841281cf3SAxel Dörfler TBarWindow::SaveSettings()
22941281cf3SAxel Dörfler {
23041281cf3SAxel Dörfler 	fBarView->SaveSettings();
23141281cf3SAxel Dörfler }
23241281cf3SAxel Dörfler 
23341281cf3SAxel Dörfler 
23441281cf3SAxel Dörfler bool
23541281cf3SAxel Dörfler TBarWindow::QuitRequested()
23641281cf3SAxel Dörfler {
23741281cf3SAxel Dörfler 	be_app->PostMessage(B_QUIT_REQUESTED);
23841281cf3SAxel Dörfler 
23941281cf3SAxel Dörfler 	return BWindow::QuitRequested();
24041281cf3SAxel Dörfler }
24141281cf3SAxel Dörfler 
24241281cf3SAxel Dörfler 
24341281cf3SAxel Dörfler void
24441281cf3SAxel Dörfler TBarWindow::WorkspaceActivated(int32 workspace, bool active)
24541281cf3SAxel Dörfler {
24641281cf3SAxel Dörfler 	BWindow::WorkspaceActivated(workspace, active);
24741281cf3SAxel Dörfler 
248d0a49328SJohn Scipione 	if (active && !(fBarView->ExpandoState() && fBarView->Vertical()))
24941281cf3SAxel Dörfler 		fBarView->UpdatePlacement();
25041281cf3SAxel Dörfler 	else {
25141281cf3SAxel Dörfler 		BRect screenFrame = (BScreen(fBarView->Window())).Frame();
25241281cf3SAxel Dörfler 		fBarView->SizeWindow(screenFrame);
25341281cf3SAxel Dörfler 		fBarView->PositionWindow(screenFrame);
25441281cf3SAxel Dörfler 		fBarView->Invalidate();
25541281cf3SAxel Dörfler 	}
25641281cf3SAxel Dörfler }
25741281cf3SAxel Dörfler 
25841281cf3SAxel Dörfler 
25941281cf3SAxel Dörfler void
26041281cf3SAxel Dörfler TBarWindow::ScreenChanged(BRect size, color_space depth)
26141281cf3SAxel Dörfler {
26241281cf3SAxel Dörfler 	BWindow::ScreenChanged(size, depth);
26341281cf3SAxel Dörfler 
26441281cf3SAxel Dörfler 	fBarView->UpdatePlacement();
26541281cf3SAxel Dörfler }
26641281cf3SAxel Dörfler 
26741281cf3SAxel Dörfler 
26841281cf3SAxel Dörfler void
269323b6546SOliver Tappe TBarWindow::SetDeskbarMenu(TDeskbarMenu* menu)
27041281cf3SAxel Dörfler {
271323b6546SOliver Tappe 	sDeskbarMenu = menu;
27241281cf3SAxel Dörfler }
27341281cf3SAxel Dörfler 
27441281cf3SAxel Dörfler 
275323b6546SOliver Tappe TDeskbarMenu*
276323b6546SOliver Tappe TBarWindow::DeskbarMenu()
27741281cf3SAxel Dörfler {
278323b6546SOliver Tappe 	return sDeskbarMenu;
27941281cf3SAxel Dörfler }
28041281cf3SAxel Dörfler 
28141281cf3SAxel Dörfler 
28241281cf3SAxel Dörfler void
283323b6546SOliver Tappe TBarWindow::ShowDeskbarMenu()
28441281cf3SAxel Dörfler {
28541281cf3SAxel Dörfler 	BMenuBar* menuBar = fBarView->BarMenuBar();
28641281cf3SAxel Dörfler 	if (menuBar == NULL)
28741281cf3SAxel Dörfler 		menuBar = KeyMenuBar();
28841281cf3SAxel Dörfler 
28941281cf3SAxel Dörfler 	if (menuBar == NULL)
29041281cf3SAxel Dörfler 		return;
29141281cf3SAxel Dörfler 
2924a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(menuBar, 0, true, true, NULL);
29341281cf3SAxel Dörfler }
29441281cf3SAxel Dörfler 
29541281cf3SAxel Dörfler 
29641281cf3SAxel Dörfler void
29741281cf3SAxel Dörfler TBarWindow::ShowTeamMenu()
29841281cf3SAxel Dörfler {
29941281cf3SAxel Dörfler 	int32 index = 0;
30041281cf3SAxel Dörfler 	if (fBarView->BarMenuBar() == NULL)
30141281cf3SAxel Dörfler 		index = 2;
30241281cf3SAxel Dörfler 
30341281cf3SAxel Dörfler 	if (KeyMenuBar() == NULL)
30441281cf3SAxel Dörfler 		return;
30541281cf3SAxel Dörfler 
3064a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(KeyMenuBar(), index, true, true, NULL);
30741281cf3SAxel Dörfler }
30841281cf3SAxel Dörfler 
30941281cf3SAxel Dörfler 
3101075cc34SFredrik Holmqvist // determines the actual location of the window
31141281cf3SAxel Dörfler 
31241281cf3SAxel Dörfler deskbar_location
31341281cf3SAxel Dörfler TBarWindow::DeskbarLocation() const
31441281cf3SAxel Dörfler {
31541281cf3SAxel Dörfler 	bool left = fBarView->Left();
31641281cf3SAxel Dörfler 	bool top = fBarView->Top();
31741281cf3SAxel Dörfler 
31841281cf3SAxel Dörfler 	if (fBarView->AcrossTop())
31941281cf3SAxel Dörfler 		return B_DESKBAR_TOP;
32041281cf3SAxel Dörfler 
32141281cf3SAxel Dörfler 	if (fBarView->AcrossBottom())
32241281cf3SAxel Dörfler 		return B_DESKBAR_BOTTOM;
32341281cf3SAxel Dörfler 
32441281cf3SAxel Dörfler 	if (left && top)
32541281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_TOP;
32641281cf3SAxel Dörfler 
32741281cf3SAxel Dörfler 	if (!left && top)
32841281cf3SAxel Dörfler 		return B_DESKBAR_RIGHT_TOP;
32941281cf3SAxel Dörfler 
33041281cf3SAxel Dörfler 	if (left && !top)
33141281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_BOTTOM;
33241281cf3SAxel Dörfler 
33341281cf3SAxel Dörfler 	return B_DESKBAR_RIGHT_BOTTOM;
33441281cf3SAxel Dörfler }
33541281cf3SAxel Dörfler 
33641281cf3SAxel Dörfler 
33741281cf3SAxel Dörfler void
33841281cf3SAxel Dörfler TBarWindow::GetLocation(BMessage* message)
33941281cf3SAxel Dörfler {
34041281cf3SAxel Dörfler 	BMessage reply('rply');
34141281cf3SAxel Dörfler 	reply.AddInt32("location", (int32)DeskbarLocation());
342d0a49328SJohn Scipione 	reply.AddBool("expanded", fBarView->ExpandoState());
34341281cf3SAxel Dörfler 
34441281cf3SAxel Dörfler 	message->SendReply(&reply);
34541281cf3SAxel Dörfler }
34641281cf3SAxel Dörfler 
34741281cf3SAxel Dörfler 
34841281cf3SAxel Dörfler void
34941281cf3SAxel Dörfler TBarWindow::SetDeskbarLocation(deskbar_location location, bool newExpandState)
35041281cf3SAxel Dörfler {
35141281cf3SAxel Dörfler 	// left top and right top are the only two that
35241281cf3SAxel Dörfler 	// currently pay attention to expand, ignore for all others
35341281cf3SAxel Dörfler 
35441281cf3SAxel Dörfler 	bool left = false, top = true, vertical, expand;
35541281cf3SAxel Dörfler 
35641281cf3SAxel Dörfler 	switch (location) {
35741281cf3SAxel Dörfler 		case B_DESKBAR_TOP:
35841281cf3SAxel Dörfler 			left = true;
35941281cf3SAxel Dörfler 			top = true;
36041281cf3SAxel Dörfler 			vertical = false;
36141281cf3SAxel Dörfler 			expand = true;
36241281cf3SAxel Dörfler 			break;
36341281cf3SAxel Dörfler 
36441281cf3SAxel Dörfler 		case B_DESKBAR_BOTTOM:
36541281cf3SAxel Dörfler 			left = true;
36641281cf3SAxel Dörfler 			top = false;
36741281cf3SAxel Dörfler 			vertical = false;
36841281cf3SAxel Dörfler 			expand = true;
36941281cf3SAxel Dörfler 			break;
37041281cf3SAxel Dörfler 
37141281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_TOP:
37241281cf3SAxel Dörfler 			left = true;
37341281cf3SAxel Dörfler 			top = true;
37441281cf3SAxel Dörfler 			vertical = true;
37541281cf3SAxel Dörfler 			expand = newExpandState;
37641281cf3SAxel Dörfler 			break;
37741281cf3SAxel Dörfler 
37841281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_TOP:
37941281cf3SAxel Dörfler 			left = false;
38041281cf3SAxel Dörfler 			top = true;
38141281cf3SAxel Dörfler 			vertical = true;
38241281cf3SAxel Dörfler 			expand = newExpandState;
38341281cf3SAxel Dörfler 			break;
38441281cf3SAxel Dörfler 
38541281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_BOTTOM:
38641281cf3SAxel Dörfler 			left = true;
38741281cf3SAxel Dörfler 			top = false;
38841281cf3SAxel Dörfler 			vertical = true;
38941281cf3SAxel Dörfler 			expand = false;
39041281cf3SAxel Dörfler 			break;
39141281cf3SAxel Dörfler 
39241281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_BOTTOM:
39341281cf3SAxel Dörfler 			left = false;
39441281cf3SAxel Dörfler 			top = false;
39541281cf3SAxel Dörfler 			vertical = true;
39641281cf3SAxel Dörfler 			expand = false;
39741281cf3SAxel Dörfler 			break;
39841281cf3SAxel Dörfler 
39941281cf3SAxel Dörfler 		default:
40041281cf3SAxel Dörfler 			left = true;
40141281cf3SAxel Dörfler 			top = true;
40241281cf3SAxel Dörfler 			vertical = false;
40341281cf3SAxel Dörfler 			expand = true;
40441281cf3SAxel Dörfler 			break;
40541281cf3SAxel Dörfler 	}
40641281cf3SAxel Dörfler 
40741281cf3SAxel Dörfler 	fBarView->ChangeState(expand, vertical, left, top);
40841281cf3SAxel Dörfler }
40941281cf3SAxel Dörfler 
4105b576468SAxel Dörfler 
41141281cf3SAxel Dörfler void
41241281cf3SAxel Dörfler TBarWindow::SetLocation(BMessage* message)
41341281cf3SAxel Dörfler {
41441281cf3SAxel Dörfler 	deskbar_location location;
41541281cf3SAxel Dörfler 	bool expand;
41641281cf3SAxel Dörfler 	if (message->FindInt32("location", (int32*)&location) == B_OK
41741281cf3SAxel Dörfler 		&& message->FindBool("expand", &expand) == B_OK)
41841281cf3SAxel Dörfler 		SetDeskbarLocation(location, expand);
41941281cf3SAxel Dörfler }
42041281cf3SAxel Dörfler 
42141281cf3SAxel Dörfler 
42241281cf3SAxel Dörfler void
42341281cf3SAxel Dörfler TBarWindow::IsExpanded(BMessage* message)
42441281cf3SAxel Dörfler {
42541281cf3SAxel Dörfler 	BMessage reply('rply');
426d0a49328SJohn Scipione 	reply.AddBool("expanded", fBarView->ExpandoState());
42741281cf3SAxel Dörfler 	message->SendReply(&reply);
42841281cf3SAxel Dörfler }
42941281cf3SAxel Dörfler 
43041281cf3SAxel Dörfler 
43141281cf3SAxel Dörfler void
43241281cf3SAxel Dörfler TBarWindow::Expand(BMessage* message)
43341281cf3SAxel Dörfler {
43441281cf3SAxel Dörfler 	bool expand;
43541281cf3SAxel Dörfler 	if (message->FindBool("expand", &expand) == B_OK) {
43641281cf3SAxel Dörfler 		bool vertical = fBarView->Vertical();
43741281cf3SAxel Dörfler 		bool left = fBarView->Left();
43841281cf3SAxel Dörfler 		bool top = fBarView->Top();
43941281cf3SAxel Dörfler 		fBarView->ChangeState(expand, vertical, left, top);
44041281cf3SAxel Dörfler 	}
44141281cf3SAxel Dörfler }
44241281cf3SAxel Dörfler 
44341281cf3SAxel Dörfler 
44441281cf3SAxel Dörfler void
44541281cf3SAxel Dörfler TBarWindow::ItemInfo(BMessage* message)
44641281cf3SAxel Dörfler {
44741281cf3SAxel Dörfler 	BMessage replyMsg;
44841281cf3SAxel Dörfler 	const char* name;
44941281cf3SAxel Dörfler 	int32 id;
45041281cf3SAxel Dörfler 	DeskbarShelf shelf;
45141281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK) {
45241281cf3SAxel Dörfler 		if (fBarView->ItemInfo(id, &name, &shelf) == B_OK) {
45341281cf3SAxel Dörfler 			replyMsg.AddString("name", name);
45441281cf3SAxel Dörfler #if SHELF_AWARE
45541281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
45641281cf3SAxel Dörfler #endif
45741281cf3SAxel Dörfler 		}
45841281cf3SAxel Dörfler 	} else if (message->FindString("name", &name) == B_OK) {
45941281cf3SAxel Dörfler 		if (fBarView->ItemInfo(name, &id, &shelf) == B_OK) {
46041281cf3SAxel Dörfler 			replyMsg.AddInt32("id", id);
46141281cf3SAxel Dörfler #if SHELF_AWARE
46241281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
46341281cf3SAxel Dörfler #endif
46441281cf3SAxel Dörfler 		}
46541281cf3SAxel Dörfler 	}
46641281cf3SAxel Dörfler 
46741281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
46841281cf3SAxel Dörfler }
46941281cf3SAxel Dörfler 
47041281cf3SAxel Dörfler 
47141281cf3SAxel Dörfler void
47241281cf3SAxel Dörfler TBarWindow::ItemExists(BMessage* message)
47341281cf3SAxel Dörfler {
47441281cf3SAxel Dörfler 	BMessage replyMsg;
47541281cf3SAxel Dörfler 	const char* name;
47641281cf3SAxel Dörfler 	int32 id;
47741281cf3SAxel Dörfler 	DeskbarShelf shelf;
47841281cf3SAxel Dörfler 
47941281cf3SAxel Dörfler #if SHELF_AWARE
48041281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
48141281cf3SAxel Dörfler #endif
48241281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
48341281cf3SAxel Dörfler 
48441281cf3SAxel Dörfler 	bool exists = false;
48541281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
48641281cf3SAxel Dörfler 		exists = fBarView->ItemExists(id, shelf);
48741281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
48841281cf3SAxel Dörfler 		exists = fBarView->ItemExists(name, shelf);
48941281cf3SAxel Dörfler 
49041281cf3SAxel Dörfler 	replyMsg.AddBool("exists", exists);
49141281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
49241281cf3SAxel Dörfler }
49341281cf3SAxel Dörfler 
49441281cf3SAxel Dörfler 
49541281cf3SAxel Dörfler void
49641281cf3SAxel Dörfler TBarWindow::CountItems(BMessage* message)
49741281cf3SAxel Dörfler {
49841281cf3SAxel Dörfler 	DeskbarShelf shelf;
49941281cf3SAxel Dörfler 
50041281cf3SAxel Dörfler #if SHELF_AWARE
50141281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
50241281cf3SAxel Dörfler #endif
50341281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
50441281cf3SAxel Dörfler 
50541281cf3SAxel Dörfler 	BMessage reply('rply');
50641281cf3SAxel Dörfler 	reply.AddInt32("count", fBarView->CountItems(shelf));
50741281cf3SAxel Dörfler 	message->SendReply(&reply);
50841281cf3SAxel Dörfler }
50941281cf3SAxel Dörfler 
51041281cf3SAxel Dörfler 
51141281cf3SAxel Dörfler void
51241281cf3SAxel Dörfler TBarWindow::AddItem(BMessage* message)
51341281cf3SAxel Dörfler {
5143e6ff860SRene Gollent 	DeskbarShelf shelf = B_DESKBAR_TRAY;
51541281cf3SAxel Dörfler 	entry_ref ref;
51641281cf3SAxel Dörfler 	int32 id = 999;
51741281cf3SAxel Dörfler 	BMessage reply;
51841281cf3SAxel Dörfler 	status_t err = B_ERROR;
51941281cf3SAxel Dörfler 
52041281cf3SAxel Dörfler 	BMessage archivedView;
52141281cf3SAxel Dörfler 	if (message->FindMessage("view", &archivedView) == B_OK) {
52241281cf3SAxel Dörfler #if SHELF_AWARE
5233e6ff860SRene Gollent 		message->FindInt32("shelf", &shelf);
52441281cf3SAxel Dörfler #endif
525ced3755cSAxel Dörfler 		BMessage* archive = new BMessage(archivedView);
526ced3755cSAxel Dörfler 		err = fBarView->AddItem(archive, shelf, &id);
527ced3755cSAxel Dörfler 		if (err < B_OK)
528ced3755cSAxel Dörfler 			delete archive;
52941281cf3SAxel Dörfler 	} else if (message->FindRef("addon", &ref) == B_OK) {
53041281cf3SAxel Dörfler 		BEntry entry(&ref);
5313e6ff860SRene Gollent 		err = entry.InitCheck();
5323e6ff860SRene Gollent 		if (err == B_OK)
5333e6ff860SRene Gollent 			err = fBarView->AddItem(&entry, shelf, &id);
53441281cf3SAxel Dörfler 	}
53541281cf3SAxel Dörfler 
53641281cf3SAxel Dörfler 	if (err == B_OK)
53741281cf3SAxel Dörfler 		reply.AddInt32("id", id);
53841281cf3SAxel Dörfler 	else
53941281cf3SAxel Dörfler 		reply.AddInt32("error", err);
54041281cf3SAxel Dörfler 
54141281cf3SAxel Dörfler 	message->SendReply(&reply);
54241281cf3SAxel Dörfler }
54341281cf3SAxel Dörfler 
54441281cf3SAxel Dörfler 
54541281cf3SAxel Dörfler void
54641281cf3SAxel Dörfler TBarWindow::RemoveItem(BMessage* message)
54741281cf3SAxel Dörfler {
54841281cf3SAxel Dörfler 	int32 id;
54941281cf3SAxel Dörfler 	const char* name;
55041281cf3SAxel Dörfler 
55141281cf3SAxel Dörfler 	// ids ought to be unique across all shelves, assuming, of course,
55241281cf3SAxel Dörfler 	// that sometime in the future there may be more than one
55341281cf3SAxel Dörfler #if SHELF_AWARE
55441281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) == B_OK) {
55541281cf3SAxel Dörfler 		if (message->FindString("name", &name) == B_OK)
55641281cf3SAxel Dörfler 			fBarView->RemoveItem(name, shelf);
55741281cf3SAxel Dörfler 	} else {
55841281cf3SAxel Dörfler #endif
55941281cf3SAxel Dörfler 		if (message->FindInt32("id", &id) == B_OK) {
56041281cf3SAxel Dörfler 			fBarView->RemoveItem(id);
56141281cf3SAxel Dörfler 		// remove the following two lines if and when the
56241281cf3SAxel Dörfler 		// shelf option returns
56341281cf3SAxel Dörfler 		} else if (message->FindString("name", &name) == B_OK)
56441281cf3SAxel Dörfler 			fBarView->RemoveItem(name, B_DESKBAR_TRAY);
56541281cf3SAxel Dörfler 
56641281cf3SAxel Dörfler #if SHELF_AWARE
56741281cf3SAxel Dörfler 	}
56841281cf3SAxel Dörfler #endif
56941281cf3SAxel Dörfler }
57041281cf3SAxel Dörfler 
57141281cf3SAxel Dörfler 
57241281cf3SAxel Dörfler void
57341281cf3SAxel Dörfler TBarWindow::GetIconFrame(BMessage* message)
57441281cf3SAxel Dörfler {
57541281cf3SAxel Dörfler 	BRect frame(0, 0, 0, 0);
57641281cf3SAxel Dörfler 
57741281cf3SAxel Dörfler 	const char* name;
57841281cf3SAxel Dörfler 	int32 id;
57941281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
58041281cf3SAxel Dörfler 		frame = fBarView->IconFrame(id);
58141281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
58241281cf3SAxel Dörfler 		frame = fBarView->IconFrame(name);
58341281cf3SAxel Dörfler 
58441281cf3SAxel Dörfler 	BMessage reply('rply');
58541281cf3SAxel Dörfler 	reply.AddRect("frame", frame);
58641281cf3SAxel Dörfler 	message->SendReply(&reply);
58741281cf3SAxel Dörfler }
58871bd3ba5SJonas Sundström 
5894c139440SAxel Dörfler 
5904c139440SAxel Dörfler bool
59122812ba2SRene Gollent TBarWindow::IsShowingMenu() const
59222812ba2SRene Gollent {
59322812ba2SRene Gollent 	return fShowingMenu;
59422812ba2SRene Gollent }
59522812ba2SRene Gollent 
59622812ba2SRene Gollent 
59722812ba2SRene Gollent bool
5984c139440SAxel Dörfler TBarWindow::_IsFocusMessage(BMessage* message)
5994c139440SAxel Dörfler {
6004c139440SAxel Dörfler 	BMessage::Private messagePrivate(message);
6014c139440SAxel Dörfler 	if (!messagePrivate.UsePreferredTarget())
6024c139440SAxel Dörfler 		return false;
6034c139440SAxel Dörfler 
6044c139440SAxel Dörfler 	bool feedFocus;
6054c139440SAxel Dörfler 	if (message->HasInt32("_token")
6064c139440SAxel Dörfler 		&& (message->FindBool("_feed_focus", &feedFocus) != B_OK || !feedFocus))
6074c139440SAxel Dörfler 		return false;
6084c139440SAxel Dörfler 
6094c139440SAxel Dörfler 	return true;
6104c139440SAxel Dörfler }
611