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