editors/ResourceEditor.py
changeset 1420 71b1545d746f
parent 1275 8d4de18c9f29
child 1423 4e33f644f7cf
--- a/editors/ResourceEditor.py	Thu Jun 12 18:15:04 2014 +0200
+++ b/editors/ResourceEditor.py	Fri Jun 20 21:36:23 2014 +0200
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
-#based on the plcopen standard. 
+#based on the plcopen standard.
 #
 #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
@@ -36,25 +36,25 @@
 #                          Configuration Editor class
 #-------------------------------------------------------------------------------
 
-[ID_CONFIGURATIONEDITOR, 
+[ID_CONFIGURATIONEDITOR,
 ] = [wx.NewId() for _init_ctrls in range(1)]
 
 class ConfigurationEditor(EditorPanel):
-    
+
     ID = ID_CONFIGURATIONEDITOR
     VARIABLE_PANEL_TYPE = "config"
-    
+
     def GetBufferState(self):
         return self.Controler.GetBufferState()
-        
+
     def Undo(self):
         self.Controler.LoadPrevious()
         self.ParentWindow.CloseTabsWithoutModel()
-            
+
     def Redo(self):
         self.Controler.LoadNext()
         self.ParentWindow.CloseTabsWithoutModel()
-    
+
     def HasNoModel(self):
         return self.Controler.GetEditedElement(self.TagName) is None
 
@@ -77,7 +77,7 @@
     return [_("Name"), _("Type"), _("Task")]
 
 class ResourceTable(CustomTable):
-    
+
     """
     A custom wx.grid.Grid Table using user supplied data
     """
@@ -86,16 +86,16 @@
         CustomTable.__init__(self, parent, data, colnames)
         self.ColAlignements = []
         self.ColSizes = []
-        
+
     def GetColAlignements(self):
         return self.ColAlignements
-    
+
     def SetColAlignements(self, list):
         self.ColAlignements = list
 
     def GetColSizes(self):
         return self.ColSizes
-    
+
     def SetColSizes(self, list):
         self.ColSizes = list
 
@@ -106,14 +106,16 @@
             if colname == "Triggering":
                 return _(value)
             return value
-        
+
     def SetValue(self, row, col, value):
         if col < len(self.colnames):
             colname = self.GetColLabelValue(col, False)
             if colname == "Triggering":
                 value = TASKTRIGGERINGOPTIONS_DICT[value]
             self.data[row][colname] = value
-    
+
+    SingleCellEditor = lambda x,c : wx.grid.GridCellChoiceEditor(x)
+
     def _updateColAttrs(self, grid):
         """
         wx.grid.Grid -> update the column attributes to add the
@@ -121,13 +123,13 @@
 
         Otherwise default to the default renderer.
         """
-        
+
         for col in range(self.GetNumberCols()):
             attr = wx.grid.GridCellAttr()
             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
             grid.SetColAttr(col, attr)
             grid.SetColSize(col, self.ColSizes[col])
-        
+
         for row in range(self.GetNumberRows()):
             row_highlights = self.Highlights.get(row, {})
             for col in range(self.GetNumberCols()):
@@ -148,7 +150,7 @@
                     if interval != "" and IEC_TIME_MODEL.match(interval.upper()) is None:
                         error = True
                 elif colname == "Single":
-                    editor = wx.grid.GridCellChoiceEditor()
+                    editor = self.SingleCellEditor(self,colname)
                     editor.SetParameters(self.Parent.VariableList)
                     if self.GetValueByName(row, "Triggering") != "Interrupt":
                         grid.SetReadOnly(row, col, True)
@@ -164,10 +166,10 @@
                 elif colname == "Task":
                     editor = wx.grid.GridCellChoiceEditor()
                     editor.SetParameters(self.Parent.TaskList)
-                    
+
                 grid.SetCellEditor(row, col, editor)
                 grid.SetCellRenderer(row, col, renderer)
-                
+
                 if error:
                     highlight_colours = ERROR_HIGHLIGHT
                 else:
@@ -176,7 +178,7 @@
                 grid.SetCellTextColour(row, col, highlight_colours[1])
             self.ResizeRow(grid, row)
 
-    
+
 #-------------------------------------------------------------------------------
 #                        Highlights showing functions
 #-------------------------------------------------------------------------------
@@ -185,7 +187,7 @@
         row_highlights = self.Highlights.setdefault(infos[0], {})
         col_highlights = row_highlights.setdefault(infos[1], [])
         col_highlights.append(highlight_type)
-    
+
     def ClearHighlights(self, highlight_type=None):
         if highlight_type is None:
             self.Highlights = {}
@@ -201,84 +203,84 @@
 
 
 class ResourceEditor(EditorPanel):
-    
+
     VARIABLE_PANEL_TYPE = "resource"
 
     def _init_Editor(self, parent):
         self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER|wx.TAB_TRAVERSAL)
