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