xref: /haiku/src/apps/deskbar/BarWindow.cpp (revision 546208a53940a26c6379c48a7854ade1a8250fc5)
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>
5141281cf3SAxel Dörfler #include <Screen.h>
5241281cf3SAxel Dörfler 
5341281cf3SAxel Dörfler #include "BarApp.h"
5441281cf3SAxel Dörfler #include "BarMenuBar.h"
5541281cf3SAxel Dörfler #include "BarView.h"
56323b6546SOliver Tappe #include "DeskbarMenu.h"
5741281cf3SAxel Dörfler #include "PublicCommands.h"
5841281cf3SAxel Dörfler #include "StatusView.h"
5941281cf3SAxel Dörfler #include "tracker_private.h"
6041281cf3SAxel Dörfler 
614c139440SAxel Dörfler #include <MessagePrivate.h>
624c139440SAxel Dörfler 
6341281cf3SAxel Dörfler 
64*546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT
65*546208a5SOliver 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
764a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack _ZN8BMenuBar12StartMenuBarElbbP5BRect
7741281cf3SAxel Dörfler #else
7841281cf3SAxel Dörfler #	error "You may want to port this ugly hack to your compiler ABI"
7941281cf3SAxel Dörfler #endif
801075cc34SFredrik Holmqvist extern "C" void
811075cc34SFredrik Holmqvist 	BMenuBar_StartMenuBar_Hack(BMenuBar*, int32, bool, bool, BRect*);
8241281cf3SAxel Dörfler 
8341281cf3SAxel Dörfler 
84323b6546SOliver Tappe TDeskbarMenu* TBarWindow::sDeskbarMenu = NULL;
8541281cf3SAxel Dörfler 
8641281cf3SAxel Dörfler 
8741281cf3SAxel Dörfler TBarWindow::TBarWindow()
8872f5ac30SAxel Dörfler 	:
89066522e8SJonas Sundström 	BWindow(BRect(-1000.0f, -1000.0f, -1000.0f, -1000.0f),
90560ff447SJonas Sundström 		B_TRANSLATE_SYSTEM_NAME("Deskbar"), B_BORDERED_WINDOW,
9141281cf3SAxel Dörfler 		B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
9274c7ad20SIngo Weinhold 		| B_NOT_MINIMIZABLE | B_NOT_MOVABLE | B_NOT_RESIZABLE
9374c7ad20SIngo Weinhold 		| B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
9441281cf3SAxel Dörfler 		B_ALL_WORKSPACES)
9541281cf3SAxel Dörfler {
9641281cf3SAxel Dörfler 	desk_settings* settings = ((TBarApp*)be_app)->Settings();
9741281cf3SAxel Dörfler 	if (settings->alwaysOnTop)
9841281cf3SAxel Dörfler 		SetFeel(B_FLOATING_ALL_WINDOW_FEEL);
9972f5ac30SAxel Dörfler 	fBarView = new TBarView(Bounds(), settings->vertical, settings->left,
100573f748cSJohn Scipione 		settings->top, settings->state, settings->width);
10141281cf3SAxel Dörfler 	AddChild(fBarView);
10241281cf3SAxel Dörfler 
10335c6651cSKarsten Heimrich 	RemoveShortcut('H', B_COMMAND_KEY | B_CONTROL_KEY);
10441281cf3SAxel Dörfler 	AddShortcut('F', B_COMMAND_KEY, new BMessage(kFindButton));
10541281cf3SAxel Dörfler }
10641281cf3SAxel Dörfler 
10741281cf3SAxel Dörfler 
10841281cf3SAxel Dörfler void
10941281cf3SAxel Dörfler TBarWindow::MenusBeginning()
11041281cf3SAxel Dörfler {
11141281cf3SAxel Dörfler 	BPath path;
11241281cf3SAxel Dörfler 	entry_ref ref;
11341281cf3SAxel Dörfler 
11441281cf3SAxel Dörfler 	find_directory (B_USER_DESKBAR_DIRECTORY, &path);
11541281cf3SAxel Dörfler 	get_ref_for_path(path.Path(), &ref);
11641281cf3SAxel Dörfler 
11741281cf3SAxel Dörfler 	BEntry entry(&ref, true);
11841281cf3SAxel Dörfler 	if (entry.InitCheck() == B_OK && entry.IsDirectory()) {
11941281cf3SAxel Dörfler 		//	need the entry_ref to the actual item
12041281cf3SAxel Dörfler 		entry.GetRef(&ref);
121323b6546SOliver Tappe 		//	set the nav directory to the deskbar folder
122323b6546SOliver Tappe 		sDeskbarMenu->SetNavDir(&ref);
12341281cf3SAxel Dörfler 	} else if (!entry.Exists()) {
124323b6546SOliver Tappe 		//	the deskbar folder does not exist
12541281cf3SAxel Dörfler 		//	create one now
12641281cf3SAxel Dörfler 		BDirectory dir;
12741281cf3SAxel Dörfler 		if (entry.GetParent(&dir) == B_OK) {
128323b6546SOliver Tappe 			BDirectory deskbarDir;
129323b6546SOliver Tappe 			dir.CreateDirectory("deskbar", &deskbarDir);
130323b6546SOliver Tappe 			if (deskbarDir.GetEntry(&entry) == B_OK
13141281cf3SAxel Dörfler 				&& entry.GetRef(&ref) == B_OK)
132323b6546SOliver Tappe 				sDeskbarMenu->SetNavDir(&ref);
13341281cf3SAxel Dörfler 		}
13441281cf3SAxel Dörfler 	} else {
13541281cf3SAxel Dörfler 		//	this really should never happen
13641281cf3SAxel Dörfler 		TRESPASS();
13741281cf3SAxel Dörfler 		return;
13841281cf3SAxel Dörfler 	}
13941281cf3SAxel Dörfler 
140323b6546SOliver Tappe 	sDeskbarMenu->NeedsToRebuild();
141323b6546SOliver Tappe 	sDeskbarMenu->ResetTargets();
14241281cf3SAxel Dörfler 
143f8ab4e92SAxel Dörfler 	fBarView->SetEventMask(0);
144f8ab4e92SAxel Dörfler 		// This works around a BeOS bug - the menu is quit with every
145b932a5a4SJohn Scipione 		// B_MOUSE_DOWN the window receives.
146b932a5a4SJohn Scipione 		//
147b932a5a4SJohn Scipione 		// Is this bug still here? I commented this line out and didn't
148b932a5a4SJohn Scipione 		// notice anything different
149f8ab4e92SAxel Dörfler 
15041281cf3SAxel Dörfler 	BWindow::MenusBeginning();
15141281cf3SAxel Dörfler }
15241281cf3SAxel Dörfler 
15341281cf3SAxel Dörfler 
15441281cf3SAxel Dörfler void
15541281cf3SAxel Dörfler TBarWindow::MenusEnded()
15641281cf3SAxel Dörfler {
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 	}
164f8ab4e92SAxel Dörfler 
165e2700599SAxel Dörfler 	fBarView->UpdateEventMask();
1664446e07aSStefano Ceccherini }
16741281cf3SAxel Dörfler 
16841281cf3SAxel Dörfler 
16941281cf3SAxel Dörfler void
17041281cf3SAxel Dörfler TBarWindow::MessageReceived(BMessage* message)
17141281cf3SAxel Dörfler {
17241281cf3SAxel Dörfler 	switch (message->what) {
17341281cf3SAxel Dörfler 		case kFindButton:
17441281cf3SAxel Dörfler 		{
17541281cf3SAxel Dörfler 			BMessenger tracker(kTrackerSignature);
17641281cf3SAxel Dörfler 			tracker.SendMessage(message);
17741281cf3SAxel Dörfler 			break;
17841281cf3SAxel Dörfler 		}
17941281cf3SAxel Dörfler 
18041281cf3SAxel Dörfler 		case 'gloc':
18141281cf3SAxel Dörfler 			GetLocation(message);
18241281cf3SAxel Dörfler 			break;
18341281cf3SAxel Dörfler 
18441281cf3SAxel Dörfler 		case 'sloc':
18541281cf3SAxel Dörfler 			SetLocation(message);
18641281cf3SAxel Dörfler 			break;
18741281cf3SAxel Dörfler 
18841281cf3SAxel Dörfler 		case 'gexp':
18941281cf3SAxel Dörfler 			IsExpanded(message);
19041281cf3SAxel Dörfler 			break;
19141281cf3SAxel Dörfler 
19241281cf3SAxel Dörfler 		case 'sexp':
19341281cf3SAxel Dörfler 			Expand(message);
19441281cf3SAxel Dörfler 			break;
19541281cf3SAxel Dörfler 
19641281cf3SAxel Dörfler 		case 'info':
19741281cf3SAxel Dörfler 			ItemInfo(message);
19841281cf3SAxel Dörfler 			break;
19941281cf3SAxel Dörfler 
20041281cf3SAxel Dörfler 		case 'exst':
20141281cf3SAxel Dörfler 			ItemExists(message);
20241281cf3SAxel Dörfler 			break;
20341281cf3SAxel Dörfler 
20441281cf3SAxel Dörfler 		case 'cwnt':
20541281cf3SAxel Dörfler 			CountItems(message);
20641281cf3SAxel Dörfler 			break;
20741281cf3SAxel Dörfler 
20841281cf3SAxel Dörfler 		case 'adon':
20941281cf3SAxel Dörfler 		case 'icon':
21041281cf3SAxel Dörfler 			AddItem(message);
21141281cf3SAxel Dörfler 			break;
21241281cf3SAxel Dörfler 
21341281cf3SAxel Dörfler 		case 'remv':
21441281cf3SAxel Dörfler 			RemoveItem(message);
21541281cf3SAxel Dörfler 			break;
21641281cf3SAxel Dörfler 
21741281cf3SAxel Dörfler 		case 'iloc':
21841281cf3SAxel Dörfler 			GetIconFrame(message);
21941281cf3SAxel Dörfler 			break;
22041281cf3SAxel Dörfler 
22141281cf3SAxel Dörfler 		default:
22241281cf3SAxel Dörfler 			BWindow::MessageReceived(message);
22341281cf3SAxel Dörfler 			break;
22441281cf3SAxel Dörfler 	}
22541281cf3SAxel Dörfler }
22641281cf3SAxel Dörfler 
22741281cf3SAxel Dörfler 
22841281cf3SAxel Dörfler void
2295b576468SAxel Dörfler TBarWindow::Minimize(bool minimize)
2305b576468SAxel Dörfler {
2315b576468SAxel Dörfler 	// Don't allow the Deskbar to be minimized
2325b576468SAxel Dörfler 	if (!minimize)
2335b576468SAxel Dörfler 		BWindow::Minimize(false);
2345b576468SAxel Dörfler }
2355b576468SAxel Dörfler 
2365b576468SAxel Dörfler 
2375b576468SAxel Dörfler void
23841281cf3SAxel Dörfler TBarWindow::SaveSettings()
23941281cf3SAxel Dörfler {
24041281cf3SAxel Dörfler 	fBarView->SaveSettings();
24141281cf3SAxel Dörfler }
24241281cf3SAxel Dörfler 
24341281cf3SAxel Dörfler 
24441281cf3SAxel Dörfler bool
24541281cf3SAxel Dörfler TBarWindow::QuitRequested()
24641281cf3SAxel Dörfler {
24741281cf3SAxel Dörfler 	be_app->PostMessage(B_QUIT_REQUESTED);
24841281cf3SAxel Dörfler 
24941281cf3SAxel Dörfler 	return BWindow::QuitRequested();
25041281cf3SAxel Dörfler }
25141281cf3SAxel Dörfler 
25241281cf3SAxel Dörfler 
25341281cf3SAxel Dörfler void
25441281cf3SAxel Dörfler TBarWindow::WorkspaceActivated(int32 workspace, bool active)
25541281cf3SAxel Dörfler {
25641281cf3SAxel Dörfler 	BWindow::WorkspaceActivated(workspace, active);
25741281cf3SAxel Dörfler 
258d0a49328SJohn Scipione 	if (active && !(fBarView->ExpandoState() && fBarView->Vertical()))
25941281cf3SAxel Dörfler 		fBarView->UpdatePlacement();
26041281cf3SAxel Dörfler 	else {
26141281cf3SAxel Dörfler 		BRect screenFrame = (BScreen(fBarView->Window())).Frame();
26241281cf3SAxel Dörfler 		fBarView->SizeWindow(screenFrame);
26341281cf3SAxel Dörfler 		fBarView->PositionWindow(screenFrame);
26441281cf3SAxel Dörfler 		fBarView->Invalidate();
26541281cf3SAxel Dörfler 	}
26641281cf3SAxel Dörfler }
26741281cf3SAxel Dörfler 
26841281cf3SAxel Dörfler 
26941281cf3SAxel Dörfler void
27041281cf3SAxel Dörfler TBarWindow::ScreenChanged(BRect size, color_space depth)
27141281cf3SAxel Dörfler {
27241281cf3SAxel Dörfler 	BWindow::ScreenChanged(size, depth);
27341281cf3SAxel Dörfler 
27441281cf3SAxel Dörfler 	fBarView->UpdatePlacement();
27541281cf3SAxel Dörfler }
27641281cf3SAxel Dörfler 
27741281cf3SAxel Dörfler 
27841281cf3SAxel Dörfler void
279323b6546SOliver Tappe TBarWindow::SetDeskbarMenu(TDeskbarMenu* menu)
28041281cf3SAxel Dörfler {
281323b6546SOliver Tappe 	sDeskbarMenu = menu;
28241281cf3SAxel Dörfler }
28341281cf3SAxel Dörfler 
28441281cf3SAxel Dörfler 
285323b6546SOliver Tappe TDeskbarMenu*
286323b6546SOliver Tappe TBarWindow::DeskbarMenu()
28741281cf3SAxel Dörfler {
288323b6546SOliver Tappe 	return sDeskbarMenu;
28941281cf3SAxel Dörfler }
29041281cf3SAxel Dörfler 
29141281cf3SAxel Dörfler 
29241281cf3SAxel Dörfler void
293323b6546SOliver Tappe TBarWindow::ShowDeskbarMenu()
29441281cf3SAxel Dörfler {
29541281cf3SAxel Dörfler 	BMenuBar* menuBar = fBarView->BarMenuBar();
29641281cf3SAxel Dörfler 	if (menuBar == NULL)
29741281cf3SAxel Dörfler 		menuBar = KeyMenuBar();
29841281cf3SAxel Dörfler 
29941281cf3SAxel Dörfler 	if (menuBar == NULL)
30041281cf3SAxel Dörfler 		return;
30141281cf3SAxel Dörfler 
3024a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(menuBar, 0, true, true, NULL);
30341281cf3SAxel Dörfler }
30441281cf3SAxel Dörfler 
30541281cf3SAxel Dörfler 
30641281cf3SAxel Dörfler void
30741281cf3SAxel Dörfler TBarWindow::ShowTeamMenu()
30841281cf3SAxel Dörfler {
30941281cf3SAxel Dörfler 	int32 index = 0;
31041281cf3SAxel Dörfler 	if (fBarView->BarMenuBar() == NULL)
31141281cf3SAxel Dörfler 		index = 2;
31241281cf3SAxel Dörfler 
31341281cf3SAxel Dörfler 	if (KeyMenuBar() == NULL)
31441281cf3SAxel Dörfler 		return;
31541281cf3SAxel Dörfler 
3164a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(KeyMenuBar(), index, true, true, NULL);
31741281cf3SAxel Dörfler }
31841281cf3SAxel Dörfler 
31941281cf3SAxel Dörfler 
3201075cc34SFredrik Holmqvist // determines the actual location of the window
32141281cf3SAxel Dörfler 
32241281cf3SAxel Dörfler deskbar_location
32341281cf3SAxel Dörfler TBarWindow::DeskbarLocation() const
32441281cf3SAxel Dörfler {
32541281cf3SAxel Dörfler 	bool left = fBarView->Left();
32641281cf3SAxel Dörfler 	bool top = fBarView->Top();
32741281cf3SAxel Dörfler 
32841281cf3SAxel Dörfler 	if (fBarView->AcrossTop())
32941281cf3SAxel Dörfler 		return B_DESKBAR_TOP;
33041281cf3SAxel Dörfler 
33141281cf3SAxel Dörfler 	if (fBarView->AcrossBottom())
33241281cf3SAxel Dörfler 		return B_DESKBAR_BOTTOM;
33341281cf3SAxel Dörfler 
33441281cf3SAxel Dörfler 	if (left && top)
33541281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_TOP;
33641281cf3SAxel Dörfler 
33741281cf3SAxel Dörfler 	if (!left && top)
33841281cf3SAxel Dörfler 		return B_DESKBAR_RIGHT_TOP;
33941281cf3SAxel Dörfler 
34041281cf3SAxel Dörfler 	if (left && !top)
34141281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_BOTTOM;
34241281cf3SAxel Dörfler 
34341281cf3SAxel Dörfler 	return B_DESKBAR_RIGHT_BOTTOM;
34441281cf3SAxel Dörfler }
34541281cf3SAxel Dörfler 
34641281cf3SAxel Dörfler 
34741281cf3SAxel Dörfler void
34841281cf3SAxel Dörfler TBarWindow::GetLocation(BMessage* message)
34941281cf3SAxel Dörfler {
35041281cf3SAxel Dörfler 	BMessage reply('rply');
35141281cf3SAxel Dörfler 	reply.AddInt32("location", (int32)DeskbarLocation());
352d0a49328SJohn Scipione 	reply.AddBool("expanded", fBarView->ExpandoState());
35341281cf3SAxel Dörfler 
35441281cf3SAxel Dörfler 	message->SendReply(&reply);
35541281cf3SAxel Dörfler }
35641281cf3SAxel Dörfler 
35741281cf3SAxel Dörfler 
35841281cf3SAxel Dörfler void
35941281cf3SAxel Dörfler TBarWindow::SetDeskbarLocation(deskbar_location location, bool newExpandState)
36041281cf3SAxel Dörfler {
36141281cf3SAxel Dörfler 	// left top and right top are the only two that
36241281cf3SAxel Dörfler 	// currently pay attention to expand, ignore for all others
36341281cf3SAxel Dörfler 
36441281cf3SAxel Dörfler 	bool left = false, top = true, vertical, expand;
36541281cf3SAxel Dörfler 
36641281cf3SAxel Dörfler 	switch (location) {
36741281cf3SAxel Dörfler 		case B_DESKBAR_TOP:
36841281cf3SAxel Dörfler 			left = true;
36941281cf3SAxel Dörfler 			top = true;
37041281cf3SAxel Dörfler 			vertical = false;
37141281cf3SAxel Dörfler 			expand = true;
37241281cf3SAxel Dörfler 			break;
37341281cf3SAxel Dörfler 
37441281cf3SAxel Dörfler 		case B_DESKBAR_BOTTOM:
37541281cf3SAxel Dörfler 			left = true;
37641281cf3SAxel Dörfler 			top = false;
37741281cf3SAxel Dörfler 			vertical = false;
37841281cf3SAxel Dörfler 			expand = true;
37941281cf3SAxel Dörfler 			break;
38041281cf3SAxel Dörfler 
38141281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_TOP:
38241281cf3SAxel Dörfler 			left = true;
38341281cf3SAxel Dörfler 			top = true;
38441281cf3SAxel Dörfler 			vertical = true;
38541281cf3SAxel Dörfler 			expand = newExpandState;
38641281cf3SAxel Dörfler 			break;
38741281cf3SAxel Dörfler 
38841281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_TOP:
38941281cf3SAxel Dörfler 			left = false;
39041281cf3SAxel Dörfler 			top = true;
39141281cf3SAxel Dörfler 			vertical = true;
39241281cf3SAxel Dörfler 			expand = newExpandState;
39341281cf3SAxel Dörfler 			break;
39441281cf3SAxel Dörfler 
39541281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_BOTTOM:
39641281cf3SAxel Dörfler 			left = true;
39741281cf3SAxel Dörfler 			top = false;
39841281cf3SAxel Dörfler 			vertical = true;
39941281cf3SAxel Dörfler 			expand = false;
40041281cf3SAxel Dörfler 			break;
40141281cf3SAxel Dörfler 
40241281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_BOTTOM:
40341281cf3SAxel Dörfler 			left = false;
40441281cf3SAxel Dörfler 			top = false;
40541281cf3SAxel Dörfler 			vertical = true;
40641281cf3SAxel Dörfler 			expand = false;
40741281cf3SAxel Dörfler 			break;
40841281cf3SAxel Dörfler 
40941281cf3SAxel Dörfler 		default:
41041281cf3SAxel Dörfler 			left = true;
41141281cf3SAxel Dörfler 			top = true;
41241281cf3SAxel Dörfler 			vertical = false;
41341281cf3SAxel Dörfler 			expand = true;
41441281cf3SAxel Dörfler 			break;
41541281cf3SAxel Dörfler 	}
41641281cf3SAxel Dörfler 
41741281cf3SAxel Dörfler 	fBarView->ChangeState(expand, vertical, left, top);
41841281cf3SAxel Dörfler }
41941281cf3SAxel Dörfler 
4205b576468SAxel Dörfler 
42141281cf3SAxel Dörfler void
42241281cf3SAxel Dörfler TBarWindow::SetLocation(BMessage* message)
42341281cf3SAxel Dörfler {
42441281cf3SAxel Dörfler 	deskbar_location location;
42541281cf3SAxel Dörfler 	bool expand;
42641281cf3SAxel Dörfler 	if (message->FindInt32("location", (int32*)&location) == B_OK
42741281cf3SAxel Dörfler 		&& message->FindBool("expand", &expand) == B_OK)
42841281cf3SAxel Dörfler 		SetDeskbarLocation(location, expand);
42941281cf3SAxel Dörfler }
43041281cf3SAxel Dörfler 
43141281cf3SAxel Dörfler 
43241281cf3SAxel Dörfler void
43341281cf3SAxel Dörfler TBarWindow::IsExpanded(BMessage* message)
43441281cf3SAxel Dörfler {
43541281cf3SAxel Dörfler 	BMessage reply('rply');
436d0a49328SJohn Scipione 	reply.AddBool("expanded", fBarView->ExpandoState());
43741281cf3SAxel Dörfler 	message->SendReply(&reply);
43841281cf3SAxel Dörfler }
43941281cf3SAxel Dörfler 
44041281cf3SAxel Dörfler 
44141281cf3SAxel Dörfler void
44241281cf3SAxel Dörfler TBarWindow::Expand(BMessage* message)
44341281cf3SAxel Dörfler {
44441281cf3SAxel Dörfler 	bool expand;
44541281cf3SAxel Dörfler 	if (message->FindBool("expand", &expand) == B_OK) {
44641281cf3SAxel Dörfler 		bool vertical = fBarView->Vertical();
44741281cf3SAxel Dörfler 		bool left = fBarView->Left();
44841281cf3SAxel Dörfler 		bool top = fBarView->Top();
44941281cf3SAxel Dörfler 		fBarView->ChangeState(expand, vertical, left, top);
45041281cf3SAxel Dörfler 	}
45141281cf3SAxel Dörfler }
45241281cf3SAxel Dörfler 
45341281cf3SAxel Dörfler 
45441281cf3SAxel Dörfler void
45541281cf3SAxel Dörfler TBarWindow::ItemInfo(BMessage* message)
45641281cf3SAxel Dörfler {
45741281cf3SAxel Dörfler 	BMessage replyMsg;
45841281cf3SAxel Dörfler 	const char* name;
45941281cf3SAxel Dörfler 	int32 id;
46041281cf3SAxel Dörfler 	DeskbarShelf shelf;
46141281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK) {
46241281cf3SAxel Dörfler 		if (fBarView->ItemInfo(id, &name, &shelf) == B_OK) {
46341281cf3SAxel Dörfler 			replyMsg.AddString("name", name);
46441281cf3SAxel Dörfler #if SHELF_AWARE
46541281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
46641281cf3SAxel Dörfler #endif
46741281cf3SAxel Dörfler 		}
46841281cf3SAxel Dörfler 	} else if (message->FindString("name", &name) == B_OK) {
46941281cf3SAxel Dörfler 		if (fBarView->ItemInfo(name, &id, &shelf) == B_OK) {
47041281cf3SAxel Dörfler 			replyMsg.AddInt32("id", id);
47141281cf3SAxel Dörfler #if SHELF_AWARE
47241281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
47341281cf3SAxel Dörfler #endif
47441281cf3SAxel Dörfler 		}
47541281cf3SAxel Dörfler 	}
47641281cf3SAxel Dörfler 
47741281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
47841281cf3SAxel Dörfler }
47941281cf3SAxel Dörfler 
48041281cf3SAxel Dörfler 
48141281cf3SAxel Dörfler void
48241281cf3SAxel Dörfler TBarWindow::ItemExists(BMessage* message)
48341281cf3SAxel Dörfler {
48441281cf3SAxel Dörfler 	BMessage replyMsg;
48541281cf3SAxel Dörfler 	const char* name;
48641281cf3SAxel Dörfler 	int32 id;
48741281cf3SAxel Dörfler 	DeskbarShelf shelf;
48841281cf3SAxel Dörfler 
48941281cf3SAxel Dörfler #if SHELF_AWARE
49041281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
49141281cf3SAxel Dörfler #endif
49241281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
49341281cf3SAxel Dörfler 
49441281cf3SAxel Dörfler 	bool exists = false;
49541281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
49641281cf3SAxel Dörfler 		exists = fBarView->ItemExists(id, shelf);
49741281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
49841281cf3SAxel Dörfler 		exists = fBarView->ItemExists(name, shelf);
49941281cf3SAxel Dörfler 
50041281cf3SAxel Dörfler 	replyMsg.AddBool("exists", exists);
50141281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
50241281cf3SAxel Dörfler }
50341281cf3SAxel Dörfler 
50441281cf3SAxel Dörfler 
50541281cf3SAxel Dörfler void
50641281cf3SAxel Dörfler TBarWindow::CountItems(BMessage* message)
50741281cf3SAxel Dörfler {
50841281cf3SAxel Dörfler 	DeskbarShelf shelf;
50941281cf3SAxel Dörfler 
51041281cf3SAxel Dörfler #if SHELF_AWARE
51141281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
51241281cf3SAxel Dörfler #endif
51341281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
51441281cf3SAxel Dörfler 
51541281cf3SAxel Dörfler 	BMessage reply('rply');
51641281cf3SAxel Dörfler 	reply.AddInt32("count", fBarView->CountItems(shelf));
51741281cf3SAxel Dörfler 	message->SendReply(&reply);
51841281cf3SAxel Dörfler }
51941281cf3SAxel Dörfler 
52041281cf3SAxel Dörfler 
52141281cf3SAxel Dörfler void
52241281cf3SAxel Dörfler TBarWindow::AddItem(BMessage* message)
52341281cf3SAxel Dörfler {
5243e6ff860SRene Gollent 	DeskbarShelf shelf = B_DESKBAR_TRAY;
52541281cf3SAxel Dörfler 	entry_ref ref;
52641281cf3SAxel Dörfler 	int32 id = 999;
52741281cf3SAxel Dörfler 	BMessage reply;
52841281cf3SAxel Dörfler 	status_t err = B_ERROR;
52941281cf3SAxel Dörfler 
53041281cf3SAxel Dörfler 	BMessage archivedView;
53141281cf3SAxel Dörfler 	if (message->FindMessage("view", &archivedView) == B_OK) {
53241281cf3SAxel Dörfler #if SHELF_AWARE
5333e6ff860SRene Gollent 		message->FindInt32("shelf", &shelf);
53441281cf3SAxel Dörfler #endif
535ced3755cSAxel Dörfler 		BMessage* archive = new BMessage(archivedView);
536ced3755cSAxel Dörfler 		err = fBarView->AddItem(archive, shelf, &id);
537ced3755cSAxel Dörfler 		if (err < B_OK)
538ced3755cSAxel Dörfler 			delete archive;
53941281cf3SAxel Dörfler 	} else if (message->FindRef("addon", &ref) == B_OK) {
54041281cf3SAxel Dörfler 		BEntry entry(&ref);
5413e6ff860SRene Gollent 		err = entry.InitCheck();
5423e6ff860SRene Gollent 		if (err == B_OK)
5433e6ff860SRene Gollent 			err = fBarView->AddItem(&entry, shelf, &id);
54441281cf3SAxel Dörfler 	}
54541281cf3SAxel Dörfler 
54641281cf3SAxel Dörfler 	if (err == B_OK)
54741281cf3SAxel Dörfler 		reply.AddInt32("id", id);
54841281cf3SAxel Dörfler 	else
54941281cf3SAxel Dörfler 		reply.AddInt32("error", err);
55041281cf3SAxel Dörfler 
55141281cf3SAxel Dörfler 	message->SendReply(&reply);
55241281cf3SAxel Dörfler }
55341281cf3SAxel Dörfler 
55441281cf3SAxel Dörfler 
55541281cf3SAxel Dörfler void
55641281cf3SAxel Dörfler TBarWindow::RemoveItem(BMessage* message)
55741281cf3SAxel Dörfler {
55841281cf3SAxel Dörfler 	int32 id;
55941281cf3SAxel Dörfler 	const char* name;
56041281cf3SAxel Dörfler 
56141281cf3SAxel Dörfler 	// ids ought to be unique across all shelves, assuming, of course,
56241281cf3SAxel Dörfler 	// that sometime in the future there may be more than one
56341281cf3SAxel Dörfler #if SHELF_AWARE
56441281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) == B_OK) {
56541281cf3SAxel Dörfler 		if (message->FindString("name", &name) == B_OK)
56641281cf3SAxel Dörfler 			fBarView->RemoveItem(name, shelf);
56741281cf3SAxel Dörfler 	} else {
56841281cf3SAxel Dörfler #endif
56941281cf3SAxel Dörfler 		if (message->FindInt32("id", &id) == B_OK) {
57041281cf3SAxel Dörfler 			fBarView->RemoveItem(id);
57141281cf3SAxel Dörfler 		// remove the following two lines if and when the
57241281cf3SAxel Dörfler 		// shelf option returns
57341281cf3SAxel Dörfler 		} else if (message->FindString("name", &name) == B_OK)
57441281cf3SAxel Dörfler 			fBarView->RemoveItem(name, B_DESKBAR_TRAY);
57541281cf3SAxel Dörfler 
57641281cf3SAxel Dörfler #if SHELF_AWARE
57741281cf3SAxel Dörfler 	}
57841281cf3SAxel Dörfler #endif
57941281cf3SAxel Dörfler }
58041281cf3SAxel Dörfler 
58141281cf3SAxel Dörfler 
58241281cf3SAxel Dörfler void
58341281cf3SAxel Dörfler TBarWindow::GetIconFrame(BMessage* message)
58441281cf3SAxel Dörfler {
58541281cf3SAxel Dörfler 	BRect frame(0, 0, 0, 0);
58641281cf3SAxel Dörfler 
58741281cf3SAxel Dörfler 	const char* name;
58841281cf3SAxel Dörfler 	int32 id;
58941281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
59041281cf3SAxel Dörfler 		frame = fBarView->IconFrame(id);
59141281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
59241281cf3SAxel Dörfler 		frame = fBarView->IconFrame(name);
59341281cf3SAxel Dörfler 
59441281cf3SAxel Dörfler 	BMessage reply('rply');
59541281cf3SAxel Dörfler 	reply.AddRect("frame", frame);
59641281cf3SAxel Dörfler 	message->SendReply(&reply);
59741281cf3SAxel Dörfler }
59871bd3ba5SJonas Sundström 
5994c139440SAxel Dörfler 
6004c139440SAxel Dörfler bool
6014c139440SAxel Dörfler TBarWindow::_IsFocusMessage(BMessage* message)
6024c139440SAxel Dörfler {
6034c139440SAxel Dörfler 	BMessage::Private messagePrivate(message);
6044c139440SAxel Dörfler 	if (!messagePrivate.UsePreferredTarget())
6054c139440SAxel Dörfler 		return false;
6064c139440SAxel Dörfler 
6074c139440SAxel Dörfler 	bool feedFocus;
6084c139440SAxel Dörfler 	if (message->HasInt32("_token")
6094c139440SAxel Dörfler 		&& (message->FindBool("_feed_focus", &feedFocus) != B_OK || !feedFocus))
6104c139440SAxel Dörfler 		return false;
6114c139440SAxel Dörfler 
6124c139440SAxel Dörfler 	return true;
6134c139440SAxel Dörfler }
6141075cc34SFredrik Holmqvist 
615