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