125648ff0SStephan Aßmus /* 29368e58bSStephan Aßmus * Copyright 2006-2009, Stephan Aßmus <superstippi@gmx.de>. 39368e58bSStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License. 425648ff0SStephan Aßmus */ 525648ff0SStephan Aßmus 625648ff0SStephan Aßmus #include "PadView.h" 725648ff0SStephan Aßmus 825648ff0SStephan Aßmus #include <stdio.h> 925648ff0SStephan Aßmus 10*e680a439SYatendra Singh #include <Directory.h> 11*e680a439SYatendra Singh #include <File.h> 1225648ff0SStephan Aßmus #include <Application.h> 130e07d4c0SAdrien Destugues #include <Catalog.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" 24*e680a439SYatendra Singh #include "App.h" 2525648ff0SStephan Aßmus 268d186370SStephan Aßmus 27546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT 28546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "LaunchBox" 290e07d4c0SAdrien Destugues 300e07d4c0SAdrien Destugues 31a6099ca9SStephan Aßmus static bigtime_t sActivationDelay = 40000; 32a6099ca9SStephan Aßmus static const uint32 kIconSizes[] = { 16, 20, 24, 32, 40, 48, 64 }; 3325648ff0SStephan Aßmus 348d186370SStephan Aßmus 35f32e3a29SStephan Aßmus enum { 36a6099ca9SStephan Aßmus MSG_TOGGLE_LAYOUT = 'tgll', 378d186370SStephan Aßmus MSG_SET_ICON_SIZE = 'stis', 388d186370SStephan Aßmus MSG_SET_IGNORE_DOUBLECLICK = 'strd' 39f32e3a29SStephan Aßmus }; 40f32e3a29SStephan Aßmus 418d186370SStephan Aßmus 4225648ff0SStephan Aßmus PadView::PadView(const char* name) 43f32e3a29SStephan Aßmus : BView(name, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE, NULL), 4425648ff0SStephan Aßmus fDragging(false), 45f32e3a29SStephan Aßmus fClickTime(0), 46a6099ca9SStephan Aßmus fButtonLayout(new BGroupLayout(B_VERTICAL, 4)), 47a6099ca9SStephan Aßmus fIconSize(DEFAULT_ICON_SIZE) 4825648ff0SStephan Aßmus { 4925648ff0SStephan Aßmus SetViewColor(B_TRANSPARENT_32_BIT); 5025648ff0SStephan Aßmus SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 51a6099ca9SStephan Aßmus get_click_speed(&sActivationDelay); 5225648ff0SStephan Aßmus 53f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 54f32e3a29SStephan Aßmus SetLayout(fButtonLayout); 5525648ff0SStephan Aßmus } 5625648ff0SStephan Aßmus 578d186370SStephan Aßmus 5825648ff0SStephan Aßmus PadView::~PadView() 5925648ff0SStephan Aßmus { 6025648ff0SStephan Aßmus } 6125648ff0SStephan Aßmus 628d186370SStephan Aßmus 6325648ff0SStephan Aßmus void 6425648ff0SStephan Aßmus PadView::Draw(BRect updateRect) 6525648ff0SStephan Aßmus { 6625648ff0SStephan Aßmus rgb_color background = LowColor(); 6725648ff0SStephan Aßmus rgb_color light = tint_color(background, B_LIGHTEN_MAX_TINT); 6825648ff0SStephan Aßmus rgb_color shadow = tint_color(background, B_DARKEN_2_TINT); 6925648ff0SStephan Aßmus BRect r(Bounds()); 7025648ff0SStephan Aßmus BeginLineArray(4); 7125648ff0SStephan Aßmus AddLine(BPoint(r.left, r.bottom), BPoint(r.left, r.top), light); 7225648ff0SStephan Aßmus AddLine(BPoint(r.left + 1.0, r.top), BPoint(r.right, r.top), light); 7325648ff0SStephan Aßmus AddLine(BPoint(r.right, r.top + 1.0), BPoint(r.right, r.bottom), shadow); 7425648ff0SStephan Aßmus AddLine(BPoint(r.right - 1.0, r.bottom), BPoint(r.left + 1.0, r.bottom), shadow); 7525648ff0SStephan Aßmus EndLineArray(); 7625648ff0SStephan Aßmus r.InsetBy(1.0, 1.0); 7725648ff0SStephan Aßmus StrokeRect(r, B_SOLID_LOW); 7825648ff0SStephan Aßmus r.InsetBy(1.0, 1.0); 7925648ff0SStephan Aßmus // dots along top 8025648ff0SStephan Aßmus BPoint dot = r.LeftTop(); 81f32e3a29SStephan Aßmus int32 current; 82f32e3a29SStephan Aßmus int32 stop; 83f32e3a29SStephan Aßmus BPoint offset; 84f32e3a29SStephan Aßmus BPoint next; 85f32e3a29SStephan Aßmus if (Orientation() == B_VERTICAL) { 86f32e3a29SStephan Aßmus current = (int32)dot.x; 87f32e3a29SStephan Aßmus stop = (int32)r.right; 88f32e3a29SStephan Aßmus offset = BPoint(0, 1); 89f32e3a29SStephan Aßmus next = BPoint(1, -4); 90f32e3a29SStephan Aßmus r.top += 5.0; 91f32e3a29SStephan Aßmus } else { 92f32e3a29SStephan Aßmus current = (int32)dot.y; 93f32e3a29SStephan Aßmus stop = (int32)r.bottom; 94f32e3a29SStephan Aßmus offset = BPoint(1, 0); 95f32e3a29SStephan Aßmus next = BPoint(-4, 1); 96f32e3a29SStephan Aßmus r.left += 5.0; 97f32e3a29SStephan Aßmus } 9825648ff0SStephan Aßmus int32 num = 1; 99f32e3a29SStephan Aßmus while (current <= stop) { 10025648ff0SStephan Aßmus rgb_color col1; 10125648ff0SStephan Aßmus rgb_color col2; 10298dc6a20SOliver Tappe if (num == 1) { 10325648ff0SStephan Aßmus col1 = shadow; 10425648ff0SStephan Aßmus col2 = background; 10598dc6a20SOliver Tappe } else if (num == 2) { 10625648ff0SStephan Aßmus col1 = background; 10725648ff0SStephan Aßmus col2 = light; 10898dc6a20SOliver Tappe } else { 10925648ff0SStephan Aßmus col1 = background; 11025648ff0SStephan Aßmus col2 = background; 11125648ff0SStephan Aßmus num = 0; 11225648ff0SStephan Aßmus } 11325648ff0SStephan Aßmus SetHighColor(col1); 11425648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 11525648ff0SStephan Aßmus SetHighColor(col2); 116f32e3a29SStephan Aßmus dot += offset; 11725648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 118f32e3a29SStephan Aßmus dot += offset; 11925648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_LOW); 120f32e3a29SStephan Aßmus dot += offset; 12125648ff0SStephan Aßmus SetHighColor(col1); 12225648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 123f32e3a29SStephan Aßmus dot += offset; 12425648ff0SStephan Aßmus SetHighColor(col2); 12525648ff0SStephan Aßmus StrokeLine(dot, dot, B_SOLID_HIGH); 12625648ff0SStephan Aßmus // next pixel 12725648ff0SStephan Aßmus num++; 128f32e3a29SStephan Aßmus dot += next; 129f32e3a29SStephan Aßmus current++; 13025648ff0SStephan Aßmus } 13125648ff0SStephan Aßmus FillRect(r, B_SOLID_LOW); 13225648ff0SStephan Aßmus } 13325648ff0SStephan Aßmus 1348d186370SStephan Aßmus 13525648ff0SStephan Aßmus void 13625648ff0SStephan Aßmus PadView::MessageReceived(BMessage* message) 13725648ff0SStephan Aßmus { 13825648ff0SStephan Aßmus switch (message->what) { 139f32e3a29SStephan Aßmus case MSG_TOGGLE_LAYOUT: 140f32e3a29SStephan Aßmus if (fButtonLayout->Orientation() == B_HORIZONTAL) { 141f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 142f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_VERTICAL); 143f32e3a29SStephan Aßmus } else { 144f32e3a29SStephan Aßmus fButtonLayout->SetInsets(7, 2, 2, 2); 145f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_HORIZONTAL); 146f32e3a29SStephan Aßmus } 147f32e3a29SStephan Aßmus break; 1488d186370SStephan Aßmus 149a6099ca9SStephan Aßmus case MSG_SET_ICON_SIZE: 150a6099ca9SStephan Aßmus uint32 size; 151a6099ca9SStephan Aßmus if (message->FindInt32("size", (int32*)&size) == B_OK) 152a6099ca9SStephan Aßmus SetIconSize(size); 153a6099ca9SStephan Aßmus break; 1548d186370SStephan Aßmus 1558d186370SStephan Aßmus case MSG_SET_IGNORE_DOUBLECLICK: 1568d186370SStephan Aßmus SetIgnoreDoubleClick(!IgnoreDoubleClick()); 1578d186370SStephan Aßmus break; 1588d186370SStephan Aßmus 15925648ff0SStephan Aßmus default: 16025648ff0SStephan Aßmus BView::MessageReceived(message); 16125648ff0SStephan Aßmus break; 16225648ff0SStephan Aßmus } 16325648ff0SStephan Aßmus } 16425648ff0SStephan Aßmus 1658d186370SStephan Aßmus 16625648ff0SStephan Aßmus void 16725648ff0SStephan Aßmus PadView::MouseDown(BPoint where) 16825648ff0SStephan Aßmus { 16980e19252SStephan Aßmus BWindow* window = Window(); 17080e19252SStephan Aßmus if (window == NULL) 17180e19252SStephan Aßmus return; 17280e19252SStephan Aßmus 17325648ff0SStephan Aßmus BRegion region; 17425648ff0SStephan Aßmus GetClippingRegion(®ion); 17580e19252SStephan Aßmus if (!region.Contains(where)) 17680e19252SStephan Aßmus return; 17780e19252SStephan Aßmus 17825648ff0SStephan Aßmus bool handle = true; 17925648ff0SStephan Aßmus for (int32 i = 0; BView* child = ChildAt(i); i++) { 18025648ff0SStephan Aßmus if (child->Frame().Contains(where)) { 18125648ff0SStephan Aßmus handle = false; 18225648ff0SStephan Aßmus break; 18325648ff0SStephan Aßmus } 18425648ff0SStephan Aßmus } 18580e19252SStephan Aßmus if (!handle) 18680e19252SStephan Aßmus return; 18780e19252SStephan Aßmus 18880e19252SStephan Aßmus BMessage* message = window->CurrentMessage(); 18980e19252SStephan Aßmus if (message == NULL) 19080e19252SStephan Aßmus return; 19180e19252SStephan Aßmus 19225648ff0SStephan Aßmus uint32 buttons; 19325648ff0SStephan Aßmus message->FindInt32("buttons", (int32*)&buttons); 19425648ff0SStephan Aßmus if (buttons & B_SECONDARY_MOUSE_BUTTON) { 19525648ff0SStephan Aßmus BRect r = Bounds(); 19625648ff0SStephan Aßmus r.InsetBy(2.0, 2.0); 19725648ff0SStephan Aßmus r.top += 6.0; 19825648ff0SStephan Aßmus if (r.Contains(where)) { 19925648ff0SStephan Aßmus DisplayMenu(where); 20025648ff0SStephan Aßmus } else { 20125648ff0SStephan Aßmus // sends the window to the back 20225648ff0SStephan Aßmus window->Activate(false); 20325648ff0SStephan Aßmus } 20425648ff0SStephan Aßmus } else { 205a6099ca9SStephan Aßmus if (system_time() - fClickTime < sActivationDelay) { 20625648ff0SStephan Aßmus window->Minimize(true); 20725648ff0SStephan Aßmus fClickTime = 0; 20825648ff0SStephan Aßmus } else { 20925648ff0SStephan Aßmus window->Activate(); 21025648ff0SStephan Aßmus fDragOffset = ConvertToScreen(where) - window->Frame().LeftTop(); 21125648ff0SStephan Aßmus fDragging = true; 21225648ff0SStephan Aßmus SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); 21325648ff0SStephan Aßmus fClickTime = system_time(); 21425648ff0SStephan Aßmus } 21525648ff0SStephan Aßmus } 21625648ff0SStephan Aßmus } 21725648ff0SStephan Aßmus 2188d186370SStephan Aßmus 21925648ff0SStephan Aßmus void 22025648ff0SStephan Aßmus PadView::MouseUp(BPoint where) 22125648ff0SStephan Aßmus { 22225648ff0SStephan Aßmus if (BWindow* window = Window()) { 22325648ff0SStephan Aßmus uint32 buttons; 22425648ff0SStephan Aßmus window->CurrentMessage()->FindInt32("buttons", (int32*)&buttons); 22525648ff0SStephan Aßmus if (buttons & B_PRIMARY_MOUSE_BUTTON 226a6099ca9SStephan Aßmus && system_time() - fClickTime < sActivationDelay 22725648ff0SStephan Aßmus && window->IsActive()) 22825648ff0SStephan Aßmus window->Activate(); 22925648ff0SStephan Aßmus } 23025648ff0SStephan Aßmus fDragging = false; 23125648ff0SStephan Aßmus } 23225648ff0SStephan Aßmus 2338d186370SStephan Aßmus 23425648ff0SStephan Aßmus void 23525648ff0SStephan Aßmus PadView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) 23625648ff0SStephan Aßmus { 2378eeb005fSStephan Aßmus MainWindow* window = dynamic_cast<MainWindow*>(Window()); 2388eeb005fSStephan Aßmus if (window == NULL) 2398eeb005fSStephan Aßmus return; 2408eeb005fSStephan Aßmus 24125648ff0SStephan Aßmus if (fDragging) { 24225648ff0SStephan Aßmus window->MoveTo(ConvertToScreen(where) - fDragOffset); 24325648ff0SStephan Aßmus } else if (window->AutoRaise()) { 24425648ff0SStephan Aßmus where = ConvertToScreen(where); 24525648ff0SStephan Aßmus BScreen screen(window); 24625648ff0SStephan Aßmus BRect frame = screen.Frame(); 24725648ff0SStephan Aßmus BRect windowFrame = window->Frame(); 24825648ff0SStephan Aßmus if (where.x == frame.left || where.x == frame.right 24925648ff0SStephan Aßmus || where.y == frame.top || where.y == frame.bottom) { 25025648ff0SStephan Aßmus BPoint position = window->ScreenPosition(); 25125648ff0SStephan Aßmus bool raise = false; 25225648ff0SStephan Aßmus if (fabs(0.5 - position.x) > fabs(0.5 - position.y)) { 25325648ff0SStephan Aßmus // left or right border 2548d186370SStephan Aßmus if (where.y >= windowFrame.top 2558d186370SStephan Aßmus && where.y <= windowFrame.bottom) { 25625648ff0SStephan Aßmus if (position.x < 0.5 && where.x == frame.left) 25725648ff0SStephan Aßmus raise = true; 25825648ff0SStephan Aßmus else if (position.x > 0.5 && where.x == frame.right) 25925648ff0SStephan Aßmus raise = true; 26025648ff0SStephan Aßmus } 26125648ff0SStephan Aßmus } else { 26225648ff0SStephan Aßmus // top or bottom border 26325648ff0SStephan Aßmus if (where.x >= windowFrame.left && where.x <= windowFrame.right) { 26425648ff0SStephan Aßmus if (position.y < 0.5 && where.y == frame.top) 26525648ff0SStephan Aßmus raise = true; 266a6099ca9SStephan Aßmus else if (position.y > 0.5 && where.y == frame.bottom) 26725648ff0SStephan Aßmus raise = true; 26825648ff0SStephan Aßmus } 26925648ff0SStephan Aßmus } 27025648ff0SStephan Aßmus if (raise) 27125648ff0SStephan Aßmus window->Activate(); 27225648ff0SStephan Aßmus } 27325648ff0SStephan Aßmus } 27425648ff0SStephan Aßmus } 27525648ff0SStephan Aßmus 2768d186370SStephan Aßmus 27725648ff0SStephan Aßmus void 27825648ff0SStephan Aßmus PadView::AddButton(LaunchButton* button, LaunchButton* beforeButton) 27925648ff0SStephan Aßmus { 280a6099ca9SStephan Aßmus button->SetIconSize(fIconSize); 281a6099ca9SStephan Aßmus 28225648ff0SStephan Aßmus if (beforeButton) 283f32e3a29SStephan Aßmus fButtonLayout->AddView(fButtonLayout->IndexOfView(beforeButton), button); 28425648ff0SStephan Aßmus else 285f32e3a29SStephan Aßmus fButtonLayout->AddView(button); 2869368e58bSStephan Aßmus 2879368e58bSStephan Aßmus _NotifySettingsChanged(); 28825648ff0SStephan Aßmus } 28925648ff0SStephan Aßmus 2908d186370SStephan Aßmus 29125648ff0SStephan Aßmus bool 29225648ff0SStephan Aßmus PadView::RemoveButton(LaunchButton* button) 29325648ff0SStephan Aßmus { 2949368e58bSStephan Aßmus bool result = fButtonLayout->RemoveView(button); 2959368e58bSStephan Aßmus if (result) 2969368e58bSStephan Aßmus _NotifySettingsChanged(); 2979368e58bSStephan Aßmus return result; 29825648ff0SStephan Aßmus } 29925648ff0SStephan Aßmus 3008d186370SStephan Aßmus 30125648ff0SStephan Aßmus LaunchButton* 30225648ff0SStephan Aßmus PadView::ButtonAt(int32 index) const 30325648ff0SStephan Aßmus { 30470e39d09SStephan Aßmus BLayoutItem* item = fButtonLayout->ItemAt(index); 30570e39d09SStephan Aßmus if (item == NULL) 30670e39d09SStephan Aßmus return NULL; 30770e39d09SStephan Aßmus return dynamic_cast<LaunchButton*>(item->View()); 30825648ff0SStephan Aßmus } 30925648ff0SStephan Aßmus 3108d186370SStephan Aßmus 31125648ff0SStephan Aßmus void 31225648ff0SStephan Aßmus PadView::DisplayMenu(BPoint where, LaunchButton* button) const 31325648ff0SStephan Aßmus { 3148eeb005fSStephan Aßmus MainWindow* window = dynamic_cast<MainWindow*>(Window()); 3158eeb005fSStephan Aßmus if (window == NULL) 3168eeb005fSStephan Aßmus return; 3178eeb005fSStephan Aßmus 31825648ff0SStephan Aßmus LaunchButton* nearestButton = button; 31925648ff0SStephan Aßmus if (!nearestButton) { 32025648ff0SStephan Aßmus // find the nearest button 32125648ff0SStephan Aßmus for (int32 i = 0; (nearestButton = ButtonAt(i)); i++) { 32225648ff0SStephan Aßmus if (nearestButton->Frame().top > where.y) 32325648ff0SStephan Aßmus break; 32425648ff0SStephan Aßmus } 32525648ff0SStephan Aßmus } 3260e07d4c0SAdrien Destugues BPopUpMenu* menu = new BPopUpMenu(B_TRANSLATE("launch popup"), false, false); 32725648ff0SStephan Aßmus // add button 32825648ff0SStephan Aßmus BMessage* message = new BMessage(MSG_ADD_SLOT); 32925648ff0SStephan Aßmus message->AddPointer("be:source", (void*)nearestButton); 3300e07d4c0SAdrien Destugues BMenuItem* item = new BMenuItem(B_TRANSLATE("Add button here"), message); 33125648ff0SStephan Aßmus item->SetTarget(window); 33225648ff0SStephan Aßmus menu->AddItem(item); 33325648ff0SStephan Aßmus // button options 33425648ff0SStephan Aßmus if (button) { 3359368e58bSStephan Aßmus // clear button 33625648ff0SStephan Aßmus message = new BMessage(MSG_CLEAR_SLOT); 33725648ff0SStephan Aßmus message->AddPointer("be:source", (void*)button); 3380e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Clear button"), message); 33925648ff0SStephan Aßmus item->SetTarget(window); 34025648ff0SStephan Aßmus menu->AddItem(item); 34125648ff0SStephan Aßmus // remove button 34225648ff0SStephan Aßmus message = new BMessage(MSG_REMOVE_SLOT); 34325648ff0SStephan Aßmus message->AddPointer("be:source", (void*)button); 3440e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Remove button"), message); 34525648ff0SStephan Aßmus item->SetTarget(window); 34625648ff0SStephan Aßmus menu->AddItem(item); 347ac966d59SMatt Madia // Open containing folder button 348ac966d59SMatt Madia if (button->Ref() != NULL) { 349ac966d59SMatt Madia message = new BMessage(MSG_OPEN_CONTAINING_FOLDER); 350ac966d59SMatt Madia message->AddPointer("be:source", (void*)button); 351ac966d59SMatt Madia item = new BMenuItem(B_TRANSLATE("Open containing folder"), message); 352ac966d59SMatt Madia item->SetTarget(window); 353ac966d59SMatt Madia menu->AddItem(item); 354ac966d59SMatt Madia } 3559368e58bSStephan Aßmus // set button description 3569368e58bSStephan Aßmus if (button->Ref()) { 3579368e58bSStephan Aßmus message = new BMessage(MSG_SET_DESCRIPTION); 3589368e58bSStephan Aßmus message->AddPointer("be:source", (void*)button); 3590e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Set description" B_UTF8_ELLIPSIS), 3600e07d4c0SAdrien Destugues message); 3619368e58bSStephan Aßmus item->SetTarget(window); 3629368e58bSStephan Aßmus menu->AddItem(item); 3639368e58bSStephan Aßmus } 36425648ff0SStephan Aßmus } 36525648ff0SStephan Aßmus menu->AddSeparatorItem(); 36625648ff0SStephan Aßmus // window settings 367c16bcdfcSJoachim Seemer BMenu* settingsM = new BMenu(B_TRANSLATE("Settings")); 36825648ff0SStephan Aßmus settingsM->SetFont(be_plain_font); 36925648ff0SStephan Aßmus 370f32e3a29SStephan Aßmus const char* toggleLayoutLabel; 371f32e3a29SStephan Aßmus if (fButtonLayout->Orientation() == B_HORIZONTAL) 3720e07d4c0SAdrien Destugues toggleLayoutLabel = B_TRANSLATE("Vertical layout"); 373f32e3a29SStephan Aßmus else 3740e07d4c0SAdrien Destugues toggleLayoutLabel = B_TRANSLATE("Horizontal layout"); 375f32e3a29SStephan Aßmus item = new BMenuItem(toggleLayoutLabel, new BMessage(MSG_TOGGLE_LAYOUT)); 376f32e3a29SStephan Aßmus item->SetTarget(this); 377f32e3a29SStephan Aßmus settingsM->AddItem(item); 378f32e3a29SStephan Aßmus 3790e07d4c0SAdrien Destugues BMenu* iconSizeM = new BMenu(B_TRANSLATE("Icon size")); 380a6099ca9SStephan Aßmus for (uint32 i = 0; i < sizeof(kIconSizes) / sizeof(uint32); i++) { 381a6099ca9SStephan Aßmus uint32 iconSize = kIconSizes[i]; 382a6099ca9SStephan Aßmus message = new BMessage(MSG_SET_ICON_SIZE); 383a6099ca9SStephan Aßmus message->AddInt32("size", iconSize); 384a6099ca9SStephan Aßmus BString label; 385a6099ca9SStephan Aßmus label << iconSize << " x " << iconSize; 386a6099ca9SStephan Aßmus item = new BMenuItem(label.String(), message); 387a6099ca9SStephan Aßmus item->SetTarget(this); 388a6099ca9SStephan Aßmus item->SetMarked(IconSize() == iconSize); 389a6099ca9SStephan Aßmus iconSizeM->AddItem(item); 390a6099ca9SStephan Aßmus } 391a6099ca9SStephan Aßmus settingsM->AddItem(iconSizeM); 392a6099ca9SStephan Aßmus 3930e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Ignore double-click"), 3948d186370SStephan Aßmus new BMessage(MSG_SET_IGNORE_DOUBLECLICK)); 3958d186370SStephan Aßmus item->SetTarget(this); 3968d186370SStephan Aßmus item->SetMarked(IgnoreDoubleClick()); 3978d186370SStephan Aßmus settingsM->AddItem(item); 3988d186370SStephan Aßmus 39925648ff0SStephan Aßmus uint32 what = window->Look() == B_BORDERED_WINDOW_LOOK ? MSG_SHOW_BORDER : MSG_HIDE_BORDER; 4000e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Show window border"), new BMessage(what)); 40125648ff0SStephan Aßmus item->SetTarget(window); 40225648ff0SStephan Aßmus item->SetMarked(what == MSG_HIDE_BORDER); 40325648ff0SStephan Aßmus settingsM->AddItem(item); 40425648ff0SStephan Aßmus 405*e680a439SYatendra Singh item = new BMenuItem(B_TRANSLATE("Autostart"), new BMessage(MSG_TOGGLE_AUTOSTART)); 406*e680a439SYatendra Singh item->SetTarget(be_app); 407*e680a439SYatendra Singh item->SetMarked(((App*)be_app)->AutoStart()); 408*e680a439SYatendra Singh settingsM->AddItem(item); 409*e680a439SYatendra Singh 4100e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Auto-raise"), new BMessage(MSG_TOGGLE_AUTORAISE)); 41125648ff0SStephan Aßmus item->SetTarget(window); 41225648ff0SStephan Aßmus item->SetMarked(window->AutoRaise()); 41325648ff0SStephan Aßmus settingsM->AddItem(item); 41425648ff0SStephan Aßmus 4150e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Show on all workspaces"), new BMessage(MSG_SHOW_ON_ALL_WORKSPACES)); 41625648ff0SStephan Aßmus item->SetTarget(window); 41725648ff0SStephan Aßmus item->SetMarked(window->ShowOnAllWorkspaces()); 41825648ff0SStephan Aßmus settingsM->AddItem(item); 41925648ff0SStephan Aßmus 42025648ff0SStephan Aßmus menu->AddItem(settingsM); 42125648ff0SStephan Aßmus 42225648ff0SStephan Aßmus menu->AddSeparatorItem(); 42325648ff0SStephan Aßmus 42425648ff0SStephan Aßmus // pad commands 4250e07d4c0SAdrien Destugues BMenu* padM = new BMenu(B_TRANSLATE("Pad")); 42625648ff0SStephan Aßmus padM->SetFont(be_plain_font); 42725648ff0SStephan Aßmus // new pad 4280e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("New"), new BMessage(MSG_ADD_WINDOW)); 42925648ff0SStephan Aßmus item->SetTarget(be_app); 43025648ff0SStephan Aßmus padM->AddItem(item); 43125648ff0SStephan Aßmus // new pad 4320e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Clone"), new BMessage(MSG_ADD_WINDOW)); 43325648ff0SStephan Aßmus item->SetTarget(window); 43425648ff0SStephan Aßmus padM->AddItem(item); 43525648ff0SStephan Aßmus padM->AddSeparatorItem(); 43625648ff0SStephan Aßmus // close 4370e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Close"), new BMessage(B_QUIT_REQUESTED)); 43825648ff0SStephan Aßmus item->SetTarget(window); 43925648ff0SStephan Aßmus padM->AddItem(item); 44025648ff0SStephan Aßmus menu->AddItem(padM); 44125648ff0SStephan Aßmus // app commands 442560ff447SJonas Sundström BMenu* appM = new BMenu(B_TRANSLATE_SYSTEM_NAME("LaunchBox")); 44325648ff0SStephan Aßmus appM->SetFont(be_plain_font); 44425648ff0SStephan Aßmus // quit 4450e07d4c0SAdrien Destugues item = new BMenuItem(B_TRANSLATE("Quit"), new BMessage(B_QUIT_REQUESTED)); 44625648ff0SStephan Aßmus item->SetTarget(be_app); 44725648ff0SStephan Aßmus appM->AddItem(item); 44825648ff0SStephan Aßmus menu->AddItem(appM); 44925648ff0SStephan Aßmus // finish popup 45025648ff0SStephan Aßmus menu->SetAsyncAutoDestruct(true); 45125648ff0SStephan Aßmus menu->SetFont(be_plain_font); 45225648ff0SStephan Aßmus where = ConvertToScreen(where); 45325648ff0SStephan Aßmus BRect mouseRect(where, where); 45425648ff0SStephan Aßmus mouseRect.InsetBy(-4.0, -4.0); 45525648ff0SStephan Aßmus menu->Go(where, true, false, mouseRect, true); 45625648ff0SStephan Aßmus } 45725648ff0SStephan Aßmus 4588d186370SStephan Aßmus 459f32e3a29SStephan Aßmus void 460f32e3a29SStephan Aßmus PadView::SetOrientation(enum orientation orientation) 461f32e3a29SStephan Aßmus { 462f32e3a29SStephan Aßmus if (orientation == B_VERTICAL) { 463f32e3a29SStephan Aßmus fButtonLayout->SetInsets(2, 7, 2, 2); 464f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_VERTICAL); 465f32e3a29SStephan Aßmus } else { 466f32e3a29SStephan Aßmus fButtonLayout->SetInsets(7, 2, 2, 2); 467f32e3a29SStephan Aßmus fButtonLayout->SetOrientation(B_HORIZONTAL); 468f32e3a29SStephan Aßmus } 4699368e58bSStephan Aßmus _NotifySettingsChanged(); 470f32e3a29SStephan Aßmus } 471f32e3a29SStephan Aßmus 4728d186370SStephan Aßmus 473f32e3a29SStephan Aßmus enum orientation 474f32e3a29SStephan Aßmus PadView::Orientation() const 475f32e3a29SStephan Aßmus { 476f32e3a29SStephan Aßmus return fButtonLayout->Orientation(); 477f32e3a29SStephan Aßmus } 478f32e3a29SStephan Aßmus 4798d186370SStephan Aßmus 480a6099ca9SStephan Aßmus void 481a6099ca9SStephan Aßmus PadView::SetIconSize(uint32 size) 482a6099ca9SStephan Aßmus { 483a6099ca9SStephan Aßmus if (size == fIconSize) 484a6099ca9SStephan Aßmus return; 485a6099ca9SStephan Aßmus 486a6099ca9SStephan Aßmus fIconSize = size; 487a6099ca9SStephan Aßmus 488a6099ca9SStephan Aßmus for (int32 i = 0; LaunchButton* button = ButtonAt(i); i++) 489a6099ca9SStephan Aßmus button->SetIconSize(fIconSize); 4909368e58bSStephan Aßmus 4919368e58bSStephan Aßmus _NotifySettingsChanged(); 492a6099ca9SStephan Aßmus } 493a6099ca9SStephan Aßmus 4948d186370SStephan Aßmus 495a6099ca9SStephan Aßmus uint32 496a6099ca9SStephan Aßmus PadView::IconSize() const 497a6099ca9SStephan Aßmus { 498a6099ca9SStephan Aßmus return fIconSize; 499a6099ca9SStephan Aßmus } 500a6099ca9SStephan Aßmus 501f32e3a29SStephan Aßmus 5028d186370SStephan Aßmus void 5038d186370SStephan Aßmus PadView::SetIgnoreDoubleClick(bool refuse) 5048d186370SStephan Aßmus { 5058d186370SStephan Aßmus LaunchButton::SetIgnoreDoubleClick(refuse); 5069368e58bSStephan Aßmus 5079368e58bSStephan Aßmus _NotifySettingsChanged(); 5088d186370SStephan Aßmus } 5098d186370SStephan Aßmus 5108d186370SStephan Aßmus 5118d186370SStephan Aßmus bool 5128d186370SStephan Aßmus PadView::IgnoreDoubleClick() const 5138d186370SStephan Aßmus { 5148d186370SStephan Aßmus return LaunchButton::IgnoreDoubleClick(); 5158d186370SStephan Aßmus } 5168d186370SStephan Aßmus 5178d186370SStephan Aßmus 5189368e58bSStephan Aßmus void 5199368e58bSStephan Aßmus PadView::_NotifySettingsChanged() 5209368e58bSStephan Aßmus { 5219368e58bSStephan Aßmus be_app->PostMessage(MSG_SETTINGS_CHANGED); 5229368e58bSStephan Aßmus }