# perl_codegen.py : perl generator functions for wxMenuBar objects
# $Id: perl_codegen.py,v 1.11 2007/06/23 10:57:58 agriggio Exp $
#
# Copyright (c) 2002-2004 D.H. aka crazyinsomniac on sourceforge.net
# License: MIT (see license.txt)
# THIS PROGRAM COMES WITH NO WARRANTY
import common
from MenuTree import *
from codegen import MenuHandler
class PerlCodeGenerator:
def get_properties_code(self, obj):
return []
def get_init_code(self, obj):
prop = obj.properties
plgen = common.code_writers['perl']
out = []
append = out.append
menus = obj.properties['menubar']
ids = []
# We need to keep track of tmpnames used.
tmpsused = {}
def append_items(menu, items):
for item in items:
if item.name == '---': # item is a separator
append('%s->AppendSeparator();\n' % menu)
continue
name, val = plgen.generate_code_id(None, item.id)
if not name and ( not val or val == '-1'):
id = 'Wx::NewId()'
else:
if name: ids.append(name)
id = val
if item.children:
if item.name:
name = item.name
else:
name = '%s_sub' % menu
if not tmpsused.has_key(name):
tmpsused[name] = 1
append('my %s;\n' % name)
append('%s = Wx::Menu->new();\n' % name)
append_items(name, item.children)
append('%s->Append(%s, %s, %s, %s);\n' %
(menu, id, plgen.quote_str(item.label),
name, plgen.quote_str(item.help_str)))
else:
item_type = 0
if item.checkable == '1':
item_type = 1
elif item.radio == '1':
item_type = 2
if item.name: itemname = '$self->{%s} = ' % item.name
else: itemname = ''
if item_type:
append('%s%s->Append(%s, %s, %s, %s);\n' %
(itemname, menu, id, plgen.quote_str(item.label),
plgen.quote_str(item.help_str), item_type))
else:
append('%s%s->Append(%s, %s, %s);\n' %
(itemname, menu, id, plgen.quote_str(item.label),
plgen.quote_str(item.help_str)))
#print 'menus = %s' % menus
if obj.is_toplevel: obj_name = '$self'
else: obj_name = '$self->{%s}' % obj.name
append('my $wxglade_tmp_menu;\n') # NOTE below name =
for m in menus:
menu = m.root
if menu.name: name = '$self->{%s}' % menu.name
else: name = '$wxglade_tmp_menu'
append('%s = Wx::Menu->new();\n' % name)
if menu.children:
append_items(name, menu.children)
append('%s->Append(%s, %s);\n' %
(obj_name, name, plgen.quote_str(menu.label)))
return ids + out
def get_code(self, obj):
"""\
function that generates Perl code for the menubar of a wxFrame.
"""
klass = obj.base;
if klass != obj.klass : klass = obj.klass;
else: klass = klass.replace('wx','Wx::',1);
plgen = common.code_writers['perl']
init = [ '\n\n', '# Menu Bar\n\n', '$self->{%s} = %s->new();\n' %
(obj.name, klass) ]
## '$self->SetMenuBar($self->{%s});\n' % obj.name ]
init.extend(self.get_init_code(obj))
init.append('$self->SetMenuBar($self->{%s});\n' % obj.name)
init.append('\n# Menu Bar end\n\n')
return init, [], []
# 2004-12-05
def get_events(self, obj):
pygen = common.code_writers['perl']
cn = pygen.cn
out = []
#print 'get_events', obj.properties['menubar']
def do_get(item):
ret = []
if item.name:
#val = '#self.%s' % item.name # see py_codegen.py, ~480
val = item.name
else:
name, val = pygen.generate_code_id(None, item.id)
if not val: val = '-1' # but this is wrong anyway...
if item.handler:
ret.append((val, 'EVT_MENU', item.handler))
if item.children:
for c in item.children:
ret.extend(do_get(c))
return ret
for menu in obj.properties['menubar']:
out.extend(do_get(menu.root))
return out
# end of class PerlCodeGenerator
def initialize():
common.class_names['EditMenuBar'] = 'wxMenuBar'
common.toplevels['EditMenuBar'] = 1
plgen = common.code_writers.get('perl')
if plgen:
plgen.add_widget_handler('wxMenuBar', PerlCodeGenerator())
plgen.add_property_handler('menus', MenuHandler)
|