|
GRASS Programmer's Manual
6.5.svn(2012)-r51648
|
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)