editors/ResourceEditor.py
changeset 1420 71b1545d746f
parent 1275 8d4de18c9f29
child 1423 4e33f644f7cf
equal deleted inserted replaced
1419:d6adca8b6697 1420:71b1545d746f
     1 #!/usr/bin/env python
     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     2 # -*- coding: utf-8 -*-
     3 
     3 
     4 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
     4 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
     5 #based on the plcopen standard. 
     5 #based on the plcopen standard.
     6 #
     6 #
     7 #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
     7 #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
     8 #
     8 #
     9 #See COPYING file for copyrights details.
     9 #See COPYING file for copyrights details.
    10 #
    10 #
    34 
    34 
    35 #-------------------------------------------------------------------------------
    35 #-------------------------------------------------------------------------------
    36 #                          Configuration Editor class
    36 #                          Configuration Editor class
    37 #-------------------------------------------------------------------------------
    37 #-------------------------------------------------------------------------------
    38 
    38 
    39 [ID_CONFIGURATIONEDITOR, 
    39 [ID_CONFIGURATIONEDITOR,
    40 ] = [wx.NewId() for _init_ctrls in range(1)]
    40 ] = [wx.NewId() for _init_ctrls in range(1)]
    41 
    41 
    42 class ConfigurationEditor(EditorPanel):
    42 class ConfigurationEditor(EditorPanel):
    43     
    43 
    44     ID = ID_CONFIGURATIONEDITOR
    44     ID = ID_CONFIGURATIONEDITOR
    45     VARIABLE_PANEL_TYPE = "config"
    45     VARIABLE_PANEL_TYPE = "config"
    46     
    46 
    47     def GetBufferState(self):
    47     def GetBufferState(self):
    48         return self.Controler.GetBufferState()
    48         return self.Controler.GetBufferState()
    49         
    49 
    50     def Undo(self):
    50     def Undo(self):
    51         self.Controler.LoadPrevious()
    51         self.Controler.LoadPrevious()
    52         self.ParentWindow.CloseTabsWithoutModel()
    52         self.ParentWindow.CloseTabsWithoutModel()
    53             
    53 
    54     def Redo(self):
    54     def Redo(self):
    55         self.Controler.LoadNext()
    55         self.Controler.LoadNext()
    56         self.ParentWindow.CloseTabsWithoutModel()
    56         self.ParentWindow.CloseTabsWithoutModel()
    57     
    57 
    58     def HasNoModel(self):
    58     def HasNoModel(self):
    59         return self.Controler.GetEditedElement(self.TagName) is None
    59         return self.Controler.GetEditedElement(self.TagName) is None
    60 
    60 
    61 
    61 
    62 #-------------------------------------------------------------------------------
    62 #-------------------------------------------------------------------------------
    75 def GetInstancesTableColnames():
    75 def GetInstancesTableColnames():
    76     _ = lambda x : x
    76     _ = lambda x : x
    77     return [_("Name"), _("Type"), _("Task")]
    77     return [_("Name"), _("Type"), _("Task")]
    78 
    78 
    79 class ResourceTable(CustomTable):
    79 class ResourceTable(CustomTable):
    80     
    80 
    81     """
    81     """
    82     A custom wx.grid.Grid Table using user supplied data
    82     A custom wx.grid.Grid Table using user supplied data
    83     """
    83     """
    84     def __init__(self, parent, data, colnames):
    84     def __init__(self, parent, data, colnames):
    85         # The base class must be initialized *first*
    85         # The base class must be initialized *first*
    86         CustomTable.__init__(self, parent, data, colnames)
    86         CustomTable.__init__(self, parent, data, colnames)
    87         self.ColAlignements = []
    87         self.ColAlignements = []
    88         self.ColSizes = []
    88         self.ColSizes = []
    89         
    89 
    90     def GetColAlignements(self):
    90     def GetColAlignements(self):
    91         return self.ColAlignements
    91         return self.ColAlignements
    92     
    92 
    93     def SetColAlignements(self, list):
    93     def SetColAlignements(self, list):
    94         self.ColAlignements = list
    94         self.ColAlignements = list
    95 
    95 
    96     def GetColSizes(self):
    96     def GetColSizes(self):
    97         return self.ColSizes
    97         return self.ColSizes
    98     
    98 
    99     def SetColSizes(self, list):
    99     def SetColSizes(self, list):
   100         self.ColSizes = list
   100         self.ColSizes = list
   101 
   101 
   102     def GetValue(self, row, col):
   102     def GetValue(self, row, col):
   103         if row < self.GetNumberRows():
   103         if row < self.GetNumberRows():
   104             colname = self.GetColLabelValue(col, False)
   104             colname = self.GetColLabelValue(col, False)
   105             value = str(self.data[row].get(colname, ""))
   105             value = str(self.data[row].get(colname, ""))
   106             if colname == "Triggering":
   106             if colname == "Triggering":
   107                 return _(value)
   107                 return _(value)
   108             return value
   108             return value
   109         
   109 
   110     def SetValue(self, row, col, value):
   110     def SetValue(self, row, col, value):
   111         if col < len(self.colnames):
   111         if col < len(self.colnames):
   112             colname = self.GetColLabelValue(col, False)
   112             colname = self.GetColLabelValue(col, False)
   113             if colname == "Triggering":
   113             if colname == "Triggering":
   114                 value = TASKTRIGGERINGOPTIONS_DICT[value]
   114                 value = TASKTRIGGERINGOPTIONS_DICT[value]
   115             self.data[row][colname] = value
   115             self.data[row][colname] = value
   116     
   116 
       
   117     SingleCellEditor = lambda x,c : wx.grid.GridCellChoiceEditor(x)
       
   118 
   117     def _updateColAttrs(self, grid):
   119     def _updateColAttrs(self, grid):
   118         """
   120         """
   119         wx.grid.Grid -> update the column attributes to add the
   121         wx.grid.Grid -> update the column attributes to add the
   120         appropriate renderer given the column name.
   122         appropriate renderer given the column name.
   121 
   123 
   122         Otherwise default to the default renderer.
   124         Otherwise default to the default renderer.
   123         """
   125         """
   124         
   126 
   125         for col in range(self.GetNumberCols()):
   127         for col in range(self.GetNumberCols()):
   126             attr = wx.grid.GridCellAttr()
   128             attr = wx.grid.GridCellAttr()
   127             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
   129             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
   128             grid.SetColAttr(col, attr)
   130             grid.SetColAttr(col, attr)
   129             grid.SetColSize(col, self.ColSizes[col])
   131             grid.SetColSize(col, self.ColSizes[col])
   130         
   132 
   131         for row in range(self.GetNumberRows()):
   133         for row in range(self.GetNumberRows()):
   132             row_highlights = self.Highlights.get(row, {})
   134             row_highlights = self.Highlights.get(row, {})
   133             for col in range(self.GetNumberCols()):
   135             for col in range(self.GetNumberCols()):
   134                 editor = None
   136                 editor = None
   135                 renderer = None
   137                 renderer = None
   146                         grid.SetReadOnly(row, col, True)
   148                         grid.SetReadOnly(row, col, True)
   147                     interval = self.GetValueByName(row, colname)
   149                     interval = self.GetValueByName(row, colname)
   148                     if interval != "" and IEC_TIME_MODEL.match(interval.upper()) is None:
   150                     if interval != "" and IEC_TIME_MODEL.match(interval.upper()) is None:
   149                         error = True
   151                         error = True
   150                 elif colname == "Single":
   152                 elif colname == "Single":
   151                     editor = wx.grid.GridCellChoiceEditor()
   153                     editor = self.SingleCellEditor(self,colname)
   152                     editor.SetParameters(self.Parent.VariableList)
   154                     editor.SetParameters(self.Parent.VariableList)
   153                     if self.GetValueByName(row, "Triggering") != "Interrupt":
   155                     if self.GetValueByName(row, "Triggering") != "Interrupt":
   154                         grid.SetReadOnly(row, col, True)
   156                         grid.SetReadOnly(row, col, True)
   155                 elif colname == "Triggering":
   157                 elif colname == "Triggering":
   156                     editor = wx.grid.GridCellChoiceEditor()
   158                     editor = wx.grid.GridCellChoiceEditor()
   162                     editor = wx.grid.GridCellNumberEditor()
   164                     editor = wx.grid.GridCellNumberEditor()
   163                     editor.SetParameters("0,65535")
   165                     editor.SetParameters("0,65535")
   164                 elif colname == "Task":
   166                 elif colname == "Task":
   165                     editor = wx.grid.GridCellChoiceEditor()
   167                     editor = wx.grid.GridCellChoiceEditor()
   166                     editor.SetParameters(self.Parent.TaskList)
   168                     editor.SetParameters(self.Parent.TaskList)
   167                     
   169 
   168                 grid.SetCellEditor(row, col, editor)
   170                 grid.SetCellEditor(row, col, editor)
   169                 grid.SetCellRenderer(row, col, renderer)
   171                 grid.SetCellRenderer(row, col, renderer)
   170                 
   172 
   171                 if error:
   173                 if error:
   172                     highlight_colours = ERROR_HIGHLIGHT
   174                     highlight_colours = ERROR_HIGHLIGHT
   173                 else:
   175                 else:
   174                     highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
   176                     highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
   175                 grid.SetCellBackgroundColour(row, col, highlight_colours[0])
   177                 grid.SetCellBackgroundColour(row, col, highlight_colours[0])
   176                 grid.SetCellTextColour(row, col, highlight_colours[1])
   178                 grid.SetCellTextColour(row, col, highlight_colours[1])
   177             self.ResizeRow(grid, row)
   179             self.ResizeRow(grid, row)
   178 
   180 
   179     
   181 
   180 #-------------------------------------------------------------------------------
   182 #-------------------------------------------------------------------------------
   181 #                        Highlights showing functions
   183 #                        Highlights showing functions
   182 #-------------------------------------------------------------------------------
   184 #-------------------------------------------------------------------------------
   183 
   185 
   184     def AddHighlight(self, infos, highlight_type):
   186     def AddHighlight(self, infos, highlight_type):
   185         row_highlights = self.Highlights.setdefault(infos[0], {})
   187         row_highlights = self.Highlights.setdefault(infos[0], {})
   186         col_highlights = row_highlights.setdefault(infos[1], [])
   188         col_highlights = row_highlights.setdefault(infos[1], [])
   187         col_highlights.append(highlight_type)
   189         col_highlights.append(highlight_type)
   188     
   190 
   189     def ClearHighlights(self, highlight_type=None):
   191     def ClearHighlights(self, highlight_type=None):
   190         if highlight_type is None:
   192         if highlight_type is None:
   191             self.Highlights = {}
   193             self.Highlights = {}
   192         else:
   194         else:
   193             for row, row_highlights in self.Highlights.iteritems():
   195             for row, row_highlights in self.Highlights.iteritems():
   199                         row_highlights.pop(col)
   201                         row_highlights.pop(col)
   200 
   202 
   201 
   203 
   202 
   204 
   203 class ResourceEditor(EditorPanel):
   205 class ResourceEditor(EditorPanel):
   204     
   206 
   205     VARIABLE_PANEL_TYPE = "resource"
   207     VARIABLE_PANEL_TYPE = "resource"
   206 
   208 
   207     def _init_Editor(self, parent):
   209     def _init_Editor(self, parent):
   208         self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER|wx.TAB_TRAVERSAL)
   210         self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER|wx.TAB_TRAVERSAL)
   209         
   211 
   210         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   212         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   211         main_sizer.AddGrowableCol(0)
   213         main_sizer.AddGrowableCol(0)
   212         main_sizer.AddGrowableRow(0)
   214         main_sizer.AddGrowableRow(0)
   213         main_sizer.AddGrowableRow(1)
   215         main_sizer.AddGrowableRow(1)
   214         
   216 
   215         tasks_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   217         tasks_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   216         tasks_sizer.AddGrowableCol(0)
   218         tasks_sizer.AddGrowableCol(0)
   217         tasks_sizer.AddGrowableRow(1)
   219         tasks_sizer.AddGrowableRow(1)
   218         main_sizer.AddSizer(tasks_sizer, border=5, 
   220         main_sizer.AddSizer(tasks_sizer, border=5,
   219               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
   221               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
   220         
   222 
   221         tasks_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   223         tasks_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   222         tasks_buttons_sizer.AddGrowableCol(0)
   224         tasks_buttons_sizer.AddGrowableCol(0)
   223         tasks_buttons_sizer.AddGrowableRow(0)
   225         tasks_buttons_sizer.AddGrowableRow(0)
   224         tasks_sizer.AddSizer(tasks_buttons_sizer, flag=wx.GROW)
   226         tasks_sizer.AddSizer(tasks_buttons_sizer, flag=wx.GROW)
   225         
   227 
   226         tasks_label = wx.StaticText(self.Editor, label=_(u'Tasks:'))
   228         tasks_label = wx.StaticText(self.Editor, label=_(u'Tasks:'))
   227         tasks_buttons_sizer.AddWindow(tasks_label, flag=wx.ALIGN_BOTTOM)
   229         tasks_buttons_sizer.AddWindow(tasks_label, flag=wx.ALIGN_BOTTOM)
   228         
   230 
   229         for name, bitmap, help in [
   231         for name, bitmap, help in [
   230                 ("AddTaskButton", "add_element", _("Add task")),
   232                 ("AddTaskButton", "add_element", _("Add task")),
   231                 ("DeleteTaskButton", "remove_element", _("Remove task")),
   233                 ("DeleteTaskButton", "remove_element", _("Remove task")),
   232                 ("UpTaskButton", "up", _("Move task up")),
   234                 ("UpTaskButton", "up", _("Move task up")),
   233                 ("DownTaskButton", "down", _("Move task down"))]:
   235                 ("DownTaskButton", "down", _("Move task down"))]:
   234             button = wx.lib.buttons.GenBitmapButton(self.Editor, 
   236             button = wx.lib.buttons.GenBitmapButton(self.Editor,
   235                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
   237                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
   236             button.SetToolTipString(help)
   238             button.SetToolTipString(help)
   237             setattr(self, name, button)
   239             setattr(self, name, button)
   238             tasks_buttons_sizer.AddWindow(button)
   240             tasks_buttons_sizer.AddWindow(button)
   239         
   241 
   240         self.TasksGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
   242         self.TasksGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
   241         self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange)
   243         self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange)
   242         tasks_sizer.AddWindow(self.TasksGrid, flag=wx.GROW)
   244         tasks_sizer.AddWindow(self.TasksGrid, flag=wx.GROW)
   243         
   245 
   244         instances_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   246         instances_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   245         instances_sizer.AddGrowableCol(0)
   247         instances_sizer.AddGrowableCol(0)
   246         instances_sizer.AddGrowableRow(1)
   248         instances_sizer.AddGrowableRow(1)
   247         main_sizer.AddSizer(instances_sizer, border=5, 
   249         main_sizer.AddSizer(instances_sizer, border=5,
   248               flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   250               flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   249         
   251 
   250         instances_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   252         instances_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
   251         instances_buttons_sizer.AddGrowableCol(0)
   253         instances_buttons_sizer.AddGrowableCol(0)
   252         instances_buttons_sizer.AddGrowableRow(0)
   254         instances_buttons_sizer.AddGrowableRow(0)
   253         instances_sizer.AddSizer(instances_buttons_sizer, flag=wx.GROW)
   255         instances_sizer.AddSizer(instances_buttons_sizer, flag=wx.GROW)
   254         
   256 
   255         instances_label = wx.StaticText(self.Editor, label=_(u'Instances:'))
   257         instances_label = wx.StaticText(self.Editor, label=_(u'Instances:'))
   256         instances_buttons_sizer.AddWindow(instances_label, flag=wx.ALIGN_BOTTOM)
   258         instances_buttons_sizer.AddWindow(instances_label, flag=wx.ALIGN_BOTTOM)
   257         
   259 
   258         for name, bitmap, help in [
   260         for name, bitmap, help in [
   259                 ("AddInstanceButton", "add_element", _("Add instance")),
   261                 ("AddInstanceButton", "add_element", _("Add instance")),
   260                 ("DeleteInstanceButton", "remove_element", _("Remove instance")),
   262                 ("DeleteInstanceButton", "remove_element", _("Remove instance")),
   261                 ("UpInstanceButton", "up", _("Move instance up")),
   263                 ("UpInstanceButton", "up", _("Move instance up")),
   262                 ("DownInstanceButton", "down", _("Move instance down"))]:
   264                 ("DownInstanceButton", "down", _("Move instance down"))]:
   263             button = wx.lib.buttons.GenBitmapButton(self.Editor, 
   265             button = wx.lib.buttons.GenBitmapButton(self.Editor,
   264                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
   266                   bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
   265             button.SetToolTipString(help)
   267             button.SetToolTipString(help)
   266             setattr(self, name, button)
   268             setattr(self, name, button)
   267             instances_buttons_sizer.AddWindow(button)
   269             instances_buttons_sizer.AddWindow(button)
   268         
   270 
   269         self.InstancesGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
   271         self.InstancesGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
   270         self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, 
   272         self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
   271               self.OnInstancesGridCellChange)
   273               self.OnInstancesGridCellChange)
   272         instances_sizer.AddWindow(self.InstancesGrid, flag=wx.GROW)
   274         instances_sizer.AddWindow(self.InstancesGrid, flag=wx.GROW)
   273         
   275 
   274         self.Editor.SetSizer(main_sizer)
   276         self.Editor.SetSizer(main_sizer)
   275         
   277 
   276     def __init__(self, parent, tagname, window, controler):
   278     def __init__(self, parent, tagname, window, controler):
   277         EditorPanel.__init__(self, parent, tagname, window, controler)
   279         EditorPanel.__init__(self, parent, tagname, window, controler)
   278         
   280 
   279         self.RefreshHighlightsTimer = wx.Timer(self, -1)
   281         self.RefreshHighlightsTimer = wx.Timer(self, -1)
   280         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
   282         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
   281         
   283 
   282         self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0}
   284         self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0}
   283         self.TasksTable = ResourceTable(self, [], GetTasksTableColnames())
   285         self.TasksTable = ResourceTable(self, [], GetTasksTableColnames())
   284         self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT])
   286         self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT])
   285         self.TasksTable.SetColSizes([200, 100, 100, 150, 100])
   287         self.TasksTable.SetColSizes([200, 100, 100, 150, 100])
   286         self.TasksGrid.SetTable(self.TasksTable)
   288         self.TasksGrid.SetTable(self.TasksTable)
   287         self.TasksGrid.SetButtons({"Add": self.AddTaskButton,
   289         self.TasksGrid.SetButtons({"Add": self.AddTaskButton,
   288                                    "Delete": self.DeleteTaskButton,
   290                                    "Delete": self.DeleteTaskButton,
   289                                    "Up": self.UpTaskButton,
   291                                    "Up": self.UpTaskButton,
   290                                    "Down": self.DownTaskButton})
   292                                    "Down": self.DownTaskButton})
   291         
   293 
   292         def _AddTask(new_row):
   294         def _AddTask(new_row):
   293             self.TasksTable.InsertRow(new_row, self.TasksDefaultValue.copy())
   295             self.TasksTable.InsertRow(new_row, self.TasksDefaultValue.copy())
   294             self.RefreshModel()
   296             self.RefreshModel()
   295             self.RefreshView()
   297             self.RefreshView()
   296             return new_row
   298             return new_row
   297         setattr(self.TasksGrid, "_AddRow", _AddTask)
   299         setattr(self.TasksGrid, "_AddRow", _AddTask)
   298         
   300 
   299         def _DeleteTask(row):
   301         def _DeleteTask(row):
   300             self.TasksTable.RemoveRow(row)
   302             self.TasksTable.RemoveRow(row)
   301             self.RefreshModel()
   303             self.RefreshModel()
   302             self.RefreshView()
   304             self.RefreshView()
   303         setattr(self.TasksGrid, "_DeleteRow", _DeleteTask)
   305         setattr(self.TasksGrid, "_DeleteRow", _DeleteTask)
   304         
   306 
   305         def _MoveTask(row, move):
   307         def _MoveTask(row, move):
   306             new_row = self.TasksTable.MoveRow(row, move)
   308             new_row = self.TasksTable.MoveRow(row, move)
   307             if new_row != row:
   309             if new_row != row:
   308                 self.RefreshModel()
   310                 self.RefreshModel()
   309                 self.RefreshView()
   311                 self.RefreshView()
   310             return new_row
   312             return new_row
   311         setattr(self.TasksGrid, "_MoveRow", _MoveTask)
   313         setattr(self.TasksGrid, "_MoveRow", _MoveTask)
   312         
   314 
   313         self.TasksGrid.SetRowLabelSize(0)
   315         self.TasksGrid.SetRowLabelSize(0)
   314         self.TasksTable.ResetView(self.TasksGrid)
   316         self.TasksTable.ResetView(self.TasksGrid)
   315         self.TasksGrid.RefreshButtons()
   317         self.TasksGrid.RefreshButtons()
   316         
   318 
   317         self.InstancesDefaultValue = {"Name" : "", "Type" : "", "Task" : ""}
   319         self.InstancesDefaultValue = {"Name" : "", "Type" : "", "Task" : ""}
   318         self.InstancesTable = ResourceTable(self, [], GetInstancesTableColnames())
   320         self.InstancesTable = ResourceTable(self, [], GetInstancesTableColnames())
   319         self.InstancesTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT])
   321         self.InstancesTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT])
   320         self.InstancesTable.SetColSizes([200, 150, 150])
   322         self.InstancesTable.SetColSizes([200, 150, 150])
   321         self.InstancesGrid.SetTable(self.InstancesTable)
   323         self.InstancesGrid.SetTable(self.InstancesTable)
   322         self.InstancesGrid.SetButtons({"Add": self.AddInstanceButton,
   324         self.InstancesGrid.SetButtons({"Add": self.AddInstanceButton,
   323                                        "Delete": self.DeleteInstanceButton,
   325                                        "Delete": self.DeleteInstanceButton,
   324                                        "Up": self.UpInstanceButton,
   326                                        "Up": self.UpInstanceButton,
   325                                        "Down": self.DownInstanceButton})
   327                                        "Down": self.DownInstanceButton})
   326         
   328 
   327         def _AddInstance(new_row):
   329         def _AddInstance(new_row):
   328             self.InstancesTable.InsertRow(new_row, self.InstancesDefaultValue.copy())
   330             self.InstancesTable.InsertRow(new_row, self.InstancesDefaultValue.copy())
   329             self.RefreshModel()
   331             self.RefreshModel()
   330             self.RefreshView()
   332             self.RefreshView()
   331             return new_row
   333             return new_row
   332         setattr(self.InstancesGrid, "_AddRow", _AddInstance)
   334         setattr(self.InstancesGrid, "_AddRow", _AddInstance)
   333         
   335 
   334         def _DeleteInstance(row):
   336         def _DeleteInstance(row):
   335             self.InstancesTable.RemoveRow(row)
   337             self.InstancesTable.RemoveRow(row)
   336             self.RefreshModel()
   338             self.RefreshModel()
   337             self.RefreshView()
   339             self.RefreshView()
   338         setattr(self.InstancesGrid, "_DeleteRow", _DeleteInstance)
   340         setattr(self.InstancesGrid, "_DeleteRow", _DeleteInstance)
   339         
   341 
   340         def _MoveInstance(row, move):
   342         def _MoveInstance(row, move):
   341             new_row = max(0, min(row + move, self.InstancesTable.GetNumberRows() - 1))
   343             new_row = max(0, min(row + move, self.InstancesTable.GetNumberRows() - 1))
   342             if new_row != row:
   344             if new_row != row:
   343                 if self.InstancesTable.GetValueByName(row, "Task") != self.InstancesTable.GetValueByName(new_row, "Task"):
   345                 if self.InstancesTable.GetValueByName(row, "Task") != self.InstancesTable.GetValueByName(new_row, "Task"):
   344                     return row 
   346                     return row
   345                 self.InstancesTable.MoveRow(row, move)
   347                 self.InstancesTable.MoveRow(row, move)
   346                 self.RefreshModel()
   348                 self.RefreshModel()
   347                 self.RefreshView()
   349                 self.RefreshView()
   348             return new_row
   350             return new_row
   349         setattr(self.InstancesGrid, "_MoveRow", _MoveInstance)
   351         setattr(self.InstancesGrid, "_MoveRow", _MoveInstance)
   350         
   352 
   351         def _RefreshInstanceButtons():
   353         def _RefreshInstanceButtons():
   352             if self:
   354             if self:
   353                 rows = self.InstancesTable.GetNumberRows()
   355                 rows = self.InstancesTable.GetNumberRows()
   354                 row = self.InstancesGrid.GetGridCursorRow()
   356                 row = self.InstancesGrid.GetGridCursorRow()
   355                 self.DeleteInstanceButton.Enable(rows > 0)
   357                 self.DeleteInstanceButton.Enable(rows > 0)
   356                 self.UpInstanceButton.Enable(row > 0 and 
   358                 self.UpInstanceButton.Enable(row > 0 and
   357                     self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row - 1, "Task"))
   359                     self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row - 1, "Task"))
   358                 self.DownInstanceButton.Enable(0 <= row < rows - 1 and 
   360                 self.DownInstanceButton.Enable(0 <= row < rows - 1 and
   359                     self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row + 1, "Task"))
   361                     self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row + 1, "Task"))
   360         setattr(self.InstancesGrid, "RefreshButtons", _RefreshInstanceButtons)
   362         setattr(self.InstancesGrid, "RefreshButtons", _RefreshInstanceButtons)
   361         
   363 
   362         self.InstancesGrid.SetRowLabelSize(0)
   364         self.InstancesGrid.SetRowLabelSize(0)
   363         self.InstancesTable.ResetView(self.InstancesGrid)
   365         self.InstancesTable.ResetView(self.InstancesGrid)
   364         self.InstancesGrid.RefreshButtons()
   366         self.InstancesGrid.RefreshButtons()
   365         
   367 
   366         self.TasksGrid.SetFocus()
   368         self.TasksGrid.SetFocus()
   367         
   369 
   368     def __del__(self):
   370     def __del__(self):
   369         self.RefreshHighlightsTimer.Stop()
   371         self.RefreshHighlightsTimer.Stop()
   370 
   372 
   371     def RefreshTypeList(self):
   373     def RefreshTypeList(self):
   372         self.TypeList = ""
   374         self.TypeList = ""
   381 
   383 
   382     def RefreshVariableList(self):
   384     def RefreshVariableList(self):
   383         self.VariableList = ""
   385         self.VariableList = ""
   384         for variable in self.Controler.GetEditedResourceVariables(self.TagName):
   386         for variable in self.Controler.GetEditedResourceVariables(self.TagName):
   385             self.VariableList += ",%s"%variable
   387             self.VariableList += ",%s"%variable
   386         
   388 
   387     def RefreshModel(self):
   389     def RefreshModel(self):
   388         self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData())
   390         self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData())
   389         self.RefreshBuffer()
   391         self.RefreshBuffer()
   390         
   392 
   391     # Buffer the last model state
   393     # Buffer the last model state
   392     def RefreshBuffer(self):
   394     def RefreshBuffer(self):
   393         self.Controler.BufferProject()
   395         self.Controler.BufferProject()
   394         self.ParentWindow.RefreshTitle()
   396         self.ParentWindow.RefreshTitle()
   395         self.ParentWindow.RefreshFileMenu()
   397         self.ParentWindow.RefreshFileMenu()
   396         self.ParentWindow.RefreshEditMenu()
   398         self.ParentWindow.RefreshEditMenu()
   397 
   399 
   398     def GetBufferState(self):
   400     def GetBufferState(self):
   399         return self.Controler.GetBufferState()
   401         return self.Controler.GetBufferState()
   400         
   402 
   401     def Undo(self):
   403     def Undo(self):
   402         self.Controler.LoadPrevious()
   404         self.Controler.LoadPrevious()
   403         self.ParentWindow.CloseTabsWithoutModel()
   405         self.ParentWindow.CloseTabsWithoutModel()
   404             
   406 
   405     def Redo(self):
   407     def Redo(self):
   406         self.Controler.LoadNext()
   408         self.Controler.LoadNext()
   407         self.ParentWindow.CloseTabsWithoutModel()
   409         self.ParentWindow.CloseTabsWithoutModel()
   408     
   410 
   409     def HasNoModel(self):
   411     def HasNoModel(self):
   410         return self.Controler.GetEditedElement(self.TagName) is None
   412         return self.Controler.GetEditedElement(self.TagName) is None
   411 
   413 
   412     def RefreshView(self, variablepanel=True):
   414     def RefreshView(self, variablepanel=True):
   413         EditorPanel.RefreshView(self, variablepanel)
   415         EditorPanel.RefreshView(self, variablepanel)
   414         
   416 
   415         tasks, instances = self.Controler.GetEditedResourceInfos(self.TagName)
   417         tasks, instances = self.Controler.GetEditedResourceInfos(self.TagName)
   416         self.TasksTable.SetData(tasks)
   418         self.TasksTable.SetData(tasks)
   417         self.InstancesTable.SetData(instances)
   419         self.InstancesTable.SetData(instances)
   418         self.RefreshTypeList()
   420         self.RefreshTypeList()
   419         self.RefreshTaskList()
   421         self.RefreshTaskList()
   420         self.RefreshVariableList()
   422         self.RefreshVariableList()
   421         self.TasksTable.ResetView(self.TasksGrid)
   423         self.TasksTable.ResetView(self.TasksGrid)
   422         self.InstancesTable.ResetView(self.InstancesGrid)
   424         self.InstancesTable.ResetView(self.InstancesGrid)
   423         self.TasksGrid.RefreshButtons()
   425         self.TasksGrid.RefreshButtons()
   424         self.InstancesGrid.RefreshButtons()
   426         self.InstancesGrid.RefreshButtons()
   425         
   427 
   426     def OnTasksGridCellChange(self, event):
   428     def OnTasksGridCellChange(self, event):
   427         row, col = event.GetRow(), event.GetCol()
   429         row, col = event.GetRow(), event.GetCol()
   428         if self.TasksTable.GetColLabelValue(col) == "Name":
   430         if self.TasksTable.GetColLabelValue(col) == "Name":
   429             tasklist = [name for name in self.TaskList.split(",") if name != ""]
   431             tasklist = [name for name in self.TaskList.split(",") if name != ""]
   430             for i in xrange(self.TasksTable.GetNumberRows()):
   432             for i in xrange(self.TasksTable.GetNumberRows()):
   450         event.Skip()
   452         event.Skip()
   451 
   453 
   452 #-------------------------------------------------------------------------------
   454 #-------------------------------------------------------------------------------
   453 #                        Highlights showing functions
   455 #                        Highlights showing functions
   454 #-------------------------------------------------------------------------------
   456 #-------------------------------------------------------------------------------
   455     
   457 
   456     def OnRefreshHighlightsTimer(self, event):
   458     def OnRefreshHighlightsTimer(self, event):
   457         self.RefreshView()
   459         self.RefreshView()
   458         event.Skip()
   460         event.Skip()
   459     
   461 
   460     def AddHighlight(self, infos, start, end, highlight_type):
   462     def AddHighlight(self, infos, start, end, highlight_type):
   461         EditorPanel.AddHighlight(self, infos, start, end, highlight_type)
   463         EditorPanel.AddHighlight(self, infos, start, end, highlight_type)
   462         
   464 
   463         if infos[0] == "task":
   465         if infos[0] == "task":
   464             self.TasksTable.AddHighlight(infos[1:], highlight_type)
   466             self.TasksTable.AddHighlight(infos[1:], highlight_type)
   465         elif infos[0] == "instance":
   467         elif infos[0] == "instance":
   466             self.InstancesTable.AddHighlight(infos[1:], highlight_type)
   468             self.InstancesTable.AddHighlight(infos[1:], highlight_type)
   467         self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
   469         self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
   468 
   470 
   469     def ClearHighlights(self, highlight_type=None):
   471     def ClearHighlights(self, highlight_type=None):
   470         EditorPanel.ClearHighlights(self, highlight_type)
   472         EditorPanel.ClearHighlights(self, highlight_type)
   471         
   473 
   472         self.TasksTable.ClearHighlights(highlight_type)
   474         self.TasksTable.ClearHighlights(highlight_type)
   473         self.InstancesTable.ClearHighlights(highlight_type)
   475         self.InstancesTable.ClearHighlights(highlight_type)
   474         self.TasksTable.ResetView(self.TasksGrid)
   476         self.TasksTable.ResetView(self.TasksGrid)
   475         self.InstancesTable.ResetView(self.InstancesGrid)
   477         self.InstancesTable.ResetView(self.InstancesGrid)