PLCOpenEditor.py
changeset 687 629680fb0582
parent 685 ecd2226716d8
child 689 ce605c1a6d04
--- a/PLCOpenEditor.py	Sat May 19 12:40:53 2012 +0200
+++ b/PLCOpenEditor.py	Mon May 21 09:59:44 2012 +0200
@@ -279,20 +279,13 @@
             control.ProcessEvent(event)
     return ShortcutKeyFunction
 
-def GetParentName(tree, item, parent_type):
-    parent_item = tree.GetItemParent(item)
-    parent_item_type = tree.GetPyData(parent_item)
-    while parent_item_type != parent_type:
-        parent_item = tree.GetItemParent(parent_item)
-        parent_item_type = tree.GetPyData(parent_item)
-    return tree.GetItemText(parent_item)
-
 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
     def DeleteElementFunction(self, 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.ProjectTree, selected, parent_type)
+                item_infos = self.ProjectTree.GetPyData(selected)
+                parent_name = item_infos["tagname"].split("::")[1]
                 remove_function(self.Controler, parent_name, name)
             else:
                 remove_function(self.Controler, name)
@@ -406,7 +399,7 @@
     def _init_coll_FileMenu_Items(self, parent):
         pass
     
-    def _init_coll_AddMenu_Items(self, parent):
+    def _init_coll_AddMenu_Items(self, parent, add_config=True):
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
               kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
@@ -415,8 +408,9 @@
               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'))
+        if add_config:
+            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,
@@ -854,11 +848,12 @@
         elif page_infos[0] == "editor":
             tagname = page_infos[1]
             page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname)
-            page_ref.RefreshView()
-            return notebook.GetPageIndex(page_ref)
+            if page_ref is not None:
+                page_ref.RefreshView()
+                return notebook.GetPageIndex(page_ref)
         elif page_infos[0] == "debug":
             instance_path = page_infos[1]
-            instance_infos = self.Controler.GetInstanceInfos(instance_path)
+            instance_infos = self.Controler.GetInstanceInfos(instance_path, self.EnableDebug)
             if instance_infos is not None:
                 return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"]))
         return None
@@ -1194,6 +1189,7 @@
     def ResetView(self):
         self.DeleteAllPages()
         self.ProjectTree.DeleteAllItems()
+        self.ProjectTree.Enable(False)
         self.PouInstanceVariablesPanel.ResetView()
         self.LibraryPanel.ResetTree()
         self.LibraryPanel.SetControler(None)
@@ -1387,8 +1383,7 @@
         if window == self.ProjectTree or window is None:
             selected = self.ProjectTree.GetSelection()
             if selected.IsOk():
-                type = self.ProjectTree.GetPyData(selected)
-                function = self.DeleteFunctions.get(type, None)
+                function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None)
                 if function is not None:
                     function(self, selected)
                     self.CloseTabsWithoutModel()
@@ -1484,6 +1479,10 @@
                 self.AUIManager.RestorePane(pane)
             self.AUIManager.Update()
     
+    def EnsureTabVisible(self, tab):
+        notebook = tab.GetParent()
+        notebook.SetSelection(notebook.GetPageIndex(tab))
+    
     def OnPouSelectedChanging(self, event):
         if not self.Starting:
             selected = self.TabsOpened.GetSelection()
@@ -1503,8 +1502,13 @@
                     wx.CallAfter(self.SelectProjectTreeItem, tagname)
                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname)
                     window.RefreshView()
+                    self.EnsureTabVisible(self.LibraryPanel)
                 else:
                     instance_path = window.GetInstancePath()
+                    if tagname == "":
+                        instance_path = instance_path.rsplit(".", 1)[0]
+                        tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug)
+                    self.EnsureTabVisible(self.DebugVariablePanel)
                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path)
             wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
         event.Skip()
@@ -1581,15 +1585,20 @@
         		return self.GenerateProjectTreeBranch(root, infos["values"][0])
         	item_name = _(item_name)
         self.ProjectTree.SetItemText(root, item_name)
-        self.ProjectTree.SetPyData(root, infos["type"])
+        self.ProjectTree.SetPyData(root, infos)
         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
         if infos["type"] == ITEM_POU:
             self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
-        else:
+        elif infos.has_key("icon") and infos["icon"] is not None:
+            icon_path = infos["icon"]
+            if not self.TreeImageDict.has_key(icon_path):
+                self.TreeImageDict[icon_path] = self.TreeImageList.Add(wx.Bitmap(icon_path))
+            self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_path])
+        elif self.TreeImageDict.has_key(infos["type"]):
             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
