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 25*8d186370SStephan Aßmus 26a6099ca9SStephan Aßmus static bigtime_t sActivationDelay = 40000; 27a6099ca9SStephan Aßmus static const uint32 kIconSizes[] = { 16, 20, 24, 32, 40, 48, 64 }; 2825648ff0SStephan Aßmus 29*8d186370SStephan Aßmus 30f32e3a29SStephan Aßmus enum { 31a6099ca9SStephan Aßmus MSG_TOGGLE_LAYOUT = 'tgll', 32*8d186370SStephan Aßmus MSG_SET_ICON_SIZE = 'stis', 33*8d186370SStephan Aßmus MSG_SET_IGNORE_DOUBLECLICK = 'strd' 34f32e3a29SStephan Aßmus }; 35f32e3a29SStephan Aßmus 36*8d186370SStephan Aßmus 3725648ff0SStephan Aßmus PadView::PadView(const char* name) 38f32e3a29SStephan Aßmus : BView(name, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE, NULL), 3925648ff0SStephan Aßmus fDragging(false), 40f32e3a29SStephan Aßmus fClickTime(0), 41a6099ca9SStephan Aßmus fButtonLayout(new BGroupLayout(B_VERTICAL, 4)), 42a6099ca9SStephan Aßmus fIconSize(DEFAULT_ICON_SIZE) 4325648ff0SStephan Aßmus { 4425648ff0SStephan Aßmus SetViewColor(B_TRANSPARENT_32_BIT); 4525648ff0SStephan Aßmus SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 46a6099ca9SStephan Aßmus get_click_speed(&sActivationDelay); 4725648ff0SStephan Aßmus 48f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 49f32e3a29SStephan Aßmus SetLayout(fButtonLayout); 5025648ff0SStephan Aßmus } 5125648ff0SStephan Aßmus 52*8d186370SStephan Aßmus 5325648ff0SStephan Aßmus PadView::~PadView() 5425648ff0SStephan Aßmus { 5525648ff0SStephan Aßmus } 5625648ff0SStephan Aßmus 57*8d186370SStephan Aßmus 5825648ff0SStephan Aßmus void 5925648ff0SStephan Aßmus PadView::Draw(BRect updateRect) 6025648ff0SStephan Aßmus { 6125648ff0SStephan Aßmus rgb_color background = LowColor(); 6225648ff0SStephan Aßmus rgb_color light = tint_color(background, B_LIGHTEN_MAX_TINT); 6325648ff0SStephan Aßmus rgb_color shadow = tint_color(background, B_DARKEN_2_TINT); 6425648ff0SStephan Aßmus BRect r(Bounds()); 6525648ff0SStephan Aßmus BeginLineArray(4); 6625648ff0SStephan Aßmus AddLine(BPoint(r.left, r.bottom), BPoint(r.left, r.top), light); 6725648ff0SStephan Aßmus AddLine(BPoint(r.left + 1.0, r.top), BPoint(r.right, r.top), light); 6825648ff0SStephan Aßmus AddLine(BPoint(r.right, r.top + 1.0), BPoint(r.right, r.bottom), shadow); 6925648ff0SStephan Aßmus AddLine(BPoint(r.right - 1.0, r.bottom), BPoint(r.left + 1.0, r.bottom), shadow); 7025648ff0SStephan Aßmus EndLineArray(); 7125648ff0SStephan Aßmus r.InsetBy(1.0, 1.0); 7225648ff0SStephan Aßmus StrokeRect(r, B_SOLID_LOW); 7325648ff0SStephan Aßmus r.InsetBy(1.0, 1.0); 7425648ff0SStephan Aßmus // dots along top 7525648ff0SStephan Aßmus BPoint dot = r.LeftTop(); 76f32e3a29SStephan Aßmus int32 current; 77f32e3a29SStephan Aßmus int32 stop; 78f32e3a29SStephan Aßmus BPoint offset; 79f32e3a29SStephan Aßmus BPoint next; 80f32e3a29SStephan Aßmus if (Orientation() == B_VERTICAL) { 81f32e3a29SStephan Aßmus current = (int32)dot.x; 82f32e3a29SStephan Aßmus stop = (int32)r.right; 83f32e3a29SStephan Aßmus offset = BPoint(0, 1); 84f32e3a29SStephan Aßmus next = BPoint(1, -4); 85f32e3a29SStephan Aßmus r.top += 5.0; 86f32e3a29SStephan Aßmus } else { 87f32e3a29SStephan Aßmus current = (int32)dot.y; 88f32e3a29SStephan Aßmus stop = (int32)r.bottom; 89f32e3a29SStephan Aßmus offset = BPoint(1, 0); 90f32e3a29SStephan Aßmus next = BPoint(-4, 1); 91f32e3a29SStephan Aßmus r.left += 5.0; 92f32e3a29SStephan Aßmus } 9325648ff0SStephan Aßmus int32 num = 1; 94f32e3a29SStephan Aßmus while (current <= stop) { 9525648ff0SStephan Aßmus rgb_color col1; 9625648ff0SStephan Aßmus rgb_color col2; 9725648ff0SStephan Aßmus switch (num) { 9825648ff0SStephan Aßmus case 1: 9925648ff0SStephan Aßmus col1 = shadow; 10025648ff0SStephan Aßmus col2 = background; 10125648ff0SStephan Aßmus break; 10225648ff0SStephan Aßmus case 2: 10325648ff0SStephan Aßmus col1 = background; 10425648ff0SStephan Aßmus col2 = light; 10525648ff0SStephan Aßmus break; 10625648ff0SStephan Aßmus case 3: 10725648ff0SStephan Aßmus col1 = background; 10825648ff0SStephan Aßmus col2 = background; 10925648ff0SStephan Aßmus num = 0; 11025648ff0SStephan Aßmus break; 11125648ff0SStephan Aßmus } 11225648ff0SStephan Aßmus SetHighColor(col1); 11325648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 11425648ff0SStephan Aßmus SetHighColor(col2); 115f32e3a29SStephan Aßmus dot += offset; 11625648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 117f32e3a29SStephan Aßmus dot += offset; 11825648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_LOW); 119f32e3a29SStephan Aßmus dot += offset; 12025648ff0SStephan Aßmus SetHighColor(col1); 12125648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 122f32e3a29SStephan Aßmus dot += offset; 12325648ff0SStephan Aßmus SetHighColor(col2); 12425648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 12525648ff0SStephan Aßmus // next pixel 12625648ff0SStephan Aßmus num++; 127f32e3a29SStephan Aßmus dot += next; 128f32e3a29SStephan Aßmus current++; 12925648ff0SStephan Aßmus } 13025648ff0SStephan Aßmus FillRect(r, B_SOLID_LOW); 13125648ff0SStephan Aßmus } 13225648ff0SStephan Aßmus 133*8d186370SStephan Aßmus 13425648ff0SStephan Aßmus void 13525648ff0SStephan Aßmus PadView::MessageReceived(BMessage* message) 13625648ff0SStephan Aßmus { 13725648ff0SStephan Aßmus switch (message->what) { 138f32e3a29SStephan Aßmus case MSG_TOGGLE_LAYOUT: 139f32e3a29SStephan Aßmus if (fButtonLayout->Orientation() == B_HORIZONTAL) { 140f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 141f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_VERTICAL); 142f32e3a29SStephan Aßmus } else { 143f32e3a29SStephan Aßmus fButtonLayout->SetInsets(7, 2, 2, 2); 144f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_HORIZONTAL); 145f32e3a29SStephan Aßmus } 146f32e3a29SStephan Aßmus break; 147*8d186370SStephan Aßmus 148a6099ca9SStephan Aßmus case MSG_SET_ICON_SIZE: 149a6099ca9SStephan Aßmus uint32 size; 150a6099ca9SStephan Aßmus if (message->FindInt32("size", (int32*)&size) == B_OK) 151a6099ca9SStephan Aßmus SetIconSize(size); 152a6099ca9SStephan Aßmus break; 153*8d186370SStephan Aßmus 154*8d186370SStephan Aßmus case MSG_SET_IGNORE_DOUBLECLICK: 155*8d186370SStephan Aßmus SetIgnoreDoubleClick(!IgnoreDoubleClick()); 156*8d186370SStephan Aßmus break; 157*8d186370SStephan Aßmus 15825648ff0SStephan Aßmus default: 15925648ff0SStephan Aßmus BView::MessageReceived(message); 16025648ff0SStephan Aßmus break; 16125648ff0SStephan Aßmus } 16225648ff0SStephan Aßmus } 16325648ff0SStephan Aßmus 164*8d186370SStephan Aßmus 16525648ff0SStephan Aßmus void 16625648ff0SStephan Aßmus PadView::MouseDown(BPoint where) 16725648ff0SStephan Aßmus { 16880e19252SStephan Aßmus BWindow* window = Window(); 16980e19252SStephan Aßmus if (window == NULL) 17080e19252SStephan Aßmus return; 17180e19252SStephan Aßmus 17225648ff0SStephan Aßmus BRegion region; 17325648ff0SStephan Aßmus GetClippingRegion(®ion); 17480e19252SStephan Aßmus if (!region.Contains(where)) 17580e19252SStephan Aßmus return; 17680e19252SStephan Aßmus 17725648ff0SStephan Aßmus bool handle = true; 17825648ff0SStephan Aßmus for (int32 i = 0; BView* child = ChildAt(i); i++) { 17925648ff0SStephan Aßmus if (child->Frame().Contains(where)) { 18025648ff0SStephan Aßmus handle = false; 18125648ff0SStephan Aßmus break; 18225648ff0SStephan Aßmus } 18325648ff0SStephan Aßmus } 18480e19252SStephan Aßmus if (!handle) 18580e19252SStephan Aßmus return; 18680e19252SStephan Aßmus 18780e19252SStephan Aßmus BMessage* message = window->CurrentMessage(); 18880e19252SStephan Aßmus if (message == NULL) 18980e19252SStephan Aßmus return; 19080e19252SStephan Aßmus 19125648ff0SStephan Aßmus uint32 buttons; 19225648ff0SStephan Aßmus message->FindInt32("buttons", (int32*)&buttons); 19325648ff0SStephan Aßmus if (buttons & B_SECONDARY_MOUSE_BUTTON) { 19425648ff0SStephan Aßmus BRect r = Bounds(); 19525648ff0SStephan Aßmus r.InsetBy(2.0, 2.0); 19625648ff0SStephan Aßmus r.top += 6.0; 19725648ff0SStephan Aßmus if (r.Contains(where)) { 19825648ff0SStephan Aßmus DisplayMenu(where); 19925648ff0SStephan Aßmus } else { 20025648ff0SStephan Aßmus // sends the window to the back 20125648ff0SStephan Aßmus window->Activate(false); 20225648ff0SStephan Aßmus } 20325648ff0SStephan Aßmus } else { 204a6099ca9SStephan Aßmus if (system_time() - fClickTime < sActivationDelay) { 20525648ff0SStephan Aßmus window->Minimize(true); 20625648ff0SStephan Aßmus fClickTime = 0; 20725648ff0SStephan Aßmus } else { 20825648ff0SStephan Aßmus window->Activate(); 20925648ff0SStephan Aßmus fDragOffset = ConvertToScreen(where) - window->Frame().LeftTop(); 21025648ff0SStephan Aßmus fDragging = true; 21125648ff0SStephan Aßmus SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); 21225648ff0SStephan Aßmus fClickTime = system_time(); 21325648ff0SStephan Aßmus } 21425648ff0SStephan Aßmus } 21525648ff0SStephan Aßmus } 21625648ff0SStephan Aßmus 217*8d186370SStephan Aßmus 21825648ff0SStephan Aßmus void 21925648ff0SStephan Aßmus PadView::MouseUp(BPoint where) 22025648ff0SStephan Aßmus { 22125648ff0SStephan Aßmus if (BWindow* window = Window()) { 22225648ff0SStephan Aßmus uint32 buttons; 22325648ff0SStephan Aßmus window->CurrentMessage()->FindInt32("buttons", (int32*)&buttons); 22425648ff0SStephan Aßmus if (buttons & B_PRIMARY_MOUSE_BUTTON 225a6099ca9SStephan Aßmus && system_time() - fClickTime < sActivationDelay 22625648ff0SStephan Aßmus && window->IsActive()) 22725648ff0SStephan Aßmus window->Activate(); 22825648ff0SStephan Aßmus } 22925648ff0SStephan Aßmus fDragging = false; 23025648ff0SStephan Aßmus } 23125648ff0SStephan Aßmus 232*8d186370SStephan Aßmus 23325648ff0SStephan Aßmus void 23425648ff0SStephan Aßmus PadView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) 23525648ff0SStephan Aßmus { 2368eeb005fSStephan Aßmus MainWindow* window = dynamic_cast<MainWindow*>(Window()); 2378eeb005fSStephan Aßmus if (window == NULL) 2388eeb005fSStephan Aßmus return; 2398eeb005fSStephan Aßmus 24025648ff0SStephan Aßmus if (fDragging) { 24125648ff0SStephan Aßmus window->MoveTo(ConvertToScreen(where) - fDragOffset); 24225648ff0SStephan Aßmus } else if (window->AutoRaise()) { 24325648ff0SStephan Aßmus where = ConvertToScreen(where); 24425648ff0SStephan Aßmus BScreen screen(window); 24525648ff0SStephan Aßmus BRect frame = screen.Frame(); 24625648ff0SStephan Aßmus BRect windowFrame = window->Frame(); 24725648ff0SStephan Aßmus if (where.x == frame.left || where.x == frame.right 24825648ff0SStephan Aßmus || where.y == frame.top || where.y == frame.bottom) { 24925648ff0SStephan Aßmus BPoint position = window->ScreenPosition(); 25025648ff0SStephan Aßmus bool raise = false; 25125648ff0SStephan Aßmus if (fabs(0.5 - position.x) > fabs(0.5 - position.y)) { 25225648ff0SStephan Aßmus // left or right border 253*8d186370SStephan Aßmus if (where.y >= windowFrame.top 254*8d186370SStephan Aßmus && where.y <= windowFrame.bottom) { 25525648ff0SStephan Aßmus if (position.x < 0.5 && where.x == frame.left) 25625648ff0SStephan Aßmus raise = true; 25725648ff0SStephan Aßmus else if (position.x > 0.5 && where.x == frame.right) 25825648ff0SStephan Aßmus raise = true; 25925648ff0SStephan Aßmus } 26025648ff0SStephan Aßmus } else { 26125648ff0SStephan Aßmus // top or bottom border 26225648ff0SStephan Aßmus if (where.x >= windowFrame.left && where.x <= windowFrame.right) { 26325648ff0SStephan Aßmus if (position.y < 0.5 && where.y == frame.top) 26425648ff0SStephan Aßmus raise = true; 265a6099ca9SStephan Aßmus else if (position.y > 0.5 && where.y == frame.bottom) 26625648ff0SStephan Aßmus raise = true; 26725648ff0SStephan Aßmus } 26825648ff0SStephan Aßmus } 26925648ff0SStephan Aßmus if (raise) 27025648ff0SStephan Aßmus window->Activate(); 27125648ff0SStephan Aßmus } 27225648ff0SStephan Aßmus } 27325648ff0SStephan Aßmus } 27425648ff0SStephan Aßmus 275*8d186370SStephan Aßmus 27625648ff0SStephan Aßmus void 27725648ff0SStephan Aßmus PadView::AddButton(LaunchButton* button, LaunchButton* beforeButton) 27825648ff0SStephan Aßmus { 279a6099ca9SStephan Aßmus button->SetIconSize(fIconSize); 280a6099ca9SStephan Aßmus 28125648ff0SStephan Aßmus if (beforeButton) 282f32e3a29SStephan Aßmus fButtonLayout->AddView(fButtonLayout->IndexOfView(beforeButton), button); 28325648ff0SStephan Aßmus else 284f32e3a29SStephan Aßmus fButtonLayout->AddView(button); 28525648ff0SStephan Aßmus } 28625648ff0SStephan Aßmus 287*8d186370SStephan Aßmus 28825648ff0SStephan Aßmus bool 28925648ff0SStephan Aßmus PadView::RemoveButton(LaunchButton* button) 29025648ff0SStephan Aßmus { 291f32e3a29SStephan Aßmus return fButtonLayout->RemoveView(button); 29225648ff0SStephan Aßmus } 29325648ff0SStephan Aßmus 294*8d186370SStephan Aßmus 29525648ff0SStephan Aßmus LaunchButton* 29625648ff0SStephan Aßmus PadView::ButtonAt(int32 index) const 29725648ff0SStephan Aßmus { 29825648ff0SStephan Aßmus return dynamic_cast<LaunchButton*>(ChildAt(index)); 29925648ff0SStephan Aßmus } 30025648ff0SStephan Aßmus 301*8d186370SStephan Aßmus 30225648ff0SStephan Aßmus void 30325648ff0SStephan Aßmus PadView::DisplayMenu(BPoint where, LaunchButton* button) const 30425648ff0SStephan Aßmus { 3058eeb005fSStephan Aßmus MainWindow* window = dynamic_cast<MainWindow*>(Window()); 3068eeb005fSStephan Aßmus if (window == NULL) 3078eeb005fSStephan Aßmus return; 3088eeb005fSStephan Aßmus 30925648ff0SStephan Aßmus LaunchButton* nearestButton = button; 31025648ff0SStephan Aßmus if (!nearestButton) { 31125648ff0SStephan Aßmus // find the nearest button 31225648ff0SStephan Aßmus for (int32 i = 0; (nearestButton = ButtonAt(i)); i++) { 31325648ff0SStephan Aßmus if (nearestButton->Frame().top > where.y) 31425648ff0SStephan Aßmus break; 31525648ff0SStephan Aßmus } 31625648ff0SStephan Aßmus } 31725648ff0SStephan Aßmus BPopUpMenu* menu = new BPopUpMenu("launch popup", false, false); 31825648ff0SStephan Aßmus // add button 31925648ff0SStephan Aßmus BMessage* message = new BMessage(MSG_ADD_SLOT); 32025648ff0SStephan Aßmus message->AddPointer("be:source", (void*)nearestButton); 32125648ff0SStephan Aßmus BMenuItem* item = new BMenuItem("Add Button Here", message); 32225648ff0SStephan Aßmus item->SetTarget(window); 32325648ff0SStephan Aßmus menu->AddItem(item); 32425648ff0SStephan Aßmus // button options 32525648ff0SStephan Aßmus if (button) { 32625648ff0SStephan Aßmus // remove button 32725648ff0SStephan Aßmus message = new BMessage(MSG_CLEAR_SLOT); 32825648ff0SStephan Aßmus message->AddPointer("be:source", (void*)button); 32925648ff0SStephan Aßmus item = new BMenuItem("Clear Button", message); 33025648ff0SStephan Aßmus item->SetTarget(window); 33125648ff0SStephan Aßmus menu->AddItem(item); 33225648ff0SStephan Aßmus // remove button 33325648ff0SStephan Aßmus message = new BMessage(MSG_REMOVE_SLOT); 33425648ff0SStephan Aßmus message->AddPointer("be:source", (void*)button); 33525648ff0SStephan Aßmus item = new BMenuItem("Remove Button", message); 33625648ff0SStephan Aßmus item->SetTarget(window); 33725648ff0SStephan Aßmus menu->AddItem(item); 338f32e3a29SStephan Aßmus // TODO: disabled because Haiku does not yet support tool tips 339f32e3a29SStephan Aßmus // if (button->Ref()) { 340f32e3a29SStephan Aßmus // message = new BMessage(MSG_SET_DESCRIPTION); 341f32e3a29SStephan Aßmus // message->AddPointer("be:source", (void*)button); 342f32e3a29SStephan Aßmus // item = new BMenuItem("Set Description"B_UTF8_ELLIPSIS, message); 343f32e3a29SStephan Aßmus // item->SetTarget(window); 344f32e3a29SStephan Aßmus // menu->AddItem(item); 345f32e3a29SStephan Aßmus // } 34625648ff0SStephan Aßmus } 34725648ff0SStephan Aßmus menu->AddSeparatorItem(); 34825648ff0SStephan Aßmus // window settings 34925648ff0SStephan Aßmus BMenu* settingsM = new BMenu("Settings"); 35025648ff0SStephan Aßmus settingsM->SetFont(be_plain_font); 35125648ff0SStephan Aßmus 352f32e3a29SStephan Aßmus const char* toggleLayoutLabel; 353f32e3a29SStephan Aßmus if (fButtonLayout->Orientation() == B_HORIZONTAL) 354f32e3a29SStephan Aßmus toggleLayoutLabel = "Vertical Layout"; 355f32e3a29SStephan Aßmus else 356f32e3a29SStephan Aßmus toggleLayoutLabel = "Horizontal Layout"; 357f32e3a29SStephan Aßmus item = new BMenuItem(toggleLayoutLabel, new BMessage(MSG_TOGGLE_LAYOUT)); 358f32e3a29SStephan Aßmus item->SetTarget(this); 359f32e3a29SStephan Aßmus settingsM->AddItem(item); 360f32e3a29SStephan Aßmus 361a6099ca9SStephan Aßmus BMenu* iconSizeM = new BMenu("Icon size"); 362a6099ca9SStephan Aßmus for (uint32 i = 0; i < sizeof(kIconSizes) / sizeof(uint32); i++) { 363a6099ca9SStephan Aßmus uint32 iconSize = kIconSizes[i]; 364a6099ca9SStephan Aßmus message = new BMessage(MSG_SET_ICON_SIZE); 365a6099ca9SStephan Aßmus message->AddInt32("size", iconSize); 366a6099ca9SStephan Aßmus BString label; 367a6099ca9SStephan Aßmus label << iconSize << " x " << iconSize; 368a6099ca9SStephan Aßmus item = new BMenuItem(label.String(), message); 369a6099ca9SStephan Aßmus item->SetTarget(this); 370a6099ca9SStephan Aßmus item->SetMarked(IconSize() == iconSize); 371a6099ca9SStephan Aßmus iconSizeM->AddItem(item); 372a6099ca9SStephan Aßmus } 373a6099ca9SStephan Aßmus settingsM->AddItem(iconSizeM); 374a6099ca9SStephan Aßmus 375*8d186370SStephan Aßmus item = new BMenuItem("Ignore Double-click", 376*8d186370SStephan Aßmus new BMessage(MSG_SET_IGNORE_DOUBLECLICK)); 377*8d186370SStephan Aßmus item->SetTarget(this); 378*8d186370SStephan Aßmus item->SetMarked(IgnoreDoubleClick()); 379*8d186370SStephan Aßmus settingsM->AddItem(item); 380*8d186370SStephan Aßmus 38125648ff0SStephan Aßmus uint32 what = window->Look() == B_BORDERED_WINDOW_LOOK ? MSG_SHOW_BORDER : MSG_HIDE_BORDER; 38225648ff0SStephan Aßmus item = new BMenuItem("Show Window Border", new BMessage(what)); 38325648ff0SStephan Aßmus item->SetTarget(window); 38425648ff0SStephan Aßmus item->SetMarked(what == MSG_HIDE_BORDER); 38525648ff0SStephan Aßmus settingsM->AddItem(item); 38625648ff0SStephan Aßmus 38725648ff0SStephan Aßmus item = new BMenuItem("Auto Raise", new BMessage(MSG_TOGGLE_AUTORAISE)); 38825648ff0SStephan Aßmus item->SetTarget(window); 38925648ff0SStephan Aßmus item->SetMarked(window->AutoRaise()); 39025648ff0SStephan Aßmus settingsM->AddItem(item); 39125648ff0SStephan Aßmus 39225648ff0SStephan Aßmus item = new BMenuItem("Show On All Workspaces", new BMessage(MSG_SHOW_ON_ALL_WORKSPACES)); 39325648ff0SStephan Aßmus item->SetTarget(window); 39425648ff0SStephan Aßmus item->SetMarked(window->ShowOnAllWorkspaces()); 39525648ff0SStephan Aßmus settingsM->AddItem(item); 39625648ff0SStephan Aßmus 39725648ff0SStephan Aßmus menu->AddItem(settingsM); 39825648ff0SStephan Aßmus 39925648ff0SStephan Aßmus menu->AddSeparatorItem(); 40025648ff0SStephan Aßmus 40125648ff0SStephan Aßmus // pad commands 40225648ff0SStephan Aßmus BMenu* padM = new BMenu("Pad"); 40325648ff0SStephan Aßmus padM->SetFont(be_plain_font); 40425648ff0SStephan Aßmus // new pad 40525648ff0SStephan Aßmus item = new BMenuItem("New", new BMessage(MSG_ADD_WINDOW)); 40625648ff0SStephan Aßmus item->SetTarget(be_app); 40725648ff0SStephan Aßmus padM->AddItem(item); 40825648ff0SStephan Aßmus // new pad 40925648ff0SStephan Aßmus item = new BMenuItem("Clone", new BMessage(MSG_ADD_WINDOW)); 41025648ff0SStephan Aßmus item->SetTarget(window); 41125648ff0SStephan Aßmus padM->AddItem(item); 41225648ff0SStephan Aßmus padM->AddSeparatorItem(); 41325648ff0SStephan Aßmus // close 41425648ff0SStephan Aßmus item = new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED)); 41525648ff0SStephan Aßmus item->SetTarget(window); 41625648ff0SStephan Aßmus padM->AddItem(item); 41725648ff0SStephan Aßmus menu->AddItem(padM); 41825648ff0SStephan Aßmus // app commands 41925648ff0SStephan Aßmus BMenu* appM = new BMenu("LaunchBox"); 42025648ff0SStephan Aßmus appM->SetFont(be_plain_font); 42125648ff0SStephan Aßmus // about 42225648ff0SStephan Aßmus item = new BMenuItem("About", new BMessage(B_ABOUT_REQUESTED)); 42325648ff0SStephan Aßmus item->SetTarget(be_app); 42425648ff0SStephan Aßmus appM->AddItem(item); 42525648ff0SStephan Aßmus // quit 42625648ff0SStephan Aßmus item = new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED)); 42725648ff0SStephan Aßmus item->SetTarget(be_app); 42825648ff0SStephan Aßmus appM->AddItem(item); 42925648ff0SStephan Aßmus menu->AddItem(appM); 43025648ff0SStephan Aßmus // finish popup 43125648ff0SStephan Aßmus menu->SetAsyncAutoDestruct(true); 43225648ff0SStephan Aßmus menu->SetFont(be_plain_font); 43325648ff0SStephan Aßmus where = ConvertToScreen(where); 43425648ff0SStephan Aßmus BRect mouseRect(where, where); 43525648ff0SStephan Aßmus mouseRect.InsetBy(-4.0, -4.0); 43625648ff0SStephan Aßmus menu->Go(where, true, false, mouseRect, true); 43725648ff0SStephan Aßmus } 43825648ff0SStephan Aßmus 439*8d186370SStephan Aßmus 440f32e3a29SStephan Aßmus void 441f32e3a29SStephan Aßmus PadView::SetOrientation(enum orientation orientation) 442f32e3a29SStephan Aßmus { 443f32e3a29SStephan Aßmus if (orientation == B_VERTICAL) { 444f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 445f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_VERTICAL); 446f32e3a29SStephan Aßmus } else { 447f32e3a29SStephan Aßmus fButtonLayout->SetInsets(7, 2, 2, 2); 448f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_HORIZONTAL); 449f32e3a29SStephan Aßmus } 450f32e3a29SStephan Aßmus } 451f32e3a29SStephan Aßmus 452*8d186370SStephan Aßmus 453f32e3a29SStephan Aßmus enum orientation 454f32e3a29SStephan Aßmus PadView::Orientation() const 455f32e3a29SStephan Aßmus { 456f32e3a29SStephan Aßmus return fButtonLayout->Orientation(); 457f32e3a29SStephan Aßmus } 458f32e3a29SStephan Aßmus 459*8d186370SStephan Aßmus 460a6099ca9SStephan Aßmus void 461a6099ca9SStephan Aßmus PadView::SetIconSize(uint32 size) 462a6099ca9SStephan Aßmus { 463a6099ca9SStephan Aßmus if (size == fIconSize) 464a6099ca9SStephan Aßmus return; 465a6099ca9SStephan Aßmus 466a6099ca9SStephan Aßmus fIconSize = size; 467a6099ca9SStephan Aßmus 468a6099ca9SStephan Aßmus for (int32 i = 0; LaunchButton* button = ButtonAt(i); i++) 469a6099ca9SStephan Aßmus button->SetIconSize(fIconSize); 470a6099ca9SStephan Aßmus } 471a6099ca9SStephan Aßmus 472*8d186370SStephan Aßmus 473a6099ca9SStephan Aßmus uint32 474a6099ca9SStephan Aßmus PadView::IconSize() const 475a6099ca9SStephan Aßmus { 476a6099ca9SStephan Aßmus return fIconSize; 477a6099ca9SStephan Aßmus } 478a6099ca9SStephan Aßmus 479f32e3a29SStephan Aßmus 480*8d186370SStephan Aßmus void 481*8d186370SStephan Aßmus PadView::SetIgnoreDoubleClick(bool refuse) 482*8d186370SStephan Aßmus { 483*8d186370SStephan Aßmus LaunchButton::SetIgnoreDoubleClick(refuse); 484*8d186370SStephan Aßmus } 485*8d186370SStephan Aßmus 486*8d186370SStephan Aßmus 487*8d186370SStephan Aßmus bool 488*8d186370SStephan Aßmus PadView::IgnoreDoubleClick() const 489*8d186370SStephan Aßmus { 490*8d186370SStephan Aßmus return LaunchButton::IgnoreDoubleClick(); 491*8d186370SStephan Aßmus } 492*8d186370SStephan Aßmus 493*8d186370SStephan Aßmus 494