1 /* 2 * Copyright 2009-2012, Axel Dörfler, axeld@pinc-software.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include <Application.h> 8 #include <Box.h> 9 #include <GroupView.h> 10 #include <LayoutBuilder.h> 11 #include <MessageRunner.h> 12 #include <String.h> 13 #include <StringView.h> 14 #include <Window.h> 15 16 #include <ToolTip.h> 17 18 #include <stdio.h> 19 20 21 class CustomToolTip : public BToolTip { 22 public: 23 CustomToolTip(const char* text) 24 { 25 fView = new BStringView("", text); 26 fView->SetFont(be_bold_font); 27 fView->SetHighColor(255, 0, 0); 28 } 29 30 virtual ~CustomToolTip() 31 { 32 delete fView; 33 } 34 35 virtual BView* View() const 36 { 37 return fView; 38 } 39 40 private: 41 BStringView* fView; 42 }; 43 44 45 class ChangingView : public BStringView { 46 public: 47 ChangingView() 48 : 49 BStringView("changing", ""), 50 fNumber(0) 51 { 52 } 53 54 virtual ~ChangingView() 55 { 56 } 57 58 virtual void AttachedToWindow() 59 { 60 BStringView::AttachedToWindow(); 61 62 BMessage update('updt'); 63 fRunner = new BMessageRunner(this, &update, 100000); 64 } 65 66 virtual void DetachedFromWindow() 67 { 68 delete fRunner; 69 } 70 71 virtual void MessageReceived(BMessage* message) 72 { 73 if (message->what == 'updt') { 74 char text[42]; 75 snprintf(text, sizeof(text), "%d", ++fNumber); 76 SetText(text); 77 } 78 } 79 80 private: 81 BMessageRunner* fRunner; 82 int fNumber; 83 }; 84 85 86 class ChangingToolTip : public BToolTip { 87 public: 88 ChangingToolTip() 89 { 90 fView = new ChangingView(); 91 fView->SetFont(be_bold_font); 92 } 93 94 virtual ~ChangingToolTip() 95 { 96 delete fView; 97 } 98 99 virtual BView* View() const 100 { 101 return fView; 102 } 103 104 private: 105 BStringView* fView; 106 }; 107 108 109 class MouseView : public BStringView { 110 public: 111 MouseView() 112 : 113 BStringView("mouse", "x:y") 114 { 115 } 116 117 virtual ~MouseView() 118 { 119 } 120 121 virtual void AttachedToWindow() 122 { 123 BStringView::AttachedToWindow(); 124 SetEventMask(B_POINTER_EVENTS, 0); 125 } 126 127 virtual void MouseMoved(BPoint where, uint32 transit, 128 const BMessage* dragMessage) 129 { 130 ConvertToScreen(&where); 131 132 char text[42]; 133 snprintf(text, sizeof(text), "%g:%g", where.x, where.y); 134 SetText(text); 135 } 136 }; 137 138 139 class MouseToolTip : public BToolTip { 140 public: 141 MouseToolTip() 142 { 143 fView = new MouseView(); 144 SetSticky(true); 145 } 146 147 virtual ~MouseToolTip() 148 { 149 delete fView; 150 } 151 152 virtual BView* View() const 153 { 154 return fView; 155 } 156 157 private: 158 BStringView* fView; 159 }; 160 161 162 class ImmediateView : public BStringView { 163 public: 164 ImmediateView(const char* name, const char* label) 165 : 166 BStringView(name, label) 167 { 168 SetToolTip("Easy but immediate!"); 169 ToolTip()->SetSticky(true); 170 } 171 172 virtual void MouseMoved(BPoint where, uint32 transit, 173 const BMessage* dragMessage) 174 { 175 if (transit == B_ENTERED_VIEW) 176 ShowToolTip(ToolTip()); 177 } 178 }; 179 180 181 class PulseStringView : public BStringView { 182 public: 183 PulseStringView(const char* name, const char* label) 184 : 185 BStringView(name, label, B_WILL_DRAW | B_PULSE_NEEDED) 186 { 187 } 188 189 virtual void Pulse() 190 { 191 char buffer[256]; 192 time_t now = time(NULL); 193 strftime(buffer, sizeof(buffer), "%X", localtime(&now)); 194 SetToolTip(buffer); 195 } 196 }; 197 198 199 class PulseToolTipView : public BStringView { 200 public: 201 PulseToolTipView(const char* name, const char* label) 202 : 203 BStringView(name, label, B_WILL_DRAW | B_PULSE_NEEDED), 204 fToolTip(NULL), 205 fCounter(0) 206 { 207 } 208 209 virtual void Pulse() 210 { 211 if (fToolTip != NULL) 212 fToolTip->ReleaseReference(); 213 214 BString text; 215 text.SetToFormat("New tool tip every second! (%d)", fCounter++); 216 217 fToolTip = new CustomToolTip(text.String()); 218 SetToolTip(fToolTip); 219 } 220 221 private: 222 BToolTip* fToolTip; 223 int fCounter; 224 }; 225 226 227 class Window : public BWindow { 228 public: 229 Window(); 230 231 virtual bool QuitRequested(); 232 }; 233 234 235 class Application : public BApplication { 236 public: 237 Application(); 238 239 virtual void ReadyToRun(); 240 }; 241 242 243 // #pragma mark - 244 245 246 Window::Window() 247 : 248 BWindow(BRect(100, 100, 520, 430), "ToolTip-Test", 249 B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS) 250 { 251 BView* simple = new BStringView("1", "Simple Tool Tip"); 252 simple->SetToolTip("This is a really\nsimple tool tip!"); 253 254 BView* custom = new BStringView("2", "Custom Tool Tip"); 255 custom->SetToolTip(new CustomToolTip("Custom tool tip!")); 256 257 BView* changing = new BStringView("3", "Changing Tool Tip"); 258 changing->SetToolTip(new ChangingToolTip()); 259 260 BView* mouse = new BStringView("4", "Mouse Tool Tip (sticky)"); 261 mouse->SetToolTip(new MouseToolTip()); 262 263 BView* immediate = new ImmediateView("5", "Immediate Tool Tip (sticky)"); 264 265 BView* pulseString = new PulseStringView("pulseString", 266 "Periodically changing tool tip text"); 267 268 BView* pulseToolTip = new PulseToolTipView("pulseToolTip", 269 "Periodically changing tool tip"); 270 271 BGroupView* nested = new BGroupView(); 272 nested->SetViewColor(50, 50, 90); 273 nested->GroupLayout()->SetInsets(30); 274 nested->SetToolTip("The outer view has a tool tip,\n" 275 "the inner one doesn't."); 276 nested->AddChild(new BGroupView("inner")); 277 278 BLayoutBuilder::Group<>(this, B_HORIZONTAL) 279 .SetInsets(B_USE_DEFAULT_SPACING) 280 .AddGroup(B_VERTICAL) 281 .Add(simple) 282 .Add(custom) 283 .Add(changing) 284 .Add(mouse) 285 .Add(immediate) 286 .End() 287 .AddGroup(B_VERTICAL) 288 .Add(pulseString) 289 .Add(pulseToolTip) 290 .Add(nested); 291 292 SetPulseRate(1000000LL); 293 } 294 295 296 bool 297 Window::QuitRequested() 298 { 299 be_app->PostMessage(B_QUIT_REQUESTED); 300 return true; 301 } 302 303 304 // #pragma mark - 305 306 307 Application::Application() 308 : 309 BApplication("application/x-vnd.haiku-tooltiptest") 310 { 311 } 312 313 314 void 315 Application::ReadyToRun() 316 { 317 BWindow *window = new Window(); 318 window->Show(); 319 } 320 321 322 // #pragma mark - 323 324 325 int 326 main(int argc, char **argv) 327 { 328 Application app; 329 330 app.Run(); 331 return 0; 332 } 333 334