DataTypeEditor.py
changeset 714 131ea7f237b9
parent 666 d4bb66691248
child 730 2c4914d941fd
equal deleted inserted replaced
713:95a0a427f3ef 714:131ea7f237b9
    20 #
    20 #
    21 #You should have received a copy of the GNU General Public
    21 #You should have received a copy of the GNU General Public
    22 #License along with this library; if not, write to the Free Software
    22 #License along with this library; if not, write to the Free Software
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24 
    24 
       
    25 import re
       
    26 
    25 import wx
    27 import wx
    26 import wx.grid
    28 import wx.grid
       
    29 import wx.lib.buttons
    27 
    30 
    28 from plcopen.structures import IEC_KEYWORDS, TestIdentifier
    31 from plcopen.structures import IEC_KEYWORDS, TestIdentifier
    29 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
    32 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
    30 from controls import CustomEditableListBox, CustomGrid, CustomTable, EditorPanel
    33 from controls import CustomEditableListBox, CustomGrid, CustomTable, EditorPanel
    31 
    34 from utils.BitmapLibrary import GetBitmap
    32 import re
    35 
       
    36 #-------------------------------------------------------------------------------
       
    37 #                                    Helpers
       
    38 #-------------------------------------------------------------------------------
    33 
    39 
    34 DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$")
    40 DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$")
    35 
    41 
    36 def AppendMenu(parent, help, id, kind, text):
    42 def AppendMenu(parent, help, id, kind, text):
    37     if wx.VERSION >= (2, 6, 0):
    43     parent.Append(help=help, id=id, kind=kind, text=text)
    38         parent.Append(help=help, id=id, kind=kind, text=text)
    44 
    39     else:
    45 def GetElementsTableColnames():
    40         parent.Append(helpString=help, id=id, kind=kind, item=text)
    46     _ = lambda x : x
       
    47     return ["#", _("Name"), _("Type"), _("Initial Value")]
       
    48 
       
    49 def GetDatatypeTypes():
       
    50     _ = lambda x : x
       
    51     return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")]
       
    52 DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
    41 
    53 
    42 #-------------------------------------------------------------------------------
    54 #-------------------------------------------------------------------------------
    43 #                            Structure Elements Table
    55 #                            Structure Elements Table
    44 #-------------------------------------------------------------------------------
    56 #-------------------------------------------------------------------------------
    45 
       
    46 def GetElementsTableColnames():
       
    47     _ = lambda x : x
       
    48     return ["#", _("Name"), _("Type"), _("Initial Value")]
       
    49 
    57 
    50 class ElementsTable(CustomTable):
    58 class ElementsTable(CustomTable):
    51     
    59     
    52     """
    60     """
    53     A custom wx.grid.Grid Table using user supplied data
    61     A custom wx.grid.Grid Table using user supplied data
   119 
   127 
   120 #-------------------------------------------------------------------------------
   128 #-------------------------------------------------------------------------------
   121 #                          Datatype Editor class
   129 #                          Datatype Editor class
   122 #-------------------------------------------------------------------------------
   130 #-------------------------------------------------------------------------------
   123 
   131 
   124 [ID_DATATYPEEDITOR, ID_DATATYPEEDITORPANEL, ID_DATATYPEEDITORSTATICBOX,
       
   125  ID_DATATYPEEDITORDERIVATIONTYPE, ID_DATATYPEEDITORDIRECTLYPANEL,
       
   126  ID_DATATYPEEDITORSUBRANGEPANEL, ID_DATATYPEEDITORDIRECTLYBASETYPE, 
       
   127  ID_DATATYPEEDITORSUBRANGEBASETYPE, ID_DATATYPEEDITORSUBRANGEMINIMUM, 
       
   128  ID_DATATYPEEDITORSUBRANGEMAXIMUM, ID_DATATYPEEDITORDIRECTLYINITIALVALUE, 
       
   129  ID_DATATYPEEDITORSUBRANGEINITIALVALUE, ID_DATATYPEEDITORENUMERATEDPANEL,
       
   130  ID_DATATYPEEDITORENUMERATEDVALUES, ID_DATATYPEEDITORENUMERATEDINITIALVALUE,
       
   131  ID_DATATYPEEDITORARRAYPANEL, ID_DATATYPEEDITORARRAYBASETYPE, 
       
   132  ID_DATATYPEEDITORARRAYDIMENSIONS, ID_DATATYPEEDITORARRAYINITIALVALUE, 
       
   133  ID_DATATYPEEDITORSTRUCTUREPANEL, ID_DATATYPEEDITORSTRUCTUREELEMENTSGRID,
       
   134  ID_DATATYPEEDITORSTRUCTUREADDBUTTON, ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON,
       
   135  ID_DATATYPEEDITORSTRUCTUREUPBUTTON, ID_DATATYPEEDITORSTRUCTUREDOWNBUTTON,
       
   136  ID_DATATYPEEDITORSTATICTEXT1, ID_DATATYPEEDITORSTATICTEXT2, 
       
   137  ID_DATATYPEEDITORSTATICTEXT3, ID_DATATYPEEDITORSTATICTEXT4, 
       
   138  ID_DATATYPEEDITORSTATICTEXT5, ID_DATATYPEEDITORSTATICTEXT6, 
       
   139  ID_DATATYPEEDITORSTATICTEXT7, ID_DATATYPEEDITORSTATICTEXT8,
       
   140  ID_DATATYPEEDITORSTATICTEXT9, ID_DATATYPEEDITORSTATICTEXT10, 
       
   141  ID_DATATYPEEDITORSTATICTEXT11, 
       
   142 ] = [wx.NewId() for _init_ctrls in range(36)]
       
   143 
       
   144 def GetDatatypeTypes():
       
   145     _ = lambda x : x
       
   146     return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")]
       
   147 DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
       
   148 
       
   149 class DataTypeEditor(EditorPanel):
   132 class DataTypeEditor(EditorPanel):
   150     
   133     
   151     ID = ID_DATATYPEEDITOR
   134     def _init_Editor(self, parent):
   152     
   135         self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER)
   153     def _init_coll_MainSizer_Items(self, parent):
   136         
   154         parent.AddSizer(self.TopSizer, 0, border=5, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
       
   155         parent.AddSizer(self.TypeInfosSizer, 0, border=5, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
       
   156 
       
   157     def _init_coll_MainSizer_Growables(self, parent):
       
   158         parent.AddGrowableCol(0)
       
   159         parent.AddGrowableRow(1)
       
   160 
       
   161     def _init_coll_TopSizer_Items(self, parent):
       
   162         parent.AddWindow(self.staticText1, 0, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
       
   163         parent.AddWindow(self.DerivationType, 0, border=5, flag=wx.GROW|wx.RIGHT)
       
   164 
       
   165     def _init_coll_TypeInfosSizer_Items(self, parent):
       
   166         parent.AddWindow(self.DirectlyPanel, 1, border=0, flag=wx.ALL)
       
   167         parent.AddWindow(self.SubrangePanel, 1, border=0, flag=wx.ALL)
       
   168         parent.AddWindow(self.EnumeratedPanel, 1, border=0, flag=wx.GROW|wx.ALL)
       
   169         parent.AddWindow(self.ArrayPanel, 1, border=0, flag=wx.ALL)
       
   170         parent.AddWindow(self.StructurePanel, 1, border=0, flag=wx.GROW|wx.ALL)
       
   171 
       
   172     def _init_coll_DirectlyPanelSizer_Items(self, parent):
       
   173         parent.AddWindow(self.staticText2, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   174         parent.AddWindow(self.DirectlyBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
       
   175         parent.AddWindow(self.staticText3, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   176         parent.AddWindow(self.DirectlyInitialValue, 1, border=5, flag=wx.ALL)
       
   177 
       
   178     def _init_coll_SubrangePanelSizer_Items(self, parent):
       
   179         parent.AddWindow(self.staticText4, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   180         parent.AddWindow(self.SubrangeBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
       
   181         parent.AddWindow(self.staticText5, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   182         parent.AddWindow(self.SubrangeInitialValue, 1, border=5, flag=wx.GROW|wx.ALL)
       
   183         parent.AddWindow(self.staticText6, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   184         parent.AddWindow(self.SubrangeMinimum, 1, border=5, flag=wx.GROW|wx.ALL)
       
   185         parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL)
       
   186         parent.AddWindow(wx.Size(0, 0), 1, border=5, flag=wx.GROW|wx.ALL)
       
   187         parent.AddWindow(self.staticText7, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   188         parent.AddWindow(self.SubrangeMaximum, 1, border=5, flag=wx.GROW|wx.ALL)
       
   189         
       
   190     def _init_coll_EnumeratedPanelSizer_Items(self, parent):
       
   191         parent.AddWindow(self.EnumeratedValues, 1, border=5, flag=wx.GROW|wx.ALL)
       
   192         parent.AddSizer(self.EnumeratedPanelRightSizer, 1, border=0, flag=0)
       
   193         
       
   194     def _init_coll_EnumeratedPanelRightSizer_Items(self, parent):
       
   195         parent.AddWindow(self.staticText8, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   196         parent.AddWindow(self.EnumeratedInitialValue, 1, border=5, flag=wx.ALL)
       
   197 
       
   198     def _init_coll_ArrayPanelSizer_Items(self, parent):
       
   199         parent.AddSizer(self.ArrayPanelLeftSizer, 0, border=0, flag=wx.GROW)
       
   200         parent.AddSizer(self.ArrayPanelRightSizer, 0, border=0, flag=wx.GROW)
       
   201         parent.AddWindow(self.ArrayDimensions, 0, border=5, flag=wx.GROW|wx.ALL)
       
   202         
       
   203     def _init_coll_ArrayPanelSizer_Growables(self, parent):
       
   204         parent.AddGrowableCol(0)
       
   205         parent.AddGrowableCol(1)
       
   206         parent.AddGrowableRow(1)
       
   207 
       
   208     def _init_coll_ArrayPanelLeftSizer_Items(self, parent):
       
   209         parent.AddWindow(self.staticText9, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   210         parent.AddWindow(self.ArrayBaseType, 1, border=5, flag=wx.GROW|wx.ALL)
       
   211     
       
   212     def _init_coll_ArrayPanelRightSizer_Items(self, parent):
       
   213         parent.AddWindow(self.staticText10, 1, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   214         parent.AddWindow(self.ArrayInitialValue, 1, border=5, flag=wx.ALL)    
       
   215 
       
   216     def _init_coll_StructurePanelSizer_Items(self, parent):
       
   217         parent.AddSizer(self.StructurePanelButtonSizer, 0, border=5, flag=wx.ALL|wx.GROW)
       
   218         parent.AddWindow(self.StructureElementsGrid, 0, border=0, flag=wx.GROW)
       
   219         
       
   220     def _init_coll_StructurePanelSizer_Growables(self, parent):
       
   221         parent.AddGrowableCol(0)
       
   222         parent.AddGrowableRow(1)
       
   223     
       
   224     def _init_coll_StructurePanelButtonSizer_Items(self, parent):
       
   225         parent.AddWindow(self.staticText11, 0, border=0, flag=wx.ALIGN_BOTTOM)
       
   226         parent.AddWindow(self.StructureAddButton, 0, border=0, flag=0)
       
   227         parent.AddWindow(self.StructureDeleteButton, 0, border=0, flag=0)
       
   228         parent.AddWindow(self.StructureUpButton, 0, border=0, flag=0)
       
   229         parent.AddWindow(self.StructureDownButton, 0, border=0, flag=0)
       
   230     
       
   231     def _init_coll_StructurePanelButtonSizer_Growables(self, parent):
       
   232         parent.AddGrowableCol(0)
       
   233         parent.AddGrowableRow(0)
       
   234 
       
   235     def _init_sizers(self):
       
   236         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
   137         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
   237         self.TopSizer = wx.BoxSizer(wx.HORIZONTAL)
   138         self.MainSizer.AddGrowableCol(0)
   238         self.TypeInfosSizer = wx.StaticBoxSizer(self.staticbox, wx.HORIZONTAL)
   139         self.MainSizer.AddGrowableRow(1)
   239         self.DirectlyPanelSizer = wx.BoxSizer(wx.HORIZONTAL)
   140         
   240         self.SubrangePanelSizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
   141         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
   241         self.EnumeratedPanelSizer = wx.BoxSizer(wx.HORIZONTAL)
   142         self.MainSizer.AddSizer(top_sizer, border=5, 
   242         self.EnumeratedPanelRightSizer = wx.BoxSizer(wx.HORIZONTAL)
   143               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
   243         self.ArrayPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
   144         
   244         self.ArrayPanelLeftSizer = wx.BoxSizer(wx.HORIZONTAL)
   145         derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
   245         self.ArrayPanelRightSizer = wx.BoxSizer(wx.HORIZONTAL)
   146         top_sizer.AddWindow(derivation_type_label, border=5, 
   246         self.StructurePanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
   147               flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
   247         self.StructurePanelButtonSizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   148         
   248         
   149         self.DerivationType = wx.ComboBox(self.Editor,
   249         self._init_coll_MainSizer_Items(self.MainSizer)
   150               size=wx.Size(200, -1), style=wx.CB_READONLY)
   250         self._init_coll_MainSizer_Growables(self.MainSizer)
   151         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
   251         self._init_coll_TopSizer_Items(self.TopSizer)
   152         top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW|wx.RIGHT)
   252         self._init_coll_TypeInfosSizer_Items(self.TypeInfosSizer)
   153         
   253         self._init_coll_DirectlyPanelSizer_Items(self.DirectlyPanelSizer)
   154         typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
   254         self._init_coll_SubrangePanelSizer_Items(self.SubrangePanelSizer)
   155         typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
   255         self._init_coll_EnumeratedPanelSizer_Items(self.EnumeratedPanelSizer)
   156         self.MainSizer.AddSizer(typeinfos_sizer, border=5, 
   256         self._init_coll_EnumeratedPanelRightSizer_Items(self.EnumeratedPanelRightSizer)
   157               flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   257         self._init_coll_ArrayPanelSizer_Items(self.ArrayPanelSizer)
   158         
   258         self._init_coll_ArrayPanelSizer_Growables(self.ArrayPanelSizer)
       
   259         self._init_coll_ArrayPanelLeftSizer_Items(self.ArrayPanelLeftSizer)
       
   260         self._init_coll_ArrayPanelRightSizer_Items(self.ArrayPanelRightSizer)
       
   261         self._init_coll_StructurePanelSizer_Items(self.StructurePanelSizer)
       
   262         self._init_coll_StructurePanelSizer_Growables(self.StructurePanelSizer)
       
   263         self._init_coll_StructurePanelButtonSizer_Items(self.StructurePanelButtonSizer)
       
   264         self._init_coll_StructurePanelButtonSizer_Growables(self.StructurePanelButtonSizer)
       
   265         
       
   266         self.Editor.SetSizer(self.MainSizer)
       
   267         self.DirectlyPanel.SetSizer(self.DirectlyPanelSizer)
       
   268         self.SubrangePanel.SetSizer(self.SubrangePanelSizer)
       
   269         self.EnumeratedPanel.SetSizer(self.EnumeratedPanelSizer)
       
   270         self.ArrayPanel.SetSizer(self.ArrayPanelSizer)
       
   271         self.StructurePanel.SetSizer(self.StructurePanelSizer)
       
   272     
       
   273     def _init_Editor(self, prnt):
       
   274         self.Editor = wx.Panel(id=ID_DATATYPEEDITORPANEL, name='', parent=prnt,
       
   275               size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
       
   276 
       
   277         self.staticbox = wx.StaticBox(id=ID_DATATYPEEDITORSTATICBOX,
       
   278               label=_('Type infos:'), name='staticBox1', parent=self.Editor,
       
   279               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
       
   280 
       
   281         self.staticText1 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT1,
       
   282               label=_('Derivation Type:'), name='staticText1', parent=self.Editor,
       
   283               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
       
   284 
       
   285         self.DerivationType = wx.ComboBox(id=ID_DATATYPEEDITORDERIVATIONTYPE,
       
   286               name='DerivationType', parent=self.Editor, pos=wx.Point(0, 0),
       
   287               size=wx.Size(200, 28), style=wx.CB_READONLY)
       
   288         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, id=ID_DATATYPEEDITORDERIVATIONTYPE)
       
   289 
       
   290         # Panel for Directly derived data types
   159         # Panel for Directly derived data types
   291 
   160 
   292         self.DirectlyPanel = wx.Panel(id=ID_DATATYPEEDITORDIRECTLYPANEL,
   161         self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   293               name='DirectlyPanel', parent=self.Editor, pos=wx.Point(0, 0),
   162         typeinfos_sizer.AddWindow(self.DirectlyPanel, 1)
   294               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   163         
   295 
   164         directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   296         self.staticText2 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT2,
   165         
   297               label=_('Base Type:'), name='staticText2', parent=self.DirectlyPanel,
   166         directly_basetype_label = wx.StaticText(self.DirectlyPanel, 
   298               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   167               label=_('Base Type:'))
   299 
   168         directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5, 
   300         self.DirectlyBaseType = wx.ComboBox(id=ID_DATATYPEEDITORDIRECTLYBASETYPE, 
   169               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   301               name='DirectlyBaseType', parent=self.DirectlyPanel, pos=wx.Point(0, 0),
   170         
   302               size=wx.Size(0, 28), style=wx.CB_READONLY)
   171         self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
   303         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORDIRECTLYBASETYPE)
   172         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyPanel)
   304 
   173         directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5, 
   305         self.staticText3 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT3,
   174               flag=wx.GROW|wx.ALL)
   306               label=_('Initial Value:'), name='staticText3', parent=self.DirectlyPanel,
   175         
   307               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   176         directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
   308 
   177               label=_('Initial Value:'))
   309         self.DirectlyInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE, 
   178         directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5, 
   310               name='DirectlyInitialValue', parent=self.DirectlyPanel, pos=wx.Point(0, 0),
   179               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   311               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_MULTILINE|wx.TE_RICH)
   180         
   312         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, id=ID_DATATYPEEDITORDIRECTLYINITIALVALUE)
   181         self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel, 
   313 
   182               style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_RICH)
       
   183         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
       
   184         directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5, 
       
   185               flag=wx.ALL)
       
   186         
       
   187         self.DirectlyPanel.SetSizer(directly_panel_sizer)
       
   188         
   314         # Panel for Subrange data types
   189         # Panel for Subrange data types
   315 
   190 
   316         self.SubrangePanel = wx.Panel(id=ID_DATATYPEEDITORSUBRANGEPANEL,
   191         self.SubrangePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   317               name='SubrangePanel', parent=self.Editor, pos=wx.Point(0, 0),
   192         typeinfos_sizer.AddWindow(self.SubrangePanel, 1)
   318               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   193         
   319 
   194         subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
   320         self.staticText4 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT4,
   195         
   321               label=_('Base Type:'), name='staticText4', parent=self.SubrangePanel,
   196         subrange_basetype_label = wx.StaticText(self.SubrangePanel,
   322               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   197               label=_('Base Type:'))
   323 
   198         subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5, 
   324         self.SubrangeBaseType = wx.ComboBox(id=ID_DATATYPEEDITORSUBRANGEBASETYPE, 
   199               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   325               name='SubrangeBaseType', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   200         
   326               size=wx.Size(0, 28), style=wx.CB_READONLY)
   201         self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
   327         self.SubrangeBaseType.SetBackgroundColour(wx.BLUE)
   202         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, 
   328         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, id=ID_DATATYPEEDITORSUBRANGEBASETYPE)
   203               self.SubrangeBaseType)
   329 
   204         subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5, 
   330         self.staticText5 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT5,
   205               flag=wx.GROW|wx.ALL)
   331               label=_('Initial Value:'), name='staticText5', parent=self.SubrangePanel,
   206         
   332               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   207         subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
   333 
   208               label=_('Initial Value:'))
   334         self.SubrangeInitialValue = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE, 
   209         subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5, 
   335               name='SubrangeInitialValue', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   210               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   336               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   211         
   337         self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, id=ID_DATATYPEEDITORSUBRANGEINITIALVALUE)
   212         self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel, 
   338 
   213               style=wx.TAB_TRAVERSAL)
   339         self.staticText6 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT6,
   214         self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue)
   340               label=_('Minimum:'), name='staticText6', parent=self.SubrangePanel,
   215         subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5, 
   341               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   216               flag=wx.GROW|wx.ALL)
   342 
   217         
   343         self.SubrangeMinimum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMINIMUM, 
   218         subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
   344               name='SubrangeMinimum', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   219         subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5, 
   345               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   220               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   346         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, id=ID_DATATYPEEDITORSUBRANGEMINIMUM)
   221         
   347 
   222         self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   348         self.staticText7 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT7,
   223         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum)
   349               label=_('Maximum:'), name='staticText7', parent=self.SubrangePanel,
   224         subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5, 
   350               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   225               flag=wx.GROW|wx.ALL)
   351 
   226         
   352         self.SubrangeMaximum = wx.SpinCtrl(id=ID_DATATYPEEDITORSUBRANGEMAXIMUM, 
   227         for i in xrange(2):
   353               name='SubrangeMaximum', parent=self.SubrangePanel, pos=wx.Point(0, 0),
   228             subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
   354               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL)
   229         
   355         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, id=ID_DATATYPEEDITORSUBRANGEMAXIMUM)
   230         subrange_maximum_label = wx.StaticText(self.SubrangePanel,
   356 
   231               label=_('Maximum:'))
       
   232         subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5, 
       
   233               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   234         
       
   235         self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
       
   236         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum)
       
   237         
       
   238         subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5, 
       
   239               flag=wx.GROW|wx.ALL)
       
   240         
       
   241         self.SubrangePanel.SetSizer(subrange_panel_sizer)
       
   242         
   357         # Panel for Enumerated data types
   243         # Panel for Enumerated data types
   358 
   244         
   359         self.EnumeratedPanel = wx.Panel(id=ID_DATATYPEEDITORENUMERATEDPANEL,
   245         self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   360               name='EnumeratedPanel', parent=self.Editor, pos=wx.Point(0, 0),
   246         typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1)
   361               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   247         
   362 
   248         enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   363         self.EnumeratedValues = CustomEditableListBox(id=ID_DATATYPEEDITORENUMERATEDVALUES, 
   249         
   364               name='EnumeratedValues', parent=self.EnumeratedPanel, label=_("Values:"), pos=wx.Point(0, 0),
   250         self.EnumeratedValues = CustomEditableListBox(self.EnumeratedPanel, 
   365               size=wx.Size(0, 0), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
   251               label=_("Values:"), style=wx.gizmos.EL_ALLOW_NEW| 
       
   252                                         wx.gizmos.EL_ALLOW_EDIT| 
       
   253                                         wx.gizmos.EL_ALLOW_DELETE)
   366         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
   254         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
   367         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
   255         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
   368             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
   256             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
   369         
   257         enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5, 
   370         self.staticText8 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT8,
   258               flag=wx.GROW|wx.ALL)
   371               label=_('Initial Value:'), name='staticText8', parent=self.EnumeratedPanel,
   259         
   372               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   260         enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   373 
   261         enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
   374         self.EnumeratedInitialValue = wx.ComboBox(id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE, 
   262         
   375               name='EnumeratedInitialValue', parent=self.EnumeratedPanel, pos=wx.Point(0, 0),
   263         enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
   376               size=wx.Size(0, 28), style=wx.CB_READONLY)
   264               label=_('Initial Value:'))
   377         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORENUMERATEDINITIALVALUE)
   265         enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1, 
       
   266               border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   267         
       
   268         self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel, 
       
   269               style=wx.CB_READONLY)
       
   270         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
       
   271         enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1, 
       
   272               border=5, flag=wx.ALL)
       
   273         
       
   274         self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
   378         
   275         
   379         # Panel for Array data types
   276         # Panel for Array data types
   380 
   277 
   381         self.ArrayPanel = wx.Panel(id=ID_DATATYPEEDITORARRAYPANEL,
   278         self.ArrayPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   382               name='ArrayPanel', parent=self.Editor, pos=wx.Point(0, 0),
   279         typeinfos_sizer.AddWindow(self.ArrayPanel, 1)
   383               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   280         
   384 
   281         array_panel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
   385         self.staticText9 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT9,
   282         array_panel_sizer.AddGrowableCol(0)
   386               label=_('Base Type:'), name='staticText9', parent=self.ArrayPanel,
   283         array_panel_sizer.AddGrowableCol(1)
   387               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   284         array_panel_sizer.AddGrowableRow(1)
   388 
   285         
   389         self.ArrayBaseType = wx.ComboBox(id=ID_DATATYPEEDITORARRAYBASETYPE, 
   286         array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL)
   390               name='ArrayBaseType', parent=self.ArrayPanel, pos=wx.Point(0, 0),
   287         array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW)
   391               size=wx.Size(0, 28), style=wx.CB_READONLY)
   288         
   392         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORARRAYBASETYPE)
   289         array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
   393 
   290         array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5, 
   394         self.ArrayDimensions = CustomEditableListBox(id=ID_DATATYPEEDITORARRAYDIMENSIONS, 
   291               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   395               name='ArrayDimensions', parent=self.ArrayPanel, label=_("Dimensions:"), pos=wx.Point(0, 0),
   292         
   396               size=wx.Size(0, 24), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
   293         self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
   397         for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
   294         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
       
   295         array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5, 
       
   296               flag=wx.GROW|wx.ALL)
       
   297     
       
   298         array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
       
   299         array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
       
   300         
       
   301         array_initialvalue_label = wx.StaticText(self.ArrayPanel,
       
   302               label=_('Initial Value:'))
       
   303         array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5, 
       
   304               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
   305         
       
   306         self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
       
   307               style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_RICH)
       
   308         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
       
   309         array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5, 
       
   310               flag=wx.ALL)        
       
   311         
       
   312         self.ArrayDimensions = CustomEditableListBox(self.ArrayPanel, 
       
   313               label=_("Dimensions:"), style=wx.gizmos.EL_ALLOW_NEW|
       
   314                                             wx.gizmos.EL_ALLOW_EDIT|
       
   315                                             wx.gizmos.EL_ALLOW_DELETE)
       
   316         for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton", 
       
   317                      "_OnUpButton", "_OnDownButton"]:
   398             setattr(self.EnumeratedValues, func, self.OnDimensionsChanged)
   318             setattr(self.EnumeratedValues, func, self.OnDimensionsChanged)
   399         
   319         array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5, 
   400         self.staticText10 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT10,
   320               flag=wx.GROW|wx.ALL)
   401               label=_('Initial Value:'), name='staticText10', parent=self.ArrayPanel,
   321         
   402               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   322         self.ArrayPanel.SetSizer(array_panel_sizer)
   403 
       
   404         self.ArrayInitialValue = wx.TextCtrl(id=ID_DATATYPEEDITORARRAYINITIALVALUE, 
       
   405               name='ArrayInitialValue', parent=self.ArrayPanel, pos=wx.Point(0, 0),
       
   406               size=wx.Size(0, 24), style=wx.TAB_TRAVERSAL|wx.TE_PROCESS_ENTER|wx.TE_MULTILINE|wx.TE_RICH)
       
   407         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, id=ID_DATATYPEEDITORARRAYINITIALVALUE)
       
   408         
   323         
   409         # Panel for Structure data types
   324         # Panel for Structure data types
   410         
   325         
   411         self.StructurePanel = wx.Panel(id=ID_DATATYPEEDITORSTRUCTUREPANEL,
   326         self.StructurePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   412               name='StructurePanel', parent=self.Editor, pos=wx.Point(0, 0),
   327         typeinfos_sizer.AddWindow(self.StructurePanel, 1)
   413               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   328         
   414         
   329         structure_panel_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
   415         self.staticText11 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT11,
   330         structure_panel_sizer.AddGrowableCol(0)
   416               label=_('Elements :'), name='staticText11', parent=self.StructurePanel,
   331         structure_panel_sizer.AddGrowableRow(1)
   417               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   332         
   418 
   333         structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   419         self.StructureElementsGrid = CustomGrid(id=ID_DATATYPEEDITORSTRUCTUREELEMENTSGRID,
   334         structure_button_sizer.AddGrowableCol(0)
   420               name='StructureElementsGrid', parent=self.StructurePanel, pos=wx.Point(0, 0), 
   335         structure_button_sizer.AddGrowableRow(0)
       
   336         structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5, 
       
   337               flag=wx.ALL|wx.GROW)
       
   338         
       
   339         structure_elements_label = wx.StaticText(self.StructurePanel,
       
   340               label=_('Elements :'))
       
   341         structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
       
   342         
       
   343         for name, bitmap, help in [
       
   344                 ("StructureAddButton", "add_element", _("Add element")),
       
   345                 ("StructureDeleteButton", "remove_element", _("Remove element")),
       
   346                 ("StructureUpButton", "up", _("Move element up")),
       
   347                 ("StructureDownButton", "down", _("Move element down"))]:
       
   348             button = wx.lib.buttons.GenBitmapButton(self.StructurePanel,
       
   349                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
       
   350             button.SetToolTipString(help)
       
   351             setattr(self, name, button)
       
   352             structure_button_sizer.AddWindow(button)
       
   353         
       
   354         self.StructureElementsGrid = CustomGrid(self.StructurePanel, 
   421               size=wx.Size(0, 150), style=wx.VSCROLL)
   355               size=wx.Size(0, 150), style=wx.VSCROLL)
   422         if wx.VERSION >= (2, 6, 0):
   356         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, 
   423             self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnStructureElementsGridCellChange)
   357               self.OnStructureElementsGridCellChange)
   424             self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnStructureElementsGridEditorShown)
   358         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, 
   425         else:
   359               self.OnStructureElementsGridEditorShown)
   426             wx.grid.EVT_GRID_CELL_CHANGE(self.StructureElementsGrid, self.OnStructureElementsGridCellChange)
   360         structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
   427             wx.grid.EVT_GRID_EDITOR_SHOWN(self.StructureElementsGrid, self.OnStructureElementsGridEditorShown)
   361         
   428         
   362         self.StructurePanel.SetSizer(structure_panel_sizer)
   429         self.StructureAddButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREADDBUTTON, label=_('Add'),
   363         
   430               name='StructureAddButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
   364         self.Editor.SetSizer(self.MainSizer)
   431               size=wx.DefaultSize, style=0)
   365         
   432         
       
   433         self.StructureDeleteButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON, label=_('Delete'),
       
   434               name='StructureDeleteButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
       
   435               size=wx.DefaultSize, style=0)
       
   436         
       
   437         self.StructureUpButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREUPBUTTON, label='^',
       
   438               name='StructureUpButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
       
   439               size=wx.Size(32, 32), style=0)
       
   440         
       
   441         self.StructureDownButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREDOWNBUTTON, label='v',
       
   442               name='StructureDownButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
       
   443               size=wx.Size(32, 32), style=0)
       
   444         
       
   445         self._init_sizers()
       
   446 
       
   447     def __init__(self, parent, tagname, window, controler):
   366     def __init__(self, parent, tagname, window, controler):
   448         EditorPanel.__init__(self, parent, tagname, window, controler)
   367         EditorPanel.__init__(self, parent, tagname, window, controler)
   449         
   368         
   450         self.StructureElementDefaultValue = {"Name" : "", "Type" : "INT", "Initial Value" : ""}
   369         self.StructureElementDefaultValue = {"Name" : "", "Type" : "INT", "Initial Value" : ""}
   451         self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames())
   370         self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames())