4 @brief Complex list for menu entries for wxGUI.
14 python menudata.py [action] [manager|modeler]
23 (C) 2007-2011 by the GRASS Development Team
24 This program is free software under the GNU General Public License
25 (>=v2). Read the file COPYING that comes with GRASS for details.
27 @author Michael Barton (Arizona State University)
28 @author Yann Chemin <yann.chemin gmail.com>
29 @author Martin Landa <landa.martin gmail.com>
30 @author Glynn Clements
31 @author Anna Kratochvilova <anna.kratochvilova fsv.cvut.cz>
37 import xml.etree.ElementTree
as etree
39 import elementtree.ElementTree
as etree
41 if not os.getenv(
"GISBASE"):
42 sys.exit(
"GRASS is not running. Exiting...")
44 etcwxdir = os.path.join(os.getenv(
"GISBASE"),
"etc",
"wxpython")
47 """!Abstract menu data class"""
49 self.
tree = etree.parse(filename)
51 def _getMenuItem(self, mi):
54 @param mi menu item instance
56 if mi.tag ==
'separator':
57 return (
'',
'',
'',
'',
'')
58 elif mi.tag ==
'menuitem':
59 label = _(mi.find(
'label').text)
60 help = _(mi.find(
'help').text)
61 handler = mi.find(
'handler').text
62 gcmd = mi.find(
'command')
63 keywords = mi.find(
'keywords')
64 shortcut = mi.find(
'shortcut')
70 keywords = keywords.text
74 shortcut = shortcut.text
77 return (label, help, handler, gcmd, keywords, shortcut)
78 elif mi.tag ==
'menu':
79 return self._getMenu(mi)
81 raise Exception(_(
"Unknow tag"))
83 def _getMenu(self, m):
88 @return label, menu items
90 label = _(m.find(
'label').text)
91 items = m.find(
'items')
92 return (label, tuple(
map(self._getMenuItem, items)))
94 def _getMenuBar(self, mb):
97 @param mb menu bar instance
101 return tuple(
map(self._getMenu, mb.findall(
'menu')))
103 def _getMenuData(self, md):
106 @param md menu data instace
110 return list(
map(self._getMenuBar, md.findall(
'menubar')))
117 return self._getMenuData(self.tree.getroot())
120 """!Print menu strings to file (used for localization)
122 @param fh file descriptor"""
123 className = str(self.__class__).
split(
'.', 1)[1]
124 fh.write(
'menustrings_%s = [\n' % className)
125 for node
in self.tree.getiterator():
126 if node.tag
in [
'label',
'help']:
127 fh.write(
' _(%r),\n' % node.text)
131 """!Print menu tree to file
133 @param fh file descriptor"""
135 for eachMenuData
in self.
GetMenu():
136 for label, items
in eachMenuData:
137 fh.write(
'- %s\n' % label.replace(
'&',
''))
140 def _PrintTreeItems(self, fh, level, menuData):
141 """!Print menu tree items to file (used by PrintTree)
143 @param fh file descriptor
144 @param level menu level
145 @param menuData menu data to print out"""
146 for eachItem
in menuData:
147 if len(eachItem) == 2:
149 fh.write(
'%s - %s\n' % (
' ' * level, eachItem[0]))
153 fh.write(
'%s - %s\n' % (
' ' * level, eachItem[0]))
156 """!Print commands list (command | menu item > menu item)
158 @param fh file descriptor
161 for eachMenuData
in self.
GetMenu():
162 for label, items
in eachMenuData:
163 menuItems = [label, ]
165 menuItems, itemSep, menuSep)
167 def _PrintCommandsItems(self, fh, level, menuData,
168 menuItems, itemSep, menuSep):
169 """!Print commands item (used by PrintCommands)
171 @param fh file descriptor
172 @param menuItems list of menu items
174 for eachItem
in menuData:
175 if len(eachItem) == 2:
178 menuItems[level] = eachItem[0]
180 menuItems.append(eachItem[0])
182 menuItems, itemSep, menuSep)
190 fh.write(
'%s%s' % (eachItem[3], itemSep))
191 fh.write(menuSep.join(
map(
lambda x: x.replace(
'&',
''), menuItems)))
192 fh.write(
'%s%s' % (menuSep, eachItem[0]))
198 gisbase = os.getenv(
'GISBASE')
200 filename = os.path.join(etcwxdir,
'xml',
'menudata.xml')
202 MenuData.__init__(self, filename)
205 """!Create dictionary of modules used to search module by
206 keywords, description, etc."""
209 for node
in self.tree.getiterator():
210 if node.tag ==
'menuitem':
211 module = description =
''
213 for child
in node.getchildren():
214 if child.tag ==
'help':
215 description = child.text
216 if child.tag ==
'command':
218 if child.tag ==
'keywords':
220 keywords = child.text.split(
',')
223 modules[module] = {
'desc': description,
224 'keywords' : keywords }
225 if len(keywords) < 1:
226 print >> sys.stderr,
"WARNING: Module <%s> has no keywords" % module
233 gisbase = os.getenv(
'GISBASE')
235 filename = os.path.join(etcwxdir,
'xml',
'menudata_modeler.xml')
237 MenuData.__init__(self, filename)
241 """!Menu for Cartographic Composer (psmap.py)
243 @path path to XML to be read (None for menudata_psmap.xml)
246 gisbase = os.getenv(
'GISBASE')
248 path = os.path.join(etcwxdir,
'xml',
'menudata_psmap.xml')
250 MenuData.__init__(self, path)
252 if __name__ ==
"__main__":
257 gettext.install(
'grasswxpy', os.path.join(os.getenv(
"GISBASE"),
'locale'), unicode=
True)
263 if arg
in (
'strings',
'tree',
'commands',
'dump'):
265 elif arg
in (
'manager',
'modeler'):
268 if menu ==
'manager':
273 if action ==
'strings':
274 data.PrintStrings(sys.stdout)
275 elif action ==
'tree':
276 data.PrintTree(sys.stdout)
277 elif action ==
'commands':
278 data.PrintCommands(sys.stdout)