DataTypeEditor.py
changeset 714 131ea7f237b9
parent 666 d4bb66691248
child 730 2c4914d941fd
--- a/DataTypeEditor.py	Fri Jun 15 18:03:25 2012 +0200
+++ b/DataTypeEditor.py	Mon Jun 25 20:03:53 2012 +0200
@@ -22,31 +22,39 @@
 #License along with this library; if not, write to the Free Software
 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
+import re
+
 import wx
 import wx.grid
+import wx.lib.buttons
 
 from plcopen.structures import IEC_KEYWORDS, TestIdentifier
 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
 from controls import CustomEditableListBox, CustomGrid, CustomTable, EditorPanel
-
-import re
+from utils.BitmapLibrary import GetBitmap
+
+#-------------------------------------------------------------------------------
+#                                    Helpers
+#-------------------------------------------------------------------------------
 
 DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$")
 
 def AppendMenu(parent, help, id, kind, text):
-    if wx.VERSION >= (2, 6, 0):
-        parent.Append(help=help, id=id, kind=kind, text=text)
-    else:
-        parent.Append(helpString=help, id=id, kind=kind, item=text)
+    parent.Append(help=help, id=id, kind=kind, text=text)
+
+def GetElementsTableColnames():
+    _ = lambda x : x
+    return ["#", _("Name"), _("Type"), _("Initial Value")]
+
+def GetDatatypeTypes():
+    _ = lambda x : x
+    return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")]
+DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
 
 #-------------------------------------------------------------------------------
 #                            Structure Elements Table
 #-------------------------------------------------------------------------------
 