-        
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
         main_sizer.AddGrowableRow(1)
-        
+
         tasks_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
         tasks_sizer.AddGrowableCol(0)
         tasks_sizer.AddGrowableRow(1)
-        main_sizer.AddSizer(tasks_sizer, border=5, 
+        main_sizer.AddSizer(tasks_sizer, border=5,
               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+
         tasks_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         tasks_buttons_sizer.AddGrowableCol(0)
         tasks_buttons_sizer.AddGrowableRow(0)
         tasks_sizer.AddSizer(tasks_buttons_sizer, flag=wx.GROW)
-        
+
         tasks_label = wx.StaticText(self.Editor, label=_(u'Tasks:'))
         tasks_buttons_sizer.AddWindow(tasks_label, flag=wx.ALIGN_BOTTOM)
-        
+
         for name, bitmap, help in [
                 ("AddTaskButton", "add_element", _("Add task")),
                 ("DeleteTaskButton", "remove_element", _("Remove task")),
                 ("UpTaskButton", "up", _("Move task up")),
                 ("DownTaskButton", "down", _("Move task down"))]:
-            button = wx.lib.buttons.GenBitmapButton(self.Editor, 
+            button = wx.lib.buttons.GenBitmapButton(self.Editor,
                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             tasks_buttons_sizer.AddWindow(button)
-        
+
         self.TasksGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
         self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange)
         tasks_sizer.AddWindow(self.TasksGrid, flag=wx.GROW)
-        
+
         instances_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
         instances_sizer.AddGrowableCol(0)
         instances_sizer.AddGrowableRow(1)
-        main_sizer.AddSizer(instances_sizer, border=5, 
+        main_sizer.AddSizer(instances_sizer, border=5,
               flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+
         instances_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         instances_buttons_sizer.AddGrowableCol(0)
         instances_buttons_sizer.AddGrowableRow(0)
         instances_sizer.AddSizer(instances_buttons_sizer, flag=wx.GROW)
-        
+
         instances_label = wx.StaticText(self.Editor, label=_(u'Instances:'))
         instances_buttons_sizer.AddWindow(instances_label, flag=wx.ALIGN_BOTTOM)
-        
+
         for name, bitmap, help in [
                 ("AddInstanceButton", "add_element", _("Add instance")),
                 ("DeleteInstanceButton", "remove_element", _("Remove instance")),
                 ("UpInstanceButton", "up", _("Move instance up")),
                 ("DownInstanceButton", "down", _("Move instance down"))]:
-            button = wx.lib.buttons.GenBitmapButton(self.Editor, 
+            button = wx.lib.buttons.GenBitmapButton(self.Editor,
                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             instances_buttons_sizer.AddWindow(button)
-        
+
         self.InstancesGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
-        self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, 
+        self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
               self.OnInstancesGridCellChange)
         instances_sizer.AddWindow(self.InstancesGrid, flag=wx.GROW)
-        
+
         self.Editor.SetSizer(main_sizer)
-        
+
     def __init__(self, parent, tagname, window, controler):
         EditorPanel.__init__(self, parent, tagname, window, controler)
-        
+
         self.RefreshHighlightsTimer = wx.Timer(self, -1)
         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
-        
+
         self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0}
         self.TasksTable = ResourceTable(self, [], GetTasksTableColnames())
         self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT])
@@ -288,20 +290,20 @@
                                    "Delete": self.DeleteTaskButton,
                                    "Up": self.UpTaskButton,
                                    "Down": self.DownTaskButton})
-        
+
         def _AddTask(new_row):
             self.TasksTable.InsertRow(new_row, self.TasksDefaultValue.copy())
             self.RefreshModel()
             self.RefreshView()
             return new_row
         setattr(self.TasksGrid, "_AddRow", _AddTask)
-        
+
         def _DeleteTask(row):
             self.TasksTable.RemoveRow(row)
             self.RefreshModel()
             self.RefreshView()
         setattr(self.TasksGrid, "_DeleteRow", _DeleteTask)
-        
+
         def _MoveTask(row, move):
             new_row = self.TasksTable.MoveRow(row, move)
             if new_row != row:
@@ -309,11 +311,11 @@
                 self.RefreshView()
             return new_row
         setattr(self.TasksGrid, "_MoveRow", _MoveTask)
-        
+
         self.TasksGrid.SetRowLabelSize(0)
         self.TasksTable.ResetView(self.TasksGrid)
         self.TasksGrid.RefreshButtons()
-        
+
         self.InstancesDefaultValue = {"Name" : "", "Type" : "", "Task" : ""}
         self.InstancesTable = ResourceTable(self, [], GetInstancesTableColnames())
         self.InstancesTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT])
