1 /* 2 * Copyright 2009, Stephan Aßmus <superstippi@gmx.de>. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #include <Application.h> 7 #include <Box.h> 8 #include <Button.h> 9 #include <ChannelSlider.h> 10 #include <CheckBox.h> 11 #include <ColorControl.h> 12 #include <ColumnListView.h> 13 #include <ColumnTypes.h> 14 #include <ControlLook.h> 15 #include <FilePanel.h> 16 #include <LayoutBuilder.h> 17 #include <ListView.h> 18 #include <MenuBar.h> 19 #include <MenuField.h> 20 #include <MenuItem.h> 21 #include <OptionControl.h> 22 #include <OutlineListView.h> 23 #include <PopUpMenu.h> 24 #include <RadioButton.h> 25 #include <ScrollBar.h> 26 #include <ScrollView.h> 27 #include <Slider.h> 28 #include <SpaceLayoutItem.h> 29 #include <StatusBar.h> 30 #include <StringView.h> 31 #include <TabView.h> 32 #include <TextControl.h> 33 #include <TextView.h> 34 #include <Window.h> 35 36 37 static const float kInset = 8.0f; 38 39 40 template <class ControlType> 41 void 42 add_controls(BGridLayout* layout, int32& row) 43 { 44 ControlType* control1 = new ControlType("Enabled", NULL); 45 ControlType* control2 = new ControlType("Disabled", NULL); 46 control2->SetEnabled(false); 47 ControlType* control3 = new ControlType("Enabled", NULL); 48 control3->SetValue(B_CONTROL_ON); 49 ControlType* control4 = new ControlType("Disabled", NULL); 50 control4->SetValue(B_CONTROL_ON); 51 control4->SetEnabled(false); 52 53 control1->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET)); 54 control2->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET)); 55 control3->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET)); 56 control4->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET)); 57 58 layout->AddView(control1, 0, row); 59 layout->AddView(control2, 1, row); 60 layout->AddView(control3, 2, row); 61 layout->AddView(control4, 3, row); 62 63 row++; 64 } 65 66 67 #define USE_LAYOUT_ITEMS 0 68 69 70 void 71 add_menu_fields(BGridLayout* layout, int32& row) 72 { 73 BPopUpMenu* menu1 = new BPopUpMenu("Selection"); 74 BMenuField* control1 = new BMenuField("Enabled", menu1); 75 BPopUpMenu* menu2 = new BPopUpMenu("Selection"); 76 BMenuField* control2 = new BMenuField("Disabled", menu2); 77 control2->SetEnabled(false); 78 79 #if USE_LAYOUT_ITEMS 80 layout->AddItem(control1->CreateLabelLayoutItem(), 0, row); 81 layout->AddItem(control1->CreateMenuBarLayoutItem(), 1, row); 82 layout->AddItem(control2->CreateLabelLayoutItem(), 2, row); 83 layout->AddItem(control2->CreateMenuBarLayoutItem(), 3, row); 84 #else 85 layout->AddView(control1, 0, row, 2); 86 layout->AddView(control2, 2, row, 2); 87 #endif 88 89 row++; 90 } 91 92 93 void 94 add_text_controls(BGridLayout* layout, int32& row) 95 { 96 BTextControl* control1 = new BTextControl("Enabled", "Some text", NULL); 97 BTextControl* control2 = new BTextControl("Disabled", "More text", NULL); 98 control2->SetEnabled(false); 99 100 #if USE_LAYOUT_ITEMS 101 layout->AddItem(control1->CreateLabelLayoutItem(), 0, row); 102 layout->AddItem(control1->CreateTextViewLayoutItem(), 1, row); 103 layout->AddItem(control2->CreateLabelLayoutItem(), 2, row); 104 layout->AddItem(control2->CreateTextViewLayoutItem(), 3, row); 105 #else 106 layout->AddView(control1, 0, row, 2); 107 layout->AddView(control2, 2, row, 2); 108 #endif 109 110 row++; 111 } 112 113 114 void 115 add_sliders(BGridLayout* layout, int32& row) 116 { 117 BSlider* control1 = new BSlider("slider 1", "Enabled", NULL, 1, 100, 118 B_HORIZONTAL); 119 BSlider* control2 = new BSlider("slider 2", "Disabled", NULL, 1, 100, 120 B_HORIZONTAL); 121 control2->SetEnabled(false); 122 123 control1->SetHashMarkCount(10); 124 control1->SetHashMarks(B_HASH_MARKS_BOTTOM); 125 control2->SetHashMarkCount(10); 126 control2->SetHashMarks(B_HASH_MARKS_BOTTOM); 127 128 layout->AddView(control1, 0, row, 2); 129 layout->AddView(control2, 2, row, 2); 130 131 row++; 132 133 control1 = new BSlider("slider 3", "Enabled", NULL, 1, 100, 134 B_HORIZONTAL, B_TRIANGLE_THUMB); 135 control2 = new BSlider("slider 4", "Disabled", NULL, 1, 100, 136 B_HORIZONTAL, B_TRIANGLE_THUMB); 137 control2->SetEnabled(false); 138 139 rgb_color fillColor = (rgb_color){ 255, 115, 0, 255 }; 140 141 control1->SetLimitLabels("Min", "Max"); 142 control1->UseFillColor(true, &fillColor); 143 control1->SetValue(20); 144 145 control2->SetLimitLabels("1", "100"); 146 control2->UseFillColor(true, &fillColor); 147 control2->SetValue(10); 148 149 layout->AddView(control1, 0, row, 2); 150 layout->AddView(control2, 2, row, 2); 151 152 row++; 153 } 154 155 156 void 157 add_status_bars(BGridLayout* layout, int32& row) 158 { 159 BBox* box = new BBox(B_FANCY_BORDER, NULL); 160 box->SetLabel("Info"); 161 162 BGroupLayout* boxLayout = new BGroupLayout(B_VERTICAL, kInset); 163 boxLayout->SetInsets(kInset, kInset + box->TopBorderOffset(), kInset, 164 kInset); 165 box->SetLayout(boxLayout); 166 167 BStatusBar* statusBar = new BStatusBar("status bar", "Status", 168 "Completed"); 169 statusBar->SetMaxValue(100); 170 statusBar->SetTo(0); 171 statusBar->SetBarHeight(12); 172 boxLayout->AddView(statusBar); 173 174 statusBar = new BStatusBar("status bar", "Progress", 175 "Completed"); 176 statusBar->SetMaxValue(100); 177 statusBar->SetTo(40); 178 statusBar->SetBarHeight(12); 179 boxLayout->AddView(statusBar); 180 181 statusBar = new BStatusBar("status bar", "Lifespan of capitalism", 182 "Completed"); 183 statusBar->SetMaxValue(100); 184 statusBar->SetTo(100); 185 statusBar->SetBarHeight(12); 186 boxLayout->AddView(statusBar); 187 188 layout->AddView(box, 0, row, 4); 189 190 row++; 191 } 192 193 194 enum { 195 MSG_TEST_OPEN_FILE_PANEL = 'tofp', 196 MSG_TEST_SAVE_FILE_PANEL = 'tsfp', 197 MSG_TOGGLE_LOOK = 'tggl' 198 }; 199 200 201 class Window : public BWindow { 202 public: 203 Window(BRect frame, const char* title, window_type type, uint32 flags) 204 : BWindow(frame, title, type, flags) 205 { 206 fControlLook = NULL; 207 } 208 ~Window() 209 { 210 if (fControlLook != NULL) 211 be_control_look = fControlLook; 212 } 213 214 virtual void MessageReceived(BMessage* message) 215 { 216 switch (message->what) { 217 case MSG_TEST_OPEN_FILE_PANEL: 218 { 219 BFilePanel* panel = new BFilePanel(); 220 panel->Show(); 221 } 222 break; 223 case MSG_TEST_SAVE_FILE_PANEL: 224 { 225 BFilePanel* panel = new BFilePanel(B_SAVE_PANEL); 226 panel->Show(); 227 } 228 break; 229 case MSG_TOGGLE_LOOK: 230 { 231 BControlLook* temp = fControlLook; 232 fControlLook = be_control_look; 233 be_control_look = temp; 234 _InvalidateChildrenAndView(ChildAt(0)); 235 } 236 break; 237 238 default: 239 BWindow::MessageReceived(message); 240 } 241 } 242 243 private: 244 void _InvalidateChildrenAndView(BView* view) 245 { 246 for (int32 i = 0; BView* child = view->ChildAt(i); i++) 247 _InvalidateChildrenAndView(child); 248 view->Invalidate(); 249 } 250 251 private: 252 BControlLook* fControlLook; 253 }; 254 255 256 int 257 main(int argc, char** argv) 258 { 259 BApplication app("application/x-vnd.haiku-look"); 260 261 BWindow* window = new Window(BRect(50, 50, 100, 100), 262 "Look at these pretty controls!", B_TITLED_WINDOW, 263 B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS 264 | B_QUIT_ON_WINDOW_CLOSE); 265 266 window->SetLayout(new BGroupLayout(B_HORIZONTAL)); 267 268 // create some controls 269 270 // BListView 271 BListView* listView = new BListView(); 272 for (int32 i = 0; i < 20; i++) { 273 BString itemLabel("List item "); 274 itemLabel << i + 1; 275 listView->AddItem(new BStringItem(itemLabel.String())); 276 } 277 BScrollView* scrollView = new BScrollView("scroller", listView, 0, 278 true, true); 279 scrollView->SetExplicitMinSize(BSize(300, 140)); 280 281 // BColumnListView 282 BColumnListView* columnListView = new BColumnListView("clv", 0, 283 B_FANCY_BORDER); 284 // B_PLAIN_BORDER); 285 // B_NO_BORDER); 286 287 columnListView->AddColumn(new BTitledColumn("Short", 288 150, 50, 500, B_ALIGN_LEFT), 0); 289 columnListView->AddColumn(new BTitledColumn("Medium Length", 290 100, 50, 500, B_ALIGN_CENTER), 1); 291 columnListView->AddColumn(new BTitledColumn("Some Long Column Name", 292 130, 50, 500, B_ALIGN_RIGHT), 2); 293 294 // for (int32 i = 0; i < 20; i++) { 295 // BString itemLabel("List Item "); 296 // itemLabel << i + 1; 297 // columnListView->AddItem(new BStringItem(itemLabel.String())); 298 // } 299 300 301 BGridView* controls = new BGridView(kInset, kInset); 302 BGridLayout* layout = controls->GridLayout(); 303 controls->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED)); 304 305 int32 row = 0; 306 add_controls<BButton>(layout, row); 307 add_controls<BCheckBox>(layout, row); 308 add_controls<BRadioButton>(layout, row); 309 add_menu_fields(layout, row); 310 add_text_controls(layout, row); 311 add_sliders(layout, row); 312 add_status_bars(layout, row); 313 314 BColorControl* colorControl = new BColorControl(B_ORIGIN, B_CELLS_32x8, 315 8.0f, "color control"); 316 layout->AddView(colorControl, 0, row, 4); 317 318 BTabView* tabView = new BTabView("tab view", B_WIDTH_FROM_WIDEST); 319 BGroupView* content = new BGroupView(B_VERTICAL, kInset); 320 BLayoutBuilder::Group<>(content) 321 .Add(scrollView) 322 .Add(columnListView) 323 .Add(controls) 324 .SetInsets(kInset, kInset, kInset, kInset); 325 326 content->SetName("Tab 1"); 327 328 tabView->AddTab(content); 329 BView* tab2 = new BView("Tab 2", 0); 330 tab2->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 331 tabView->AddTab(tab2); 332 tabView->AddTab(new BView("Tab 3", 0)); 333 334 BMenuBar* menuBar = new BMenuBar("menu bar"); 335 BMenu* menu = new BMenu("File"); 336 menu->AddItem(new BMenuItem("Test Open BFilePanel", 337 new BMessage(MSG_TEST_OPEN_FILE_PANEL))); 338 menu->AddItem(new BMenuItem("Test Save BFilePanel", 339 new BMessage(MSG_TEST_SAVE_FILE_PANEL))); 340 menu->AddItem(new BMenuItem("Click me!", NULL)); 341 menu->AddItem(new BMenuItem("Another option", NULL)); 342 menu->AddSeparatorItem(); 343 menu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED))); 344 menuBar->AddItem(menu); 345 menu = new BMenu("Edit"); 346 menu->SetEnabled(false); 347 menu->AddItem(new BMenuItem("Cut", NULL)); 348 menu->AddItem(new BMenuItem("Copy", NULL)); 349 menu->AddSeparatorItem(); 350 menu->AddItem(new BMenuItem("Past", NULL)); 351 menuBar->AddItem(menu); 352 menu = new BMenu("One Item"); 353 menu->AddItem(new BMenuItem("Only", NULL)); 354 menuBar->AddItem(menu); 355 menu = new BMenu("Sub Menu"); 356 BMenu* subMenu = new BMenu("Click me"); 357 subMenu->AddItem(new BMenuItem("Either", NULL)); 358 subMenu->AddItem(new BMenuItem("Or", NULL)); 359 subMenu->SetRadioMode(true); 360 menu->AddItem(subMenu); 361 menuBar->AddItem(menu); 362 363 BButton* okButton = new BButton("OK", new BMessage(B_QUIT_REQUESTED)); 364 365 BLayoutBuilder::Group<>(window, B_VERTICAL, 0) 366 .Add(menuBar) 367 .AddGroup(B_VERTICAL, kInset) 368 .SetInsets(kInset, kInset, kInset, kInset) 369 .Add(tabView) 370 .AddGroup(B_HORIZONTAL, kInset) 371 .Add(new BButton("Revert", new BMessage(MSG_TOGGLE_LOOK))) 372 .AddGlue() 373 .Add(new BButton("Cancel", NULL)) 374 .Add(okButton); 375 376 window->SetDefaultButton(okButton); 377 378 window->Show(); 379 app.Run(); 380 return 0; 381 } 382 383