DataTypeEditor.py
changeset 577 9dbb79722fbc
parent 576 3f2024f30553
child 586 9aa96a36cf33
--- a/DataTypeEditor.py	Wed Oct 12 23:47:48 2011 +0200
+++ b/DataTypeEditor.py	Fri Oct 14 19:26:29 2011 +0200
@@ -24,9 +24,10 @@
 
 import wx
 import wx.grid
-import wx.gizmos
+
 from plcopen.structures import IEC_KEYWORDS, TestIdentifier
 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
+from controls import CustomEditableListBox, CustomGrid
 
 import re
 
@@ -187,6 +188,9 @@
     def AppendRow(self, row_content):
         self.data.append(row_content)
 
+    def InsertRow(self, row_index, row_content):
+        self.data.insert(row_index, row_content)
+
     def RemoveRow(self, row_index):
         self.data.pop(row_index)
 
@@ -194,9 +198,8 @@
         new_idx = max(0, min(idx + move, len(self.data) - 1))
         if new_idx != idx:
             self.data.insert(new_idx, self.data.pop(idx))
-            return new_idx
-        return None
-    
+        return new_idx
+        
     def GetRow(self, row_index):
         return self.data[row_index]
 
@@ -460,23 +463,11 @@
               name='EnumeratedPanel', parent=self, pos=wx.Point(0, 0),
               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
 
-        self.EnumeratedValues = wx.gizmos.EditableListBox(id=ID_DATATYPEEDITORENUMERATEDVALUES, 
+        self.EnumeratedValues = CustomEditableListBox(id=ID_DATATYPEEDITORENUMERATEDVALUES, 
               name='EnumeratedValues', parent=self.EnumeratedPanel, label=_("Values:"), pos=wx.Point(0, 0),
               size=wx.Size(0, 0), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
-        self.EnumeratedValues.GetListCtrl().Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEnumeratedValueEndEdit)
-        self.EnumeratedValues.GetEditButton().SetToolTipString(_("Edit item"))
-        new_button = self.EnumeratedValues.GetNewButton()
-        new_button.SetToolTipString(_("New item"))
-        new_button.Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
-        del_button = self.EnumeratedValues.GetDelButton()
-        del_button.SetToolTipString(_("Delete item"))
-        del_button.Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
-        up_button = self.EnumeratedValues.GetUpButton()
-        up_button.SetToolTipString(_("Move up"))
-        up_button.Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
-        down_button = self.EnumeratedValues.GetDownButton()
-        down_button.SetToolTipString(_("Move down"))
-        down_button.Bind(wx.EVT_BUTTON, self.OnEnumeratedValuesChanged)
+        for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
+            setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
         
         self.staticText8 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT8,
               label=_('Initial Value:'), name='staticText8', parent=self.EnumeratedPanel,
@@ -502,24 +493,13 @@
               size=wx.Size(0, 28), style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORARRAYBASETYPE)
 
-        self.ArrayDimensions = wx.gizmos.EditableListBox(id=ID_DATATYPEEDITORARRAYDIMENSIONS, 
+        self.ArrayDimensions = CustomEditableListBox(id=ID_DATATYPEEDITORARRAYDIMENSIONS, 
               name='ArrayDimensions', parent=self.ArrayPanel, label=_("Dimensions:"), pos=wx.Point(0, 0),
               size=wx.Size(0, 24), style=wx.gizmos.EL_ALLOW_NEW | wx.gizmos.EL_ALLOW_EDIT | wx.gizmos.EL_ALLOW_DELETE)
         self.ArrayDimensions.GetListCtrl().Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnDimensionsChanged)
