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