""" Property class for the 'code' property of toplevel widgets @copyright: 2002-2007 Alberto Griggio @copyright: 2014-2016 Carsten Grohmann @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import wx import wx.grid import wx.lib.stattext import common import widget_properties from wcodegen.taghandler import BaseXmlBuilderTagHandler from widget_properties import GridProperty class CodeProperty(widget_properties.TextProperty): def __init__(self, owner, name='extracode'): setattr(owner, name, "") def get(): return getattr(owner, name) def set(val): return setattr(owner, name, val) owner.access_functions[name] = (get, set) widget_properties.TextProperty.__init__(self, owner, name, None, True, multiline=True) def _show(self, notebook, label=_('Code')): panel, new = _find_or_create_page(notebook, label) self.display(panel) szr = wx.BoxSizer(wx.VERTICAL) szr.Add(self.panel, 1, wx.EXPAND) if new: panel.SetSizerAndFit(szr) notebook.AddPage(panel, label) else: sizer = panel.GetSizer() sizer.Add(szr, 1, wx.EXPAND) panel.Layout() def display(self, parent): self.id = wx.NewId() val = self.get_value() val = val.replace('\\n', '\n') sb = wx.StaticBox(parent, -1, "") label = wx.lib.stattext.GenStaticText( parent, wx.ID_ANY, _('Extra code for this widget')) self._enabler = wx.CheckBox(parent, self.id + 1, '') tooltip = """\ You can use this property to add some extra code to that generated by wxGlade. Please note that you should use this ability only if you have the \ "Overwrite existing sources" option set.""" style = wx.TE_MULTILINE|wx.HSCROLL self.text = wx.TextCtrl( parent, self.id, val, style=style, size=(1, -1)) font = wx.Font(12, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) self.text.SetFont(font) label.SetToolTip(wx.ToolTip(tooltip)) wx.EVT_CHECKBOX(self._enabler, self.id+1, lambda event: self.toggle_active(event.IsChecked())) self.text.Enable(self.is_active()) self._enabler.SetValue(self.is_active()) self._target = self.text szr = wx.BoxSizer(wx.HORIZONTAL) szr.Add(label, 1, wx.ALL|wx.EXPAND, 3) szr.Add(self._enabler, 0, wx.ALL|wx.EXPAND, 3) sizer = wx.StaticBoxSizer(sb, wx.VERTICAL) sizer.Add(szr, 0, wx.EXPAND) sizer.Add(self.text, 1, wx.ALL|wx.EXPAND, 3) h = self.text.GetCharHeight() sizer.SetItemMinSize(self.text, -1, h*3) self.panel = sizer self.bind_event(self.on_change_val) wx.EVT_CHAR(self.text, self.on_char) # end of class CodeProperty class ExtraPropertiesProperty(GridProperty): def __init__(self, owner): setattr(owner, 'extraproperties', []) def get(): return getattr(owner, 'extraproperties') def set(val): return setattr(owner, 'extraproperties', val) owner.access_functions['extraproperties'] = (get, set) cols = [(_('Property'), GridProperty.STRING), (_('Value'), GridProperty.STRING)] self.label = _('Extra properties for this widget') GridProperty.__init__(self, owner, 'extraproperties', None, cols, can_insert=False) def write(self, outfile, tabs): if self.getter: props = self.getter() else: props = self.owner[self.name][0]() if props: inner_xml = u'' for name, value in props: if value: inner_xml += common.format_xml_tag( u'property', value.strip(), tabs + 1, name=name) if inner_xml: stmt = common.format_xml_tag( u'extraproperties', inner_xml, tabs, is_xml=True) outfile.write(stmt) def display(self, panel): GridProperty.display(self, panel) self.btn.Hide() wx.grid.EVT_GRID_CELL_CHANGE(self.grid, self.on_change_val) tooltip = """\ You can use this property to add some extra custom properties to this widget. For each property "prop" with value "val", wxGlade will generate a \ "widget.SetProp(val)" line (or a "val" line for XRC).""" self.grid.SetToolTip(wx.ToolTip(tooltip)) def add_row(self, event): GridProperty.add_row(self, event) self.on_change_val(event) def remove_row(self, event): GridProperty.remove_row(self, event) self.on_change_val(event) def set_value(self, val): if isinstance(val, dict): val = [[k, val[k]] for k in sorted(val.keys())] GridProperty.set_value(self, val) def _show(self, notebook, label=_('Code')): panel, new = _find_or_create_page(notebook, label) self.display(panel) szr = wx.BoxSizer(wx.VERTICAL) szr.Add(self.panel, 1, wx.EXPAND) if new: panel.SetSizerAndFit(szr) notebook.AddPage(panel, _('Code')) else: sizer = panel.GetSizer() sizer.Add(szr, 1, wx.EXPAND) sizer.Layout() # end of class ExtraPropertiesProperty class ExtraPropertiesPropertyHandler(BaseXmlBuilderTagHandler): strip_char_data = True def __init__(self, owner): super(ExtraPropertiesPropertyHandler, self).__init__() self.owner = owner self.props = {} self.prop_name = None self.curr_prop = [] def start_elem(self, name, attrs): super(ExtraPropertiesPropertyHandler, self).__init__() if name == 'property': self.prop_name = attrs['name'] def end_elem(self, name): if name == 'property': if self.prop_name and self.curr_prop: self.props[self.prop_name] = ''.join(self.curr_prop) self.prop_name = None self.curr_prop = [] elif name == 'extraproperties': self.owner.properties['extraproperties'].set_value(self.props) val = [[k, self.props[k]] for k in sorted(self.props.keys())] self.owner.extraproperties = val return True # to remove this handler # end of class ExtraPropertiesPropertyHandler def _find_or_create_page(notebook, label): """\ Searches the given notebook for a page whose label is "label". """ for i in xrange(notebook.GetPageCount()): if notebook.GetPageText(i) == label: return notebook.GetPage(i), False return wx.Panel(notebook, -1, style=wx.TAB_TRAVERSAL), True