diff -r 37882f34f9cb -r f10449b18dbe PLCOpenEditor.py --- a/PLCOpenEditor.py Sat May 12 12:33:17 2012 +0200 +++ b/PLCOpenEditor.py Fri May 18 18:49:49 2012 +0200 @@ -114,18 +114,18 @@ from DataTypeEditor import * from PLCControler import * from SearchResultPanel import SearchResultPanel -from controls import CustomGrid, CustomTable, LibraryPanel +from controls import CustomGrid, CustomTable, CustomTree, LibraryPanel, PouInstanceVariablesPanel # Define PLCOpenEditor controls id [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, - ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, - ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, - ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, - ID_PLCOPENEDITORLIBRARYSEARCHCTRL, ID_PLCOPENEDITORLIBRARYTREE, - ID_PLCOPENEDITORLIBRARYCOMMENT, ID_PLCOPENEDITORTABSOPENED, - ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITOREDITORMENUTOOLBAR, - ID_PLCOPENEDITOREDITORTOOLBAR, + ID_PLCOPENEDITORPROJECTTREE, ID_PLCOPENEDITORMAINSPLITTER, + ID_PLCOPENEDITORSECONDSPLITTER, ID_PLCOPENEDITORTHIRDSPLITTER, + ID_PLCOPENEDITORLIBRARYPANEL, ID_PLCOPENEDITORLIBRARYSEARCHCTRL, + ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, + ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED, + ID_PLCOPENEDITOREDITORMENUTOOLBAR, ID_PLCOPENEDITOREDITORTOOLBAR, + ID_PLCOPENEDITORPROJECTPANEL, ] = [wx.NewId() for _init_ctrls in range(17)] # Define PLCOpenEditor FileMenu extra items id @@ -270,8 +270,8 @@ else: parent.Append(helpString=help, id=id, kind=kind, item=text) -[TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, TYPESTREE, - INSTANCESTREE, LIBRARYTREE, SCALING, PAGETITLES +[TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE, + POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES ] = range(10) def GetShortcutKeyCallbackFunction(viewer_function): @@ -295,10 +295,10 @@ def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None): def DeleteElementFunction(self, selected): - name = self.TypesTree.GetItemText(selected) + name = self.ProjectTree.GetItemText(selected) if check_function is None or not check_function(self.Controler, name): if parent_type is not None: - parent_name = GetParentName(self.TypesTree, selected, parent_type) + parent_name = GetParentName(self.ProjectTree, selected, parent_type) remove_function(self.Controler, parent_name, name) else: remove_function(self.Controler, name) @@ -412,6 +412,18 @@ def _init_coll_FileMenu_Items(self, parent): pass + def _init_coll_AddMenu_Items(self, parent): + AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE, + kind=wx.ITEM_NORMAL, text=_(u'&Data Type')) + AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION, + kind=wx.ITEM_NORMAL, text=_(u'&Function')) + AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, + kind=wx.ITEM_NORMAL, text=_(u'Function &Block')) + AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM, + kind=wx.ITEM_NORMAL, text=_(u'&Program')) + AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, + kind=wx.ITEM_NORMAL, text=_(u'&Configuration')) + def _init_coll_EditMenu_Items(self, parent): AppendMenu(parent, help='', id=wx.ID_UNDO, kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z')) @@ -431,18 +443,9 @@ AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, kind=wx.ITEM_NORMAL, text=_(u'Search in Project\tCTRL+F')) parent.AppendSeparator() - addmenu = wx.Menu(title='') - parent.AppendMenu(wx.ID_ADD, _(u"&Add Element"), addmenu) - AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE, - kind=wx.ITEM_NORMAL, text=_(u'&Data Type')) - AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION, - kind=wx.ITEM_NORMAL, text=_(u'&Function')) - AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, - kind=wx.ITEM_NORMAL, text=_(u'Function &Block')) - AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM, - kind=wx.ITEM_NORMAL, text=_(u'&Program')) - AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, - kind=wx.ITEM_NORMAL, text=_(u'&Configuration')) + add_menu = wx.Menu(title='') + self._init_coll_AddMenu_Items(add_menu) + parent.AppendMenu(wx.ID_ADD, _(u"&Add Element"), add_menu) AppendMenu(parent, help='', id=wx.ID_SELECTALL, kind=wx.ITEM_NORMAL, text=_(u'Select All\tCTRL+A')) AppendMenu(parent, help='', id=wx.ID_DELETE, @@ -546,7 +549,7 @@ self.OnAllowNotebookDnD) self.AUIManager.AddPane(self.LeftNoteBook, wx.aui.AuiPaneInfo().Name("ProjectPane"). - Caption(_("Project")).Left().Layer(1). + Left().Layer(1). BestSize(wx.Size(300, 500)).CloseButton(False)) self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK, @@ -638,56 +641,52 @@ self.MainTabs = {} - self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE, - name='TypesTree', parent=self.LeftNoteBook, + self.ProjectPanel = wx.SplitterWindow(id=ID_PLCOPENEDITORPROJECTPANEL, + name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0), + size=wx.Size(0, 0), style=wx.SP_3D) + + self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE, + name='ProjectTree', parent=self.ProjectPanel, pos=wx.Point(0, 0), size=wx.Size(0, 0), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS) + self.ProjectTree.SetBackgroundBitmap(wx.Bitmap(os.path.join(CWD, 'Images', 'custom_tree_background.png')), + wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM) + add_menu = wx.Menu() + self._init_coll_AddMenu_Items(add_menu) + self.ProjectTree.SetAddMenu(add_menu) if wx.Platform == '__WXMSW__': - self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp, - id=ID_PLCOPENEDITORTYPESTREE) - self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected, - id=ID_PLCOPENEDITORTYPESTREE) + self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp, + id=ID_PLCOPENEDITORPROJECTTREE) + self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnProjectTreeItemSelected, + id=ID_PLCOPENEDITORPROJECTTREE) else: if wx.VERSION >= (2, 6, 0): - self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp) - self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp) + self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp) + self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp) else: - wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp) - wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp) - self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging, - id=ID_PLCOPENEDITORTYPESTREE) - self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag, - id=ID_PLCOPENEDITORTYPESTREE) - self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit, - id=ID_PLCOPENEDITORTYPESTREE) - self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit, - id=ID_PLCOPENEDITORTYPESTREE) - self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated, - id=ID_PLCOPENEDITORTYPESTREE) - - self.MainTabs["TypesTree"] = (self.TypesTree, _("Types")) - self.LeftNoteBook.AddPage(*self.MainTabs["TypesTree"]) + wx.EVT_RIGHT_UP(self.ProjectTree, self.OnProjectTreeRightUp) + wx.EVT_LEFT_UP(self.ProjectTree, self.OnProjectTreeLeftUp) + self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging, + id=ID_PLCOPENEDITORPROJECTTREE) + self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag, + id=ID_PLCOPENEDITORPROJECTTREE) + self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit, + id=ID_PLCOPENEDITORPROJECTTREE) + self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit, + id=ID_PLCOPENEDITORPROJECTTREE) + self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated, + id=ID_PLCOPENEDITORPROJECTTREE) #----------------------------------------------------------------------- - # Creating PLCopen Project Instances Tree + # Creating PLCopen Project POU Instance Variables Panel #----------------------------------------------------------------------- - self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE, - name='InstancesTree', parent=self.LeftNoteBook, - pos=wx.Point(0, 0), size=wx.Size(0, 0), - style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER) - if self.EnableDebug: - if wx.VERSION >= (2, 6, 0): - self.InstancesTree.Bind(wx.EVT_RIGHT_UP, self.OnInstancesTreeRightUp) - else: - wx.EVT_RIGHT_UP(self.InstancesTree, self.OnInstancesTreeRightUp) - self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag, - id=ID_PLCOPENEDITORINSTANCESTREE) - self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated, - id=ID_PLCOPENEDITORINSTANCESTREE) - - self.MainTabs["InstancesTree"] = (self.InstancesTree, _("Instances")) - self.LeftNoteBook.AddPage(*self.MainTabs["InstancesTree"]) + self.PouInstanceVariablesPanel = PouInstanceVariablesPanel(self.ProjectPanel, self, self.Controler, self.EnableDebug) + + self.MainTabs["ProjectPanel"] = (self.ProjectPanel, _("Project")) + self.LeftNoteBook.AddPage(*self.MainTabs["ProjectPanel"]) + + self.ProjectPanel.SplitHorizontally(self.ProjectTree, self.PouInstanceVariablesPanel, 300) #----------------------------------------------------------------------- # Creating Tool Bar @@ -805,8 +804,8 @@ self.TreeImageDict[itemtype]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%imgname))) # Assign icon list to TreeCtrls - self.TypesTree.SetImageList(self.TreeImageList) - self.InstancesTree.SetImageList(self.TreeImageList) + self.ProjectTree.SetImageList(self.TreeImageList) + self.PouInstanceVariablesPanel.SetTreeImageList(self.TreeImageList) self.CurrentEditorToolBar = [] self.CurrentMenu = None @@ -928,13 +927,9 @@ return notebook.GetPageIndex(page_ref) elif page_infos[0] == "debug": instance_path = page_infos[1] - item = self.GetInstancesTreeItem(self.InstancesTree.GetRootItem(), instance_path) - item_infos = self.InstancesTree.GetPyData(item) - if item_infos[1] is not None: - instance_type = item_infos[1] - else: - instance_type = self.InstancesTree.GetItemText(item).split(" (")[1].split(")")[0] - return notebook.GetPageIndex(self.OpenDebugViewer(item_infos[0], instance_path, instance_type)) + instance_infos = self.Controler.GetInstanceInfos(instance_path) + if instance_infos is not None: + return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"])) return None def LoadTabOrganization(self, notebook, tabs, mode="all", first_index=None): @@ -1093,8 +1088,8 @@ FILEMENU : self.RefreshFileMenu, EDITMENU : self.RefreshEditMenu, DISPLAYMENU : self.RefreshDisplayMenu, - TYPESTREE : self.RefreshTypesTree, - INSTANCESTREE : self.RefreshInstancesTree, + PROJECTTREE : self.RefreshProjectTree, + POUINSTANCEVARIABLESPANEL : self.RefreshPouInstanceVariablesPanel, LIBRARYTREE : self.RefreshLibraryPanel, SCALING : self.RefreshScaling, PAGETITLES: self.RefreshPageTitles} @@ -1149,7 +1144,7 @@ editor = self.TabsOpened.GetPage(i) editor.RefreshScaling() - def ShowProperties(self): + def EditProjectSettings(self): old_values = self.Controler.GetProjectProperties() dialog = ProjectDialog(self) dialog.SetValues(old_values) @@ -1159,7 +1154,7 @@ if new_values != old_values: self.Controler.SetProjectProperties(None, new_values) self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, - TYPESTREE, INSTANCESTREE, SCALING) + PROJECTTREE, POUINSTANCEVARIABLESPANEL, SCALING) dialog.Destroy() #------------------------------------------------------------------------------- @@ -1281,8 +1276,8 @@ def ResetView(self): self.DeleteAllPages() - self.TypesTree.DeleteAllItems() - self.InstancesTree.DeleteAllItems() + self.ProjectTree.DeleteAllItems() + self.PouInstanceVariablesPanel.ResetView() self.LibraryPanel.ResetTree() self.LibraryPanel.SetControler(None) self.Controler = None @@ -1429,7 +1424,7 @@ window.Undo() else: self.Controler.LoadPrevious() - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES) def OnRedoMenu(self, event): @@ -1439,7 +1434,7 @@ window.Redo() else: self.Controler.LoadNext() - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES) def OnEnableUndoRedoMenu(self, event): @@ -1472,16 +1467,16 @@ def OnDeleteMenu(self, event): window = self.FindFocus() - if window == self.TypesTree or window is None: - selected = self.TypesTree.GetSelection() + if window == self.ProjectTree or window is None: + selected = self.ProjectTree.GetSelection() if selected.IsOk(): - type = self.TypesTree.GetPyData(selected) + type = self.ProjectTree.GetPyData(selected) function = self.DeleteFunctions.get(type, None) if function is not None: function(self, selected) self.CloseTabsWithoutModel() - self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE, - INSTANCESTREE, LIBRARYTREE) + self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, + POUINSTANCEVARIABLESPANEL, LIBRARYTREE) elif isinstance(window, (Viewer, TextViewer)): event = wx.KeyEvent(wx.EVT_CHAR._getEvtType()) event.m_keyCode = wx.WXK_DELETE @@ -1587,11 +1582,14 @@ selected = self.TabsOpened.GetSelection() if selected >= 0: window = self.TabsOpened.GetPage(selected) + tagname = window.GetTagName() if not window.IsDebugging(): - wx.CallAfter(self.SelectTypesTreeItem, window.GetTagName()) + wx.CallAfter(self.SelectProjectTreeItem, tagname) + wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname) window.RefreshView() else: - wx.CallAfter(self.SelectInstancesTreeItem, window.GetInstancePath()) + instance_path = window.GetInstancePath() + wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path) wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR) event.Skip() @@ -1600,9 +1598,9 @@ if selected >= 0: window = self.TabsOpened.GetPage(selected) if not window.IsDebugging(): - self.SelectTypesTreeItem(window.GetTagName()) + self.SelectProjectTreeItem(window.GetTagName()) else: - self.SelectInstancesTreeItem(window.GetInstancePath()) + self.PouInstanceVariablesPanel.SetPouType(window.GetTagName(), window.GetInstancePath()) if USE_AUI: for child in self.TabsOpened.GetChildren(): if isinstance(child, wx.aui.AuiTabCtrl): @@ -1651,109 +1649,112 @@ # Types Tree Management Functions #------------------------------------------------------------------------------- - def RefreshTypesTree(self): + def RefreshProjectTree(self): infos = self.Controler.GetProjectInfos() - root = self.TypesTree.GetRootItem() + root = self.ProjectTree.GetRootItem() if not root.IsOk(): - root = self.TypesTree.AddRoot(infos["name"]) - self.GenerateTypesTreeBranch(root, infos) - self.TypesTree.Expand(root) + root = self.ProjectTree.AddRoot(infos["name"]) + self.GenerateProjectTreeBranch(root, infos) + self.ProjectTree.Expand(root) def ResetSelectedItem(self): self.SelectedItem = None - def GenerateTypesTreeBranch(self, root, infos, topology=False): + def GenerateProjectTreeBranch(self, root, infos): to_delete = [] item_name = infos["name"] if infos["type"] in ITEMS_UNEDITABLE: - item_name = _(item_name) - self.TypesTree.SetItemText(root, item_name) - self.TypesTree.SetPyData(root, infos["type"]) + if len(infos["values"]) == 1: + return self.GenerateProjectTreeBranch(root, infos["values"][0]) + item_name = _(item_name) + self.ProjectTree.SetItemText(root, item_name) + self.ProjectTree.SetPyData(root, infos["type"]) 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]) + self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0]) + self.ProjectTree.SetItemTextColour(root, highlight_colours[1]) if infos["type"] == ITEM_POU: - self.TypesTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])]) + self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])]) else: - self.TypesTree.SetItemImage(root, self.TreeImageDict[infos["type"]]) + self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]]) if wx.VERSION >= (2, 6, 0): - item, root_cookie = self.TypesTree.GetFirstChild(root) + item, root_cookie = self.ProjectTree.GetFirstChild(root) else: - item, root_cookie = self.TypesTree.GetFirstChild(root, 0) + item, root_cookie = self.ProjectTree.GetFirstChild(root, 0) for values in infos["values"]: - if not item.IsOk(): - item = self.TypesTree.AppendItem(root, "") - if wx.Platform != '__WXMSW__': - item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie) - self.GenerateTypesTreeBranch(item, values) - item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie) + if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0: + if not item.IsOk(): + item = self.ProjectTree.AppendItem(root, "") + if wx.Platform != '__WXMSW__': + item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) + self.GenerateProjectTreeBranch(item, values) + item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) while item.IsOk(): to_delete.append(item) - item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie) + item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) for item in to_delete: - self.TypesTree.Delete(item) - - def SelectTypesTreeItem(self, tagname): - if self.TypesTree is not None: - root = self.TypesTree.GetRootItem() + self.ProjectTree.Delete(item) + + def SelectProjectTreeItem(self, tagname): + if self.ProjectTree is not None: + root = self.ProjectTree.GetRootItem() if root.IsOk(): words = tagname.split("::") if words[0] == "D": - return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_DATATYPE)]) + return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_DATATYPE)]) elif words[0] == "P": - return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU)]) + return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU)]) elif words[0] == "T": - return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)]) + return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)]) elif words[0] == "A": - return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)]) + return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)]) elif words[0] == "C": - return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)]) + return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)]) elif words[0] == "R": - return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)]) + return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)]) return False - def RecursiveTypesTreeItemSelection(self, root, items): + def RecursiveProjectTreeItemSelection(self, root, items): found = False if wx.VERSION >= (2, 6, 0): - item, root_cookie = self.TypesTree.GetFirstChild(root) + item, root_cookie = self.ProjectTree.GetFirstChild(root) else: - item, root_cookie = self.TypesTree.GetFirstChild(root, 0) + item, root_cookie = self.ProjectTree.GetFirstChild(root, 0) while item.IsOk() and not found: - if (self.TypesTree.GetItemText(item), self.TypesTree.GetPyData(item)) == items[0]: + if (self.ProjectTree.GetItemText(item), self.ProjectTree.GetPyData(item)) == items[0]: if len(items) == 1: self.SelectedItem = item - self.TypesTree.SelectItem(item) + self.ProjectTree.SelectItem(item) wx.CallAfter(self.ResetSelectedItem) return True else: - found = self.RecursiveTypesTreeItemSelection(item, items[1:]) + found = self.RecursiveProjectTreeItemSelection(item, items[1:]) else: - found = self.RecursiveTypesTreeItemSelection(item, items) - item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie) + found = self.RecursiveProjectTreeItemSelection(item, items) + item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) return found - def OnTypesTreeBeginDrag(self, event): + def OnProjectTreeBeginDrag(self, event): if wx.Platform == '__WXMSW__': self.SelectedItem = event.GetItem() - if self.SelectedItem is not None and self.TypesTree.GetPyData(self.SelectedItem) == ITEM_POU: - block_name = self.TypesTree.GetItemText(self.SelectedItem) + if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem) == ITEM_POU: + block_name = self.ProjectTree.GetItemText(self.SelectedItem) block_type = self.Controler.GetPouType(block_name) if block_type != "program": data = wx.TextDataObject(str((block_name, block_type, ""))) - dragSource = wx.DropSource(self.TypesTree) + dragSource = wx.DropSource(self.ProjectTree) dragSource.SetData(data) dragSource.DoDragDrop() self.ResetSelectedItem() - def OnTypesTreeItemBeginEdit(self, event): + def OnProjectTreeItemBeginEdit(self, event): selected = event.GetItem() - if self.TypesTree.GetPyData(selected) in ITEMS_UNEDITABLE: + if self.ProjectTree.GetPyData(selected) in ITEMS_UNEDITABLE: event.Veto() else: event.Skip() - def OnTypesTreeItemEndEdit(self, event): + def OnProjectTreeItemEndEdit(self, event): message = None abort = False new_name = event.GetLabel() @@ -1764,8 +1765,8 @@ message = _("\"%s\" is a keyword. It can't be used!")%new_name else: item = event.GetItem() - old_name = self.TypesTree.GetItemText(item) - itemtype = self.TypesTree.GetPyData(item) + old_name = self.ProjectTree.GetItemText(item) + itemtype = self.ProjectTree.GetPyData(item) if itemtype == ITEM_PROJECT: self.Controler.SetProjectProperties(name = new_name) elif itemtype == ITEM_DATATYPE: @@ -1793,7 +1794,7 @@ self.RefreshLibraryPanel() self.RefreshPageTitles() elif itemtype == ITEM_TRANSITION: - pou_name = GetParentName(self.TypesTree, item, ITEM_POU) + pou_name = GetParentName(self.ProjectTree, item, ITEM_POU) if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: message = _("A POU named \"%s\" already exists!")%new_name elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]: @@ -1804,7 +1805,7 @@ self.Controler.ComputePouTransitionName(pou_name, new_name)) self.RefreshPageTitles() elif itemtype == ITEM_ACTION: - pou_name = GetParentName(self.TypesTree, item, ITEM_POU) + pou_name = GetParentName(self.ProjectTree, item, ITEM_POU) if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: message = _("A POU named \"%s\" already exists!")%new_name elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]: @@ -1834,7 +1835,7 @@ self.Controler.ComputeConfigurationName(new_name)) self.RefreshPageTitles() elif itemtype == ITEM_RESOURCE: - config_name = GetParentName(self.TypesTree, item, ITEM_CONFIGURATION) + config_name = GetParentName(self.ProjectTree, item, ITEM_CONFIGURATION) if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]: message = _("\"%s\" config already exists!")%new_name abort = True @@ -1857,31 +1858,31 @@ if message: self.ShowErrorMessage(message) item = event.GetItem() - wx.CallAfter(self.TypesTree.EditLabel, item) + wx.CallAfter(self.ProjectTree.EditLabel, item) event.Veto() else: - wx.CallAfter(self.RefreshTypesTree) + wx.CallAfter(self.RefreshProjectTree) self.RefreshEditor() self._Refresh(TITLE, FILEMENU, EDITMENU) event.Skip() - def OnTypesTreeItemActivated(self, event): + def OnProjectTreeItemActivated(self, event): selected = event.GetItem() - name = self.TypesTree.GetItemText(selected) - data = self.TypesTree.GetPyData(selected) - if UNEDITABLE_NAMES_DICT.get(name, name) == "Properties": - self.ShowProperties() - if data == ITEM_DATATYPE: + name = self.ProjectTree.GetItemText(selected) + data = self.ProjectTree.GetPyData(selected) + if data == ITEM_PROJECT: + self.EditProjectSettings() + elif data == ITEM_DATATYPE: self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name)) elif data == ITEM_POU: self.EditProjectElement(data, self.Controler.ComputePouName(name)) elif data == ITEM_CONFIGURATION: self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name)) elif data == ITEM_RESOURCE: - config_name = GetParentName(self.TypesTree, selected, ITEM_CONFIGURATION) + config_name = GetParentName(self.ProjectTree, selected, ITEM_CONFIGURATION) self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name)) elif data in [ITEM_TRANSITION, ITEM_ACTION]: - pou_name = GetParentName(self.TypesTree, selected, ITEM_POU) + pou_name = GetParentName(self.ProjectTree, selected, ITEM_POU) if data == ITEM_TRANSITION: tagname = self.Controler.ComputePouTransitionName(pou_name, name) elif data == ITEM_ACTION: @@ -1889,39 +1890,42 @@ self.EditProjectElement(data, tagname) event.Skip() - def TypesTreeItemSelect(self, select_item): - name = self.TypesTree.GetItemText(select_item) - data = self.TypesTree.GetPyData(select_item) + def ProjectTreeItemSelect(self, select_item): + name = self.ProjectTree.GetItemText(select_item) + data = self.ProjectTree.GetPyData(select_item) + tagname = None if data == ITEM_DATATYPE: - self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name), True) + tagname = self.Controler.ComputeDataTypeName(name) elif data == ITEM_POU: - self.EditProjectElement(data, self.Controler.ComputePouName(name), True) + tagname = self.Controler.ComputePouName(name) elif data == ITEM_CONFIGURATION: - self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True) + tagname = self.Controler.ComputeConfigurationName(name) elif data == ITEM_RESOURCE: - config_name = GetParentName(self.TypesTree, select_item, ITEM_CONFIGURATION) - self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name), True) + config_name = GetParentName(self.ProjectTree, select_item, ITEM_CONFIGURATION) + tagname = self.Controler.ComputeConfigurationResourceName(config_name, name) elif data in [ITEM_TRANSITION, ITEM_ACTION]: - pou_name = GetParentName(self.TypesTree, select_item, ITEM_POU) + pou_name = GetParentName(self.ProjectTree, select_item, ITEM_POU) if data == ITEM_TRANSITION: tagname = self.Controler.ComputePouTransitionName(pou_name, name) elif data == ITEM_ACTION: tagname = self.Controler.ComputePouActionName(pou_name, name) + if tagname is not None: self.EditProjectElement(data, tagname, True) - - def OnTypesTreeLeftUp(self, event): + self.PouInstanceVariablesPanel.SetPouType(tagname) + + def OnProjectTreeLeftUp(self, event): if self.SelectedItem is not None: - self.TypesTree.SelectItem(self.SelectedItem) - self.TypesTreeItemSelect(self.SelectedItem) + self.ProjectTree.SelectItem(self.SelectedItem) + self.ProjectTreeItemSelect(self.SelectedItem) wx.CallAfter(self.ResetSelectedItem) event.Skip() - def OnTypesTreeItemSelected(self, event): - self.TypesTreeItemSelect(event.GetItem()) + def OnProjectTreeItemSelected(self, event): + self.ProjectTreeItemSelect(event.GetItem()) event.Skip() - def OnTypesTreeItemChanging(self, event): - if self.TypesTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None: + def OnProjectTreeItemChanging(self, event): + if self.ProjectTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None: self.SelectedItem = event.GetItem() event.Veto() else: @@ -2000,15 +2004,15 @@ self.RefreshPageTitles() return new_window - def OnTypesTreeRightUp(self, event): + def OnProjectTreeRightUp(self, event): if wx.Platform == '__WXMSW__': item = event.GetItem() else: - item, flags = self.TypesTree.HitTest(wx.Point(event.GetX(), event.GetY())) - self.TypesTree.SelectItem(item) - self.TypesTreeItemSelect(item) - name = self.TypesTree.GetItemText(item) - type = self.TypesTree.GetPyData(item) + item, flags = self.ProjectTree.HitTest(wx.Point(event.GetX(), event.GetY())) + self.ProjectTree.SelectItem(item) + self.ProjectTreeItemSelect(item) + name = self.ProjectTree.GetItemText(item) + type = self.ProjectTree.GetPyData(item) menu = None if type in ITEMS_UNEDITABLE: @@ -2043,34 +2047,34 @@ menu = wx.Menu(title='') new_id = wx.NewId() AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition")) - parent = self.TypesTree.GetItemParent(item) - parent_type = self.TypesTree.GetPyData(parent) + parent = self.ProjectTree.GetItemParent(item) + parent_type = self.ProjectTree.GetPyData(parent) while parent_type != ITEM_POU: - parent = self.TypesTree.GetItemParent(parent) - parent_type = self.TypesTree.GetPyData(parent) - self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.TypesTree.GetItemText(parent)), id=new_id) + parent = self.ProjectTree.GetItemParent(parent) + parent_type = self.ProjectTree.GetPyData(parent) + self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id) elif name == "Actions": menu = wx.Menu(title='') new_id = wx.NewId() AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action")) - parent = self.TypesTree.GetItemParent(item) - parent_type = self.TypesTree.GetPyData(parent) + parent = self.ProjectTree.GetItemParent(item) + parent_type = self.ProjectTree.GetPyData(parent) while parent_type != ITEM_POU: - parent = self.TypesTree.GetItemParent(parent) - parent_type = self.TypesTree.GetPyData(parent) - self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.TypesTree.GetItemText(parent)), id=new_id) + parent = self.ProjectTree.GetItemParent(parent) + parent_type = self.ProjectTree.GetPyData(parent) + self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id) elif name == "Resources": menu = wx.Menu(title='') new_id = wx.NewId() AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource")) - parent = self.TypesTree.GetItemParent(item) - parent_type = self.TypesTree.GetPyData(parent) + parent = self.ProjectTree.GetItemParent(item) + parent_type = self.ProjectTree.GetPyData(parent) while parent_type != ITEM_CONFIGURATION: - parent = self.TypesTree.GetItemParent(parent) - parent_type = self.TypesTree.GetPyData(parent) - self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.TypesTree.GetItemText(parent)), id=new_id) + parent = self.ProjectTree.GetItemParent(parent) + parent_type = self.ProjectTree.GetPyData(parent) + self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.ProjectTree.GetItemText(parent)), id=new_id) else: if type == ITEM_POU: @@ -2128,83 +2132,11 @@ # Instances Tree Management Functions #------------------------------------------------------------------------------- - def RefreshInstancesTree(self): - infos = self.Controler.GetProjectTopology(self.EnableDebug) - root = self.InstancesTree.GetRootItem() - if not root.IsOk(): - root = self.InstancesTree.AddRoot(infos["name"]) - self.GenerateInstancesTreeBranch(root, infos) - self.InstancesTree.Expand(root) - - def GenerateInstancesTreeBranch(self, root, infos): - to_delete = [] - if infos.get("elmt_type", None) is not None: - self.InstancesTree.SetItemText(root, "%s (%s)"%(infos["name"], infos["elmt_type"])) - else: - self.InstancesTree.SetItemText(root, infos["name"]) - self.InstancesTree.SetPyData(root, (infos["type"], infos.get("tagname", None))) - self.InstancesTree.SetItemImage(root, self.TreeImageDict[infos["type"]]) - - if wx.VERSION >= (2, 6, 0): - item, root_cookie = self.InstancesTree.GetFirstChild(root) - else: - item, root_cookie = self.InstancesTree.GetFirstChild(root, 0) - for values in infos["values"]: - if not item.IsOk(): - item = self.InstancesTree.AppendItem(root, "") - if wx.Platform != '__WXMSW__': - item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie) - self.GenerateInstancesTreeBranch(item, values) - item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie) - while item.IsOk(): - to_delete.append(item) - item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie) - for item in to_delete: - self.InstancesTree.Delete(item) - if infos["type"] in [ITEM_CONFIGURATION, ITEM_RESOURCE]: - self.InstancesTree.Expand(root) - - def OnInstancesTreeBeginDrag(self, event): - if self.Controler.DebugAvailable(): - selected_item = event.GetItem() - selected_infos = self.InstancesTree.GetPyData(selected_item) - if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: - var_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0] - parent_item = self.InstancesTree.GetItemParent(selected_item) - while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: - parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] - var_path = "%s.%s"%(parent_name, var_path) - parent_item = self.InstancesTree.GetItemParent(parent_item) - data = wx.TextDataObject(str((var_path, "debug"))) - dragSource = wx.DropSource(self.InstancesTree) - dragSource.SetData(data) - dragSource.DoDragDrop() - event.Skip() - else: - event.Veto() - - def OnInstancesTreeItemActivated(self, event): - if self.Controler.DebugAvailable(): - selected_item = event.GetItem() - selected_infos = self.InstancesTree.GetPyData(selected_item) - if selected_item is not None and ( - selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION] or - selected_infos[0] in ITEMS_VARIABLE): - - instance_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (") - if selected_infos[1] is not None: - instance_type = selected_infos[1] - else: - instance_type = var_type.split(")")[0] - parent_item = self.InstancesTree.GetItemParent(selected_item) - while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: - parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] - instance_path = "%s.%s"%(parent_name, instance_path) - parent_item = self.InstancesTree.GetItemParent(parent_item) - - self.OpenDebugViewer(selected_infos[0], instance_path, instance_type) - - event.Skip() + def GetTreeImage(self, var_class): + return self.TreeImageDict[var_class] + + def RefreshPouInstanceVariablesPanel(self): + self.PouInstanceVariablesPanel.RefreshView() def OpenDebugViewer(self, instance_category, instance_path, instance_type): openedidx = self.IsOpened(instance_path) @@ -2271,66 +2203,6 @@ self.RefreshPageTitles() return new_window - def OnInstancesTreeRightUp(self, event): - if self.Controler.DebugAvailable(): - if wx.Platform == '__WXMSW__': - selected_item = event.GetItem() - else: - selected_item = self.InstancesTree.GetSelection() - selected_infos = self.InstancesTree.GetPyData(selected_item) - if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: - var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (") - var_type = var_type.split(")")[0] - - if self.Controler.IsOfType(var_type, "ANY_NUM", True) or\ - self.Controler.IsOfType(var_type, "ANY_BIT", True): - parent_item = self.InstancesTree.GetItemParent(selected_item) - while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: - parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] - var_path = "%s.%s"%(parent_name, var_path) - parent_item = self.InstancesTree.GetItemParent(parent_item) - - menu = wx.Menu(title='') - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Graphic Panel")) - self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id) - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("CSV Log")) - self.PopupMenu(menu) - event.Skip() - - def AddVariableGraphicFunction(self, iec_path): - def AddVariableGraphic(event): - self.OpenGraphicViewer(iec_path) - event.Skip() - return AddVariableGraphic - - def GetInstancesTreeItem(self, root, instancepath): - paths = instancepath.split(".", 1) - if wx.VERSION >= (2, 6, 0): - item, root_cookie = self.InstancesTree.GetFirstChild(root) - else: - item, root_cookie = self.InstancesTree.GetFirstChild(root, 0) - while item.IsOk(): - name = self.InstancesTree.GetItemText(item).split(" (")[0] - if name == paths[0]: - if len(paths) == 1: - return item - else: - return self.GetInstancesTreeItem(item, paths[1]) - item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie) - return None - - def SelectInstancesTreeItem(self, instancepath): - if self.InstancesTree is not None: - root = self.InstancesTree.GetRootItem() - if root.IsOk(): - item = self.GetInstancesTreeItem(root, instancepath) - if item is not None: - self.InstancesTree.SelectItem(item) - return True - return False - def ResetGraphicViewers(self): for i in xrange(self.TabsOpened.GetPageCount()): editor = self.TabsOpened.GetPage(i) @@ -2341,18 +2213,11 @@ if self.EnableDebug: idxs = range(self.TabsOpened.GetPageCount()) idxs.reverse() - root = None - if self.InstancesTree is not None: - root = self.InstancesTree.GetRootItem() - if not root.IsOk(): - root = None for idx in idxs: editor = self.TabsOpened.GetPage(idx) if editor.IsDebugging(): - item = None - if root is not None: - item = self.GetInstancesTreeItem(root, editor.GetInstancePath()) - if item is None: + instance_infos = self.Controler.GetInstanceInfos(editor.GetInstancePath()) + if instance_infos is None: self.TabsOpened.DeletePage(idx) elif isinstance(editor, GraphicViewer): editor.ResetView(True) @@ -2360,9 +2225,9 @@ editor.RefreshView() self.DebugVariablePanel.UnregisterObsoleteData() - def AddDebugVariable(self, iec_path): + def AddDebugVariable(self, iec_path, force=False): if self.EnableDebug: - self.DebugVariablePanel.InsertValue(iec_path) + self.DebugVariablePanel.InsertValue(iec_path, force=force) #------------------------------------------------------------------------------- # Library Panel Management Function @@ -2603,7 +2468,7 @@ if dialog.ShowModal() == wx.ID_OK: tagname = self.Controler.ProjectAddDataType(dialog.GetValue()) if tagname is not None: - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE) self.EditProjectElement(ITEM_DATATYPE, tagname) dialog.Destroy() @@ -2616,7 +2481,7 @@ values = dialog.GetValues() tagname = self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"]) if tagname is not None: - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, LIBRARYTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE) self.EditProjectElement(ITEM_POU, tagname) dialog.Destroy() return OnAddPouMenu @@ -2630,7 +2495,7 @@ values = dialog.GetValues() tagname = self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"]) if tagname is not None: - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE) self.EditProjectElement(ITEM_TRANSITION, tagname) dialog.Destroy() return OnAddTransitionMenu @@ -2644,7 +2509,7 @@ values = dialog.GetValues() tagname = self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"]) if tagname is not None: - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE) self.EditProjectElement(ITEM_ACTION, tagname) dialog.Destroy() return OnAddActionMenu @@ -2657,7 +2522,7 @@ value = dialog.GetValue() tagname = self.Controler.ProjectAddConfiguration(value) if tagname is not None: - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL) self.EditProjectElement(ITEM_CONFIGURATION, tagname) dialog.Destroy() @@ -2670,22 +2535,22 @@ value = dialog.GetValue() tagname = self.Controler.ProjectAddConfigurationResource(config_name, value) if tagname is not None: - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL) self.EditProjectElement(ITEM_RESOURCE, tagname) dialog.Destroy() return OnAddResourceMenu def GenerateChangePouTypeFunction(self, name, new_type): def OnChangePouTypeMenu(event): - selected = self.TypesTree.GetSelection() - if self.TypesTree.GetPyData(selected) == ITEM_POU: + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_POU: self.Controler.ProjectChangePouType(name, new_type) - self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE, LIBRARYTREE) + self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE) return OnChangePouTypeMenu def OnCopyPou(self, event): - selected = self.TypesTree.GetSelection() - pou_name = self.TypesTree.GetItemText(selected) + selected = self.ProjectTree.GetSelection() + pou_name = self.ProjectTree.GetItemText(selected) pou_xml = self.Controler.GetPouXml(pou_name) if pou_xml is not None: @@ -2693,9 +2558,9 @@ self._Refresh(EDITMENU) def OnPastePou(self, event): - selected = self.TypesTree.GetSelection() - - pou_type = self.TypesTree.GetItemText(selected) + selected = self.ProjectTree.GetSelection() + + pou_type = self.ProjectTree.GetItemText(selected) pou_type = UNEDITABLE_NAMES_DICT[pou_type] # one of 'Functions', 'Function Blocks' or 'Programs' pou_type = {'Functions': 'function', 'Function Blocks': 'functionBlock', 'Programs': 'program'}[pou_type] @@ -2708,106 +2573,106 @@ message.ShowModal() message.Destroy() else: - self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE, LIBRARYTREE) + self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE) #------------------------------------------------------------------------------- # Remove Project Elements Functions #------------------------------------------------------------------------------- def OnRemoveDataTypeMenu(self, event): - selected = self.TypesTree.GetSelection() - if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE: - name = self.TypesTree.GetItemText(selected) + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_DATATYPE: + name = self.ProjectTree.GetItemText(selected) if not self.Controler.DataTypeIsUsed(name): self.Controler.ProjectRemoveDataType(name) tagname = self.Controler.ComputeDataTypeName(name) idx = self.IsOpened(tagname) if idx is not None: self.TabsOpened.DeletePage(idx) - self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE) + self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE) else: self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")) def OnRenamePouMenu(self, event): - selected = self.TypesTree.GetSelection() - if self.TypesTree.GetPyData(selected) == ITEM_POU: - wx.CallAfter(self.TypesTree.EditLabel, selected) + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_POU: + wx.CallAfter(self.ProjectTree.EditLabel, selected) def OnRemovePouMenu(self, event): - selected = self.TypesTree.GetSelection() - if self.TypesTree.GetPyData(selected) == ITEM_POU: - name = self.TypesTree.GetItemText(selected) + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_POU: + name = self.ProjectTree.GetItemText(selected) if not self.Controler.PouIsUsed(name): self.Controler.ProjectRemovePou(name) tagname = self.Controler.ComputePouName(name) idx = self.IsOpened(tagname) if idx is not None: self.TabsOpened.DeletePage(idx) - self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE) + self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) else: self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")) def OnRemoveTransitionMenu(self, event): - selected = self.TypesTree.GetSelection() - if self.TypesTree.GetPyData(selected) == ITEM_TRANSITION: - transition = self.TypesTree.GetItemText(selected) - item = self.TypesTree.GetItemParent(selected) - item_type = self.TypesTree.GetPyData(item) + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_TRANSITION: + transition = self.ProjectTree.GetItemText(selected) + item = self.ProjectTree.GetItemParent(selected) + item_type = self.ProjectTree.GetPyData(item) while item_type != ITEM_POU: - item = self.TypesTree.GetItemParent(item) - item_type = self.TypesTree.GetPyData(item) - pou_name = self.TypesTree.GetItemText(item) + item = self.ProjectTree.GetItemParent(item) + item_type = self.ProjectTree.GetPyData(item) + pou_name = self.ProjectTree.GetItemText(item) self.Controler.ProjectRemovePouTransition(pou_name, transition) tagname = self.Controler.ComputePouTransitionName(pou_name, transition) idx = self.IsOpened(tagname) if idx is not None: self.TabsOpened.DeletePage(idx) - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE) def OnRemoveActionMenu(self, event): - selected = self.TypesTree.GetSelection() - if self.TypesTree.GetPyData(selected) == ITEM_ACTION: - action = self.TypesTree.GetItemText(selected) - item = self.TypesTree.GetItemParent(selected) - item_type = self.TypesTree.GetPyData(item) + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_ACTION: + action = self.ProjectTree.GetItemText(selected) + item = self.ProjectTree.GetItemParent(selected) + item_type = self.ProjectTree.GetPyData(item) while item_type != ITEM_POU: - item = self.TypesTree.GetItemParent(item) - item_type = self.TypesTree.GetPyData(item) - pou_name = self.TypesTree.GetItemText(item) + item = self.ProjectTree.GetItemParent(item) + item_type = self.ProjectTree.GetPyData(item) + pou_name = self.ProjectTree.GetItemText(item) self.Controler.ProjectRemovePouAction(pou_name, action) tagname = self.Controler.ComputePouActionName(pou_name, action) idx = self.IsOpened(tagname) if idx is not None: self.TabsOpened.DeletePage(idx) - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE) def OnRemoveConfigurationMenu(self, event): - selected = self.TypesTree.GetSelection() - if self.TypesTree.GetPyData(selected) == ITEM_CONFIGURATION: - name = self.TypesTree.GetItemText(selected) + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: + name = self.ProjectTree.GetItemText(selected) self.Controler.ProjectRemoveConfiguration(name) tagname = self.Controler.ComputeConfigurationName(name) idx = self.IsOpened(tagname) if idx is not None: self.TabsOpened.DeletePage(idx) - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL) def OnRemoveResourceMenu(self, event): - selected = self.TypesTree.GetSelection() - if self.TypesTree.GetPyData(selected) == ITEM_RESOURCE: - resource = self.TypesTree.GetItemText(selected) - item = self.TypesTree.GetItemParent(selected) - item_type = self.TypesTree.GetPyData(item) + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_RESOURCE: + resource = self.ProjectTree.GetItemText(selected) + item = self.ProjectTree.GetItemParent(selected) + item_type = self.ProjectTree.GetPyData(item) while item_type != ITEM_CONFIGURATION: - item = self.TypesTree.GetItemParent(item) - item_type = self.TypesTree.GetPyData(item) - config_name = self.TypesTree.GetItemText(item) + item = self.ProjectTree.GetItemParent(item) + item_type = self.ProjectTree.GetPyData(item) + config_name = self.ProjectTree.GetItemText(item) self.Controler.ProjectRemoveConfigurationResource(config_name, resource) tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected) idx = self.IsOpened(tagname) if idx is not None: self.TabsOpened.DeletePage(idx) - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE) + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL) def OnPLCOpenEditorMenu(self, event): wx.MessageBox(_("No documentation available.\nComing soon.")) @@ -2824,11 +2689,11 @@ #------------------------------------------------------------------------------- def ShowHighlight(self, infos, start, end, highlight_type): - self.SelectTypesTreeItem(infos[0]) + self.SelectProjectTreeItem(infos[0]) if infos[1] == "name": self.Highlights[infos[0]] = highlight_type - self.RefreshTypesTree() - self.TypesTree.Unselect() + self.RefreshProjectTree() + self.ProjectTree.Unselect() else: self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0]) selected = self.TabsOpened.GetSelection() @@ -2847,7 +2712,7 @@ self.Highlights = {} else: self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type]) - self.RefreshTypesTree() + self.RefreshProjectTree() for i in xrange(self.TabsOpened.GetPageCount()): viewer = self.TabsOpened.GetPage(i) viewer.ClearHighlights(highlight_type) @@ -2952,7 +2817,8 @@ result = self.Controler.OpenXMLFile(fileOpen) if result is None: self.LibraryPanel.SetControler(self.Controler) - self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE) + self.PouInstanceVariablesPanel.SetController(self.Controler) + self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) # Define PLCOpenEditor icon self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO)) @@ -3042,7 +2908,7 @@ self.Controler = PLCControler() self.Controler.CreateNewProject(properties) self.LibraryPanel.SetControler(self.Controler) - self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) def OnOpenProjectMenu(self, event): @@ -3067,8 +2933,9 @@ result = self.Controler.OpenXMLFile(filepath) if result is None: self.LibraryPanel.SetControler(self.Controler) + self.PouInstanceVariablesPanel.SetController(self.Controler) self.LoadProjectOrganization() - self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE) + self._Refresh(PROJECTTREE, LIBRARYTREE) self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) dialog.Destroy()