-            
+        
         if wx.VERSION >= (2, 6, 0):
             item, root_cookie = self.ProjectTree.GetFirstChild(root)
         else:
@@ -1634,7 +1643,8 @@
         else:
             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
         while item.IsOk() and not found:
-            if (self.ProjectTree.GetItemText(item), self.ProjectTree.GetPyData(item)) == items[0]:
+            item_infos = self.ProjectTree.GetPyData(item)
+            if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]:
                 if len(items) == 1:
                     self.SelectedItem = item
                     self.ProjectTree.SelectItem(item)
@@ -1650,7 +1660,7 @@
     def OnProjectTreeBeginDrag(self, event):
         if wx.Platform == '__WXMSW__':
             self.SelectedItem = event.GetItem()
-        if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem) == ITEM_POU:
+        if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem)["type"] == ITEM_POU:
             block_name = self.ProjectTree.GetItemText(self.SelectedItem)
             block_type = self.Controler.GetPouType(block_name)
             if block_type != "program":
@@ -1662,7 +1672,7 @@
 
     def OnProjectTreeItemBeginEdit(self, event):
         selected = event.GetItem()
-        if self.ProjectTree.GetPyData(selected) in ITEMS_UNEDITABLE:
+        if self.ProjectTree.GetPyData(selected)["type"] in ITEMS_UNEDITABLE:
             event.Veto()
         else:
             event.Skip()
@@ -1679,10 +1689,10 @@
             else:
                 item = event.GetItem()
                 old_name = self.ProjectTree.GetItemText(item)
-                itemtype = self.ProjectTree.GetPyData(item)
-                if itemtype == ITEM_PROJECT:
+                item_infos = self.ProjectTree.GetPyData(item)
+                if item_infos["type"] == ITEM_PROJECT:
                     self.Controler.SetProjectProperties(name = new_name)
-                elif itemtype == ITEM_DATATYPE:
+                elif item_infos["type"] == ITEM_DATATYPE:
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
                         message = _("\"%s\" data type already exists!")%new_name
                         abort = True
@@ -1691,7 +1701,7 @@
                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
                                                 self.Controler.ComputeDataTypeName(new_name))
                         self.RefreshPageTitles()
-                elif itemtype == ITEM_POU:
+                elif item_infos["type"] == ITEM_POU:
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
                         message = _("\"%s\" pou already exists!")%new_name
                         abort = True
@@ -1706,29 +1716,29 @@
                                                 self.Controler.ComputePouName(new_name))
                         self.RefreshLibraryPanel()
                         self.RefreshPageTitles()
-                elif itemtype == ITEM_TRANSITION:
-                    pou_name = GetParentName(self.ProjectTree, item, ITEM_POU)
+                elif item_infos["type"] == ITEM_TRANSITION:
                     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]:
                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
                     else:
-                        self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
-                                                self.Controler.ComputePouTransitionName(pou_name, new_name))
+                        words = item_infos["tagname"].split("::")
+                        self.Controler.ChangePouTransitionName(words[1], old_name, new_name)
+                        self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name), 
+                                                self.Controler.ComputePouTransitionName(words[1], new_name))
                         self.RefreshPageTitles()
-                elif itemtype == ITEM_ACTION:
-                    pou_name = GetParentName(self.ProjectTree, item, ITEM_POU)
+                elif item_infos["type"] == ITEM_ACTION:
                     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]:
                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
                     else:
-                        self.Controler.ChangePouActionName(pou_name, old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), 
-                                                self.Controler.ComputePouActionName(pou_name, new_name))
+                        words = item_infos["tagname"].split("::")
+                        self.Controler.ChangePouActionName(words[1], old_name, new_name)
+                        self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name), 
+                                                self.Controler.ComputePouActionName(words[1], new_name))
                         self.RefreshPageTitles()
-                elif itemtype == ITEM_CONFIGURATION:
+                elif item_infos["type"] == ITEM_CONFIGURATION:
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
                         message = _("\"%s\" config already exists!")%new_name
                         abort = True
@@ -1747,8 +1757,7 @@
                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
                                                 self.Controler.ComputeConfigurationName(new_name))
                         self.RefreshPageTitles()
-                elif itemtype == ITEM_RESOURCE:
-                    config_name = GetParentName(self.ProjectTree, item, ITEM_CONFIGURATION)
+                elif item_infos["type"] == ITEM_RESOURCE:
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
                         message = _("\"%s\" config already exists!")%new_name
                         abort = True
