RessourceEditor.py
changeset 577 9dbb79722fbc
parent 573 0a6b2e1f8ce3
child 578 73138d14d88d
--- a/RessourceEditor.py	Wed Oct 12 23:47:48 2011 +0200
+++ b/RessourceEditor.py	Fri Oct 14 19:26:29 2011 +0200
@@ -26,6 +26,7 @@
 import wx.grid
 
 from dialogs import DurationEditorDialog
+from controls import CustomGrid
 
 #-------------------------------------------------------------------------------
 #                          Configuration Editor class
@@ -279,27 +280,20 @@
         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))
-            return new_index
-        return None
-
+        return new_index
+        
     def Empty(self):
         self.data = []
-        self.editors = []
-
+    
 #-------------------------------------------------------------------------------
 #                        Highlights showing functions
 #-------------------------------------------------------------------------------
 
-    def OnRefreshHighlightsTimer(self, event):
-        self.Table.ResetView(self.VariablesGrid)
-        event.Skip()
-
     def AddHighlight(self, infos, highlight_type):
         row_highlights = self.Highlights.setdefault(infos[0], {})
         col_highlights = row_highlights.setdefault(infos[1], [])
         col_highlights.append(highlight_type)
-        self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
-
+    
     def ClearHighlights(self, highlight_type=None):
         if highlight_type is None:
             self.Highlights = {}
@@ -405,14 +399,14 @@
               label=_(u'Tasks:'), name='staticText2', parent=self, pos=wx.Point(0,
               0), size=wx.DefaultSize, style=wx.ALIGN_CENTER)
 
-        self.TasksGrid = wx.grid.Grid(id=ID_RESOURCEEDITORTASKSGRID,
+        self.TasksGrid = CustomGrid(id=ID_RESOURCEEDITORTASKSGRID,
               name='TasksGrid', parent=self, pos=wx.Point(0, 0), 
               size=wx.Size(-1, -1), style=wx.VSCROLL)
         self.TasksGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
               'Sans'))
         self.TasksGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
               False, 'Sans'))
-        if wx.VERSION >= (2, 5, 0):
+        if wx.VERSION >= (2, 6, 0):
             self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange)
         else:
             wx.grid.EVT_GRID_CELL_CHANGE(self.TasksGrid, self.OnTasksGridCellChange)
@@ -420,35 +414,31 @@
         self.AddTaskButton = wx.Button(id=ID_RESOURCEEDITORADDTASKBUTTON, label=_('Add Task'),
               name='AddTaskButton', parent=self, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnAddTaskButton, id=ID_RESOURCEEDITORADDTASKBUTTON)
-
+        
         self.DeleteTaskButton = wx.Button(id=ID_RESOURCEEDITORDELETETASKBUTTON, label=_('Delete Task'),
               name='DeleteTaskButton', parent=self, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnDeleteTaskButton, id=ID_RESOURCEEDITORDELETETASKBUTTON)
-
+        
         self.UpTaskButton = wx.Button(id=ID_RESOURCEEDITORUPTASKBUTTON, label='^',
               name='UpTaskButton', parent=self, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnUpTaskButton, id=ID_RESOURCEEDITORUPTASKBUTTON)
-
+        
         self.DownTaskButton = wx.Button(id=ID_RESOURCEEDITORDOWNTASKBUTTON, label='v',
               name='DownTaskButton', parent=self, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnDownTaskButton, id=ID_RESOURCEEDITORDOWNTASKBUTTON)
-
+        
         self.staticText2 = wx.StaticText(id=ID_RESOURCEEDITORSTATICTEXT2,
               label=_(u'Instances:'), name='staticText1', parent=self,
               pos=wx.Point(0, 0), size=wx.DefaultSize, style=wx.ALIGN_CENTER)
 
-        self.InstancesGrid = wx.grid.Grid(id=ID_RESOURCEEDITORINSTANCESGRID,
+        self.InstancesGrid = CustomGrid(id=ID_RESOURCEEDITORINSTANCESGRID,
               name='InstancesGrid', parent=self, pos=wx.Point(0, 0), 
               size=wx.Size(-1, -1), style=wx.VSCROLL)
         self.InstancesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
               'Sans'))
         self.InstancesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
               False, 'Sans'))
-        if wx.VERSION >= (2, 5, 0):
+        if wx.VERSION >= (2, 6, 0):
             self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnInstancesGridCellChange)
         else:
             wx.grid.EVT_GRID_CELL_CHANGE(self.InstancesGrid, self.OnInstancesGridCellChange)