-def GetElementsTableColnames():
-    _ = lambda x : x
-    return ["#", _("Name"), _("Type"), _("Initial Value")]
-
 class ElementsTable(CustomTable):
     
     """
@@ -121,329 +129,240 @@
 #                          Datatype Editor class
 #-------------------------------------------------------------------------------
 
-[ID_DATATYPEEDITOR, ID_DATATYPEEDITORPANEL, ID_DATATYPEEDITORSTATICBOX,
- ID_DATATYPEEDITORDERIVATIONTYPE, ID_DATATYPEEDITORDIRECTLYPANEL,
- ID_DATATYPEEDITORSUBRANGEPANEL, ID_DATATYPEEDITORDIRECTLYBASETYPE, 
- ID_DATATYPEEDITORSUBRANGEBASETYPE, ID_DATATYPEEDITORSUBRANGEMINIMUM, 
- ID_DATATYPEEDITORSUBRANGEMAXIMUM, ID_DATATYPEEDITORDIRECTLYINITIALVALUE, 
- ID_DATATYPEEDITORSUBRANGEINITIALVALUE, ID_DATATYPEEDITORENUMERATEDPANEL,
- ID_DATATYPEEDITORENUMERATEDVALUES, ID_DATATYPEEDITORENUMERATEDINITIALVALUE,
- ID_DATATYPEEDITORARRAYPANEL, ID_DATATYPEEDITORARRAYBASETYPE, 
- ID_DATATYPEEDITORARRAYDIMENSIONS, ID_DATATYPEEDITORARRAYINITIALVALUE, 
- ID_DATATYPEEDITORSTRUCTUREPANEL, ID_DATATYPEEDITORSTRUCTUREELEMENTSGRID,
- ID_DATATYPEEDITORSTRUCTUREADDBUTTON, ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON,
- ID_DATATYPEEDITORSTRUCTUREUPBUTTON, ID_DATATYPEEDITORSTRUCTUREDOWNBUTTON,
- ID_DATATYPEEDITORSTATICTEXT1, ID_DATATYPEEDITORSTATICTEXT2, 
- ID_DATATYPEEDITORSTATICTEXT3, ID_DATATYPEEDITORSTATICTEXT4, 
- ID_DATATYPEEDITORSTATICTEXT5, ID_DATATYPEEDITORSTATICTEXT6, 
- ID_DATATYPEEDITORSTATICTEXT7, ID_DATATYPEEDITORSTATICTEXT8,
- ID_DATATYPEEDITORSTATICTEXT9, ID_DATATYPEEDITORSTATICTEXT10, 
- ID_DATATYPEEDITORSTATICTEXT11, 
-] = [wx.NewId() for _init_ctrls in range(36)]
-
-def GetDatatypeTypes():
-    _ = lambda x : x
-    return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")]
-DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
-
 class DataTypeEditor(EditorPanel):
     
-    ID = ID_DATATYPEEDITOR
-    
-    def _init_coll_MainSizer_Items(self, parent):
-        parent.AddSizer(self.TopSizer, 0, border=5, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        parent.AddSizer(self.TypeInfosSizer, 0, border=5, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-
-    def _init_coll_MainSizer_Growables(self, parent):
-        parent.AddGrowableCol(0)
-        parent.AddGrowableRow(1)
-
-    def _init_coll_TopSizer_Items(self, parent):
-        parent.AddWindow(self.staticText1, 0, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
-        parent.AddWindow(self.DerivationType, 0, border=5, flag=wx.GROW|wx.RIGHT)
-
-    def _init_coll_TypeInfosSizer_Items(self, parent):
-        parent.AddWindow(self.DirectlyPanel, 1, border=0, flag=wx.ALL)
-        parent.AddWindow(self.SubrangePanel, 1, border=0, flag=wx.ALL)
-        parent.AddWindow(self.EnumeratedPanel, 1, border=0, flag=wx.GROW|wx.ALL)
-        parent.AddWindow(self.ArrayPanel, 1, border=0, flag=wx.ALL)
-        parent.AddWindow(self.StructurePanel, 1, border=0, flag=wx.GROW|wx.ALL)
-
-    def _init_coll_DirectlyPanelSizer_Items(self, parent):
-        parent.AddWindow(self.staticText2, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.DirectlyBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
-        parent.AddWindow(self.staticText3, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.DirectlyInitialValue, 1, border=5, flag=wx.ALL)
-
-    def _init_coll_SubrangePanelSizer_Items(self, parent):
-        parent.AddWindow(self.staticText4, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.SubrangeBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
-        parent.AddWindow(self.staticText5, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.SubrangeInitialValue, 1, border=5, flag=wx.GROW|wx.ALL)
-        parent.AddWindow(self.staticText6, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.SubrangeMinimum, 1, border=5, flag=wx.GROW|wx.ALL)
-        parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL)
-        parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL)
-        parent.AddWindow(self.staticText7, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.SubrangeMaximum, 1, border=5, flag=wx.GROW|wx.ALL)
-        
-    def _init_coll_EnumeratedPanelSizer_Items(self, parent):
-        parent.AddWindow(self.EnumeratedValues, 1, border=5, flag=wx.GROW|wx.ALL)
-        parent.AddSizer(self.EnumeratedPanelRightSizer, 1, border=0, flag=0)
-        
-    def _init_coll_EnumeratedPanelRightSizer_Items(self, parent):
-        parent.AddWindow(self.staticText8, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.EnumeratedInitialValue, 1, border=5, flag=wx.ALL)
-
-    def _init_coll_ArrayPanelSizer_Items(self, parent):
-        parent.AddSizer(self.ArrayPanelLeftSizer, 0, border=0, flag=wx.GROW)
-        parent.AddSizer(self.ArrayPanelRightSizer, 0, border=0, flag=wx.GROW)
-        parent.AddWindow(self.ArrayDimensions, 0, border=5, flag=wx.GROW|wx.ALL)
-        
-    def _init_coll_ArrayPanelSizer_Growables(self, parent):
-        parent.AddGrowableCol(0)
-        parent.AddGrowableCol(1)
-        parent.AddGrowableRow(1)
-
-    def _init_coll_ArrayPanelLeftSizer_Items(self, parent):
-        parent.AddWindow(self.staticText9, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.ArrayBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
-    
-    def _init_coll_ArrayPanelRightSizer_Items(self, parent):
-        parent.AddWindow(self.staticText10, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-        parent.AddWindow(self.ArrayInitialValue, 1, border=5, flag=wx.ALL)    
-
-    def _init_coll_StructurePanelSizer_Items(self, parent):
-        parent.AddSizer(self.StructurePanelButtonSizer, 0, border=5, flag=wx.ALL|wx.GROW)
-        parent.AddWindow(self.StructureElementsGrid, 0, border=0, flag=wx.GROW)
-        
-    def _init_coll_StructurePanelSizer_Growables(self, parent):
-        parent.AddGrowableCol(0)
-        parent.AddGrowableRow(1)
-    
-    def _init_coll_StructurePanelButtonSizer_Items(self, parent):
-        parent.AddWindow(self.staticText11, 0, border=0, flag=wx.ALIGN_BOTTOM)
-        parent.AddWindow(self.StructureAddButton, 0, border=0, flag=0)
-        parent.AddWindow(self.StructureDeleteButton, 0, border=0, flag=0)
-        parent.AddWindow(self.StructureUpButton, 0, border=0, flag=0)
-        parent.AddWindow(self.StructureDownButton, 0, border=0, flag=0)
-    
-    def _init_coll_StructurePanelButtonSizer_Growables(self, parent):
-        parent.AddGrowableCol(0)
-        parent.AddGrowableRow(0)
-
-    def _init_sizers(self):
+    def _init_Editor(self, parent):
+        self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER)
+        
         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
-        self.TopSizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.TypeInfosSizer = wx.StaticBoxSizer(self.staticbox, wx.HORIZONTAL)
-        self.DirectlyPanelSizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.SubrangePanelSizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
-        self.EnumeratedPanelSizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.EnumeratedPanelRightSizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.ArrayPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
-        self.ArrayPanelLeftSizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.ArrayPanelRightSizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.StructurePanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
-        self.StructurePanelButtonSizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
-        
-        self._init_coll_MainSizer_Items(self.MainSizer)
-        self._init_coll_MainSizer_Growables(self.MainSizer)
-        self._init_coll_TopSizer_Items(self.TopSizer)
-        self._init_coll_TypeInfosSizer_Items(self.TypeInfosSizer)
-        self._init_coll_DirectlyPanelSizer_Items(self.DirectlyPanelSizer)
-        self._init_coll_SubrangePanelSizer_Items(self.SubrangePanelSizer)
-        self._init_coll_EnumeratedPanelSizer_Items(self.EnumeratedPanelSizer)
-        self._init_coll_EnumeratedPanelRightSizer_Items(self.EnumeratedPanelRightSizer)
-        self._init_coll_ArrayPanelSizer_Items(self.ArrayPanelSizer)
-        self._init_coll_ArrayPanelSizer_Growables(self.ArrayPanelSizer)
-        self._init_coll_ArrayPanelLeftSizer_Items(self.ArrayPanelLeftSizer)
-        self._init_coll_ArrayPanelRightSizer_Items(self.ArrayPanelRightSizer)
-        self._init_coll_StructurePanelSizer_Items(self.StructurePanelSizer)
-        self._init_coll_StructurePanelSizer_Growables(self.StructurePanelSizer)
-        self._init_coll_StructurePanelButtonSizer_Items(self.StructurePanelButtonSizer)
-        self._init_coll_StructurePanelButtonSizer_Growables(self.StructurePanelButtonSizer)
-        
-        self.Editor.SetSizer(self.MainSizer)
-        self.DirectlyPanel.SetSizer(self.DirectlyPanelSizer)
-        self.SubrangePanel.SetSizer(self.SubrangePanelSizer)
-        self.EnumeratedPanel.SetSizer(self.EnumeratedPanelSizer)
-        self.ArrayPanel.SetSizer(self.ArrayPanelSizer)
-        self.StructurePanel.SetSizer(self.StructurePanelSizer)
-    
-    def _init_Editor(self, prnt):
-        self.Editor = wx.Panel(id=ID_DATATYPEEDITORPANEL, name='', parent=prnt,
-              size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
-
-        self.staticbox = wx.StaticBox(id=ID_DATATYPEEDITORSTATICBOX,
-              label=_('Type infos:'), name='staticBox1', parent=self.Editor,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.staticText1 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT1,
-              label=_('Derivation Type:'), name='staticText1', parent=self.Editor,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.DerivationType = wx.ComboBox(id=ID_DATATYPEEDITORDERIVATIONTYPE,
-              name='DerivationType', parent=self.Editor, pos=wx.Point(0, 0),
-              size=wx.Size(200, 28), style=wx.CB_READONLY)
-        self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, id=ID_DATATYPEEDITORDERIVATIONTYPE)
-
+        self.MainSizer.AddGrowableCol(0)
+        self.MainSizer.AddGrowableRow(1)
+        
+        top_sizer = wx.BoxSizer(wx.HORIZONTAL)
+        self.MainSizer.AddSizer(top_sizer, border=5, 
+              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+        
+        derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
+        top_sizer.AddWindow(derivation_type_label, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
+        
+        self.DerivationType = wx.ComboBox(self.Editor,
+              size=wx.Size(200, -1), style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
+        top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW|wx.RIGHT)
+        
+        typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
+        typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
+        self.MainSizer.AddSizer(typeinfos_sizer, border=5, 
+              flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+        
         # Panel for Directly derived data types
 
-        self.DirectlyPanel = wx.Panel(id=ID_DATATYPEEDITORDIRECTLYPANEL,
-              name='DirectlyPanel', parent=self.Editor, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
-        self.staticText2 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT2,
-              label=_('Base Type:'), name='staticText2', parent=self.DirectlyPanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.DirectlyBaseType = wx.ComboBox(id=ID_DATATYPEEDITORDIRECTLYBASETYPE, 
-              name='DirectlyBaseType', parent=self.DirectlyPanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 28), style=wx.CB_READONLY)
-        self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORDIRECTLYBASETYPE)
-
-        self.staticText3 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT3,
-              label=_('Initial Value:'), name='staticText3', parent=self.DirectlyPanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.DirectlyInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE, 
-              name='DirectlyInitialValue', parent=self.DirectlyPanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_MULTILINE|wx.TE_RICH)
-        self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE)
-
+        self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
+        typeinfos_sizer.AddWindow(self.DirectlyPanel, 1)
+        
+        directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        directly_basetype_label = wx.StaticText(self.DirectlyPanel, 
+              label=_('Base Type:'))
+        directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyPanel)
+        directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5, 
+              flag=wx.GROW|wx.ALL)
+        
+        directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
+              label=_('Initial Value:'))
+        directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel, 
+              style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_RICH)
+        self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
+        directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5, 
+              flag=wx.ALL)
+        
+        self.DirectlyPanel.SetSizer(directly_panel_sizer)
+        
         # Panel for Subrange data types
 
-        self.SubrangePanel = wx.Panel(id=ID_DATATYPEEDITORSUBRANGEPANEL,
-              name='SubrangePanel', parent=self.Editor, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
-        self.staticText4 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT4,
-              label=_('Base Type:'), name='staticText4', parent=self.SubrangePanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.SubrangeBaseType = wx.ComboBox(id=ID_DATATYPEEDITORSUBRANGEBASETYPE, 
-              name='SubrangeBaseType', parent=self.SubrangePanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 28), style=wx.CB_READONLY)
-        self.SubrangeBaseType.SetBackgroundColour(wx.BLUE)
-        self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, id=ID_DATATYPEEDITORSUBRANGEBASETYPE)
-
-        self.staticText5 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT5,
-              label=_('Initial Value:'), name='staticText5', parent=self.SubrangePanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.SubrangeInitialValue = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE, 
-              name='SubrangeInitialValue', parent=self.SubrangePanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
-        self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE)
-
-        self.staticText6 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT6,
-              label=_('Minimum:'), name='staticText6', parent=self.SubrangePanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.SubrangeMinimum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMINIMUM, 
-              name='SubrangeMinimum', parent=self.SubrangePanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
-        self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, id=ID_DATATYPEEDITORSUBRANGEMINIMUM)
-
-        self.staticText7 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT7,
-              label=_('Maximum:'), name='staticText7', parent=self.SubrangePanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.SubrangeMaximum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMAXIMUM, 
-              name='SubrangeMaximum', parent=self.SubrangePanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
-        self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, id=ID_DATATYPEEDITORSUBRANGEMAXIMUM)
-
+        self.SubrangePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
+        typeinfos_sizer.AddWindow(self.SubrangePanel, 1)
+        
+        subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
+        
+        subrange_basetype_label = wx.StaticText(self.SubrangePanel,
+              label=_('Base Type:'))
+        subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, 
+              self.SubrangeBaseType)
+        subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5, 
+              flag=wx.GROW|wx.ALL)
+        
+        subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
+              label=_('Initial Value:'))
+        subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel, 
+              style=wx.TAB_TRAVERSAL)
+        self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue)
+        subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5, 
+              flag=wx.GROW|wx.ALL)
+        
+        subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
+        subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
+        self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum)
+        subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5, 
+              flag=wx.GROW|wx.ALL)
+        
+        for i in xrange(2):
+            subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
+        
+        subrange_maximum_label = wx.StaticText(self.SubrangePanel,
+              label=_('Maximum:'))
+        subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
+        self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum)
+        
+        subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5, 
+              flag=wx.GROW|wx.ALL)
+        
+        self.SubrangePanel.SetSizer(subrange_panel_sizer)
+        
         # Panel for Enumerated data types
-
-        self.EnumeratedPanel = wx.Panel(id=ID_DATATYPEEDITORENUMERATEDPANEL,
-              name='EnumeratedPanel', parent=self.Editor, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
-        self.EnumeratedValues = CustomEditableListBox(id=ID_DATATYPEEDITORENUMERATEDVALUES, 
-              name='EnumeratedValues', parent=self.EnumeratedPanel, label=_("Values:"), pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
+        
+        self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
+        typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1)
+        
+        enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        self.EnumeratedValues = CustomEditableListBox(self.EnumeratedPanel, 
+              label=_("Values:"), style=wx.gizmos.EL_ALLOW_NEW| 
+                                        wx.gizmos.EL_ALLOW_EDIT| 
+                                        wx.gizmos.EL_ALLOW_DELETE)
         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
-        
-        self.staticText8 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT8,
-              label=_('Initial Value:'), name='staticText8', parent=self.EnumeratedPanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.EnumeratedInitialValue = wx.ComboBox(id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE, 
-              name='EnumeratedInitialValue', parent=self.EnumeratedPanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 28), style=wx.CB_READONLY)
-        self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE)
+        enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5, 
+              flag=wx.GROW|wx.ALL)
+        
+        enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
+        enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
+        
+        enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
+              label=_('Initial Value:'))
+        enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1, 
+              border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel, 
+              style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
+        enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1, 
+              border=5, flag=wx.ALL)
+        
+        self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
         
         # Panel for Array data types
 
-        self.ArrayPanel = wx.Panel(id=ID_DATATYPEEDITORARRAYPANEL,
-              name='ArrayPanel', parent=self.Editor, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
-        self.staticText9 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT9,
-              label=_('Base Type:'), name='staticText9', parent=self.ArrayPanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.ArrayBaseType = wx.ComboBox(id=ID_DATATYPEEDITORARRAYBASETYPE, 
-              name='ArrayBaseType', parent=self.ArrayPanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 28), style=wx.CB_READONLY)
-        self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORARRAYBASETYPE)
-
-        self.ArrayDimensions = CustomEditableListBox(id=ID_DATATYPEEDITORARRAYDIMENSIONS, 
-              name='ArrayDimensions', parent=self.ArrayPanel, label=_("Dimensions:"), pos=wx.Point(0, 0),
-              size=wx.Size(0, 24), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
-        for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
+        self.ArrayPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
+        typeinfos_sizer.AddWindow(self.ArrayPanel, 1)
+        
+        array_panel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
+        array_panel_sizer.AddGrowableCol(0)
+        array_panel_sizer.AddGrowableCol(1)
+        array_panel_sizer.AddGrowableRow(1)
+        
+        array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL)
+        array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW)
+        
+        array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
+        array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
+        array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5, 
+              flag=wx.GROW|wx.ALL)
+    
+        array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
+        array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
+        
+        array_initialvalue_label = wx.StaticText(self.ArrayPanel,
+              label=_('Initial Value:'))
+        array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5, 
+              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+        
+        self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
+              style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_RICH)
+        self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
+        array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5, 
+              flag=wx.ALL)        
+        
+        self.ArrayDimensions = CustomEditableListBox(self.ArrayPanel, 
+              label=_("Dimensions:"), style=wx.gizmos.EL_ALLOW_NEW|
+                                            wx.gizmos.EL_ALLOW_EDIT|
+                                            wx.gizmos.EL_ALLOW_DELETE)
+        for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton", 
+                     "_OnUpButton", "_OnDownButton"]:
             setattr(self.EnumeratedValues, func, self.OnDimensionsChanged)
-        
-        self.staticText10 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT10,
-              label=_('Initial Value:'), name='staticText10', parent=self.ArrayPanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.ArrayInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORARRAYINITIALVALUE, 
-              name='ArrayInitialValue', parent=self.ArrayPanel, pos=wx.Point(0, 0),
-              size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_MULTILINE|wx.TE_RICH)
-        self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, id=ID_DATATYPEEDITORARRAYINITIALVALUE)
+        array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5, 
+              flag=wx.GROW|wx.ALL)
+        
+        self.ArrayPanel.SetSizer(array_panel_sizer)
         
         # Panel for Structure data types
         
-        self.StructurePanel = wx.Panel(id=ID_DATATYPEEDITORSTRUCTUREPANEL,
-              name='StructurePanel', parent=self.Editor, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-        
-        self.staticText11 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT11,
-              label=_('Elements :'), name='staticText11', parent=self.StructurePanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.StructureElementsGrid = CustomGrid(id=ID_DATATYPEEDITORSTRUCTUREELEMENTSGRID,
-              name='StructureElementsGrid', parent=self.StructurePanel, pos=wx.Point(0, 0), 
+        self.StructurePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
+        typeinfos_sizer.AddWindow(self.StructurePanel, 1)
+        
+        structure_panel_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
+        structure_panel_sizer.AddGrowableCol(0)
+        structure_panel_sizer.AddGrowableRow(1)
+        
+        structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
+        structure_button_sizer.AddGrowableCol(0)
+        structure_button_sizer.AddGrowableRow(0)
+        structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5, 
+              flag=wx.ALL|wx.GROW)
+        
+        structure_elements_label = wx.StaticText(self.StructurePanel,
+              label=_('Elements :'))
+        structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
+        
+        for name, bitmap, help in [
+                ("StructureAddButton", "add_element", _("Add element")),
+                ("StructureDeleteButton", "remove_element", _("Remove element")),
+                ("StructureUpButton", "up", _("Move element up")),
+                ("StructureDownButton", "down", _("Move element down"))]:
+            button = wx.lib.buttons.GenBitmapButton(self.StructurePanel,
+                  bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
+            button.SetToolTipString(help)
+            setattr(self, name, button)
+            structure_button_sizer.AddWindow(button)
+        
+        self.StructureElementsGrid = CustomGrid(self.StructurePanel, 
               size=wx.Size(0, 150), style=wx.VSCROLL)
-        if wx.VERSION >= (2, 6, 0):
-            self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnStructureElementsGridCellChange)
-            self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnStructureElementsGridEditorShown)
-        else:
-            wx.grid.EVT_GRID_CELL_CHANGE(self.StructureElementsGrid, self.OnStructureElementsGridCellChange)
-            wx.grid.EVT_GRID_EDITOR_SHOWN(self.StructureElementsGrid, self.OnStructureElementsGridEditorShown)
-        
-        self.StructureAddButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREADDBUTTON, label=_('Add'),
-              name='StructureAddButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
-              size=wx.DefaultSize, style=0)
-        
-        self.StructureDeleteButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON, label=_('Delete'),
-              name='StructureDeleteButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
-              size=wx.DefaultSize, style=0)
-        
-        self.StructureUpButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREUPBUTTON, label='^',
-              name='StructureUpButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
-              size=wx.Size(32, 32), style=0)
-        
-        self.StructureDownButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREDOWNBUTTON, label='v',
-              name='StructureDownButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
-              size=wx.Size(32, 32), style=0)
-        
-        self._init_sizers()
-
+        self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, 
+              self.OnStructureElementsGridCellChange)
+        self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, 
+              self.OnStructureElementsGridEditorShown)
+        structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
+        
+        self.StructurePanel.SetSizer(structure_panel_sizer)
+        
+        self.Editor.SetSizer(self.MainSizer)
+        
     def __init__(self, parent, tagname, window, controler):
         EditorPanel.__init__(self, parent, tagname, window, controler)