root/BF_GUI_TopMenu.cpp

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. AddHItem
  2. AddHItem
  3. CalcWidth
  4. NavEnter
  5. NavEscape
  6. DrawItem
  7. KeyDown
  8. Invoke
  9. NavEnter
  10. NavEscape
  11. MakeFocus
  12. NavChangeCursor
  13. Show
  14. OpenVMenu
  15. CloseVMenu
  16. MessageReceived
  17. 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(    /* [previous][next][first][last][top][bottom][index][help] */
  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(    /* [previous][next][first][last][top][bottom][index][help] */
  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)    /* [previous][next][first][last][top][bottom][index][help] */
  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()    /* [previous][next][first][last][top][bottom][index][help] */
  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()    /* [previous][next][first][last][top][bottom][index][help] */
  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)    /* [previous][next][first][last][top][bottom][index][help] */
 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)    /* [previous][next][first][last][top][bottom][index][help] */
 119 {
 120         /* handle keys */
 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)    /* [previous][next][first][last][top][bottom][index][help] */
 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()    /* [previous][next][first][last][top][bottom][index][help] */
 172 {       
 173         Invoke(true);
 174 }
 175 
 176 void
 177 BF_GUI_TopMenu::NavEscape()    /* [previous][next][first][last][top][bottom][index][help] */
 178 {       
 179         Invoke(false);
 180 }
 181 
 182 void
 183 BF_GUI_TopMenu::MakeFocus(bool b_Focused)    /* [previous][next][first][last][top][bottom][index][help] */
 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)    /* [previous][next][first][last][top][bottom][index][help] */
 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)    /* [previous][next][first][last][top][bottom][index][help] */
 202 {       
 203         BF_GUI_DlgView_HMenu::Show();
 204         OpenVMenu();    
 205 }
 206 
 207 void
 208 BF_GUI_TopMenu::OpenVMenu(bool b_FocusHMenu)    /* [previous][next][first][last][top][bottom][index][help] */
 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()    /* [previous][next][first][last][top][bottom][index][help] */
 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)    /* [previous][next][first][last][top][bottom][index][help] */
 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()    /* [previous][next][first][last][top][bottom][index][help] */
 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         //poMenu->MakeFocus();  
 331         
 332 }
 333 //////////////////////////////////////////////////////////////////////////

/* [previous][next][first][last][top][bottom][index][help] */