RessourceEditor.py
changeset 586 9aa96a36cf33
parent 579 bc333e073aa3
child 588 4876fedbe9df
--- a/RessourceEditor.py	Mon Nov 07 10:55:17 2011 +0100
+++ b/RessourceEditor.py	Tue Nov 08 21:59:22 2011 +0100
@@ -25,8 +25,8 @@
 import wx
 import wx.grid
 
-from dialogs import DurationEditorDialog
-from controls import CustomGrid
+from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
+from controls import CustomGrid, EditorPanel, DurationCellEditor
 
 #-------------------------------------------------------------------------------
 #                          Configuration Editor class
@@ -35,45 +35,27 @@
 [ID_CONFIGURATIONEDITOR, 
 ] = [wx.NewId() for _init_ctrls in range(1)]
 
-class ConfigurationEditor(wx.Panel):
-    
-    def _init_ctrls(self, prnt):
-        wx.Panel.__init__(self, id=ID_CONFIGURATIONEDITOR, name='', parent=prnt,
-              size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
-
-    def __init__(self, parent, tagname, window, controler):
-        self._init_ctrls(parent)
-        
-        self.ParentWindow = window
-        self.Controler = controler
-        self.TagName = tagname
-
-    def SetTagName(self, tagname):
-        self.TagName = tagname
-        
-    def GetTagName(self):
-        return self.TagName
-    
-    def IsViewing(self, tagname):
-        return self.TagName == tagname
-
-    def IsDebugging(self):
-        return False
-
-    def SetMode(self, mode):
-        pass
-
-    def ResetBuffer(self):
-        pass
-
-    def RefreshView(self):
-        pass
-
-    def RefreshScaling(self, refresh=True):
-        pass
-
-    def ClearHighlights(self, highlight_type=None):
-        pass
+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()
+        self.ParentWindow.RefreshEditor()
+            
+    def Redo(self):
+        self.Controler.LoadNext()
+        self.ParentWindow.CloseTabsWithoutModel()
+        self.ParentWindow.RefreshEditor()
+    
+    def HasNoModel(self):
+        return self.Controler.GetEditedElement(self.TagName) is None
+
 
 #-------------------------------------------------------------------------------
 #                            Resource Editor class
@@ -306,23 +288,19 @@
                     if len(col_highlights) == 0:
                         row_highlights.pop(col)
 
-[ID_RESOURCEEDITOR, ID_RESOURCEEDITORSTATICTEXT1,
+[ID_RESOURCEEDITOR, ID_RESOURCEEDITORPANEL, ID_RESOURCEEDITORSTATICTEXT1,
  ID_RESOURCEEDITORSTATICTEXT2, ID_RESOURCEEDITORINSTANCESGRID,
  ID_RESOURCEEDITORTASKSGRID, ID_RESOURCEEDITORADDINSTANCEBUTTON,
  ID_RESOURCEEDITORDELETEINSTANCEBUTTON, ID_RESOURCEEDITORUPINSTANCEBUTTON,
  ID_RESOURCEEDITORDOWNINSTANCEBUTTON, ID_RESOURCEEDITORADDTASKBUTTON,
  ID_RESOURCEEDITORDELETETASKBUTTON, ID_RESOURCEEDITORUPTASKBUTTON,
  ID_RESOURCEEDITORDOWNTASKBUTTON,
-] = [wx.NewId() for _init_ctrls in range(13)]
-
-class ResourceEditor(wx.Panel):
-    
-    if wx.VERSION < (2, 6, 0):
-        def Bind(self, event, function, id = None):
-            if id is not None:
-                event(self, id, function)
-            else:
-                event(self, function)
+] = [wx.NewId() for _init_ctrls in range(14)]
+
+class ResourceEditor(EditorPanel):
+    
+    ID = ID_RESOURCEEDITOR
+    VARIABLE_PANEL_TYPE = "resource"
     
     def _init_coll_InstancesSizer_Growables(self, parent):
         parent.AddGrowableCol(0)
@@ -389,18 +367,18 @@
         self._init_coll_TasksButtonsSizer_Growables(self.TasksButtonsSizer)
         self._init_coll_TasksButtonsSizer_Items(self.TasksButtonsSizer)
 
-        self.SetSizer(self.MainGridSizer)
-
-    def _init_ctrls(self, prnt):
-        wx.Panel.__init__(self, id=ID_RESOURCEEDITOR, name='', parent=prnt,
+        self.Editor.SetSizer(self.MainGridSizer)
+
+    def _init_Editor(self, prnt):
+        self.Editor = wx.Panel(id=ID_RESOURCEEDITORPANEL, name='ResourceEditor', parent=prnt,
               size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
         
         self.staticText1 = wx.StaticText(id=ID_RESOURCEEDITORSTATICTEXT1,
-              label=_(u'Tasks:'), name='staticText2', parent=self, pos=wx.Point(0,
+              label=_(u'Tasks:'), name='staticText2', parent=self.Editor, pos=wx.Point(0,
               0), size=wx.DefaultSize, style=wx.ALIGN_CENTER)
 
         self.TasksGrid = CustomGrid(id=ID_RESOURCEEDITORTASKSGRID,
-              name='TasksGrid', parent=self, pos=wx.Point(0, 0), 
+              name='TasksGrid', parent=self.Editor, 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'))
@@ -412,27 +390,27 @@
             wx.grid.EVT_GRID_CELL_CHANGE(self.TasksGrid, self.OnTasksGridCellChange)
         
         self.AddTaskButton = wx.Button(id=ID_RESOURCEEDITORADDTASKBUTTON, label=_('Add Task'),
-              name='AddTaskButton', parent=self, pos=wx.Point(0, 0),
+              name='AddTaskButton', parent=self.Editor, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
         
         self.DeleteTaskButton = wx.Button(id=ID_RESOURCEEDITORDELETETASKBUTTON, label=_('Delete Task'),
-              name='DeleteTaskButton', parent=self, pos=wx.Point(0, 0),
+              name='DeleteTaskButton', parent=self.Editor, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
         
         self.UpTaskButton = wx.Button(id=ID_RESOURCEEDITORUPTASKBUTTON, label='^',
-              name='UpTaskButton', parent=self, pos=wx.Point(0, 0),
+              name='UpTaskButton', parent=self.Editor, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
         
         self.DownTaskButton = wx.Button(id=ID_RESOURCEEDITORDOWNTASKBUTTON, label='v',
-              name='DownTaskButton', parent=self, pos=wx.Point(0, 0),
+              name='DownTaskButton', parent=self.Editor, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
         
         self.staticText2 = wx.StaticText(id=ID_RESOURCEEDITORSTATICTEXT2,
-              label=_(u'Instances:'), name='staticText1', parent=self,
+              label=_(u'Instances:'), name='staticText1', parent=self.Editor,
               pos=wx.Point(0, 0), size=wx.DefaultSize, style=wx.ALIGN_CENTER)
 
         self.InstancesGrid = CustomGrid(id=ID_RESOURCEEDITORINSTANCESGRID,
-              name='InstancesGrid', parent=self, pos=wx.Point(0, 0), 
+              name='InstancesGrid', parent=self.Editor, 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'))
@@ -444,29 +422,25 @@
             wx.grid.EVT_GRID_CELL_CHANGE(self.InstancesGrid, self.OnInstancesGridCellChange)
         
         self.AddInstanceButton = wx.Button(id=ID_RESOURCEEDITORADDINSTANCEBUTTON, label=_('Add Instance'),
-              name='AddInstanceButton', parent=self, pos=wx.Point(0, 0),
+              name='AddInstanceButton', parent=self.Editor, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
         
         self.DeleteInstanceButton = wx.Button(id=ID_RESOURCEEDITORDELETEINSTANCEBUTTON, label=_('Delete Instance'),
-              name='DeleteInstanceButton', parent=self, pos=wx.Point(0, 0),
+              name='DeleteInstanceButton', parent=self.Editor, pos=wx.Point(0, 0),
               size=wx.DefaultSize, style=0)
         
         self.UpInstanceButton = wx.Button(id=ID_RESOURCEEDITORUPINSTANCEBUTTON, label='^',
-              name='UpInstanceButton', parent=self, pos=wx.Point(0, 0),
+              name='UpInstanceButton', parent=self.Editor, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
         
         self.DownInstanceButton = wx.Button(id=ID_RESOURCEEDITORDOWNINSTANCEBUTTON, label='v',
-              name='DownInstanceButton', parent=self, pos=wx.Point(0, 0),
+              name='DownInstanceButton', parent=self.Editor, pos=wx.Point(0, 0),
               size=wx.Size(32, 32), style=0)
         
         self._init_sizers()
 
     def __init__(self, parent, tagname, window, controler):
-        self._init_ctrls(parent)
-        
-        self.ParentWindow = window
-        self.Controler = controler
-        self.TagName = tagname
+        EditorPanel.__init__(self, parent, tagname, window, controler)
         
         self.RefreshHighlightsTimer = wx.Timer(self, -1)
         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
@@ -559,21 +533,6 @@
     def __del__(self):
         self.RefreshHighlightsTimer.Stop()
 
-    def SetTagName(self, tagname):
-        self.TagName = tagname
-        
-    def GetTagName(self):
-        return self.TagName
-    
-    def IsViewing(self, tagname):
-        return self.TagName == tagname
-
-    def IsDebugging(self):
-        return False
-
-    def SetMode(self, mode):
-        pass
-
     def RefreshTypeList(self):
         self.TypeList = ""
         blocktypes = self.Controler.GetBlockResource()
@@ -594,9 +553,6 @@
         self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData())
         self.RefreshBuffer()
         
-    def ResetBuffer(self):
-        pass
-
     # Buffer the last model state
     def RefreshBuffer(self):
         self.Controler.BufferProject()
@@ -604,7 +560,25 @@
         self.ParentWindow.RefreshFileMenu()
         self.ParentWindow.RefreshEditMenu()
 
-    def RefreshView(self):
+    def GetBufferState(self):
+        return self.Controler.GetBufferState()
+        
+    def Undo(self):
+        self.Controler.LoadPrevious()
+        self.ParentWindow.CloseTabsWithoutModel()
+        self.ParentWindow.RefreshEditor()
+            
+    def Redo(self):
+        self.Controler.LoadNext()
+        self.ParentWindow.CloseTabsWithoutModel()
+        self.ParentWindow.RefreshEditor()
+    
+    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)
@@ -616,9 +590,6 @@
         self.TasksGrid.RefreshButtons()
         self.InstancesGrid.RefreshButtons()
         
-    def RefreshScaling(self, refresh=True):
-        pass
-    
     def OnTasksGridCellChange(self, event):
         row, col = event.GetRow(), event.GetCol()
         if self.TasksTable.GetColLabelValue(event.GetCol()) == "Name":
@@ -659,127 +630,12 @@
             self.TasksTable.AddHighlight(infos[1:], highlight_type)
         elif infos[0] == "instance":
             self.InstancesTable.AddHighlight(infos[1:], highlight_type)
+        self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
 
     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)
         self.InstancesTable.ResetView(self.InstancesGrid)
-
-class DurationCellControl(wx.PyControl):
-    
-    def _init_coll_MainSizer_Items(self, parent):
-        parent.AddWindow(self.Duration, 0, border=0, flag=wx.GROW)
-        parent.AddWindow(self.EditButton, 0, border=0, flag=wx.GROW)
-        
-    def _init_coll_MainSizer_Growables(self, parent):
-        parent.AddGrowableCol(0)
-        parent.AddGrowableRow(0)
-    
-    def _init_sizers(self):
-        self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
-        
-        self._init_coll_MainSizer_Items(self.MainSizer)
-        self._init_coll_MainSizer_Growables(self.MainSizer)
-        
-        self.SetSizer(self.MainSizer)
-    
-    def _init_ctrls(self, prnt):
-        wx.Control.__init__(self, id=-1, 
-              name='DurationCellControl', parent=prnt,  
-              size=wx.DefaultSize, style=0)
-        
-        # create location text control
-        self.Duration = wx.TextCtrl(id=-1, name='Duration', parent=self,
-              pos=wx.Point(0, 0), size=wx.Size(0, 0), style=wx.TE_PROCESS_ENTER)
-        self.Duration.Bind(wx.EVT_KEY_DOWN, self.OnDurationChar)
-        
-        # create browse button
-        self.EditButton = wx.Button(id=-1, label='...', 
-              name='EditButton', parent=self, pos=wx.Point(0, 0), 
-              size=wx.Size(30, 0), style=0)
-        self.EditButton.Bind(wx.EVT_BUTTON, self.OnEditButtonClick)
-
-        self.Bind(wx.EVT_SIZE, self.OnSize)
-        
-        self._init_sizers()
-
-    '''
-    Custom cell editor control with a text box and a button that launches
-    the DurationEditorDialog.
-    '''
-    def __init__(self, parent):
-        self._init_ctrls(parent)
-        
-    def SetValue(self, value):
-        self.Duration.SetValue(value)
-    
-    def GetValue(self):
-        return self.Duration.GetValue()
-
-    def OnSize(self, event):
-        self.Layout()
-
-    def OnEditButtonClick(self, event):
-        # pop up the Duration Editor dialog
-        dialog = DurationEditorDialog(self)
-        dialog.SetDuration(self.Duration.GetValue())
-        if dialog.ShowModal() == wx.ID_OK:
-            # set the duration
-            self.Duration.SetValue(dialog.GetDuration())
-
-        dialog.Destroy()
-
-        self.Duration.SetFocus()
-
-    def OnDurationChar(self, event):
-        keycode = event.GetKeyCode()
-        if keycode == wx.WXK_RETURN or keycode == wx.WXK_TAB:
-            self.Parent.Parent.ProcessEvent(event)
-            self.Parent.Parent.SetFocus()
-        else:
-            event.Skip()
-
-    def SetInsertionPoint(self, i):
-        self.Duration.SetInsertionPoint(i)
-    
-    def SetFocus(self):
-        self.Duration.SetFocus()
-
-class DurationCellEditor(wx.grid.PyGridCellEditor):
-    '''
-    Grid cell editor that uses DurationCellControl to display an edit button.
-    '''
-    def __init__(self, table):
-        wx.grid.PyGridCellEditor.__init__(self)
-        self.Table = table
-    
-    def __del__(self):
-        self.CellControl = None
-    
-    def Create(self, parent, id, evt_handler):
-        self.CellControl = DurationCellControl(parent)
-        self.SetControl(self.CellControl)
-        if evt_handler:
-            self.CellControl.PushEventHandler(evt_handler)
-
-    def BeginEdit(self, row, col, grid):
-        self.CellControl.SetValue(self.Table.GetValueByName(row, 'Interval'))
-        self.CellControl.SetFocus()
-
-    def EndEdit(self, row, col, grid):
-        duration = self.CellControl.GetValue()
-        old_duration = self.Table.GetValueByName(row, 'Interval')
-        if duration != old_duration:
-            self.Table.SetValueByName(row, 'Interval', duration)
-            return True
-        return False
-
-    def SetSize(self, rect):
-        self.CellControl.SetDimensions(rect.x + 1, rect.y,
-                                        rect.width, rect.height,
-                                        wx.SIZE_ALLOW_MINUS_ONE)
-
-    def Clone(self):
-        return DurationCellEditor(self.Table)
-