@@ -456,23 +446,19 @@
         self.AddInstanceButton = wx.Button(id=ID_RESOURCEEDITORADDINSTANCEBUTTON, label=_('Add Instance'),
               name='AddInstanceButton', parent=self, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnAddInstanceButton, id=ID_RESOURCEEDITORADDINSTANCEBUTTON)
-
+        
         self.DeleteInstanceButton = wx.Button(id=ID_RESOURCEEDITORDELETEINSTANCEBUTTON, label=_('Delete Instance'),
               name='DeleteInstanceButton', parent=self, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnDeleteInstanceButton, id=ID_RESOURCEEDITORDELETEINSTANCEBUTTON)
-
+        
         self.UpInstanceButton = wx.Button(id=ID_RESOURCEEDITORUPINSTANCEBUTTON, label='^',
               name='UpInstanceButton', parent=self, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnUpInstanceButton, id=ID_RESOURCEEDITORUPINSTANCEBUTTON)
-
+        
         self.DownInstanceButton = wx.Button(id=ID_RESOURCEEDITORDOWNINSTANCEBUTTON, label='v',
               name='DownInstanceButton', parent=self, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnDownInstanceButton, id=ID_RESOURCEEDITORDOWNINSTANCEBUTTON)
-
+        
         self._init_sizers()
 
     def __init__(self, parent, tagname, window, controler):
@@ -490,17 +476,86 @@
         self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT])
         self.TasksTable.SetColSizes([200, 100, 100, 150, 100])
         self.TasksGrid.SetTable(self.TasksTable)
+        self.TasksGrid.SetButtons({"Add": self.AddTaskButton,
+                                   "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:
+                self.RefreshModel()
+                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])
         self.InstancesTable.SetColSizes([200, 150, 150])
         self.InstancesGrid.SetTable(self.InstancesTable)
+        self.InstancesGrid.SetButtons({"Add": self.AddInstanceButton,
+                                       "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 
+                self.InstancesTable.MoveRow(row, move)
+                self.RefreshModel()
+                self.RefreshView()
+            return new_row
+        setattr(self.InstancesGrid, "_MoveRow", _MoveInstance)
+        
+        def _RefreshInstanceButtons():
+            rows = self.InstancesTable.GetNumberRows()
+            row = self.InstancesGrid.GetGridCursorRow()
+            self.DeleteInstanceButton.Enable(rows > 0)
+            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.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()
 
@@ -549,7 +604,7 @@
         self.ParentWindow.RefreshFileMenu()
         self.ParentWindow.RefreshEditMenu()
 
-    def RefreshView(self, task_select=None, instance_select=None):
+    def RefreshView(self):
         tasks, instances = self.Controler.GetEditedResourceInfos(self.TagName)
         self.TasksTable.SetData(tasks)
         self.InstancesTable.SetData(instances)
@@ -558,112 +613,12 @@
         self.RefreshVariableList()
         self.TasksTable.ResetView(self.TasksGrid)
         self.InstancesTable.ResetView(self.InstancesGrid)
-        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(task_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:
-                instance_select = min(instance_select, len(instances) - 1)
-            col = self.InstancesGrid.GetGridCursorCol()
-            self.InstancesGrid.SetGridCursor(instance_select, col)
-            self.InstancesGrid.MakeCellVisible(instance_select, col)
-            self.InstancesGrid.SetFocus()
+        self.TasksGrid.RefreshButtons()
+        self.InstancesGrid.RefreshButtons()
         
     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.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(task_select=row)
-        event.Skip()
-
-    def OnUpTaskButton(self, event):
-        self.CloseTasksGridEditControl()
-        row = self.TasksGrid.GetGridCursorRow()
-        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()
-        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.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(instance_select=row)
-        self.ParentWindow.RefreshInstancesTree()
-        event.Skip()
-
-    def OnUpInstanceButton(self, event):
-        self.CloseInstancesGridEditControl()
-        row = self.InstancesGrid.GetGridCursorRow()
-        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()
-        new_row = self.InstancesTable.MoveRow(row, 1)
-        self.RefreshModel()
-        self.RefreshView(instance_select=new_row)
-        self.ParentWindow.RefreshInstancesTree()
-        event.Skip()
-
+    
     def OnTasksGridCellChange(self, event):
         row, col = event.GetRow(), event.GetCol()
         if self.TasksTable.GetColLabelValue(event.GetCol()) == "Name":
@@ -688,6 +643,7 @@
     def OnInstancesGridCellChange(self, event):
         self.RefreshModel()
         self.ParentWindow.RefreshInstancesTree()
+        self.InstancesGrid.RefreshButtons()
         event.Skip()
 
 #-------------------------------------------------------------------------------