VariablePanel.py
changeset 577 9dbb79722fbc
parent 566 6014ef82a98a
child 580 ad996deb920e
equal deleted inserted replaced
576:3f2024f30553 577:9dbb79722fbc
    29 
    29 
    30 from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS
    30 from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS
    31 from PLCControler import LOCATION_PLUGIN, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
    31 from PLCControler import LOCATION_PLUGIN, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
    32 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
    32 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
    33 from dialogs import ArrayTypeDialog
    33 from dialogs import ArrayTypeDialog
       
    34 from controls import CustomGrid
    34 
    35 
    35 CWD = os.path.split(os.path.realpath(__file__))[0]
    36 CWD = os.path.split(os.path.realpath(__file__))[0]
    36 
    37 
    37 # Compatibility function for wx versions < 2.6
    38 # Compatibility function for wx versions < 2.6
    38 def AppendMenu(parent, help, id, kind, text):
    39 def AppendMenu(parent, help, id, kind, text):
   459     def _init_ctrls(self, prnt):
   460     def _init_ctrls(self, prnt):
   460         wx.Panel.__init__(self, id=ID_VARIABLEEDITORPANEL,
   461         wx.Panel.__init__(self, id=ID_VARIABLEEDITORPANEL,
   461               name='VariableEditorPanel', parent=prnt, pos=wx.Point(0, 0),
   462               name='VariableEditorPanel', parent=prnt, pos=wx.Point(0, 0),
   462               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   463               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   463 
   464 
   464         self.VariablesGrid = wx.grid.Grid(id=ID_VARIABLEEDITORPANELVARIABLESGRID,
   465         self.VariablesGrid = CustomGrid(id=ID_VARIABLEEDITORPANELVARIABLESGRID,
   465               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
   466               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
   466               size=wx.Size(0, 0), style=wx.VSCROLL)
   467               size=wx.Size(0, 0), style=wx.VSCROLL)
   467         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   468         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
   468               'Sans'))
   469               'Sans'))
   469         self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
   470         self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
   470               False, 'Sans'))
   471               False, 'Sans'))
   471         self.VariablesGrid.SetSelectionBackground(wx.WHITE)
   472         self.VariablesGrid.SetSelectionBackground(wx.WHITE)
   472         self.VariablesGrid.SetSelectionForeground(wx.BLACK)
   473         self.VariablesGrid.SetSelectionForeground(wx.BLACK)
   473         if wx.VERSION >= (2, 6, 0):
   474         if wx.VERSION >= (2, 6, 0):
   474             self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
   475             self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
   475             self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell)
       
   476             self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
   476             self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
   477             self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown)
   477             self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown)
   478             #self.VariablesGrid.Bind(wx.EVT_KEY_DOWN, self.OnChar)
       
   479         else:
   478         else:
   480             wx.grid.EVT_GRID_CELL_CHANGE(self.VariablesGrid, self.OnVariablesGridCellChange)
   479             wx.grid.EVT_GRID_CELL_CHANGE(self.VariablesGrid, self.OnVariablesGridCellChange)
   481             wx.grid.EVT_GRID_SELECT_CELL(self.VariablesGrid, self.OnVariablesGridSelectCell)
       
   482             wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick)
   480             wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick)
   483             wx.grid.EVT_GRID_EDITOR_SHOWN(self.VariablesGrid, self.OnVariablesGridEditorShown)
   481             wx.grid.EVT_GRID_EDITOR_SHOWN(self.VariablesGrid, self.OnVariablesGridEditorShown)
   484             #wx.EVT_KEY_DOWN(self.VariablesGrid, self.OnChar)
       
   485         self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
       
   486         
   482         
   487         self.ControlPanel = wx.ScrolledWindow(id=ID_VARIABLEEDITORCONTROLPANEL,
   483         self.ControlPanel = wx.ScrolledWindow(id=ID_VARIABLEEDITORCONTROLPANEL,
   488               name='ControlPanel', parent=self, pos=wx.Point(0, 0),
   484               name='ControlPanel', parent=self, pos=wx.Point(0, 0),
   489               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   485               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   490         self.ControlPanel.SetScrollRate(0, 10)
   486         self.ControlPanel.SetScrollRate(0, 10)
   508         self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER)
   504         self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER)
   509 
   505 
   510         self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label=_('Add'),
   506         self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label=_('Add'),
   511               name='AddButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
   507               name='AddButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
   512               size=wx.DefaultSize, style=0)
   508               size=wx.DefaultSize, style=0)
   513         self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON)
   509         
   514 
       
   515         self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label=_('Delete'),
   510         self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label=_('Delete'),
   516               name='DeleteButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
   511               name='DeleteButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
   517               size=wx.DefaultSize, style=0)
   512               size=wx.DefaultSize, style=0)
   518         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON)
   513         
   519 
       
   520         self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
   514         self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
   521               name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
   515               name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
   522               size=wx.Size(32, 32), style=0)
   516               size=wx.Size(32, 32), style=0)
   523         self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_VARIABLEEDITORPANELUPBUTTON)
   517         
   524 
       
   525         self.DownButton = wx.Button(id=ID_VARIABLEEDITORPANELDOWNBUTTON, label='v',
   518         self.DownButton = wx.Button(id=ID_VARIABLEEDITORPANELDOWNBUTTON, label='v',
   526               name='DownButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
   519               name='DownButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
   527               size=wx.Size(32, 32), style=0)
   520               size=wx.Size(32, 32), style=0)
   528         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_VARIABLEEDITORPANELDOWNBUTTON)
   521         
   529 
       
   530         self._init_sizers()
   522         self._init_sizers()
   531 
   523 
   532     def __init__(self, parent, window, controler, element_type):
   524     def __init__(self, parent, window, controler, element_type):
   533         self._init_ctrls(parent)
   525         self._init_ctrls(parent)
   534         self.ParentWindow = window
   526         self.ParentWindow = window
   601             reverse_transfer[choice] = filter
   593             reverse_transfer[choice] = filter
   602         self.ClassFilter.SetStringSelection(_(reverse_transfer[self.Filter]))
   594         self.ClassFilter.SetStringSelection(_(reverse_transfer[self.Filter]))
   603         self.RefreshTypeList()
   595         self.RefreshTypeList()
   604 
   596 
   605         self.VariablesGrid.SetTable(self.Table)
   597         self.VariablesGrid.SetTable(self.Table)
   606         self.VariablesGrid.SetRowLabelSize(0)
   598         self.VariablesGrid.SetButtons({"Add": self.AddButton,
   607         for col in range(self.Table.GetNumberCols()):
   599                                        "Delete": self.DeleteButton,
   608             attr = wx.grid.GridCellAttr()
   600                                        "Up": self.UpButton,
   609             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
   601                                        "Down": self.DownButton})
   610             self.VariablesGrid.SetColAttr(col, attr)
   602         
   611             self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col])
   603         def _AddVariable(new_row):
   612             self.VariablesGrid.AutoSizeColumn(col, False)
   604             if not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"]:
   613     
   605                 row_content = self.DefaultValue.copy()
   614     def __del__(self):
   606                 if self.Filter in self.DefaultTypes:
   615         self.RefreshHighlightsTimer.Stop()
   607                     row_content["Class"] = self.DefaultTypes[self.Filter]
   616     
   608                 else:
   617     def SetTagName(self, tagname):
   609                     row_content["Class"] = self.Filter
   618         self.TagName = tagname
   610                 if self.Filter == "All" and len(self.Values) > 0:
   619     
   611                     self.Values.insert(new_row, row_content)
   620     def IsFunctionBlockType(self, name):
   612                 else:
   621         bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
   613                     self.Values.append(row_content)
   622         pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
   614                     new_row = self.Table.GetNumberRows()
   623         if poutype != "function" and bodytype in ["ST", "IL"]:
   615                 self.SaveValues()
   624             return False
   616                 self.RefreshValues()
   625         else:
   617                 return new_row
   626             return name in self.Controler.GetFunctionBlockTypes(self.TagName)
   618             return self.VariablesGrid.GetGridCursorRow()
   627     
   619         setattr(self.VariablesGrid, "_AddRow", _AddVariable)
   628     def RefreshView(self):
   620         
   629         self.PouNames = self.Controler.GetProjectPouNames()
   621         def _DeleteVariable(row):
   630         
   622             if (self.Table.GetValueByName(row, "Edit") and 
   631         words = self.TagName.split("::")
   623                 (not self.PouIsUsed or self.Table.GetValueByName(row, "Class") not in ["Input", "Output", "InOut"])):
   632         if self.ElementType == "config":
   624                 self.Values.remove(self.Table.GetRow(row))
   633             self.PouIsUsed = False
   625                 self.SaveValues()
   634             returnType = None
   626                 self.RefreshValues()
   635             self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
   627         setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable)
   636         elif self.ElementType == "resource":
   628             
   637             self.PouIsUsed = False
   629         def _MoveVariable(row, move):
   638             returnType = None
   630             if (self.Filter == "All" and 
   639             self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
   631                 (not self.PouIsUsed or self.Table.GetValueByName(row, "Class") not in ["Input", "Output", "InOut"])):
   640         else:
   632                 new_row = max(0, min(row + move, len(self.Values) - 1))
   641             if self.ElementType == "function":
   633                 if new_row != row:
   642                 self.ReturnType.Clear()
   634                     self.Values.insert(new_row, self.Values.pop(row))
   643                 for base_type in self.Controler.GetDataTypes(self.TagName, True):
   635                     self.SaveValues()
   644                     self.ReturnType.Append(base_type)
   636                     self.RefreshValues()
   645                 returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
   637                 return new_row
   646             else:
   638             return row
   647                 returnType = None
   639         setattr(self.VariablesGrid, "_MoveRow", _MoveVariable)
   648             self.PouIsUsed = self.Controler.PouIsUsed(words[1])
   640         
   649             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
   641         def _RefreshButtons():
   650         
       
   651         if returnType is not None:
       
   652             self.ReturnType.SetStringSelection(returnType)
       
   653             self.ReturnType.Enable(True)
       
   654             self.staticText1.Show()
       
   655             self.ReturnType.Show()
       
   656         else:
       
   657             self.ReturnType.Enable(False)
       
   658             self.staticText1.Hide()
       
   659             self.ReturnType.Hide()
       
   660         
       
   661         self.RefreshValues()
       
   662         self.RefreshButtons()
       
   663     
       
   664     def OnReturnTypeChanged(self, event):
       
   665         words = self.TagName.split("::")
       
   666         self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
       
   667         self.Controler.BufferProject()
       
   668         self.ParentWindow.RefreshEditor(variablepanel = False)
       
   669         self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
       
   670         event.Skip()
       
   671     
       
   672     def OnClassFilter(self, event):
       
   673         self.Filter = self.FilterChoiceTransfer[VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
       
   674         self.RefreshTypeList()
       
   675         self.RefreshValues()
       
   676         self.RefreshButtons()
       
   677         event.Skip()
       
   678 
       
   679     def RefreshTypeList(self):
       
   680         if self.Filter == "All":
       
   681             self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
       
   682         elif self.Filter == "Interface":
       
   683             self.ClassList = ["Input","Output","InOut","External"]
       
   684         elif self.Filter == "Variables":
       
   685             self.ClassList = ["Local","Temp"]
       
   686         else:
       
   687             self.ClassList = [self.Filter]
       
   688 
       
   689     def RefreshButtons(self):
       
   690         if getattr(self, "Table", None):
       
   691             table_length = len(self.Table.data)
   642             table_length = len(self.Table.data)
   692             row_class = None
   643             row_class = None
   693             row_edit = True
   644             row_edit = True
   694             row = 0
   645             row = 0
   695             if table_length > 0:
   646             if table_length > 0:
   699                     row_class = self.Table.GetValueByName(row, "Class")
   650                     row_class = self.Table.GetValueByName(row, "Class")
   700             self.AddButton.Enable(not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"])
   651             self.AddButton.Enable(not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"])
   701             self.DeleteButton.Enable(table_length > 0 and row_edit and row_class not in ["Input", "Output", "InOut"])
   652             self.DeleteButton.Enable(table_length > 0 and row_edit and row_class not in ["Input", "Output", "InOut"])
   702             self.UpButton.Enable(table_length > 0 and row > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
   653             self.UpButton.Enable(table_length > 0 and row > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
   703             self.DownButton.Enable(table_length > 0 and row < table_length - 1 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
   654             self.DownButton.Enable(table_length > 0 and row < table_length - 1 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
   704 
   655         setattr(self.VariablesGrid, "RefreshButtons", _RefreshButtons)
   705     def CloseVariablesGridEditControl(self):
   656         
   706         row = self.VariablesGrid.GetGridCursorRow()
   657         self.VariablesGrid.SetRowLabelSize(0)
   707         col = self.VariablesGrid.GetGridCursorCol()
   658         for col in range(self.Table.GetNumberCols()):
   708         self.VariablesGrid.SetGridCursor(row, col)
   659             attr = wx.grid.GridCellAttr()
   709 
   660             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
   710     def OnAddButton(self, event):
   661             self.VariablesGrid.SetColAttr(col, attr)
   711         self.CloseVariablesGridEditControl()
   662             self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col])
   712         new_row = self.DefaultValue.copy()
   663             self.VariablesGrid.AutoSizeColumn(col, False)
   713         if self.Filter in self.DefaultTypes:
   664     
   714             new_row["Class"] = self.DefaultTypes[self.Filter]
   665     def __del__(self):
   715         else:
   666         self.RefreshHighlightsTimer.Stop()
   716             new_row["Class"] = self.Filter
   667     
   717         if self.Filter == "All" and len(self.Values) > 0:
   668     def SetTagName(self, tagname):
   718             row_index = self.VariablesGrid.GetGridCursorRow() + 1
   669         self.TagName = tagname
   719             self.Values.insert(row_index, new_row)
   670     
   720         else:
   671     def IsFunctionBlockType(self, name):
   721             row_index = -1
   672         bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
   722             self.Values.append(new_row)
   673         pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
   723         self.SaveValues()
   674         if poutype != "function" and bodytype in ["ST", "IL"]:
   724         self.RefreshValues(row_index)
   675             return False
   725         self.RefreshButtons()
   676         else:
       
   677             return name in self.Controler.GetFunctionBlockTypes(self.TagName)
       
   678     
       
   679     def RefreshView(self):
       
   680         self.PouNames = self.Controler.GetProjectPouNames()
       
   681         
       
   682         words = self.TagName.split("::")
       
   683         if self.ElementType == "config":
       
   684             self.PouIsUsed = False
       
   685             returnType = None
       
   686             self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
       
   687         elif self.ElementType == "resource":
       
   688             self.PouIsUsed = False
       
   689             returnType = None
       
   690             self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
       
   691         else:
       
   692             if self.ElementType == "function":
       
   693                 self.ReturnType.Clear()
       
   694                 for base_type in self.Controler.GetDataTypes(self.TagName, True):
       
   695                     self.ReturnType.Append(base_type)
       
   696                 returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
       
   697             else:
       
   698                 returnType = None
       
   699             self.PouIsUsed = self.Controler.PouIsUsed(words[1])
       
   700             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
       
   701         
       
   702         if returnType is not None:
       
   703             self.ReturnType.SetStringSelection(returnType)
       
   704             self.ReturnType.Enable(True)
       
   705             self.staticText1.Show()
       
   706             self.ReturnType.Show()
       
   707         else:
       
   708             self.ReturnType.Enable(False)
       
   709             self.staticText1.Hide()
       
   710             self.ReturnType.Hide()
       
   711         
       
   712         self.RefreshValues()
       
   713         self.VariablesGrid.RefreshButtons()
       
   714     
       
   715     def OnReturnTypeChanged(self, event):
       
   716         words = self.TagName.split("::")
       
   717         self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
       
   718         self.Controler.BufferProject()
       
   719         self.ParentWindow.RefreshEditor(variablepanel = False)
       
   720         self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
   726         event.Skip()
   721         event.Skip()
   727 
   722     
   728     def OnDeleteButton(self, event):
   723     def OnClassFilter(self, event):
   729         self.CloseVariablesGridEditControl()
   724         self.Filter = self.FilterChoiceTransfer[VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
   730         row_index = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
   725         self.RefreshTypeList()
   731         self.Values.remove(row_index)
   726         self.RefreshValues()
   732         self.SaveValues()
   727         self.VariablesGrid.RefreshButtons()
   733         self.RefreshValues(row_index)
       
   734         self.RefreshButtons()
       
   735         event.Skip()
   728         event.Skip()
   736 
   729 
   737     def OnUpButton(self, event):
   730     def RefreshTypeList(self):
   738         self.CloseVariablesGridEditControl()
   731         if self.Filter == "All":
   739         self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1)
   732             self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
   740         self.RefreshButtons()
   733         elif self.Filter == "Interface":
   741         event.Skip()
   734             self.ClassList = ["Input","Output","InOut","External"]
   742 
   735         elif self.Filter == "Variables":
   743     def OnDownButton(self, event):
   736             self.ClassList = ["Local","Temp"]
   744         self.CloseVariablesGridEditControl()
   737         else:
   745         self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1)
   738             self.ClassList = [self.Filter]
   746         self.RefreshButtons()
       
   747         event.Skip()
       
   748 
   739 
   749     def OnVariablesGridCellChange(self, event):
   740     def OnVariablesGridCellChange(self, event):
   750         row, col = event.GetRow(), event.GetCol()
   741         row, col = event.GetRow(), event.GetCol()
   751         colname = self.Table.GetColLabelValue(col, False)
   742         colname = self.Table.GetColLabelValue(col, False)
   752         value = self.Table.GetValue(row, col)
   743         value = self.Table.GetValue(row, col)
   881             dragSource = wx.DropSource(self.VariablesGrid)
   872             dragSource = wx.DropSource(self.VariablesGrid)
   882             dragSource.SetData(data)
   873             dragSource.SetData(data)
   883             dragSource.DoDragDrop()
   874             dragSource.DoDragDrop()
   884         event.Skip()
   875         event.Skip()
   885     
   876     
   886     def OnVariablesGridSelectCell(self, event):
   877     def RefreshValues(self):
   887         wx.CallAfter(self.RefreshButtons)
       
   888         event.Skip()
       
   889 
       
   890     def OnChar(self, event):
       
   891         keycode = event.GetKeyCode()
       
   892         if keycode == wx.WXK_DELETE:
       
   893             row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
       
   894             self.Values.remove(row)
       
   895             self.SaveValues()
       
   896             self.RefreshValues()
       
   897             self.RefreshButtons()
       
   898         event.Skip()
       
   899 
       
   900     def MoveValue(self, value_index, move):
       
   901         new_index = max(0, min(value_index + move, len(self.Values) - 1))
       
   902         if new_index != value_index:
       
   903             self.Values.insert(new_index, self.Values.pop(value_index))
       
   904             self.SaveValues()
       
   905             self.RefreshValues()
       
   906             self.VariablesGrid.SetGridCursor(new_index, self.VariablesGrid.GetGridCursorCol())
       
   907         
       
   908     def RefreshValues(self, select=0):
       
   909         data = []
   878         data = []
   910         for num, variable in enumerate(self.Values):
   879         for num, variable in enumerate(self.Values):
   911             if variable["Class"] in self.ClassList:
   880             if variable["Class"] in self.ClassList:
   912                 variable["Number"] = num + 1
   881                 variable["Number"] = num + 1
   913                 data.append(variable)
   882                 data.append(variable)
   914         self.Table.SetData(data)
   883         self.Table.SetData(data)
   915         self.Table.ResetView(self.VariablesGrid)
   884         self.Table.ResetView(self.VariablesGrid)
   916         if len(self.Table.data) > 0:
   885             
   917             if select == -1:
       
   918                 select = len(self.Table.data) - 1
       
   919             else:
       
   920                 select = min(select, len(self.Table.data) - 1)
       
   921             col = max(1, self.VariablesGrid.GetGridCursorCol())
       
   922             self.VariablesGrid.SetGridCursor(select, col)
       
   923             self.VariablesGrid.MakeCellVisible(select, col)
       
   924             self.VariablesGrid.SetFocus()
       
   925         
       
   926     def SaveValues(self, buffer = True):
   886     def SaveValues(self, buffer = True):
   927         words = self.TagName.split("::")
   887         words = self.TagName.split("::")
   928         if self.ElementType == "config":
   888         if self.ElementType == "config":
   929             self.Controler.SetConfigurationGlobalVars(words[1], self.Values)
   889             self.Controler.SetConfigurationGlobalVars(words[1], self.Values)
   930         elif self.ElementType == "resource":
   890         elif self.ElementType == "resource":