xref: /haiku/src/apps/deskbar/BarWindow.cpp (revision ced3755c30e6d91cb23175a888f32355401fe39d)
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 
3541281cf3SAxel Dörfler #include <stdio.h>
3641281cf3SAxel Dörfler #include <Application.h>
3741281cf3SAxel Dörfler #include <Directory.h>
3841281cf3SAxel Dörfler #include <FindDirectory.h>
3941281cf3SAxel Dörfler #include <Path.h>
4041281cf3SAxel Dörfler #include <Debug.h>
4141281cf3SAxel Dörfler #include <File.h>
4241281cf3SAxel Dörfler #include <MenuItem.h>
4341281cf3SAxel Dörfler #include <MessageFilter.h>
4441281cf3SAxel Dörfler #include <Screen.h>
4541281cf3SAxel Dörfler 
4641281cf3SAxel Dörfler #include "BarWindow.h"
4741281cf3SAxel Dörfler #include "BarApp.h"
4841281cf3SAxel Dörfler #include "BarMenuBar.h"
4941281cf3SAxel Dörfler #include "BarView.h"
5041281cf3SAxel Dörfler #include "BeMenu.h"
5141281cf3SAxel Dörfler #include "PublicCommands.h"
5241281cf3SAxel Dörfler #include "StatusView.h"
5341281cf3SAxel Dörfler #include "tracker_private.h"
5441281cf3SAxel Dörfler 
5541281cf3SAxel Dörfler 
5641281cf3SAxel Dörfler // This is a very ugly hack to be able to call the private BMenuBar::StartMenuBar()
5741281cf3SAxel Dörfler // method from the TBarWindow::ShowBeMenu() method.
5841281cf3SAxel Dörfler // Don't do this at home -- but why the hell is this method private?
5941281cf3SAxel Dörfler #if __MWERKS__
604a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack StartMenuBar__8BMenuBarFlbbP5BRect
614a71b881SAxel Dörfler #elif __GNUC__ <= 2
624a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack StartMenuBar__8BMenuBarlbT2P5BRect
634a71b881SAxel Dörfler #elif __GNUC__ > 2
644a71b881SAxel Dörfler 	#define BMenuBar_StartMenuBar_Hack _ZN8BMenuBar12StartMenuBarElbbP5BRect
6541281cf3SAxel Dörfler #else
6641281cf3SAxel Dörfler #	error "You may want to port this ugly hack to your compiler ABI"
6741281cf3SAxel Dörfler #endif
684a71b881SAxel Dörfler extern "C" void BMenuBar_StartMenuBar_Hack(BMenuBar *,int32,bool,bool,BRect *);
6941281cf3SAxel Dörfler 
7041281cf3SAxel Dörfler 
7141281cf3SAxel Dörfler TBeMenu *TBarWindow::sBeMenu = NULL;
7241281cf3SAxel Dörfler 
7341281cf3SAxel Dörfler 
7441281cf3SAxel Dörfler TBarWindow::TBarWindow()
7541281cf3SAxel Dörfler 	: BWindow(BRect(-1000.0f, -1000.0f, -1000.0f, -1000.0f), "Deskbar",
7641281cf3SAxel Dörfler 		B_BORDERED_WINDOW,
7741281cf3SAxel Dörfler 		B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
7841281cf3SAxel Dörfler 			| B_NOT_MOVABLE | B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
7941281cf3SAxel Dörfler 		B_ALL_WORKSPACES)
8041281cf3SAxel Dörfler {
8141281cf3SAxel Dörfler 	desk_settings *settings = ((TBarApp *)be_app)->Settings();
8241281cf3SAxel Dörfler 	if (settings->alwaysOnTop)
8341281cf3SAxel Dörfler 		SetFeel(B_FLOATING_ALL_WINDOW_FEEL);
8441281cf3SAxel Dörfler 	fBarView = new TBarView(Bounds(), settings->vertical,settings->left, settings->top,
8541281cf3SAxel Dörfler 		settings->ampmMode, settings->state, settings->width, settings->showTime);
8641281cf3SAxel Dörfler 	AddChild(fBarView);
8741281cf3SAxel Dörfler 
8841281cf3SAxel Dörfler 	AddShortcut('F', B_COMMAND_KEY, new BMessage(kFindButton));
8941281cf3SAxel Dörfler }
9041281cf3SAxel Dörfler 
9141281cf3SAxel Dörfler 
9241281cf3SAxel Dörfler void
9341281cf3SAxel Dörfler TBarWindow::DispatchMessage(BMessage *message, BHandler *handler)
9441281cf3SAxel Dörfler {
950a201be4SAxel Dörfler 	// Activate the window when you click on it (ie. on the tray area,
960a201be4SAxel Dörfler 	// the menu part will do this automatically)
970a201be4SAxel Dörfler 	if (message->what == B_MOUSE_DOWN
980a201be4SAxel Dörfler 		&& !((TBarApp *)be_app)->Settings()->autoRaise)
9941281cf3SAxel Dörfler 		Activate(true);
10041281cf3SAxel Dörfler 
10141281cf3SAxel Dörfler 	BWindow::DispatchMessage(message, handler);
10241281cf3SAxel Dörfler }
10341281cf3SAxel Dörfler 
10441281cf3SAxel Dörfler 
10541281cf3SAxel Dörfler void
10641281cf3SAxel Dörfler TBarWindow::MenusBeginning()
10741281cf3SAxel Dörfler {
10841281cf3SAxel Dörfler 	BPath path;
10941281cf3SAxel Dörfler 	entry_ref ref;
11041281cf3SAxel Dörfler 
11141281cf3SAxel Dörfler 	find_directory (B_USER_DESKBAR_DIRECTORY, &path);
11241281cf3SAxel Dörfler 	get_ref_for_path(path.Path(), &ref);
11341281cf3SAxel Dörfler 
11441281cf3SAxel Dörfler 	BEntry entry(&ref, true);
11541281cf3SAxel Dörfler 	if (entry.InitCheck() == B_OK && entry.IsDirectory()) {
11641281cf3SAxel Dörfler 		//	need the entry_ref to the actual item
11741281cf3SAxel Dörfler 		entry.GetRef(&ref);
11841281cf3SAxel Dörfler 		//	set the nav directory to the be folder
11941281cf3SAxel Dörfler 		sBeMenu->SetNavDir(&ref);
12041281cf3SAxel Dörfler 	} else if (!entry.Exists()) {
12141281cf3SAxel Dörfler 		//	the Be folder does not exist
12241281cf3SAxel Dörfler 		//	create one now
12341281cf3SAxel Dörfler 		BDirectory dir;
12441281cf3SAxel Dörfler 		if (entry.GetParent(&dir) == B_OK) {
12541281cf3SAxel Dörfler 			BDirectory bedir;
12641281cf3SAxel Dörfler 			dir.CreateDirectory("be", &bedir);
12741281cf3SAxel Dörfler 			if (bedir.GetEntry(&entry) == B_OK
12841281cf3SAxel Dörfler 				&& entry.GetRef(&ref) == B_OK)
12941281cf3SAxel Dörfler 				sBeMenu->SetNavDir(&ref);
13041281cf3SAxel Dörfler 		}
13141281cf3SAxel Dörfler 	} else {
13241281cf3SAxel Dörfler 		//	this really should never happen
13341281cf3SAxel Dörfler 		TRESPASS();
13441281cf3SAxel Dörfler 		return;
13541281cf3SAxel Dörfler 	}
13641281cf3SAxel Dörfler 
13741281cf3SAxel Dörfler 	sBeMenu->NeedsToRebuild();
13841281cf3SAxel Dörfler 	sBeMenu->ResetTargets();
13941281cf3SAxel Dörfler 
140f8ab4e92SAxel Dörfler 	fBarView->SetEventMask(0);
141f8ab4e92SAxel Dörfler 		// This works around a BeOS bug - the menu is quit with every
142f8ab4e92SAxel Dörfler 		// B_MOUSE_DOWN the window receives...
143f8ab4e92SAxel Dörfler 
14441281cf3SAxel Dörfler 	BWindow::MenusBeginning();
14541281cf3SAxel Dörfler }
14641281cf3SAxel Dörfler 
14741281cf3SAxel Dörfler 
14841281cf3SAxel Dörfler void
14941281cf3SAxel Dörfler TBarWindow::MenusEnded()
15041281cf3SAxel Dörfler {
15141281cf3SAxel Dörfler 	BWindow::MenusEnded();
15241281cf3SAxel Dörfler 
1534446e07aSStefano Ceccherini 	if (sBeMenu->LockLooper()) {
1543702e473SStephan Aßmus 		// TODO: is this ok?
1554446e07aSStefano Ceccherini 		sBeMenu->RemoveItems(0, sBeMenu->CountItems(), true);
1563702e473SStephan Aßmus 		sBeMenu->UnlockLooper();
15741281cf3SAxel Dörfler 	}
158f8ab4e92SAxel Dörfler 
159f8ab4e92SAxel Dörfler 	fBarView->UpdateAutoRaise();
1604446e07aSStefano Ceccherini }
16141281cf3SAxel Dörfler 
16241281cf3SAxel Dörfler 
16341281cf3SAxel Dörfler void
16441281cf3SAxel Dörfler TBarWindow::MessageReceived(BMessage *message)
16541281cf3SAxel Dörfler {
16641281cf3SAxel Dörfler 	switch (message->what) {
16741281cf3SAxel Dörfler 		case kFindButton:
16841281cf3SAxel Dörfler 		{
16941281cf3SAxel Dörfler 			BMessenger tracker(kTrackerSignature);
17041281cf3SAxel Dörfler 			tracker.SendMessage(message);
17141281cf3SAxel Dörfler 			break;
17241281cf3SAxel Dörfler 		}
17341281cf3SAxel Dörfler 
17441281cf3SAxel Dörfler 		case 'gloc':
17541281cf3SAxel Dörfler 			GetLocation(message);
17641281cf3SAxel Dörfler 			break;
17741281cf3SAxel Dörfler 
17841281cf3SAxel Dörfler 		case 'sloc':
17941281cf3SAxel Dörfler 			SetLocation(message);
18041281cf3SAxel Dörfler 			break;
18141281cf3SAxel Dörfler 
18241281cf3SAxel Dörfler 		case 'gexp':
18341281cf3SAxel Dörfler 			IsExpanded(message);
18441281cf3SAxel Dörfler 			break;
18541281cf3SAxel Dörfler 
18641281cf3SAxel Dörfler 		case 'sexp':
18741281cf3SAxel Dörfler 			Expand(message);
18841281cf3SAxel Dörfler 			break;
18941281cf3SAxel Dörfler 
19041281cf3SAxel Dörfler 		case 'info':
19141281cf3SAxel Dörfler 			ItemInfo(message);
19241281cf3SAxel Dörfler 			break;
19341281cf3SAxel Dörfler 
19441281cf3SAxel Dörfler 		case 'exst':
19541281cf3SAxel Dörfler 			ItemExists(message);
19641281cf3SAxel Dörfler 			break;
19741281cf3SAxel Dörfler 
19841281cf3SAxel Dörfler 		case 'cwnt':
19941281cf3SAxel Dörfler 			CountItems(message);
20041281cf3SAxel Dörfler 			break;
20141281cf3SAxel Dörfler 
20241281cf3SAxel Dörfler 		case 'adon':
20341281cf3SAxel Dörfler 		case 'icon':
20441281cf3SAxel Dörfler 			AddItem(message);
20541281cf3SAxel Dörfler 			break;
20641281cf3SAxel Dörfler 
20741281cf3SAxel Dörfler 		case 'remv':
20841281cf3SAxel Dörfler 			RemoveItem(message);
20941281cf3SAxel Dörfler 			break;
21041281cf3SAxel Dörfler 
21141281cf3SAxel Dörfler 		case 'iloc':
21241281cf3SAxel Dörfler 			GetIconFrame(message);
21341281cf3SAxel Dörfler 			break;
21441281cf3SAxel Dörfler 
21541281cf3SAxel Dörfler 		default:
21641281cf3SAxel Dörfler 			BWindow::MessageReceived(message);
21741281cf3SAxel Dörfler 			break;
21841281cf3SAxel Dörfler 	}
21941281cf3SAxel Dörfler }
22041281cf3SAxel Dörfler 
22141281cf3SAxel Dörfler 
22241281cf3SAxel Dörfler void
22341281cf3SAxel Dörfler TBarWindow::SaveSettings()
22441281cf3SAxel Dörfler {
22541281cf3SAxel Dörfler 	fBarView->SaveSettings();
22641281cf3SAxel Dörfler }
22741281cf3SAxel Dörfler 
22841281cf3SAxel Dörfler 
22941281cf3SAxel Dörfler bool
23041281cf3SAxel Dörfler TBarWindow::QuitRequested()
23141281cf3SAxel Dörfler {
23241281cf3SAxel Dörfler 	be_app->PostMessage(B_QUIT_REQUESTED);
23341281cf3SAxel Dörfler 
23441281cf3SAxel Dörfler 	return BWindow::QuitRequested();
23541281cf3SAxel Dörfler }
23641281cf3SAxel Dörfler 
23741281cf3SAxel Dörfler 
23841281cf3SAxel Dörfler void
23941281cf3SAxel Dörfler TBarWindow::WorkspaceActivated(int32 workspace, bool active)
24041281cf3SAxel Dörfler {
24141281cf3SAxel Dörfler 	BWindow::WorkspaceActivated(workspace, active);
24241281cf3SAxel Dörfler 
24341281cf3SAxel Dörfler 	if (active && !(fBarView->Expando() && fBarView->Vertical()))
24441281cf3SAxel Dörfler 		fBarView->UpdatePlacement();
24541281cf3SAxel Dörfler 	else {
24641281cf3SAxel Dörfler 		BRect screenFrame = (BScreen(fBarView->Window())).Frame();
24741281cf3SAxel Dörfler 		fBarView->SizeWindow(screenFrame);
24841281cf3SAxel Dörfler 		fBarView->PositionWindow(screenFrame);
24941281cf3SAxel Dörfler 		fBarView->Invalidate();
25041281cf3SAxel Dörfler 	}
25141281cf3SAxel Dörfler }
25241281cf3SAxel Dörfler 
25341281cf3SAxel Dörfler 
25441281cf3SAxel Dörfler void
25541281cf3SAxel Dörfler TBarWindow::ScreenChanged(BRect size, color_space depth)
25641281cf3SAxel Dörfler {
25741281cf3SAxel Dörfler 	BWindow::ScreenChanged(size, depth);
25841281cf3SAxel Dörfler 
25941281cf3SAxel Dörfler 	fBarView->UpdatePlacement();
26041281cf3SAxel Dörfler }
26141281cf3SAxel Dörfler 
26241281cf3SAxel Dörfler 
26341281cf3SAxel Dörfler void
26441281cf3SAxel Dörfler TBarWindow::SetBeMenu(TBeMenu *menu)
26541281cf3SAxel Dörfler {
26641281cf3SAxel Dörfler 	sBeMenu = menu;
26741281cf3SAxel Dörfler }
26841281cf3SAxel Dörfler 
26941281cf3SAxel Dörfler 
27041281cf3SAxel Dörfler TBeMenu *
27141281cf3SAxel Dörfler TBarWindow::BeMenu()
27241281cf3SAxel Dörfler {
27341281cf3SAxel Dörfler 	return sBeMenu;
27441281cf3SAxel Dörfler }
27541281cf3SAxel Dörfler 
27641281cf3SAxel Dörfler 
27741281cf3SAxel Dörfler void
27841281cf3SAxel Dörfler TBarWindow::ShowBeMenu()
27941281cf3SAxel Dörfler {
28041281cf3SAxel Dörfler 	BMenuBar *menuBar = fBarView->BarMenuBar();
28141281cf3SAxel Dörfler 	if (menuBar == NULL)
28241281cf3SAxel Dörfler 		menuBar = KeyMenuBar();
28341281cf3SAxel Dörfler 
28441281cf3SAxel Dörfler 	if (menuBar == NULL)
28541281cf3SAxel Dörfler 		return;
28641281cf3SAxel Dörfler 
2874a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(menuBar,0,true,true,NULL);
28841281cf3SAxel Dörfler }
28941281cf3SAxel Dörfler 
29041281cf3SAxel Dörfler 
29141281cf3SAxel Dörfler void
29241281cf3SAxel Dörfler TBarWindow::ShowTeamMenu()
29341281cf3SAxel Dörfler {
29441281cf3SAxel Dörfler 	int32 index = 0;
29541281cf3SAxel Dörfler 	if (fBarView->BarMenuBar() == NULL)
29641281cf3SAxel Dörfler 		index = 2;
29741281cf3SAxel Dörfler 
29841281cf3SAxel Dörfler 	if (KeyMenuBar() == NULL)
29941281cf3SAxel Dörfler 		return;
30041281cf3SAxel Dörfler 
3014a71b881SAxel Dörfler 	BMenuBar_StartMenuBar_Hack(KeyMenuBar(),index,true,true,NULL);
30241281cf3SAxel Dörfler }
30341281cf3SAxel Dörfler 
30441281cf3SAxel Dörfler 
30541281cf3SAxel Dörfler /**	determines the actual location of the window */
30641281cf3SAxel Dörfler 
30741281cf3SAxel Dörfler deskbar_location
30841281cf3SAxel Dörfler TBarWindow::DeskbarLocation() const
30941281cf3SAxel Dörfler {
31041281cf3SAxel Dörfler 	bool left = fBarView->Left();
31141281cf3SAxel Dörfler 	bool top = fBarView->Top();
31241281cf3SAxel Dörfler 
31341281cf3SAxel Dörfler 	if (fBarView->AcrossTop())
31441281cf3SAxel Dörfler 		return B_DESKBAR_TOP;
31541281cf3SAxel Dörfler 
31641281cf3SAxel Dörfler 	if (fBarView->AcrossBottom())
31741281cf3SAxel Dörfler 		return B_DESKBAR_BOTTOM;
31841281cf3SAxel Dörfler 
31941281cf3SAxel Dörfler 	if (left && top)
32041281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_TOP;
32141281cf3SAxel Dörfler 
32241281cf3SAxel Dörfler 	if (!left && top)
32341281cf3SAxel Dörfler 		return B_DESKBAR_RIGHT_TOP;
32441281cf3SAxel Dörfler 
32541281cf3SAxel Dörfler 	if (left && !top)
32641281cf3SAxel Dörfler 		return B_DESKBAR_LEFT_BOTTOM;
32741281cf3SAxel Dörfler 
32841281cf3SAxel Dörfler 	return B_DESKBAR_RIGHT_BOTTOM;
32941281cf3SAxel Dörfler }
33041281cf3SAxel Dörfler 
33141281cf3SAxel Dörfler 
33241281cf3SAxel Dörfler void
33341281cf3SAxel Dörfler TBarWindow::GetLocation(BMessage *message)
33441281cf3SAxel Dörfler {
33541281cf3SAxel Dörfler 	BMessage reply('rply');
33641281cf3SAxel Dörfler 	reply.AddInt32("location", (int32)DeskbarLocation());
33741281cf3SAxel Dörfler 	reply.AddBool("expanded", fBarView->Expando());
33841281cf3SAxel Dörfler 
33941281cf3SAxel Dörfler 	message->SendReply(&reply);
34041281cf3SAxel Dörfler }
34141281cf3SAxel Dörfler 
34241281cf3SAxel Dörfler 
34341281cf3SAxel Dörfler void
34441281cf3SAxel Dörfler TBarWindow::SetDeskbarLocation(deskbar_location location, bool newExpandState)
34541281cf3SAxel Dörfler {
34641281cf3SAxel Dörfler 	// left top and right top are the only two that
34741281cf3SAxel Dörfler 	// currently pay attention to expand, ignore for all others
34841281cf3SAxel Dörfler 
34941281cf3SAxel Dörfler 	bool left = false, top = true, vertical, expand;
35041281cf3SAxel Dörfler 
35141281cf3SAxel Dörfler 	switch (location) {
35241281cf3SAxel Dörfler 		case B_DESKBAR_TOP:
35341281cf3SAxel Dörfler 			left = true;
35441281cf3SAxel Dörfler 			top = true;
35541281cf3SAxel Dörfler 			vertical = false;
35641281cf3SAxel Dörfler 			expand = true;
35741281cf3SAxel Dörfler 			break;
35841281cf3SAxel Dörfler 
35941281cf3SAxel Dörfler 		case B_DESKBAR_BOTTOM:
36041281cf3SAxel Dörfler 			left = true;
36141281cf3SAxel Dörfler 			top = false;
36241281cf3SAxel Dörfler 			vertical = false;
36341281cf3SAxel Dörfler 			expand = true;
36441281cf3SAxel Dörfler 			break;
36541281cf3SAxel Dörfler 
36641281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_TOP:
36741281cf3SAxel Dörfler 			left = true;
36841281cf3SAxel Dörfler 			top = true;
36941281cf3SAxel Dörfler 			vertical = true;
37041281cf3SAxel Dörfler 			expand = newExpandState;
37141281cf3SAxel Dörfler 			break;
37241281cf3SAxel Dörfler 
37341281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_TOP:
37441281cf3SAxel Dörfler 			left = false;
37541281cf3SAxel Dörfler 			top = true;
37641281cf3SAxel Dörfler 			vertical = true;
37741281cf3SAxel Dörfler 			expand = newExpandState;
37841281cf3SAxel Dörfler 			break;
37941281cf3SAxel Dörfler 
38041281cf3SAxel Dörfler 		case B_DESKBAR_LEFT_BOTTOM:
38141281cf3SAxel Dörfler 			left = true;
38241281cf3SAxel Dörfler 			top = false;
38341281cf3SAxel Dörfler 			vertical = true;
38441281cf3SAxel Dörfler 			expand = false;
38541281cf3SAxel Dörfler 			break;
38641281cf3SAxel Dörfler 
38741281cf3SAxel Dörfler 		case B_DESKBAR_RIGHT_BOTTOM:
38841281cf3SAxel Dörfler 			left = false;
38941281cf3SAxel Dörfler 			top = false;
39041281cf3SAxel Dörfler 			vertical = true;
39141281cf3SAxel Dörfler 			expand = false;
39241281cf3SAxel Dörfler 			break;
39341281cf3SAxel Dörfler 
39441281cf3SAxel Dörfler 		default:
39541281cf3SAxel Dörfler 			left = true;
39641281cf3SAxel Dörfler 			top = true;
39741281cf3SAxel Dörfler 			vertical = false;
39841281cf3SAxel Dörfler 			expand = true;
39941281cf3SAxel Dörfler 			break;
40041281cf3SAxel Dörfler 	}
40141281cf3SAxel Dörfler 
40241281cf3SAxel Dörfler 	fBarView->ChangeState(expand, vertical, left, top);
40341281cf3SAxel Dörfler }
40441281cf3SAxel Dörfler 
40541281cf3SAxel Dörfler void
40641281cf3SAxel Dörfler TBarWindow::SetLocation(BMessage *message)
40741281cf3SAxel Dörfler {
40841281cf3SAxel Dörfler 	deskbar_location location;
40941281cf3SAxel Dörfler 	bool expand;
41041281cf3SAxel Dörfler 	if (message->FindInt32("location", (int32 *)&location) == B_OK
41141281cf3SAxel Dörfler 		&& message->FindBool("expand", &expand) == B_OK)
41241281cf3SAxel Dörfler 		SetDeskbarLocation(location, expand);
41341281cf3SAxel Dörfler }
41441281cf3SAxel Dörfler 
41541281cf3SAxel Dörfler 
41641281cf3SAxel Dörfler void
41741281cf3SAxel Dörfler TBarWindow::IsExpanded(BMessage *message)
41841281cf3SAxel Dörfler {
41941281cf3SAxel Dörfler 	BMessage reply('rply');
42041281cf3SAxel Dörfler 	reply.AddBool("expanded", fBarView->Expando());
42141281cf3SAxel Dörfler 	message->SendReply(&reply);
42241281cf3SAxel Dörfler }
42341281cf3SAxel Dörfler 
42441281cf3SAxel Dörfler 
42541281cf3SAxel Dörfler void
42641281cf3SAxel Dörfler TBarWindow::Expand(BMessage *message)
42741281cf3SAxel Dörfler {
42841281cf3SAxel Dörfler 	bool expand;
42941281cf3SAxel Dörfler 	if (message->FindBool("expand", &expand) == B_OK) {
43041281cf3SAxel Dörfler 		bool vertical = fBarView->Vertical();
43141281cf3SAxel Dörfler 		bool left = fBarView->Left();
43241281cf3SAxel Dörfler 		bool top = fBarView->Top();
43341281cf3SAxel Dörfler 		fBarView->ChangeState(expand, vertical, left, top);
43441281cf3SAxel Dörfler 	}
43541281cf3SAxel Dörfler }
43641281cf3SAxel Dörfler 
43741281cf3SAxel Dörfler 
43841281cf3SAxel Dörfler void
43941281cf3SAxel Dörfler TBarWindow::ItemInfo(BMessage *message)
44041281cf3SAxel Dörfler {
44141281cf3SAxel Dörfler 	BMessage replyMsg;
44241281cf3SAxel Dörfler 	const char *name;
44341281cf3SAxel Dörfler 	int32 id;
44441281cf3SAxel Dörfler 	DeskbarShelf shelf;
44541281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK) {
44641281cf3SAxel Dörfler 		if (fBarView->ItemInfo(id, &name, &shelf) == B_OK) {
44741281cf3SAxel Dörfler 			replyMsg.AddString("name", name);
44841281cf3SAxel Dörfler #if SHELF_AWARE
44941281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
45041281cf3SAxel Dörfler #endif
45141281cf3SAxel Dörfler 		}
45241281cf3SAxel Dörfler 	} else if (message->FindString("name", &name) == B_OK) {
45341281cf3SAxel Dörfler 		if (fBarView->ItemInfo(name, &id, &shelf) == B_OK) {
45441281cf3SAxel Dörfler 			replyMsg.AddInt32("id", id);
45541281cf3SAxel Dörfler #if SHELF_AWARE
45641281cf3SAxel Dörfler 			replyMsg.AddInt32("shelf", (int32)shelf);
45741281cf3SAxel Dörfler #endif
45841281cf3SAxel Dörfler 		}
45941281cf3SAxel Dörfler 	}
46041281cf3SAxel Dörfler 
46141281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
46241281cf3SAxel Dörfler }
46341281cf3SAxel Dörfler 
46441281cf3SAxel Dörfler 
46541281cf3SAxel Dörfler void
46641281cf3SAxel Dörfler TBarWindow::ItemExists(BMessage *message)
46741281cf3SAxel Dörfler {
46841281cf3SAxel Dörfler 	BMessage replyMsg;
46941281cf3SAxel Dörfler 	const char *name;
47041281cf3SAxel Dörfler 	int32 id;
47141281cf3SAxel Dörfler 	DeskbarShelf shelf;
47241281cf3SAxel Dörfler 
47341281cf3SAxel Dörfler #if SHELF_AWARE
47441281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32 *)&shelf) != B_OK)
47541281cf3SAxel Dörfler #endif
47641281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
47741281cf3SAxel Dörfler 
47841281cf3SAxel Dörfler 	bool exists = false;
47941281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
48041281cf3SAxel Dörfler 		exists = fBarView->ItemExists(id, shelf);
48141281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
48241281cf3SAxel Dörfler 		exists = fBarView->ItemExists(name, shelf);
48341281cf3SAxel Dörfler 
48441281cf3SAxel Dörfler 	replyMsg.AddBool("exists", exists);
48541281cf3SAxel Dörfler 	message->SendReply(&replyMsg);
48641281cf3SAxel Dörfler }
48741281cf3SAxel Dörfler 
48841281cf3SAxel Dörfler 
48941281cf3SAxel Dörfler void
49041281cf3SAxel Dörfler TBarWindow::CountItems(BMessage *message)
49141281cf3SAxel Dörfler {
49241281cf3SAxel Dörfler 	DeskbarShelf shelf;
49341281cf3SAxel Dörfler 
49441281cf3SAxel Dörfler #if SHELF_AWARE
49541281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32 *)&shelf) != B_OK)
49641281cf3SAxel Dörfler #endif
49741281cf3SAxel Dörfler 		shelf = B_DESKBAR_TRAY;
49841281cf3SAxel Dörfler 
49941281cf3SAxel Dörfler 	BMessage reply('rply');
50041281cf3SAxel Dörfler 	reply.AddInt32("count", fBarView->CountItems(shelf));
50141281cf3SAxel Dörfler 	message->SendReply(&reply);
50241281cf3SAxel Dörfler }
50341281cf3SAxel Dörfler 
50441281cf3SAxel Dörfler 
50541281cf3SAxel Dörfler void
50641281cf3SAxel Dörfler TBarWindow::AddItem(BMessage *message)
50741281cf3SAxel Dörfler {
50841281cf3SAxel Dörfler 	DeskbarShelf shelf;
50941281cf3SAxel Dörfler 	entry_ref ref;
51041281cf3SAxel Dörfler 	int32 id = 999;
51141281cf3SAxel Dörfler 	BMessage reply;
51241281cf3SAxel Dörfler 	status_t err = B_ERROR;
51341281cf3SAxel Dörfler 
51441281cf3SAxel Dörfler 	BMessage archivedView;
51541281cf3SAxel Dörfler 	if (message->FindMessage("view", &archivedView) == B_OK) {
51641281cf3SAxel Dörfler #if SHELF_AWARE
51741281cf3SAxel Dörfler 		if (message->FindInt32("shelf", (int32 *)&shelf) != B_OK)
51841281cf3SAxel Dörfler #endif
51941281cf3SAxel Dörfler 			shelf = B_DESKBAR_TRAY;
52041281cf3SAxel Dörfler 
521*ced3755cSAxel Dörfler 		BMessage* archive = new BMessage(archivedView);
522*ced3755cSAxel Dörfler 		err = fBarView->AddItem(archive, shelf, &id);
523*ced3755cSAxel Dörfler 		if (err < B_OK)
524*ced3755cSAxel Dörfler 			delete archive;
52541281cf3SAxel Dörfler 	} else if (message->FindRef("addon", &ref) == B_OK) {
52641281cf3SAxel Dörfler 		//
52741281cf3SAxel Dörfler 		//	exposing the name of the view here is not so great
52841281cf3SAxel Dörfler 		TReplicantTray *tray = dynamic_cast<TReplicantTray *>(FindView("Status"));
52941281cf3SAxel Dörfler 		if (tray) {
53041281cf3SAxel Dörfler 			// Force this into the deskbar even if the security code is wrong
53141281cf3SAxel Dörfler 			// This is OK because the user specifically asked for this replicant
53241281cf3SAxel Dörfler 			BEntry entry(&ref);
53341281cf3SAxel Dörfler 			err = tray->LoadAddOn(&entry, &id, true);
53441281cf3SAxel Dörfler 		}
53541281cf3SAxel Dörfler 	}
53641281cf3SAxel Dörfler 
53741281cf3SAxel Dörfler 	if (err == B_OK)
53841281cf3SAxel Dörfler 		reply.AddInt32("id", id);
53941281cf3SAxel Dörfler 	else
54041281cf3SAxel Dörfler 		reply.AddInt32("error", err);
54141281cf3SAxel Dörfler 
54241281cf3SAxel Dörfler 	message->SendReply(&reply);
54341281cf3SAxel Dörfler }
54441281cf3SAxel Dörfler 
54541281cf3SAxel Dörfler 
54641281cf3SAxel Dörfler void
54741281cf3SAxel Dörfler TBarWindow::RemoveItem(BMessage *message)
54841281cf3SAxel Dörfler {
54941281cf3SAxel Dörfler 	int32 id;
55041281cf3SAxel Dörfler 	const char *name;
55141281cf3SAxel Dörfler 
55241281cf3SAxel Dörfler 	// 	ids ought to be unique across all shelves, assuming, of course,
55341281cf3SAxel Dörfler 	//	that sometime in the future there may be more than one
55441281cf3SAxel Dörfler #if SHELF_AWARE
55541281cf3SAxel Dörfler 	if (message->FindInt32("shelf", (int32 *)&shelf) == B_OK) {
55641281cf3SAxel Dörfler 		if (message->FindString("name", &name) == B_OK)
55741281cf3SAxel Dörfler 			fBarView->RemoveItem(name, shelf);
55841281cf3SAxel Dörfler 	} else {
55941281cf3SAxel Dörfler #endif
56041281cf3SAxel Dörfler 		if (message->FindInt32("id", &id) == B_OK) {
56141281cf3SAxel Dörfler 			fBarView->RemoveItem(id);
56241281cf3SAxel Dörfler 		//	remove the following two lines if and when the
56341281cf3SAxel Dörfler 		//	shelf option returns
56441281cf3SAxel Dörfler 		} else if (message->FindString("name", &name) == B_OK)
56541281cf3SAxel Dörfler 			fBarView->RemoveItem(name, B_DESKBAR_TRAY);
56641281cf3SAxel Dörfler 
56741281cf3SAxel Dörfler #if SHELF_AWARE
56841281cf3SAxel Dörfler 	}
56941281cf3SAxel Dörfler #endif
57041281cf3SAxel Dörfler }
57141281cf3SAxel Dörfler 
57241281cf3SAxel Dörfler 
57341281cf3SAxel Dörfler void
57441281cf3SAxel Dörfler TBarWindow::GetIconFrame(BMessage *message)
57541281cf3SAxel Dörfler {
57641281cf3SAxel Dörfler 	BRect frame(0, 0, 0, 0);
57741281cf3SAxel Dörfler 
57841281cf3SAxel Dörfler 	const char *name;
57941281cf3SAxel Dörfler 	int32 id;
58041281cf3SAxel Dörfler 	if (message->FindInt32("id", &id) == B_OK)
58141281cf3SAxel Dörfler 		frame = fBarView->IconFrame(id);
58241281cf3SAxel Dörfler 	else if (message->FindString("name", &name) == B_OK)
58341281cf3SAxel Dörfler 		frame = fBarView->IconFrame(name);
58441281cf3SAxel Dörfler 
58541281cf3SAxel Dörfler 	BMessage reply('rply');
58641281cf3SAxel Dörfler 	reply.AddRect("frame", frame);
58741281cf3SAxel Dörfler 	message->SendReply(&reply);
58841281cf3SAxel Dörfler }
589