xref: /haiku/src/apps/launchbox/PadView.cpp (revision 8d1863708046e19583d17c048b0ca3c7058d98fb)
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(&region);
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