2 * Copyright 2005-2008, Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
6 * <unknown, please fill in who knows>
15 #define TOGGLE_TRIGGERS 'tgtr'
16 #define ALT_COMMAND 'acmd'
17 #define CTRL_COMMAND 'ccmd'
18 #define SET_FONT_SIZE 'sfsz'
19 #define SET_DEFAULTS 'sdef'
20 #define REVERT_SETTINGS 'rvst'
23 MenuView::MenuView(BRect frame
, const char *name
, int32 resize
, int32 flags
)
24 : BView(frame
, name
, resize
, flags
)
26 SetViewUIColor(B_PANEL_BACKGROUND_COLOR
);
28 get_menu_info(&menuinfo
);
29 revertinfo
= menuinfo
;
32 fontmenu
= new FontMenu
;
33 fontmenu
->SetLabelFromMarked(true);
37 fontsizemenu
= new BMenu("");
38 fontsizemenu
->SetLabelFromMarked(true);
43 msg
= new BMessage(SET_FONT_SIZE
);
44 msg
->AddInt32("size", 10);
45 item
= new BMenuItem("10", msg
);
46 fontsizemenu
->AddItem(item
);
48 msg
= new BMessage(SET_FONT_SIZE
);
49 msg
->AddInt32("size", 11);
50 item
= new BMenuItem("11", msg
);
51 fontsizemenu
->AddItem(item
);
53 msg
= new BMessage(SET_FONT_SIZE
);
54 msg
->AddInt32("size", 12);
55 item
= new BMenuItem("12", msg
);
56 fontsizemenu
->AddItem(item
);
58 msg
= new BMessage(SET_FONT_SIZE
);
59 msg
->AddInt32("size", 14);
60 item
= new BMenuItem("14", msg
);
61 fontsizemenu
->AddItem(item
);
63 msg
= new BMessage(SET_FONT_SIZE
);
64 msg
->AddInt32("size", 18);
65 item
= new BMenuItem("18", msg
);
66 fontsizemenu
->AddItem(item
);
68 msg
= new BMessage(SET_FONT_SIZE
);
69 msg
->AddInt32("size", 20);
70 item
= new BMenuItem("20", msg
);
71 fontsizemenu
->AddItem(item
);
73 msg
= new BMessage(SET_FONT_SIZE
);
74 msg
->AddInt32("size", 22);
75 item
= new BMenuItem("22", msg
);
76 fontsizemenu
->AddItem(item
);
78 msg
= new BMessage(SET_FONT_SIZE
);
79 msg
->AddInt32("size", 24);
80 item
= new BMenuItem("24", msg
);
81 fontsizemenu
->AddItem(item
);
83 switch((int32
)menuinfo
.font_size
)
86 item
= fontsizemenu
->FindItem("10");
90 item
= fontsizemenu
->FindItem("11");
94 item
= fontsizemenu
->FindItem("12");
98 item
= fontsizemenu
->FindItem("14");
102 item
= fontsizemenu
->FindItem("18");
106 item
= fontsizemenu
->FindItem("20");
110 item
= fontsizemenu
->FindItem("22");
114 item
= fontsizemenu
->FindItem("24");
119 char fontsizestr
[10];
120 sprintf(fontsizestr
, "%ld", (int32
)menuinfo
.font_size
);
121 msg
= new BMessage(SET_FONT_SIZE
);
122 msg
->AddInt32("size", (int32
)menuinfo
.font_size
);
123 item
= new BMenuItem(fontsizestr
,msg
);
124 fontsizemenu
->AddItem(item
);
128 item
->SetMarked(true);
130 BRect
r(10, 10, 210, 40);
131 r
.OffsetTo((Bounds().Width() - r
.Width()) / 2, 10);
132 fontfield
=new BMenuField(r
, "fontfield", "", fontmenu
);
133 fontfield
->SetLabel("Font:");
134 fontfield
->SetDivider(StringWidth("Font:") + 5);
137 r
.OffsetTo((Bounds().Width() - r
.Width()) / 2, fontfield
->Frame().bottom
+ 10);
138 fontsizefield
=new BMenuField(r
, "fontsizefield", "", fontsizemenu
);
139 fontsizefield
->SetLabel("Font Size:");
140 fontsizefield
->SetDivider(StringWidth("Font Size:") + 5);
141 AddChild(fontsizefield
);
143 r
.OffsetTo(10, fontsizefield
->Frame().bottom
+ 10);
145 showtriggers
= new BCheckBox(r
, "showtriggers", "Always Show Triggers",
146 new BMessage(TOGGLE_TRIGGERS
));
147 showtriggers
->ResizeToPreferred();
148 showtriggers
->MoveTo((Bounds().Width() - showtriggers
->Bounds().Width()) / 2, r
.top
);
149 AddChild(showtriggers
);
150 if (menuinfo
.triggers_always_shown
)
151 showtriggers
->SetValue(B_CONTROL_ON
);
153 r
.bottom
= r
.top
+ 75;
154 r
.OffsetTo((Bounds().Width() - r
.Width()) / 2, showtriggers
->Frame().bottom
+ 10);
155 BBox
*radiobox
= new BBox(r
, "radiobox");
156 radiobox
->SetLabel("Shortcut Key");
159 r
.Set(10, 20, 50, 30);
160 altcmd
= new BRadioButton(r
, "altcommand", "Alt", new BMessage(ALT_COMMAND
));
161 altcmd
->ResizeToPreferred();
162 radiobox
->AddChild(altcmd
);
165 ctrlcmd
= new BRadioButton(r
, "ctrlcommand", "Control", new BMessage(CTRL_COMMAND
));
166 ctrlcmd
->ResizeToPreferred();
167 radiobox
->AddChild(ctrlcmd
);
170 revertaltcmd
= altcommand
;
172 defaultsbutton
= new BButton(r
, "defaultsbutton", "Defaults", new BMessage(SET_DEFAULTS
));
173 defaultsbutton
->ResizeToPreferred();
175 revertbutton
= new BButton(r
, "revertbutton", "Revert", new BMessage(REVERT_SETTINGS
));
176 revertbutton
->ResizeToPreferred();
178 defaultsbutton
->MoveTo( (Bounds().Width() -
179 (defaultsbutton
->Bounds().Width() + revertbutton
->Bounds().Width() + 10)) / 2,
180 radiobox
->Frame().bottom
+ 20);
181 revertbutton
->MoveTo(defaultsbutton
->Frame().right
+ 10, radiobox
->Frame().bottom
+ 20);
183 AddChild(defaultsbutton
);
184 AddChild(revertbutton
);
185 revertbutton
->SetEnabled(false);
189 MenuView::~MenuView(void)
195 MenuView::AttachedToWindow(void)
197 for(int32 i
= 0; i
< fontmenu
->CountItems(); i
++) {
198 BMenu
*menu
= fontmenu
->SubmenuAt(i
);
200 menu
->SetTargetForItems(this);
202 fontmenu
->SetTargetForItems(this);
203 fontsizemenu
->SetTargetForItems(this);
204 showtriggers
->SetTarget(this);
205 altcmd
->SetTarget(this);
206 ctrlcmd
->SetTarget(this);
207 defaultsbutton
->SetTarget(this);
208 revertbutton
->SetTarget(this);
213 MenuView::MessageReceived(BMessage
*msg
)
216 case B_MODIFIERS_CHANGED
:
220 case MENU_FONT_FAMILY
:
221 case MENU_FONT_STYLE
:
224 revertbutton
->SetEnabled(true);
227 msg
->FindPointer("family", (void**)&family
);
229 msg
->FindPointer("style", (void**)&style
);
230 menuinfo
.f_family
= *family
;
231 menuinfo
.f_style
= *style
;
232 set_menu_info(&menuinfo
);
240 revertbutton
->SetEnabled(true);
243 msg
->FindInt32("size", &size
);
244 menuinfo
.font_size
= size
;
245 set_menu_info(&menuinfo
);
251 revertbutton
->SetEnabled(true);
254 SetCommandKey(altcommand
);
259 revertbutton
->SetEnabled(true);
262 SetCommandKey(altcommand
);
265 case TOGGLE_TRIGGERS
:
267 revertbutton
->SetEnabled(true);
269 menuinfo
.triggers_always_shown
= (showtriggers
->Value() == B_CONTROL_ON
);
270 set_menu_info(&menuinfo
);
273 case REVERT_SETTINGS
:
275 revertbutton
->SetEnabled(false);
276 SetCommandKey(revertaltcmd
);
277 altcommand
= revertaltcmd
;
279 menuinfo
= revertinfo
;
281 showtriggers
->SetValue(menuinfo
.triggers_always_shown
? B_CONTROL_ON
: B_CONTROL_OFF
);
282 set_menu_info(&revertinfo
);
287 revertbutton
->SetEnabled(true);
290 menuinfo
.triggers_always_shown
= false;
291 menuinfo
.font_size
= 12.0;
292 sprintf(menuinfo
.f_family
, "%s", "Swis721 BT");
293 sprintf(menuinfo
.f_style
, "%s", "Roman");
294 set_menu_info(&menuinfo
);
298 SetCommandKey(altcommand
);
300 showtriggers
->SetValue(menuinfo
.triggers_always_shown
? B_CONTROL_ON
: B_CONTROL_OFF
);
304 BView::MessageReceived(msg
);
311 MenuView::MarkCommandKey(void)
316 get_key_map(&keys
, &chars
);
318 bool altAsShortcut
= (keys
->left_command_key
== 0x5d)
319 && (keys
->left_control_key
== 0x5c);
325 altcmd
->SetValue(B_CONTROL_ON
);
327 ctrlcmd
->SetValue(B_CONTROL_ON
);
332 MenuView::SetCommandKey(bool useAlt
)
335 set_modifier_key(B_LEFT_COMMAND_KEY
, 0x5d);
336 set_modifier_key(B_LEFT_CONTROL_KEY
, 0x5c);
338 set_modifier_key(B_LEFT_COMMAND_KEY
, 0x5c);
339 set_modifier_key(B_LEFT_CONTROL_KEY
, 0x5d);
341 be_roster
->Broadcast(new BMessage(B_MODIFIERS_CHANGED
));