diff -r bd8c7a033b17 -r 9aa96a36cf33 PLCOpenEditor.py --- a/PLCOpenEditor.py Mon Nov 07 10:55:17 2011 +0100 +++ b/PLCOpenEditor.py Tue Nov 08 21:59:22 2011 +0100 @@ -113,7 +113,7 @@ from RessourceEditor import * from DataTypeEditor import * from PLCControler import * -from VariablePanel import VariablePanel +from controls.VariablePanel import VariablePanel from SearchResultPanel import SearchResultPanel from controls import CustomGrid @@ -267,14 +267,14 @@ parent.Append(helpString=help, id=id, kind=kind, item=text) [TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, TYPESTREE, - INSTANCESTREE, LIBRARYTREE, SCALING -] = range(9) + INSTANCESTREE, LIBRARYTREE, SCALING, PAGETITLES +] = range(10) def GetShortcutKeyCallbackFunction(viewer_function): def ShortcutKeyFunction(self, event): control = self.FindFocus() - if isinstance(control, (Viewer, TextViewer)): - getattr(control, viewer_function)() + if control.GetName() in ["Viewer", "TextViewer"]: + getattr(control.Parent, viewer_function)() elif isinstance(control, wx.TextCtrl): control.ProcessEvent(event) return ShortcutKeyFunction @@ -608,9 +608,6 @@ self.Bind(wx.EVT_TOOL, self.OnSelectionTool, id=ID_PLCOPENEDITORTOOLBARSELECTION) - self.VariablePanelIndexer = VariablePanelIndexer(self.BottomNoteBook, self) - self.BottomNoteBook.AddPage(self.VariablePanelIndexer, _("Variables")) - self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self) self.BottomNoteBook.AddPage(self.SearchResultPanel, _("Search")) @@ -754,7 +751,8 @@ TYPESTREE : self.RefreshTypesTree, INSTANCESTREE : self.RefreshInstancesTree, LIBRARYTREE : self.RefreshLibraryTree, - SCALING : self.RefreshScaling} + SCALING : self.RefreshScaling, + PAGETITLES: self.RefreshPageTitles} ## Call PLCOpenEditor refresh functions. # @param elements List of elements to refresh. @@ -765,14 +763,6 @@ ## Callback function when AUINotebook Page closed with CloseButton # @param event AUINotebook Event. def OnPageClose(self, event): - # Get Selected Tab - selected = event.GetSelection() - if selected >= 0: - # Remove corresponding VariablePanel - window = self.TabsOpened.GetPage(selected) - if not window.IsDebugging(): - self.VariablePanelIndexer.RemoveVariablePanel(window.GetTagName()) - wx.CallAfter(self.RefreshTabCtrlEvent) event.Skip() @@ -925,7 +915,6 @@ def ResetView(self): self.DeleteAllPages() - self.VariablePanelIndexer.RemoveAllPanels() self.TypesTree.DeleteAllItems() self.InstancesTree.DeleteAllItems() self.LibraryTree.DeleteAllItems() @@ -934,16 +923,10 @@ def OnCloseTabMenu(self, event): selected = self.TabsOpened.GetSelection() if selected >= 0: - window = self.TabsOpened.GetPage(selected) - if not window.IsDebugging(): - self.VariablePanelIndexer.RemoveVariablePanel(window.GetTagName()) self.TabsOpened.DeletePage(selected) if self.TabsOpened.GetPageCount() > 0: new_index = min(selected, self.TabsOpened.GetPageCount() - 1) self.TabsOpened.SetSelection(new_index) - window = self.TabsOpened.GetPage(new_index) - if not window.IsDebugging(): - self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName()) # Refresh all window elements that have changed self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) self.RefreshTabCtrlEvent() @@ -1006,7 +989,12 @@ def RefreshEditMenu(self): if self.Controler is not None: - undo, redo = self.Controler.GetBufferState() + selected = self.TabsOpened.GetSelection() + if selected > -1: + window = self.TabsOpened.GetPage(selected) + undo, redo = window.GetBufferState() + else: + undo, redo = False, False self.EditMenu.Enable(wx.ID_UNDO, undo) self.EditMenu.Enable(wx.ID_REDO, redo) #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True) @@ -1045,25 +1033,24 @@ idxs.reverse() for idx in idxs: window = self.TabsOpened.GetPage(idx) - if not window.IsDebugging(): - tagname = window.GetTagName() - if self.Controler.GetEditedElement(tagname) is None: - self.VariablePanelIndexer.RemoveVariablePanel(tagname) - self.TabsOpened.DeletePage(idx) + if window.HasNoModel(): + self.TabsOpened.DeletePage(idx) def OnUndoMenu(self, event): - self.Controler.LoadPrevious() - self.CloseTabsWithoutModel() - self.RefreshEditor() - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, - SCALING) + selected = self.TabsOpened.GetSelection() + if selected != -1: + window = self.TabsOpened.GetPage(selected) + window.Undo() + self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, + SCALING, PAGETITLES) def OnRedoMenu(self, event): - self.Controler.LoadNext() - self.CloseTabsWithoutModel() - self.RefreshEditor() - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, - SCALING) + selected = self.TabsOpened.GetSelection() + if selected != -1: + window = self.TabsOpened.GetPage(selected) + window.Redo() + self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, + SCALING, PAGETITLES) def OnEnableUndoRedoMenu(self, event): self.Controler.EnableProjectBuffer(event.IsChecked()) @@ -1075,8 +1062,8 @@ def OnSelectAllMenu(self, event): control = self.FindFocus() - if isinstance(control, (Viewer, TextViewer)): - control.SelectAll() + if control.GetName() in ["Viewer", "TextViewer"]: + control.Parent.SelectAll() elif isinstance(control, wx.TextCtrl): control.SetSelection(0, control.GetLastPosition()) elif isinstance(control, wx.ComboBox): @@ -1203,38 +1190,28 @@ else: wx.CallAfter(self.SelectInstancesTreeItem, self.InstancesTree.GetRootItem(), window.GetInstancePath()) window.RefreshView() - if not window.IsDebugging(): - self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName()) self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, TOOLBAR) event.Skip() - def RefreshEditor(self, variablepanel = True): + def RefreshEditor(self): selected = self.TabsOpened.GetSelection() if USE_AUI: for child in self.TabsOpened.GetChildren(): if isinstance(child, wx.aui.AuiTabCtrl): active_page = child.GetActivePage() if active_page >= 0: - window = child.GetWindowFromIdx(child.GetActivePage()) + window = child.GetWindowFromIdx(active_page) window.RefreshView() - if not window.IsDebugging() and self.TabsOpened.GetPageIndex(window) == selected and variablepanel: - self.RefreshVariablePanel(window.GetTagName()) elif selected >= 0: window = self.TabsOpened.GetPage(idx) window.RefreshView() - if not window.IsDebugging() and variablepanel: - self.RefreshVariablePanel(window.GetTagName()) - - def RefreshVariablePanel(self, tagname): - self.VariablePanelIndexer.RefreshVariablePanel(tagname) - + def RefreshEditorNames(self, old_tagname, new_tagname): for i in xrange(self.TabsOpened.GetPageCount()): editor = self.TabsOpened.GetPage(i) if editor.GetTagName() == old_tagname: editor.SetTagName(new_tagname) - self.VariablePanelIndexer.UpdateVariablePanelTagName(old_tagname, new_tagname) - + def IsOpened(self, tagname): for idx in xrange(self.TabsOpened.GetPageCount()): if self.TabsOpened.GetPage(idx).IsViewing(tagname): @@ -1244,31 +1221,10 @@ def RefreshPageTitles(self): for idx in xrange(self.TabsOpened.GetPageCount()): window = self.TabsOpened.GetPage(idx) - debug = window.IsDebugging() - words = window.GetTagName().split("::") - if words[0] == "P": - pou_type = self.Controler.GetEditedElementType(window.GetTagName(), debug)[1].upper() - pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug) - self.SetPageBitmap(idx, self.GenerateBitmap(pou_type, pou_body_type)) - elif words[0] == "T": - pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug) - self.SetPageBitmap(idx, self.GenerateBitmap("TRANSITION", pou_body_type)) - elif words[0] == "A": - pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug) - self.SetPageBitmap(idx, self.GenerateBitmap("ACTION", pou_body_type)) - elif words[0] == "C": - self.SetPageBitmap(idx, self.GenerateBitmap("CONFIGURATION")) - elif words[0] == "R": - self.SetPageBitmap(idx, self.GenerateBitmap("RESOURCE")) - elif words[0] == "D": - self.SetPageBitmap(idx, self.GenerateBitmap("DATATYPE")) - if debug: - text = window.GetInstancePath() - if len(text) > 15: - text = "..." + text[-12:] - self.TabsOpened.SetPageText(idx, text) - else: - self.TabsOpened.SetPageText(idx, "-".join(words[1:])) + icon = window.GetIcon() + if icon is not None: + self.SetPageBitmap(idx, icon) + self.TabsOpened.SetPageText(idx, window.GetTitle()) def GetTabsOpenedDClickFunction(self, tabctrl): def OnTabsOpenedDClick(event): @@ -1563,7 +1519,7 @@ else: event.Skip() - def EditProjectElement(self, elementtype, tagname, onlyopened = False): + def EditProjectElement(self, element, tagname, onlyopened = False): openedidx = self.IsOpened(tagname) if openedidx is not None: old_selected = self.TabsOpened.GetSelection() @@ -1571,19 +1527,18 @@ if old_selected >= 0: self.TabsOpened.GetPage(old_selected).ResetBuffer() self.TabsOpened.SetSelection(openedidx) - self.VariablePanelIndexer.ChangeVariablePanel(tagname) - self.RefreshPageTitles() - self._Refresh(FILEMENU, EDITMENU, TOOLBAR) + self._Refresh(FILEMENU, EDITMENU, TOOLBAR, PAGETITLES) elif not onlyopened: - if elementtype == ITEM_CONFIGURATION: + new_window = None + if element == ITEM_CONFIGURATION: new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler) + new_window.SetIcon(self.GenerateBitmap("CONFIGURATION")) self.AddPage(new_window, "") - self.VariablePanelIndexer.AddVariablePanel(tagname, "config") - elif elementtype == ITEM_RESOURCE: + elif element == ITEM_RESOURCE: new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler) + new_window.SetIcon(self.GenerateBitmap("RESOURCE")) self.AddPage(new_window, "") - self.VariablePanelIndexer.AddVariablePanel(tagname, "resource") - elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: + elif element in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]: bodytype = self.Controler.GetEditedElementBodyType(tagname) if bodytype == "FBD": new_window = Viewer(self.TabsOpened, tagname, self, self.Controler) @@ -1601,24 +1556,35 @@ new_window.SetKeywords(IL_KEYWORDS) else: new_window.SetKeywords(ST_KEYWORDS) + if element == ITEM_POU: + pou_type = self.Controler.GetEditedElementType(tagname)[1].upper() + icon = self.GenerateBitmap(pou_type, bodytype) + elif element == ITEM_TRANSITION: + icon = self.GenerateBitmap("TRANSITION", bodytype) + elif element == ITEM_ACTION: + icon = self.GenerateBitmap("ACTION", bodytype) + new_window.SetIcon(icon) self.AddPage(new_window, "") words = tagname.split("::") - self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1])) - elif elementtype == ITEM_DATATYPE: + elif element == ITEM_DATATYPE: new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler) + new_window.SetIcon(self.GenerateBitmap("DATATYPE")) self.AddPage(new_window, "") - self.VariablePanelIndexer.ChangeVariablePanel(tagname) - openedidx = self.IsOpened(tagname) - old_selected = self.TabsOpened.GetSelection() - if old_selected != openedidx: - if old_selected >= 0: - self.TabsOpened.GetPage(old_selected).ResetBuffer() - for i in xrange(self.TabsOpened.GetPageCount()): - window = self.TabsOpened.GetPage(i) - if window.GetTagName() == tagname: - self.TabsOpened.SetSelection(i) - window.SetFocus() - self.RefreshPageTitles() + elif isinstance(element, EditorPanel): + new_window = element + self.AddPage(element, "") + if new_window is not None: + openedidx = self.IsOpened(tagname) + old_selected = self.TabsOpened.GetSelection() + if old_selected != openedidx: + if old_selected >= 0: + self.TabsOpened.GetPage(old_selected).ResetBuffer() + for i in xrange(self.TabsOpened.GetPageCount()): + window = self.TabsOpened.GetPage(i) + if window == new_window: + self.TabsOpened.SetSelection(i) + window.SetFocus() + self.RefreshPageTitles() def OnTypesTreeRightUp(self, event): if wx.Platform == '__WXMSW__': @@ -1836,6 +1802,14 @@ new_window.SetKeywords(IL_KEYWORDS) else: new_window.SetKeywords(ST_KEYWORDS) + if selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM]: + pou_type = self.Controler.GetEditedElementType(selected_infos[1], True)[1].upper() + icon = self.GenerateBitmap(pou_type, bodytype) + elif selected_infos[0] == ITEM_TRANSITION: + icon = self.GenerateBitmap("TRANSITION", bodytype) + elif selected_infos[0] == ITEM_ACTION: + icon = self.GenerateBitmap("ACTION", bodytype) + new_window.SetIcon(icon) self.AddPage(new_window, "") new_window.SetFocus() self.RefreshPageTitles() @@ -2359,7 +2333,6 @@ tagname = self.Controler.ComputePouName(name) idx = self.IsOpened(tagname) if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(tagname) self.TabsOpened.DeletePage(idx) self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE) else: @@ -2379,7 +2352,6 @@ tagname = self.Controler.ComputePouTransitionName(pou_name, transition) idx = self.IsOpened(tagname) if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(tagname) self.TabsOpened.DeletePage(idx) self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE) @@ -2397,7 +2369,6 @@ tagname = self.Controler.ComputePouActionName(pou_name, action) idx = self.IsOpened(tagname) if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(tagname) self.TabsOpened.DeletePage(idx) self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE) @@ -2409,7 +2380,6 @@ tagname = self.Controler.ComputeConfigurationName(name) idx = self.IsOpened(tagname) if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(tagname) self.TabsOpened.DeletePage(idx) self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE) @@ -2427,7 +2397,6 @@ tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected) idx = self.IsOpened(tagname) if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(tagname) self.TabsOpened.DeletePage(idx) self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE) @@ -2453,13 +2422,10 @@ self.TypesTree.Unselect() else: self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0]) - if infos[1] in plcopen.searchResultVarTypes.values() + ["var_local"]: - self.VariablePanelIndexer.AddVariableHighlight(infos, highlight_type) - else: - selected = self.TabsOpened.GetSelection() - if selected != -1: - viewer = self.TabsOpened.GetPage(selected) - viewer.AddHighlight(infos[1:], start, end, highlight_type) + selected = self.TabsOpened.GetSelection() + if selected != -1: + viewer = self.TabsOpened.GetPage(selected) + viewer.AddHighlight(infos[1:], start, end, highlight_type) def ShowError(self, infos, start, end): self.ShowHighlight(infos, start, end, ERROR_HIGHLIGHT) @@ -2473,7 +2439,6 @@ else: self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type]) self.RefreshTypesTree() - self.VariablePanelIndexer.ClearHighlights(highlight_type) for i in xrange(self.TabsOpened.GetPageCount()): viewer = self.TabsOpened.GetPage(i) viewer.ClearHighlights(highlight_type) @@ -2721,9 +2686,8 @@ if not result: self.SaveProjectAs() else: - self.RefreshTitle() - self.RefreshFileMenu() - + self._Refresh(TITLE, FILEMENU, PAGETITLES) + def SaveProjectAs(self): filepath = self.Controler.GetFilePath() if filepath != "": @@ -2739,8 +2703,7 @@ self.ShowErrorMessage(_("Can't save project to file %s!")%filepath) else: self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath)) - self.RefreshTitle() - self.RefreshFileMenu() + self._Refresh(TITLE, FILEMENU, PAGETITLES) dialog.Destroy() #------------------------------------------------------------------------------- @@ -3846,106 +3809,6 @@ return self.GetSizer().GetItem(1).GetWindow().GetValue() #------------------------------------------------------------------------------- -# Variables Editor Panel -#------------------------------------------------------------------------------- - -def PouTagname(tagname): - words = tagname.split("::") - if words[0] in ["T", "A"]: - return "P::%s" % words[1] - return tagname - -class VariablePanelIndexer(wx.Panel): - - def _init_sizers(self): - self.MainSizer = wx.BoxSizer(wx.HORIZONTAL) - - self.SetSizer(self.MainSizer) - - def _init_ctrls(self, prnt): - wx.Panel.__init__(self, id=wx.NewId(), - name='VariablePanelIndexer', parent=prnt, pos=wx.Point(0, 0), - size=wx.Size(0, 300), style=wx.TAB_TRAVERSAL) - - self._init_sizers() - - def __init__(self, parent, window): - self._init_ctrls(parent) - - self.ParentWindow = window - - self.VariablePanelList = {} - self.CurrentPanel = None - - def AddVariablePanel(self, tagname, element_type): - tagname = PouTagname(tagname) - panel, users = self.VariablePanelList.get(tagname, (None, 0)) - if panel is None: - panel = VariablePanel(self, self.ParentWindow, self.ParentWindow.Controler, element_type) - panel.SetTagName(tagname) - panel.Hide() - panel.RefreshView() - self.MainSizer.AddWindow(panel, 1, border=0, flag=wx.GROW) - self.VariablePanelList[tagname] = (panel, users + 1) - - def RemoveVariablePanel(self, tagname): - tagname = PouTagname(tagname) - panel, users = self.VariablePanelList.pop(tagname, (None, 0)) - if panel is not None: - if users > 1: - self.VariablePanelList[tagname] = (panel, users - 1) - else: - self.MainSizer.Remove(panel) - panel.Destroy() - if self.CurrentPanel == tagname: - self.CurrentPanel = None - - def RemoveAllPanels(self): - for panel, users in self.VariablePanelList.itervalues(): - self.MainSizer.Remove(panel) - panel.Destroy() - self.VariablePanelList = {} - self.CurrentPanel = None - - def UpdateVariablePanelTagName(self, old_tagname, new_tagname): - old_tagname = PouTagname(old_tagname) - new_tagname = PouTagname(new_tagname) - if old_tagname in self.VariablePanelList and old_tagname != new_tagname: - self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname) - if self.CurrentPanel == old_tagname: - self.CurrentPanel = new_tagname - - def ChangeVariablePanel(self, tagname): - tagname = PouTagname(tagname) - panel, users = self.VariablePanelList.get(tagname, (None, 0)) - if panel is None: - if self.CurrentPanel is not None: - self.VariablePanelList[self.CurrentPanel][0].Hide() - self.CurrentPanel = None - self.MainSizer.Layout() - elif tagname != self.CurrentPanel: - if self.CurrentPanel is not None: - self.VariablePanelList[self.CurrentPanel][0].Hide() - self.CurrentPanel = tagname - panel.RefreshView() - panel.Show() - self.MainSizer.Layout() - - def RefreshVariablePanel(self, tagname): - panel, users = self.VariablePanelList.get(PouTagname(tagname), (None, 0)) - if panel is not None: - panel.RefreshView() - - def AddVariableHighlight(self, infos, highlight_type): - self.ChangeVariablePanel(infos[0]) - if self.CurrentPanel is not None: - self.VariablePanelList[self.CurrentPanel][0].AddVariableHighlight(infos[2:], highlight_type) - - def ClearHighlights(self, highlight_type=None): - for panel, users in self.VariablePanelList.values(): - panel.ClearHighlights(highlight_type) - -#------------------------------------------------------------------------------- # Debug Variables Panel #-------------------------------------------------------------------------------