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 20 static const uint32 kMsgPointerEvents = 'pevt'; 21 static const rgb_color kPermanentColor = { 130, 130, 220}; 22 static const rgb_color kPressedColor = { 220, 120, 120}; 23 24 25 class 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 44 PositionView::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 53 PositionView::~PositionView() 54 { 55 } 56 57 58 void 59 PositionView::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 76 void 77 PositionView::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 111 void 112 PositionView::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 124 void 125 PositionView::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 139 void 140 PositionView::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 153 class 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 166 Window::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->SetViewColor(ui_color(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 211 Window::~Window() 212 { 213 } 214 215 216 bool 217 Window::QuitRequested() 218 { 219 be_app->PostMessage(B_QUIT_REQUESTED); 220 return true; 221 } 222 223 224 void 225 Window::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 248 class Application : public BApplication { 249 public: 250 Application(); 251 252 virtual void ReadyToRun(void); 253 }; 254 255 256 Application::Application() 257 : BApplication("application/x-vnd.haiku-view_state") 258 { 259 } 260 261 262 void 263 Application::ReadyToRun(void) 264 { 265 Window *window = new Window(); 266 window->Show(); 267 } 268 269 270 // #pragma mark - 271 272 273 int 274 main(int argc, char **argv) 275 { 276 Application app;// app; 277 278 app.Run(); 279 return 0; 280 } 281