diff -r 365bb7496697 -r 5f6a743dcde5 PLCOpenEditor.py --- a/PLCOpenEditor.py Mon Jun 11 01:30:03 2012 +0200 +++ b/PLCOpenEditor.py Thu Jun 14 18:13:32 2012 +0200 @@ -108,7 +108,7 @@ from DataTypeEditor import * from PLCControler import * from SearchResultPanel import SearchResultPanel -from controls import CustomGrid, CustomTable, CustomTree, LibraryPanel, PouInstanceVariablesPanel +from controls import CustomTree, LibraryPanel, PouInstanceVariablesPanel, DebugVariablePanel from dialogs import ProjectDialog, PouTransitionDialog, PouActionDialog # Define PLCOpenEditor controls id @@ -562,13 +562,13 @@ self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON) self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING, - self.OnPouSelectedChanging) + self.OnPouSelectedChanging) self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, - self.OnPouSelectedChanged) + self.OnPouSelectedChanged) self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, - self.OnPageClose) + self.OnPageClose) self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG, - self.OnPageDragged) + self.OnPageDragged) self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane")) @@ -670,7 +670,7 @@ self.SetMenuBar(self.MenuBar) if self.EnableDebug: - self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler) + self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self, self.Controler) self.MainTabs["DebugVariablePanel"] = (self.DebugVariablePanel, _("Debugger")) self.RightNoteBook.AddPage(*self.MainTabs["DebugVariablePanel"]) @@ -2888,327 +2888,6 @@ # Debug Variables Panel #------------------------------------------------------------------------------- -def GetDebugVariablesTableColnames(): - _ = lambda x : x - return [_("Variable"), _("Value")] - -class VariableTableItem(DebugDataConsumer): - - def __init__(self, parent, variable, value): - DebugDataConsumer.__init__(self) - self.Parent = parent - self.Variable = variable - self.Value = value - - def __del__(self): - self.Parent = None - - def SetVariable(self, variable): - if self.Parent and self.Variable != variable: - self.Variable = variable - self.Parent.RefreshGrid() - - def GetVariable(self): - return self.Variable - - def SetForced(self, forced): - if self.Forced != forced: - self.Forced = forced - self.Parent.HasNewData = True - - def SetValue(self, value): - if self.Value != value: - self.Value = value - self.Parent.HasNewData = True - - def GetValue(self): - return self.Value - -class DebugVariableTable(CustomTable): - - def GetValue(self, row, col): - if row < self.GetNumberRows(): - return self.GetValueByName(row, self.GetColLabelValue(col, False)) - return "" - - def SetValue(self, row, col, value): - if col < len(self.colnames): - self.SetValueByName(row, self.GetColLabelValue(col, False), value) - - def GetValueByName(self, row, colname): - if row < self.GetNumberRows(): - if colname == "Variable": - return self.data[row].GetVariable() - elif colname == "Value": - return self.data[row].GetValue() - return "" - - def SetValueByName(self, row, colname, value): - if row < self.GetNumberRows(): - if colname == "Variable": - self.data[row].SetVariable(value) - elif colname == "Value": - self.data[row].SetValue(value) - - def IsForced(self, row): - if row < self.GetNumberRows(): - return self.data[row].IsForced() - return False - - def _updateColAttrs(self, grid): - """ - wx.grid.Grid -> update the column attributes to add the - appropriate renderer given the column name. - - Otherwise default to the default renderer. - """ - - for row in range(self.GetNumberRows()): - for col in range(self.GetNumberCols()): - if self.GetColLabelValue(col, False) == "Value": - if self.IsForced(row): - grid.SetCellTextColour(row, col, wx.BLUE) - else: - grid.SetCellTextColour(row, col, wx.BLACK) - grid.SetReadOnly(row, col, True) - self.ResizeRow(grid, row) - - def AppendItem(self, data): - self.data.append(data) - - def InsertItem(self, idx, data): - self.data.insert(idx, data) - - def RemoveItem(self, idx): - self.data.pop(idx) - - def MoveItem(self, idx, new_idx): - self.data.insert(new_idx, self.data.pop(idx)) - - def GetItem(self, idx): - return self.data[idx] - - -class DebugVariableDropTarget(wx.TextDropTarget): - - def __init__(self, parent): - wx.TextDropTarget.__init__(self) - self.ParentWindow = parent - - def OnDropText(self, x, y, data): - x, y = self.ParentWindow.VariablesGrid.CalcUnscrolledPosition(x, y) - row = self.ParentWindow.VariablesGrid.YToRow(y - self.ParentWindow.VariablesGrid.GetColLabelSize()) - if row == wx.NOT_FOUND: - row = self.ParentWindow.Table.GetNumberRows() - message = None - try: - values = eval(data) - except: - message = _("Invalid value \"%s\" for debug variable")%data - values = None - if not isinstance(values, TupleType): - message = _("Invalid value \"%s\" for debug variable")%data - values = None - if values is not None and values[1] == "debug": - self.ParentWindow.InsertValue(values[0], row) - if message is not None: - wx.CallAfter(self.ShowMessage, message) - - def ShowMessage(self, message): - message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR) - message.ShowModal() - message.Destroy() - -[ID_DEBUGVARIABLEPANEL, ID_DEBUGVARIABLEPANELVARIABLESGRID, - ID_DEBUGVARIABLEPANELUPBUTTON, ID_DEBUGVARIABLEPANELDOWNBUTTON, - ID_DEBUGVARIABLEPANELDELETEBUTTON, -] = [wx.NewId() for _init_ctrls in range(5)] - -class DebugVariablePanel(wx.Panel, DebugViewer): - - if wx.VERSION < (2, 6, 0): - def Bind(self, event, function, id = None): - if id is not None: - event(self, id, function) - else: - event(self, function) - - def _init_coll_MainSizer_Items(self, parent): - parent.AddSizer(self.ButtonPanelSizer, 0, border=5, flag=wx.ALIGN_RIGHT|wx.ALL) - parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW) - - def _init_coll_MainSizer_Growables(self, parent): - parent.AddGrowableCol(0) - parent.AddGrowableRow(1) - - def _init_coll_ButtonPanelSizer_Items(self, parent): - parent.AddWindow(self.UpButton, 0, border=5, flag=wx.RIGHT) - parent.AddWindow(self.DownButton, 0, border=5, flag=wx.RIGHT) - parent.AddWindow(self.DeleteButton, 0, border=0, flag=0) - - def _init_sizers(self): - self.MainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=0) - self.ButtonPanelSizer = wx.BoxSizer(wx.HORIZONTAL) - - self._init_coll_MainSizer_Items(self.MainSizer) - self._init_coll_MainSizer_Growables(self.MainSizer) - self._init_coll_ButtonPanelSizer_Items(self.ButtonPanelSizer) - - self.SetSizer(self.MainSizer) - - def _init_ctrls(self, prnt): - wx.Panel.__init__(self, id=ID_DEBUGVARIABLEPANEL, - name='DebugVariablePanel', parent=prnt, pos=wx.Point(0, 0), - size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) - - self.VariablesGrid = CustomGrid(id=ID_DEBUGVARIABLEPANELVARIABLESGRID, - name='VariablesGrid', parent=self, pos=wx.Point(0, 0), - size=wx.Size(0, 150), style=wx.VSCROLL) - self.VariablesGrid.SetDropTarget(DebugVariableDropTarget(self)) - if wx.VERSION >= (2, 6, 0): - self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.OnVariablesGridCellRightClick) - else: - wx.grid.EVT_GRID_CELL_RIGHT_CLICK(self.VariablesGrid, self.OnVariablesGridCellRightClick) - - self.UpButton = wx.Button(id=ID_DEBUGVARIABLEPANELUPBUTTON, label='^', - name='UpButton', parent=self, pos=wx.Point(0, 0), - size=wx.Size(32, 32), style=0) - - self.DownButton = wx.Button(id=ID_DEBUGVARIABLEPANELDOWNBUTTON, label='v', - name='DownButton', parent=self, pos=wx.Point(0, 0), - size=wx.Size(32, 32), style=0) - - self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label=_('Delete'), - name='DeleteButton', parent=self, pos=wx.Point(0, 0), - size=wx.DefaultSize, style=0) - - self._init_sizers() - - def __init__(self, parent, producer): - self._init_ctrls(parent) - DebugViewer.__init__(self, producer, True) - self.HasNewData = False - - self.Table = DebugVariableTable(self, [], GetDebugVariablesTableColnames()) - self.VariablesGrid.SetTable(self.Table) - self.VariablesGrid.SetButtons({"Delete": self.DeleteButton, - "Up": self.UpButton, - "Down": self.DownButton}) - - def _AddVariable(new_row): - return self.VariablesGrid.GetGridCursorRow() - setattr(self.VariablesGrid, "_AddRow", _AddVariable) - - def _DeleteVariable(row): - item = self.Table.GetItem(row) - self.RemoveDataConsumer(item) - self.Table.RemoveItem(row) - self.RefreshGrid() - setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable) - - def _MoveVariable(row, move): - new_row = max(0, min(row + move, self.Table.GetNumberRows() - 1)) - if new_row != row: - self.Table.MoveItem(row, new_row) - self.RefreshGrid() - return new_row - setattr(self.VariablesGrid, "_MoveRow", _MoveVariable) - - self.VariablesGrid.SetRowLabelSize(0) - - for col in range(self.Table.GetNumberCols()): - attr = wx.grid.GridCellAttr() - attr.SetAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) - self.VariablesGrid.SetColAttr(col, attr) - self.VariablesGrid.SetColSize(col, 100) - - self.Table.ResetView(self.VariablesGrid) - self.VariablesGrid.RefreshButtons() - - def RefreshNewData(self): - if self.HasNewData: - self.HasNewData = False - self.RefreshGrid() - DebugViewer.RefreshNewData(self) - - def RefreshGrid(self): - self.Freeze() - self.Table.ResetView(self.VariablesGrid) - self.VariablesGrid.RefreshButtons() - self.Thaw() - - def UnregisterObsoleteData(self): - items = [(idx, item) for idx, item in enumerate(self.Table.GetData())] - items.reverse() - for idx, item in items: - iec_path = item.GetVariable().upper() - if self.GetDataType(iec_path) is None: - self.RemoveDataConsumer(item) - self.Table.RemoveItem(idx) - else: - self.AddDataConsumer(iec_path, item) - self.Freeze() - self.Table.ResetView(self.VariablesGrid) - self.VariablesGrid.RefreshButtons() - self.Thaw() - - def ResetGrid(self): - self.DeleteDataConsumers() - self.Table.Empty() - self.Freeze() - self.Table.ResetView(self.VariablesGrid) - self.VariablesGrid.RefreshButtons() - self.Thaw() - - def GetForceVariableMenuFunction(self, iec_path, item): - iec_type = self.GetDataType(iec_path) - def ForceVariableFunction(event): - if iec_type is not None: - dialog = ForceVariableDialog(self, iec_type, str(item.GetValue())) - if dialog.ShowModal() == wx.ID_OK: - self.ForceDataValue(iec_path, dialog.GetValue()) - return ForceVariableFunction - - def GetReleaseVariableMenuFunction(self, iec_path): - def ReleaseVariableFunction(event): - self.ReleaseDataValue(iec_path) - return ReleaseVariableFunction - - def OnVariablesGridCellRightClick(self, event): - row, col = event.GetRow(), event.GetCol() - if self.Table.GetColLabelValue(col, False) == "Value": - iec_path = self.Table.GetValueByName(row, "Variable").upper() - - menu = wx.Menu(title='') - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Force value")) - self.Bind(wx.EVT_MENU, self.GetForceVariableMenuFunction(iec_path.upper(), self.Table.GetItem(row)), id=new_id) - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Release value")) - self.Bind(wx.EVT_MENU, self.GetReleaseVariableMenuFunction(iec_path.upper()), id=new_id) - if self.Table.IsForced(row): - menu.Enable(new_id, True) - else: - menu.Enable(new_id, False) - self.PopupMenu(menu) - menu.Destroy() - event.Skip() - - def InsertValue(self, iec_path, idx = None, force=False): - if idx is None: - idx = self.Table.GetNumberRows() - for item in self.Table.GetData(): - if iec_path == item.GetVariable(): - return - item = VariableTableItem(self, iec_path, "") - result = self.AddDataConsumer(iec_path.upper(), item) - if result is not None or force: - self.Table.InsertItem(idx, item) - self.RefreshGrid() - - def GetDebugVariables(self): - return [item.GetVariable() for item in self.Table.GetData()] - #------------------------------------------------------------------------------- # Viewer Printout #-------------------------------------------------------------------------------