1/*
2 * Copyright 2005, Haiku Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Axel D��rfler, axeld@pinc-software.de
7 */
8
9
10#include <Application.h>
11#include <Box.h>
12#include <CheckBox.h>
13#include <String.h>
14#include <TextControl.h>
15#include <Window.h>
16
17#include <stdio.h>
18
19
20static const uint32 kMsgPointerEvents = 'pevt';
21static const rgb_color kPermanentColor = { 130, 130, 220};
22static const rgb_color kPressedColor = { 220, 120, 120};
23
24
25class PositionView : public BBox {
26	public:
27		PositionView(BRect rect, uint32 options);
28		virtual ~PositionView();
29
30		void SetPermanent(bool permanent);
31
32		virtual void Draw(BRect updateRect);
33		virtual void MouseDown(BPoint where);
34		virtual void MouseUp(BPoint where);
35		virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage);
36
37	private:
38		bool	fPermanent;
39		uint32	fOptions;
40		BPoint	fPosition;
41};
42
43
44PositionView::PositionView(BRect rect, uint32 options)
45	: BBox(rect, "event mask", B_FOLLOW_ALL, B_WILL_DRAW),
46	fPermanent(false),
47	fOptions(options),
48	fPosition(-1, -1)
49{
50}
51
52
53PositionView::~PositionView()
54{
55}
56
57
58void
59PositionView::SetPermanent(bool permanent)
60{
61	if (permanent) {
62		SetEventMask(B_POINTER_EVENTS, 0);
63		SetViewColor(kPermanentColor);
64	} else {
65		SetEventMask(0, 0);
66		SetViewColor(Parent()->ViewColor());
67	}
68
69	fPermanent = permanent;
70
71	SetLowColor(ViewColor());
72	Invalidate();
73}
74
75
76void
77PositionView::Draw(BRect updateRect)
78{
79	BBox::Draw(updateRect);
80
81	BString type;
82	if (fOptions & B_SUSPEND_VIEW_FOCUS) {
83		type << "suspend";
84		if (fOptions & ~B_SUSPEND_VIEW_FOCUS)
85			type << " & ";
86	}
87	if (fOptions & B_LOCK_WINDOW_FOCUS)
88		type << "lock";
89	if (fOptions == 0)
90		type << "none";
91
92	DrawString(type.String(), BPoint(6, 14));
93
94	BString position;
95	if (fPosition.x >= 0)
96		position << (int32)fPosition.x;
97	else
98		position << "-";
99
100	position << " : ";
101
102	if (fPosition.y >= 0)
103		position << (int32)fPosition.y;
104	else
105		position << "-";
106
107	DrawString(position.String(), BPoint(6, 28));
108}
109
110
111void
112PositionView::MouseDown(BPoint where)
113{
114	if (fOptions != 0)
115		SetMouseEventMask(B_POINTER_EVENTS, fOptions);
116
117	SetViewColor(kPressedColor);
118	SetLowColor(ViewColor());
119	fPosition = where;
120	Invalidate();
121}
122
123
124void
125PositionView::MouseUp(BPoint where)
126{
127	if (fPermanent) {
128		SetViewColor(kPermanentColor);
129	} else {
130		SetViewColor(Parent()->ViewColor());
131	}
132
133	SetLowColor(ViewColor());
134	fPosition = where;
135	Invalidate();
136}
137
138
139void
140PositionView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
141{
142	fPosition = where;
143
144	BRect rect = Bounds().InsetByCopy(5, 5);
145	rect.bottom = 33;
146	Invalidate(rect);
147}
148
149
150//	#pragma mark -
151
152
153class Window : public BWindow {
154	public:
155		Window();
156		virtual ~Window();
157
158		virtual bool QuitRequested();
159		virtual void MessageReceived(BMessage* message);
160
161	private:
162		PositionView* fViews[4];
163};
164
165
166Window::Window()
167	: BWindow(BRect(100, 100, 590, 260), "EventMask-Test",
168			B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_NOT_RESIZABLE | B_NOT_ZOOMABLE)
169{
170	BView* view = new BView(Bounds(), NULL, B_FOLLOW_ALL, B_WILL_DRAW);
171	view->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
172	AddChild(view);
173
174	BTextControl* textControl = new BTextControl(BRect(10, 10, 290, 30),
175		"text", "Type to test focus suspending:", "", NULL, B_FOLLOW_LEFT_RIGHT);
176	textControl->SetDivider(textControl->StringWidth(textControl->Label()) + 8);
177	view->AddChild(textControl);
178
179	textControl = new BTextControl(BRect(300, 10, 420, 30),
180		"all", "All keys:", "", NULL, B_FOLLOW_LEFT_RIGHT);
181	textControl->SetDivider(textControl->StringWidth(textControl->Label()) + 8);
182	view->AddChild(textControl);
183	textControl->TextView()->SetEventMask(B_KEYBOARD_EVENTS, 0);
184
185	BRect rect(10, 40, 120, 120);
186	for (int32 i = 0; i < 4; i++) {
187		uint32 options = 0;
188		switch (i) {
189			case 1:
190				options = B_SUSPEND_VIEW_FOCUS;
191				break;
192			case 2:
193				options = B_LOCK_WINDOW_FOCUS;
194				break;
195			case 3:
196				options = B_SUSPEND_VIEW_FOCUS | B_LOCK_WINDOW_FOCUS;
197				break;
198		}
199
200		fViews[i] = new PositionView(rect, options);
201		view->AddChild(fViews[i]);
202
203		rect.OffsetBy(120, 0);
204	}
205
206	BCheckBox* checkBox = new BCheckBox(BRect(10, 130, 200, 160), "permanent", "Get all pointer events", new BMessage(kMsgPointerEvents));
207	view->AddChild(checkBox);
208}
209
210
211Window::~Window()
212{
213}
214
215
216bool
217Window::QuitRequested()
218{
219	be_app->PostMessage(B_QUIT_REQUESTED);
220	return true;
221}
222
223
224void
225Window::MessageReceived(BMessage* message)
226{
227	switch (message->what) {
228		case kMsgPointerEvents:
229		{
230			bool selected = message->FindInt32("be:value") != 0;
231
232			for (int32 i = 0; i < 4; i++) {
233				fViews[i]->SetPermanent(selected);
234			}
235			break;
236		}
237
238		default:
239			BWindow::MessageReceived(message);
240			break;
241	}
242}
243
244
245//	#pragma mark -
246
247
248class Application : public BApplication {
249	public:
250		Application();
251
252		virtual void ReadyToRun(void);
253};
254
255
256Application::Application()
257	: BApplication("application/x-vnd.haiku-view_state")
258{
259}
260
261
262void
263Application::ReadyToRun(void)
264{
265	Window *window = new Window();
266	window->Show();
267}
268
269
270//	#pragma mark -
271
272
273int
274main(int argc, char **argv)
275{
276	Application app;// app;
277
278	app.Run();
279	return 0;
280}
281