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 27*f32e3a29SStephan Aßmus enum { 28*f32e3a29SStephan Aßmus MSG_TOGGLE_LAYOUT = 'tgll' 29*f32e3a29SStephan Aßmus }; 30*f32e3a29SStephan Aßmus 3125648ff0SStephan Aßmus // constructor 3225648ff0SStephan Aßmus PadView::PadView(const char* name) 33*f32e3a29SStephan Aßmus : BView(name, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE, NULL), 3425648ff0SStephan Aßmus fDragging(false), 35*f32e3a29SStephan Aßmus fClickTime(0), 36*f32e3a29SStephan 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 42*f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 43*f32e3a29SStephan 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(); 70*f32e3a29SStephan Aßmus int32 current; 71*f32e3a29SStephan Aßmus int32 stop; 72*f32e3a29SStephan Aßmus BPoint offset; 73*f32e3a29SStephan Aßmus BPoint next; 74*f32e3a29SStephan Aßmus if (Orientation() == B_VERTICAL) { 75*f32e3a29SStephan Aßmus current = (int32)dot.x; 76*f32e3a29SStephan Aßmus stop = (int32)r.right; 77*f32e3a29SStephan Aßmus offset = BPoint(0, 1); 78*f32e3a29SStephan Aßmus next = BPoint(1, -4); 79*f32e3a29SStephan Aßmus r.top += 5.0; 80*f32e3a29SStephan Aßmus } else { 81*f32e3a29SStephan Aßmus current = (int32)dot.y; 82*f32e3a29SStephan Aßmus stop = (int32)r.bottom; 83*f32e3a29SStephan Aßmus offset = BPoint(1, 0); 84*f32e3a29SStephan Aßmus next = BPoint(-4, 1); 85*f32e3a29SStephan Aßmus r.left += 5.0; 86*f32e3a29SStephan Aßmus } 8725648ff0SStephan Aßmus int32 num = 1; 88*f32e3a29SStephan 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); 109*f32e3a29SStephan Aßmus dot += offset; 11025648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 111*f32e3a29SStephan Aßmus dot += offset; 11225648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_LOW); 113*f32e3a29SStephan Aßmus dot += offset; 11425648ff0SStephan Aßmus SetHighColor(col1); 11525648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 116*f32e3a29SStephan 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++; 121*f32e3a29SStephan Aßmus dot += next; 122*f32e3a29SStephan 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) { 132*f32e3a29SStephan Aßmus case MSG_TOGGLE_LAYOUT: 133*f32e3a29SStephan Aßmus if (fButtonLayout->Orientation() == B_HORIZONTAL) { 134*f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 135*f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_VERTICAL); 136*f32e3a29SStephan Aßmus } else { 137*f32e3a29SStephan Aßmus fButtonLayout->SetInsets(7, 2, 2, 2); 138*f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_HORIZONTAL); 139*f32e3a29SStephan Aßmus } 140*f32e3a29SStephan 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 { 15125648ff0SStephan Aßmus if (BWindow* window = Window()) { 15225648ff0SStephan Aßmus BRegion region; 15325648ff0SStephan Aßmus GetClippingRegion(®ion); 15425648ff0SStephan Aßmus if (region.Contains(where)) { 15525648ff0SStephan Aßmus bool handle = true; 15625648ff0SStephan Aßmus for (int32 i = 0; BView* child = ChildAt(i); i++) { 15725648ff0SStephan Aßmus if (child->Frame().Contains(where)) { 15825648ff0SStephan Aßmus handle = false; 15925648ff0SStephan Aßmus break; 16025648ff0SStephan Aßmus } 16125648ff0SStephan Aßmus } 16225648ff0SStephan Aßmus if (handle) { 16325648ff0SStephan Aßmus if (BMessage* message = window->CurrentMessage()) { 16425648ff0SStephan Aßmus uint32 buttons; 16525648ff0SStephan Aßmus message->FindInt32("buttons", (int32*)&buttons); 16625648ff0SStephan Aßmus if (buttons & B_SECONDARY_MOUSE_BUTTON) { 16725648ff0SStephan Aßmus BRect r = Bounds(); 16825648ff0SStephan Aßmus r.InsetBy(2.0, 2.0); 16925648ff0SStephan Aßmus r.top += 6.0; 17025648ff0SStephan Aßmus if (r.Contains(where)) { 17125648ff0SStephan Aßmus DisplayMenu(where); 17225648ff0SStephan Aßmus } else { 17325648ff0SStephan Aßmus // sends the window to the back 17425648ff0SStephan Aßmus window->Activate(false); 17525648ff0SStephan Aßmus } 17625648ff0SStephan Aßmus } else { 17725648ff0SStephan Aßmus if (system_time() - fClickTime < kActivationDelay) { 17825648ff0SStephan Aßmus window->Minimize(true); 17925648ff0SStephan Aßmus fClickTime = 0; 18025648ff0SStephan Aßmus } else { 18125648ff0SStephan Aßmus window->Activate(); 18225648ff0SStephan Aßmus fDragOffset = ConvertToScreen(where) - window->Frame().LeftTop(); 18325648ff0SStephan Aßmus fDragging = true; 18425648ff0SStephan Aßmus SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); 18525648ff0SStephan Aßmus fClickTime = system_time(); 18625648ff0SStephan Aßmus } 18725648ff0SStephan Aßmus } 18825648ff0SStephan Aßmus } 18925648ff0SStephan Aßmus } 19025648ff0SStephan Aßmus } 19125648ff0SStephan Aßmus } 19225648ff0SStephan Aßmus } 19325648ff0SStephan Aßmus 19425648ff0SStephan Aßmus // MouseUp 19525648ff0SStephan Aßmus void 19625648ff0SStephan Aßmus PadView::MouseUp(BPoint where) 19725648ff0SStephan Aßmus { 19825648ff0SStephan Aßmus if (BWindow* window = Window()) { 19925648ff0SStephan Aßmus uint32 buttons; 20025648ff0SStephan Aßmus window->CurrentMessage()->FindInt32("buttons", (int32*)&buttons); 20125648ff0SStephan Aßmus if (buttons & B_PRIMARY_MOUSE_BUTTON 20225648ff0SStephan Aßmus && system_time() - fClickTime < kActivationDelay 20325648ff0SStephan Aßmus && window->IsActive()) 20425648ff0SStephan Aßmus window->Activate(); 20525648ff0SStephan Aßmus } 20625648ff0SStephan Aßmus fDragging = false; 20725648ff0SStephan Aßmus } 20825648ff0SStephan Aßmus 20925648ff0SStephan Aßmus // MouseMoved 21025648ff0SStephan Aßmus void 21125648ff0SStephan Aßmus PadView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) 21225648ff0SStephan Aßmus { 21325648ff0SStephan Aßmus if (MainWindow* window = dynamic_cast<MainWindow*>(Window())) { 21425648ff0SStephan Aßmus if (fDragging) { 21525648ff0SStephan Aßmus window->MoveTo(ConvertToScreen(where) - fDragOffset); 21625648ff0SStephan Aßmus } else if (window->AutoRaise()) { 21725648ff0SStephan Aßmus where = ConvertToScreen(where); 21825648ff0SStephan Aßmus BScreen screen(window); 21925648ff0SStephan Aßmus BRect frame = screen.Frame(); 22025648ff0SStephan Aßmus BRect windowFrame = window->Frame(); 22125648ff0SStephan Aßmus if (where.x == frame.left || where.x == frame.right 22225648ff0SStephan Aßmus || where.y == frame.top || where.y == frame.bottom) { 22325648ff0SStephan Aßmus BPoint position = window->ScreenPosition(); 22425648ff0SStephan Aßmus bool raise = false; 22525648ff0SStephan Aßmus if (fabs(0.5 - position.x) > fabs(0.5 - position.y)) { 22625648ff0SStephan Aßmus // left or right border 22725648ff0SStephan Aßmus if (where.y >= windowFrame.top && where.y <= windowFrame.bottom) { 22825648ff0SStephan Aßmus if (position.x < 0.5 && where.x == frame.left) 22925648ff0SStephan Aßmus raise = true; 23025648ff0SStephan Aßmus else if (position.x > 0.5 && where.x == frame.right) 23125648ff0SStephan Aßmus raise = true; 23225648ff0SStephan Aßmus } 23325648ff0SStephan Aßmus } else { 23425648ff0SStephan Aßmus // top or bottom border 23525648ff0SStephan Aßmus if (where.x >= windowFrame.left && where.x <= windowFrame.right) { 23625648ff0SStephan Aßmus if (position.y < 0.5 && where.y == frame.top) 23725648ff0SStephan Aßmus raise = true; 23825648ff0SStephan Aßmus else if (position.y > 0.5 && where.y == frame.top) 23925648ff0SStephan Aßmus raise = true; 24025648ff0SStephan Aßmus } 24125648ff0SStephan Aßmus } 24225648ff0SStephan Aßmus if (raise) 24325648ff0SStephan Aßmus window->Activate(); 24425648ff0SStephan Aßmus } 24525648ff0SStephan Aßmus } 24625648ff0SStephan Aßmus } 24725648ff0SStephan Aßmus } 24825648ff0SStephan Aßmus 24925648ff0SStephan Aßmus // AddButton 25025648ff0SStephan Aßmus void 25125648ff0SStephan Aßmus PadView::AddButton(LaunchButton* button, LaunchButton* beforeButton) 25225648ff0SStephan Aßmus { 25325648ff0SStephan Aßmus if (beforeButton) 254*f32e3a29SStephan Aßmus fButtonLayout->AddView(fButtonLayout->IndexOfView(beforeButton), button); 25525648ff0SStephan Aßmus else 256*f32e3a29SStephan Aßmus fButtonLayout->AddView(button); 25725648ff0SStephan Aßmus } 25825648ff0SStephan Aßmus 25925648ff0SStephan Aßmus // RemoveButton 26025648ff0SStephan Aßmus bool 26125648ff0SStephan Aßmus PadView::RemoveButton(LaunchButton* button) 26225648ff0SStephan Aßmus { 263*f32e3a29SStephan Aßmus return fButtonLayout->RemoveView(button); 26425648ff0SStephan Aßmus } 26525648ff0SStephan Aßmus 26625648ff0SStephan Aßmus // ButtonAt 26725648ff0SStephan Aßmus LaunchButton* 26825648ff0SStephan Aßmus PadView::ButtonAt(int32 index) const 26925648ff0SStephan Aßmus { 27025648ff0SStephan Aßmus return dynamic_cast<LaunchButton*>(ChildAt(index)); 27125648ff0SStephan Aßmus } 27225648ff0SStephan Aßmus 27325648ff0SStephan Aßmus // DisplayMenu 27425648ff0SStephan Aßmus void 27525648ff0SStephan Aßmus PadView::DisplayMenu(BPoint where, LaunchButton* button) const 27625648ff0SStephan Aßmus { 27725648ff0SStephan Aßmus if (MainWindow* window = dynamic_cast<MainWindow*>(Window())) { 27825648ff0SStephan Aßmus LaunchButton* nearestButton = button; 27925648ff0SStephan Aßmus if (!nearestButton) { 28025648ff0SStephan Aßmus // find the nearest button 28125648ff0SStephan Aßmus for (int32 i = 0; (nearestButton = ButtonAt(i)); i++) { 28225648ff0SStephan Aßmus if (nearestButton->Frame().top > where.y) 28325648ff0SStephan Aßmus break; 28425648ff0SStephan Aßmus } 28525648ff0SStephan Aßmus } 28625648ff0SStephan Aßmus BPopUpMenu* menu = new BPopUpMenu("launch popup", false, false); 28725648ff0SStephan Aßmus // add button 28825648ff0SStephan Aßmus BMessage* message = new BMessage(MSG_ADD_SLOT); 28925648ff0SStephan Aßmus message->AddPointer("be:source", (void*)nearestButton); 29025648ff0SStephan Aßmus BMenuItem* item = new BMenuItem("Add Button Here", message); 29125648ff0SStephan Aßmus item->SetTarget(window); 29225648ff0SStephan Aßmus menu->AddItem(item); 29325648ff0SStephan Aßmus // button options 29425648ff0SStephan Aßmus if (button) { 29525648ff0SStephan Aßmus // remove button 29625648ff0SStephan Aßmus message = new BMessage(MSG_CLEAR_SLOT); 29725648ff0SStephan Aßmus message->AddPointer("be:source", (void*)button); 29825648ff0SStephan Aßmus item = new BMenuItem("Clear Button", message); 29925648ff0SStephan Aßmus item->SetTarget(window); 30025648ff0SStephan Aßmus menu->AddItem(item); 30125648ff0SStephan Aßmus // remove button 30225648ff0SStephan Aßmus message = new BMessage(MSG_REMOVE_SLOT); 30325648ff0SStephan Aßmus message->AddPointer("be:source", (void*)button); 30425648ff0SStephan Aßmus item = new BMenuItem("Remove Button", message); 30525648ff0SStephan Aßmus item->SetTarget(window); 30625648ff0SStephan Aßmus menu->AddItem(item); 307*f32e3a29SStephan Aßmus // TODO: disabled because Haiku does not yet support tool tips 308*f32e3a29SStephan Aßmus // if (button->Ref()) { 309*f32e3a29SStephan Aßmus // message = new BMessage(MSG_SET_DESCRIPTION); 310*f32e3a29SStephan Aßmus // message->AddPointer("be:source", (void*)button); 311*f32e3a29SStephan Aßmus // item = new BMenuItem("Set Description"B_UTF8_ELLIPSIS, message); 312*f32e3a29SStephan Aßmus // item->SetTarget(window); 313*f32e3a29SStephan Aßmus // menu->AddItem(item); 314*f32e3a29SStephan Aßmus // } 31525648ff0SStephan Aßmus } 31625648ff0SStephan Aßmus menu->AddSeparatorItem(); 31725648ff0SStephan Aßmus // window settings 31825648ff0SStephan Aßmus BMenu* settingsM = new BMenu("Settings"); 31925648ff0SStephan Aßmus settingsM->SetFont(be_plain_font); 32025648ff0SStephan Aßmus 321*f32e3a29SStephan Aßmus const char* toggleLayoutLabel; 322*f32e3a29SStephan Aßmus if (fButtonLayout->Orientation() == B_HORIZONTAL) 323*f32e3a29SStephan Aßmus toggleLayoutLabel = "Vertical Layout"; 324*f32e3a29SStephan Aßmus else 325*f32e3a29SStephan Aßmus toggleLayoutLabel = "Horizontal Layout"; 326*f32e3a29SStephan Aßmus item = new BMenuItem(toggleLayoutLabel, new BMessage(MSG_TOGGLE_LAYOUT)); 327*f32e3a29SStephan Aßmus item->SetTarget(this); 328*f32e3a29SStephan Aßmus settingsM->AddItem(item); 329*f32e3a29SStephan Aßmus 33025648ff0SStephan Aßmus uint32 what = window->Look() == B_BORDERED_WINDOW_LOOK ? MSG_SHOW_BORDER : MSG_HIDE_BORDER; 33125648ff0SStephan Aßmus item = new BMenuItem("Show Window Border", new BMessage(what)); 33225648ff0SStephan Aßmus item->SetTarget(window); 33325648ff0SStephan Aßmus item->SetMarked(what == MSG_HIDE_BORDER); 33425648ff0SStephan Aßmus settingsM->AddItem(item); 33525648ff0SStephan Aßmus 33625648ff0SStephan Aßmus item = new BMenuItem("Auto Raise", new BMessage(MSG_TOGGLE_AUTORAISE)); 33725648ff0SStephan Aßmus item->SetTarget(window); 33825648ff0SStephan Aßmus item->SetMarked(window->AutoRaise()); 33925648ff0SStephan Aßmus settingsM->AddItem(item); 34025648ff0SStephan Aßmus 34125648ff0SStephan Aßmus item = new BMenuItem("Show On All Workspaces", new BMessage(MSG_SHOW_ON_ALL_WORKSPACES)); 34225648ff0SStephan Aßmus item->SetTarget(window); 34325648ff0SStephan Aßmus item->SetMarked(window->ShowOnAllWorkspaces()); 34425648ff0SStephan Aßmus settingsM->AddItem(item); 34525648ff0SStephan Aßmus 34625648ff0SStephan Aßmus menu->AddItem(settingsM); 34725648ff0SStephan Aßmus 34825648ff0SStephan Aßmus menu->AddSeparatorItem(); 34925648ff0SStephan Aßmus 35025648ff0SStephan Aßmus // pad commands 35125648ff0SStephan Aßmus BMenu* padM = new BMenu("Pad"); 35225648ff0SStephan Aßmus padM->SetFont(be_plain_font); 35325648ff0SStephan Aßmus // new pad 35425648ff0SStephan Aßmus item = new BMenuItem("New", new BMessage(MSG_ADD_WINDOW)); 35525648ff0SStephan Aßmus item->SetTarget(be_app); 35625648ff0SStephan Aßmus padM->AddItem(item); 35725648ff0SStephan Aßmus // new pad 35825648ff0SStephan Aßmus item = new BMenuItem("Clone", new BMessage(MSG_ADD_WINDOW)); 35925648ff0SStephan Aßmus item->SetTarget(window); 36025648ff0SStephan Aßmus padM->AddItem(item); 36125648ff0SStephan Aßmus padM->AddSeparatorItem(); 36225648ff0SStephan Aßmus // close 36325648ff0SStephan Aßmus item = new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED)); 36425648ff0SStephan Aßmus item->SetTarget(window); 36525648ff0SStephan Aßmus padM->AddItem(item); 36625648ff0SStephan Aßmus menu->AddItem(padM); 36725648ff0SStephan Aßmus // app commands 36825648ff0SStephan Aßmus BMenu* appM = new BMenu("LaunchBox"); 36925648ff0SStephan Aßmus appM->SetFont(be_plain_font); 37025648ff0SStephan Aßmus // about 37125648ff0SStephan Aßmus item = new BMenuItem("About", new BMessage(B_ABOUT_REQUESTED)); 37225648ff0SStephan Aßmus item->SetTarget(be_app); 37325648ff0SStephan Aßmus appM->AddItem(item); 37425648ff0SStephan Aßmus // quit 37525648ff0SStephan Aßmus item = new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED)); 37625648ff0SStephan Aßmus item->SetTarget(be_app); 37725648ff0SStephan Aßmus appM->AddItem(item); 37825648ff0SStephan Aßmus menu->AddItem(appM); 37925648ff0SStephan Aßmus // finish popup 38025648ff0SStephan Aßmus menu->SetAsyncAutoDestruct(true); 38125648ff0SStephan Aßmus menu->SetFont(be_plain_font); 38225648ff0SStephan Aßmus where = ConvertToScreen(where); 38325648ff0SStephan Aßmus BRect mouseRect(where, where); 38425648ff0SStephan Aßmus mouseRect.InsetBy(-4.0, -4.0); 38525648ff0SStephan Aßmus menu->Go(where, true, false, mouseRect, true); 38625648ff0SStephan Aßmus } 38725648ff0SStephan Aßmus } 38825648ff0SStephan Aßmus 389*f32e3a29SStephan Aßmus // SetOrientation 390*f32e3a29SStephan Aßmus void 391*f32e3a29SStephan Aßmus PadView::SetOrientation(enum orientation orientation) 392*f32e3a29SStephan Aßmus { 393*f32e3a29SStephan Aßmus if (orientation == B_VERTICAL) { 394*f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 395*f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_VERTICAL); 396*f32e3a29SStephan Aßmus } else { 397*f32e3a29SStephan Aßmus fButtonLayout->SetInsets(7, 2, 2, 2); 398*f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_HORIZONTAL); 399*f32e3a29SStephan Aßmus } 400*f32e3a29SStephan Aßmus } 401*f32e3a29SStephan Aßmus 402*f32e3a29SStephan Aßmus // Orientation 403*f32e3a29SStephan Aßmus enum orientation 404*f32e3a29SStephan Aßmus PadView::Orientation() const 405*f32e3a29SStephan Aßmus { 406*f32e3a29SStephan Aßmus return fButtonLayout->Orientation(); 407*f32e3a29SStephan Aßmus } 408*f32e3a29SStephan Aßmus 409*f32e3a29SStephan Aßmus 410