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
20 const uint32 kMsgShowAlert = 'shAl';
21
22
23 // #pragma mark -
24
25
26 class Window : public BWindow {
27 public:
28 Window();
29
30 virtual void MessageReceived(BMessage* message);
31 virtual bool QuitRequested();
32
33 private:
34 button_width _ButtonWidth();
35 button_spacing _ButtonSpacing();
36 alert_type _AlertType();
37
38 private:
39 BMenuField* fSizeField;
40 BMenuField* fTypeField;
41 BMenuField* fSpacingField;
42 BSlider* fCountSlider;
43 BStringView* fLastStringView;
44 };
45
46
Window()47 Window::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
107 void
MessageReceived(BMessage * message)108 Window::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
137 bool
QuitRequested()138 Window::QuitRequested()
139 {
140 be_app->PostMessage(B_QUIT_REQUESTED);
141 return true;
142 }
143
144
145 button_width
_ButtonWidth()146 Window::_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
160 button_spacing
_ButtonSpacing()161 Window::_ButtonSpacing()
162 {
163 return (button_spacing)fSpacingField->Menu()->FindMarkedIndex();
164 }
165
166
167 alert_type
_AlertType()168 Window::_AlertType()
169 {
170 return (alert_type)fTypeField->Menu()->FindMarkedIndex();
171 }
172
173
174 // #pragma mark -
175
176
177 class Application : public BApplication {
178 public:
179 Application();
180
181 virtual void ReadyToRun();
182 };
183
184
Application()185 Application::Application()
186 :
187 BApplication("application/x-vnd.haiku-AlertTest")
188 {
189 }
190
191
192 void
ReadyToRun(void)193 Application::ReadyToRun(void)
194 {
195 BWindow* window = new Window();
196 window->Show();
197 }
198
199
200 // #pragma mark -
201
202
203 int
main(int argc,char ** argv)204 main(int argc, char** argv)
205 {
206 Application app;
207
208 app.Run();
209 return 0;
210 }
211