GRASS Programmer's Manual  6.5.svn(2012)-r51648
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
menu.py
Go to the documentation of this file.
00001 """!
00002 @package gui_core.menu
00003 
00004 @brief Menu classes for wxGUI
00005 
00006 Classes:
00007  - menu::Menu
00008 
00009 (C) 2010 by the GRASS Development Team
00010 
00011 This program is free software under the GNU General Public License
00012 (>=v2). Read the file COPYING that comes with GRASS for details.
00013 
00014 @author Martin Landa <landa.martin gmail.com>
00015 @author Pawel Netzel (menu customization)
00016 @author Milena Nowotarska (menu customization)
00017 @author Robert Szczepanek (menu customization)
00018 @author Vaclav Petras <wenzeslaus gmail.com> (menu customization)
00019 """
00020 
00021 import wx
00022 
00023 from core          import globalvar
00024 from core          import utils
00025 from core.gcmd     import EncodeString
00026 from core.settings import UserSettings
00027 
00028 class Menu(wx.MenuBar):
00029     def __init__(self, parent, data):
00030         """!Creates menubar"""
00031         wx.MenuBar.__init__(self)
00032         self.parent   = parent
00033         self.menudata = data
00034         self.menucmd  = dict()
00035         
00036         self.menustyle = UserSettings.Get(group='appearance', key='menustyle', subkey='selection')
00037         
00038         for eachMenuData in self.menudata.GetMenu():
00039             for eachHeading in eachMenuData:
00040                 menuLabel = eachHeading[0]
00041                 menuItems = eachHeading[1]
00042                 self.Append(self._createMenu(menuItems), menuLabel)
00043         
00044     def _createMenu(self, menuData):
00045         """!Creates menu"""
00046         menu = wx.Menu()
00047         for eachItem in menuData:
00048             if len(eachItem) == 2:
00049                 label = eachItem[0]
00050                 subMenu = self._createMenu(eachItem[1])
00051                 menu.AppendMenu(wx.ID_ANY, label, subMenu)
00052             else:
00053                 self._createMenuItem(menu, self.menustyle, *eachItem)
00054         
00055         self.parent.Bind(wx.EVT_MENU_HIGHLIGHT_ALL, self.OnMenuHighlight)
00056         
00057         return menu
00058 
00059     def _createMenuItem(self, menu, menustyle, label, help, handler, gcmd, keywords,
00060                         shortcut = '', wxId = wx.ID_ANY, kind = wx.ITEM_NORMAL):
00061         """!Creates menu items
00062         There are three menu styles (menu item text styles).
00063         1 -- label only, 2 -- label and cmd name, 3 -- cmd name only
00064         """
00065         if not label:
00066             menu.AppendSeparator()
00067             return
00068         
00069         if len(gcmd) > 0:
00070             helpString = gcmd + ' -- ' + help
00071             if menustyle == 1:
00072                 label += '   [' + gcmd + ']'
00073             elif menustyle == 2:
00074                 label = '      [' + gcmd + ']'
00075         else:
00076             helpString = help
00077         
00078         if shortcut:
00079             label += '\t' + shortcut
00080         
00081         menuItem = menu.Append(wxId, label, helpString, kind)
00082         
00083         self.menucmd[menuItem.GetId()] = gcmd
00084         
00085         if gcmd: 
00086             try: 
00087                 cmd = utils.split(str(gcmd)) 
00088             except UnicodeError: 
00089                 cmd = utils.split(EncodeString((gcmd))) 
00090             if cmd and cmd[0] not in globalvar.grassCmd: 
00091                 menuItem.Enable(False)
00092         
00093         rhandler = eval('self.parent.' + handler)
00094         
00095         self.parent.Bind(wx.EVT_MENU, rhandler, menuItem)
00096 
00097     def GetData(self):
00098         """!Get menu data"""
00099         return self.menudata
00100     
00101     def GetCmd(self):
00102         """!Get list of commands
00103 
00104         @return list of commands
00105         """
00106         return self.menucmd
00107         
00108     def OnMenuHighlight(self, event):
00109         """
00110         Default menu help handler
00111         """
00112          # Show how to get menu item info from this event handler
00113         id = event.GetMenuId()
00114         item = self.FindItemById(id)
00115         if item:
00116             text = item.GetText()
00117             help = item.GetHelp()
00118 
00119         # but in this case just call Skip so the default is done
00120         event.Skip()