1/* 2 * Copyright 2014, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include <Alert.h> 8#include <Application.h> 9#include <Button.h> 10#include <LayoutBuilder.h> 11#include <MenuField.h> 12#include <Slider.h> 13#include <String.h> 14#include <StringView.h> 15#include <Window.h> 16 17#include <stdio.h> 18 19 20const uint32 kMsgShowAlert = 'shAl'; 21 22 23// #pragma mark - 24 25 26class Window : public BWindow { 27public: 28 Window(); 29 30 virtual void MessageReceived(BMessage* message); 31 virtual bool QuitRequested(); 32 33private: 34 button_width _ButtonWidth(); 35 button_spacing _ButtonSpacing(); 36 alert_type _AlertType(); 37 38private: 39 BMenuField* fSizeField; 40 BMenuField* fTypeField; 41 BMenuField* fSpacingField; 42 BSlider* fCountSlider; 43 BStringView* fLastStringView; 44}; 45 46 47Window::Window() 48 : 49 BWindow(BRect(100, 100, 620, 200), "Alert-Test", B_TITLED_WINDOW, 50 B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS) 51{ 52 BMenu* sizeMenu = new BMenu("Button size"); 53 sizeMenu->SetLabelFromMarked(true); 54 sizeMenu->SetRadioMode(true); 55 sizeMenu->AddItem(new BMenuItem("As usual", NULL)); 56 sizeMenu->AddItem(new BMenuItem("From widest", NULL)); 57 sizeMenu->AddItem(new BMenuItem("From label", NULL)); 58 sizeMenu->ItemAt(0)->SetMarked(true); 59 fSizeField = new BMenuField("Button size", sizeMenu); 60 61 BMenu* typeMenu = new BMenu("Alert type"); 62 typeMenu->SetLabelFromMarked(true); 63 typeMenu->SetRadioMode(true); 64 typeMenu->AddItem(new BMenuItem("Empty", NULL)); 65 typeMenu->AddItem(new BMenuItem("Info", NULL)); 66 typeMenu->AddItem(new BMenuItem("Idea", NULL)); 67 typeMenu->AddItem(new BMenuItem("Warning", NULL)); 68 typeMenu->AddItem(new BMenuItem("Stop", NULL)); 69 typeMenu->ItemAt(0)->SetMarked(true); 70 fTypeField = new BMenuField("Alert type", typeMenu); 71 72 BMenu* spacingMenu = new BMenu("Button spacing"); 73 spacingMenu->SetLabelFromMarked(true); 74 spacingMenu->SetRadioMode(true); 75 spacingMenu->AddItem(new BMenuItem("Even", NULL)); 76 spacingMenu->AddItem(new BMenuItem("Offset", NULL)); 77 spacingMenu->ItemAt(0)->SetMarked(true); 78 fSpacingField = new BMenuField("Button spacing", spacingMenu); 79 80 fCountSlider = new BSlider("count", "Button count", NULL, 1, 3, 81 B_HORIZONTAL); 82 fCountSlider->SetValue(3); 83 fCountSlider->SetLimitLabels("1", "3"); 84 fCountSlider->SetHashMarkCount(3); 85 fCountSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); 86 87 fLastStringView = new BStringView("last pressed", ""); 88 fLastStringView->SetAlignment(B_ALIGN_CENTER); 89 90 BButton* button = new BButton("Show alert", new BMessage(kMsgShowAlert)); 91 92 BLayoutBuilder::Group<>(this, B_VERTICAL) 93 .Add(fSizeField) 94 .Add(fTypeField) 95 .Add(fSpacingField) 96 .Add(fCountSlider) 97 .AddGlue() 98 .Add(fLastStringView) 99 .Add(button) 100 .SetInsets(B_USE_DEFAULT_SPACING); 101 102 CenterOnScreen(); 103 SetFlags(Flags() | B_CLOSE_ON_ESCAPE); 104} 105 106 107void 108Window::MessageReceived(BMessage* message) 109{ 110 switch (message->what) { 111 case kMsgShowAlert: 112 { 113 int32 count = fCountSlider->Value(); 114 115 BAlert* alert = new BAlert("Test title", "Lorem ipsum dolor sit " 116 "amet, consectetur adipiscing elit. Suspendisse vel iaculis " 117 "quam. Donec faucibus erat nunc, ac ullamcorper justo sodales.", 118 "short 1", count > 1 ? "a bit longer 2" : NULL, 119 count > 2 ? "very very long button 3" : NULL, 120 _ButtonWidth(), _ButtonSpacing(), _AlertType()); 121 alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); 122 int result = alert->Go(); 123 if (result < 0) { 124 fLastStringView->SetText("Canceled alert"); 125 } else { 126 fLastStringView->SetText(BString().SetToFormat( 127 "Pressed button %d", result + 1).String()); 128 } 129 break; 130 } 131 default: 132 BWindow::MessageReceived(message); 133 } 134} 135 136 137bool 138Window::QuitRequested() 139{ 140 be_app->PostMessage(B_QUIT_REQUESTED); 141 return true; 142} 143 144 145button_width 146Window::_ButtonWidth() 147{ 148 switch (fSizeField->Menu()->FindMarkedIndex()) { 149 case 0: 150 default: 151 return B_WIDTH_AS_USUAL; 152 case 1: 153 return B_WIDTH_FROM_WIDEST; 154 case 2: 155 return B_WIDTH_FROM_LABEL; 156 } 157} 158 159 160button_spacing 161Window::_ButtonSpacing() 162{ 163 return (button_spacing)fSpacingField->Menu()->FindMarkedIndex(); 164} 165 166 167alert_type 168Window::_AlertType() 169{ 170 return (alert_type)fTypeField->Menu()->FindMarkedIndex(); 171} 172 173 174// #pragma mark - 175 176 177class Application : public BApplication { 178public: 179 Application(); 180 181 virtual void ReadyToRun(); 182}; 183 184 185Application::Application() 186 : 187 BApplication("application/x-vnd.haiku-AlertTest") 188{ 189} 190 191 192void 193Application::ReadyToRun(void) 194{ 195 BWindow* window = new Window(); 196 window->Show(); 197} 198 199 200// #pragma mark - 201 202 203int 204main(int argc, char** argv) 205{ 206 Application app; 207 208 app.Run(); 209 return 0; 210} 211