xref: /haiku/src/apps/deskbar/BarWindow.cpp (revision 59eae96d68114e5c957d8cc222df5f7c42b46603)
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 
2941281cf3SAxel Dörfler Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
3041281cf3SAxel Dörfler of Be Incorporated in the United States and other countries. Other brand product
3141281cf3SAxel Dörfler names are registered trademarks or trademarks of their respective holders.
3241281cf3SAxel Dörfler All rights reserved.
3341281cf3SAxel Dörfler */
3441281cf3SAxel Dörfler 
355b576468SAxel Dörfler 
365b576468SAxel Dörfler #include "BarWindow.h"
375b576468SAxel Dörfler 
3841281cf3SAxel Dörfler #include <stdio.h>
395b576468SAxel Dörfler 
4041281cf3SAxel Dörfler #include <Application.h>
4141281cf3SAxel Dörfler #include <Directory.h>
4241281cf3SAxel Dörfler #include <FindDirectory.h>
4341281cf3SAxel Dörfler #include <Path.h>
4441281cf3SAxel Dörfler #include <Debug.h>
4541281cf3SAxel Dörfler #include <File.h>
4641281cf3SAxel Dörfler #include <MenuItem.h>
4741281cf3SAxel Dörfler #include <MessageFilter.h>
4841281cf3SAxel Dörfler #include <Screen.h>
4941281cf3SAxel Dörfler 
5041281cf3SAxel Dörfler #include "BarApp.h"
5141281cf3SAxel Dörfler #include "BarMenuBar.h"
5241281cf3SAxel Dörfler #include "BarView.h"
5341281cf3SAxel Dörfler #include "BeMenu.h"
5441281cf3SAxel Dörfler #include "PublicCommands.h"
5541281cf3SAxel Dörfler #include "StatusView.h"
5641281cf3SAxel Dörfler #include "tracker_private.h"
5741281cf3SAxel Dörfler 
5841281cf3SAxel Dörfler 
5941281cf3SAxel Dörfler // This is a very ugly hack to be able to call the private BMenuBar::StartMenuBar()
6041281cf3SAxel Dörfler // method from the TBarWindow::ShowBeMenu() method.
6141281cf3SAxel Dörfler // Don't do this at home -- but why the hell is this method private?
6241281cf3SAxel Dörfler #if __MWERKS__
634a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack StartMenuBar__8BMenuBarFlbbP5BRect
644a71b881SAxel Dörfler #elif __GNUC__ <= 2
654a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack StartMenuBar__8BMenuBarlbT2P5BRect
664a71b881SAxel Dörfler #elif __GNUC__ > 2
674a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack _ZN8BMenuBar12StartMenuBarElbbP5BRect
6841281cf3SAxel Dörfler #else
6941281cf3SAxel Dörfler #	error "You may want to port this ugly hack to your compiler ABI"
7041281cf3SAxel Dörfler #endif
714a71b881SAxel Dörfler extern "C" void BMenuBar_StartMenuBar_Hack(BMenuBar*,int32,bool,bool,BRect*);
7241281cf3SAxel Dörfler 
7341281cf3SAxel Dörfler 
7441281cf3SAxel Dörfler TBeMenu* TBarWindow::sBeMenu = NULL;
7541281cf3SAxel Dörfler 
7641281cf3SAxel Dörfler 
7741281cf3SAxel Dörfler TBarWindow::TBarWindow()
7872f5ac30SAxel Dörfler 	:
7972f5ac30SAxel Dörfler 	BWindow(BRect(-1000.0f, -1000.0f, -1000.0f, -1000.0f), "Deskbar",
8041281cf3SAxel Dörfler 		B_BORDERED_WINDOW,
8141281cf3SAxel Dörfler 		B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
8272f5ac30SAxel Dörfler 			| B_NOT_MINIMIZABLE | B_NOT_MOVABLE | B_AVOID_FRONT
8372f5ac30SAxel Dörfler 			| B_ASYNCHRONOUS_CONTROLS,
8441281cf3SAxel Dörfler 		B_ALL_WORKSPACES)
8541281cf3SAxel Dörfler {
8641281cf3SAxel Dörfler 	desk_settings* settings = ((TBarApp*)be_app)->Settings();
8741281cf3SAxel Dörfler 	if (settings->alwaysOnTop)
8841281cf3SAxel Dörfler 		SetFeel(B_FLOATING_ALL_WINDOW_FEEL);
8972f5ac30SAxel Dörfler 	fBarView = new TBarView(Bounds(), settings->vertical, settings->left,
9072f5ac30SAxel Dörfler 		settings->top, settings->ampmMode, settings->state, settings->width,
9172f5ac30SAxel Dörfler 		settings->showTime);
9241281cf3SAxel Dörfler 	AddChild(fBarView);
9341281cf3SAxel Dörfler 
9435c6651cSKarsten Heimrich 	RemoveShortcut('H', B_COMMAND_KEY | B_CONTROL_KEY);
9541281cf3SAxel Dörfler 	AddShortcut('F', B_COMMAND_KEY, new BMessage(kFindButton));
9641281cf3SAxel Dörfler }
9741281cf3SAxel Dörfler 
9841281cf3SAxel Dörfler 
9941281cf3SAxel Dörfler void
10041281cf3SAxel Dörfler TBarWindow::DispatchMessage(BMessage* message, BHandler* handler)
10141281cf3SAxel Dörfler {
1020a201be4SAxel Dörfler 	// Activate the window when you click on it (ie. on the tray area,
1030a201be4SAxel Dörfler 	// the menu part will do this automatically)
104ca9acc20SAxel Dörfler 	if (message->what == B_MOUSE_DOWN) {
105ca9acc20SAxel Dörfler 		if (!((TBarApp*)be_app)->Settings()->autoRaise)
10641281cf3SAxel Dörfler 			Activate(true);
10741281cf3SAxel Dörfler 
108*59eae96dSAxel Dörfler 		if ((modifiers() & (B_CONTROL_KEY | B_COMMAND_KEY | B_OPTION_KEY
109*59eae96dSAxel Dörfler 				| B_SHIFT_KEY)) == (B_CONTROL_KEY | B_COMMAND_KEY)) {
110ca9acc20SAxel Dörfler 			// The window key was pressed - enter dragging code
111ca9acc20SAxel Dörfler 			fBarView->DragRegion()->MouseDown(
112ca9acc20SAxel Dörfler 				fBarView->DragRegion()->DragRegion().LeftTop());
113ca9acc20SAxel Dörfler 			return;
114ca9acc20SAxel Dörfler 		}
115ca9acc20SAxel Dörfler 	}
116ca9acc20SAxel Dörfler 
11741281cf3SAxel Dörfler 	BWindow::DispatchMessage(message, handler);
11841281cf3SAxel Dörfler }
11941281cf3SAxel Dörfler 
12041281cf3SAxel Dörfler 
12141281cf3SAxel Dörfler void
12241281cf3SAxel Dörfler TBarWindow::MenusBeginning()
12341281cf3SAxel Dörfler {
12441281cf3SAxel Dörfler 	BPath path;
12541281cf3SAxel Dörfler 	entry_ref ref;
12641281cf3SAxel Dörfler 
12741281cf3SAxel Dörfler 	find_directory (B_USER_DESKBAR_DIRECTORY, &path);
12841281cf3SAxel Dörfler 	get_ref_for_path(path.Path(), &ref);
12941281cf3SAxel Dörfler 
13041281cf3SAxel Dörfler 	BEntry entry(&ref, true);
13141281cf3SAxel Dörfler 	if (entry.InitCheck() == B_OK && entry.IsDirectory()) {
13241281cf3SAxel Dörfler 		//	need the entry_ref to the actual item
13341281cf3SAxel Dörfler 		entry.GetRef(&ref);
13441281cf3SAxel Dörfler 		//	set the nav directory to the be folder
13541281cf3SAxel Dörfler 		sBeMenu->SetNavDir(&ref);
13641281cf3SAxel Dörfler 	} else if (!entry.Exists()) {
13741281cf3SAxel Dörfler 		//	the Be folder does not exist
13841281cf3SAxel Dörfler 		//	create one now
13941281cf3SAxel Dörfler 		BDirectory dir;
14041281cf3SAxel Dörfler 		if (entry.GetParent(&dir) == B_OK) {
14141281cf3SAxel Dörfler 			BDirectory bedir;
14241281cf3SAxel Dörfler 			dir.CreateDirectory("be", &bedir);
14341281cf3SAxel Dörfler 			if (bedir.GetEntry(&entry) == B_OK
14441281cf3SAxel Dörfler 				&& entry.GetRef(&ref) == B_OK)
14541281cf3SAxel Dörfler 				sBeMenu->SetNavDir(&ref);
14641281cf3SAxel Dörfler 		}
14741281cf3SAxel Dörfler 	} else {
14841281cf3SAxel Dörfler 		//	this really should never happen
14941281cf3SAxel Dörfler 		TRESPASS();
15041281cf3SAxel Dörfler 		return;
15141281cf3SAxel Dörfler 	}
15241281cf3SAxel Dörfler 
15341281cf3SAxel Dörfler 	sBeMenu->NeedsToRebuild();
15441281cf3SAxel Dörfler 	sBeMenu->ResetTargets();
15541281cf3SAxel Dörfler 
156f8ab4e92SAxel Dörfler 	fBarView->SetEventMask(0);
157f8ab4e92SAxel Dörfler 		// This works around a BeOS bug - the menu is quit with every
158f8ab4e92SAxel Dörfler 		// B_MOUSE_DOWN the window receives...
159f8ab4e92SAxel Dörfler 
16041281cf3SAxel Dörfler 	BWindow::MenusBeginning();
16141281cf3SAxel Dörfler }
16241281cf3SAxel Dörfler 
16341281cf3SAxel Dörfler 
16441281cf3SAxel Dörfler void
16541281cf3SAxel Dörfler TBarWindow::MenusEnded()
16641281cf3SAxel Dörfler {
16741281cf3SAxel Dörfler 	BWindow::MenusEnded();
16841281cf3SAxel Dörfler 
1694446e07aSStefano Ceccherini 	if (sBeMenu->LockLooper()) {
1703702e473SStephan Aßmus 		// TODO: is this ok?
1714446e07aSStefano Ceccherini 		sBeMenu->RemoveItems(0, sBeMenu->CountItems(), true);
1723702e473SStephan Aßmus 		sBeMenu->UnlockLooper();
17341281cf3SAxel Dörfler 	}
174f8ab4e92SAxel Dörfler 
175f8ab4e92SAxel Dörfler 	fBarView->UpdateAutoRaise();
1764446e07aSStefano Ceccherini }
17741281cf3SAxel Dörfler 
17841281cf3SAxel Dörfler 
17941281cf3SAxel Dörfler void
18041281cf3SAxel Dörfler TBarWindow::MessageReceived(BMessage* message)
18141281cf3SAxel Dörfler {
18241281cf3SAxel Dörfler 	switch (message->what) {
18341281cf3SAxel Dörfler 		case kFindButton:
18441281cf3SAxel Dörfler 		{
18541281cf3SAxel Dörfler 			BMessenger tracker(kTrackerSignature);
18641281cf3SAxel Dörfler 			tracker.SendMessage(message);
18741281cf3SAxel Dörfler 			break;
18841281cf3SAxel Dörfler 		}
18941281cf3SAxel Dörfler 
19041281cf3SAxel Dörfler 		case 'gloc':
19141281cf3SAxel Dörfler 			GetLocation(message);
19241281cf3SAxel Dörfler 			break;
19341281cf3SAxel Dörfler 
19441281cf3SAxel Dörfler 		case 'sloc':
19541281cf3SAxel Dörfler 			SetLocation(message);
19641281cf3SAxel Dörfler 			break;
19741281cf3SAxel Dörfler 
19841281cf3SAxel Dörfler 		case 'gexp':
19941281cf3SAxel Dörfler 			IsExpanded(message);
20041281cf3SAxel Dörfler 			break;
20141281cf3SAxel Dörfler 
20241281cf3SAxel Dörfler 		case 'sexp':
20341281cf3SAxel Dörfler 			Expand(message);
20441281cf3SAxel Dörfler 			break;
20541281cf3SAxel Dörfler 
20641281cf3SAxel Dörfler 		case 'info':
20741281cf3SAxel Dörfler 			ItemInfo(message);
20841281cf3SAxel Dörfler 			break;
20941281cf3SAxel Dörfler 
21041281cf3SAxel Dörfler 		case 'exst':
21141281cf3SAxel Dörfler 			ItemExists(message);
21241281cf3SAxel Dörfler 			break;
21341281cf3SAxel Dörfler 
21441281cf3SAxel Dörfler 		case 'cwnt':
21541281cf3SAxel Dörfler 			CountItems(message);
21641281cf3SAxel Dörfler 			break;
21741281cf3SAxel Dörfler 
21841281cf3SAxel Dörfler 		case 'adon':
21941281cf3SAxel Dörfler 		case 'icon':
22041281cf3SAxel Dörfler 			AddItem(message);
22141281cf3SAxel Dörfler 			break;
22241281cf3SAxel Dörfler 
22341281cf3SAxel Dörfler 		case 'remv':
22441281cf3SAxel Dörfler 			RemoveItem(message);
22541281cf3SAxel Dörfler 			break;
22641281cf3SAxel Dörfler 
22741281cf3SAxel Dörfler 		case 'iloc':
22841281cf3SAxel Dörfler 			GetIconFrame(message);
22941281cf3SAxel Dörfler 			break;
23041281cf3SAxel Dörfler 
23141281cf3SAxel Dörfler 		default:
23241281cf3SAxel Dörfler 			BWindow::MessageReceived(message);
23341281cf3SAxel Dörfler 			break;
23441281cf3SAxel Dörfler 	}
23541281cf3SAxel Dörfler }
23641281cf3SAxel Dörfler 
23741281cf3SAxel Dörfler 
23841281cf3SAxel Dörfler void
2395b576468SAxel Dörfler TBarWindow::Minimize(bool minimize)
2405b576468SAxel Dörfler {
2415b576468SAxel Dörfler 	// Don't allow the Deskbar to be minimized
2425b576468SAxel Dörfler 	if (!minimize)
2435b576468SAxel Dörfler 		BWindow::Minimize(false);
2445b576468SAxel Dörfler }
2455b576468SAxel Dörfler 
2465b576468SAxel Dörfler 
2475b576468SAxel Dörfler void
24841281cf3SAxel Dörfler TBarWindow::SaveSettings()
24941281cf3SAxel Dörfler {
25041281cf3SAxel Dörfler 	fBarView->SaveSettings();
25141281cf3SAxel Dörfler }
25241281cf3SAxel Dörfler 
25341281cf3SAxel Dörfler 
25441281cf3SAxel Dörfler bool
25541281cf3SAxel Dörfler TBarWindow::QuitRequested()
25641281cf3SAxel Dörfler {
25741281cf3SAxel Dörfler 	be_app->PostMessage(B_QUIT_REQUESTED);
25841281cf3SAxel Dörfler 
25941281cf3SAxel Dörfler 	return BWindow::QuitRequested();
26041281cf3SAxel Dörfler }
26141281cf3SAxel Dörfler 
26241281cf3SAxel Dörfler 
26341281cf3SAxel Dörfler void
26441281cf3SAxel Dörfler TBarWindow::WorkspaceActivated(int32 workspace, bool active)
26541281cf3SAxel Dörfler {
26641281cf3SAxel Dörfler 	BWindow::WorkspaceActivated(workspace, active);
26741281cf3SAxel Dörfler 
26841281cf3SAxel Dörfler 	if (active && !(fBarView->Expando() && fBarView->Vertical()))
26941281cf3SAxel Dörfler 		fBarView->UpdatePlacement();
27041281cf3SAxel Dörfler 	else {
27141281cf3SAxel Dörfler 		BRect screenFrame = (BScreen(fBarView->Window())).Frame();
27241281cf3SAxel Dörfler 		fBarView->SizeWindow(screenFrame);
27341281cf3SAxel Dörfler 		fBarView->PositionWindow(screenFrame);
27441281cf3SAxel Dörfler 		fBarView->Invalidate();
27541281cf3SAxel Dörfler 	}
27641281cf3SAxel Dörfler }
27741281cf3SAxel Dörfler 
27841281cf3SAxel Dörfler 
27941281cf3SAxel Dörfler void
28041281cf3SAxel Dörfler TBarWindow::ScreenChanged(BRect size, color_space depth)
28141281cf3SAxel Dörfler {
28241281cf3SAxel Dörfler 	BWindow::ScreenChanged(size, depth);
28341281cf3SAxel Dörfler 
28441281cf3SAxel Dörfler 	fBarView->UpdatePlacement();
28541281cf3SAxel Dörfler }
28641281cf3SAxel Dörfler 
28741281cf3SAxel Dörfler 
28841281cf3SAxel Dörfler void
28941281cf3SAxel Dörfler TBarWindow::SetBeMenu(TBeMenu* menu)
29041281cf3SAxel Dörfler {
29141281cf3SAxel Dörfler 	sBeMenu = menu;
29241281cf3SAxel Dörfler }
29341281cf3SAxel Dörfler 
29441281cf3SAxel Dörfler 
29541281cf3SAxel Dörfler TBeMenu*
29641281cf3SAxel Dörfler TBarWindow::BeMenu()
29741281cf3SAxel Dörfler {
29841281cf3SAxel Dörfler 	return sBeMenu;
29941281cf3SAxel Dörfler }
30041281cf3SAxel Dörfler 
30141281cf3SAxel Dörfler 
30241281cf3SAxel Dörfler void
30341281cf3SAxel Dörfler TBarWindow::ShowBeMenu()
30441281cf3SAxel Dörfler {
30541281cf3SAxel Dörfler 	BMenuBar* menuBar = fBarView->BarMenuBar();
30641281cf3SAxel Dörfler 	if (menuBar == NULL)
30741281cf3SAxel Dörfler 		menuBar = KeyMenuBar();
30841281cf3SAxel Dörfler 
30941281cf3SAxel Dörfler 	if (menuBar == NULL)
31041281cf3SAxel Dörfler 		return;
31141281cf3SAxel Dörfler 
3124a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(menuBar,0,true,true,NULL);
31341281cf3SAxel Dörfler }
31441281cf3SAxel Dörfler 
31541281cf3SAxel Dörfler 
31641281cf3SAxel Dörfler void
31741281cf3SAxel Dörfler TBarWindow::ShowTeamMenu()
31841281cf3SAxel Dörfler {
31941281cf3SAxel Dörfler 	int32 index = 0;
32041281cf3SAxel Dörfler 	if (fBarView->BarMenuBar() == NULL)
32141281cf3SAxel Dörfler 		index = 2;
32241281cf3SAxel Dörfler 
32341281cf3SAxel Dörfler 	if (KeyMenuBar() == NULL)
32441281cf3SAxel Dörfler 		return;
32541281cf3SAxel Dörfler 
3264a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(KeyMenuBar(),index,true,true,NULL);
32741281cf3SAxel Dörfler }
32841281cf3SAxel Dörfler 
32941281cf3SAxel Dörfler 
33041281cf3SAxel Dörfler /**	determines the actual location of the window */
33141281cf3SAxel Dörfler 
33241281cf3SAxel Dörfler deskbar_location
33341281cf3SAxel Dörfler TBarWindow::DeskbarLocation() const
33441281cf3SAxel Dörfler {
33541281cf3SAxel Dörfler 	bool left = fBarView->Left();
33641281cf3SAxel Dörfler 	bool top = fBarView->Top();
33741281cf3SAxel Dörfler 
33841281cf3SAxel Dörfler 	if (fBarView->AcrossTop())
33941281cf3SAxel Dörfler 		return B_DESKBAR_TOP;
34041281cf3SAxel Dörfler 
34141281cf3SAxel Dörfler 	if (fBarView->AcrossBottom())
34241281cf3SAxel Dörfler 		return B_DESKBAR_BOTTOM;
34341281cf3SAxel Dörfler 
34441281cf3SAxel Dörfler 	if (left && top)
34541281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_TOP;
34641281cf3SAxel Dörfler 
34741281cf3SAxel Dörfler 	if (!left && top)
34841281cf3SAxel Dörfler 		return B_DESKBAR_RIGHT_TOP;
34941281cf3SAxel Dörfler 
35041281cf3SAxel Dörfler 	if (left && !top)
35141281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_BOTTOM;
35241281cf3SAxel Dörfler 
35341281cf3SAxel Dörfler 	return B_DESKBAR_RIGHT_BOTTOM;
35441281cf3SAxel Dörfler }
35541281cf3SAxel Dörfler 
35641281cf3SAxel Dörfler 
35741281cf3SAxel Dörfler void
35841281cf3SAxel Dörfler TBarWindow::GetLocation(BMessage* message)
35941281cf3SAxel Dörfler {
36041281cf3SAxel Dörfler 	BMessage reply('rply');
36141281cf3SAxel Dörfler 	reply.AddInt32("location", (int32)DeskbarLocation());
36241281cf3SAxel Dörfler 	reply.AddBool("expanded", fBarView->Expando());
36341281cf3SAxel Dörfler 
36441281cf3SAxel Dörfler 	message->SendReply(&reply);
36541281cf3SAxel Dörfler }
36641281cf3SAxel Dörfler 
36741281cf3SAxel Dörfler 
36841281cf3SAxel Dörfler void
36941281cf3SAxel Dörfler TBarWindow::SetDeskbarLocation(deskbar_location location, bool newExpandState)
37041281cf3SAxel Dörfler {
37141281cf3SAxel Dörfler 	// left top and right top are the only two that
37241281cf3SAxel Dörfler 	// currently pay attention to expand, ignore for all others
37341281cf3SAxel Dörfler 
37441281cf3SAxel Dörfler 	bool left = false, top = true, vertical, expand;
37541281cf3SAxel Dörfler 
37641281cf3SAxel Dörfler 	switch (location) {
37741281cf3SAxel Dörfler 		case B_DESKBAR_TOP:
37841281cf3SAxel Dörfler 			left = true;
37941281cf3SAxel Dörfler 			top = true;
38041281cf3SAxel Dörfler 			vertical = false;
38141281cf3SAxel Dörfler 			expand = true;
38241281cf3SAxel Dörfler 			break;
38341281cf3SAxel Dörfler 
38441281cf3SAxel Dörfler 		case B_DESKBAR_BOTTOM:
38541281cf3SAxel Dörfler 			left = true;
38641281cf3SAxel Dörfler 			top = false;
38741281cf3SAxel Dörfler 			vertical = false;
38841281cf3SAxel Dörfler 			expand = true;
38941281cf3SAxel Dörfler 			break;
39041281cf3SAxel Dörfler 
39141281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_TOP:
39241281cf3SAxel Dörfler 			left = true;
39341281cf3SAxel Dörfler 			top = true;
39441281cf3SAxel Dörfler 			vertical = true;
39541281cf3SAxel Dörfler 			expand = newExpandState;
39641281cf3SAxel Dörfler 			break;
39741281cf3SAxel Dörfler 
39841281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_TOP:
39941281cf3SAxel Dörfler 			left = false;
40041281cf3SAxel Dörfler 			top = true;
40141281cf3SAxel Dörfler 			vertical = true;
40241281cf3SAxel Dörfler 			expand = newExpandState;
40341281cf3SAxel Dörfler 			break;
40441281cf3SAxel Dörfler 
40541281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_BOTTOM:
40641281cf3SAxel Dörfler 			left = true;
40741281cf3SAxel Dörfler 			top = false;
40841281cf3SAxel Dörfler 			vertical = true;
40941281cf3SAxel Dörfler 			expand = false;
41041281cf3SAxel Dörfler 			break;
41141281cf3SAxel Dörfler 
41241281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_BOTTOM:
41341281cf3SAxel Dörfler 			left = false;
41441281cf3SAxel Dörfler 			top = false;
41541281cf3SAxel Dörfler 			vertical = true;
41641281cf3SAxel Dörfler 			expand = false;
41741281cf3SAxel Dörfler 			break;
41841281cf3SAxel Dörfler 
41941281cf3SAxel Dörfler 		default:
42041281cf3SAxel Dörfler 			left = true;
42141281cf3SAxel Dörfler 			top = true;
42241281cf3SAxel Dörfler 			vertical = false;
42341281cf3SAxel Dörfler 			expand = true;
42441281cf3SAxel Dörfler 			break;
42541281cf3SAxel Dörfler 	}
42641281cf3SAxel Dörfler 
42741281cf3SAxel Dörfler 	fBarView->ChangeState(expand, vertical, left, top);
42841281cf3SAxel Dörfler }
42941281cf3SAxel Dörfler 
4305b576468SAxel Dörfler 
43141281cf3SAxel Dörfler void
43241281cf3SAxel Dörfler TBarWindow::SetLocation(BMessage* message)
43341281cf3SAxel Dörfler {
43441281cf3SAxel Dörfler 	deskbar_location location;
43541281cf3SAxel Dörfler 	bool expand;
43641281cf3SAxel Dörfler 	if (message->FindInt32("location", (int32*)&location) == B_OK
43741281cf3SAxel Dörfler 		&& message->FindBool("expand", &expand) == B_OK)
43841281cf3SAxel Dörfler 		SetDeskbarLocation(location, expand);
43941281cf3SAxel Dörfler }
44041281cf3SAxel Dörfler 
44141281cf3SAxel Dörfler 
44241281cf3SAxel Dörfler void
44341281cf3SAxel Dörfler TBarWindow::IsExpanded(BMessage* message)
44441281cf3SAxel Dörfler {
44541281cf3SAxel Dörfler 	BMessage reply('rply');
44641281cf3SAxel Dörfler 	reply.AddBool("expanded", fBarView->Expando());
44741281cf3SAxel Dörfler 	message->SendReply(&reply);
44841281cf3SAxel Dörfler }
44941281cf3SAxel Dörfler 
45041281cf3SAxel Dörfler 
45141281cf3SAxel Dörfler void
45241281cf3SAxel Dörfler TBarWindow::Expand(BMessage* message)
45341281cf3SAxel Dörfler {
45441281cf3SAxel Dörfler 	bool expand;
45541281cf3SAxel Dörfler 	if (message->FindBool("expand", &expand) == B_OK) {
45641281cf3SAxel Dörfler 		bool vertical = fBarView->Vertical();
45741281cf3SAxel Dörfler 		bool left = fBarView->Left();
45841281cf3SAxel Dörfler 		bool top = fBarView->Top();
45941281cf3SAxel Dörfler 		fBarView->ChangeState(expand, vertical, left, top);
46041281cf3SAxel Dörfler 	}
46141281cf3SAxel Dörfler }
46241281cf3SAxel Dörfler 
46341281cf3SAxel Dörfler 
46441281cf3SAxel Dörfler void
46541281cf3SAxel Dörfler TBarWindow::ItemInfo(BMessage* message)
46641281cf3SAxel Dörfler {
46741281cf3SAxel Dörfler 	BMessage replyMsg;
46841281cf3SAxel Dörfler 	const char* name;
46941281cf3SAxel Dörfler 	int32 id;
47041281cf3SAxel Dörfler 	DeskbarShelf shelf;
47141281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK) {
47241281cf3SAxel Dörfler 		if (fBarView->ItemInfo(id, &name, &shelf) == B_OK) {
47341281cf3SAxel Dörfler 			replyMsg.AddString("name", name);
47441281cf3SAxel Dörfler #if SHELF_AWARE
47541281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
47641281cf3SAxel Dörfler #endif
47741281cf3SAxel Dörfler 		}
47841281cf3SAxel Dörfler 	} else if (message->FindString("name", &name) == B_OK) {
47941281cf3SAxel Dörfler 		if (fBarView->ItemInfo(name, &id, &shelf) == B_OK) {
48041281cf3SAxel Dörfler 			replyMsg.AddInt32("id", id);
48141281cf3SAxel Dörfler #if SHELF_AWARE
48241281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
48341281cf3SAxel Dörfler #endif
48441281cf3SAxel Dörfler 		}
48541281cf3SAxel Dörfler 	}
48641281cf3SAxel Dörfler 
48741281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
48841281cf3SAxel Dörfler }
48941281cf3SAxel Dörfler 
49041281cf3SAxel Dörfler 
49141281cf3SAxel Dörfler void
49241281cf3SAxel Dörfler TBarWindow::ItemExists(BMessage* message)
49341281cf3SAxel Dörfler {
49441281cf3SAxel Dörfler 	BMessage replyMsg;
49541281cf3SAxel Dörfler 	const char* name;
49641281cf3SAxel Dörfler 	int32 id;
49741281cf3SAxel Dörfler 	DeskbarShelf shelf;
49841281cf3SAxel Dörfler 
49941281cf3SAxel Dörfler #if SHELF_AWARE
50041281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
50141281cf3SAxel Dörfler #endif
50241281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
50341281cf3SAxel Dörfler 
50441281cf3SAxel Dörfler 	bool exists = false;
50541281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
50641281cf3SAxel Dörfler 		exists = fBarView->ItemExists(id, shelf);
50741281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
50841281cf3SAxel Dörfler 		exists = fBarView->ItemExists(name, shelf);
50941281cf3SAxel Dörfler 
51041281cf3SAxel Dörfler 	replyMsg.AddBool("exists", exists);
51141281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
51241281cf3SAxel Dörfler }
51341281cf3SAxel Dörfler 
51441281cf3SAxel Dörfler 
51541281cf3SAxel Dörfler void
51641281cf3SAxel Dörfler TBarWindow::CountItems(BMessage* message)
51741281cf3SAxel Dörfler {
51841281cf3SAxel Dörfler 	DeskbarShelf shelf;
51941281cf3SAxel Dörfler 
52041281cf3SAxel Dörfler #if SHELF_AWARE
52141281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
52241281cf3SAxel Dörfler #endif
52341281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
52441281cf3SAxel Dörfler 
52541281cf3SAxel Dörfler 	BMessage reply('rply');
52641281cf3SAxel Dörfler 	reply.AddInt32("count", fBarView->CountItems(shelf));
52741281cf3SAxel Dörfler 	message->SendReply(&reply);
52841281cf3SAxel Dörfler }
52941281cf3SAxel Dörfler 
53041281cf3SAxel Dörfler 
53141281cf3SAxel Dörfler void
53241281cf3SAxel Dörfler TBarWindow::AddItem(BMessage* message)
53341281cf3SAxel Dörfler {
53441281cf3SAxel Dörfler 	DeskbarShelf shelf;
53541281cf3SAxel Dörfler 	entry_ref ref;
53641281cf3SAxel Dörfler 	int32 id = 999;
53741281cf3SAxel Dörfler 	BMessage reply;
53841281cf3SAxel Dörfler 	status_t err = B_ERROR;
53941281cf3SAxel Dörfler 
54041281cf3SAxel Dörfler 	BMessage archivedView;
54141281cf3SAxel Dörfler 	if (message->FindMessage("view", &archivedView) == B_OK) {
54241281cf3SAxel Dörfler #if SHELF_AWARE
54341281cf3SAxel Dörfler 		if (message->FindInt32("shelf", (int32*)&shelf) != B_OK)
54441281cf3SAxel Dörfler #endif
54541281cf3SAxel Dörfler 			shelf = B_DESKBAR_TRAY;
54641281cf3SAxel Dörfler 
547ced3755cSAxel Dörfler 		BMessage* archive = new BMessage(archivedView);
548ced3755cSAxel Dörfler 		err = fBarView->AddItem(archive, shelf, &id);
549ced3755cSAxel Dörfler 		if (err < B_OK)
550ced3755cSAxel Dörfler 			delete archive;
55141281cf3SAxel Dörfler 	} else if (message->FindRef("addon", &ref) == B_OK) {
55241281cf3SAxel Dörfler 		//
55341281cf3SAxel Dörfler 		//	exposing the name of the view here is not so great
55471bd3ba5SJonas Sundström 		TReplicantTray* tray
55571bd3ba5SJonas Sundström 			= dynamic_cast<TReplicantTray*>(FindView("Status"));
55641281cf3SAxel Dörfler 		if (tray) {
55741281cf3SAxel Dörfler 			// Force this into the deskbar even if the security code is wrong
55841281cf3SAxel Dörfler 			// This is OK because the user specifically asked for this replicant
55941281cf3SAxel Dörfler 			BEntry entry(&ref);
56041281cf3SAxel Dörfler 			err = tray->LoadAddOn(&entry, &id, true);
56141281cf3SAxel Dörfler 		}
56241281cf3SAxel Dörfler 	}
56341281cf3SAxel Dörfler 
56441281cf3SAxel Dörfler 	if (err == B_OK)
56541281cf3SAxel Dörfler 		reply.AddInt32("id", id);
56641281cf3SAxel Dörfler 	else
56741281cf3SAxel Dörfler 		reply.AddInt32("error", err);
56841281cf3SAxel Dörfler 
56941281cf3SAxel Dörfler 	message->SendReply(&reply);
57041281cf3SAxel Dörfler }
57141281cf3SAxel Dörfler 
57241281cf3SAxel Dörfler 
57341281cf3SAxel Dörfler void
57441281cf3SAxel Dörfler TBarWindow::RemoveItem(BMessage* message)
57541281cf3SAxel Dörfler {
57641281cf3SAxel Dörfler 	int32 id;
57741281cf3SAxel Dörfler 	const char* name;
57841281cf3SAxel Dörfler 
57941281cf3SAxel Dörfler 	// 	ids ought to be unique across all shelves, assuming, of course,
58041281cf3SAxel Dörfler 	//	that sometime in the future there may be more than one
58141281cf3SAxel Dörfler #if SHELF_AWARE
58241281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32*)&shelf) == B_OK) {
58341281cf3SAxel Dörfler 		if (message->FindString("name", &name) == B_OK)
58441281cf3SAxel Dörfler 			fBarView->RemoveItem(name, shelf);
58541281cf3SAxel Dörfler 	} else {
58641281cf3SAxel Dörfler #endif
58741281cf3SAxel Dörfler 		if (message->FindInt32("id", &id) == B_OK) {
58841281cf3SAxel Dörfler 			fBarView->RemoveItem(id);
58941281cf3SAxel Dörfler 		//	remove the following two lines if and when the
59041281cf3SAxel Dörfler 		//	shelf option returns
59141281cf3SAxel Dörfler 		} else if (message->FindString("name", &name) == B_OK)
59241281cf3SAxel Dörfler 			fBarView->RemoveItem(name, B_DESKBAR_TRAY);
59341281cf3SAxel Dörfler 
59441281cf3SAxel Dörfler #if SHELF_AWARE
59541281cf3SAxel Dörfler 	}
59641281cf3SAxel Dörfler #endif
59741281cf3SAxel Dörfler }
59841281cf3SAxel Dörfler 
59941281cf3SAxel Dörfler 
60041281cf3SAxel Dörfler void
60141281cf3SAxel Dörfler TBarWindow::GetIconFrame(BMessage* message)
60241281cf3SAxel Dörfler {
60341281cf3SAxel Dörfler 	BRect frame(0, 0, 0, 0);
60441281cf3SAxel Dörfler 
60541281cf3SAxel Dörfler 	const char* name;
60641281cf3SAxel Dörfler 	int32 id;
60741281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
60841281cf3SAxel Dörfler 		frame = fBarView->IconFrame(id);
60941281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
61041281cf3SAxel Dörfler 		frame = fBarView->IconFrame(name);
61141281cf3SAxel Dörfler 
61241281cf3SAxel Dörfler 	BMessage reply('rply');
61341281cf3SAxel Dörfler 	reply.AddRect("frame", frame);
61441281cf3SAxel Dörfler 	message->SendReply(&reply);
61541281cf3SAxel Dörfler }
61671bd3ba5SJonas Sundström 
617