@@ -1763,9 +1772,10 @@
                             abort = True
                         messageDialog.Destroy()
                     if not abort:
-                        self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(config_name, old_name), 
-                                                self.Controler.ComputeConfigurationResourceName(config_name, new_name))
+                        words = item_infos["tagname"].split("::")
+                        self.Controler.ChangeConfigurationResourceName(words[1], old_name, new_name)
+                        self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(words[1], old_name), 
+                                                self.Controler.ComputeConfigurationResourceName(words[1], new_name))
                         self.RefreshPageTitles()
             if message or abort:
                 if message:
@@ -1782,49 +1792,23 @@
     def OnProjectTreeItemActivated(self, event):
         selected = event.GetItem()
         name = self.ProjectTree.GetItemText(selected)
-        data = self.ProjectTree.GetPyData(selected)
-        if data == ITEM_PROJECT:
+        item_infos = self.ProjectTree.GetPyData(selected)
+        if item_infos["type"] == 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.ProjectTree, selected, ITEM_CONFIGURATION)
-            self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name))
-        elif data in [ITEM_TRANSITION, ITEM_ACTION]:
-            pou_name = GetParentName(self.ProjectTree, selected, ITEM_POU)
-            if data == ITEM_TRANSITION:
-                tagname = self.Controler.ComputePouTransitionName(pou_name, name)
-            elif data == ITEM_ACTION:
-                tagname = self.Controler.ComputePouActionName(pou_name, name)
-            self.EditProjectElement(data, tagname)
+        elif item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
+                                    ITEM_CONFIGURATION, ITEM_RESOURCE,
+                                    ITEM_TRANSITION, ITEM_ACTION]:
+            self.EditProjectElement(item_infos["type"], item_infos["tagname"])
         event.Skip()
     
     def ProjectTreeItemSelect(self, select_item):
         name = self.ProjectTree.GetItemText(select_item)
-        data = self.ProjectTree.GetPyData(select_item)
-        tagname = None
-        if data == ITEM_DATATYPE:
-            tagname = self.Controler.ComputeDataTypeName(name)
-        elif data == ITEM_POU:
-            tagname = self.Controler.ComputePouName(name)
-        elif data == ITEM_CONFIGURATION:
-            tagname = self.Controler.ComputeConfigurationName(name)
-        elif data == ITEM_RESOURCE:
-            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.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)
-        self.PouInstanceVariablesPanel.SetPouType(tagname)
+        item_infos = self.ProjectTree.GetPyData(select_item)
+        if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
+                                  ITEM_CONFIGURATION, ITEM_RESOURCE,
+                                  ITEM_TRANSITION, ITEM_ACTION]:
+            self.EditProjectElement(item_infos["type"], item_infos["tagname"], True)
+            self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"])
         
     def OnProjectTreeLeftUp(self, event):
         if self.SelectedItem is not None:
@@ -1838,7 +1822,7 @@
         event.Skip()
     
     def OnProjectTreeItemChanging(self, event):
-        if self.ProjectTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None:
+        if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None:
             self.SelectedItem = event.GetItem()
             event.Veto()
         else:
@@ -1925,10 +1909,10 @@
         self.ProjectTree.SelectItem(item)
         self.ProjectTreeItemSelect(item)
         name = self.ProjectTree.GetItemText(item)
-        type = self.ProjectTree.GetPyData(item)
+        item_infos = self.ProjectTree.GetPyData(item)
         
         menu = None
-        if type in ITEMS_UNEDITABLE:
+        if item_infos["type"] in ITEMS_UNEDITABLE:
             name = UNEDITABLE_NAMES_DICT[name]
             
             if name == "Data Types":
@@ -1960,11 +1944,11 @@
                 menu = wx.Menu(title='')
                 new_id = wx.NewId()
                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
-                parent = self.ProjectTree.GetItemParent(item)
+                parent = self.ProjectTree.GetItemParent(item)["type"]
                 parent_type = self.ProjectTree.GetPyData(parent)
                 while parent_type != ITEM_POU:
                     parent = self.ProjectTree.GetItemParent(parent)
-                    parent_type = self.ProjectTree.GetPyData(parent)
+                    parent_type = self.ProjectTree.GetPyData(parent)["type"]
                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
             
             elif name == "Actions":
@@ -1972,10 +1956,10 @@
                 new_id = wx.NewId()
                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
                 parent = self.ProjectTree.GetItemParent(item)
