editors/DataTypeEditor.py
changeset 1784 64beb9e9c749
parent 1782 5b6ad7a7fd9d
child 1812 8626a4948d5e
equal deleted inserted replaced
1729:31e63e25b4cc 1784:64beb9e9c749
    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
    38 
    38 from util.TranslationCatalogs import NoTranslate
    39 #-------------------------------------------------------------------------------
    39 
       
    40 # -------------------------------------------------------------------------------
    40 #                                    Helpers
    41 #                                    Helpers
    41 #-------------------------------------------------------------------------------
    42 # -------------------------------------------------------------------------------
    42 
    43 
    43 DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$")
    44 DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$")
       
    45 
    44 
    46 
    45 def AppendMenu(parent, help, id, kind, text):
    47 def AppendMenu(parent, help, id, kind, text):
    46     parent.Append(help=help, id=id, kind=kind, text=text)
    48     parent.Append(help=help, id=id, kind=kind, text=text)
    47 
    49 
       
    50 
    48 def GetElementsTableColnames():
    51 def GetElementsTableColnames():
    49     _ = lambda x : x
    52     _ = NoTranslate
    50     return ["#", _("Name"), _("Type"), _("Initial Value")]
    53     return ["#", _("Name"), _("Type"), _("Initial Value")]
    51 
    54 
       
    55 
    52 def GetDatatypeTypes():
    56 def GetDatatypeTypes():
    53     _ = lambda x : x
    57     _ = NoTranslate
    54     return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")]
    58     return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")]
       
    59 
       
    60 
    55 DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
    61 DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
    56 
    62 
    57 #-------------------------------------------------------------------------------
    63 # -------------------------------------------------------------------------------
    58 #                            Structure Elements Table
    64 #                            Structure Elements Table
    59 #-------------------------------------------------------------------------------
    65 # -------------------------------------------------------------------------------
       
    66 
    60 
    67 
    61 class ElementsTable(CustomTable):
    68 class ElementsTable(CustomTable):
    62 
    69 
    63     """
    70     """
    64     A custom wx.grid.Grid Table using user supplied data
    71     A custom wx.grid.Grid Table using user supplied data
    72         if row < self.GetNumberRows():
    79         if row < self.GetNumberRows():
    73             if col == 0:
    80             if col == 0:
    74                 return row + 1
    81                 return row + 1
    75             colname = self.GetColLabelValue(col, False)
    82             colname = self.GetColLabelValue(col, False)
    76             value = self.data[row].get(colname, "")
    83             value = self.data[row].get(colname, "")
    77                
    84 
    78             if colname == "Type" and isinstance(value, TupleType):
    85             if colname == "Type" and isinstance(value, TupleType):
    79                 if value[0] == "array":
    86                 if value[0] == "array":
    80                     return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1])
    87                     return "ARRAY [%s] OF %s" % (",".join(map(lambda x: "..".join(x), value[2])), value[1])
    81             return value
    88             return value
    82 
    89 
    83     def SetValue(self, row, col, value):
    90     def SetValue(self, row, col, value):
    84         if col < len(self.colnames):
    91         if col < len(self.colnames):
    85             colname = self.GetColLabelValue(col, False)
    92             colname = self.GetColLabelValue(col, False)
   131             col_highlights = row_highlights.setdefault("initial value", [])
   138             col_highlights = row_highlights.setdefault("initial value", [])
   132         else:
   139         else:
   133             col_highlights = row_highlights.setdefault(infos[1], [])
   140             col_highlights = row_highlights.setdefault(infos[1], [])
   134         col_highlights.append(highlight_type)
   141         col_highlights.append(highlight_type)
   135 
   142 
   136 #-------------------------------------------------------------------------------
   143 # -------------------------------------------------------------------------------
   137 #                          Datatype Editor class
   144 #                          Datatype Editor class
   138 #-------------------------------------------------------------------------------
   145 # -------------------------------------------------------------------------------
       
   146 
   139 
   147 
   140 class DataTypeEditor(EditorPanel):
   148 class DataTypeEditor(EditorPanel):
   141 
   149 
   142     def _init_Editor(self, parent):
   150     def _init_Editor(self, parent):
   143         self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER)
   151         self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER)
   146         self.MainSizer.AddGrowableCol(0)
   154         self.MainSizer.AddGrowableCol(0)
   147         self.MainSizer.AddGrowableRow(1)
   155         self.MainSizer.AddGrowableRow(1)
   148 
   156 
   149         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
   157         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
   150         self.MainSizer.AddSizer(top_sizer, border=5,
   158         self.MainSizer.AddSizer(top_sizer, border=5,
   151               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
   159                                 flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
   152 
   160 
   153         derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
   161         derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
   154         top_sizer.AddWindow(derivation_type_label, border=5,
   162         top_sizer.AddWindow(derivation_type_label, border=5,
   155               flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
   163                             flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT)
   156 
   164 
   157         self.DerivationType = wx.ComboBox(self.Editor,
   165         self.DerivationType = wx.ComboBox(self.Editor,
   158               size=wx.Size(200, -1), style=wx.CB_READONLY)
   166                                           size=wx.Size(200, -1), style=wx.CB_READONLY)
   159         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
   167         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
   160         top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW|wx.RIGHT)
   168         top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW | wx.RIGHT)
   161 
   169 
   162         typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
   170         typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
   163         typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
   171         typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
   164         self.MainSizer.AddSizer(typeinfos_sizer, border=5,
   172         self.MainSizer.AddSizer(typeinfos_sizer, border=5,
   165               flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   173                                 flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
   166 
   174 
   167         # Panel for Directly derived data types
   175         # Panel for Directly derived data types
   168 
   176 
   169         self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   177         self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   170         typeinfos_sizer.AddWindow(self.DirectlyPanel, 1)
   178         typeinfos_sizer.AddWindow(self.DirectlyPanel, 1)
   171 
   179 
   172         directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   180         directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   173 
   181 
   174         directly_basetype_label = wx.StaticText(self.DirectlyPanel,
   182         directly_basetype_label = wx.StaticText(self.DirectlyPanel,
   175               label=_('Base Type:'))
   183                                                 label=_('Base Type:'))
   176         directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5,
   184         directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5,
   177               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   185                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   178 
   186 
   179         self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
   187         self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
   180         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType)
   188         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType)
   181         directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5,
   189         directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5,
   182               flag=wx.GROW|wx.ALL)
   190                                        flag=wx.GROW | wx.ALL)
   183 
   191 
   184         directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
   192         directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
   185               label=_('Initial Value:'))
   193                                                     label=_('Initial Value:'))
   186         directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5,
   194         directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5,
   187               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   195                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   188 
   196 
   189         self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel,
   197         self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel,
   190               style=wx.TE_PROCESS_ENTER|wx.TE_RICH)
   198                                                 style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
   191         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
   199         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
   192         directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5,
   200         directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5,
   193               flag=wx.ALL)
   201                                        flag=wx.ALL)
   194 
   202 
   195         self.DirectlyPanel.SetSizer(directly_panel_sizer)
   203         self.DirectlyPanel.SetSizer(directly_panel_sizer)
   196 
   204 
   197         # Panel for Subrange data types
   205         # Panel for Subrange data types
   198 
   206 
   200         typeinfos_sizer.AddWindow(self.SubrangePanel, 1)
   208         typeinfos_sizer.AddWindow(self.SubrangePanel, 1)
   201 
   209 
   202         subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
   210         subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
   203 
   211 
   204         subrange_basetype_label = wx.StaticText(self.SubrangePanel,
   212         subrange_basetype_label = wx.StaticText(self.SubrangePanel,
   205               label=_('Base Type:'))
   213                                                 label=_('Base Type:'))
   206         subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5,
   214         subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5,
   207               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   215                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   208 
   216 
   209         self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
   217         self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
   210         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged,
   218         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged,
   211               self.SubrangeBaseType)
   219                   self.SubrangeBaseType)
   212         subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5,
   220         subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5,
   213               flag=wx.GROW|wx.ALL)
   221                                        flag=wx.GROW | wx.ALL)
   214 
   222 
   215         subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
   223         subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
   216               label=_('Initial Value:'))
   224                                                     label=_('Initial Value:'))
   217         subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5,
   225         subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5,
   218               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   226                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   219 
   227 
   220         self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel,
   228         self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel,
   221               style=wx.TAB_TRAVERSAL)
   229                                                 style=wx.TAB_TRAVERSAL)
   222         self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue)
   230         self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue)
   223         subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5,
   231         subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5,
   224               flag=wx.GROW|wx.ALL)
   232                                        flag=wx.GROW | wx.ALL)
   225 
   233 
   226         subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
   234         subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
   227         subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5,
   235         subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5,
   228               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   236                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   229 
   237 
   230         self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   238         self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   231         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum)
   239         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum)
   232         subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5,
   240         subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5,
   233               flag=wx.GROW|wx.ALL)
   241                                        flag=wx.GROW | wx.ALL)
   234 
   242 
   235         for i in xrange(2):
   243         for i in xrange(2):
   236             subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
   244             subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
   237 
   245 
   238         subrange_maximum_label = wx.StaticText(self.SubrangePanel,
   246         subrange_maximum_label = wx.StaticText(self.SubrangePanel,
   239               label=_('Maximum:'))
   247                                                label=_('Maximum:'))
   240         subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5,
   248         subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5,
   241               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   249                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   242 
   250 
   243         self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   251         self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
   244         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum)
   252         self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum)
   245 
   253 
   246         subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5,
   254         subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5,
   247               flag=wx.GROW|wx.ALL)
   255                                        flag=wx.GROW | wx.ALL)
   248 
   256 
   249         self.SubrangePanel.SetSizer(subrange_panel_sizer)
   257         self.SubrangePanel.SetSizer(subrange_panel_sizer)
   250 
   258 
   251         # Panel for Enumerated data types
   259         # Panel for Enumerated data types
   252 
   260 
   253         self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   261         self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
   254         typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1)
   262         typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1)
   255 
   263 
   256         enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   264         enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
   257 
   265 
   258         self.EnumeratedValues = CustomEditableListBox(self.EnumeratedPanel,
   266         self.EnumeratedValues = CustomEditableListBox(
   259               label=_("Values:"), style=wx.gizmos.EL_ALLOW_NEW|
   267                 self.EnumeratedPanel,
   260                                         wx.gizmos.EL_ALLOW_EDIT|
   268                 label=_("Values:"),
   261                                         wx.gizmos.EL_ALLOW_DELETE)
   269                 style=(wx.gizmos.EL_ALLOW_NEW |
       
   270                        wx.gizmos.EL_ALLOW_EDIT |
       
   271                        wx.gizmos.EL_ALLOW_DELETE))
   262         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
   272         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
   263         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
   273         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
   264             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
   274             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
   265         enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5,
   275         enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5,
   266               flag=wx.GROW|wx.ALL)
   276                                          flag=wx.GROW | wx.ALL)
   267 
   277 
   268         enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   278         enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   269         enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
   279         enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
   270 
   280 
   271         enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
   281         enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
   272               label=_('Initial Value:'))
   282                                                       label=_('Initial Value:'))
   273         enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1,
   283         enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1,
   274               border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   284                                               border=5,
       
   285                                               flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   275 
   286 
   276         self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel,
   287         self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel,
   277               style=wx.CB_READONLY)
   288                                                   style=wx.CB_READONLY)
   278         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
   289         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
   279         enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1,
   290         enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1,
   280               border=5, flag=wx.ALL)
   291                                               border=5, flag=wx.ALL)
   281 
   292 
   282         self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
   293         self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
   283 
   294 
   284         # Panel for Array data types
   295         # Panel for Array data types
   285 
   296 
   294         array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL)
   305         array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL)
   295         array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW)
   306         array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW)
   296 
   307 
   297         array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
   308         array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
   298         array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5,
   309         array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5,
   299               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   310                                         flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   300 
   311 
   301         self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
   312         self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
   302         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
   313         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
   303         array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5,
   314         array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5,
   304               flag=wx.GROW|wx.ALL)
   315                                         flag=wx.GROW | wx.ALL)
   305 
   316 
   306         array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   317         array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
   307         array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
   318         array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
   308 
   319 
   309         array_initialvalue_label = wx.StaticText(self.ArrayPanel,
   320         array_initialvalue_label = wx.StaticText(self.ArrayPanel,
   310               label=_('Initial Value:'))
   321                                                  label=_('Initial Value:'))
   311         array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5,
   322         array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5,
   312               flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
   323                                          flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
   313 
   324 
   314         self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
   325         self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
   315               style=wx.TE_PROCESS_ENTER|wx.TE_RICH)
   326                                              style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
   316         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
   327         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
   317         array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5,
   328         array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5,
   318               flag=wx.ALL)
   329                                          flag=wx.ALL)
   319 
   330 
   320         self.ArrayDimensions = CustomEditableListBox(self.ArrayPanel,
   331         self.ArrayDimensions = CustomEditableListBox(
   321               label=_("Dimensions:"), style=wx.gizmos.EL_ALLOW_NEW|
   332                 self.ArrayPanel,
   322                                             wx.gizmos.EL_ALLOW_EDIT|
   333                 label=_("Dimensions:"),
   323                                             wx.gizmos.EL_ALLOW_DELETE)
   334                 style=(wx.gizmos.EL_ALLOW_NEW |
       
   335                        wx.gizmos.EL_ALLOW_EDIT |
       
   336                        wx.gizmos.EL_ALLOW_DELETE))
   324         for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton",
   337         for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton",
   325                      "_OnUpButton", "_OnDownButton"]:
   338                      "_OnUpButton", "_OnDownButton"]:
   326             setattr(self.ArrayDimensions, func, self.OnDimensionsChanged)
   339             setattr(self.ArrayDimensions, func, self.OnDimensionsChanged)
   327         array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5,
   340         array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5,
   328               flag=wx.GROW|wx.ALL)
   341                                     flag=wx.GROW | wx.ALL)
   329 
   342 
   330         self.ArrayPanel.SetSizer(array_panel_sizer)
   343         self.ArrayPanel.SetSizer(array_panel_sizer)
   331 
   344 
   332         # Panel for Structure data types
   345         # Panel for Structure data types
   333 
   346 
   340 
   353 
   341         structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   354         structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   342         structure_button_sizer.AddGrowableCol(0)
   355         structure_button_sizer.AddGrowableCol(0)
   343         structure_button_sizer.AddGrowableRow(0)
   356         structure_button_sizer.AddGrowableRow(0)
   344         structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5,
   357         structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5,
   345               flag=wx.ALL|wx.GROW)
   358                                        flag=wx.ALL | wx.GROW)
   346 
   359 
   347         structure_elements_label = wx.StaticText(self.StructurePanel,
   360         structure_elements_label = wx.StaticText(self.StructurePanel,
   348               label=_('Elements :'))
   361                                                  label=_('Elements :'))
   349         structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
   362         structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
   350 
   363 
   351         for name, bitmap, help in [
   364         for name, bitmap, help in [
   352                 ("StructureAddButton", "add_element", _("Add element")),
   365                 ("StructureAddButton", "add_element", _("Add element")),
   353                 ("StructureDeleteButton", "remove_element", _("Remove element")),
   366                 ("StructureDeleteButton", "remove_element", _("Remove element")),
   354                 ("StructureUpButton", "up", _("Move element up")),
   367                 ("StructureUpButton", "up", _("Move element up")),
   355                 ("StructureDownButton", "down", _("Move element down"))]:
   368                 ("StructureDownButton", "down", _("Move element down"))]:
   356             button = wx.lib.buttons.GenBitmapButton(self.StructurePanel,
   369             button = wx.lib.buttons.GenBitmapButton(self.StructurePanel,
   357                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
   370                                                     bitmap=GetBitmap(bitmap),
       
   371                                                     size=wx.Size(28, 28),
       
   372                                                     style=wx.NO_BORDER)
   358             button.SetToolTipString(help)
   373             button.SetToolTipString(help)
   359             setattr(self, name, button)
   374             setattr(self, name, button)
   360             structure_button_sizer.AddWindow(button)
   375             structure_button_sizer.AddWindow(button)
   361 
   376 
   362         self.StructureElementsGrid = CustomGrid(self.StructurePanel,
   377         self.StructureElementsGrid = CustomGrid(self.StructurePanel,
   363               size=wx.Size(0, 150), style=wx.VSCROLL)
   378                                                 size=wx.Size(0, 150), style=wx.VSCROLL)
   364         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
   379         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
   365               self.OnStructureElementsGridCellChange)
   380                                         self.OnStructureElementsGridCellChange)
   366         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
   381         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
   367               self.OnStructureElementsGridEditorShown)
   382                                         self.OnStructureElementsGridEditorShown)
   368         structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
   383         structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
   369 
   384 
   370         self.StructurePanel.SetSizer(structure_panel_sizer)
   385         self.StructurePanel.SetSizer(structure_panel_sizer)
   371 
   386 
   372         self.Editor.SetSizer(self.MainSizer)
   387         self.Editor.SetSizer(self.MainSizer)
   373 
   388 
   374     def __init__(self, parent, tagname, window, controler):
   389     def __init__(self, parent, tagname, window, controler):
   375         EditorPanel.__init__(self, parent, tagname, window, controler)
   390         EditorPanel.__init__(self, parent, tagname, window, controler)
   376 
   391 
   377         self.StructureElementDefaultValue = {"Name" : "", "Type" : DefaultType, "Initial Value" : ""}
   392         self.StructureElementDefaultValue = {"Name": "", "Type": DefaultType, "Initial Value": ""}
   378         self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames())
   393         self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames())
   379         self.StructureColSizes = [40, 150, 100, 250]
   394         self.StructureColSizes = [40, 150, 100, 250]
   380         self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
   395         self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
   381 
   396 
   382         self.StructureElementsGrid.SetTable(self.StructureElementsTable)
   397         self.StructureElementsGrid.SetTable(self.StructureElementsTable)
   494                 self.EnumeratedValues.SetStrings(type_infos["values"])
   509                 self.EnumeratedValues.SetStrings(type_infos["values"])
   495                 self.RefreshEnumeratedValues()
   510                 self.RefreshEnumeratedValues()
   496                 self.EnumeratedInitialValue.SetStringSelection(type_infos["initial"])
   511                 self.EnumeratedInitialValue.SetStringSelection(type_infos["initial"])
   497             elif type_infos["type"] == "Array":
   512             elif type_infos["type"] == "Array":
   498                 self.ArrayBaseType.SetStringSelection(type_infos["base_type"])
   513                 self.ArrayBaseType.SetStringSelection(type_infos["base_type"])
   499                 self.ArrayDimensions.SetStrings(map(lambda x : "..".join(x), type_infos["dimensions"]))
   514                 self.ArrayDimensions.SetStrings(map(lambda x: "..".join(x), type_infos["dimensions"]))
   500                 self.ArrayInitialValue.SetValue(type_infos["initial"])
   515                 self.ArrayInitialValue.SetValue(type_infos["initial"])
   501             elif type_infos["type"] == "Structure":
   516             elif type_infos["type"] == "Structure":
   502                 self.StructureElementsTable.SetData(type_infos["elements"])
   517                 self.StructureElementsTable.SetData(type_infos["elements"])
   503             self.RefreshDisplayedInfos()
   518             self.RefreshDisplayedInfos()
   504         self.ShowHighlights()
   519         self.ShowHighlights()
   545         text = event.GetText()
   560         text = event.GetText()
   546         values = self.EnumeratedValues.GetStrings()
   561         values = self.EnumeratedValues.GetStrings()
   547         index = event.GetIndex()
   562         index = event.GetIndex()
   548         if index >= len(values) or values[index].upper() != text.upper():
   563         if index >= len(values) or values[index].upper() != text.upper():
   549             if text.upper() in [value.upper() for value in values]:
   564             if text.upper() in [value.upper() for value in values]:
   550                 message = wx.MessageDialog(self, _("\"%s\" value already defined!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
   565                 message = wx.MessageDialog(self, _("\"%s\" value already defined!") % text, _("Error"), wx.OK | wx.ICON_ERROR)
   551                 message.ShowModal()
   566                 message.ShowModal()
   552                 message.Destroy()
   567                 message.Destroy()
   553                 event.Veto()
   568                 event.Veto()
   554             elif text.upper() in IEC_KEYWORDS:
   569             elif text.upper() in IEC_KEYWORDS:
   555                 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
   570                 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!") % text, _("Error"), wx.OK | wx.ICON_ERROR)
   556                 message.ShowModal()
   571                 message.ShowModal()
   557                 message.Destroy()
   572                 message.Destroy()
   558             else:
   573             else:
   559                 initial_selected = None
   574                 initial_selected = None
   560                 if index < len(values) and self.EnumeratedInitialValue.GetStringSelection() == values[index]:
   575                 if index < len(values) and self.EnumeratedInitialValue.GetStringSelection() == values[index]:
   569         wx.CallAfter(self.RefreshEnumeratedValues)
   584         wx.CallAfter(self.RefreshEnumeratedValues)
   570         wx.CallAfter(self.RefreshTypeInfos)
   585         wx.CallAfter(self.RefreshTypeInfos)
   571         event.Skip()
   586         event.Skip()
   572 
   587 
   573     def ShowErrorMessage(self, message):
   588     def ShowErrorMessage(self, message):
   574         dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
   589         dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
   575         dialog.ShowModal()
   590         dialog.ShowModal()
   576         dialog.Destroy()
   591         dialog.Destroy()
   577         
   592 
   578     def OnStructureElementsGridCellChange(self, event):
   593     def OnStructureElementsGridCellChange(self, event):
   579         row, col = event.GetRow(), event.GetCol()
   594         row, col = event.GetRow(), event.GetCol()
   580         colname = self.StructureElementsTable.GetColLabelValue(col, False)
   595         colname = self.StructureElementsTable.GetColLabelValue(col, False)
   581         value = self.StructureElementsTable.GetValue(row, col)
   596         value = self.StructureElementsTable.GetValue(row, col)
   582         if colname == "Name":
   597         if colname == "Name":
   583             message = None
   598             message = None
   584             if not TestIdentifier(value):
   599             if not TestIdentifier(value):
   585                 message = _("\"%s\" is not a valid identifier!")%value
   600                 message = _("\"%s\" is not a valid identifier!") % value
   586             elif value.upper() in IEC_KEYWORDS:
   601             elif value.upper() in IEC_KEYWORDS:
   587                 message = _("\"%s\" is a keyword. It can't be used!")%value
   602                 message = _("\"%s\" is a keyword. It can't be used!") % value
   588 ##            elif value.upper() in self.PouNames:
   603 #            elif value.upper() in self.PouNames:
   589 ##                message = _("A pou with \"%s\" as name exists!")%value
   604 #                message = _("A pou with \"%s\" as name exists!")%value
   590             elif value.upper() in [var["Name"].upper() for idx, var in enumerate(self.StructureElementsTable.GetData()) if idx != row]:
   605             elif value.upper() in [var["Name"].upper() for idx, var in enumerate(self.StructureElementsTable.GetData()) if idx != row]:
   591                 message = _("An element named \"%s\" already exists in this structure!")%value
   606                 message = _("An element named \"%s\" already exists in this structure!") % value
   592             else:
   607             else:
   593                 self.RefreshTypeInfos()
   608                 self.RefreshTypeInfos()
   594                 wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid)
   609                 wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid)
   595 ##                old_value = self.Table.GetOldValue()
   610 #                old_value = self.Table.GetOldValue()
   596 ##                if old_value != "":
   611 #                if old_value != "":
   597 ##                    self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
   612 #                    self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
   598 ##                self.Controler.BufferProject()
   613 #                self.Controler.BufferProject()
   599                 event.Skip()
   614                 event.Skip()
   600 
   615 
   601             if message is not None:
   616             if message is not None:
   602                 event.Veto()
   617                 event.Veto()
   603                 wx.CallAfter(self.ShowErrorMessage, message)
   618                 wx.CallAfter(self.ShowErrorMessage, message)
   631 
   646 
   632             new_id = wx.NewId()
   647             new_id = wx.NewId()
   633             AppendMenu(type_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array"))
   648             AppendMenu(type_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array"))
   634             self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, id=new_id)
   649             self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, id=new_id)
   635 
   650 
   636 ##            functionblock_menu = wx.Menu(title='')
   651 #            functionblock_menu = wx.Menu(title='')
   637 ##            bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
   652 #            bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
   638 ##            pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
   653 #            pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
   639 ##            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
   654 #            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
   640 ##                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName):
   655 #                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName):
   641 ##                    new_id = wx.NewId()
   656 #                    new_id = wx.NewId()
   642 ##                    AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
   657 #                    AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
   643 ##                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
   658 #                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
   644 ##                type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
   659 #                type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
   645 
   660 
   646             rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col))
   661             rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col))
   647             self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize())
   662             self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize())
   648             type_menu.Destroy()
   663             type_menu.Destroy()
   649             event.Veto()
   664             event.Veto()
   716     def RefreshSubrangeInitialValueRange(self):
   731     def RefreshSubrangeInitialValueRange(self):
   717         self.SubrangeInitialValue.SetRange(self.SubrangeMinimum.GetValue(), self.SubrangeMaximum.GetValue())
   732         self.SubrangeInitialValue.SetRange(self.SubrangeMinimum.GetValue(), self.SubrangeMaximum.GetValue())
   718 
   733 
   719     def RefreshTypeInfos(self):
   734     def RefreshTypeInfos(self):
   720         selected = DATATYPE_TYPES_DICT[self.DerivationType.GetStringSelection()]
   735         selected = DATATYPE_TYPES_DICT[self.DerivationType.GetStringSelection()]
   721         infos = {"type" : selected}
   736         infos = {"type": selected}
   722         if selected == "Directly":
   737         if selected == "Directly":
   723             infos["base_type"] = self.DirectlyBaseType.GetStringSelection()
   738             infos["base_type"] = self.DirectlyBaseType.GetStringSelection()
   724             infos["initial"] = self.DirectlyInitialValue.GetValue()
   739             infos["initial"] = self.DirectlyInitialValue.GetValue()
   725         elif selected == "Subrange":
   740         elif selected == "Subrange":
   726             infos["base_type"] = self.SubrangeBaseType.GetStringSelection()
   741             infos["base_type"] = self.SubrangeBaseType.GetStringSelection()
   738             infos["base_type"] = self.ArrayBaseType.GetStringSelection()
   753             infos["base_type"] = self.ArrayBaseType.GetStringSelection()
   739             infos["dimensions"] = []
   754             infos["dimensions"] = []
   740             for dimensions in self.ArrayDimensions.GetStrings():
   755             for dimensions in self.ArrayDimensions.GetStrings():
   741                 result = DIMENSION_MODEL.match(dimensions)
   756                 result = DIMENSION_MODEL.match(dimensions)
   742                 if result is None:
   757                 if result is None:
   743                     message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!")%dimensions, _("Error"), wx.OK|wx.ICON_ERROR)
   758                     message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!") % dimensions, _("Error"), wx.OK | wx.ICON_ERROR)
   744                     message.ShowModal()
   759                     message.ShowModal()
   745                     message.Destroy()
   760                     message.Destroy()
   746                     self.RefreshView()
   761                     self.RefreshView()
   747                     return
   762                     return
   748                 bounds = result.groups()
   763                 bounds = result.groups()
   749                 if int(bounds[0]) >= int(bounds[1]):
   764                 if int(bounds[0]) >= int(bounds[1]):
   750                     message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!\nRight value must be greater than left value.")%dimensions, _("Error"), wx.OK|wx.ICON_ERROR)
   765                     message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!\nRight value must be greater than left value.") % dimensions, _("Error"), wx.OK | wx.ICON_ERROR)
   751                     message.ShowModal()
   766                     message.ShowModal()
   752                     message.Destroy()
   767                     message.Destroy()
   753                     self.RefreshView()
   768                     self.RefreshView()
   754                     return
   769                     return
   755                 infos["dimensions"].append(bounds)
   770                 infos["dimensions"].append(bounds)
   760         self.Controler.SetDataTypeInfos(self.TagName, infos)
   775         self.Controler.SetDataTypeInfos(self.TagName, infos)
   761         self.ParentWindow.RefreshTitle()
   776         self.ParentWindow.RefreshTitle()
   762         self.ParentWindow.RefreshFileMenu()
   777         self.ParentWindow.RefreshFileMenu()
   763         self.ParentWindow.RefreshEditMenu()
   778         self.ParentWindow.RefreshEditMenu()
   764 
   779 
   765 #-------------------------------------------------------------------------------
   780     # -------------------------------------------------------------------------------
   766 #                        Highlights showing functions
   781     #                        Highlights showing functions
   767 #-------------------------------------------------------------------------------
   782     # -------------------------------------------------------------------------------
   768 
   783 
   769     def OnRefreshHighlightsTimer(self, event):
   784     def OnRefreshHighlightsTimer(self, event):
   770         self.RefreshView()
   785         self.RefreshView()
   771         event.Skip()
   786         event.Skip()
   772 
   787 
   788                     listctrl.SetItemBackgroundColour(i, wx.NullColour)
   803                     listctrl.SetItemBackgroundColour(i, wx.NullColour)
   789                     listctrl.SetItemTextColour(i, wx.NullColour)
   804                     listctrl.SetItemTextColour(i, wx.NullColour)
   790         self.StructureElementsTable.ClearHighlights(highlight_type)
   805         self.StructureElementsTable.ClearHighlights(highlight_type)
   791         self.RefreshView()
   806         self.RefreshView()
   792 
   807 
   793     def AddHighlight(self, infos, start, end ,highlight_type):
   808     def AddHighlight(self, infos, start, end, highlight_type):
   794         self.Highlights.append((infos, start, end, highlight_type))
   809         self.Highlights.append((infos, start, end, highlight_type))
   795         self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
   810         self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
   796 
   811 
   797     def ShowHighlights(self):
   812     def ShowHighlights(self):
   798         type_infos = self.Controler.GetDataTypeInfos(self.TagName)
   813         type_infos = self.Controler.GetDataTypeInfos(self.TagName)
   810                     elif isinstance(control, wx.gizmos.EditableListBox):
   825                     elif isinstance(control, wx.gizmos.EditableListBox):
   811                         listctrl = control.GetListCtrl()
   826                         listctrl = control.GetListCtrl()
   812                         listctrl.SetItemBackgroundColour(infos[1], highlight_type[0])
   827                         listctrl.SetItemBackgroundColour(infos[1], highlight_type[0])
   813                         listctrl.SetItemTextColour(infos[1], highlight_type[1])
   828                         listctrl.SetItemTextColour(infos[1], highlight_type[1])
   814                         listctrl.Select(listctrl.FocusedItem, False)
   829                         listctrl.Select(listctrl.FocusedItem, False)
   815