DataTypeEditor.py
changeset 391 07447ee3538e
parent 389 6a72016d721a
child 407 0a324a874981
child 427 22d16c457d87
equal deleted inserted replaced
390:020420ad8914 391:07447ee3538e
    39 
    39 
    40 #-------------------------------------------------------------------------------
    40 #-------------------------------------------------------------------------------
    41 #                            Structure Elements Table
    41 #                            Structure Elements Table
    42 #-------------------------------------------------------------------------------
    42 #-------------------------------------------------------------------------------
    43 
    43 
       
    44 def GetElementsTableColnames():
       
    45     _ = lambda x : x
       
    46     return ["#", _("Name"), _("Type"), _("Initial Value")]
       
    47 
    44 class ElementsTable(wx.grid.PyGridTableBase):
    48 class ElementsTable(wx.grid.PyGridTableBase):
    45     
    49     
    46     """
    50     """
    47     A custom wx.grid.Grid Table using user supplied data
    51     A custom wx.grid.Grid Table using user supplied data
    48     """
    52     """
    64         return len(self.colnames)
    68         return len(self.colnames)
    65         
    69         
    66     def GetNumberRows(self):
    70     def GetNumberRows(self):
    67         return len(self.data)
    71         return len(self.data)
    68 
    72 
    69     def GetColLabelValue(self, col):
    73     def GetColLabelValue(self, col, translate=True):
    70         if col < len(self.colnames):
    74         if col < len(self.colnames):
       
    75             if translate:
       
    76                 return _(self.colnames[col])
    71             return self.colnames[col]
    77             return self.colnames[col]
    72 
    78 
    73     def GetRowLabelValues(self, row):
    79     def GetRowLabelValues(self, row, translate=True):
    74         return row
    80         return row
    75 
    81 
    76     def GetValue(self, row, col):
    82     def GetValue(self, row, col):
    77         if row < self.GetNumberRows():
    83         if row < self.GetNumberRows():
    78             if col == 0:
    84             if col == 0:
    79                 return row + 1
    85                 return row + 1
    80             name = str(self.data[row].get(self.GetColLabelValue(col), ""))
    86             name = str(self.data[row].get(self.GetColLabelValue(col, False), ""))
    81             return name
    87             return name
    82     
    88     
    83     def SetValue(self, row, col, value):
    89     def SetValue(self, row, col, value):
    84         if col < len(self.colnames):
    90         if col < len(self.colnames):
    85             colname = self.GetColLabelValue(col)
    91             colname = self.GetColLabelValue(col, False)
    86             if colname == "Name":
    92             if colname == "Name":
    87                 self.old_value = self.data[row][colname]
    93                 self.old_value = self.data[row][colname]
    88             self.data[row][colname] = value
    94             self.data[row][colname] = value
    89     
    95     
    90     def GetValueByName(self, row, colname):
    96     def GetValueByName(self, row, colname):
   138         appropriate renderer given the column name.
   144         appropriate renderer given the column name.
   139 
   145 
   140         Otherwise default to the default renderer.
   146         Otherwise default to the default renderer.
   141         """
   147         """
   142         
   148         
   143         typelist = None
       
   144         accesslist = None
       
   145         for row in range(self.GetNumberRows()):
   149         for row in range(self.GetNumberRows()):
   146             for col in range(self.GetNumberCols()):
   150             for col in range(self.GetNumberCols()):
   147                 editor = None
   151                 editor = None
   148                 renderer = None
   152                 renderer = None
   149                 colname = self.GetColLabelValue(col)
   153                 colname = self.GetColLabelValue(col, False)
   150                 if col != 0:
   154                 if col != 0:
   151                     grid.SetReadOnly(row, col, False)
   155                     grid.SetReadOnly(row, col, False)
   152                     if colname == "Name":
   156                     if colname == "Name":
   153                         editor = wx.grid.GridCellTextEditor()
   157                         editor = wx.grid.GridCellTextEditor()
   154                         renderer = wx.grid.GridCellStringRenderer()
   158                         renderer = wx.grid.GridCellStringRenderer()
   225  ID_DATATYPEEDITORSTATICTEXT7, ID_DATATYPEEDITORSTATICTEXT8,
   229  ID_DATATYPEEDITORSTATICTEXT7, ID_DATATYPEEDITORSTATICTEXT8,
   226  ID_DATATYPEEDITORSTATICTEXT9, ID_DATATYPEEDITORSTATICTEXT10, 
   230  ID_DATATYPEEDITORSTATICTEXT9, ID_DATATYPEEDITORSTATICTEXT10, 
   227  ID_DATATYPEEDITORSTATICTEXT11, 
   231  ID_DATATYPEEDITORSTATICTEXT11, 
   228 ] = [wx.NewId() for _init_ctrls in range(35)]
   232 ] = [wx.NewId() for _init_ctrls in range(35)]
   229 
   233 
       
   234 def GetDatatypeTypes():
       
   235     _ = lambda x : x
       
   236     return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")]
       
   237 DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
       
   238 
   230 class DataTypeEditor(wx.Panel):
   239 class DataTypeEditor(wx.Panel):
   231     
   240     
   232     def _init_coll_MainSizer_Items(self, parent):
   241     def _init_coll_MainSizer_Items(self, parent):
   233         parent.AddSizer(self.TopSizer, 0, border=5, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
   242         parent.AddSizer(self.TopSizer, 0, border=5, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
   234         parent.AddSizer(self.TypeInfosSizer, 0, border=5, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   243         parent.AddSizer(self.TypeInfosSizer, 0, border=5, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   236     def _init_coll_MainSizer_Growables(self, parent):
   245     def _init_coll_MainSizer_Growables(self, parent):
   237         parent.AddGrowableCol(0)
   246         parent.AddGrowableCol(0)
   238         parent.AddGrowableRow(1)
   247         parent.AddGrowableRow(1)
   239 
   248 
   240     def _init_coll_TopSizer_Items(self, parent):
   249     def _init_coll_TopSizer_Items(self, parent):
   241         parent.AddWindow(self.staticText1, 0, border=5, flag=wx.GROW|wx.LEFT)
   250         parent.AddWindow(self.staticText1, 0, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
   242         parent.AddWindow(self.DerivationType, 0, border=0, flag=wx.GROW)
   251         parent.AddWindow(self.DerivationType, 0, border=5, flag=wx.GROW|wx.RIGHT)
   243 
   252 
   244     def _init_coll_TypeInfosSizer_Items(self, parent):
   253     def _init_coll_TypeInfosSizer_Items(self, parent):
   245         parent.AddWindow(self.DirectlyPanel, 1, border=0, flag=wx.ALL)
   254         parent.AddWindow(self.DirectlyPanel, 1, border=0, flag=wx.ALL)
   246         parent.AddWindow(self.SubrangePanel, 1, border=0, flag=wx.ALL)
   255         parent.AddWindow(self.SubrangePanel, 1, border=0, flag=wx.ALL)
   247         parent.AddWindow(self.EnumeratedPanel, 1, border=0, flag=wx.GROW|wx.ALL)
   256         parent.AddWindow(self.EnumeratedPanel, 1, border=0, flag=wx.GROW|wx.ALL)
   248         parent.AddWindow(self.ArrayPanel, 1, border=0, flag=wx.ALL)
   257         parent.AddWindow(self.ArrayPanel, 1, border=0, flag=wx.ALL)
   249         parent.AddWindow(self.StructurePanel, 1, border=0, flag=wx.GROW|wx.ALL)
   258         parent.AddWindow(self.StructurePanel, 1, border=0, flag=wx.GROW|wx.ALL)
   250 
   259 
   251     def _init_coll_DirectlyPanelSizer_Items(self, parent):
   260     def _init_coll_DirectlyPanelSizer_Items(self, parent):
   252         parent.AddWindow(self.staticText2, 1, border=5, flag=wx.GROW|wx.ALL)
   261         parent.AddWindow(self.staticText2, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   253         parent.AddWindow(self.DirectlyBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
   262         parent.AddWindow(self.DirectlyBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
   254         parent.AddWindow(self.staticText3, 1, border=5, flag=wx.GROW|wx.ALL)
   263         parent.AddWindow(self.staticText3, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   255         parent.AddWindow(self.DirectlyInitialValue, 1, border=5, flag=wx.GROW|wx.ALL)
   264         parent.AddWindow(self.DirectlyInitialValue, 1, border=5, flag=wx.GROW|wx.ALL)
   256 
   265 
   257     def _init_coll_SubrangePanelSizer_Items(self, parent):
   266     def _init_coll_SubrangePanelSizer_Items(self, parent):
   258         parent.AddWindow(self.staticText4, 1, border=5, flag=wx.GROW|wx.ALL)
   267         parent.AddWindow(self.staticText4, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   259         parent.AddWindow(self.SubrangeBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
   268         parent.AddWindow(self.SubrangeBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
   260         parent.AddWindow(self.staticText5, 1, border=5, flag=wx.GROW|wx.ALL)
   269         parent.AddWindow(self.staticText5, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   261         parent.AddWindow(self.SubrangeInitialValue, 1, border=5, flag=wx.GROW|wx.ALL)
   270         parent.AddWindow(self.SubrangeInitialValue, 1, border=5, flag=wx.GROW|wx.ALL)
   262         parent.AddWindow(self.staticText6, 1, border=5, flag=wx.GROW|wx.ALL)
   271         parent.AddWindow(self.staticText6, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   263         parent.AddWindow(self.SubrangeMinimum, 1, border=5, flag=wx.GROW|wx.ALL)
   272         parent.AddWindow(self.SubrangeMinimum, 1, border=5, flag=wx.GROW|wx.ALL)
   264         parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL)
   273         parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL)
   265         parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL)
   274         parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL)
   266         parent.AddWindow(self.staticText7, 1, border=5, flag=wx.GROW|wx.ALL)
   275         parent.AddWindow(self.staticText7, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   267         parent.AddWindow(self.SubrangeMaximum, 1, border=5, flag=wx.GROW|wx.ALL)
   276         parent.AddWindow(self.SubrangeMaximum, 1, border=5, flag=wx.GROW|wx.ALL)
   268         
   277         
   269     def _init_coll_EnumeratedPanelSizer_Items(self, parent):
   278     def _init_coll_EnumeratedPanelSizer_Items(self, parent):
   270         parent.AddWindow(self.EnumeratedValues, 2, border=5, flag=wx.GROW|wx.ALL)
   279         parent.AddWindow(self.EnumeratedValues, 1, border=5, flag=wx.GROW|wx.ALL)
   271         parent.AddWindow(self.staticText8, 1, border=5, flag=wx.GROW|wx.ALL)
   280         parent.AddSizer(self.EnumeratedPanelRightSizer, 1, border=0, flag=0)
       
   281         
       
   282     def _init_coll_EnumeratedPanelRightSizer_Items(self, parent):
       
   283         parent.AddWindow(self.staticText8, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   272         parent.AddWindow(self.EnumeratedInitialValue, 1, border=5, flag=wx.ALL)
   284         parent.AddWindow(self.EnumeratedInitialValue, 1, border=5, flag=wx.ALL)
   273 
   285 
   274     def _init_coll_ArrayPanelSizer_Items(self, parent):
   286     def _init_coll_ArrayPanelSizer_Items(self, parent):
   275         parent.AddSizer(self.ArrayPanelLeftSizer, 0, border=0, flag=wx.GROW)
   287         parent.AddSizer(self.ArrayPanelLeftSizer, 0, border=0, flag=wx.GROW)
   276         parent.AddSizer(self.ArrayPanelRightSizer, 0, border=0, flag=wx.GROW)
   288         parent.AddSizer(self.ArrayPanelRightSizer, 0, border=0, flag=0)
   277         parent.AddWindow(self.ArrayDimensions, 0, border=5, flag=wx.GROW|wx.ALL)
   289         parent.AddWindow(self.ArrayDimensions, 0, border=5, flag=wx.GROW|wx.ALL)
   278         
   290         
   279     def _init_coll_ArrayPanelSizer_Growables(self, parent):
   291     def _init_coll_ArrayPanelSizer_Growables(self, parent):
   280         parent.AddGrowableCol(0)
   292         parent.AddGrowableCol(0)
   281         parent.AddGrowableCol(1)
   293         parent.AddGrowableCol(1)
   282         parent.AddGrowableRow(1)
   294         parent.AddGrowableRow(1)
   283 
   295 
   284     def _init_coll_ArrayPanelLeftSizer_Items(self, parent):
   296     def _init_coll_ArrayPanelLeftSizer_Items(self, parent):
   285         parent.AddWindow(self.staticText9, 1, border=5, flag=wx.GROW|wx.ALL)
   297         parent.AddWindow(self.staticText9, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   286         parent.AddWindow(self.ArrayBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
   298         parent.AddWindow(self.ArrayBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
   287     
   299     
   288     def _init_coll_ArrayPanelRightSizer_Items(self, parent):
   300     def _init_coll_ArrayPanelRightSizer_Items(self, parent):
   289         parent.AddWindow(self.staticText10, 1, border=5, flag=wx.GROW|wx.ALL)
   301         parent.AddWindow(self.staticText10, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   290         parent.AddWindow(self.ArrayInitialValue, 1, border=5, flag=wx.GROW|wx.ALL)    
   302         parent.AddWindow(self.ArrayInitialValue, 1, border=5, flag=wx.GROW|wx.ALL)    
   291 
   303 
   292     def _init_coll_StructurePanelSizer_Items(self, parent):
   304     def _init_coll_StructurePanelSizer_Items(self, parent):
   293         parent.AddWindow(self.staticText11, 0, border=5, flag=wx.GROW|wx.ALL)
   305         parent.AddWindow(self.staticText11, 0, border=5, flag=wx.ALL)
   294         parent.AddWindow(self.StructureElementsGrid, 0, border=0, flag=wx.GROW)
   306         parent.AddWindow(self.StructureElementsGrid, 0, border=0, flag=wx.GROW)
   295         parent.AddSizer(self.StructurePanelButtonSizer, 0, border=0, flag=wx.ALIGN_RIGHT)
   307         parent.AddSizer(self.StructurePanelButtonSizer, 0, border=0, flag=wx.ALIGN_RIGHT)
   296         
   308         
   297     def _init_coll_StructurePanelSizer_Growables(self, parent):
   309     def _init_coll_StructurePanelSizer_Growables(self, parent):
   298         parent.AddGrowableCol(0)
   310         parent.AddGrowableCol(0)
   299         parent.AddGrowableRow(1)
   311         parent.AddGrowableRow(1)
   300 
   312 
   301     def _init_coll_StructurePanelButtonSizer_Items(self, parent):
   313     def _init_coll_StructurePanelButtonSizer_Items(self, parent):
   302         parent.AddWindow(self.StructureAddButton, 1, border=5, flag=wx.GROW|wx.ALL)
   314         parent.AddWindow(self.StructureAddButton, 0, border=5, flag=wx.ALL)
   303         parent.AddWindow(self.StructureDeleteButton, 1, border=5, flag=wx.GROW|wx.ALL)
   315         parent.AddWindow(self.StructureDeleteButton, 0, border=5, flag=wx.ALL)
   304         parent.AddWindow(self.StructureUpButton, 1, border=5, flag=wx.GROW|wx.ALL)
   316         parent.AddWindow(self.StructureUpButton, 0, border=5, flag=wx.ALL)
   305         parent.AddWindow(self.StructureDownButton, 1, border=5, flag=wx.GROW|wx.ALL)
   317         parent.AddWindow(self.StructureDownButton, 0, border=5, flag=wx.ALL)
   306     
   318     
   307     def _init_sizers(self):
   319     def _init_sizers(self):
   308         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
   320         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
   309         self.TopSizer = wx.BoxSizer(wx.HORIZONTAL)
   321         self.TopSizer = wx.BoxSizer(wx.HORIZONTAL)
   310         self.TypeInfosSizer = wx.StaticBoxSizer(self.staticbox, wx.HORIZONTAL)
   322         self.TypeInfosSizer = wx.StaticBoxSizer(self.staticbox, wx.HORIZONTAL)
   311         self.DirectlyPanelSizer = wx.BoxSizer(wx.HORIZONTAL)
   323         self.DirectlyPanelSizer = wx.BoxSizer(wx.HORIZONTAL)
   312         self.SubrangePanelSizer = wx.GridSizer(cols=4, hgap=0, rows=3, vgap=0)
   324         self.SubrangePanelSizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
   313         self.EnumeratedPanelSizer = wx.BoxSizer(wx.HORIZONTAL)
   325         self.EnumeratedPanelSizer = wx.BoxSizer(wx.HORIZONTAL)
   314         self.ArrayPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=0)
   326         self.EnumeratedPanelRightSizer = wx.BoxSizer(wx.HORIZONTAL)
       
   327         self.ArrayPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
   315         self.ArrayPanelLeftSizer = wx.BoxSizer(wx.HORIZONTAL)
   328         self.ArrayPanelLeftSizer = wx.BoxSizer(wx.HORIZONTAL)
   316         self.ArrayPanelRightSizer = wx.BoxSizer(wx.HORIZONTAL)
   329         self.ArrayPanelRightSizer = wx.BoxSizer(wx.HORIZONTAL)
   317         self.StructurePanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=0)
   330         self.StructurePanelSizer = wx.FlexGridSizer(cols=1, hgap=5, rows=3, vgap=0)
   318         self.StructurePanelButtonSizer = wx.BoxSizer(wx.HORIZONTAL)
   331         self.StructurePanelButtonSizer = wx.BoxSizer(wx.HORIZONTAL)
   319         self._init_coll_MainSizer_Items(self.MainSizer)
   332         self._init_coll_MainSizer_Items(self.MainSizer)
   320         self._init_coll_MainSizer_Growables(self.MainSizer)
   333         self._init_coll_MainSizer_Growables(self.MainSizer)
   321         self._init_coll_TopSizer_Items(self.TopSizer)
   334         self._init_coll_TopSizer_Items(self.TopSizer)
   322         self._init_coll_TypeInfosSizer_Items(self.TypeInfosSizer)
   335         self._init_coll_TypeInfosSizer_Items(self.TypeInfosSizer)
   323         self._init_coll_DirectlyPanelSizer_Items(self.DirectlyPanelSizer)
   336         self._init_coll_DirectlyPanelSizer_Items(self.DirectlyPanelSizer)
   324         self._init_coll_SubrangePanelSizer_Items(self.SubrangePanelSizer)
   337         self._init_coll_SubrangePanelSizer_Items(self.SubrangePanelSizer)
   325         self._init_coll_EnumeratedPanelSizer_Items(self.EnumeratedPanelSizer)
   338         self._init_coll_EnumeratedPanelSizer_Items(self.EnumeratedPanelSizer)
       
   339         self._init_coll_EnumeratedPanelRightSizer_Items(self.EnumeratedPanelRightSizer)
   326         self._init_coll_ArrayPanelSizer_Items(self.ArrayPanelSizer)
   340         self._init_coll_ArrayPanelSizer_Items(self.ArrayPanelSizer)
   327         self._init_coll_ArrayPanelSizer_Growables(self.ArrayPanelSizer)
   341         self._init_coll_ArrayPanelSizer_Growables(self.ArrayPanelSizer)
   328         self._init_coll_ArrayPanelLeftSizer_Items(self.ArrayPanelLeftSizer)
   342         self._init_coll_ArrayPanelLeftSizer_Items(self.ArrayPanelLeftSizer)
   329         self._init_coll_ArrayPanelRightSizer_Items(self.ArrayPanelRightSizer)
   343         self._init_coll_ArrayPanelRightSizer_Items(self.ArrayPanelRightSizer)
   330         self._init_coll_StructurePanelSizer_Items(self.StructurePanelSizer)
   344         self._init_coll_StructurePanelSizer_Items(self.StructurePanelSizer)
   341     def _init_ctrls(self, prnt):
   355     def _init_ctrls(self, prnt):
   342         wx.Panel.__init__(self, id=ID_DATATYPEEDITOR, name='', parent=prnt,
   356         wx.Panel.__init__(self, id=ID_DATATYPEEDITOR, name='', parent=prnt,
   343               size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
   357               size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
   344 
   358 
   345         self.staticbox = wx.StaticBox(id=ID_DATATYPEEDITORSTATICBOX,
   359         self.staticbox = wx.StaticBox(id=ID_DATATYPEEDITORSTATICBOX,
   346               label='Type infos:', name='staticBox1', parent=self,
   360               label=_('Type infos:'), name='staticBox1', parent=self,
   347               pos=wx.Point(0, 0), size=wx.Size(10, 0), style=0)
   361               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   348 
   362 
   349         self.staticText1 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT1,
   363         self.staticText1 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT1,
   350               label='Derivation Type:', name='staticText1', parent=self,
   364               label=_('Derivation Type:'), name='staticText1', parent=self,
   351               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   365               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   352 
   366 
   353         self.DerivationType = wx.ComboBox(id=ID_DATATYPEEDITORDERIVATIONTYPE,
   367         self.DerivationType = wx.ComboBox(id=ID_DATATYPEEDITORDERIVATIONTYPE,
   354               name='DerivationType', parent=self, pos=wx.Point(0, 0),
   368               name='DerivationType', parent=self, pos=wx.Point(0, 0),
   355               size=wx.Size(200, 28), style=wx.CB_READONLY)
   369               size=wx.Size(200, 28), style=wx.CB_READONLY)
   356         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, id=ID_DATATYPEEDITORDERIVATIONTYPE)
   370         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, id=ID_DATATYPEEDITORDERIVATIONTYPE)
   360         self.DirectlyPanel = wx.Panel(id=ID_DATATYPEEDITORDIRECTLYPANEL,
   374         self.DirectlyPanel = wx.Panel(id=ID_DATATYPEEDITORDIRECTLYPANEL,
   361               name='DirectlyPanel', parent=self, pos=wx.Point(0, 0),
   375               name='DirectlyPanel', parent=self, pos=wx.Point(0, 0),
   362               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   376               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   363 
   377 
   364         self.staticText2 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT2,
   378         self.staticText2 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT2,
   365               label='Base Type:', name='staticText2', parent=self.DirectlyPanel,
   379               label=_('Base Type:'), name='staticText2', parent=self.DirectlyPanel,
   366               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   380               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   367 
   381 
   368         self.DirectlyBaseType = wx.ComboBox(id=ID_DATATYPEEDITORDIRECTLYBASETYPE, 
   382         self.DirectlyBaseType = wx.ComboBox(id=ID_DATATYPEEDITORDIRECTLYBASETYPE, 
   369               name='DirectlyBaseType', parent=self.DirectlyPanel, pos=wx.Point(0, 0),
   383               name='DirectlyBaseType', parent=self.DirectlyPanel, pos=wx.Point(0, 0),
   370               size=wx.Size(0, 28), style=wx.CB_READONLY)
   384               size=wx.Size(0, 28), style=wx.CB_READONLY)
   371         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORDIRECTLYBASETYPE)
   385         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORDIRECTLYBASETYPE)
   372 
   386 
   373         self.staticText3 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT3,
   387         self.staticText3 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT3,
   374               label='Initial Value:', name='staticText3', parent=self.DirectlyPanel,
   388               label=_('Initial Value:'), name='staticText3', parent=self.DirectlyPanel,
   375               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   389               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   376 
   390 
   377         self.DirectlyInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE, 
   391         self.DirectlyInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE, 
   378               name='DirectlyInitialValue', parent=self.DirectlyPanel, pos=wx.Point(0, 0),
   392               name='DirectlyInitialValue', parent=self.DirectlyPanel, pos=wx.Point(0, 0),
   379               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_MULTILINE|wx.TE_RICH)
   393               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_MULTILINE|wx.TE_RICH)
   380         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE)
   394         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE)
   384         self.SubrangePanel = wx.Panel(id=ID_DATATYPEEDITORSUBRANGEPANEL,
   398         self.SubrangePanel = wx.Panel(id=ID_DATATYPEEDITORSUBRANGEPANEL,
   385               name='SubrangePanel', parent=self, pos=wx.Point(0, 0),
   399               name='SubrangePanel', parent=self, pos=wx.Point(0, 0),
   386               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   400               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   387 
   401 
   388         self.staticText4 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT4,
   402         self.staticText4 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT4,
   389               label='Base Type:', name='staticText4', parent=self.SubrangePanel,
   403               label=_('Base Type:'), name='staticText4', parent=self.SubrangePanel,
   390               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   404               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   391 
   405 
   392         self.SubrangeBaseType = wx.ComboBox(id=ID_DATATYPEEDITORSUBRANGEBASETYPE, 
   406         self.SubrangeBaseType = wx.ComboBox(id=ID_DATATYPEEDITORSUBRANGEBASETYPE, 
   393               name='SubrangeBaseType', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   407               name='SubrangeBaseType', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   394               size=wx.Size(0, 28), style=wx.CB_READONLY)
   408               size=wx.Size(0, 28), style=wx.CB_READONLY)
   395         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, id=ID_DATATYPEEDITORSUBRANGEBASETYPE)
   409         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, id=ID_DATATYPEEDITORSUBRANGEBASETYPE)
   396 
   410 
   397         self.staticText5 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT5,
   411         self.staticText5 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT5,
   398               label='Initial Value:', name='staticText5', parent=self.SubrangePanel,
   412               label=_('Initial Value:'), name='staticText5', parent=self.SubrangePanel,
   399               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   413               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   400 
   414 
   401         self.SubrangeInitialValue = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE, 
   415         self.SubrangeInitialValue = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE, 
   402               name='SubrangeInitialValue', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   416               name='SubrangeInitialValue', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   403               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   417               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   404         self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE)
   418         self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE)
   405 
   419 
   406         self.staticText6 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT6,
   420         self.staticText6 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT6,
   407               label='Minimum:', name='staticText6', parent=self.SubrangePanel,
   421               label=_('Minimum:'), name='staticText6', parent=self.SubrangePanel,
   408               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   422               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   409 
   423 
   410         self.SubrangeMinimum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMINIMUM, 
   424         self.SubrangeMinimum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMINIMUM, 
   411               name='SubrangeMinimum', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   425               name='SubrangeMinimum', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   412               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   426               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   413         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, id=ID_DATATYPEEDITORSUBRANGEMINIMUM)
   427         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, id=ID_DATATYPEEDITORSUBRANGEMINIMUM)
   414 
   428 
   415         self.staticText7 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT7,
   429         self.staticText7 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT7,
   416               label='Maximum:', name='staticText7', parent=self.SubrangePanel,
   430               label=_('Maximum:'), name='staticText7', parent=self.SubrangePanel,
   417               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   431               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   418 
   432 
   419         self.SubrangeMaximum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMAXIMUM, 
   433         self.SubrangeMaximum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMAXIMUM, 
   420               name='SubrangeMaximum', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   434               name='SubrangeMaximum', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   421               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   435               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   422         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, id=ID_DATATYPEEDITORSUBRANGEMAXIMUM)
   436         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, id=ID_DATATYPEEDITORSUBRANGEMAXIMUM)
   426         self.EnumeratedPanel = wx.Panel(id=ID_DATATYPEEDITORENUMERATEDPANEL,
   440         self.EnumeratedPanel = wx.Panel(id=ID_DATATYPEEDITORENUMERATEDPANEL,
   427               name='EnumeratedPanel', parent=self, pos=wx.Point(0, 0),
   441               name='EnumeratedPanel', parent=self, pos=wx.Point(0, 0),
   428               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   442               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   429 
   443 
   430         self.EnumeratedValues = wx.gizmos.EditableListBox(id=ID_DATATYPEEDITORENUMERATEDVALUES, 
   444         self.EnumeratedValues = wx.gizmos.EditableListBox(id=ID_DATATYPEEDITORENUMERATEDVALUES, 
   431               name='EnumeratedValues', parent=self.EnumeratedPanel, label="Values:", pos=wx.Point(0, 0),
   445               name='EnumeratedValues', parent=self.EnumeratedPanel, label=_("Values:"), pos=wx.Point(0, 0),
   432               size=wx.Size(0, 0), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
   446               size=wx.Size(0, 0), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
   433         self.EnumeratedValues.GetListCtrl().Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEnumeratedValueEndEdit)
   447         self.EnumeratedValues.GetListCtrl().Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEnumeratedValueEndEdit)
   434         self.EnumeratedValues.GetNewButton().Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
   448         self.EnumeratedValues.GetEditButton().SetToolTipString(_("Edit item"))
   435         self.EnumeratedValues.GetDelButton().Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
   449         new_button = self.EnumeratedValues.GetNewButton()
   436         self.EnumeratedValues.GetUpButton().Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
   450         new_button.SetToolTipString(_("New item"))
   437         self.EnumeratedValues.GetDownButton().Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
   451         new_button.Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
       
   452         del_button = self.EnumeratedValues.GetDelButton()
       
   453         del_button.SetToolTipString(_("Delete item"))
       
   454         del_button.Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
       
   455         up_button = self.EnumeratedValues.GetUpButton()
       
   456         up_button.SetToolTipString(_("Move up"))
       
   457         up_button.Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
       
   458         down_button = self.EnumeratedValues.GetDownButton()
       
   459         down_button.SetToolTipString(_("Move down"))
       
   460         down_button.Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
   438         
   461         
   439         self.staticText8 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT8,
   462         self.staticText8 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT8,
   440               label='Initial Value:', name='staticText8', parent=self.EnumeratedPanel,
   463               label=_('Initial Value:'), name='staticText8', parent=self.EnumeratedPanel,
   441               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   464               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   442 
   465 
   443         self.EnumeratedInitialValue = wx.ComboBox(id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE, 
   466         self.EnumeratedInitialValue = wx.ComboBox(id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE, 
   444               name='EnumeratedInitialValue', parent=self.EnumeratedPanel, pos=wx.Point(0, 0),
   467               name='EnumeratedInitialValue', parent=self.EnumeratedPanel, pos=wx.Point(0, 0),
   445               size=wx.Size(0, 28), style=wx.CB_READONLY)
   468               size=wx.Size(0, 28), style=wx.CB_READONLY)
   446         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE)
   469         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE)
   450         self.ArrayPanel = wx.Panel(id=ID_DATATYPEEDITORARRAYPANEL,
   473         self.ArrayPanel = wx.Panel(id=ID_DATATYPEEDITORARRAYPANEL,
   451               name='ArrayPanel', parent=self, pos=wx.Point(0, 0),
   474               name='ArrayPanel', parent=self, pos=wx.Point(0, 0),
   452               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   475               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   453 
   476 
   454         self.staticText9 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT9,
   477         self.staticText9 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT9,
   455               label='Base Type:', name='staticText9', parent=self.ArrayPanel,
   478               label=_('Base Type:'), name='staticText9', parent=self.ArrayPanel,
   456               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   479               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   457 
   480 
   458         self.ArrayBaseType = wx.ComboBox(id=ID_DATATYPEEDITORARRAYBASETYPE, 
   481         self.ArrayBaseType = wx.ComboBox(id=ID_DATATYPEEDITORARRAYBASETYPE, 
   459               name='SubrangeBaseType', parent=self.ArrayPanel, pos=wx.Point(0, 0),
   482               name='SubrangeBaseType', parent=self.ArrayPanel, pos=wx.Point(0, 0),
   460               size=wx.Size(0, 28), style=wx.CB_READONLY)
   483               size=wx.Size(0, 28), style=wx.CB_READONLY)
   461         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORARRAYBASETYPE)
   484         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORARRAYBASETYPE)
   462 
   485 
   463         self.ArrayDimensions = wx.gizmos.EditableListBox(id=ID_DATATYPEEDITORARRAYDIMENSIONS, 
   486         self.ArrayDimensions = wx.gizmos.EditableListBox(id=ID_DATATYPEEDITORARRAYDIMENSIONS, 
   464               name='ArrayDimensions', parent=self.ArrayPanel, label="Dimensions:", pos=wx.Point(0, 0),
   487               name='ArrayDimensions', parent=self.ArrayPanel, label=_("Dimensions:"), pos=wx.Point(0, 0),
   465               size=wx.Size(0, 24), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
   488               size=wx.Size(0, 24), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
   466         self.ArrayDimensions.GetListCtrl().Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnDimensionsChanged)
   489         self.ArrayDimensions.GetListCtrl().Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnDimensionsChanged)
   467         self.ArrayDimensions.GetNewButton().Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
   490         self.ArrayDimensions.GetEditButton().SetToolTipString(_("Edit item"))
   468         self.ArrayDimensions.GetDelButton().Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
   491         new_button = self.ArrayDimensions.GetNewButton()
   469         self.ArrayDimensions.GetUpButton().Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
   492         new_button.SetToolTipString(_("New item"))
   470         self.ArrayDimensions.GetDownButton().Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
   493         new_button.Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
       
   494         del_button = self.ArrayDimensions.GetDelButton()
       
   495         del_button.SetToolTipString(_("Delete item"))
       
   496         del_button.Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
       
   497         up_button = self.ArrayDimensions.GetUpButton()
       
   498         up_button.SetToolTipString(_("Move up"))
       
   499         up_button.Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
       
   500         down_button = self.ArrayDimensions.GetDownButton()
       
   501         down_button.SetToolTipString(_("Move down"))
       
   502         down_button.Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
   471 
   503 
   472         self.staticText10 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT10,
   504         self.staticText10 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT10,
   473               label='Initial Value:', name='staticText10', parent=self.ArrayPanel,
   505               label=_('Initial Value:'), name='staticText10', parent=self.ArrayPanel,
   474               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   506               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   475 
   507 
   476         self.ArrayInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORARRAYINITIALVALUE, 
   508         self.ArrayInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORARRAYINITIALVALUE, 
   477               name='ArrayInitialValue', parent=self.ArrayPanel, pos=wx.Point(0, 0),
   509               name='ArrayInitialValue', parent=self.ArrayPanel, pos=wx.Point(0, 0),
   478               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_MULTILINE|wx.TE_RICH)
   510               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_MULTILINE|wx.TE_RICH)
   479         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, id=ID_DATATYPEEDITORARRAYINITIALVALUE)
   511         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, id=ID_DATATYPEEDITORARRAYINITIALVALUE)
   483         self.StructurePanel = wx.Panel(id=ID_DATATYPEEDITORSTRUCTUREPANEL,
   515         self.StructurePanel = wx.Panel(id=ID_DATATYPEEDITORSTRUCTUREPANEL,
   484               name='StructurePanel', parent=self, pos=wx.Point(0, 0),
   516               name='StructurePanel', parent=self, pos=wx.Point(0, 0),
   485               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   517               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   486         
   518         
   487         self.staticText11 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT11,
   519         self.staticText11 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT11,
   488               label='Elements :', name='staticText11', parent=self.StructurePanel,
   520               label=_('Elements :'), name='staticText11', parent=self.StructurePanel,
   489               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
   521               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   490 
   522 
   491         self.StructureElementsGrid = wx.grid.Grid(id=ID_DATATYPEEDITORSTRUCTUREELEMENTSGRID,
   523         self.StructureElementsGrid = wx.grid.Grid(id=ID_DATATYPEEDITORSTRUCTUREELEMENTSGRID,
   492               name='StructureElementsGrid', parent=self.StructurePanel, pos=wx.Point(0, 0), 
   524               name='StructureElementsGrid', parent=self.StructurePanel, pos=wx.Point(0, 0), 
   493               size=wx.Size(0, 150), style=wx.VSCROLL)
   525               size=wx.Size(0, 150), style=wx.VSCROLL)
   494         self.StructureElementsGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   526         self.StructureElementsGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   502             self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnStructureElementsGridEditorShown)
   534             self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnStructureElementsGridEditorShown)
   503         else:
   535         else:
   504             wx.grid.EVT_GRID_CELL_CHANGE(self.StructureElementsGrid, self.OnStructureElementsGridCellChange)
   536             wx.grid.EVT_GRID_CELL_CHANGE(self.StructureElementsGrid, self.OnStructureElementsGridCellChange)
   505             wx.grid.EVT_GRID_EDITOR_SHOWN(self.StructureElementsGrid, self.OnStructureElementsGridEditorShown)
   537             wx.grid.EVT_GRID_EDITOR_SHOWN(self.StructureElementsGrid, self.OnStructureElementsGridEditorShown)
   506 
   538 
   507         self.StructureAddButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREADDBUTTON, label='Add',
   539         self.StructureAddButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREADDBUTTON, label=_('Add'),
   508               name='StructureAddButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
   540               name='StructureAddButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
   509               size=wx.Size(72, 32), style=0)
   541               size=wx.DefaultSize, style=0)
   510         self.Bind(wx.EVT_BUTTON, self.OnStructureAddButton, id=ID_DATATYPEEDITORSTRUCTUREADDBUTTON)
   542         self.Bind(wx.EVT_BUTTON, self.OnStructureAddButton, id=ID_DATATYPEEDITORSTRUCTUREADDBUTTON)
   511 
   543 
   512         self.StructureDeleteButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON, label='Delete',
   544         self.StructureDeleteButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON, label=_('Delete'),
   513               name='StructureDeleteButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
   545               name='StructureDeleteButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
   514               size=wx.Size(72, 32), style=0)
   546               size=wx.DefaultSize, style=0)
   515         self.Bind(wx.EVT_BUTTON, self.OnStructureDeleteButton, id=ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON)
   547         self.Bind(wx.EVT_BUTTON, self.OnStructureDeleteButton, id=ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON)
   516 
   548 
   517         self.StructureUpButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREUPBUTTON, label='^',
   549         self.StructureUpButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREUPBUTTON, label='^',
   518               name='StructureUpButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
   550               name='StructureUpButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
   519               size=wx.Size(32, 32), style=0)
   551               size=wx.Size(32, 32), style=0)
   528 
   560 
   529     def __init__(self, parent, tagname, window, controler):
   561     def __init__(self, parent, tagname, window, controler):
   530         self._init_ctrls(parent)
   562         self._init_ctrls(parent)
   531         
   563         
   532         self.StructureElementDefaultValue = {"Name" : "", "Type" : "INT", "Initial Value" : ""}
   564         self.StructureElementDefaultValue = {"Name" : "", "Type" : "INT", "Initial Value" : ""}
   533         self.StructureElementsTable = ElementsTable(self, [], ["#", "Name", "Type", "Initial Value"])
   565         self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames())
   534         self.StructureColSizes = [40, 150, 100, 250]
   566         self.StructureColSizes = [40, 150, 100, 250]
   535         self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
   567         self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
   536         
   568         
   537         self.StructureElementsGrid.SetTable(self.StructureElementsTable)
   569         self.StructureElementsGrid.SetTable(self.StructureElementsTable)
   538         self.StructureElementsGrid.SetRowLabelSize(0)
   570         self.StructureElementsGrid.SetRowLabelSize(0)
   539         for col in range(self.StructureElementsTable.GetNumberCols()):
   571         for col in range(self.StructureElementsTable.GetNumberCols()):
   540             attr = wx.grid.GridCellAttr()
   572             attr = wx.grid.GridCellAttr()
   541             attr.SetAlignment(self.StructureColAlignements[col], wx.ALIGN_CENTRE)
   573             attr.SetAlignment(self.StructureColAlignements[col], wx.ALIGN_CENTRE)
   542             self.StructureElementsGrid.SetColAttr(col, attr)
   574             self.StructureElementsGrid.SetColAttr(col, attr)
   543             self.StructureElementsGrid.SetColSize(col, self.StructureColSizes[col])
   575             self.StructureElementsGrid.SetColMinimalWidth(col, self.StructureColSizes[col])
   544         
   576             self.StructureElementsGrid.AutoSizeColumn(col, False)
   545         self.DerivationType.Append("Directly")
   577         
   546         self.DerivationType.Append("Subrange")
   578         for datatype in GetDatatypeTypes():
   547         self.DerivationType.Append("Enumerated")
   579             self.DerivationType.Append(_(datatype))
   548         self.DerivationType.Append("Array")
       
   549         self.DerivationType.Append("Structure")
       
   550         self.SubrangePanel.Hide()
   580         self.SubrangePanel.Hide()
   551         self.EnumeratedPanel.Hide()
   581         self.EnumeratedPanel.Hide()
   552         self.ArrayPanel.Hide()
   582         self.ArrayPanel.Hide()
   553         self.StructurePanel.Hide()
   583         self.StructurePanel.Hide()
   554         self.CurrentPanel = "Directly"
   584         self.CurrentPanel = "Directly"
   588             self.SubrangeBaseType.Append(base_type)
   618             self.SubrangeBaseType.Append(base_type)
   589         self.SubrangeBaseType.SetSelection(0)
   619         self.SubrangeBaseType.SetSelection(0)
   590         self.RefreshBoundsRange()
   620         self.RefreshBoundsRange()
   591         type_infos = self.Controler.GetDataTypeInfos(self.TagName)
   621         type_infos = self.Controler.GetDataTypeInfos(self.TagName)
   592         if type_infos is not None:
   622         if type_infos is not None:
   593             self.DerivationType.SetStringSelection(type_infos["type"])
   623             datatype = type_infos["type"]
       
   624             self.DerivationType.SetStringSelection(_(datatype))
   594             if type_infos["type"] == "Directly":
   625             if type_infos["type"] == "Directly":
   595                 self.DirectlyBaseType.SetStringSelection(type_infos["base_type"])
   626                 self.DirectlyBaseType.SetStringSelection(type_infos["base_type"])
   596                 self.DirectlyInitialValue.SetValue(type_infos["initial"])
   627                 self.DirectlyInitialValue.SetValue(type_infos["initial"])
   597             elif type_infos["type"] == "Subrange":
   628             elif type_infos["type"] == "Subrange":
   598                 self.SubrangeBaseType.SetStringSelection(type_infos["base_type"])
   629                 self.SubrangeBaseType.SetStringSelection(type_infos["base_type"])
   661         text = event.GetText()
   692         text = event.GetText()
   662         values = self.EnumeratedValues.GetStrings()
   693         values = self.EnumeratedValues.GetStrings()
   663         index = event.GetIndex()
   694         index = event.GetIndex()
   664         if index >= len(values) or values[index].upper() != text.upper():
   695         if index >= len(values) or values[index].upper() != text.upper():
   665             if text.upper() in [value.upper() for value in values]:
   696             if text.upper() in [value.upper() for value in values]:
   666                 message = wx.MessageDialog(self, "\"%s\" value already defined!"%text, "Error", wx.OK|wx.ICON_ERROR)
   697                 message = wx.MessageDialog(self, _("\"%s\" value already defined!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
   667                 message.ShowModal()
   698                 message.ShowModal()
   668                 message.Destroy()
   699                 message.Destroy()
   669                 event.Veto()
   700                 event.Veto()
   670             elif text.upper() in IEC_KEYWORDS:
   701             elif text.upper() in IEC_KEYWORDS:
   671                 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%text, "Error", wx.OK|wx.ICON_ERROR)
   702                 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
   672                 message.ShowModal()
   703                 message.ShowModal()
   673                 message.Destroy()
   704                 message.Destroy()
   674             else:
   705             else:
   675                 wx.CallAfter(self.RefreshEnumeratedValues)
   706                 wx.CallAfter(self.RefreshEnumeratedValues)
   676                 wx.CallAfter(self.RefreshTypeInfos)
   707                 wx.CallAfter(self.RefreshTypeInfos)
   721         row, col = event.GetRow(), event.GetCol()
   752         row, col = event.GetRow(), event.GetCol()
   722         colname = self.StructureElementsTable.GetColLabelValue(col)
   753         colname = self.StructureElementsTable.GetColLabelValue(col)
   723         value = self.StructureElementsTable.GetValue(row, col)
   754         value = self.StructureElementsTable.GetValue(row, col)
   724         if colname == "Name":
   755         if colname == "Name":
   725             if not TestIdentifier(value):
   756             if not TestIdentifier(value):
   726                 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%value, "Error", wx.OK|wx.ICON_ERROR)
   757                 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
   727                 message.ShowModal()
   758                 message.ShowModal()
   728                 message.Destroy()
   759                 message.Destroy()
   729                 event.Veto()
   760                 event.Veto()
   730             elif value.upper() in IEC_KEYWORDS:
   761             elif value.upper() in IEC_KEYWORDS:
   731                 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%value, "Error", wx.OK|wx.ICON_ERROR)
   762                 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
   732                 message.ShowModal()
   763                 message.ShowModal()
   733                 message.Destroy()
   764                 message.Destroy()
   734                 event.Veto()
   765                 event.Veto()
   735 ##            elif value.upper() in self.PouNames:
   766 ##            elif value.upper() in self.PouNames:
   736 ##                message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%value, "Error", wx.OK|wx.ICON_ERROR)
   767 ##                message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%value, "Error", wx.OK|wx.ICON_ERROR)
   737 ##                message.ShowModal()
   768 ##                message.ShowModal()
   738 ##                message.Destroy()
   769 ##                message.Destroy()
   739 ##                event.Veto()
   770 ##                event.Veto()
   740             elif value.upper() in [var["Name"].upper() for idx, var in enumerate(self.StructureElementsTable.GetData()) if idx != row]:
   771             elif value.upper() in [var["Name"].upper() for idx, var in enumerate(self.StructureElementsTable.GetData()) if idx != row]:
   741                 message = wx.MessageDialog(self, "A element with \"%s\" as name exists in this structure!"%value, "Error", wx.OK|wx.ICON_ERROR)
   772                 message = wx.MessageDialog(self, _("A element with \"%s\" as name exists in this structure!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
   742                 message.ShowModal()
   773                 message.ShowModal()
   743                 message.Destroy()
   774                 message.Destroy()
   744                 event.Veto()
   775                 event.Veto()
   745             else:
   776             else:
   746                 self.RefreshTypeInfos()
   777                 self.RefreshTypeInfos()
   762             base_menu = wx.Menu(title='')
   793             base_menu = wx.Menu(title='')
   763             for base_type in self.Controler.GetBaseTypes():
   794             for base_type in self.Controler.GetBaseTypes():
   764                 new_id = wx.NewId()
   795                 new_id = wx.NewId()
   765                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
   796                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
   766                 self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(base_type), id=new_id)
   797                 self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(base_type), id=new_id)
   767             type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu)
   798             type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
   768             datatype_menu = wx.Menu(title='')
   799             datatype_menu = wx.Menu(title='')
   769             for datatype in self.Controler.GetDataTypes(self.TagName, False, self.ParentWindow.Debug):
   800             for datatype in self.Controler.GetDataTypes(self.TagName, False, self.ParentWindow.Debug):
   770                 new_id = wx.NewId()
   801                 new_id = wx.NewId()
   771                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
   802                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
   772                 self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(datatype), id=new_id)
   803                 self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(datatype), id=new_id)
   773             type_menu.AppendMenu(wx.NewId(), "User Data Types", datatype_menu)
   804             type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
   774 ##            functionblock_menu = wx.Menu(title='')
   805 ##            functionblock_menu = wx.Menu(title='')
   775 ##            bodytype = self.Controler.GetEditedElementBodyType(self.TagName, self.ParentWindow.Debug)
   806 ##            bodytype = self.Controler.GetEditedElementBodyType(self.TagName, self.ParentWindow.Debug)
   776 ##            pouname, poutype = self.Controler.GetEditedElementType(self.TagName, self.ParentWindow.Debug)
   807 ##            pouname, poutype = self.Controler.GetEditedElementType(self.TagName, self.ParentWindow.Debug)
   777 ##            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
   808 ##            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
   778 ##                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName, self.ParentWindow.Debug):
   809 ##                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName, self.ParentWindow.Debug):
   779 ##                    new_id = wx.NewId()
   810 ##                    new_id = wx.NewId()
   780 ##                    AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
   811 ##                    AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
   781 ##                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
   812 ##                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
   782 ##                type_menu.AppendMenu(wx.NewId(), "Function Block Types", functionblock_menu)
   813 ##                type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
   783             rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col))
   814             rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col))
   784             self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize())
   815             self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize())
   785             event.Veto()
   816             event.Veto()
   786         else:
   817         else:
   787             event.Skip()
   818             event.Skip()
   794             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   825             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   795             event.Skip()
   826             event.Skip()
   796         return ElementTypeFunction
   827         return ElementTypeFunction
   797 
   828 
   798     def RefreshDisplayedInfos(self):
   829     def RefreshDisplayedInfos(self):
   799         selected = self.DerivationType.GetStringSelection()
   830         selected = DATATYPE_TYPES_DICT[self.DerivationType.GetStringSelection()]
   800         if selected != self.CurrentPanel:
   831         if selected != self.CurrentPanel:
   801             if self.CurrentPanel == "Directly":
   832             if self.CurrentPanel == "Directly":
   802                 self.DirectlyPanel.Hide()
   833                 self.DirectlyPanel.Hide()
   803             elif self.CurrentPanel == "Subrange":
   834             elif self.CurrentPanel == "Subrange":
   804                 self.SubrangePanel.Hide()
   835                 self.SubrangePanel.Hide()
   840 
   871 
   841     def RefreshSubrangeInitialValueRange(self):
   872     def RefreshSubrangeInitialValueRange(self):
   842         self.SubrangeInitialValue.SetRange(self.SubrangeMinimum.GetValue(), self.SubrangeMaximum.GetValue())
   873         self.SubrangeInitialValue.SetRange(self.SubrangeMinimum.GetValue(), self.SubrangeMaximum.GetValue())
   843 
   874 
   844     def RefreshTypeInfos(self):
   875     def RefreshTypeInfos(self):
   845         selected = self.DerivationType.GetStringSelection()
   876         selected = DATATYPE_TYPES_DICT[self.DerivationType.GetStringSelection()]
   846         infos = {"type" : selected}
   877         infos = {"type" : selected}
   847         if selected == "Directly":
   878         if selected == "Directly":
   848             infos["base_type"] = self.DirectlyBaseType.GetStringSelection()
   879             infos["base_type"] = self.DirectlyBaseType.GetStringSelection()
   849             infos["initial"] = self.DirectlyInitialValue.GetValue()
   880             infos["initial"] = self.DirectlyInitialValue.GetValue()
   850         elif selected == "Subrange":
   881         elif selected == "Subrange":
   863             infos["base_type"] = self.ArrayBaseType.GetStringSelection()
   894             infos["base_type"] = self.ArrayBaseType.GetStringSelection()
   864             infos["dimensions"] = []
   895             infos["dimensions"] = []
   865             for dimensions in self.ArrayDimensions.GetStrings():
   896             for dimensions in self.ArrayDimensions.GetStrings():
   866                 result = DIMENSION_MODEL.match(dimensions)
   897                 result = DIMENSION_MODEL.match(dimensions)
   867                 if result is None:
   898                 if result is None:
   868                     message = wx.MessageDialog(self, "\"%s\" value isn't a valid array dimension!"%dimensions, "Error", wx.OK|wx.ICON_ERROR)
   899                     message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!")%dimensions, _("Error"), wx.OK|wx.ICON_ERROR)
   869                     message.ShowModal()
   900                     message.ShowModal()
   870                     message.Destroy()
   901                     message.Destroy()
   871                     self.RefreshView()
   902                     self.RefreshView()
   872                     return
   903                     return
   873                 bounds = result.groups()
   904                 bounds = result.groups()
   874                 if bounds[0] >= bounds[1]:
   905                 if bounds[0] >= bounds[1]:
   875                     message = wx.MessageDialog(self, "\"%s\" value isn't a valid array dimension!\nRight value must be greater than left value."%dimensions, "Error", wx.OK|wx.ICON_ERROR)
   906                     message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!\nRight value must be greater than left value.")%dimensions, _("Error"), wx.OK|wx.ICON_ERROR)
   876                     message.ShowModal()
   907                     message.ShowModal()
   877                     message.Destroy()
   908                     message.Destroy()
   878                     self.RefreshView()
   909                     self.RefreshView()
   879                     return
   910                     return
   880                 infos["dimensions"].append(bounds)
   911                 infos["dimensions"].append(bounds)