VariablePanel.py
changeset 577 9dbb79722fbc
parent 566 6014ef82a98a
child 580 ad996deb920e
--- a/VariablePanel.py	Wed Oct 12 23:47:48 2011 +0200
+++ b/VariablePanel.py	Fri Oct 14 19:26:29 2011 +0200
@@ -31,6 +31,7 @@
 from PLCControler import LOCATION_PLUGIN, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
 from dialogs import ArrayTypeDialog
+from controls import CustomGrid
 
 CWD = os.path.split(os.path.realpath(__file__))[0]
 
@@ -461,7 +462,7 @@
               name='VariableEditorPanel', parent=prnt, pos=wx.Point(0, 0),
               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
 
-        self.VariablesGrid = wx.grid.Grid(id=ID_VARIABLEEDITORPANELVARIABLESGRID,
+        self.VariablesGrid = CustomGrid(id=ID_VARIABLEEDITORPANELVARIABLESGRID,
               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
               size=wx.Size(0, 0), style=wx.VSCROLL)
         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
@@ -472,17 +473,12 @@
         self.VariablesGrid.SetSelectionForeground(wx.BLACK)
         if wx.VERSION >= (2, 6, 0):
             self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
-            self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell)
             self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
             self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown)
-            #self.VariablesGrid.Bind(wx.EVT_KEY_DOWN, self.OnChar)
         else:
             wx.grid.EVT_GRID_CELL_CHANGE(self.VariablesGrid, self.OnVariablesGridCellChange)
-            wx.grid.EVT_GRID_SELECT_CELL(self.VariablesGrid, self.OnVariablesGridSelectCell)
             wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick)
             wx.grid.EVT_GRID_EDITOR_SHOWN(self.VariablesGrid, self.OnVariablesGridEditorShown)
-            #wx.EVT_KEY_DOWN(self.VariablesGrid, self.OnChar)
-        self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
         
         self.ControlPanel = wx.ScrolledWindow(id=ID_VARIABLEEDITORCONTROLPANEL,
               name='ControlPanel', parent=self, pos=wx.Point(0, 0),
@@ -510,23 +506,19 @@
         self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label=_('Add'),
               name='AddButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON)
-
+        
         self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label=_('Delete'),
               name='DeleteButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON)
-
+        
         self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
               name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_VARIABLEEDITORPANELUPBUTTON)
