--- a/PLCOpenEditor.py Sun Oct 09 23:31:13 2011 +0200
+++ b/PLCOpenEditor.py Sun Oct 09 23:31:50 2011 +0200
@@ -114,6 +114,7 @@
from DataTypeEditor import *
from PLCControler import *
from VariablePanel import VariablePanel
+from SearchResultPanel import SearchResultPanel
# Define PLCOpenEditor controls id
[ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK,
@@ -135,8 +136,9 @@
# Define PLCOpenEditor EditMenu extra items id
[ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, ID_PLCOPENEDITOREDITMENUADDDATATYPE,
ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
- ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
-] = [wx.NewId() for _init_coll_EditMenu_Items in range(6)]
+ ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
+ ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT,
+] = [wx.NewId() for _init_coll_EditMenu_Items in range(7)]
#-------------------------------------------------------------------------------
@@ -330,6 +332,9 @@
AppendMenu(parent, help='', id=wx.ID_PASTE,
kind=wx.ITEM_NORMAL, text=_(u'Paste\tCTRL+V'))
parent.AppendSeparator()
+ AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT,
+ kind=wx.ITEM_NORMAL, text=_(u'Search in Project'))
+ parent.AppendSeparator()
addmenu = wx.Menu(title='')
parent.AppendMenu(wx.ID_ADD, _("Add Element"), addmenu)
AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
@@ -352,6 +357,8 @@
self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
+ self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu,
+ id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
@@ -594,6 +601,9 @@
self.VariablePanelIndexer = VariablePanelIndexer(self.BottomNoteBook, self)
self.BottomNoteBook.AddPage(self.VariablePanelIndexer, _("Variables"))
+ self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
+ self.BottomNoteBook.AddPage(self.SearchResultPanel, _("Search"))
+
self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
0), size=wx.Size(0, 0), style=0)
@@ -613,9 +623,9 @@
id=ID_PLCOPENEDITORLIBRARYTREE)
self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
- name='LibraryComment', parent=self.LibraryPanel,
- pos=wx.Point(0, 0), size=wx.Size(0, 160),
- style=wx.TE_READONLY|wx.TE_MULTILINE)
+ name='LibraryComment', parent=self.LibraryPanel,
+ pos=wx.Point(0, 0), size=wx.Size(0, 160),
+ style=wx.TE_READONLY|wx.TE_MULTILINE)
self._init_sizers()
@@ -683,7 +693,7 @@
self.CurrentToolBar = []
self.CurrentLanguage = ""
self.SelectedItem = None
- self.Errors = []
+ self.Highlights = {}
self.DrawingMode = FREEDRAWING_MODE
#self.DrawingMode = DRIVENDRAWING_MODE
if USE_AUI:
@@ -992,6 +1002,7 @@
#self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
#self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO,
# self.Controler.IsProjectBufferEnabled())
+ self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
self.EditMenu.Enable(wx.ID_ADD, True)
self.EditMenu.Enable(wx.ID_DELETE, True)
if self.TabsOpened.GetPageCount() > 0:
@@ -1015,6 +1026,7 @@
self.EditMenu.Enable(wx.ID_COPY, False)
self.EditMenu.Enable(wx.ID_PASTE, False)
self.EditMenu.Enable(wx.ID_SELECTALL, False)
+ self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, False)
self.EditMenu.Enable(wx.ID_ADD, False)
self.EditMenu.Enable(wx.ID_DELETE, False)
@@ -1086,7 +1098,15 @@
event.m_keyCode = wx.WXK_DELETE
window.ProcessEvent(event)
-
+ def OnSearchInProjectMenu(self, event):
+ dialog = SearchInProjectDialog(self)
+ if dialog.ShowModal() == wx.ID_OK:
+ criteria = dialog.GetCriteria()
+ result = self.Controler.SearchInProject(criteria)
+ self.ClearSearchResults()
+ self.SearchResultPanel.SetSearchResults(criteria, result)
+ self.BottomNoteBook.SetSelection(self.BottomNoteBook.GetPageIndex(self.SearchResultPanel))
+
#-------------------------------------------------------------------------------
# Display Menu Functions
#-------------------------------------------------------------------------------
@@ -1183,10 +1203,12 @@
if USE_AUI:
for child in self.TabsOpened.GetChildren():
if isinstance(child, wx.aui.AuiTabCtrl):
- window = child.GetWindowFromIdx(child.GetActivePage())
- window.RefreshView()
- if not window.IsDebugging() and self.TabsOpened.GetPageIndex(window) == selected and variablepanel:
- self.RefreshVariablePanel(window.GetTagName())
+ active_page = child.GetActivePage()
+ if active_page >= 0:
+ window = child.GetWindowFromIdx(child.GetActivePage())
+ 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()
@@ -1273,12 +1295,9 @@
item_name = _(item_name)
self.TypesTree.SetItemText(root, item_name)
self.TypesTree.SetPyData(root, infos["type"])
- if infos.get("tagname", None) in self.Errors:
- self.TypesTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
- self.TypesTree.SetItemTextColour(root, wx.RED)
- else:
- self.TypesTree.SetItemBackgroundColour(root, wx.WHITE)
- self.TypesTree.SetItemTextColour(root, wx.BLACK)
+ highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
+ self.TypesTree.SetItemBackgroundColour(root, highlight_colours[0])
+ self.TypesTree.SetItemTextColour(root, highlight_colours[1])
if infos["type"] == ITEM_POU:
self.TypesTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
else:
@@ -2422,32 +2441,48 @@
#-------------------------------------------------------------------------------
-# Errors showing functions
-#-------------------------------------------------------------------------------
-
- def ShowError(self, infos, start, end):
- self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
+# Highlights showing functions
+#-------------------------------------------------------------------------------
+
+ def ShowHighlight(self, infos, start, end, highlight_type):
+ print infos, start, end, highlight_type
self.SelectTypesTreeItem(infos[0])
if infos[1] == "name":
- self.Errors.append(infos[0])
+ self.Highlights[infos[0]] = highlight_type
self.RefreshTypesTree()
self.TypesTree.Unselect()
- elif infos[1] == "variable":
- self.VariablePanelIndexer.AddVariableError(infos)
else:
- selected = self.TabsOpened.GetSelection()
- if selected != -1:
- viewer = self.TabsOpened.GetPage(selected)
- viewer.AddShownError(infos[1:], start, end)
- viewer.RefreshView()
-
- def ClearErrors(self):
- self.Errors = []
+ 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)
+
+ def ShowError(self, infos, start, end):
+ self.ShowHighlight(infos, start, end, ERROR_HIGHLIGHT)
+
+ def ShowSearchResult(self, infos, start, end):
+ self.ShowHighlight(infos, start, end, SEARCH_RESULT_HIGHLIGHT)
+
+ def ClearHighlights(self, highlight_type=None):
+ if highlight_type is None:
+ self.Highlights = {}
+ else:
+ self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type])
self.RefreshTypesTree()
- self.VariablePanelIndexer.ClearErrors()
+ self.VariablePanelIndexer.ClearHighlights(highlight_type)
for i in xrange(self.TabsOpened.GetPageCount()):
viewer = self.TabsOpened.GetPage(i)
- viewer.ClearErrors()
+ viewer.ClearHighlights(highlight_type)
+
+ def ClearErrors(self):
+ self.ClearHighlights(ERROR_HIGHLIGHT)
+
+ def ClearSearchResults(self):
+ self.ClearHighlights(SEARCH_RESULT_HIGHLIGHT)
#-------------------------------------------------------------------------------
# PLCOpenEditor Main Class
@@ -3814,6 +3849,12 @@
# 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):
@@ -3837,58 +3878,72 @@
self.CurrentPanel = None
def AddVariablePanel(self, tagname, element_type):
- new_panel = VariablePanel(self, self.ParentWindow, self.ParentWindow.Controler, element_type)
- new_panel.SetTagName(tagname)
- new_panel.Hide()
- new_panel.RefreshView()
- self.MainSizer.AddWindow(new_panel, 1, border=0, flag=wx.GROW)
- self.VariablePanelList[tagname] = new_panel
+ 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):
- if tagname in self.VariablePanelList:
- panel = self.VariablePanelList.pop(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()
- if self.CurrentPanel == tagname:
- self.CurrentPanel = None
-
- def RemoveAllPanels(self):
- for tagname in self.VariablePanelList.keys():
- self.RemoveVariablePanel(tagname)
+ self.VariablePanelList = {}
+ self.CurrentPanel = None
def UpdateVariablePanelTagName(self, old_tagname, new_tagname):
- if old_tagname in self.VariablePanelList:
+ 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):
- if tagname in self.VariablePanelList:
- if tagname != self.CurrentPanel:
- if self.CurrentPanel is not None:
- self.VariablePanelList[self.CurrentPanel].Hide()
- self.CurrentPanel = tagname
- self.VariablePanelList[self.CurrentPanel].RefreshView()
- self.VariablePanelList[self.CurrentPanel].Show()
- self.MainSizer.Layout()
- else:
+ 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].Hide()
+ 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):
- if tagname in self.VariablePanelList:
- self.VariablePanelList[self.CurrentPanel].RefreshView()
-
- def AddVariableError(self, infos):
+ 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].AddVariableError(infos[2:])
-
- def ClearErrors(self):
- for panel in self.VariablePanelList.values():
- panel.ClearErrors()
+ 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