--- 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
#-------------------------------------------------------------------------------