-
+        
         self.DownButton = wx.Button(id=ID_VARIABLEEDITORPANELDOWNBUTTON, label='v',
               name='DownButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_VARIABLEEDITORPANELDOWNBUTTON)
-
+        
         self._init_sizers()
 
     def __init__(self, parent, window, controler, element_type):
@@ -603,91 +595,50 @@
         self.RefreshTypeList()
 
         self.VariablesGrid.SetTable(self.Table)
-        self.VariablesGrid.SetRowLabelSize(0)
-        for col in range(self.Table.GetNumberCols()):
-            attr = wx.grid.GridCellAttr()
-            attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
-            self.VariablesGrid.SetColAttr(col, attr)
-            self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col])
-            self.VariablesGrid.AutoSizeColumn(col, False)
-    
-    def __del__(self):
-        self.RefreshHighlightsTimer.Stop()
-    
-    def SetTagName(self, tagname):
-        self.TagName = tagname
-    
-    def IsFunctionBlockType(self, name):
-        bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
-        pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
-        if poutype != "function" and bodytype in ["ST", "IL"]:
-            return False
-        else:
-            return name in self.Controler.GetFunctionBlockTypes(self.TagName)
-    
-    def RefreshView(self):
-        self.PouNames = self.Controler.GetProjectPouNames()
-        
-        words = self.TagName.split("::")
-        if self.ElementType == "config":
-            self.PouIsUsed = False
-            returnType = None
-            self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
-        elif self.ElementType == "resource":
-            self.PouIsUsed = False
-            returnType = None
-            self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
-        else:
-            if self.ElementType == "function":
-                self.ReturnType.Clear()
-                for base_type in self.Controler.GetDataTypes(self.TagName, True):
-                    self.ReturnType.Append(base_type)
-                returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
-            else:
-                returnType = None
-            self.PouIsUsed = self.Controler.PouIsUsed(words[1])
-            self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
-        
-        if returnType is not None:
-            self.ReturnType.SetStringSelection(returnType)
-            self.ReturnType.Enable(True)
-            self.staticText1.Show()
-            self.ReturnType.Show()
-        else:
-            self.ReturnType.Enable(False)
-            self.staticText1.Hide()
-            self.ReturnType.Hide()
-        
-        self.RefreshValues()
-        self.RefreshButtons()
-    
-    def OnReturnTypeChanged(self, event):
-        words = self.TagName.split("::")
-        self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
-        self.Controler.BufferProject()
-        self.ParentWindow.RefreshEditor(variablepanel = False)
-        self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
-        event.Skip()
-    
-    def OnClassFilter(self, event):
-        self.Filter = self.FilterChoiceTransfer[VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
-        self.RefreshTypeList()
-        self.RefreshValues()
-        self.RefreshButtons()
-        event.Skip()
-
-    def RefreshTypeList(self):
-        if self.Filter == "All":
-            self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
-        elif self.Filter == "Interface":
-            self.ClassList = ["Input","Output","InOut","External"]
-        elif self.Filter == "Variables":
-            self.ClassList = ["Local","Temp"]
-        else:
-            self.ClassList = [self.Filter]
-
-    def RefreshButtons(self):
-        if getattr(self, "Table", None):
+        self.VariablesGrid.SetButtons({"Add": self.AddButton,
+                                       "Delete": self.DeleteButton,
+                                       "Up": self.UpButton,
+                                       "Down": self.DownButton})
+        
+        def _AddVariable(new_row):
+            if not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"]:
+                row_content = self.DefaultValue.copy()
+                if self.Filter in self.DefaultTypes:
+                    row_content["Class"] = self.DefaultTypes[self.Filter]
+                else:
+                    row_content["Class"] = self.Filter
+                if self.Filter == "All" and len(self.Values) > 0:
+                    self.Values.insert(new_row, row_content)
+                else:
+                    self.Values.append(row_content)
+                    new_row = self.Table.GetNumberRows()
+                self.SaveValues()
+                self.RefreshValues()
+                return new_row
+            return self.VariablesGrid.GetGridCursorRow()
+        setattr(self.VariablesGrid, "_AddRow", _AddVariable)
+        
+        def _DeleteVariable(row):
+            if (self.Table.GetValueByName(row, "Edit") and 
+                (not self.PouIsUsed or self.Table.GetValueByName(row, "Class") not in ["Input", "Output", "InOut"])):
+                self.Values.remove(self.Table.GetRow(row))
+                self.SaveValues()
+                self.RefreshValues()
+        setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable)
+            
+        def _MoveVariable(row, move):
+            if (self.Filter == "All" and 
+                (not self.PouIsUsed or self.Table.GetValueByName(row, "Class") not in ["Input", "Output", "InOut"])):
+                new_row = max(0, min(row + move, len(self.Values) - 1))
+                if new_row != row:
+                    self.Values.insert(new_row, self.Values.pop(row))
+                    self.SaveValues()
+                    self.RefreshValues()
+                return new_row
+            return row
+        setattr(self.VariablesGrid, "_MoveRow", _MoveVariable)
+        
+        def _RefreshButtons():
             table_length = len(self.Table.data)
             row_class = None
             row_edit = True
@@ -701,50 +652,90 @@
             self.DeleteButton.Enable(table_length > 0 and row_edit and row_class not in ["Input", "Output", "InOut"])
             self.UpButton.Enable(table_length > 0 and row > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
             self.DownButton.Enable(table_length > 0 and row < table_length - 1 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
-
-    def CloseVariablesGridEditControl(self):
-        row = self.VariablesGrid.GetGridCursorRow()
-        col = self.VariablesGrid.GetGridCursorCol()
-        self.VariablesGrid.SetGridCursor(row, col)
-
-    def OnAddButton(self, event):
-        self.CloseVariablesGridEditControl()
-        new_row = self.DefaultValue.copy()
-        if self.Filter in self.DefaultTypes:
-            new_row["Class"] = self.DefaultTypes[self.Filter]
-        else:
-            new_row["Class"] = self.Filter
-        if self.Filter == "All" and len(self.Values) > 0:
-            row_index = self.VariablesGrid.GetGridCursorRow() + 1
-            self.Values.insert(row_index, new_row)
-        else:
-            row_index = -1
-            self.Values.append(new_row)
-        self.SaveValues()
-        self.RefreshValues(row_index)
-        self.RefreshButtons()
+        setattr(self.VariablesGrid, "RefreshButtons", _RefreshButtons)
+        
+        self.VariablesGrid.SetRowLabelSize(0)
+        for col in range(self.Table.GetNumberCols()):
+            attr = wx.grid.GridCellAttr()
+            attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
+            self.VariablesGrid.SetColAttr(col, attr)
+            self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col])
+            self.VariablesGrid.AutoSizeColumn(col, False)
+    
+    def __del__(self):
+        self.RefreshHighlightsTimer.Stop()
+    
+    def SetTagName(self, tagname):
+        self.TagName = tagname
+    
+    def IsFunctionBlockType(self, name):
+        bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
+        pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
+        if poutype != "function" and bodytype in ["ST", "IL"]:
+            return False
+        else:
+            return name in self.Controler.GetFunctionBlockTypes(self.TagName)
+    
+    def RefreshView(self):
+        self.PouNames = self.Controler.GetProjectPouNames()
+        
+        words = self.TagName.split("::")
+        if self.ElementType == "config":
+            self.PouIsUsed = False
+            returnType = None
+            self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
+        elif self.ElementType == "resource":
+            self.PouIsUsed = False
+            returnType = None
+            self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
+        else:
+            if self.ElementType == "function":
+                self.ReturnType.Clear()
+                for base_type in self.Controler.GetDataTypes(self.TagName, True):
+                    self.ReturnType.Append(base_type)
+                returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
+            else:
+                returnType = None
+            self.PouIsUsed = self.Controler.PouIsUsed(words[1])
+            self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
+        
+        if returnType is not None:
+            self.ReturnType.SetStringSelection(returnType)
+            self.ReturnType.Enable(True)
+            self.staticText1.Show()
+            self.ReturnType.Show()
+        else:
+            self.ReturnType.Enable(False)
+            self.staticText1.Hide()
+            self.ReturnType.Hide()
+        
+        self.RefreshValues()
+        self.VariablesGrid.RefreshButtons()
+    
+    def OnReturnTypeChanged(self, event):
+        words = self.TagName.split("::")
+        self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
+        self.Controler.BufferProject()
+        self.ParentWindow.RefreshEditor(variablepanel = False)
+        self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
         event.Skip()
