xref: /haiku/src/tests/servers/app/window_invalidation/WindowInvalidation.cpp (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
1 /*
2  * Copyright 2009, 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 <stdlib.h>
11 
12 #include <Application.h>
13 #include <MessageRunner.h>
14 #include <Window.h>
15 #include <View.h>
16 
17 #include <WindowPrivate.h>
18 
19 
20 class ShowInvalidationView : public BView {
21 public:
22 							ShowInvalidationView(BRect rect);
23 	virtual					~ShowInvalidationView();
24 
25 	virtual void			Draw(BRect updateRect);
26 };
27 
28 
29 class ShowingWindow : public BWindow {
30 public:
31 							ShowingWindow();
32 };
33 
34 
35 class ChangingWindow : public BWindow {
36 public:
37 							ChangingWindow();
38 	virtual					~ChangingWindow();
39 
40 	virtual void			MessageReceived(BMessage* message);
41 
42 private:
43 			BMessageRunner*	fRunner;
44 };
45 
46 
47 class Application : public BApplication {
48 public:
49 							Application();
50 
51 	virtual void			ReadyToRun();
52 };
53 
54 
55 ShowInvalidationView::ShowInvalidationView(BRect rect)
56 	:
57 	BView(rect, "show invalidation", B_FOLLOW_ALL, B_WILL_DRAW)
58 {
59 	SetViewColor(B_TRANSPARENT_COLOR);
60 }
61 
62 
63 ShowInvalidationView::~ShowInvalidationView()
64 {
65 }
66 
67 
68 void
69 ShowInvalidationView::Draw(BRect updateRect)
70 {
71 	SetHighColor(rand() % 256, rand() % 256, rand() % 256);
72 	FillRect(updateRect);
73 }
74 
75 
76 //	#pragma mark -
77 
78 
79 ShowingWindow::ShowingWindow()
80 	:
81 	BWindow(BRect(150, 150, 450, 450), "WindowInvalidation-Test",
82 		B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE)
83 {
84 	BView* view = new ShowInvalidationView(Bounds());
85 	AddChild(view);
86 }
87 
88 
89 //	#pragma mark -
90 
91 
92 ChangingWindow::ChangingWindow()
93 	:
94 	BWindow(BRect(150, 150, 400, 400), "WindowInvalidation-Test",
95 		B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE)
96 {
97 	BMessage message('actn');
98 	fRunner = new BMessageRunner(this, &message, 25000);
99 }
100 
101 
102 ChangingWindow::~ChangingWindow()
103 {
104 	delete fRunner;
105 }
106 
107 
108 void
109 ChangingWindow::MessageReceived(BMessage* message)
110 {
111 	if (message->what == 'actn') {
112 		switch (rand() % 4) {
113 			case 0:
114 			{
115 				// resize window
116 				BRect bounds;
117 				do {
118 					bounds = Bounds();
119 					bounds.right += rand() % 21 - 10;
120 					bounds.bottom += rand() % 21 - 10;
121 				} while (bounds.Width() > 400 || bounds.Height() > 400
122 					|| bounds.Width() < 50 || bounds.Height() < 50);
123 
124 				ResizeTo(bounds.Width() + 1, bounds.Height() + 1);
125 				break;
126 			}
127 
128 			case 1:
129 			{
130 				// move window
131 				BPoint leftTop;
132 				do {
133 					leftTop = Frame().LeftTop();
134 					leftTop.x += rand() % 21 - 10;
135 					leftTop.y += rand() % 21 - 10;
136 				} while (!BRect(100, 100, 200, 200).Contains(leftTop));
137 
138 				MoveTo(leftTop);
139 				break;
140 			}
141 
142 			case 2:
143 			{
144 				// set title
145 				static const char* kChoices[]
146 					= {"Window", "Invalidation", "Test", "Hooray"};
147 
148 				SetTitle(kChoices[rand() % (sizeof(kChoices) / sizeof(char*))]);
149 				break;
150 			}
151 
152 			case 3:
153 			{
154 				// change look
155 				static const window_look kLooks[]
156 					= {B_TITLED_WINDOW_LOOK, B_DOCUMENT_WINDOW_LOOK,
157 						B_FLOATING_WINDOW_LOOK, kLeftTitledWindowLook};
158 
159 				SetLook(kLooks[rand() % (sizeof(kLooks) / sizeof(kLooks[0]))]);
160 				break;
161 			}
162 		}
163 	} else
164 		BWindow::MessageReceived(message);
165 }
166 
167 
168 //	#pragma mark -
169 
170 
171 Application::Application()
172 	:
173 	BApplication("application/x-vnd.haiku-view_state")
174 {
175 }
176 
177 
178 void
179 Application::ReadyToRun()
180 {
181 	BWindow* window = new ChangingWindow();
182 	window->Show();
183 
184 	window = new ShowingWindow();
185 	window->Show();
186 }
187 
188 
189 //	#pragma mark -
190 
191 
192 int
193 main(int argc, char** argv)
194 {
195 	Application app;
196 	app.Run();
197 
198 	return 0;
199 }
200