1/* 2 * Copyright 2007, Ingo Weinhold <bonefish@cs.tu-berlin.de>. 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5 6#include "MenuFieldTest.h" 7 8#include <stdio.h> 9 10#include <Menu.h> 11#include <MenuField.h> 12#include <MenuItem.h> 13 14#include "CheckBox.h" 15#include "GroupView.h" 16 17 18enum { 19 MSG_CHANGE_LABEL_TEXT = 'chlt', 20 MSG_CHANGE_LABEL_FONT = 'chlf', 21 MSG_CHANGE_MENU_TEXT = 'chmt' 22}; 23 24 25// constructor 26MenuFieldTest::MenuFieldTest() 27 : ControlTest("MenuField"), 28 fLongLabelTextCheckBox(NULL), 29 fLongMenuTextCheckBox(NULL), 30 fBigFontCheckBox(NULL), 31 fDefaultFont(NULL), 32 fBigFont(NULL) 33{ 34 BMenu* menu = new BMenu("The Menu"); 35 36 // add a few items 37 for (int32 i = 0; i < 10; i++) { 38 BString itemText("Menu item "); 39 itemText << i; 40 menu->AddItem(new BMenuItem(itemText.String(), NULL)); 41 } 42 43 fMenuField = new BMenuField("", menu); 44 45 SetView(fMenuField); 46} 47 48 49// destructor 50MenuFieldTest::~MenuFieldTest() 51{ 52 delete fDefaultFont; 53 delete fBigFont; 54} 55 56 57// CreateTest 58Test* 59MenuFieldTest::CreateTest() 60{ 61 return new MenuFieldTest; 62} 63 64 65// ActivateTest 66void 67MenuFieldTest::ActivateTest(View* controls) 68{ 69 GroupView* group = new GroupView(B_VERTICAL); 70 group->SetFrame(controls->Bounds()); 71 group->SetSpacing(0, 8); 72 controls->AddChild(group); 73 74 // BMenuField sets its background color to that of its parent in 75 // AttachedToWindow(). Override. 76 rgb_color background = ui_color(B_PANEL_BACKGROUND_COLOR); 77 fMenuField->SetViewColor(background); 78 fMenuField->SetLowColor(background); 79 80 // long label text 81 fLongLabelTextCheckBox = new LabeledCheckBox("Long label text", 82 new BMessage(MSG_CHANGE_LABEL_TEXT), this); 83 group->AddChild(fLongLabelTextCheckBox); 84 85 // long menu text 86 fLongMenuTextCheckBox = new LabeledCheckBox("Long menu text", 87 new BMessage(MSG_CHANGE_MENU_TEXT), this); 88 group->AddChild(fLongMenuTextCheckBox); 89 90 // big font 91 fBigFontCheckBox = new LabeledCheckBox("Big label font", 92 new BMessage(MSG_CHANGE_LABEL_FONT), this); 93 group->AddChild(fBigFontCheckBox); 94 95 _UpdateLabelText(); 96 _UpdateLabelFont(); 97 98 group->AddChild(new Glue()); 99} 100 101 102// DectivateTest 103void 104MenuFieldTest::DectivateTest() 105{ 106} 107 108 109// MessageReceived 110void 111MenuFieldTest::MessageReceived(BMessage* message) 112{ 113 switch (message->what) { 114 case MSG_CHANGE_LABEL_TEXT: 115 _UpdateLabelText(); 116 break; 117 case MSG_CHANGE_MENU_TEXT: 118 _UpdateMenuText(); 119 break; 120 case MSG_CHANGE_LABEL_FONT: 121 _UpdateLabelFont(); 122 break; 123 default: 124 Test::MessageReceived(message); 125 break; 126 } 127} 128 129 130// _UpdateLabelText 131void 132MenuFieldTest::_UpdateLabelText() 133{ 134 if (!fLongLabelTextCheckBox || !fMenuField) 135 return; 136 137 fMenuField->SetLabel(fLongLabelTextCheckBox->IsSelected() 138 ? "Pretty long menu field label" 139 : "Short label"); 140} 141 142 143// _UpdateMenuText 144void 145MenuFieldTest::_UpdateMenuText() 146{ 147 if (!fLongMenuTextCheckBox || !fMenuField) 148 return; 149 150 fMenuField->Menu()->Superitem()->SetLabel( 151 fLongMenuTextCheckBox->IsSelected() 152 ? "Pretty long menu field text" 153 : "Short text"); 154} 155 156 157// _UpdateLabelFont 158void 159MenuFieldTest::_UpdateLabelFont() 160{ 161 if (!fBigFontCheckBox || !fMenuField || !fMenuField->Window()) 162 return; 163 164 // get default font lazily 165 if (!fDefaultFont) { 166 fDefaultFont = new BFont; 167 fMenuField->GetFont(fDefaultFont); 168 169 fBigFont = new BFont(fDefaultFont); 170 fBigFont->SetSize(20); 171 } 172 173 // set font 174 fMenuField->SetFont(fBigFontCheckBox->IsSelected() 175 ? fBigFont : fDefaultFont); 176 fMenuField->InvalidateLayout(); 177 fMenuField->Invalidate(); 178} 179