-                parent_type = self.ProjectTree.GetPyData(parent)
+                parent_type = self.ProjectTree.GetPyData(parent)["type"]
                 while parent_type != ITEM_POU:
                     parent = self.ProjectTree.GetItemParent(parent)
-                    parent_type = self.ProjectTree.GetPyData(parent)
+                    parent_type = self.ProjectTree.GetPyData(parent)["type"]
                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
             
             elif name == "Resources":
@@ -1983,14 +1967,18 @@
                 new_id = wx.NewId()
                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
                 parent = self.ProjectTree.GetItemParent(item)
-                parent_type = self.ProjectTree.GetPyData(parent)
-                while parent_type != ITEM_CONFIGURATION:
+                parent_type = self.ProjectTree.GetPyData(parent)["type"]
+                while parent_type not in [ITEM_CONFIGURATION, ITEM_PROJECT]:
                     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)
+                    parent_type = self.ProjectTree.GetPyData(parent)["type"]
+                if parent_type == ITEM_PROJECT:
+                    parent_name = None
+                else:
+                    parent_name = self.ProjectTree.GetItemText(parent)
+                self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), id=new_id)
             
         else:
-            if type == ITEM_POU:
+            if item_infos["type"] == ITEM_POU:
                 menu = wx.Menu(title='')
                 if self.Controler.GetPouBodyType(name) == "SFC":
                     new_id = wx.NewId()
@@ -2020,13 +2008,13 @@
                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename"))
                 self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id)
             
-            elif type == ITEM_CONFIGURATION:
+            elif item_infos["type"] == ITEM_CONFIGURATION:
                 menu = wx.Menu(title='')
                 new_id = wx.NewId()
                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id)
             
-            elif type in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
+            elif item_infos["type"] in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
                 menu = wx.Menu(title='')
                 
             if menu is not None:
@@ -2129,7 +2117,7 @@
             for idx in idxs:
                 editor = self.TabsOpened.GetPage(idx)
                 if editor.IsDebugging():
-                    instance_infos = self.Controler.GetInstanceInfos(editor.GetInstancePath())
+                    instance_infos = self.Controler.GetInstanceInfos(editor.GetInstancePath(), self.EnableDebug)
                     if instance_infos is None:
                         self.TabsOpened.DeletePage(idx)
                     elif isinstance(editor, GraphicViewer):
@@ -2141,6 +2129,7 @@
     def AddDebugVariable(self, iec_path, force=False):
         if self.EnableDebug:
             self.DebugVariablePanel.InsertValue(iec_path, force=force)
+            self.EnsureTabVisible(self.DebugVariablePanel)
             
 #-------------------------------------------------------------------------------
 #                         Library Panel Management Function
@@ -2441,7 +2430,7 @@
     def GenerateChangePouTypeFunction(self, name, new_type):
         def OnChangePouTypeMenu(event):
             selected = self.ProjectTree.GetSelection()
-            if self.ProjectTree.GetPyData(selected) == ITEM_POU: 
+            if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: 
                 self.Controler.ProjectChangePouType(name, new_type)
                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
         return OnChangePouTypeMenu
@@ -2479,7 +2468,7 @@
 
     def OnRemoveDataTypeMenu(self, event):
         selected = self.ProjectTree.GetSelection()
-        if self.ProjectTree.GetPyData(selected) == ITEM_DATATYPE:
+        if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE:
             name = self.ProjectTree.GetItemText(selected)
             if not self.Controler.DataTypeIsUsed(name):
                 self.Controler.ProjectRemoveDataType(name)
@@ -2493,12 +2482,12 @@
 
     def OnRenamePouMenu(self, event):
         selected = self.ProjectTree.GetSelection()
-        if self.ProjectTree.GetPyData(selected) == ITEM_POU: 
+        if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: 
             wx.CallAfter(self.ProjectTree.EditLabel, selected)
 
     def OnRemovePouMenu(self, event):
         selected = self.ProjectTree.GetSelection()
-        if self.ProjectTree.GetPyData(selected) == ITEM_POU:
+        if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU:
             name = self.ProjectTree.GetItemText(selected)
             if not self.Controler.PouIsUsed(name):
                 self.Controler.ProjectRemovePou(name)
@@ -2512,14 +2501,10 @@
 
     def OnRemoveTransitionMenu(self, event):
         selected = self.ProjectTree.GetSelection()
