PLCOpenEditor.py
changeset 684 f10449b18dbe
parent 683 37882f34f9cb
child 685 ecd2226716d8
--- 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()