-
-    def OnDeleteButton(self, event):
-        self.CloseVariablesGridEditControl()
-        row_index = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
-        self.Values.remove(row_index)
-        self.SaveValues()
-        self.RefreshValues(row_index)
-        self.RefreshButtons()
+    
+    def OnClassFilter(self, event):
+        self.Filter = self.FilterChoiceTransfer[VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
+        self.RefreshTypeList()
+        self.RefreshValues()
+        self.VariablesGrid.RefreshButtons()
         event.Skip()
 
-    def OnUpButton(self, event):
-        self.CloseVariablesGridEditControl()
-        self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1)
-        self.RefreshButtons()
-        event.Skip()
-
-    def OnDownButton(self, event):
-        self.CloseVariablesGridEditControl()
-        self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1)
-        self.RefreshButtons()
-        event.Skip()
+    def RefreshTypeList(self):
+        if self.Filter == "All":
+            self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
+        elif self.Filter == "Interface":
+            self.ClassList = ["Input","Output","InOut","External"]
+        elif self.Filter == "Variables":
+            self.ClassList = ["Local","Temp"]
+        else:
+            self.ClassList = [self.Filter]
 
     def OnVariablesGridCellChange(self, event):
         row, col = event.GetRow(), event.GetCol()
@@ -883,29 +874,7 @@
             dragSource.DoDragDrop()
         event.Skip()
     
-    def OnVariablesGridSelectCell(self, event):
-        wx.CallAfter(self.RefreshButtons)
-        event.Skip()
-
-    def OnChar(self, event):
-        keycode = event.GetKeyCode()
-        if keycode == wx.WXK_DELETE:
-            row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
-            self.Values.remove(row)
-            self.SaveValues()
-            self.RefreshValues()
-            self.RefreshButtons()
-        event.Skip()
-
-    def MoveValue(self, value_index, move):
-        new_index = max(0, min(value_index + move, len(self.Values) - 1))
-        if new_index != value_index:
-            self.Values.insert(new_index, self.Values.pop(value_index))
-            self.SaveValues()
-            self.RefreshValues()
-            self.VariablesGrid.SetGridCursor(new_index, self.VariablesGrid.GetGridCursorCol())
-        
-    def RefreshValues(self, select=0):
+    def RefreshValues(self):
         data = []
         for num, variable in enumerate(self.Values):
             if variable["Class"] in self.ClassList:
@@ -913,16 +882,7 @@
                 data.append(variable)
         self.Table.SetData(data)
         self.Table.ResetView(self.VariablesGrid)
-        if len(self.Table.data) > 0:
-            if select == -1:
-                select = len(self.Table.data) - 1
-            else:
-                select = min(select, len(self.Table.data) - 1)
-            col = max(1, self.VariablesGrid.GetGridCursorCol())
-            self.VariablesGrid.SetGridCursor(select, col)
-            self.VariablesGrid.MakeCellVisible(select, col)
-            self.VariablesGrid.SetFocus()
-        
+            
     def SaveValues(self, buffer = True):
         words = self.TagName.split("::")
         if self.ElementType == "config":