editors/DataTypeEditor.py
changeset 1412 50192dd2f5ff
parent 947 82e2a155a3ce
child 1508 4c645e6b8c98
equal deleted inserted replaced
1411:805d13d216c0 1412:50192dd2f5ff
     1 #!/usr/bin/env python
     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     2 # -*- coding: utf-8 -*-
     3 
     3 
     4 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
     4 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
     5 #based on the plcopen standard. 
     5 #based on the plcopen standard.
     6 #
     6 #
     7 #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
     7 #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
     8 #
     8 #
     9 #See COPYING file for copyrights details.
     9 #See COPYING file for copyrights details.
    10 #
    10 #
    27 
    27 
    28 import wx
    28 import wx
    29 import wx.grid
    29 import wx.grid
    30 import wx.lib.buttons
    30 import wx.lib.buttons
    31 
    31 
    32 from plcopen.structures import IEC_KEYWORDS, TestIdentifier
    32 from plcopen.structures import IEC_KEYWORDS, TestIdentifier, DefaultType
    33 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
    33 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
    34 from controls import CustomEditableListBox, CustomGrid, CustomTable
    34 from controls import CustomEditableListBox, CustomGrid, CustomTable
    35 from dialogs import ArrayTypeDialog
    35 from dialogs import ArrayTypeDialog
    36 from EditorPanel import EditorPanel
    36 from EditorPanel import EditorPanel
    37 from util.BitmapLibrary import GetBitmap
    37 from util.BitmapLibrary import GetBitmap
    57 #-------------------------------------------------------------------------------
    57 #-------------------------------------------------------------------------------
    58 #                            Structure Elements Table
    58 #                            Structure Elements Table
    59 #-------------------------------------------------------------------------------
    59 #-------------------------------------------------------------------------------
    60 
    60 
    61 class ElementsTable(CustomTable):
    61 class ElementsTable(CustomTable):
    62     
    62 
    63     """
    63     """
    64     A custom wx.grid.Grid Table using user supplied data
    64     A custom wx.grid.Grid Table using user supplied data
    65     """
    65     """
    66     def __init__(self, parent, data, colnames):
    66     def __init__(self, parent, data, colnames):
    67         # The base class must be initialized *first*
    67         # The base class must be initialized *first*
    68         CustomTable.__init__(self, parent, data, colnames)
    68         CustomTable.__init__(self, parent, data, colnames)
    69         self.old_value = None
    69         self.old_value = None
    70         
    70 
    71     def GetValue(self, row, col):
    71     def GetValue(self, row, col):
    72         if row < self.GetNumberRows():
    72         if row < self.GetNumberRows():
    73             if col == 0:
    73             if col == 0:
    74                 return row + 1
    74                 return row + 1
    75             colname = self.GetColLabelValue(col, False)
    75             colname = self.GetColLabelValue(col, False)
    76             value = self.data[row].get(colname, "")
    76             value = self.data[row].get(colname, "")
    77             if colname == "Type" and isinstance(value, TupleType):
    77             if colname == "Type" and isinstance(value, TupleType):
    78                 if value[0] == "array":
    78                 if value[0] == "array":
    79                     return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1])
    79                     return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1])
    80             return str(value)
    80             return str(value)
    81     
    81 
    82     def SetValue(self, row, col, value):
    82     def SetValue(self, row, col, value):
    83         if col < len(self.colnames):
    83         if col < len(self.colnames):
    84             colname = self.GetColLabelValue(col, False)
    84             colname = self.GetColLabelValue(col, False)
    85             if colname == "Name":
    85             if colname == "Name":
    86                 self.old_value = self.data[row][colname]
    86                 self.old_value = self.data[row][colname]
    87             self.data[row][colname] = value
    87             self.data[row][colname] = value
    88     
    88 
    89     def GetOldValue(self):
    89     def GetOldValue(self):
    90         return self.old_value
    90         return self.old_value
    91     
    91 
    92     def _updateColAttrs(self, grid):
    92     def _updateColAttrs(self, grid):
    93         """
    93         """
    94         wx.grid.Grid -> update the column attributes to add the
    94         wx.grid.Grid -> update the column attributes to add the
    95         appropriate renderer given the column name.
    95         appropriate renderer given the column name.
    96 
    96 
    97         Otherwise default to the default renderer.
    97         Otherwise default to the default renderer.
    98         """
    98         """
    99         
    99 
   100         for row in range(self.GetNumberRows()):
   100         for row in range(self.GetNumberRows()):
   101             row_highlights = self.Highlights.get(row, {})
   101             row_highlights = self.Highlights.get(row, {})
   102             for col in range(self.GetNumberCols()):
   102             for col in range(self.GetNumberCols()):
   103                 editor = None
   103                 editor = None
   104                 renderer = None
   104                 renderer = None
   113                         renderer = wx.grid.GridCellStringRenderer()
   113                         renderer = wx.grid.GridCellStringRenderer()
   114                     elif colname == "Type":
   114                     elif colname == "Type":
   115                         editor = wx.grid.GridCellTextEditor()
   115                         editor = wx.grid.GridCellTextEditor()
   116                 else:
   116                 else:
   117                     grid.SetReadOnly(row, col, True)
   117                     grid.SetReadOnly(row, col, True)
   118                 
   118 
   119                 grid.SetCellEditor(row, col, editor)
   119                 grid.SetCellEditor(row, col, editor)
   120                 grid.SetCellRenderer(row, col, renderer)
   120                 grid.SetCellRenderer(row, col, renderer)
   121                 
   121 
   122                 highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
   122                 highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
   123                 grid.SetCellBackgroundColour(row, col, highlight_colours[0])
   123                 grid.SetCellBackgroundColour(row, col, highlight_colours[0])
   124                 grid.SetCellTextColour(row, col, highlight_colours[1])
   124                 grid.SetCellTextColour(row, col, highlight_colours[1])
   125             self.ResizeRow(grid, row)
   125             self.ResizeRow(grid, row)
   126     
   126 
   127     def AddHighlight(self, infos, highlight_type):
   127     def AddHighlight(self, infos, highlight_type):
   128         row_highlights = self.Highlights.setdefault(infos[0], {})
   128         row_highlights = self.Highlights.setdefault(infos[0], {})
   129         if infos[1] == "initial":
   129         if infos[1] == "initial":
   130             col_highlights = row_highlights.setdefault("initial value", [])
   130             col_highlights = row_highlights.setdefault("initial value", [])
   131         else:
   131         else:
   135 #-------------------------------------------------------------------------------
   135 #-------------------------------------------------------------------------------
   136 #                          Datatype Editor class
   136 #                          Datatype Editor class
   137 #-------------------------------------------------------------------------------
   137 #-------------------------------------------------------------------------------
   138 
   138 
   139 class DataTypeEditor(EditorPanel):
   139 class DataTypeEditor(EditorPanel):
   140     
   140 
   141     def _init_Editor(self, parent):
   141     def _init_Editor(self, parent):
   142         self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER)
   142         self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER)
   143         
   143 
   144         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
   144         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
   145         self.MainSizer.AddGrowableCol(0)
   145         self.MainSizer.AddGrowableCol(0)
   146         self.MainSizer.AddGrowableRow(1)
   146         self.MainSizer.AddGrowableRow(1)
   147         
   147 
   148         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
   148         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
   149         self.MainSizer.AddSizer(top_sizer, border=5, 
   149         self.MainSizer.AddSizer(top_sizer, border=5,
   150               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
   150               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
   151         
   151 
   152         derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
   152         derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
   153         top_sizer.AddWindow(derivation_type_label, border=5, 
   153         top_sizer.AddWindow(derivation_type_label, border=5,
   154               flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
   154               flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
   155         
   155 
   156         self.DerivationType = wx.ComboBox(self.Editor,
   156         self.DerivationType = wx.ComboBox(self.Editor,
   157               size=wx.Size(200, -1), style=wx.CB_READONLY)
   157               size=wx.Size(200, -1), style=wx.CB_READONLY)
   158         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
   158         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
   159         top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW|wx.RIGHT)
   159         top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW|wx.RIGHT)
   160         
   160 
   161         typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
   161         typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
   162         typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
   162         typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
   163         self.MainSizer.AddSizer(typeinfos_sizer, border=5, 
   163         self.MainSizer.AddSizer(typeinfos_sizer, border=5,
   164               flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   164               flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   165         
   165 
   166         # Panel for Directly derived data types
   166         # Panel for Directly derived data types
   167 
   167 
   168         self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   168         self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   169         typeinfos_sizer.AddWindow(self.DirectlyPanel, 1)
   169         typeinfos_sizer.AddWindow(self.DirectlyPanel, 1)
   170         
   170 
   171         directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   171         directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   172         
   172 
   173         directly_basetype_label = wx.StaticText(self.DirectlyPanel, 
   173         directly_basetype_label = wx.StaticText(self.DirectlyPanel,
   174               label=_('Base Type:'))
   174               label=_('Base Type:'))
   175         directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5, 
   175         directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5,
   176               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   176               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   177         
   177 
   178         self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
   178         self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
   179         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType)
   179         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType)
   180         directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5, 
   180         directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5,
   181               flag=wx.GROW|wx.ALL)
   181               flag=wx.GROW|wx.ALL)
   182         
   182 
   183         directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
   183         directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
   184               label=_('Initial Value:'))
   184               label=_('Initial Value:'))
   185         directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5, 
   185         directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5,
   186               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   186               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   187         
   187 
   188         self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel, 
   188         self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel,
   189               style=wx.TE_PROCESS_ENTER|wx.TE_RICH)
   189               style=wx.TE_PROCESS_ENTER|wx.TE_RICH)
   190         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
   190         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
   191         directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5, 
   191         directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5,
   192               flag=wx.ALL)
   192               flag=wx.ALL)
   193         
   193 
   194         self.DirectlyPanel.SetSizer(directly_panel_sizer)
   194         self.DirectlyPanel.SetSizer(directly_panel_sizer)
   195         
   195 
   196         # Panel for Subrange data types
   196         # Panel for Subrange data types
   197 
   197 
   198         self.SubrangePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   198         self.SubrangePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   199         typeinfos_sizer.AddWindow(self.SubrangePanel, 1)
   199         typeinfos_sizer.AddWindow(self.SubrangePanel, 1)
   200         
   200 
   201         subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
   201         subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
   202         
   202 
   203         subrange_basetype_label = wx.StaticText(self.SubrangePanel,
   203         subrange_basetype_label = wx.StaticText(self.SubrangePanel,
   204               label=_('Base Type:'))
   204               label=_('Base Type:'))
   205         subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5, 
   205         subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5,
   206               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   206               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   207         
   207 
   208         self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
   208         self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
   209         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, 
   209         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged,
   210               self.SubrangeBaseType)
   210               self.SubrangeBaseType)
   211         subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5, 
   211         subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5,
   212               flag=wx.GROW|wx.ALL)
   212               flag=wx.GROW|wx.ALL)
   213         
   213 
   214         subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
   214         subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
   215               label=_('Initial Value:'))
   215               label=_('Initial Value:'))
   216         subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5, 
   216         subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5,
   217               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   217               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   218         
   218 
   219         self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel, 
   219         self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel,
   220               style=wx.TAB_TRAVERSAL)
   220               style=wx.TAB_TRAVERSAL)
   221         self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue)
   221         self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue)
   222         subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5, 
   222         subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5,
   223               flag=wx.GROW|wx.ALL)
   223               flag=wx.GROW|wx.ALL)
   224         
   224 
   225         subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
   225         subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
   226         subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5, 
   226         subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5,
   227               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   227               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   228         
   228 
   229         self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   229         self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   230         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum)
   230         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum)
   231         subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5, 
   231         subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5,
   232               flag=wx.GROW|wx.ALL)
   232               flag=wx.GROW|wx.ALL)
   233         
   233 
   234         for i in xrange(2):
   234         for i in xrange(2):
   235             subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
   235             subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
   236         
   236 
   237         subrange_maximum_label = wx.StaticText(self.SubrangePanel,
   237         subrange_maximum_label = wx.StaticText(self.SubrangePanel,
   238               label=_('Maximum:'))
   238               label=_('Maximum:'))
   239         subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5, 
   239         subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5,
   240               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   240               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   241         
   241 
   242         self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   242         self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   243         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum)
   243         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum)
   244         
   244 
   245         subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5, 
   245         subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5,
   246               flag=wx.GROW|wx.ALL)
   246               flag=wx.GROW|wx.ALL)
   247         
   247 
   248         self.SubrangePanel.SetSizer(subrange_panel_sizer)
   248         self.SubrangePanel.SetSizer(subrange_panel_sizer)
   249         
   249 
   250         # Panel for Enumerated data types
   250         # Panel for Enumerated data types
   251         
   251 
   252         self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   252         self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   253         typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1)
   253         typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1)
   254         
   254 
   255         enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   255         enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   256         
   256 
   257         self.EnumeratedValues = CustomEditableListBox(self.EnumeratedPanel, 
   257         self.EnumeratedValues = CustomEditableListBox(self.EnumeratedPanel,
   258               label=_("Values:"), style=wx.gizmos.EL_ALLOW_NEW| 
   258               label=_("Values:"), style=wx.gizmos.EL_ALLOW_NEW|
   259                                         wx.gizmos.EL_ALLOW_EDIT| 
   259                                         wx.gizmos.EL_ALLOW_EDIT|
   260                                         wx.gizmos.EL_ALLOW_DELETE)
   260                                         wx.gizmos.EL_ALLOW_DELETE)
   261         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
   261         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
   262         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
   262         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
   263             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
   263             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
   264         enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5, 
   264         enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5,
   265               flag=wx.GROW|wx.ALL)
   265               flag=wx.GROW|wx.ALL)
   266         
   266 
   267         enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   267         enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   268         enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
   268         enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
   269         
   269 
   270         enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
   270         enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
   271               label=_('Initial Value:'))
   271               label=_('Initial Value:'))
   272         enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1, 
   272         enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1,
   273               border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   273               border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   274         
   274 
   275         self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel, 
   275         self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel,
   276               style=wx.CB_READONLY)
   276               style=wx.CB_READONLY)
   277         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
   277         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
   278         enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1, 
   278         enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1,
   279               border=5, flag=wx.ALL)
   279               border=5, flag=wx.ALL)
   280         
   280 
   281         self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
   281         self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
   282         
   282 
   283         # Panel for Array data types
   283         # Panel for Array data types
   284 
   284 
   285         self.ArrayPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   285         self.ArrayPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   286         typeinfos_sizer.AddWindow(self.ArrayPanel, 1)
   286         typeinfos_sizer.AddWindow(self.ArrayPanel, 1)
   287         
   287 
   288         array_panel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
   288         array_panel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
   289         array_panel_sizer.AddGrowableCol(0)
   289         array_panel_sizer.AddGrowableCol(0)
   290         array_panel_sizer.AddGrowableCol(1)
   290         array_panel_sizer.AddGrowableCol(1)
   291         array_panel_sizer.AddGrowableRow(1)
   291         array_panel_sizer.AddGrowableRow(1)
   292         
   292 
   293         array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL)
   293         array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL)
   294         array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW)
   294         array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW)
   295         
   295 
   296         array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
   296         array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
   297         array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5, 
   297         array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5,
   298               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   298               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   299         
   299 
   300         self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
   300         self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
   301         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
   301         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
   302         array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5, 
   302         array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5,
   303               flag=wx.GROW|wx.ALL)
   303               flag=wx.GROW|wx.ALL)
   304     
   304 
   305         array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   305         array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   306         array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
   306         array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
   307         
   307 
   308         array_initialvalue_label = wx.StaticText(self.ArrayPanel,
   308         array_initialvalue_label = wx.StaticText(self.ArrayPanel,
   309               label=_('Initial Value:'))
   309               label=_('Initial Value:'))
   310         array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5, 
   310         array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5,
   311               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   311               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   312         
   312 
   313         self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
   313         self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
   314               style=wx.TE_PROCESS_ENTER|wx.TE_RICH)
   314               style=wx.TE_PROCESS_ENTER|wx.TE_RICH)
   315         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
   315         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
   316         array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5, 
   316         array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5,
   317               flag=wx.ALL)        
   317               flag=wx.ALL)
   318         
   318 
   319         self.ArrayDimensions = CustomEditableListBox(self.ArrayPanel, 
   319         self.ArrayDimensions = CustomEditableListBox(self.ArrayPanel,
   320               label=_("Dimensions:"), style=wx.gizmos.EL_ALLOW_NEW|
   320               label=_("Dimensions:"), style=wx.gizmos.EL_ALLOW_NEW|
   321                                             wx.gizmos.EL_ALLOW_EDIT|
   321                                             wx.gizmos.EL_ALLOW_EDIT|
   322                                             wx.gizmos.EL_ALLOW_DELETE)
   322                                             wx.gizmos.EL_ALLOW_DELETE)
   323         for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton", 
   323         for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton",
   324                      "_OnUpButton", "_OnDownButton"]:
   324                      "_OnUpButton", "_OnDownButton"]:
   325             setattr(self.ArrayDimensions, func, self.OnDimensionsChanged)
   325             setattr(self.ArrayDimensions, func, self.OnDimensionsChanged)
   326         array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5, 
   326         array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5,
   327               flag=wx.GROW|wx.ALL)
   327               flag=wx.GROW|wx.ALL)
   328         
   328 
   329         self.ArrayPanel.SetSizer(array_panel_sizer)
   329         self.ArrayPanel.SetSizer(array_panel_sizer)
   330         
   330 
   331         # Panel for Structure data types
   331         # Panel for Structure data types
   332         
   332 
   333         self.StructurePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   333         self.StructurePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   334         typeinfos_sizer.AddWindow(self.StructurePanel, 1)
   334         typeinfos_sizer.AddWindow(self.StructurePanel, 1)
   335         
   335 
   336         structure_panel_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
   336         structure_panel_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
   337         structure_panel_sizer.AddGrowableCol(0)
   337         structure_panel_sizer.AddGrowableCol(0)
   338         structure_panel_sizer.AddGrowableRow(1)
   338         structure_panel_sizer.AddGrowableRow(1)
   339         
   339 
   340         structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   340         structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   341         structure_button_sizer.AddGrowableCol(0)
   341         structure_button_sizer.AddGrowableCol(0)
   342         structure_button_sizer.AddGrowableRow(0)
   342         structure_button_sizer.AddGrowableRow(0)
   343         structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5, 
   343         structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5,
   344               flag=wx.ALL|wx.GROW)
   344               flag=wx.ALL|wx.GROW)
   345         
   345 
   346         structure_elements_label = wx.StaticText(self.StructurePanel,
   346         structure_elements_label = wx.StaticText(self.StructurePanel,
   347               label=_('Elements :'))
   347               label=_('Elements :'))
   348         structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
   348         structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
   349         
   349 
   350         for name, bitmap, help in [
   350         for name, bitmap, help in [
   351                 ("StructureAddButton", "add_element", _("Add element")),
   351                 ("StructureAddButton", "add_element", _("Add element")),
   352                 ("StructureDeleteButton", "remove_element", _("Remove element")),
   352                 ("StructureDeleteButton", "remove_element", _("Remove element")),
   353                 ("StructureUpButton", "up", _("Move element up")),
   353                 ("StructureUpButton", "up", _("Move element up")),
   354                 ("StructureDownButton", "down", _("Move element down"))]:
   354                 ("StructureDownButton", "down", _("Move element down"))]:
   355             button = wx.lib.buttons.GenBitmapButton(self.StructurePanel,
   355             button = wx.lib.buttons.GenBitmapButton(self.StructurePanel,
   356                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
   356                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
   357             button.SetToolTipString(help)
   357             button.SetToolTipString(help)
   358             setattr(self, name, button)
   358             setattr(self, name, button)
   359             structure_button_sizer.AddWindow(button)
   359             structure_button_sizer.AddWindow(button)
   360         
   360 
   361         self.StructureElementsGrid = CustomGrid(self.StructurePanel, 
   361         self.StructureElementsGrid = CustomGrid(self.StructurePanel,
   362               size=wx.Size(0, 150), style=wx.VSCROLL)
   362               size=wx.Size(0, 150), style=wx.VSCROLL)
   363         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, 
   363         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
   364               self.OnStructureElementsGridCellChange)
   364               self.OnStructureElementsGridCellChange)
   365         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, 
   365         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
   366               self.OnStructureElementsGridEditorShown)
   366               self.OnStructureElementsGridEditorShown)
   367         structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
   367         structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
   368         
   368 
   369         self.StructurePanel.SetSizer(structure_panel_sizer)
   369         self.StructurePanel.SetSizer(structure_panel_sizer)
   370         
   370 
   371         self.Editor.SetSizer(self.MainSizer)
   371         self.Editor.SetSizer(self.MainSizer)
   372         
   372 
   373     def __init__(self, parent, tagname, window, controler):
   373     def __init__(self, parent, tagname, window, controler):
   374         EditorPanel.__init__(self, parent, tagname, window, controler)
   374         EditorPanel.__init__(self, parent, tagname, window, controler)
   375         
   375 
   376         self.StructureElementDefaultValue = {"Name" : "", "Type" : "INT", "Initial Value" : ""}
   376         self.StructureElementDefaultValue = {"Name" : "", "Type" : DefaultType, "Initial Value" : ""}
   377         self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames())
   377         self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames())
   378         self.StructureColSizes = [40, 150, 100, 250]
   378         self.StructureColSizes = [40, 150, 100, 250]
   379         self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
   379         self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
   380         
   380 
   381         self.StructureElementsGrid.SetTable(self.StructureElementsTable)
   381         self.StructureElementsGrid.SetTable(self.StructureElementsTable)
   382         self.StructureElementsGrid.SetButtons({"Add": self.StructureAddButton,
   382         self.StructureElementsGrid.SetButtons({"Add": self.StructureAddButton,
   383                                                "Delete": self.StructureDeleteButton,
   383                                                "Delete": self.StructureDeleteButton,
   384                                                "Up": self.StructureUpButton,
   384                                                "Up": self.StructureUpButton,
   385                                                "Down": self.StructureDownButton})
   385                                                "Down": self.StructureDownButton})
   386         
   386 
   387         def _AddStructureElement(new_row):
   387         def _AddStructureElement(new_row):
   388             self.StructureElementsTable.InsertRow(new_row, self.StructureElementDefaultValue.copy())
   388             self.StructureElementsTable.InsertRow(new_row, self.StructureElementDefaultValue.copy())
   389             self.RefreshTypeInfos()
   389             self.RefreshTypeInfos()
   390             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   390             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   391             return new_row
   391             return new_row
   392         setattr(self.StructureElementsGrid, "_AddRow", _AddStructureElement)
   392         setattr(self.StructureElementsGrid, "_AddRow", _AddStructureElement)
   393         
   393 
   394         def _DeleteStructureElement(row):
   394         def _DeleteStructureElement(row):
   395             self.StructureElementsTable.RemoveRow(row)
   395             self.StructureElementsTable.RemoveRow(row)
   396             self.RefreshTypeInfos()
   396             self.RefreshTypeInfos()
   397             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   397             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   398         setattr(self.StructureElementsGrid, "_DeleteRow", _DeleteStructureElement)
   398         setattr(self.StructureElementsGrid, "_DeleteRow", _DeleteStructureElement)
   399             
   399 
   400         def _MoveStructureElement(row, move):
   400         def _MoveStructureElement(row, move):
   401             new_row = self.StructureElementsTable.MoveRow(row, move)
   401             new_row = self.StructureElementsTable.MoveRow(row, move)
   402             if new_row != row:
   402             if new_row != row:
   403                 self.RefreshTypeInfos()
   403                 self.RefreshTypeInfos()
   404                 self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   404                 self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   405             return new_row
   405             return new_row
   406         setattr(self.StructureElementsGrid, "_MoveRow", _MoveStructureElement)
   406         setattr(self.StructureElementsGrid, "_MoveRow", _MoveStructureElement)
   407         
   407 
   408         self.StructureElementsGrid.SetRowLabelSize(0)
   408         self.StructureElementsGrid.SetRowLabelSize(0)
   409         for col in range(self.StructureElementsTable.GetNumberCols()):
   409         for col in range(self.StructureElementsTable.GetNumberCols()):
   410             attr = wx.grid.GridCellAttr()
   410             attr = wx.grid.GridCellAttr()
   411             attr.SetAlignment(self.StructureColAlignements[col], wx.ALIGN_CENTRE)
   411             attr.SetAlignment(self.StructureColAlignements[col], wx.ALIGN_CENTRE)
   412             self.StructureElementsGrid.SetColAttr(col, attr)
   412             self.StructureElementsGrid.SetColAttr(col, attr)
   413             self.StructureElementsGrid.SetColMinimalWidth(col, self.StructureColSizes[col])
   413             self.StructureElementsGrid.SetColMinimalWidth(col, self.StructureColSizes[col])
   414             self.StructureElementsGrid.AutoSizeColumn(col, False)
   414             self.StructureElementsGrid.AutoSizeColumn(col, False)
   415         self.StructureElementsGrid.RefreshButtons()
   415         self.StructureElementsGrid.RefreshButtons()
   416         
   416 
   417         for datatype in GetDatatypeTypes():
   417         for datatype in GetDatatypeTypes():
   418             self.DerivationType.Append(_(datatype))
   418             self.DerivationType.Append(_(datatype))
   419         self.SubrangePanel.Hide()
   419         self.SubrangePanel.Hide()
   420         self.EnumeratedPanel.Hide()
   420         self.EnumeratedPanel.Hide()
   421         self.ArrayPanel.Hide()
   421         self.ArrayPanel.Hide()
   422         self.StructurePanel.Hide()
   422         self.StructurePanel.Hide()
   423         self.CurrentPanel = "Directly"
   423         self.CurrentPanel = "Directly"
   424         self.Highlights = []
   424         self.Highlights = []
   425         self.Initializing = False
   425         self.Initializing = False
   426         
   426 
   427         self.HighlightControls = {
   427         self.HighlightControls = {
   428             ("Directly", "base"): self.DirectlyBaseType,
   428             ("Directly", "base"): self.DirectlyBaseType,
   429             ("Directly", "initial"): self.DirectlyInitialValue,
   429             ("Directly", "initial"): self.DirectlyInitialValue,
   430             ("Subrange", "base"): self.SubrangeBaseType,
   430             ("Subrange", "base"): self.SubrangeBaseType,
   431             ("Subrange", "lower"): self.SubrangeMinimum,
   431             ("Subrange", "lower"): self.SubrangeMinimum,
   435             ("Enumerated", "initial"): self.EnumeratedInitialValue,
   435             ("Enumerated", "initial"): self.EnumeratedInitialValue,
   436             ("Array", "initial"): self.ArrayInitialValue,
   436             ("Array", "initial"): self.ArrayInitialValue,
   437             ("Array", "base"): self.ArrayBaseType,
   437             ("Array", "base"): self.ArrayBaseType,
   438             ("Array", "range"): self.ArrayDimensions,
   438             ("Array", "range"): self.ArrayDimensions,
   439         }
   439         }
   440         
   440 
   441         self.RefreshHighlightsTimer = wx.Timer(self, -1)
   441         self.RefreshHighlightsTimer = wx.Timer(self, -1)
   442         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
   442         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
   443         
   443 
   444     def __del__(self):
   444     def __del__(self):
   445         self.RefreshHighlightsTimer.Stop()
   445         self.RefreshHighlightsTimer.Stop()
   446     
   446 
   447     def GetBufferState(self):
   447     def GetBufferState(self):
   448         return self.Controler.GetBufferState()
   448         return self.Controler.GetBufferState()
   449         
   449 
   450     def Undo(self):
   450     def Undo(self):
   451         self.Controler.LoadPrevious()
   451         self.Controler.LoadPrevious()
   452         self.ParentWindow.CloseTabsWithoutModel()
   452         self.ParentWindow.CloseTabsWithoutModel()
   453             
   453 
   454     def Redo(self):
   454     def Redo(self):
   455         self.Controler.LoadNext()
   455         self.Controler.LoadNext()
   456         self.ParentWindow.CloseTabsWithoutModel()
   456         self.ParentWindow.CloseTabsWithoutModel()
   457     
   457 
   458     def HasNoModel(self):
   458     def HasNoModel(self):
   459         return self.Controler.GetEditedElement(self.TagName) is None
   459         return self.Controler.GetEditedElement(self.TagName) is None
   460         
   460 
   461     def RefreshView(self):
   461     def RefreshView(self):
   462         self.Initializing = True
   462         self.Initializing = True
   463         self.DirectlyBaseType.Clear()
   463         self.DirectlyBaseType.Clear()
   464         self.ArrayBaseType.Clear()
   464         self.ArrayBaseType.Clear()
   465         for datatype in self.Controler.GetDataTypes(self.TagName):
   465         for datatype in self.Controler.GetDataTypes(self.TagName):
   502             self.RefreshDisplayedInfos()
   502             self.RefreshDisplayedInfos()
   503         self.ShowHighlights()
   503         self.ShowHighlights()
   504         self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   504         self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   505         self.StructureElementsGrid.RefreshButtons()
   505         self.StructureElementsGrid.RefreshButtons()
   506         self.Initializing = False
   506         self.Initializing = False
   507     
   507 
   508     def OnDerivationTypeChanged(self, event):
   508     def OnDerivationTypeChanged(self, event):
   509         wx.CallAfter(self.RefreshDisplayedInfos)
   509         wx.CallAfter(self.RefreshDisplayedInfos)
   510         wx.CallAfter(self.RefreshTypeInfos)
   510         wx.CallAfter(self.RefreshTypeInfos)
   511         event.Skip()
   511         event.Skip()
   512 
   512 
   513     def OnReturnKeyPressed(self, event):
   513     def OnReturnKeyPressed(self, event):
   514         self.RefreshTypeInfos()
   514         self.RefreshTypeInfos()
   515         
   515 
   516     def OnInfosChanged(self, event):
   516     def OnInfosChanged(self, event):
   517         self.RefreshTypeInfos()
   517         self.RefreshTypeInfos()
   518         event.Skip()
   518         event.Skip()
   519 
   519 
   520     def OnSubrangeBaseTypeChanged(self, event):
   520     def OnSubrangeBaseTypeChanged(self, event):
   561                 wx.CallAfter(self.RefreshEnumeratedValues, initial_selected)
   561                 wx.CallAfter(self.RefreshEnumeratedValues, initial_selected)
   562                 wx.CallAfter(self.RefreshTypeInfos)
   562                 wx.CallAfter(self.RefreshTypeInfos)
   563                 event.Skip()
   563                 event.Skip()
   564         else:
   564         else:
   565             event.Skip()
   565             event.Skip()
   566     
   566 
   567     def OnEnumeratedValuesChanged(self, event):
   567     def OnEnumeratedValuesChanged(self, event):
   568         wx.CallAfter(self.RefreshEnumeratedValues)
   568         wx.CallAfter(self.RefreshEnumeratedValues)
   569         wx.CallAfter(self.RefreshTypeInfos)
   569         wx.CallAfter(self.RefreshTypeInfos)
   570         event.Skip()
   570         event.Skip()
   571     
   571 
   572     def OnStructureElementsGridCellChange(self, event):
   572     def OnStructureElementsGridCellChange(self, event):
   573         row, col = event.GetRow(), event.GetCol()
   573         row, col = event.GetRow(), event.GetCol()
   574         colname = self.StructureElementsTable.GetColLabelValue(col, False)
   574         colname = self.StructureElementsTable.GetColLabelValue(col, False)
   575         value = self.StructureElementsTable.GetValue(row, col)
   575         value = self.StructureElementsTable.GetValue(row, col)
   576         if colname == "Name":
   576         if colname == "Name":
   604                 event.Skip()
   604                 event.Skip()
   605         else:
   605         else:
   606             self.RefreshTypeInfos()
   606             self.RefreshTypeInfos()
   607             wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid)
   607             wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid)
   608             event.Skip()
   608             event.Skip()
   609     
   609 
   610     def OnStructureElementsGridSelectCell(self, event):
   610     def OnStructureElementsGridSelectCell(self, event):
   611         wx.CallAfter(self.RefreshStructureButtons)
   611         wx.CallAfter(self.RefreshStructureButtons)
   612         event.Skip()
   612         event.Skip()
   613     
   613 
   614     def OnStructureElementsGridEditorShown(self, event):
   614     def OnStructureElementsGridEditorShown(self, event):
   615         row, col = event.GetRow(), event.GetCol() 
   615         row, col = event.GetRow(), event.GetCol()
   616         if self.StructureElementsTable.GetColLabelValue(col, False) == "Type":
   616         if self.StructureElementsTable.GetColLabelValue(col, False) == "Type":
   617             type_menu = wx.Menu(title='')
   617             type_menu = wx.Menu(title='')
   618             
   618 
   619             base_menu = wx.Menu(title='')
   619             base_menu = wx.Menu(title='')
   620             for base_type in self.Controler.GetBaseTypes():
   620             for base_type in self.Controler.GetBaseTypes():
   621                 new_id = wx.NewId()
   621                 new_id = wx.NewId()
   622                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
   622                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
   623                 self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(base_type), id=new_id)
   623                 self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(base_type), id=new_id)
   624             type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
   624             type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
   625             
   625 
   626             datatype_menu = wx.Menu(title='')
   626             datatype_menu = wx.Menu(title='')
   627             for datatype in self.Controler.GetDataTypes(self.TagName, False):
   627             for datatype in self.Controler.GetDataTypes(self.TagName, False):
   628                 new_id = wx.NewId()
   628                 new_id = wx.NewId()
   629                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
   629                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
   630                 self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(datatype), id=new_id)
   630                 self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(datatype), id=new_id)
   631             type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
   631             type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
   632             
   632 
   633             new_id = wx.NewId()
   633             new_id = wx.NewId()
   634             AppendMenu(type_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array"))
   634             AppendMenu(type_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array"))
   635             self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, id=new_id)
   635             self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, id=new_id)
   636             
   636 
   637 ##            functionblock_menu = wx.Menu(title='')
   637 ##            functionblock_menu = wx.Menu(title='')
   638 ##            bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
   638 ##            bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
   639 ##            pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
   639 ##            pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
   640 ##            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
   640 ##            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
   641 ##                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName):
   641 ##                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName):
   659             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   659             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   660         return ElementTypeFunction
   660         return ElementTypeFunction
   661 
   661 
   662     def ElementArrayTypeFunction(self, event):
   662     def ElementArrayTypeFunction(self, event):
   663         row = self.StructureElementsGrid.GetGridCursorRow()
   663         row = self.StructureElementsGrid.GetGridCursorRow()
   664         dialog = ArrayTypeDialog(self, 
   664         dialog = ArrayTypeDialog(self,
   665                                  self.Controler.GetDataTypes(self.TagName), 
   665                                  self.Controler.GetDataTypes(self.TagName),
   666                                  self.StructureElementsTable.GetValueByName(row, "Type"))
   666                                  self.StructureElementsTable.GetValueByName(row, "Type"))
   667         if dialog.ShowModal() == wx.ID_OK:
   667         if dialog.ShowModal() == wx.ID_OK:
   668             self.StructureElementsTable.SetValueByName(row, "Type", dialog.GetValue())
   668             self.StructureElementsTable.SetValueByName(row, "Type", dialog.GetValue())
   669             self.RefreshTypeInfos()
   669             self.RefreshTypeInfos()
   670             self.StructureElementsTable.ResetView(self.StructureElementsGrid)
   670             self.StructureElementsTable.ResetView(self.StructureElementsGrid)