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