RessourceEditor.py
changeset 560 3757f0de0d07
parent 494 c91644c2bfa7
child 564 5024d42e1050
--- a/RessourceEditor.py	Thu Sep 15 22:29:32 2011 +0200
+++ b/RessourceEditor.py	Tue Sep 20 23:58:31 2011 +0200
@@ -79,7 +79,12 @@
 
 def GetTasksTableColnames():
     _ = lambda x : x
-    return [_("Name"), _("Single"), _("Interval"), _("Priority")]
+    return [_("Name"), _("Triggering"), _("Single"), _("Interval"), _("Priority")]
+
+def GetTaskTriggeringOptions():
+    _ = lambda x : x
+    return [_("Interrupt"), _("Cyclic")]
+TASKTRIGGERINGOPTIONS_DICT = dict([(_(option), option) for option in GetTaskTriggeringOptions()])
 
 def GetInstancesTableColnames():
     _ = lambda x : x
@@ -135,15 +140,21 @@
 
     def GetValue(self, row, col):
         if row < self.GetNumberRows():
-            name = str(self.data[row].get(self.GetColLabelValue(col, False), ""))
-            return name
-    
+            colname = self.GetColLabelValue(col, False)
+            value = str(self.data[row].get(colname, ""))
+            if colname == "Triggering":
+                return _(value)
+            return value
+        
     def GetValueByName(self, row, colname):
         return self.data[row].get(colname)
 
     def SetValue(self, row, col, value):
         if col < len(self.colnames):
-            self.data[row][self.GetColLabelValue(col, False)] = value
+            colname = self.GetColLabelValue(col, False)
+            if colname == "Triggering":
+                value = TASKTRIGGERINGOPTIONS_DICT[value]
+            self.data[row][colname] = value
     
     def SetValueByName(self, row, colname, value):
         if colname in self.colnames:
@@ -203,16 +214,19 @@
                 renderer = None
                 colname = self.GetColLabelValue(col, False)
                 grid.SetReadOnly(row, col, False)
-                if colname in ["Name","Interval"]:
+                if colname in ["Name", "Interval"]:
                     editor = wx.grid.GridCellTextEditor()
                     renderer = wx.grid.GridCellStringRenderer()
-                    if colname == "Interval" and self.GetValueByName(row, "Single") != "":
+                    if colname == "Interval" and self.GetValueByName(row, "Triggering") != "Cyclic":
                         grid.SetReadOnly(row, col, True)
                 elif colname == "Single":
                     editor = wx.grid.GridCellChoiceEditor()
                     editor.SetParameters(self.Parent.VariableList)
-                    if self.GetValueByName(row, "Interval") != "":
+                    if self.GetValueByName(row, "Triggering") != "Interrupt":
                         grid.SetReadOnly(row, col, True)
+                elif colname == "Triggering":
+                    editor = wx.grid.GridCellChoiceEditor()
+                    editor.SetParameters(",".join([""] + GetTaskTriggeringOptions()))
                 elif colname == "Type":
                     editor = wx.grid.GridCellChoiceEditor()
                     editor.SetParameters(self.Parent.TypeList)
@@ -233,6 +247,11 @@
                 else:
                     grid.SetCellTextColour(row, col, wx.BLACK)
                     grid.SetCellBackgroundColour(row, col, wx.WHITE)
+            if wx.Platform == '__WXMSW__':
+                grid.SetRowMinimalHeight(row, 20)
+            else:
+                grid.SetRowMinimalHeight(row, 28)
+            grid.AutoSizeRow(row, False)
     
     def SetData(self, data):
         self.data = data
@@ -249,14 +268,18 @@
     def AppendRow(self, row_content):
         self.data.append(row_content)
 
+    def InsertRow(self, index, row_content):
+        self.data.insert(index, row_content)
+
     def RemoveRow(self, row_index):
         self.data.pop(row_index)
         
-    def MoveRow(self, row_index, move, grid):
+    def MoveRow(self, row_index, move):
         new_index = max(0, min(row_index + move, len(self.data) - 1))
         if new_index != row_index:
             self.data.insert(new_index, self.data.pop(row_index))
-            grid.SetGridCursor(new_index, grid.GetGridCursorCol())
+            return new_index
+        return None
 
     def Empty(self):
         self.data = []
@@ -438,10 +461,10 @@
         self.Controler = controler
         self.TagName = tagname
         
-        self.TasksDefaultValue = {"Name" : "", "Single" : "", "Interval" : "", "Priority" : 0}
+        self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0}
         self.TasksTable = ResourceTable(self, [], GetTasksTableColnames())
-        self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT])
-        self.TasksTable.SetColSizes([200, 100, 100, 100])
+        self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT])
+        self.TasksTable.SetColSizes([200, 100, 100, 100, 100])
         self.TasksGrid.SetTable(self.TasksTable)
         self.TasksGrid.SetRowLabelSize(0)
         self.TasksTable.ResetView(self.TasksGrid)
@@ -499,74 +522,118 @@
         self.ParentWindow.RefreshFileMenu()
         self.ParentWindow.RefreshEditMenu()
 
-    def RefreshView(self):
+    def RefreshView(self, task_select=None, instance_select=None):
         tasks, instances = self.Controler.GetEditedResourceInfos(self.TagName)
         self.TasksTable.SetData(tasks)
         self.InstancesTable.SetData(instances)
         self.RefreshTypeList()
         self.RefreshTaskList()
         self.RefreshVariableList()
+        self.TasksTable.ResetView(self.TasksGrid)
         self.InstancesTable.ResetView(self.InstancesGrid)