-        if self.ProjectTree.GetPyData(selected) == ITEM_TRANSITION: 
+        item_infos = self.ProjectTree.GetPyData(selected)
+        if item_infos["type"] == 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.ProjectTree.GetItemParent(item)
-                item_type = self.ProjectTree.GetPyData(item)
-            pou_name = self.ProjectTree.GetItemText(item)
+            pou_name = item_infos["tagname"].split("::")[1]
             self.Controler.ProjectRemovePouTransition(pou_name, transition)
             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
             idx = self.IsOpened(tagname)
@@ -2529,14 +2514,10 @@
 
     def OnRemoveActionMenu(self, event):
         selected = self.ProjectTree.GetSelection()
-        if self.ProjectTree.GetPyData(selected) == ITEM_ACTION: 
+        item_infos = self.ProjectTree.GetPyData(selected)
+        if item_infos["type"] == 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.ProjectTree.GetItemParent(item)
-                item_type = self.ProjectTree.GetPyData(item)
-            pou_name = self.ProjectTree.GetItemText(item)
+            pou_name = item_infos["tagname"].split("::")[1]
             self.Controler.ProjectRemovePouAction(pou_name, action)
             tagname = self.Controler.ComputePouActionName(pou_name, action)
             idx = self.IsOpened(tagname)
@@ -2546,7 +2527,7 @@
 
     def OnRemoveConfigurationMenu(self, event):
         selected = self.ProjectTree.GetSelection()
-        if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: 
+        if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFIGURATION: 
             name = self.ProjectTree.GetItemText(selected)
             self.Controler.ProjectRemoveConfiguration(name)
             tagname = self.Controler.ComputeConfigurationName(name)
@@ -2557,14 +2538,10 @@
 
     def OnRemoveResourceMenu(self, event):
         selected = self.ProjectTree.GetSelection()
-        if self.ProjectTree.GetPyData(selected) == ITEM_RESOURCE:
+        item_infos = self.ProjectTree.GetPyData(selected)
+        if item_infos["type"] == 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.ProjectTree.GetItemParent(item)
-                item_type = self.ProjectTree.GetPyData(item)
-            config_name = self.ProjectTree.GetItemText(item)
+            config_name = item_infos["tagname"].split("::")[1]
             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
             idx = self.IsOpened(tagname)
@@ -2711,11 +2688,13 @@
         # Open the filepath if defined
         if fileOpen is not None and os.path.isfile(fileOpen):
             # Create a new controller
-            self.Controler = PLCControler()
-            result = self.Controler.OpenXMLFile(fileOpen)
+            controler = PLCControler()
+            result = controler.OpenXMLFile(fileOpen)
             if result is None:
-            	self.LibraryPanel.SetControler(self.Controler)
-                self.PouInstanceVariablesPanel.SetController(self.Controler)
+                self.Controler = controler
+            	self.LibraryPanel.SetControler(controler)
+                self.ProjectTree.Enable(True)
+                self.PouInstanceVariablesPanel.SetController(controler)
                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
         
         # Define PLCOpenEditor icon
@@ -2826,11 +2805,13 @@
             filepath = dialog.GetPath()
             if os.path.isfile(filepath):
                 self.ResetView()
-                self.Controler = PLCControler()
-                result = self.Controler.OpenXMLFile(filepath)
+                controler = PLCControler()
+                result = controler.OpenXMLFile(filepath)
                 if result is None:
-                    self.LibraryPanel.SetControler(self.Controler)
-                    self.PouInstanceVariablesPanel.SetController(self.Controler)
+                    self.Controler = controler
+                    self.LibraryPanel.SetControler(controler)
+                    self.ProjectTree.Enable(True)
+                    self.PouInstanceVariablesPanel.SetController(controler)
                     self.LoadProjectOrganization()
                     self._Refresh(PROJECTTREE, LIBRARYTREE)
             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
@@ -4254,11 +4235,12 @@
         items = [(idx, item) for idx, item in enumerate(self.Table.GetData())]
         items.reverse()
         for idx, item in items:
-            if self.GetDataType(item.GetVariable().upper()) is None:
+            iec_path = item.GetVariable().upper()
+            if self.GetDataType(iec_path) is None:
                 self.RemoveDataConsumer(item)
                 self.Table.RemoveItem(idx)
             else:
-                self.AddDataConsumer(iec_path.upper(), item)
+                self.AddDataConsumer(iec_path, item)
         self.Freeze()
         self.Table.ResetView(self.VariablesGrid)
         self.VariablesGrid.RefreshButtons()