@@ -323,48 +325,48 @@
                                        "Delete": self.DeleteInstanceButton,
                                        "Up": self.UpInstanceButton,
                                        "Down": self.DownInstanceButton})
-        
+
         def _AddInstance(new_row):
             self.InstancesTable.InsertRow(new_row, self.InstancesDefaultValue.copy())
             self.RefreshModel()
             self.RefreshView()
             return new_row
         setattr(self.InstancesGrid, "_AddRow", _AddInstance)
-        
+
         def _DeleteInstance(row):
             self.InstancesTable.RemoveRow(row)
             self.RefreshModel()
             self.RefreshView()
         setattr(self.InstancesGrid, "_DeleteRow", _DeleteInstance)
-        
+
         def _MoveInstance(row, move):
             new_row = max(0, min(row + move, self.InstancesTable.GetNumberRows() - 1))
             if new_row != row:
                 if self.InstancesTable.GetValueByName(row, "Task") != self.InstancesTable.GetValueByName(new_row, "Task"):
-                    return row 
+                    return row
                 self.InstancesTable.MoveRow(row, move)
                 self.RefreshModel()
                 self.RefreshView()
             return new_row
         setattr(self.InstancesGrid, "_MoveRow", _MoveInstance)
-        
+
         def _RefreshInstanceButtons():
             if self:
                 rows = self.InstancesTable.GetNumberRows()
                 row = self.InstancesGrid.GetGridCursorRow()
                 self.DeleteInstanceButton.Enable(rows > 0)
-                self.UpInstanceButton.Enable(row > 0 and 
+                self.UpInstanceButton.Enable(row > 0 and
                     self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row - 1, "Task"))
-                self.DownInstanceButton.Enable(0 <= row < rows - 1 and 
+                self.DownInstanceButton.Enable(0 <= row < rows - 1 and
                     self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row + 1, "Task"))
         setattr(self.InstancesGrid, "RefreshButtons", _RefreshInstanceButtons)
-        
+
         self.InstancesGrid.SetRowLabelSize(0)
         self.InstancesTable.ResetView(self.InstancesGrid)
         self.InstancesGrid.RefreshButtons()
-        
+
         self.TasksGrid.SetFocus()
-        
+
     def __del__(self):
         self.RefreshHighlightsTimer.Stop()
 
@@ -383,11 +385,11 @@
         self.VariableList = ""
         for variable in self.Controler.GetEditedResourceVariables(self.TagName):
             self.VariableList += ",%s"%variable
-        
+
     def RefreshModel(self):
         self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData())
         self.RefreshBuffer()
-        
+
     # Buffer the last model state
     def RefreshBuffer(self):
         self.Controler.BufferProject()
@@ -397,21 +399,21 @@
 
     def GetBufferState(self):
         return self.Controler.GetBufferState()
-        
+
     def Undo(self):
         self.Controler.LoadPrevious()
         self.ParentWindow.CloseTabsWithoutModel()
-            
+
     def Redo(self):
         self.Controler.LoadNext()
         self.ParentWindow.CloseTabsWithoutModel()
-    
+
     def HasNoModel(self):
         return self.Controler.GetEditedElement(self.TagName) is None
 
     def RefreshView(self, variablepanel=True):
         EditorPanel.RefreshView(self, variablepanel)
-        
+
         tasks, instances = self.Controler.GetEditedResourceInfos(self.TagName)
         self.TasksTable.SetData(tasks)
         self.InstancesTable.SetData(instances)
@@ -422,7 +424,7 @@
         self.InstancesTable.ResetView(self.InstancesGrid)
         self.TasksGrid.RefreshButtons()
         self.InstancesGrid.RefreshButtons()
-        
+
     def OnTasksGridCellChange(self, event):
         row, col = event.GetRow(), event.GetCol()
         if self.TasksTable.GetColLabelValue(col) == "Name":
@@ -452,14 +454,14 @@
 #-------------------------------------------------------------------------------
 #                        Highlights showing functions
 #-------------------------------------------------------------------------------
-    
+
     def OnRefreshHighlightsTimer(self, event):
         self.RefreshView()
         event.Skip()
-    
+
     def AddHighlight(self, infos, start, end, highlight_type):
         EditorPanel.AddHighlight(self, infos, start, end, highlight_type)
-        
+
         if infos[0] == "task":
             self.TasksTable.AddHighlight(infos[1:], highlight_type)
         elif infos[0] == "instance":
@@ -468,7 +470,7 @@
 
     def ClearHighlights(self, highlight_type=None):
         EditorPanel.ClearHighlights(self, highlight_type)
-        
+
         self.TasksTable.ClearHighlights(highlight_type)
         self.InstancesTable.ClearHighlights(highlight_type)
         self.TasksTable.ResetView(self.TasksGrid)