RessourceEditor.py
changeset 586 9aa96a36cf33
parent 579 bc333e073aa3
child 588 4876fedbe9df
equal deleted inserted replaced
585:bd8c7a033b17 586:9aa96a36cf33
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24 
    24 
    25 import wx
    25 import wx
    26 import wx.grid
    26 import wx.grid
    27 
    27 
    28 from dialogs import DurationEditorDialog
    28 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
    29 from controls import CustomGrid
    29 from controls import CustomGrid, EditorPanel, DurationCellEditor
    30 
    30 
    31 #-------------------------------------------------------------------------------
    31 #-------------------------------------------------------------------------------
    32 #                          Configuration Editor class
    32 #                          Configuration Editor class
    33 #-------------------------------------------------------------------------------
    33 #-------------------------------------------------------------------------------
    34 
    34 
    35 [ID_CONFIGURATIONEDITOR, 
    35 [ID_CONFIGURATIONEDITOR, 
    36 ] = [wx.NewId() for _init_ctrls in range(1)]
    36 ] = [wx.NewId() for _init_ctrls in range(1)]
    37 
    37 
    38 class ConfigurationEditor(wx.Panel):
    38 class ConfigurationEditor(EditorPanel):
    39     
    39     
    40     def _init_ctrls(self, prnt):
    40     ID = ID_CONFIGURATIONEDITOR
    41         wx.Panel.__init__(self, id=ID_CONFIGURATIONEDITOR, name='', parent=prnt,
    41     VARIABLE_PANEL_TYPE = "config"
    42               size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
    42     
    43 
    43     def GetBufferState(self):
    44     def __init__(self, parent, tagname, window, controler):
    44         return self.Controler.GetBufferState()
    45         self._init_ctrls(parent)
    45         
    46         
    46     def Undo(self):
    47         self.ParentWindow = window
    47         self.Controler.LoadPrevious()
    48         self.Controler = controler
    48         self.ParentWindow.CloseTabsWithoutModel()
    49         self.TagName = tagname
    49         self.ParentWindow.RefreshEditor()
    50 
    50             
    51     def SetTagName(self, tagname):
    51     def Redo(self):
    52         self.TagName = tagname
    52         self.Controler.LoadNext()
    53         
    53         self.ParentWindow.CloseTabsWithoutModel()
    54     def GetTagName(self):
    54         self.ParentWindow.RefreshEditor()
    55         return self.TagName
    55     
    56     
    56     def HasNoModel(self):
    57     def IsViewing(self, tagname):
    57         return self.Controler.GetEditedElement(self.TagName) is None
    58         return self.TagName == tagname
    58 
    59 
       
    60     def IsDebugging(self):
       
    61         return False
       
    62 
       
    63     def SetMode(self, mode):
       
    64         pass
       
    65 
       
    66     def ResetBuffer(self):
       
    67         pass
       
    68 
       
    69     def RefreshView(self):
       
    70         pass
       
    71 
       
    72     def RefreshScaling(self, refresh=True):
       
    73         pass
       
    74 
       
    75     def ClearHighlights(self, highlight_type=None):
       
    76         pass
       
    77 
    59 
    78 #-------------------------------------------------------------------------------
    60 #-------------------------------------------------------------------------------
    79 #                            Resource Editor class
    61 #                            Resource Editor class
    80 #-------------------------------------------------------------------------------
    62 #-------------------------------------------------------------------------------
    81 
    63 
   304                     if highlight_type in col_highlights:
   286                     if highlight_type in col_highlights:
   305                         col_highlights.remove(highlight_type)
   287                         col_highlights.remove(highlight_type)
   306                     if len(col_highlights) == 0:
   288                     if len(col_highlights) == 0:
   307                         row_highlights.pop(col)
   289                         row_highlights.pop(col)
   308 
   290 
   309 [ID_RESOURCEEDITOR, ID_RESOURCEEDITORSTATICTEXT1,
   291 [ID_RESOURCEEDITOR, ID_RESOURCEEDITORPANEL, ID_RESOURCEEDITORSTATICTEXT1,
   310  ID_RESOURCEEDITORSTATICTEXT2, ID_RESOURCEEDITORINSTANCESGRID,
   292  ID_RESOURCEEDITORSTATICTEXT2, ID_RESOURCEEDITORINSTANCESGRID,
   311  ID_RESOURCEEDITORTASKSGRID, ID_RESOURCEEDITORADDINSTANCEBUTTON,
   293  ID_RESOURCEEDITORTASKSGRID, ID_RESOURCEEDITORADDINSTANCEBUTTON,
   312  ID_RESOURCEEDITORDELETEINSTANCEBUTTON, ID_RESOURCEEDITORUPINSTANCEBUTTON,
   294  ID_RESOURCEEDITORDELETEINSTANCEBUTTON, ID_RESOURCEEDITORUPINSTANCEBUTTON,
   313  ID_RESOURCEEDITORDOWNINSTANCEBUTTON, ID_RESOURCEEDITORADDTASKBUTTON,
   295  ID_RESOURCEEDITORDOWNINSTANCEBUTTON, ID_RESOURCEEDITORADDTASKBUTTON,
   314  ID_RESOURCEEDITORDELETETASKBUTTON, ID_RESOURCEEDITORUPTASKBUTTON,
   296  ID_RESOURCEEDITORDELETETASKBUTTON, ID_RESOURCEEDITORUPTASKBUTTON,
   315  ID_RESOURCEEDITORDOWNTASKBUTTON,
   297  ID_RESOURCEEDITORDOWNTASKBUTTON,
   316 ] = [wx.NewId() for _init_ctrls in range(13)]
   298 ] = [wx.NewId() for _init_ctrls in range(14)]
   317 
   299 
   318 class ResourceEditor(wx.Panel):
   300 class ResourceEditor(EditorPanel):
   319     
   301     
   320     if wx.VERSION < (2, 6, 0):
   302     ID = ID_RESOURCEEDITOR
   321         def Bind(self, event, function, id = None):
   303     VARIABLE_PANEL_TYPE = "resource"
   322             if id is not None:
       
   323                 event(self, id, function)
       
   324             else:
       
   325                 event(self, function)
       
   326     
   304     
   327     def _init_coll_InstancesSizer_Growables(self, parent):
   305     def _init_coll_InstancesSizer_Growables(self, parent):
   328         parent.AddGrowableCol(0)
   306         parent.AddGrowableCol(0)
   329         parent.AddGrowableRow(1)
   307         parent.AddGrowableRow(1)
   330 
   308 
   387         self._init_coll_TasksSizer_Growables(self.TasksSizer)
   365         self._init_coll_TasksSizer_Growables(self.TasksSizer)
   388         self._init_coll_TasksSizer_Items(self.TasksSizer)
   366         self._init_coll_TasksSizer_Items(self.TasksSizer)
   389         self._init_coll_TasksButtonsSizer_Growables(self.TasksButtonsSizer)
   367         self._init_coll_TasksButtonsSizer_Growables(self.TasksButtonsSizer)
   390         self._init_coll_TasksButtonsSizer_Items(self.TasksButtonsSizer)
   368         self._init_coll_TasksButtonsSizer_Items(self.TasksButtonsSizer)
   391 
   369 
   392         self.SetSizer(self.MainGridSizer)
   370         self.Editor.SetSizer(self.MainGridSizer)
   393 
   371 
   394     def _init_ctrls(self, prnt):
   372     def _init_Editor(self, prnt):
   395         wx.Panel.__init__(self, id=ID_RESOURCEEDITOR, name='', parent=prnt,
   373         self.Editor = wx.Panel(id=ID_RESOURCEEDITORPANEL, name='ResourceEditor', parent=prnt,
   396               size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
   374               size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
   397         
   375         
   398         self.staticText1 = wx.StaticText(id=ID_RESOURCEEDITORSTATICTEXT1,
   376         self.staticText1 = wx.StaticText(id=ID_RESOURCEEDITORSTATICTEXT1,
   399               label=_(u'Tasks:'), name='staticText2', parent=self, pos=wx.Point(0,
   377               label=_(u'Tasks:'), name='staticText2', parent=self.Editor, pos=wx.Point(0,
   400               0), size=wx.DefaultSize, style=wx.ALIGN_CENTER)
   378               0), size=wx.DefaultSize, style=wx.ALIGN_CENTER)
   401 
   379 
   402         self.TasksGrid = CustomGrid(id=ID_RESOURCEEDITORTASKSGRID,
   380         self.TasksGrid = CustomGrid(id=ID_RESOURCEEDITORTASKSGRID,
   403               name='TasksGrid', parent=self, pos=wx.Point(0, 0), 
   381               name='TasksGrid', parent=self.Editor, pos=wx.Point(0, 0), 
   404               size=wx.Size(-1, -1), style=wx.VSCROLL)
   382               size=wx.Size(-1, -1), style=wx.VSCROLL)
   405         self.TasksGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   383         self.TasksGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   406               'Sans'))
   384               'Sans'))
   407         self.TasksGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
   385         self.TasksGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
   408               False, 'Sans'))
   386               False, 'Sans'))
   410             self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange)
   388             self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange)
   411         else:
   389         else:
   412             wx.grid.EVT_GRID_CELL_CHANGE(self.TasksGrid, self.OnTasksGridCellChange)
   390             wx.grid.EVT_GRID_CELL_CHANGE(self.TasksGrid, self.OnTasksGridCellChange)
   413         
   391         
   414         self.AddTaskButton = wx.Button(id=ID_RESOURCEEDITORADDTASKBUTTON, label=_('Add Task'),
   392         self.AddTaskButton = wx.Button(id=ID_RESOURCEEDITORADDTASKBUTTON, label=_('Add Task'),
   415               name='AddTaskButton', parent=self, pos=wx.Point(0, 0),
   393               name='AddTaskButton', parent=self.Editor, pos=wx.Point(0, 0),
   416               size=wx.DefaultSize, style=0)
   394               size=wx.DefaultSize, style=0)
   417         
   395         
   418         self.DeleteTaskButton = wx.Button(id=ID_RESOURCEEDITORDELETETASKBUTTON, label=_('Delete Task'),
   396         self.DeleteTaskButton = wx.Button(id=ID_RESOURCEEDITORDELETETASKBUTTON, label=_('Delete Task'),
   419               name='DeleteTaskButton', parent=self, pos=wx.Point(0, 0),
   397               name='DeleteTaskButton', parent=self.Editor, pos=wx.Point(0, 0),
   420               size=wx.DefaultSize, style=0)
   398               size=wx.DefaultSize, style=0)
   421         
   399         
   422         self.UpTaskButton = wx.Button(id=ID_RESOURCEEDITORUPTASKBUTTON, label='^',
   400         self.UpTaskButton = wx.Button(id=ID_RESOURCEEDITORUPTASKBUTTON, label='^',
   423               name='UpTaskButton', parent=self, pos=wx.Point(0, 0),
   401               name='UpTaskButton', parent=self.Editor, pos=wx.Point(0, 0),
   424               size=wx.Size(32, 32), style=0)
   402               size=wx.Size(32, 32), style=0)
   425         
   403         
   426         self.DownTaskButton = wx.Button(id=ID_RESOURCEEDITORDOWNTASKBUTTON, label='v',
   404         self.DownTaskButton = wx.Button(id=ID_RESOURCEEDITORDOWNTASKBUTTON, label='v',
   427               name='DownTaskButton', parent=self, pos=wx.Point(0, 0),
   405               name='DownTaskButton', parent=self.Editor, pos=wx.Point(0, 0),
   428               size=wx.Size(32, 32), style=0)
   406               size=wx.Size(32, 32), style=0)
   429         
   407         
   430         self.staticText2 = wx.StaticText(id=ID_RESOURCEEDITORSTATICTEXT2,
   408         self.staticText2 = wx.StaticText(id=ID_RESOURCEEDITORSTATICTEXT2,
   431               label=_(u'Instances:'), name='staticText1', parent=self,
   409               label=_(u'Instances:'), name='staticText1', parent=self.Editor,
   432               pos=wx.Point(0, 0), size=wx.DefaultSize, style=wx.ALIGN_CENTER)
   410               pos=wx.Point(0, 0), size=wx.DefaultSize, style=wx.ALIGN_CENTER)
   433 
   411 
   434         self.InstancesGrid = CustomGrid(id=ID_RESOURCEEDITORINSTANCESGRID,
   412         self.InstancesGrid = CustomGrid(id=ID_RESOURCEEDITORINSTANCESGRID,
   435               name='InstancesGrid', parent=self, pos=wx.Point(0, 0), 
   413               name='InstancesGrid', parent=self.Editor, pos=wx.Point(0, 0), 
   436               size=wx.Size(-1, -1), style=wx.VSCROLL)
   414               size=wx.Size(-1, -1), style=wx.VSCROLL)
   437         self.InstancesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   415         self.InstancesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   438               'Sans'))
   416               'Sans'))
   439         self.InstancesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
   417         self.InstancesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
   440               False, 'Sans'))
   418               False, 'Sans'))
   442             self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnInstancesGridCellChange)
   420             self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnInstancesGridCellChange)
   443         else:
   421         else:
   444             wx.grid.EVT_GRID_CELL_CHANGE(self.InstancesGrid, self.OnInstancesGridCellChange)
   422             wx.grid.EVT_GRID_CELL_CHANGE(self.InstancesGrid, self.OnInstancesGridCellChange)
   445         
   423         
   446         self.AddInstanceButton = wx.Button(id=ID_RESOURCEEDITORADDINSTANCEBUTTON, label=_('Add Instance'),
   424         self.AddInstanceButton = wx.Button(id=ID_RESOURCEEDITORADDINSTANCEBUTTON, label=_('Add Instance'),
   447               name='AddInstanceButton', parent=self, pos=wx.Point(0, 0),
   425               name='AddInstanceButton', parent=self.Editor, pos=wx.Point(0, 0),
   448               size=wx.DefaultSize, style=0)
   426               size=wx.DefaultSize, style=0)
   449         
   427         
   450         self.DeleteInstanceButton = wx.Button(id=ID_RESOURCEEDITORDELETEINSTANCEBUTTON, label=_('Delete Instance'),
   428         self.DeleteInstanceButton = wx.Button(id=ID_RESOURCEEDITORDELETEINSTANCEBUTTON, label=_('Delete Instance'),
   451               name='DeleteInstanceButton', parent=self, pos=wx.Point(0, 0),
   429               name='DeleteInstanceButton', parent=self.Editor, pos=wx.Point(0, 0),
   452               size=wx.DefaultSize, style=0)
   430               size=wx.DefaultSize, style=0)
   453         
   431         
   454         self.UpInstanceButton = wx.Button(id=ID_RESOURCEEDITORUPINSTANCEBUTTON, label='^',
   432         self.UpInstanceButton = wx.Button(id=ID_RESOURCEEDITORUPINSTANCEBUTTON, label='^',
   455               name='UpInstanceButton', parent=self, pos=wx.Point(0, 0),
   433               name='UpInstanceButton', parent=self.Editor, pos=wx.Point(0, 0),
   456               size=wx.Size(32, 32), style=0)
   434               size=wx.Size(32, 32), style=0)
   457         
   435         
   458         self.DownInstanceButton = wx.Button(id=ID_RESOURCEEDITORDOWNINSTANCEBUTTON, label='v',
   436         self.DownInstanceButton = wx.Button(id=ID_RESOURCEEDITORDOWNINSTANCEBUTTON, label='v',
   459               name='DownInstanceButton', parent=self, pos=wx.Point(0, 0),
   437               name='DownInstanceButton', parent=self.Editor, pos=wx.Point(0, 0),
   460               size=wx.Size(32, 32), style=0)
   438               size=wx.Size(32, 32), style=0)
   461         
   439         
   462         self._init_sizers()
   440         self._init_sizers()
   463 
   441 
   464     def __init__(self, parent, tagname, window, controler):
   442     def __init__(self, parent, tagname, window, controler):
   465         self._init_ctrls(parent)
   443         EditorPanel.__init__(self, parent, tagname, window, controler)
   466         
       
   467         self.ParentWindow = window
       
   468         self.Controler = controler
       
   469         self.TagName = tagname
       
   470         
   444         
   471         self.RefreshHighlightsTimer = wx.Timer(self, -1)
   445         self.RefreshHighlightsTimer = wx.Timer(self, -1)
   472         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
   446         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
   473         
   447         
   474         self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0}
   448         self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0}
   557         self.TasksGrid.SetFocus()
   531         self.TasksGrid.SetFocus()
   558         
   532         
   559     def __del__(self):
   533     def __del__(self):
   560         self.RefreshHighlightsTimer.Stop()
   534         self.RefreshHighlightsTimer.Stop()
   561 
   535 
   562     def SetTagName(self, tagname):
       
   563         self.TagName = tagname
       
   564         
       
   565     def GetTagName(self):
       
   566         return self.TagName
       
   567     
       
   568     def IsViewing(self, tagname):
       
   569         return self.TagName == tagname
       
   570 
       
   571     def IsDebugging(self):
       
   572         return False
       
   573 
       
   574     def SetMode(self, mode):
       
   575         pass
       
   576 
       
   577     def RefreshTypeList(self):
   536     def RefreshTypeList(self):
   578         self.TypeList = ""
   537         self.TypeList = ""
   579         blocktypes = self.Controler.GetBlockResource()
   538         blocktypes = self.Controler.GetBlockResource()
   580         for blocktype in blocktypes:
   539         for blocktype in blocktypes:
   581             self.TypeList += ",%s"%blocktype
   540             self.TypeList += ",%s"%blocktype
   592         
   551         
   593     def RefreshModel(self):
   552     def RefreshModel(self):
   594         self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData())
   553         self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData())
   595         self.RefreshBuffer()
   554         self.RefreshBuffer()
   596         
   555         
   597     def ResetBuffer(self):
       
   598         pass
       
   599 
       
   600     # Buffer the last model state
   556     # Buffer the last model state
   601     def RefreshBuffer(self):
   557     def RefreshBuffer(self):
   602         self.Controler.BufferProject()
   558         self.Controler.BufferProject()
   603         self.ParentWindow.RefreshTitle()
   559         self.ParentWindow.RefreshTitle()
   604         self.ParentWindow.RefreshFileMenu()
   560         self.ParentWindow.RefreshFileMenu()
   605         self.ParentWindow.RefreshEditMenu()
   561         self.ParentWindow.RefreshEditMenu()
   606 
   562 
   607     def RefreshView(self):
   563     def GetBufferState(self):
       
   564         return self.Controler.GetBufferState()
       
   565         
       
   566     def Undo(self):
       
   567         self.Controler.LoadPrevious()
       
   568         self.ParentWindow.CloseTabsWithoutModel()
       
   569         self.ParentWindow.RefreshEditor()
       
   570             
       
   571     def Redo(self):
       
   572         self.Controler.LoadNext()
       
   573         self.ParentWindow.CloseTabsWithoutModel()
       
   574         self.ParentWindow.RefreshEditor()
       
   575     
       
   576     def HasNoModel(self):
       
   577         return self.Controler.GetEditedElement(self.TagName) is None
       
   578 
       
   579     def RefreshView(self, variablepanel=True):
       
   580         EditorPanel.RefreshView(self, variablepanel)
       
   581         
   608         tasks, instances = self.Controler.GetEditedResourceInfos(self.TagName)
   582         tasks, instances = self.Controler.GetEditedResourceInfos(self.TagName)
   609         self.TasksTable.SetData(tasks)
   583         self.TasksTable.SetData(tasks)
   610         self.InstancesTable.SetData(instances)
   584         self.InstancesTable.SetData(instances)
   611         self.RefreshTypeList()
   585         self.RefreshTypeList()
   612         self.RefreshTaskList()
   586         self.RefreshTaskList()
   614         self.TasksTable.ResetView(self.TasksGrid)
   588         self.TasksTable.ResetView(self.TasksGrid)
   615         self.InstancesTable.ResetView(self.InstancesGrid)
   589         self.InstancesTable.ResetView(self.InstancesGrid)
   616         self.TasksGrid.RefreshButtons()
   590         self.TasksGrid.RefreshButtons()
   617         self.InstancesGrid.RefreshButtons()
   591         self.InstancesGrid.RefreshButtons()
   618         
   592         
   619     def RefreshScaling(self, refresh=True):
       
   620         pass
       
   621     
       
   622     def OnTasksGridCellChange(self, event):
   593     def OnTasksGridCellChange(self, event):
   623         row, col = event.GetRow(), event.GetCol()
   594         row, col = event.GetRow(), event.GetCol()
   624         if self.TasksTable.GetColLabelValue(event.GetCol()) == "Name":
   595         if self.TasksTable.GetColLabelValue(event.GetCol()) == "Name":
   625             tasklist = self.TaskList.split(",")
   596             tasklist = self.TaskList.split(",")
   626             for i in xrange(self.TasksTable.GetNumberRows()):
   597             for i in xrange(self.TasksTable.GetNumberRows()):
   657     def AddHighlight(self, infos, start, end, highlight_type):
   628     def AddHighlight(self, infos, start, end, highlight_type):
   658         if infos[0] == "task":
   629         if infos[0] == "task":
   659             self.TasksTable.AddHighlight(infos[1:], highlight_type)
   630             self.TasksTable.AddHighlight(infos[1:], highlight_type)
   660         elif infos[0] == "instance":
   631         elif infos[0] == "instance":
   661             self.InstancesTable.AddHighlight(infos[1:], highlight_type)
   632             self.InstancesTable.AddHighlight(infos[1:], highlight_type)
       
   633         self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
   662 
   634 
   663     def ClearHighlights(self, highlight_type=None):
   635     def ClearHighlights(self, highlight_type=None):
       
   636         EditorPanel.ClearHighlights(self, highlight_type)
       
   637         
   664         self.TasksTable.ClearHighlights(highlight_type)
   638         self.TasksTable.ClearHighlights(highlight_type)
   665         self.InstancesTable.ClearHighlights(highlight_type)
   639         self.InstancesTable.ClearHighlights(highlight_type)
   666         self.TasksTable.ResetView(self.TasksGrid)
   640         self.TasksTable.ResetView(self.TasksGrid)
   667         self.InstancesTable.ResetView(self.InstancesGrid)
   641         self.InstancesTable.ResetView(self.InstancesGrid)
   668 
       
   669 class DurationCellControl(wx.PyControl):
       
   670     
       
   671     def _init_coll_MainSizer_Items(self, parent):
       
   672         parent.AddWindow(self.Duration, 0, border=0, flag=wx.GROW)
       
   673         parent.AddWindow(self.EditButton, 0, border=0, flag=wx.GROW)
       
   674         
       
   675     def _init_coll_MainSizer_Growables(self, parent):
       
   676         parent.AddGrowableCol(0)
       
   677         parent.AddGrowableRow(0)
       
   678     
       
   679     def _init_sizers(self):
       
   680         self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
       
   681         
       
   682         self._init_coll_MainSizer_Items(self.MainSizer)
       
   683         self._init_coll_MainSizer_Growables(self.MainSizer)
       
   684         
       
   685         self.SetSizer(self.MainSizer)
       
   686     
       
   687     def _init_ctrls(self, prnt):
       
   688         wx.Control.__init__(self, id=-1, 
       
   689               name='DurationCellControl', parent=prnt,  
       
   690               size=wx.DefaultSize, style=0)
       
   691         
       
   692         # create location text control
       
   693         self.Duration = wx.TextCtrl(id=-1, name='Duration', parent=self,
       
   694               pos=wx.Point(0, 0), size=wx.Size(0, 0), style=wx.TE_PROCESS_ENTER)
       
   695         self.Duration.Bind(wx.EVT_KEY_DOWN, self.OnDurationChar)
       
   696         
       
   697         # create browse button
       
   698         self.EditButton = wx.Button(id=-1, label='...', 
       
   699               name='EditButton', parent=self, pos=wx.Point(0, 0), 
       
   700               size=wx.Size(30, 0), style=0)
       
   701         self.EditButton.Bind(wx.EVT_BUTTON, self.OnEditButtonClick)
       
   702 
       
   703         self.Bind(wx.EVT_SIZE, self.OnSize)
       
   704         
       
   705         self._init_sizers()
       
   706 
       
   707     '''
       
   708     Custom cell editor control with a text box and a button that launches
       
   709     the DurationEditorDialog.
       
   710     '''
       
   711     def __init__(self, parent):
       
   712         self._init_ctrls(parent)
       
   713         
       
   714     def SetValue(self, value):
       
   715         self.Duration.SetValue(value)
       
   716     
       
   717     def GetValue(self):
       
   718         return self.Duration.GetValue()
       
   719 
       
   720     def OnSize(self, event):
       
   721         self.Layout()
       
   722 
       
   723     def OnEditButtonClick(self, event):
       
   724         # pop up the Duration Editor dialog
       
   725         dialog = DurationEditorDialog(self)
       
   726         dialog.SetDuration(self.Duration.GetValue())
       
   727         if dialog.ShowModal() == wx.ID_OK:
       
   728             # set the duration
       
   729             self.Duration.SetValue(dialog.GetDuration())
       
   730 
       
   731         dialog.Destroy()
       
   732 
       
   733         self.Duration.SetFocus()
       
   734 
       
   735     def OnDurationChar(self, event):
       
   736         keycode = event.GetKeyCode()
       
   737         if keycode == wx.WXK_RETURN or keycode == wx.WXK_TAB:
       
   738             self.Parent.Parent.ProcessEvent(event)
       
   739             self.Parent.Parent.SetFocus()
       
   740         else:
       
   741             event.Skip()
       
   742 
       
   743     def SetInsertionPoint(self, i):
       
   744         self.Duration.SetInsertionPoint(i)
       
   745     
       
   746     def SetFocus(self):
       
   747         self.Duration.SetFocus()
       
   748 
       
   749 class DurationCellEditor(wx.grid.PyGridCellEditor):
       
   750     '''
       
   751     Grid cell editor that uses DurationCellControl to display an edit button.
       
   752     '''
       
   753     def __init__(self, table):
       
   754         wx.grid.PyGridCellEditor.__init__(self)
       
   755         self.Table = table
       
   756     
       
   757     def __del__(self):
       
   758         self.CellControl = None
       
   759     
       
   760     def Create(self, parent, id, evt_handler):
       
   761         self.CellControl = DurationCellControl(parent)
       
   762         self.SetControl(self.CellControl)
       
   763         if evt_handler:
       
   764             self.CellControl.PushEventHandler(evt_handler)
       
   765 
       
   766     def BeginEdit(self, row, col, grid):
       
   767         self.CellControl.SetValue(self.Table.GetValueByName(row, 'Interval'))
       
   768         self.CellControl.SetFocus()
       
   769 
       
   770     def EndEdit(self, row, col, grid):
       
   771         duration = self.CellControl.GetValue()
       
   772         old_duration = self.Table.GetValueByName(row, 'Interval')
       
   773         if duration != old_duration:
       
   774             self.Table.SetValueByName(row, 'Interval', duration)
       
   775             return True
       
   776         return False
       
   777 
       
   778     def SetSize(self, rect):
       
   779         self.CellControl.SetDimensions(rect.x + 1, rect.y,
       
   780                                         rect.width, rect.height,
       
   781                                         wx.SIZE_ALLOW_MINUS_ONE)
       
   782 
       
   783     def Clone(self):
       
   784         return DurationCellEditor(self.Table)
       
   785