* Copyright 2009, Haiku Inc.
* Distributed under the terms of the MIT License.
*
* Authors:
* Axel DΓΆrfler, axeld@pinc-software.de
*/
#include <stdlib.h>
#include <Application.h>
#include <MessageRunner.h>
#include <Window.h>
#include <View.h>
#include <WindowPrivate.h>
class ShowInvalidationView : public BView {
public:
ShowInvalidationView(BRect rect);
virtual ~ShowInvalidationView();
virtual void Draw(BRect updateRect);
};
class ShowingWindow : public BWindow {
public:
ShowingWindow();
};
class ChangingWindow : public BWindow {
public:
ChangingWindow();
virtual ~ChangingWindow();
virtual void MessageReceived(BMessage* message);
private:
BMessageRunner* fRunner;
};
class Application : public BApplication {
public:
Application();
virtual void ReadyToRun();
};
ShowInvalidationView::ShowInvalidationView(BRect rect)
:
BView(rect, "show invalidation", B_FOLLOW_ALL, B_WILL_DRAW)
{
SetViewColor(B_TRANSPARENT_COLOR);
}
ShowInvalidationView::~ShowInvalidationView()
{
}
void
ShowInvalidationView::Draw(BRect updateRect)
{
SetHighColor(rand() % 256, rand() % 256, rand() % 256);
FillRect(updateRect);
}
ShowingWindow::ShowingWindow()
:
BWindow(BRect(150, 150, 450, 450), "WindowInvalidation-Test",
B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE)
{
BView* view = new ShowInvalidationView(Bounds());
AddChild(view);
}
ChangingWindow::ChangingWindow()
:
BWindow(BRect(150, 150, 400, 400), "WindowInvalidation-Test",
B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE)
{
BMessage message('actn');
fRunner = new BMessageRunner(this, &message, 25000);
}
ChangingWindow::~ChangingWindow()
{
delete fRunner;
}
void
ChangingWindow::MessageReceived(BMessage* message)
{
if (message->what == 'actn') {
switch (rand() % 4) {
case 0:
{
BRect bounds;
do {
bounds = Bounds();
bounds.right += rand() % 21 - 10;
bounds.bottom += rand() % 21 - 10;
} while (bounds.Width() > 400 || bounds.Height() > 400
|| bounds.Width() < 50 || bounds.Height() < 50);
ResizeTo(bounds.Width() + 1, bounds.Height() + 1);
break;
}
case 1:
{
BPoint leftTop;
do {
leftTop = Frame().LeftTop();
leftTop.x += rand() % 21 - 10;
leftTop.y += rand() % 21 - 10;
} while (!BRect(100, 100, 200, 200).Contains(leftTop));
MoveTo(leftTop);
break;
}
case 2:
{
static const char* kChoices[]
= {"Window", "Invalidation", "Test", "Hooray"};
SetTitle(kChoices[rand() % (sizeof(kChoices) / sizeof(char*))]);
break;
}
case 3:
{
static const window_look kLooks[]
= {B_TITLED_WINDOW_LOOK, B_DOCUMENT_WINDOW_LOOK,
B_FLOATING_WINDOW_LOOK, kLeftTitledWindowLook};
SetLook(kLooks[rand() % (sizeof(kLooks) / sizeof(kLooks[0]))]);
break;
}
}
} else
BWindow::MessageReceived(message);
}
Application::Application()
:
BApplication("application/x-vnd.haiku-view_state")
{
}
void
Application::ReadyToRun()
{
BWindow* window = new ChangingWindow();
window->Show();
window = new ShowingWindow();
window->Show();
}
int
main(int argc, char** argv)
{
Application app;
app.Run();
return 0;
}