-        self.ArrayDimensions.GetEditButton().SetToolTipString(_("Edit item"))
-        new_button = self.ArrayDimensions.GetNewButton()
-        new_button.SetToolTipString(_("New item"))
-        new_button.Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
-        del_button = self.ArrayDimensions.GetDelButton()
-        del_button.SetToolTipString(_("Delete item"))
-        del_button.Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
-        up_button = self.ArrayDimensions.GetUpButton()
-        up_button.SetToolTipString(_("Move up"))
-        up_button.Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
-        down_button = self.ArrayDimensions.GetDownButton()
-        down_button.SetToolTipString(_("Move down"))
-        down_button.Bind(wx.EVT_BUTTON, self.OnDimensionsChanged)
-
+        for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
+            setattr(self.EnumeratedValues, func, self.OnDimensionsChanged)
+        
         self.staticText10 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT10,
               label=_('Initial Value:'), name='staticText10', parent=self.ArrayPanel,
               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
@@ -539,7 +519,7 @@
               label=_('Elements :'), name='staticText11', parent=self.StructurePanel,
               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
 
-        self.StructureElementsGrid = wx.grid.Grid(id=ID_DATATYPEEDITORSTRUCTUREELEMENTSGRID,
+        self.StructureElementsGrid = CustomGrid(id=ID_DATATYPEEDITORSTRUCTUREELEMENTSGRID,
               name='StructureElementsGrid', parent=self.StructurePanel, pos=wx.Point(0, 0), 
               size=wx.Size(0, 150), style=wx.VSCROLL)
         self.StructureElementsGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
@@ -554,27 +534,23 @@
         else:
             wx.grid.EVT_GRID_CELL_CHANGE(self.StructureElementsGrid, self.OnStructureElementsGridCellChange)
             wx.grid.EVT_GRID_EDITOR_SHOWN(self.StructureElementsGrid, self.OnStructureElementsGridEditorShown)
-
+        
         self.StructureAddButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREADDBUTTON, label=_('Add'),
               name='StructureAddButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnStructureAddButton, id=ID_DATATYPEEDITORSTRUCTUREADDBUTTON)
-
+        
         self.StructureDeleteButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON, label=_('Delete'),
               name='StructureDeleteButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnStructureDeleteButton, id=ID_DATATYPEEDITORSTRUCTUREDELETEBUTTON)
-
+        
         self.StructureUpButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREUPBUTTON, label='^',
               name='StructureUpButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnStructureUpButton, id=ID_DATATYPEEDITORSTRUCTUREUPBUTTON)
-
+        
         self.StructureDownButton = wx.Button(id=ID_DATATYPEEDITORSTRUCTUREDOWNBUTTON, label='v',
               name='StructureDownButton', parent=self.StructurePanel, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnStructureDownButton, id=ID_DATATYPEEDITORSTRUCTUREDOWNBUTTON)
-
+        
         self._init_sizers()
 
     def __init__(self, parent, tagname, window, controler):
@@ -586,6 +562,32 @@
         self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
         
         self.StructureElementsGrid.SetTable(self.StructureElementsTable)
+        self.StructureElementsGrid.SetButtons({"Add": self.StructureAddButton,
+                                               "Delete": self.StructureDeleteButton,
+                                               "Up": self.StructureUpButton,
+                                               "Down": self.StructureDownButton})
+        
+        def _AddStructureElement(new_row):
+            self.StructureElementsTable.InsertRow(new_row, self.StructureElementDefaultValue.copy())
+            self.RefreshTypeInfos()
+            self.StructureElementsTable.ResetView(self.StructureElementsGrid)
+            return new_row
+        setattr(self.StructureElementsGrid, "_AddRow", _AddStructureElement)
+        
+        def _DeleteStructureElement(row):
+            self.StructureElementsTable.RemoveRow(row)
+            self.RefreshTypeInfos()
+            self.StructureElementsTable.ResetView(self.StructureElementsGrid)
+        setattr(self.StructureElementsGrid, "_DeleteRow", _DeleteStructureElement)
+            
+        def _MoveStructureElement(row, move):
+            new_row = self.StructureElementsTable.MoveRow(row, move)
+            if new_row != row:
+                self.RefreshTypeInfos()
+                self.StructureElementsTable.ResetView(self.StructureElementsGrid)
+            return new_row
+        setattr(self.StructureElementsGrid, "_MoveRow", _MoveStructureElement)
+        
         self.StructureElementsGrid.SetRowLabelSize(0)
         for col in range(self.StructureElementsTable.GetNumberCols()):
             attr = wx.grid.GridCellAttr()
@@ -593,6 +595,7 @@
             self.StructureElementsGrid.SetColAttr(col, attr)
             self.StructureElementsGrid.SetColMinimalWidth(col, self.StructureColSizes[col])
             self.StructureElementsGrid.AutoSizeColumn(col, False)
+        self.StructureElementsGrid.RefreshButtons()
         
         for datatype in GetDatatypeTypes():
             self.DerivationType.Append(_(datatype))
@@ -690,6 +693,7 @@
             self.RefreshDisplayedInfos()
         self.ShowHighlights()
         self.StructureElementsTable.ResetView(self.StructureElementsGrid)
+        self.StructureElementsGrid.RefreshButtons()
         self.Initializing = False
 
     def RefreshScaling(self, refresh=True):
@@ -758,38 +762,6 @@
         wx.CallAfter(self.RefreshTypeInfos)
         event.Skip()
     
-    def OnStructureAddButton(self, event):
-        new_row = self.StructureElementDefaultValue.copy()
-        self.StructureElementsTable.AppendRow(new_row)
-        self.RefreshTypeInfos()
-        self.StructureElementsTable.ResetView(self.StructureElementsGrid)
-        event.Skip()
-    
-    def OnStructureDeleteButton(self, event):
-        row = self.StructureElementsGrid.GetGridCursorRow()
-        self.StructureElementsTable.RemoveRow(row)
-        self.RefreshTypeInfos()
-        self.StructureElementsTable.ResetView(self.StructureElementsGrid)
-        event.Skip()
-    
-    def OnStructureUpButton(self, event):
-        row = self.StructureElementsGrid.GetGridCursorRow()
-        new_index = self.StructureElementsTable.MoveRow(row, -1)
-        if new_index is not None:
-            self.RefreshTypeInfos()
-            self.StructureElementsTable.ResetView(self.StructureElementsGrid)
-            self.StructureElementsGrid.SetGridCursor(new_index, self.StructureElementsGrid.GetGridCursorCol())
-        event.Skip()
-    
-    def OnStructureDownButton(self, event):
-        row = self.StructureElementsGrid.GetGridCursorRow()
-        new_index = self.StructureElementsTable.MoveRow(row, 1)
-        if new_index is not None:
-            self.RefreshTypeInfos()
-            self.StructureElementsTable.ResetView(self.StructureElementsGrid)
-            self.StructureElementsGrid.SetGridCursor(new_index, self.StructureElementsGrid.GetGridCursorCol())
-        event.Skip()
-
     def OnStructureElementsGridCellChange(self, event):
         row, col = event.GetRow(), event.GetCol()
         colname = self.StructureElementsTable.GetColLabelValue(col)
@@ -817,7 +789,7 @@
                 event.Veto()
             else:
                 self.RefreshTypeInfos()
-                self.StructureElementsTable.ResetView(self.StructureElementsGrid)
+                wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid)
 ##                old_value = self.Table.GetOldValue()
 ##                if old_value != "":
 ##                    self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
@@ -825,9 +797,13 @@
                 event.Skip()
         else:
             self.RefreshTypeInfos()
-            self.StructureElementsTable.ResetView(self.StructureElementsGrid)
+            wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid)
             event.Skip()
     
+    def OnStructureElementsGridSelectCell(self, event):
+        wx.CallAfter(self.RefreshStructureButtons)
+        event.Skip()
+    
     def OnStructureElementsGridEditorShown(self, event):
         row, col = event.GetRow(), event.GetCol() 
         if self.StructureElementsTable.GetColLabelValue(col) == "Type":