125648ff0SStephan Aßmus /* 225648ff0SStephan Aßmus * Copyright 2006, Haiku. 325648ff0SStephan Aßmus * Distributed under the terms of the MIT License. 425648ff0SStephan Aßmus * 525648ff0SStephan Aßmus * Authors: 625648ff0SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de> 725648ff0SStephan Aßmus */ 825648ff0SStephan Aßmus 925648ff0SStephan Aßmus #include "PadView.h" 1025648ff0SStephan Aßmus 1125648ff0SStephan Aßmus #include <stdio.h> 1225648ff0SStephan Aßmus 1325648ff0SStephan Aßmus #include <Application.h> 1425648ff0SStephan Aßmus #include <GroupLayout.h> 1525648ff0SStephan Aßmus #include <MenuItem.h> 1625648ff0SStephan Aßmus #include <Message.h> 1725648ff0SStephan Aßmus #include <PopUpMenu.h> 1825648ff0SStephan Aßmus #include <Region.h> 1925648ff0SStephan Aßmus #include <Screen.h> 2025648ff0SStephan Aßmus #include <SpaceLayoutItem.h> 2125648ff0SStephan Aßmus 2225648ff0SStephan Aßmus #include "LaunchButton.h" 2325648ff0SStephan Aßmus #include "MainWindow.h" 2425648ff0SStephan Aßmus 2525648ff0SStephan Aßmus bigtime_t kActivationDelay = 40000; 2625648ff0SStephan Aßmus 27f32e3a29SStephan Aßmus enum { 28f32e3a29SStephan Aßmus MSG_TOGGLE_LAYOUT = 'tgll' 29f32e3a29SStephan Aßmus }; 30f32e3a29SStephan Aßmus 3125648ff0SStephan Aßmus // constructor 3225648ff0SStephan Aßmus PadView::PadView(const char* name) 33f32e3a29SStephan Aßmus : BView(name, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE, NULL), 3425648ff0SStephan Aßmus fDragging(false), 35f32e3a29SStephan Aßmus fClickTime(0), 36f32e3a29SStephan Aßmus fButtonLayout(new BGroupLayout(B_VERTICAL, 4)) 3725648ff0SStephan Aßmus { 3825648ff0SStephan Aßmus SetViewColor(B_TRANSPARENT_32_BIT); 3925648ff0SStephan Aßmus SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 4025648ff0SStephan Aßmus get_click_speed(&kActivationDelay); 4125648ff0SStephan Aßmus 42f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 43f32e3a29SStephan Aßmus SetLayout(fButtonLayout); 4425648ff0SStephan Aßmus } 4525648ff0SStephan Aßmus 4625648ff0SStephan Aßmus // destructor 4725648ff0SStephan Aßmus PadView::~PadView() 4825648ff0SStephan Aßmus { 4925648ff0SStephan Aßmus } 5025648ff0SStephan Aßmus 5125648ff0SStephan Aßmus // Draw 5225648ff0SStephan Aßmus void 5325648ff0SStephan Aßmus PadView::Draw(BRect updateRect) 5425648ff0SStephan Aßmus { 5525648ff0SStephan Aßmus rgb_color background = LowColor(); 5625648ff0SStephan Aßmus rgb_color light = tint_color(background, B_LIGHTEN_MAX_TINT); 5725648ff0SStephan Aßmus rgb_color shadow = tint_color(background, B_DARKEN_2_TINT); 5825648ff0SStephan Aßmus BRect r(Bounds()); 5925648ff0SStephan Aßmus BeginLineArray(4); 6025648ff0SStephan Aßmus AddLine(BPoint(r.left, r.bottom), BPoint(r.left, r.top), light); 6125648ff0SStephan Aßmus AddLine(BPoint(r.left + 1.0, r.top), BPoint(r.right, r.top), light); 6225648ff0SStephan Aßmus AddLine(BPoint(r.right, r.top + 1.0), BPoint(r.right, r.bottom), shadow); 6325648ff0SStephan Aßmus AddLine(BPoint(r.right - 1.0, r.bottom), BPoint(r.left + 1.0, r.bottom), shadow); 6425648ff0SStephan Aßmus EndLineArray(); 6525648ff0SStephan Aßmus r.InsetBy(1.0, 1.0); 6625648ff0SStephan Aßmus StrokeRect(r, B_SOLID_LOW); 6725648ff0SStephan Aßmus r.InsetBy(1.0, 1.0); 6825648ff0SStephan Aßmus // dots along top 6925648ff0SStephan Aßmus BPoint dot = r.LeftTop(); 70f32e3a29SStephan Aßmus int32 current; 71f32e3a29SStephan Aßmus int32 stop; 72f32e3a29SStephan Aßmus BPoint offset; 73f32e3a29SStephan Aßmus BPoint next; 74f32e3a29SStephan Aßmus if (Orientation() == B_VERTICAL) { 75f32e3a29SStephan Aßmus current = (int32)dot.x; 76f32e3a29SStephan Aßmus stop = (int32)r.right; 77f32e3a29SStephan Aßmus offset = BPoint(0, 1); 78f32e3a29SStephan Aßmus next = BPoint(1, -4); 79f32e3a29SStephan Aßmus r.top += 5.0; 80f32e3a29SStephan Aßmus } else { 81f32e3a29SStephan Aßmus current = (int32)dot.y; 82f32e3a29SStephan Aßmus stop = (int32)r.bottom; 83f32e3a29SStephan Aßmus offset = BPoint(1, 0); 84f32e3a29SStephan Aßmus next = BPoint(-4, 1); 85f32e3a29SStephan Aßmus r.left += 5.0; 86f32e3a29SStephan Aßmus } 8725648ff0SStephan Aßmus int32 num = 1; 88f32e3a29SStephan Aßmus while (current <= stop) { 8925648ff0SStephan Aßmus rgb_color col1; 9025648ff0SStephan Aßmus rgb_color col2; 9125648ff0SStephan Aßmus switch (num) { 9225648ff0SStephan Aßmus case 1: 9325648ff0SStephan Aßmus col1 = shadow; 9425648ff0SStephan Aßmus col2 = background; 9525648ff0SStephan Aßmus break; 9625648ff0SStephan Aßmus case 2: 9725648ff0SStephan Aßmus col1 = background; 9825648ff0SStephan Aßmus col2 = light; 9925648ff0SStephan Aßmus break; 10025648ff0SStephan Aßmus case 3: 10125648ff0SStephan Aßmus col1 = background; 10225648ff0SStephan Aßmus col2 = background; 10325648ff0SStephan Aßmus num = 0; 10425648ff0SStephan Aßmus break; 10525648ff0SStephan Aßmus } 10625648ff0SStephan Aßmus SetHighColor(col1); 10725648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 10825648ff0SStephan Aßmus SetHighColor(col2); 109f32e3a29SStephan Aßmus dot += offset; 11025648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 111f32e3a29SStephan Aßmus dot += offset; 11225648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_LOW); 113f32e3a29SStephan Aßmus dot += offset; 11425648ff0SStephan Aßmus SetHighColor(col1); 11525648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 116f32e3a29SStephan Aßmus dot += offset; 11725648ff0SStephan Aßmus SetHighColor(col2); 11825648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 11925648ff0SStephan Aßmus // next pixel 12025648ff0SStephan Aßmus num++; 121f32e3a29SStephan Aßmus dot += next; 122f32e3a29SStephan Aßmus current++; 12325648ff0SStephan Aßmus } 12425648ff0SStephan Aßmus FillRect(r, B_SOLID_LOW); 12525648ff0SStephan Aßmus } 12625648ff0SStephan Aßmus 12725648ff0SStephan Aßmus // MessageReceived 12825648ff0SStephan Aßmus void 12925648ff0SStephan Aßmus PadView::MessageReceived(BMessage* message) 13025648ff0SStephan Aßmus { 13125648ff0SStephan Aßmus switch (message->what) { 132f32e3a29SStephan Aßmus case MSG_TOGGLE_LAYOUT: 133f32e3a29SStephan Aßmus if (fButtonLayout->Orientation() == B_HORIZONTAL) { 134f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 135f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_VERTICAL); 136f32e3a29SStephan Aßmus } else { 137f32e3a29SStephan Aßmus fButtonLayout->SetInsets(7, 2, 2, 2); 138f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_HORIZONTAL); 139f32e3a29SStephan Aßmus } 140f32e3a29SStephan Aßmus break; 14125648ff0SStephan Aßmus default: 14225648ff0SStephan Aßmus BView::MessageReceived(message); 14325648ff0SStephan Aßmus break; 14425648ff0SStephan Aßmus } 14525648ff0SStephan Aßmus } 14625648ff0SStephan Aßmus 14725648ff0SStephan Aßmus // MouseDown 14825648ff0SStephan Aßmus void 14925648ff0SStephan Aßmus PadView::MouseDown(BPoint where) 15025648ff0SStephan Aßmus { 15180e19252SStephan Aßmus BWindow* window = Window(); 15280e19252SStephan Aßmus if (window == NULL) 15380e19252SStephan Aßmus return; 15480e19252SStephan Aßmus 15525648ff0SStephan Aßmus BRegion region; 15625648ff0SStephan Aßmus GetClippingRegion(®ion); 15780e19252SStephan Aßmus if (!region.Contains(where)) 15880e19252SStephan Aßmus return; 15980e19252SStephan Aßmus 16025648ff0SStephan Aßmus bool handle = true; 16125648ff0SStephan Aßmus for (int32 i = 0; BView* child = ChildAt(i); i++) { 16225648ff0SStephan Aßmus if (child->Frame().Contains(where)) { 16325648ff0SStephan Aßmus handle = false; 16425648ff0SStephan Aßmus break; 16525648ff0SStephan Aßmus } 16625648ff0SStephan Aßmus } 16780e19252SStephan Aßmus if (!handle) 16880e19252SStephan Aßmus return; 16980e19252SStephan Aßmus 17080e19252SStephan Aßmus BMessage* message = window->CurrentMessage(); 17180e19252SStephan Aßmus if (message == NULL) 17280e19252SStephan Aßmus return; 17380e19252SStephan Aßmus 17425648ff0SStephan Aßmus uint32 buttons; 17525648ff0SStephan Aßmus message->FindInt32("buttons", (int32*)&buttons); 17625648ff0SStephan Aßmus if (buttons & B_SECONDARY_MOUSE_BUTTON) { 17725648ff0SStephan Aßmus BRect r = Bounds(); 17825648ff0SStephan Aßmus r.InsetBy(2.0, 2.0); 17925648ff0SStephan Aßmus r.top += 6.0; 18025648ff0SStephan Aßmus if (r.Contains(where)) { 18125648ff0SStephan Aßmus DisplayMenu(where); 18225648ff0SStephan Aßmus } else { 18325648ff0SStephan Aßmus // sends the window to the back 18425648ff0SStephan Aßmus window->Activate(false); 18525648ff0SStephan Aßmus } 18625648ff0SStephan Aßmus } else { 18725648ff0SStephan Aßmus if (system_time() - fClickTime < kActivationDelay) { 18825648ff0SStephan Aßmus window->Minimize(true); 18925648ff0SStephan Aßmus fClickTime = 0; 19025648ff0SStephan Aßmus } else { 19125648ff0SStephan Aßmus window->Activate(); 19225648ff0SStephan Aßmus fDragOffset = ConvertToScreen(where) - window->Frame().LeftTop(); 19325648ff0SStephan Aßmus fDragging = true; 19425648ff0SStephan Aßmus SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); 19525648ff0SStephan Aßmus fClickTime = system_time(); 19625648ff0SStephan Aßmus } 19725648ff0SStephan Aßmus } 19825648ff0SStephan Aßmus } 19925648ff0SStephan Aßmus 20025648ff0SStephan Aßmus // MouseUp 20125648ff0SStephan Aßmus void 20225648ff0SStephan Aßmus PadView::MouseUp(BPoint where) 20325648ff0SStephan Aßmus { 20425648ff0SStephan Aßmus if (BWindow* window = Window()) { 20525648ff0SStephan Aßmus uint32 buttons; 20625648ff0SStephan Aßmus window->CurrentMessage()->FindInt32("buttons", (int32*)&buttons); 20725648ff0SStephan Aßmus if (buttons & B_PRIMARY_MOUSE_BUTTON 20825648ff0SStephan Aßmus && system_time() - fClickTime < kActivationDelay 20925648ff0SStephan Aßmus && window->IsActive()) 21025648ff0SStephan Aßmus window->Activate(); 21125648ff0SStephan Aßmus } 21225648ff0SStephan Aßmus fDragging = false; 21325648ff0SStephan Aßmus } 21425648ff0SStephan Aßmus 21525648ff0SStephan Aßmus // MouseMoved 21625648ff0SStephan Aßmus void 21725648ff0SStephan Aßmus PadView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) 21825648ff0SStephan Aßmus { 219*8eeb005fSStephan Aßmus MainWindow* window = dynamic_cast<MainWindow*>(Window()); 220*8eeb005fSStephan Aßmus if (window == NULL) 221*8eeb005fSStephan Aßmus return; 222*8eeb005fSStephan Aßmus 22325648ff0SStephan Aßmus if (fDragging) { 22425648ff0SStephan Aßmus window->MoveTo(ConvertToScreen(where) - fDragOffset); 22525648ff0SStephan Aßmus } else if (window->AutoRaise()) { 22625648ff0SStephan Aßmus where = ConvertToScreen(where); 22725648ff0SStephan Aßmus BScreen screen(window); 22825648ff0SStephan Aßmus BRect frame = screen.Frame(); 22925648ff0SStephan Aßmus BRect windowFrame = window->Frame(); 23025648ff0SStephan Aßmus if (where.x == frame.left || where.x == frame.right 23125648ff0SStephan Aßmus || where.y == frame.top || where.y == frame.bottom) { 23225648ff0SStephan Aßmus BPoint position = window->ScreenPosition(); 23325648ff0SStephan Aßmus bool raise = false; 23425648ff0SStephan Aßmus if (fabs(0.5 - position.x) > fabs(0.5 - position.y)) { 23525648ff0SStephan Aßmus // left or right border 23625648ff0SStephan Aßmus if (where.y >= windowFrame.top && where.y <= windowFrame.bottom) { 23725648ff0SStephan Aßmus if (position.x < 0.5 && where.x == frame.left) 23825648ff0SStephan Aßmus raise = true; 23925648ff0SStephan Aßmus else if (position.x > 0.5 && where.x == frame.right) 24025648ff0SStephan Aßmus raise = true; 24125648ff0SStephan Aßmus } 24225648ff0SStephan Aßmus } else { 24325648ff0SStephan Aßmus // top or bottom border 24425648ff0SStephan Aßmus if (where.x >= windowFrame.left && where.x <= windowFrame.right) { 24525648ff0SStephan Aßmus if (position.y < 0.5 && where.y == frame.top) 24625648ff0SStephan Aßmus raise = true; 24725648ff0SStephan Aßmus else if (position.y > 0.5 && where.y == frame.top) 24825648ff0SStephan Aßmus raise = true; 24925648ff0SStephan Aßmus } 25025648ff0SStephan Aßmus } 25125648ff0SStephan Aßmus if (raise) 25225648ff0SStephan Aßmus window->Activate(); 25325648ff0SStephan Aßmus } 25425648ff0SStephan Aßmus } 25525648ff0SStephan Aßmus } 25625648ff0SStephan Aßmus 25725648ff0SStephan Aßmus // AddButton 25825648ff0SStephan Aßmus void 25925648ff0SStephan Aßmus PadView::AddButton(LaunchButton* button, LaunchButton* beforeButton) 26025648ff0SStephan Aßmus { 26125648ff0SStephan Aßmus if (beforeButton) 262f32e3a29SStephan Aßmus fButtonLayout->AddView(fButtonLayout->IndexOfView(beforeButton), button); 26325648ff0SStephan Aßmus else 264f32e3a29SStephan Aßmus fButtonLayout->AddView(button); 26525648ff0SStephan Aßmus } 26625648ff0SStephan Aßmus 26725648ff0SStephan Aßmus // RemoveButton 26825648ff0SStephan Aßmus bool 26925648ff0SStephan Aßmus PadView::RemoveButton(LaunchButton* button) 27025648ff0SStephan Aßmus { 271f32e3a29SStephan Aßmus return fButtonLayout->RemoveView(button); 27225648ff0SStephan Aßmus } 27325648ff0SStephan Aßmus 27425648ff0SStephan Aßmus // ButtonAt 27525648ff0SStephan Aßmus LaunchButton* 27625648ff0SStephan Aßmus PadView::ButtonAt(int32 index) const 27725648ff0SStephan Aßmus { 27825648ff0SStephan Aßmus return dynamic_cast<LaunchButton*>(ChildAt(index)); 27925648ff0SStephan Aßmus } 28025648ff0SStephan Aßmus 28125648ff0SStephan Aßmus // DisplayMenu 28225648ff0SStephan Aßmus void 28325648ff0SStephan Aßmus PadView::DisplayMenu(BPoint where, LaunchButton* button) const 28425648ff0SStephan Aßmus { 285*8eeb005fSStephan Aßmus MainWindow* window = dynamic_cast<MainWindow*>(Window()); 286*8eeb005fSStephan Aßmus if (window == NULL) 287*8eeb005fSStephan Aßmus return; 288*8eeb005fSStephan Aßmus 28925648ff0SStephan Aßmus LaunchButton* nearestButton = button; 29025648ff0SStephan Aßmus if (!nearestButton) { 29125648ff0SStephan Aßmus // find the nearest button 29225648ff0SStephan Aßmus for (int32 i = 0; (nearestButton = ButtonAt(i)); i++) { 29325648ff0SStephan Aßmus if (nearestButton->Frame().top > where.y) 29425648ff0SStephan Aßmus break; 29525648ff0SStephan Aßmus } 29625648ff0SStephan Aßmus } 29725648ff0SStephan Aßmus BPopUpMenu* menu = new BPopUpMenu("launch popup", false, false); 29825648ff0SStephan Aßmus // add button 29925648ff0SStephan Aßmus BMessage* message = new BMessage(MSG_ADD_SLOT); 30025648ff0SStephan Aßmus message->AddPointer("be:source", (void*)nearestButton); 30125648ff0SStephan Aßmus BMenuItem* item = new BMenuItem("Add Button Here", message); 30225648ff0SStephan Aßmus item->SetTarget(window); 30325648ff0SStephan Aßmus menu->AddItem(item); 30425648ff0SStephan Aßmus // button options 30525648ff0SStephan Aßmus if (button) { 30625648ff0SStephan Aßmus // remove button 30725648ff0SStephan Aßmus message = new BMessage(MSG_CLEAR_SLOT); 30825648ff0SStephan Aßmus message->AddPointer("be:source", (void*)button); 30925648ff0SStephan Aßmus item = new BMenuItem("Clear Button", message); 31025648ff0SStephan Aßmus item->SetTarget(window); 31125648ff0SStephan Aßmus menu->AddItem(item); 31225648ff0SStephan Aßmus // remove button 31325648ff0SStephan Aßmus message = new BMessage(MSG_REMOVE_SLOT); 31425648ff0SStephan Aßmus message->AddPointer("be:source", (void*)button); 31525648ff0SStephan Aßmus item = new BMenuItem("Remove Button", message); 31625648ff0SStephan Aßmus item->SetTarget(window); 31725648ff0SStephan Aßmus menu->AddItem(item); 318f32e3a29SStephan Aßmus // TODO: disabled because Haiku does not yet support tool tips 319f32e3a29SStephan Aßmus // if (button->Ref()) { 320f32e3a29SStephan Aßmus // message = new BMessage(MSG_SET_DESCRIPTION); 321f32e3a29SStephan Aßmus // message->AddPointer("be:source", (void*)button); 322f32e3a29SStephan Aßmus // item = new BMenuItem("Set Description"B_UTF8_ELLIPSIS, message); 323f32e3a29SStephan Aßmus // item->SetTarget(window); 324f32e3a29SStephan Aßmus // menu->AddItem(item); 325f32e3a29SStephan Aßmus // } 32625648ff0SStephan Aßmus } 32725648ff0SStephan Aßmus menu->AddSeparatorItem(); 32825648ff0SStephan Aßmus // window settings 32925648ff0SStephan Aßmus BMenu* settingsM = new BMenu("Settings"); 33025648ff0SStephan Aßmus settingsM->SetFont(be_plain_font); 33125648ff0SStephan Aßmus 332f32e3a29SStephan Aßmus const char* toggleLayoutLabel; 333f32e3a29SStephan Aßmus if (fButtonLayout->Orientation() == B_HORIZONTAL) 334f32e3a29SStephan Aßmus toggleLayoutLabel = "Vertical Layout"; 335f32e3a29SStephan Aßmus else 336f32e3a29SStephan Aßmus toggleLayoutLabel = "Horizontal Layout"; 337f32e3a29SStephan Aßmus item = new BMenuItem(toggleLayoutLabel, new BMessage(MSG_TOGGLE_LAYOUT)); 338f32e3a29SStephan Aßmus item->SetTarget(this); 339f32e3a29SStephan Aßmus settingsM->AddItem(item); 340f32e3a29SStephan Aßmus 34125648ff0SStephan Aßmus uint32 what = window->Look() == B_BORDERED_WINDOW_LOOK ? MSG_SHOW_BORDER : MSG_HIDE_BORDER; 34225648ff0SStephan Aßmus item = new BMenuItem("Show Window Border", new BMessage(what)); 34325648ff0SStephan Aßmus item->SetTarget(window); 34425648ff0SStephan Aßmus item->SetMarked(what == MSG_HIDE_BORDER); 34525648ff0SStephan Aßmus settingsM->AddItem(item); 34625648ff0SStephan Aßmus 34725648ff0SStephan Aßmus item = new BMenuItem("Auto Raise", new BMessage(MSG_TOGGLE_AUTORAISE)); 34825648ff0SStephan Aßmus item->SetTarget(window); 34925648ff0SStephan Aßmus item->SetMarked(window->AutoRaise()); 35025648ff0SStephan Aßmus settingsM->AddItem(item); 35125648ff0SStephan Aßmus 35225648ff0SStephan Aßmus item = new BMenuItem("Show On All Workspaces", new BMessage(MSG_SHOW_ON_ALL_WORKSPACES)); 35325648ff0SStephan Aßmus item->SetTarget(window); 35425648ff0SStephan Aßmus item->SetMarked(window->ShowOnAllWorkspaces()); 35525648ff0SStephan Aßmus settingsM->AddItem(item); 35625648ff0SStephan Aßmus 35725648ff0SStephan Aßmus menu->AddItem(settingsM); 35825648ff0SStephan Aßmus 35925648ff0SStephan Aßmus menu->AddSeparatorItem(); 36025648ff0SStephan Aßmus 36125648ff0SStephan Aßmus // pad commands 36225648ff0SStephan Aßmus BMenu* padM = new BMenu("Pad"); 36325648ff0SStephan Aßmus padM->SetFont(be_plain_font); 36425648ff0SStephan Aßmus // new pad 36525648ff0SStephan Aßmus item = new BMenuItem("New", new BMessage(MSG_ADD_WINDOW)); 36625648ff0SStephan Aßmus item->SetTarget(be_app); 36725648ff0SStephan Aßmus padM->AddItem(item); 36825648ff0SStephan Aßmus // new pad 36925648ff0SStephan Aßmus item = new BMenuItem("Clone", new BMessage(MSG_ADD_WINDOW)); 37025648ff0SStephan Aßmus item->SetTarget(window); 37125648ff0SStephan Aßmus padM->AddItem(item); 37225648ff0SStephan Aßmus padM->AddSeparatorItem(); 37325648ff0SStephan Aßmus // close 37425648ff0SStephan Aßmus item = new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED)); 37525648ff0SStephan Aßmus item->SetTarget(window); 37625648ff0SStephan Aßmus padM->AddItem(item); 37725648ff0SStephan Aßmus menu->AddItem(padM); 37825648ff0SStephan Aßmus // app commands 37925648ff0SStephan Aßmus BMenu* appM = new BMenu("LaunchBox"); 38025648ff0SStephan Aßmus appM->SetFont(be_plain_font); 38125648ff0SStephan Aßmus // about 38225648ff0SStephan Aßmus item = new BMenuItem("About", new BMessage(B_ABOUT_REQUESTED)); 38325648ff0SStephan Aßmus item->SetTarget(be_app); 38425648ff0SStephan Aßmus appM->AddItem(item); 38525648ff0SStephan Aßmus // quit 38625648ff0SStephan Aßmus item = new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED)); 38725648ff0SStephan Aßmus item->SetTarget(be_app); 38825648ff0SStephan Aßmus appM->AddItem(item); 38925648ff0SStephan Aßmus menu->AddItem(appM); 39025648ff0SStephan Aßmus // finish popup 39125648ff0SStephan Aßmus menu->SetAsyncAutoDestruct(true); 39225648ff0SStephan Aßmus menu->SetFont(be_plain_font); 39325648ff0SStephan Aßmus where = ConvertToScreen(where); 39425648ff0SStephan Aßmus BRect mouseRect(where, where); 39525648ff0SStephan Aßmus mouseRect.InsetBy(-4.0, -4.0); 39625648ff0SStephan Aßmus menu->Go(where, true, false, mouseRect, true); 39725648ff0SStephan Aßmus } 39825648ff0SStephan Aßmus 399f32e3a29SStephan Aßmus // SetOrientation 400f32e3a29SStephan Aßmus void 401f32e3a29SStephan Aßmus PadView::SetOrientation(enum orientation orientation) 402f32e3a29SStephan Aßmus { 403f32e3a29SStephan Aßmus if (orientation == B_VERTICAL) { 404f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 405f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_VERTICAL); 406f32e3a29SStephan Aßmus } else { 407f32e3a29SStephan Aßmus fButtonLayout->SetInsets(7, 2, 2, 2); 408f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_HORIZONTAL); 409f32e3a29SStephan Aßmus } 410f32e3a29SStephan Aßmus } 411f32e3a29SStephan Aßmus 412f32e3a29SStephan Aßmus // Orientation 413f32e3a29SStephan Aßmus enum orientation 414f32e3a29SStephan Aßmus PadView::Orientation() const 415f32e3a29SStephan Aßmus { 416f32e3a29SStephan Aßmus return fButtonLayout->Orientation(); 417f32e3a29SStephan Aßmus } 418f32e3a29SStephan Aßmus 419f32e3a29SStephan Aßmus 420