This source file includes following definitions.
- AddHItem
- AddHItem
- CalcWidth
- NavEnter
- NavEscape
- DrawItem
- KeyDown
- Invoke
- NavEnter
- NavEscape
- MakeFocus
- NavChangeCursor
- Show
- OpenVMenu
- CloseVMenu
- MessageReceived
- BF_GUI_TopMenu_Run
1 #include <stdio.h>
2
3 #include "BF_Dict.h"
4 #include "BF_GUI_TopMenu.h"
5 #include "BF_GUI_WinMain.h"
6 #include "BF_GUI_Func.h"
7
8 BF_GUI_TopMenu* poTopMenu = NULL;
9
10
11 BF_GUI_TopMenu_HItem::BF_GUI_TopMenu_HItem(
12 const char *pc_Title,
13 BBitmap *po_SIcon)
14 :BF_GUI_ViewMenu_Item(pc_Title,"",po_SIcon)
15 {
16
17 }
18
19 void
20 BF_GUI_TopMenu_HItem::AddHItem(
21 const char *pc_Title,
22 int32 i_MessageWhat,
23 BView *po_Owner,
24 const char *pc_KeyLabel)
25 {
26 BMessage *poMessage = new BMessage(i_MessageWhat);
27 poMessage->AddPointer("bf_view",po_Owner);
28 AddHItem(pc_Title,poMessage,pc_KeyLabel);
29 }
30
31 void
32 BF_GUI_TopMenu_HItem::AddHItem(
33 const char *pc_Title,
34 BMessage *po_Message,
35 const char *pc_KeyLabel)
36 {
37 BF_GUI_TopMenu_VItem *po = new BF_GUI_TopMenu_VItem(pc_Title,po_Message,pc_KeyLabel);
38 loVItem.AddItem(po);
39 }
40
41 BF_GUI_TopMenu_VItem::BF_GUI_TopMenu_VItem(
42 const char *pc_Title,
43 BMessage *po_Message,
44 const char *pc_KeyLabel
45 ):BF_GUI_ViewMenu_Item(pc_Title,"",NULL)
46 {
47 sKeyLabel = pc_KeyLabel;
48 poMessage = po_Message;
49 }
50
51 BF_GUI_TopMenu_VItem::~BF_GUI_TopMenu_VItem()
52 {
53 if(poMessage) DELETE(poMessage);
54 }
55
56 float
57 BF_GUI_TopMenu_VItem::CalcWidth(BF_GUI_Setup_Font * po_Font)
58 {
59 BF_GUI_ViewMenu_Item::CalcWidth(po_Font);
60 fWidth += 20;
61 fKeyWidth = po_Font->oFont.StringWidth(sKeyLabel.String());
62 fWidth += fKeyWidth;
63
64 return fWidth;
65 }
66
67 BF_GUI_TopVMenu::BF_GUI_TopVMenu(BRect & o_Rect,BL_List *plo_Menu,BF_GUI_TopMenu *po_HMenu)
68 :BF_GUI_DlgView_VMenu(o_Rect,"",B_FOLLOW_ALL,plo_Menu,BF_GUI_DLGVIEW_VMENU_DEFAULT)
69 {
70 bDestroyMenu = false;
71 ASSERT(po_HMenu && plo_Menu);
72 poHMenu = po_HMenu;
73 }
74
75 void
76 BF_GUI_TopVMenu::NavEnter()
77 {
78 BF_GUI_ViewMenu_Item *poItem = (BF_GUI_ViewMenu_Item*)ploMenu->ItemAt(iNavCursorIndex);
79 if(!poItem) return;
80
81
82 BMessenger oMessenger(poHMenu);
83 BMessage oMessage(BF_MSG_TOPMENU_HCLOSE);
84 oMessage.AddBool("bf_bOk",true);
85 oMessage.AddString("bf_Code",poItem->sCode.String());
86 oMessenger.SendMessage(&oMessage);
87 }
88
89 void
90 BF_GUI_TopVMenu::NavEscape()
91 {
92 BMessenger oMessenger(poHMenu);
93 BMessage oMessage(BF_MSG_TOPMENU_HCLOSE);
94 oMessage.AddBool("bf_bOk",false);
95 oMessenger.SendMessage(&oMessage);
96 }
97
98 void
99 BF_GUI_TopVMenu::DrawItem(BView *po_Render,int32 i_Index,bool b_ReqDrawBack)
100 {
101 BF_GUI_DlgView_VMenu::DrawItem(po_Render,i_Index,b_ReqDrawBack);
102
103 BF_GUI_TopMenu_VItem *po;
104 po = (BF_GUI_TopMenu_VItem*)ploMenu->ItemAt(i_Index);
105 ASSERT(po);
106
107 if(po->sTitle!="" && po->sKeyLabel!=""){
108 BPoint oPoint(0,0);
109 BRect oRect(po_Render->Bounds());
110 oPoint.y += ((float)(i_Index-iFirstIndex)) * Height();
111 oPoint.x = oRect.Width()-po->fKeyWidth;
112 oPoint.y += poFont->fAscent;
113 po_Render->DrawString(po->sKeyLabel.String(),oPoint);
114 }
115 }
116
117 void
118 BF_GUI_TopVMenu::KeyDown(const char *bytes, int32 numBytes)
119 {
120
121 if(numBytes==1 && (bytes[0]==B_RIGHT_ARROW || bytes[0]==B_LEFT_ARROW)){
122 BMessage oMsg(BF_MSG_TOPMENU_HCLOSE);
123 oMsg.AddInt8("key",(const int8)bytes[0]);
124 BMessenger oMessenger(poHMenu);
125 oMessenger.SendMessage(&oMsg);
126 }else
127 BF_GUI_DlgView_VMenu::KeyDown(bytes,numBytes);
128 }
129
130
131 BF_GUI_TopMenu::BF_GUI_TopMenu(
132 const BRect &o_Rect,
133 BL_List *plo_HItem )
134 :BF_GUI_DlgView_HMenu(o_Rect,"top_menu",BG_GUI_DIALOG_WINRESIZE_RESIZE_ALL,plo_HItem)
135 {
136 poTopMenu = this;
137 poParent = NULL;
138 poVMenu = NULL;
139 bItemsInCenter = false;
140 bHideCursorOnDefocus = false;
141 iHCursor = -1;
142 }
143
144 void
145 BF_GUI_TopMenu::Invoke(bool b_Ok)
146 {
147 if(poVMenu) return;
148
149 BF_GUI_Func_PanelsEnable(true);
150
151 poParent->MakeFocus();
152
153 if(b_Ok){
154 BF_GUI_TopMenu_HItem *poHItem = (BF_GUI_TopMenu_HItem*)ploMenu->ItemAt(iNavCursorIndex);
155 ASSERT(poHItem);
156 BF_GUI_TopMenu_VItem *poVItem = (BF_GUI_TopMenu_VItem*)poHItem->loVItem.ItemAt(iHCursor);
157 ASSERT(poVItem);
158
159 if(poVItem->poMessage){
160 BView *poView = NULL;
161 ASSERT(B_OK==poVItem->poMessage->FindPointer("bf_view",(void**)&poView) && poView);
162 BMessenger oMessenger(poView);
163 oMessenger.SendMessage(poVItem->poMessage);
164 }
165 }
166 Parent()->RemoveChild(this);
167 delete this;
168 }
169
170 void
171 BF_GUI_TopMenu::NavEnter()
172 {
173 Invoke(true);
174 }
175
176 void
177 BF_GUI_TopMenu::NavEscape()
178 {
179 Invoke(false);
180 }
181
182 void
183 BF_GUI_TopMenu::MakeFocus(bool b_Focused)
184 {
185 if(!b_Focused && !poVMenu){
186 Hide();
187 }
188 BF_GUI_DlgView_HMenu::MakeFocus(b_Focused);
189 }
190
191 void
192 BF_GUI_TopMenu::NavChangeCursor(int32 i_NewCursor,int i_DirectMove,bool b_Redraw)
193 {
194 CloseVMenu();
195 BF_GUI_DlgView_HMenu::NavChangeCursor(i_NewCursor,i_DirectMove,b_Redraw);
196 if(IsHidden()) return;
197 OpenVMenu();
198 }
199
200 void
201 BF_GUI_TopMenu::Show(void)
202 {
203 BF_GUI_DlgView_HMenu::Show();
204 OpenVMenu();
205 }
206
207 void
208 BF_GUI_TopMenu::OpenVMenu(bool b_FocusHMenu)
209 {
210 if(poVMenu) return;
211 printf("OpenVMenu()\n");
212
213 BF_GUI_TopMenu_HItem *poHItem = (BF_GUI_TopMenu_HItem*)ploMenu->ItemAt( iNavCursorIndex );
214 if(!poHItem) return;
215
216 BView *poParent = Parent();
217 ASSERT(poParent);
218
219 BRect oRect(CalcItemXPos(iNavCursorIndex),Frame().bottom+1,0,0);
220
221 poVMenuPanel = new BF_GUI_DlgPanel(oRect,"","dlg",B_FOLLOW_NONE,0,false);
222 poVMenuPanel->SetSizeBy(
223 BF_GUI_ViewMenu_CalcMaxWidth(&poHItem->loVItem,&poSysSetup->oFontToolView,false),
224 5+poSysSetup->oFontToolView.fHeight*(poHItem->loVItem.CountItems() )
225 );
226 poVMenuPanel->LocalBounds(oRect);
227
228 poVMenu = new BF_GUI_TopVMenu(oRect,&poHItem->loVItem,this);
229
230 poVMenuPanel->AddChild(poVMenu);
231
232 poParent->AddChild(poVMenuPanel);
233 if(b_FocusHMenu) poVMenu->MakeFocus();
234 }
235
236 void
237 BF_GUI_TopMenu::CloseVMenu()
238 {
239 if(!poVMenu) return;
240 poVMenuPanel->Hide();
241 Parent()->RemoveChild(poVMenuPanel);
242 DELETE(poVMenuPanel);
243 poVMenuPanel = NULL;
244 poVMenu = NULL;
245 }
246
247 void
248 BF_GUI_TopMenu::MessageReceived(BMessage* po_Message)
249 {
250 switch(po_Message->what){
251 case BF_MSG_TOPMENU_HCLOSE:
252 MakeFocus(true);
253 ASSERT(poVMenu);
254 iHCursor = poVMenu->iNavCursorIndex;
255 CloseVMenu();
256
257 bool bExit;
258 if(B_OK==po_Message->FindBool("bf_bOk",&bExit)){
259 if(bExit) NavEnter(); else NavEscape();
260 }else{
261 char cKey;
262 ASSERT(B_OK == po_Message->FindInt8("key",(int8*)&cKey));
263 switch(cKey){
264 case B_RIGHT_ARROW:
265 NavChangeCursor(iNavCursorIndex+1,BF_GUI_TOOLMENU_MOVE_DOWN);
266 break;
267 case B_LEFT_ARROW:
268 NavChangeCursor(iNavCursorIndex-1,BF_GUI_TOOLMENU_MOVE_UP);
269 break;
270 default:
271 break;
272 }
273 }
274 break;
275 default:
276 BF_GUI_DlgView_HMenu::MessageReceived(po_Message);
277 }
278 }
279
280
281 void
282 BF_GUI_TopMenu_Run()
283 {
284 BL_List *poList = new BL_List();
285 BF_GUI_TopMenu_HItem *poHItem;
286 BF_GUI_Panel *poPanel;
287
288
289 poPanel = poWinView->PanelOnTop(true);
290 if(poPanel){
291 poHItem = new BF_GUI_TopMenu_HItem(BF_DictAt(BF_DICT_TOPMENU_LEFT));
292 poPanel->PrepareTopMenuItem(poHItem);
293 poList->AddItem(poHItem);
294 }
295
296 poHItem = new BF_GUI_TopMenu_HItem(BF_DictAt(BF_DICT_TOPMENU_COMMON));
297 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_MAINSETUP),BF_MSG_MAINVIEW_MAINSETUP_0,poWinView,"");
298 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_EMPTY_TRASH),BF_MSG_MAINVIEW_EMPTY_TRASH,poWinView,"");
299 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_COMPARE),BF_MSG_MAINVIEW_COMPART_PANELS,poWinView,"");
300 poHItem->AddHItem("",0,poWinView,"");
301 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_SAVE_SETUP),BF_MSG_MAINVIEW_MAINSETUP_SAVE,poWinView,"");
302 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_LOAD_SETUP),BF_MSG_MAINVIEW_MAINSETUP_LOAD,poWinView,"");
303 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_DEFAULT_SETUP),BF_MSG_MAINVIEW_MAINSETUP_SETDEFAULT,poWinView,"");
304 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_SAVE_PALETTE),BF_MSG_MAINVIEW_SAVE_PALLETE,poWinView,"");
305 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_LOAD_PALETTE),BF_MSG_MAINVIEW_LOAD_PALLETE,poWinView,"");
306 poHItem->AddHItem("",0,poWinView,"");
307 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_SELECTDICT),BF_MSG_MAINVIEW_SELECTDICT,poWinView,"");
308 poHItem->AddHItem("",0,poWinView,"");
309 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_ABOUT),BF_MSG_MAINVIEW_ABOUT,poWinView,"");
310 poHItem->AddHItem("",0,poWinView,"");
311 poHItem->AddHItem(BF_DictAt(BF_DICT_TOPMENU_COMMON_QUIT),BF_MSG_MAINVIEW_ASK_QUIT,poWinView,"Alt-W,Alt+Q");
312 poList->AddItem(poHItem);
313
314 poPanel = poWinView->PanelOnTop(false);
315 if(poPanel){
316 poHItem = new BF_GUI_TopMenu_HItem(BF_DictAt(BF_DICT_TOPMENU_RIGHT));
317 poPanel->PrepareTopMenuItem(poHItem);
318 poList->AddItem(poHItem);
319 }
320
321
322 BRect oRect(poWinView->Bounds());
323 oRect.bottom = oRect.top+poSysSetup->oFontToolView.fHeight;
324 BF_GUI_TopMenu *poMenu = new BF_GUI_TopMenu(oRect,poList);
325 poMenu->poParent = poWin->CurrentFocus();
326
327 BF_GUI_Func_PanelsEnable(false);
328
329 BF_GUI_Func_AddChildToMainView ( poMenu );
330
331
332 }
333