GRASS Programmer's Manual  6.5.svn(2012)-r51648
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
core/menudata.py
Go to the documentation of this file.
00001 """!
00002 @package core.menudata
00003 
00004 @brief Complex list for menu entries for wxGUI
00005 
00006 Classes:
00007  - menudata::MenuData
00008 
00009 Usage:
00010 @code
00011 python menudata.py [action] [manager|modeler]
00012 @endcode
00013 
00014 where <i>action</i>:
00015  - strings (default)
00016  - tree
00017  - commands
00018  - dump
00019 
00020 (C) 2007-2011 by the GRASS Development Team
00021 
00022 This program is free software under the GNU General Public License
00023 (>=v2). Read the file COPYING that comes with GRASS for details.
00024 
00025 @author Michael Barton (Arizona State University)
00026 @author Yann Chemin <yann.chemin gmail.com>
00027 @author Martin Landa <landa.martin gmail.com>
00028 @author Glynn Clements
00029 """
00030 
00031 import os
00032 import sys
00033 import pprint
00034 try:
00035     import xml.etree.ElementTree   as etree
00036 except ImportError:
00037     import elementtree.ElementTree as etree # Python <= 2.4
00038 
00039 import wx
00040 
00041 if not os.getenv("GISBASE"):
00042     sys.exit("GRASS is not running. Exiting...")
00043 
00044 class MenuData:
00045     """!Abstract menu data class"""
00046     def __init__(self, filename):
00047         self.tree = etree.parse(filename)
00048 
00049     def _getMenuItem(self, mi):
00050         """!Get menu item
00051 
00052         @param mi menu item instance
00053         """
00054         if mi.tag == 'separator':
00055             return ('', '', '', '', '')
00056         elif mi.tag == 'menuitem':
00057             label    = _(mi.find('label').text)
00058             help     = _(mi.find('help').text)
00059             handler  = mi.find('handler').text
00060             gcmd     = mi.find('command')  # optional
00061             keywords = mi.find('keywords') # optional
00062             shortcut = mi.find('shortcut') # optional
00063             wxId     = mi.find('id')       # optional
00064             if gcmd != None:
00065                 gcmd = gcmd.text
00066             else:
00067                 gcmd = ""
00068             if keywords != None:
00069                 keywords = keywords.text
00070             else:
00071                 keywords = ""
00072             if shortcut != None:
00073                 shortcut = shortcut.text
00074             else:
00075                 shortcut = ""
00076             if wxId != None:
00077                 wxId = eval('wx.' + wxId.text)
00078             else:
00079                 wxId = wx.ID_ANY
00080             return (label, help, handler, gcmd, keywords, shortcut, wxId)
00081         elif mi.tag == 'menu':
00082             return self._getMenu(mi)
00083         else:
00084             raise Exception(_("Unknow tag"))
00085 
00086     def _getMenu(self, m):
00087         """!Get menu
00088 
00089         @param m menu
00090 
00091         @return label, menu items
00092         """
00093         label = _(m.find('label').text)
00094         items = m.find('items')
00095         return (label, tuple(map(self._getMenuItem, items)))
00096     
00097     def _getMenuBar(self, mb):
00098         """!Get menu bar
00099 
00100         @param mb menu bar instance
00101         
00102         @return menu items
00103         """
00104         return tuple(map(self._getMenu, mb.findall('menu')))
00105 
00106     def _getMenuData(self, md):
00107         """!Get menu data
00108 
00109         @param md menu data instace
00110         
00111         @return menu data
00112         """
00113         return list(map(self._getMenuBar, md.findall('menubar')))
00114 
00115     def GetMenu(self):
00116         """!Get menu
00117 
00118         @return menu data
00119         """
00120         return self._getMenuData(self.tree.getroot())
00121 
00122     def PrintStrings(self, fh):
00123         """!Print menu strings to file (used for localization)
00124 
00125         @param fh file descriptor"""
00126         className = str(self.__class__).split('.', 1)[1]
00127         fh.write('menustrings_%s = [\n' % className)
00128         for node in self.tree.getiterator():
00129             if node.tag in ['label', 'help']:
00130                 fh.write('     _(%r),\n' % node.text)
00131         fh.write('    \'\']\n')
00132 
00133     def PrintTree(self, fh):
00134         """!Print menu tree to file
00135 
00136         @param fh file descriptor"""
00137         level = 0
00138         for eachMenuData in self.GetMenu():
00139             for label, items in eachMenuData:
00140                 fh.write('- %s\n' % label.replace('&', ''))
00141                 self._PrintTreeItems(fh, level + 1, items)
00142         
00143     def _PrintTreeItems(self, fh, level, menuData):
00144         """!Print menu tree items to file (used by PrintTree)
00145 
00146         @param fh file descriptor
00147         @param level menu level
00148         @param menuData menu data to print out"""
00149         for eachItem in menuData:
00150             if len(eachItem) == 2:
00151                 if eachItem[0]:
00152                     fh.write('%s - %s\n' % (' ' * level, eachItem[0]))
00153                 self._PrintTreeItems(fh, level + 1, eachItem[1])
00154             else:
00155                 if eachItem[0]:
00156                     fh.write('%s - %s\n' % (' ' * level, eachItem[0]))
00157     
00158     def PrintCommands(self, fh, itemSep = ' | ', menuSep = ' > '):
00159         """!Print commands list (command | menu item > menu item)
00160 
00161         @param fh file descriptor
00162         """
00163         level = 0
00164         for eachMenuData in self.GetMenu():
00165             for label, items in eachMenuData:
00166                 menuItems = [label, ]
00167                 self._PrintCommandsItems(fh, level + 1, items,
00168                                          menuItems, itemSep, menuSep)
00169         
00170     def _PrintCommandsItems(self, fh, level, menuData,
00171                              menuItems, itemSep, menuSep):
00172         """!Print commands item (used by PrintCommands)
00173 
00174         @param fh file descriptor
00175         @param menuItems list of menu items
00176         """
00177         for eachItem in menuData:
00178             if len(eachItem) == 2:
00179                 if eachItem[0]:
00180                     try:
00181                         menuItems[level] = eachItem[0]
00182                     except IndexError:
00183                         menuItems.append(eachItem[0])
00184                 self._PrintCommandsItems(fh, level + 1, eachItem[1],
00185                                           menuItems, itemSep, menuSep)
00186             else:
00187                 try:
00188                     del menuItems[level]
00189                 except IndexError:
00190                     pass
00191                 
00192                 if eachItem[3]:
00193                     fh.write('%s%s' % (eachItem[3], itemSep))
00194                     fh.write(menuSep.join(map(lambda x: x.replace('&', ''), menuItems)))
00195                     fh.write('%s%s' % (menuSep, eachItem[0]))
00196                     fh.write('\n')
00197 
00198 if __name__ == "__main__":
00199     import os
00200     import sys
00201     
00202     # i18N
00203     import gettext
00204     gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
00205 
00206     action = 'strings'
00207     menu   = 'manager'
00208     
00209     for arg in sys.argv:
00210         if arg in ('strings', 'tree', 'commands', 'dump'):
00211             action =  arg
00212         elif arg in ('manager', 'modeler'):
00213             menu = arg
00214     
00215     sys.path.append(os.path.join(os.getenv("GISBASE"), "etc", "wxpython"))
00216     
00217     if menu == 'manager':
00218         from lmgr.menudata     import ManagerData
00219         data = ManagerData()
00220     else:
00221         from gmodeler.menudata import ModelerData
00222         data = ModelerData()
00223     
00224     if action == 'strings':
00225         data.PrintStrings(sys.stdout)
00226     elif action == 'tree':
00227         data.PrintTree(sys.stdout)
00228     elif action == 'commands':
00229         data.PrintCommands(sys.stdout)
00230     elif action == 'dump':
00231         pprint.pprint(data.GetMenu(), stream = sys.stdout, indent = 2)
00232     
00233     sys.exit(0)