-        self.TasksTable.ResetView(self.TasksGrid)
-
+        if task_select is not None and len(tasks) > 0:
+            if task_select == -1:
+                task_select = len(tasks) - 1
+            else:
+                task_select = min(task_select, len(tasks) - 1)
+            col = self.TasksGrid.GetGridCursorCol()
+            self.TasksGrid.SetGridCursor(task_select, col)
+            self.TasksGrid.MakeCellVisible(instance_select, col)
+            self.TasksGrid.SetFocus()
+        if instance_select is not None and len(instances) > 0:
+            if instance_select == -1:
+                instance_select = len(instances) - 1
+            else:
+                task_select = min(task_select, len(instances) - 1)
+            col = self.InstancesGrid.GetGridCursorCol()
+            self.InstancesGrid.SetGridCursor(instance_select, col)
+            self.InstancesGrid.MakeCellVisible(instance_select, col)
+            self.InstancesGrid.SetFocus()
+        
     def RefreshScaling(self, refresh=True):
         pass
 
+    def CloseTasksGridEditControl(self):
+        row = self.TasksGrid.GetGridCursorRow()
+        col = self.TasksGrid.GetGridCursorCol()
+        self.TasksGrid.SetGridCursor(row, col)
+
     def OnAddTaskButton(self, event):
-        self.TasksTable.AppendRow(self.TasksDefaultValue.copy())
-        self.RefreshModel()
-        self.RefreshView()
+        self.CloseTasksGridEditControl()
+        if len(self.TasksTable.data) > 0:
+            row = self.TasksGrid.GetGridCursorRow() + 1
+        else:
+            row = -1
+        self.TasksTable.InsertRow(row, self.TasksDefaultValue.copy())
+        self.RefreshModel()
+        self.RefreshView(task_select=row)
         event.Skip()
 
     def OnDeleteTaskButton(self, event):
+        self.CloseTasksGridEditControl()
         row = self.TasksGrid.GetGridCursorRow()
         self.TasksTable.RemoveRow(row)
         self.RefreshModel()
-        self.RefreshView()
+        self.RefreshView(task_select=row)
         event.Skip()
 
     def OnUpTaskButton(self, event):
+        self.CloseTasksGridEditControl()
         row = self.TasksGrid.GetGridCursorRow()
-        self.TasksTable.MoveRow(row, -1, self.TasksGrid)
-        self.RefreshModel()
-        self.RefreshView()
+        new_row = self.TasksTable.MoveRow(row, -1)
+        self.RefreshModel()
+        self.RefreshView(task_select=new_row)
         event.Skip()
 
     def OnDownTaskButton(self, event):
+        self.CloseTasksGridEditControl()
         row = self.TasksGrid.GetGridCursorRow()
-        self.TasksTable.MoveRow(row, 1, self.TasksGrid)
-        self.RefreshModel()
-        self.RefreshView()
-        event.Skip()
+        new_row = self.TasksTable.MoveRow(row, 1)
+        self.RefreshModel()
+        self.RefreshView(task_select=new_row)
+        event.Skip()
+
+    def CloseInstancesGridEditControl(self):
+        row = self.InstancesGrid.GetGridCursorRow()
+        col = self.InstancesGrid.GetGridCursorCol()
+        self.InstancesGrid.SetGridCursor(row, col)
 
     def OnAddInstanceButton(self, event):
-        self.InstancesTable.AppendRow(self.InstancesDefaultValue.copy())
-        self.RefreshModel()
-        self.RefreshView()
+        self.CloseInstancesGridEditControl()
+        if len(self.InstancesTable.data) > 0:
+            row = self.InstancesGrid.GetGridCursorRow() + 1
+        else:
+            row = -1
+        self.InstancesTable.InsertRow(row, self.InstancesDefaultValue.copy())
+        self.RefreshModel()
+        self.RefreshView(instance_select=row)
         self.ParentWindow.RefreshInstancesTree()
         event.Skip()
 
     def OnDeleteInstanceButton(self, event):
+        self.CloseInstancesGridEditControl()
         row = self.InstancesGrid.GetGridCursorRow()
         self.InstancesTable.RemoveRow(row)
         self.RefreshModel()
-        self.RefreshView()
+        self.RefreshView(instance_select=row)
         self.ParentWindow.RefreshInstancesTree()
         event.Skip()
 
     def OnUpInstanceButton(self, event):
+        self.CloseInstancesGridEditControl()
         row = self.InstancesGrid.GetGridCursorRow()
-        self.InstancesTable.MoveRow(row, -1, self.InstancesGrid)
-        self.RefreshModel()
-        self.RefreshView()
+        new_row = self.InstancesTable.MoveRow(row, -1)
+        self.RefreshModel()
+        self.RefreshView(instance_select=new_row)
         self.ParentWindow.RefreshInstancesTree()
         event.Skip()
 
     def OnDownInstanceButton(self, event):
+        self.CloseInstancesGridEditControl()
         row = self.InstancesGrid.GetGridCursorRow()
-        self.InstancesTable.MoveRow(row, 1, self.InstancesGrid)
-        self.RefreshModel()
-        self.RefreshView()
+        new_row = self.InstancesTable.MoveRow(row, 1)
+        self.RefreshModel()
+        self.RefreshView(instance_select=new_row)
         self.ParentWindow.RefreshInstancesTree()
         event.Skip()
 
@@ -586,12 +653,13 @@
                     if self.InstancesTable.GetValueByName(i, "Task") == old_name:
                         self.InstancesTable.SetValueByName(i, "Task", new_name)
         self.RefreshModel()
-        self.RefreshView()
+        colname = self.TasksTable.GetColLabelValue(col, False)
+        if colname == "Triggering":
+            wx.CallAfter(self.RefreshView)
         event.Skip()
 
     def OnInstancesGridCellChange(self, event):
         self.RefreshModel()
-        self.RefreshView()
         self.ParentWindow.RefreshInstancesTree()
         event.Skip()