PLCOpenEditor.py
changeset 121 40b91ba978db
parent 120 add8e391e00c
child 122 e6faee0c271b
--- a/PLCOpenEditor.py	Tue Nov 13 17:21:30 2007 +0100
+++ b/PLCOpenEditor.py	Fri Nov 16 17:43:32 2007 +0100
@@ -45,11 +45,12 @@
 CWD = os.path.split(__file__)[0]
 
 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, 
- ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITOREDITORPANEL,
- ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTOOLBAR,
- ID_PLCOPENEDITORDEFAULTTOOLBAR, ID_PLCOPENEDITORSFCTOOLBAR, 
- ID_PLCOPENEDITORFBDTOOLBAR, ID_PLCOPENEDITORLDTOOLBAR,
-] = [wx.NewId() for _init_ctrls in range(10)]
+ ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
+ ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, 
+ ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
+ ID_PLCOPENEDITORSFCTOOLBAR, ID_PLCOPENEDITORFBDTOOLBAR, 
+ ID_PLCOPENEDITORLDTOOLBAR,
+] = [wx.NewId() for _init_ctrls in range(11)]
 
 [ID_PLCOPENEDITORFILEMENUITEMS0, ID_PLCOPENEDITORFILEMENUITEMS1, 
  ID_PLCOPENEDITORFILEMENUITEMS2, ID_PLCOPENEDITORFILEMENUITEMS3, 
@@ -139,7 +140,12 @@
     else:
         parent.Append(helpString=help, id=id, kind=kind, item=text)
 
-class PLCOpenEditor(wx.Frame):
+if wx.VERSION >= (2, 8, 0):
+    base_class = wx.aui.AuiMDIParentFrame
+else:
+    base_class = wx.Frame
+
+class PLCOpenEditor(base_class):
     _custom_classes = {'wx.SashWindow' : ['Viewer']}
     
     if wx.VERSION < (2, 6, 0):
@@ -303,20 +309,28 @@
         self._init_coll_ConfigMenu_Items(self.ConfigMenu)
 
     def _init_ctrls(self, prnt):
-        wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
-              parent=prnt, pos=wx.Point(235, 287), size=wx.Size(1000, 600),
-              style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
+        if wx.VERSION >= (2, 8, 0):
+            wx.aui.AuiMDIParentFrame.__init__(self, winid=ID_PLCOPENEDITOR, name=u'PLCOpenEditor', 
+                  parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
+                  style=wx.DEFAULT_FRAME_STYLE|wx.SUNKEN_BORDER|wx.CLIP_CHILDREN, title=u'PLCOpenEditor')
+        else:
+            wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
+                  parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
+                  style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
         self._init_utils()
         self.SetClientSize(wx.Size(1000, 600))
         self.SetMenuBar(self.menuBar1)
         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
         if not self.ModeSolo:
+            self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=ID_PLCOPENEDITORFILEMENUITEMS2)
             self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=ID_PLCOPENEDITORFILEMENUITEMS5)
-            accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL, 83, ID_PLCOPENEDITORFILEMENUITEMS5)])
+            accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL, 119, ID_PLCOPENEDITORFILEMENUITEMS2),
+                                         wx.AcceleratorEntry(wx.ACCEL_CTRL, 83, ID_PLCOPENEDITORFILEMENUITEMS5)])
             self.SetAcceleratorTable(accel)
         
         if wx.VERSION >= (2, 8, 0):
             self.AUIManager = wx.aui.AuiManager(self)
+            self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
             self.Panes = {}
         
         if wx.VERSION < (2, 8, 0):
@@ -335,7 +349,7 @@
                   name='treeCtrl1', parent=self, pos=wx.Point(0, 0),
                   size=wx.Size(200, -1),
                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
-            self.AUIManager.AddPane(self.ProjectTree, wx.aui.AuiPaneInfo().Caption("Project Tree").CloseButton(False))
+            self.AUIManager.AddPane(self.ProjectTree, wx.aui.AuiPaneInfo().Caption("Project Tree").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
         if wx.VERSION >= (2, 6, 0):
             self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp)
         else:
@@ -375,28 +389,42 @@
               id=ID_PLCOPENEDITORTOOLBARSELECTION)
             
         if wx.VERSION < (2, 8, 0):
+            self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
+                  name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
+                  size=wx.Size(0, 0), style=wx.SP_3D)
+            self.SecondSplitter.SetMinimumPaneSize(1)
+            
+            self.MainSplitter.SplitVertically(self.ProjectTree, self.SecondSplitter, 200)
+            
             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
-                  name='TabsOpened', parent=self.MainSplitter, pos=wx.Point(0,
+                  name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
                   0), size=wx.Size(0, 0), style=0)
-            self.MainSplitter.SplitVertically(self.ProjectTree, self.TabsOpened, 200)
-        else:
-            self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
-                  name='TabsOpened', parent=self, pos=wx.Point(0,
-                  0), size=wx.Size(0, 0), style=0)
-            self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().Name("TabsOpened").CenterPane())
-
-        if wx.VERSION >= (2, 6, 0):
-            self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
-                self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
-        else:
-            wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
-                self.OnPouSelectedChanged)
-        
-        if wx.VERSION > (2, 8, 0):
+            if wx.VERSION >= (2, 6, 0):
+                self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
+                    self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
+            else:
+                wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
+                    self.OnPouSelectedChanged)
+        
+        if wx.VERSION < (2, 8, 0):
+            self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self.Controler)
+            
+            self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200)
+        else:
+            self.VariablePanelIndexer = VariablePanelIndexer(self, self.Controler)
+            self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variable Panel").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
+            
             self.AUIManager.Update(); 
         
     def __init__(self, parent, controler = None, fileOpen = None):
         self.ModeSolo = controler == None
+        if self.ModeSolo:
+            self.Controler = PLCControler()
+            if fileOpen is not None:
+                self.Controler.OpenXMLFile(fileOpen)
+        else:
+            self.Controler = controler
+        
         self._init_ctrls(parent)
         
         if wx.Platform != '__WXMSW__':
@@ -405,26 +433,109 @@
                 self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%language)))
             self.ProjectTree.AssignImageList(self.TreeImageList)
         
-        if self.ModeSolo:
-            self.Controler = PLCControler()
-            if fileOpen:
-                self.Controler.OpenXMLFile(fileOpen)
-                self.RefreshProjectTree()
-        else:
-            self.Controler = controler
-            self.RefreshProjectTree()
-        
         self.CurrentToolBar = []
         self.CurrentLanguage = ""
         self.CopyBuffer = None
         self.DrawingMode = FREEDRAWING_MODE
         #self.DrawingMode = DRIVENDRAWING_MODE
         
+        if not self.ModeSolo or fileOpen is not None:
+            self.RefreshProjectTree()
+        
         self.RefreshFileMenu()
         self.RefreshEditMenu()
         self.RefreshTitle()
         self.RefreshToolBar()
 
+    def GetPageCount(self):
+        if wx.VERSION >= (2, 8, 0):
+            notebook = self.GetNotebook()
+            if notebook is not None:
+                return notebook.GetPageCount()
+            else:
+                return 0
+        else:
+            return self.TabsOpened.GetPageCount()
+    
+    def GetPage(self, idx):
+        if wx.VERSION >= (2, 8, 0):
+            notebook = self.GetNotebook()
+            if notebook is not None:
+                return notebook.GetPage(idx).GetViewer()
+            else:
+                return None
+        else:
+            return self.TabsOpened.GetPage(idx)
+
+    def GetPageSelection(self):
+        if wx.VERSION >= (2, 8, 0):
+            notebook = self.GetNotebook()
+            if notebook is not None:
+                return notebook.GetSelection()
+            else:
+                return -1
+        else:
+            return self.TabsOpened.GetSelection()
+
+    def SetPageSelection(self, idx):
+        if wx.VERSION >= (2, 8, 0):
+            notebook = self.GetNotebook()
+            if notebook is not None:
+                notebook.SetSelection(idx)
+        else:
+            self.TabsOpened.SetSelection(idx)
+
+    def DeletePage(self, idx):
+        if wx.VERSION >= (2, 8, 0):
+            notebook = self.GetNotebook()
+            if notebook is not None:
+                notebook.DeletePage(idx)
+        else:
+            self.TabsOpened.DeletePage(idx)
+
+    def DeleteAllPages(self):
+        if wx.VERSION >= (2, 8, 0):
+            notebook = self.GetNotebook()
+            if notebook is not None:
+                for idx in xrange(notebook.GetPageCount()):
+                    notebook.DeletePage(idx)
+        else:
+            self.TabsOpened.DeleteAllPages()
+
+    def SetPageText(self, idx, text):
+        if wx.VERSION >= (2, 8, 0):
+            notebook = self.GetNotebook()
+            if notebook is not None:
+                return notebook.SetPageText(idx, text)
+        else:
+            return self.TabsOpened.SetPageText(idx, text)
+
+    def GetPageText(self, idx):
+        if wx.VERSION >= (2, 8, 0):
+            notebook = self.GetNotebook()
+            if notebook is not None:
+                return notebook.GetPageText(idx)
+            else:
+                return ""
+        else:
+            return self.TabsOpened.GetPageText(idx)
+
+    def OnPageClose(self, event):
+        selected = self.GetPageSelection()
+        if selected >= 0:
+            tagname = self.GetPage(selected).GetTagName()
+            self.VariablePanelIndexer.RemoveVariablePanel(tagname)
+            if self.GetPageCount() > 0:
+                new_index = min(selected, self.GetPageCount() - 1)
+                tagname = self.GetPage(new_index).GetTagName()
+                self.SetPageSelection(new_index)
+                self.VariablePanelIndexer.ChangeVariablePanel(tagname)
+            self.RefreshTitle()
+            self.RefreshFileMenu()
+            self.RefreshEditMenu()
+            self.RefreshToolBar()
+        event.Skip()
+
     def GetCopyBuffer(self):
         return self.CopyBuffer
     
@@ -444,7 +555,7 @@
     def RefreshFileMenu(self):
         if self.FileMenu:
             if self.Controler.HasOpenedProject():
-                if self.TabsOpened.GetPageCount() > 0:
+                if self.GetPageCount() > 0:
                     self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, True)
                 else:
                     self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, False)
@@ -471,7 +582,7 @@
                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS1, False)
                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, False)
             if self.Controler.HasOpenedProject():
-                if self.TabsOpened.GetPageCount() > 0:
+                if self.GetPageCount() > 0:
                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True)
                 else:
                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
@@ -481,7 +592,6 @@
                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False)
                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, False)
-            bodytype = self.Controler.GetCurrentElementEditingBodyType()
             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True)
             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True)
             if self.CopyBuffer is not None:
@@ -489,10 +599,13 @@
             else:
                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, False)
 
-    def RefreshEditor(self):
-        selected = self.TabsOpened.GetSelection()
+    def RefreshEditor(self, variablepanel = True):
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).RefreshView()
+            window = self.GetPage(selected)
+            window.RefreshView()
+            if variablepanel:
+                self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
 
     def ShowProperties(self):
         old_values = self.Controler.GetProjectProperties()
@@ -508,7 +621,7 @@
 
     def OnCloseFrame(self, event):
         if not self.ModeSolo and getattr(self, "_onclose", None) is not None:
-            self.Controler.CloseAllElements()
+            self.AUIManager.UnInit()
             self._onclose()
             event.Skip()
         elif not self.Controler.ProjectIsSaved():
@@ -520,6 +633,7 @@
                 event.Skip()
             elif answer == wx.ID_NO:
                 self.Controler.Reset()
+                self.AUIManager.UnInit()
                 wx.CallAfter(self.Close)
                 event.Skip()
             else:
@@ -552,7 +666,7 @@
             filepath = dialog.GetPath()
             if os.path.isfile(filepath):
                 self.Controler.OpenXMLFile(filepath)
-                self.TabsOpened.DeleteAllPages()
+                self.DeleteAllPages()
                 self.RefreshProjectTree()
             self.RefreshTitle()
             self.RefreshFileMenu()
@@ -562,12 +676,16 @@
         event.Skip()
 
     def OnCloseTabMenu(self, event):
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected >= 0:
-            self.Controler.CloseElementEditing()
-            self.TabsOpened.DeletePage(selected)
-            if self.TabsOpened.GetPageCount() > 0:
-                self.TabsOpened.SetSelection(min(selected, self.TabsOpened.GetPageCount() - 1))
+            tagname = self.GetPage(selected).GetTagName()
+            self.DeletePage(selected)
+            self.VariablePanelIndexer.RemoveVariablePanel(tagname)
+            if self.GetPageCount() > 0:
+                new_index = min(selected, self.GetPageCount() - 1)
+                tagname = self.GetPage(new_index).GetTagName()
+                self.SetPageSelection(new_index)
+                self.VariablePanelIndexer.ChangeVariablePanel(tagname)
             self.RefreshTitle()
             self.RefreshFileMenu()
             self.RefreshEditMenu()
@@ -575,7 +693,8 @@
         event.Skip()
     
     def OnCloseProjectMenu(self, event):
-        self.TabsOpened.DeleteAllPages()
+        self.DeleteAllPages()
+        self.VariablePanelIndexer.RemoveAllPanels()
         self.ProjectTree.DeleteAllItems()
         self.Controler.Reset()
         self.RefreshTitle()
@@ -654,15 +773,17 @@
         event.Skip()
 
     def ResetCurrentMode(self):
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            window = self.TabsOpened.GetPage(selected)
+            window = self.GetPage(selected)
             window.SetMode(MODE_SELECTION)
         if wx.VERSION < (2, 8, 0):
-            self.ToolBar.ToggleTool(ID_PLCOPENEDITORTOOLBARSELECTION, True)
-        else:
-            self.Panes["ToolBar"].ToggleTool(ID_PLCOPENEDITORTOOLBARSELECTION, True)
-
+            ToolBar = self.ToolBar
+        else:
+            ToolBar = self.Panes["ToolBar"]
+        if ToolBar:
+            ToolBar.ToggleTool(ID_PLCOPENEDITORTOOLBARSELECTION, True)
+        
     def ResetToolToggle(self, id):
         if wx.VERSION < (2, 8, 0):
             tool = self.ToolBar.FindById(id)
@@ -671,163 +792,171 @@
         tool.SetToggle(False)
 
     def OnSelectionTool(self, event):
-        selected = self.TabsOpened.GetSelection()
+        self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_SELECTION)
+            self.GetPage(selected).SetMode(MODE_SELECTION)
         event.Skip()
     
     def OnCommentTool(self, event):
         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOMMENT)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_COMMENT)
+            self.GetPage(selected).SetMode(MODE_COMMENT)
         event.Skip()
     
     def OnVariableTool(self, event):
         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARVARIABLE)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_VARIABLE)
+            self.GetPage(selected).SetMode(MODE_VARIABLE)
         event.Skip()
     
     def OnBlockTool(self, event):
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_BLOCK)
+            self.GetPage(selected).SetMode(MODE_BLOCK)
         event.Skip()
         
     def OnConnectionTool(self, event):
         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONNECTION)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_CONNECTION)
+            self.GetPage(selected).SetMode(MODE_CONNECTION)
         event.Skip()
 
     def OnWireTool(self, event):
         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARWIRE)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_WIRE)
+            self.GetPage(selected).SetMode(MODE_WIRE)
         event.Skip()
 
     def OnPowerRailTool(self, event):
         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARPOWERRAIL)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_POWERRAIL)
+            self.GetPage(selected).SetMode(MODE_POWERRAIL)
         event.Skip()
 
     def OnRungTool(self, event):
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).Viewer.AddLadderRung()
+            self.GetPage(selected).AddLadderRung()
         event.Skip()
     
     def OnCoilTool(self, event):
         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOIL)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_COIL)
+            self.GetPage(selected).SetMode(MODE_COIL)
         event.Skip()
     
     def OnContactTool(self, event):
         if self.DrawingMode == FREEDRAWING_MODE:
             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONTACT)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
             if self.DrawingMode == FREEDRAWING_MODE:
-                self.TabsOpened.GetPage(selected).SetMode(MODE_CONTACT)
-            else:
-                self.TabsOpened.GetPage(selected).Viewer.AddLadderContact()
+                self.GetPage(selected).SetMode(MODE_CONTACT)
+            else:
+                self.GetPage(selected).AddLadderContact()
         event.Skip()
     
     def OnBranchTool(self, event): 
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).Viewer.AddLadderBranch()
+            self.GetPage(selected).AddLadderBranch()
         event.Skip()    
     
     def OnInitialStepTool(self, event):
         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARINITIALSTEP)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_INITIALSTEP)
+            self.GetPage(selected).SetMode(MODE_INITIALSTEP)
         event.Skip()
     
     def OnStepTool(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARSTEP)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
             if self.GetDrawingMode() == FREEDRAWING_MODE:
-                self.TabsOpened.GetPage(selected).SetMode(MODE_STEP)
-            else:
-                self.TabsOpened.GetPage(selected).Viewer.AddStep()
+                self.GetPage(selected).SetMode(MODE_STEP)
+            else:
+                self.GetPage(selected).AddStep()
         event.Skip()
 
     def OnActionBlockTool(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARACTIONBLOCK)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
             if self.GetDrawingMode() == FREEDRAWING_MODE:
-                self.TabsOpened.GetPage(selected).SetMode(MODE_ACTION)
-            else:
-                self.TabsOpened.GetPage(selected).Viewer.AddStepAction()
+                self.GetPage(selected).SetMode(MODE_ACTION)
+            else:
+                self.GetPage(selected).AddStepAction()
         event.Skip()
 
     def OnTransitionTool(self, event):
         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARTRANSITION)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_TRANSITION)
+            self.GetPage(selected).SetMode(MODE_TRANSITION)
         event.Skip()
 
     def OnDivergenceTool(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARDIVERGENCE)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
             if self.GetDrawingMode() == FREEDRAWING_MODE:
-                self.TabsOpened.GetPage(selected).SetMode(MODE_DIVERGENCE)
-            else:
-                self.TabsOpened.GetPage(selected).Viewer.AddDivergence()
+                self.GetPage(selected).SetMode(MODE_DIVERGENCE)
+            else:
+                self.GetPage(selected).AddDivergence()
         event.Skip()
     
     def OnJumpTool(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARJUMP)
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
             if self.GetDrawingMode() == FREEDRAWING_MODE:
-                self.TabsOpened.GetPage(selected).SetMode(MODE_JUMP)
-            else:
-                self.TabsOpened.GetPage(selected).Viewer.AddJump()
+                self.GetPage(selected).SetMode(MODE_JUMP)
+            else:
+                self.GetPage(selected).AddJump()
         event.Skip()
         
     def OnPouSelectedChanged(self, event):
-        old_selected = self.TabsOpened.GetSelection()
-        if old_selected >= 0:
-            self.TabsOpened.GetPage(old_selected).ResetBuffer()
-        selected = event.GetSelection()
-        if selected >= 0:
-            self.Controler.RefreshCurrentElementEditing(selected)
-            found = False
-            name = self.TabsOpened.GetPageText(selected)
-            if self.ProjectTree:
-                root = self.ProjectTree.GetRootItem()
-                if wx.VERSION >= (2, 6, 0):
-                    item, root_cookie = self.ProjectTree.GetFirstChild(root)
+        if wx.VERSION < (2, 8, 0) or event.GetActive():
+            old_selected = self.GetPageSelection()
+            if old_selected >= 0:
+                self.GetPage(old_selected).ResetBuffer()
+            if wx.VERSION >= (2, 8, 0):
+                window = event.GetEventObject().GetViewer()
+            else:
+                selected = event.GetSelection()
+                if selected >= 0:
+                    window = self.GetPage(selected)
                 else:
-                    item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
-                while item.IsOk() and not found:
-                    if self.ProjectTree.GetItemText(item) == name:
-                        self.ProjectTree.SelectItem(item)
-                    item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
-            self.TabsOpened.GetPage(selected).RefreshView()
-            self.RefreshFileMenu()
-            self.RefreshEditMenu()
-            self.RefreshToolBar()
+                    window = None
+            if window:
+##                found = False
+##                words = window.GetTagName().split("::")
+##                if self.ProjectTree:
+##                    root = self.ProjectTree.GetRootItem()
+##                    if wx.VERSION >= (2, 6, 0):
+##                        item, root_cookie = self.ProjectTree.GetFirstChild(root)
+##                    else:
+##                        item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
+##                    while item.IsOk() and not found:
+##                        if self.ProjectTree.GetItemText(item) == words[1]:
+##                            self.ProjectTree.SelectItem(item)
+##                        item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
+                window.RefreshView()
+                self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
+                self.RefreshFileMenu()
+                self.RefreshEditMenu()
+                self.RefreshToolBar()
         event.Skip()
 
     def OnProjectTreeBeginDrag(self, event):
@@ -842,8 +971,8 @@
                 dragSource.DoDragDrop()
 
     def RefreshEditorNames(self, item_type, old_name, new_name):
-        for i in xrange(self.TabsOpened.GetPageCount()):
-            editor = self.TabsOpened.GetPage(i)
+        for i in xrange(self.GetPageCount()):
+            editor = self.GetPage(i)
             editor.RefreshName(item_type, old_name, new_name)
 
     def OnProjectTreeItemEndEdit(self, event):
@@ -873,7 +1002,7 @@
                     if not abort:
                         self.Controler.ChangePouName(old_name, new_name)
                         self.RefreshEditorNames(itemtype, old_name, new_name)
-                        self.RefreshTabsOpenedTitles()
+                        self.RefreshPageTitles()
                 elif itemtype == ITEM_TRANSITION:
                     parent = self.ProjectTree.GetItemParent(item)
                     parent_type = self.ProjectTree.GetPyData(parent)
@@ -888,7 +1017,7 @@
                     else:
                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
                         self.RefreshEditorNames(itemtype, old_name, new_name)
-                        self.RefreshTabsOpenedTitles()
+                        self.RefreshPageTitles()
                 elif itemtype == ITEM_ACTION:
                     parent = self.ProjectTree.GetItemParent(item)
                     parent_type = self.ProjectTree.GetPyData(parent)
@@ -903,7 +1032,7 @@
                     else:
                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
                         self.RefreshEditorNames(itemtype, old_name, new_name)
-                        self.RefreshTabsOpenedTitles()
+                        self.RefreshPageTitles()
                 elif itemtype == 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
@@ -921,7 +1050,7 @@
                     if not abort:
                         self.Controler.ChangeConfigurationName(old_name, new_name)
                         self.RefreshEditorNames(itemtype, old_name, new_name)
-                        self.RefreshTabsOpenedTitles()
+                        self.RefreshPageTitles()
                 elif itemtype == ITEM_RESOURCE:
                     parent = self.ProjectTree.GetItemParent(item)
                     parent_type = self.ProjectTree.GetPyData(parent)
@@ -945,7 +1074,7 @@
                     if not abort:
                         self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name)
                         self.RefreshEditorNames(itemtype, old_name, new_name)
-                        self.RefreshTabsOpenedTitles()
+                        self.RefreshPageTitles()
             if message or abort:
                 if message:
                     messageDialog = wx.MessageDialog(self, message, "Error", wx.OK|wx.ICON_ERROR)
@@ -956,9 +1085,9 @@
                 event.Veto()
             else:
                 wx.CallAfter(self.RefreshProjectTree)
-                window = self.TabsOpened.GetCurrentPage()
-                if window:
-                    window.RefreshView()
+                selected = self.GetPageSelection()
+                if selected != -1:
+                    self.GetPage(selected).RefreshView()
                 event.Skip()
 
     def OnProjectTreeItemBeginEdit(self, event):
@@ -978,8 +1107,10 @@
         data = self.ProjectTree.GetPyData(selected)
         if name == "Properties":
             self.ShowProperties()
-        if data in [ITEM_POU, ITEM_CONFIGURATION]:
-            self.EditProjectElement(data, name)
+        if 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:
             item = self.ProjectTree.GetItemParent(selected)
             item_type = self.ProjectTree.GetPyData(item)
@@ -987,7 +1118,7 @@
                 item = self.ProjectTree.GetItemParent(item)
                 item_type = self.ProjectTree.GetPyData(item)
             config_name = self.ProjectTree.GetItemText(item)
-            self.EditProjectElement(data, "%s::%s"%(config_name, name))
+            self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name))
         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
             item = self.ProjectTree.GetItemParent(selected)
             item_type = self.ProjectTree.GetPyData(item)
@@ -995,14 +1126,20 @@
                 item = self.ProjectTree.GetItemParent(item)
                 item_type = self.ProjectTree.GetPyData(item)
             pou_name = self.ProjectTree.GetItemText(item)
-            self.EditProjectElement(data, "%s::%s"%(pou_name, name))
+            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)
     
     def OnProjectTreeItemSelected(self, event):
         selected = event.GetItem()
         name = self.ProjectTree.GetItemText(selected)
         data = self.ProjectTree.GetPyData(selected)
-        if data in [ITEM_POU, ITEM_CONFIGURATION]:
-            self.EditProjectElement(data, name, True)
+        if data == ITEM_POU:
+            self.EditProjectElement(data, self.Controler.ComputePouName(name), True)
+        elif data == ITEM_CONFIGURATION:
+            self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True)
         elif data == ITEM_RESOURCE:
             item = self.ProjectTree.GetItemParent(selected)
             item_type = self.ProjectTree.GetPyData(item)
@@ -1010,7 +1147,7 @@
                 item = self.ProjectTree.GetItemParent(item)
                 item_type = self.ProjectTree.GetPyData(item)
             config_name = self.ProjectTree.GetItemText(item)
-            self.EditProjectElement(data, "%s::%s"%(config_name, name), True)
+            self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name), True)
         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
             item = self.ProjectTree.GetItemParent(selected)
             item_type = self.ProjectTree.GetPyData(item)
@@ -1018,71 +1155,106 @@
                 item = self.ProjectTree.GetItemParent(item)
                 item_type = self.ProjectTree.GetPyData(item)
             pou_name = self.ProjectTree.GetItemText(item)
-            self.EditProjectElement(data, "%s::%s"%(pou_name, name), True)
-        event.Skip()
-    
-    def EditProjectElement(self, elementtype, elementname, onlyopened = False):
-        idx = None
-        names = elementname.split("::")
-        if elementtype == ITEM_CONFIGURATION and len(names) == 1:
-            if not onlyopened:
-                idx = self.Controler.OpenConfigurationEditing(*names)
-                if idx is not None:
-                    new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "config", config_name = names[0])
-                    new_window.SetIndex(idx)
+            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, True)
+        event.Skip()
+    
+    def IsOpened(self, tagname):
+        for idx in xrange(self.GetPageCount()):
+            if self.GetPage(idx).IsViewing(tagname):
+                return idx
+        return None
+    
+    def EditProjectElement(self, elementtype, tagname, onlyopened = False):
+        openedidx = self.IsOpened(tagname)
+        if openedidx is not None:
+            old_selected = self.GetPageSelection()
+            if old_selected != openedidx:
+                if old_selected >= 0:
+                    self.GetPage(old_selected).ResetBuffer()
+                self.SetPageSelection(openedidx)
+            self.GetPage(openedidx).RefreshView()
+            self.VariablePanelIndexer.ChangeVariablePanel(tagname)
+            self.RefreshPageTitles()
+            self.RefreshFileMenu()
+            self.RefreshEditMenu()
+            self.RefreshToolBar()
+        elif not onlyopened:
+            if wx.VERSION >= (2, 8, 0):
+                if elementtype == ITEM_CONFIGURATION:
+                    new_window = MDIConfigurationEditor(self, tagname, self, self.Controler)
+                    self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
+                elif elementtype == ITEM_RESOURCE:
+                    new_window = MDIResourceEditor(self, tagname, self, self.Controler)
+                    self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
+                elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
+                    bodytype = self.Controler.GetEditedElementBodyType(tagname)
+                    if bodytype == "FBD":
+                        new_window = MDIViewer(self, tagname, self, self.Controler)
+                    elif bodytype == "LD":
+                        new_window = LD_MDIViewer(self, tagname, self, self.Controler)
+                    elif bodytype == "SFC":
+                        new_window = SFC_MDIViewer(self, tagname, self, self.Controler)
+                    else:
+                        new_window = TextMDIViewer(self, tagname, self, self.Controler)
+                        viewer = new_window.GetViewer()
+                        viewer.SetTextSyntax(elementtype)
+                        if bodytype == "IL":
+                            viewer.SetKeywords(IL_KEYWORDS)
+                        else:
+                            viewer.SetKeywords(ST_KEYWORDS)
+                new_window.Bind(wx.EVT_ACTIVATE, self.OnPouSelectedChanged)
+                new_window.Bind(wx.EVT_CLOSE, self.OnPageClose)
+            else:
+                if elementtype == ITEM_CONFIGURATION:
+                    new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler)
                     self.TabsOpened.AddPage(new_window, "")
-            if idx is None:
-                idx = self.Controler.ChangeConfigurationEditing(*names)
-        elif elementtype == ITEM_RESOURCE and len(names) == 2:
-            if not onlyopened:
-                idx = self.Controler.OpenConfigurationResourceEditing(*names)
-                if idx is not None:
-                    new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "resource", config_name = names[0], resource_name = names[1])
-                    new_window.SetIndex(idx)
+                    self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
+                elif elementtype == ITEM_RESOURCE:
+                    new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
                     self.TabsOpened.AddPage(new_window, "")
-            if idx is None:
-                idx = self.Controler.ChangeConfigurationResourceEditing(*names)
-        elif elementtype == ITEM_POU and len(names) == 1:
-            if not onlyopened:
-                idx = self.Controler.OpenPouEditing(*names)
-                if idx != None:
-                    new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, self.Controler.GetPouType(names[0]), pou_name = names[0])
-                    new_window.SetIndex(idx)
+                    self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
+                elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
+                    bodytype = self.Controler.GetEditedElementBodyType(tagname)
+                    if bodytype == "FBD":
+                        new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
+                    elif bodytype == "LD":
+                        new_window = LD_Viewer(self.TabsOpened, tagname, self, self.Controler)
+                    elif bodytype == "SFC":
+                        new_window = SFC_Viewer(self.TabsOpened, tagname, self, self.Controler)
+                    else:
+                        new_window = TextViewer(self.TabsOpened, tagname, self, self.Controler)
+                        new_window.SetTextSyntax(elementtype)
+                        if bodytype == "IL":
+                            new_window.SetKeywords(IL_KEYWORDS)
+                        else:
+                            new_window.SetKeywords(ST_KEYWORDS)
                     self.TabsOpened.AddPage(new_window, "")
-            if idx is None:
-                idx = self.Controler.ChangePouEditing(*names)
-        elif elementtype == ITEM_TRANSITION and len(names) == 2:
-            if not onlyopened:
-                idx = self.Controler.OpenPouTransitionEditing(*names)
-                if idx is not None:
-                    new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "transition", pou_name = names[0], transition_name = names[1])
-                    new_window.SetIndex(idx)
-                    self.TabsOpened.AddPage(new_window, "")
-            if idx is None:
-                idx = self.Controler.ChangePouTransitionEditing(*names)
-        elif elementtype == ITEM_ACTION and len(names) == 2:
-            if not onlyopened:
-                idx = self.Controler.OpenPouActionEditing(*names)
-                if idx is not None:
-                    new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "action", pou_name = names[0], action_name = names[1])
-                    new_window.SetIndex(idx)
-                    self.TabsOpened.AddPage(new_window, "")
-            if idx is None:
-                idx = self.Controler.ChangePouActionEditing(*names)
-        if idx != None:
-            old_selected = self.TabsOpened.GetSelection()
-            if old_selected >= 0:
-                self.TabsOpened.GetPage(old_selected).ResetBuffer()
-            for i in xrange(self.TabsOpened.GetPageCount()):
-                window = self.TabsOpened.GetPage(i)
-                if window.GetIndex() == idx:
-                    self.TabsOpened.SetSelection(i)
+            if elementtype == ITEM_POU:
+                words = tagname.split("::")
+                self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
+            elif elementtype == ITEM_TRANSITION:
+                self.VariablePanelIndexer.AddVariablePanel(tagname, "transition")
+            elif elementtype == ITEM_TRANSITION:
+                self.VariablePanelIndexer.AddVariablePanel(tagname, "action")
+            self.VariablePanelIndexer.ChangeVariablePanel(tagname)
+            openedidx = self.IsOpened(tagname)
+            old_selected = self.GetPageSelection()
+            if old_selected != openedidx:
+                if old_selected >= 0:
+                    self.GetPage(old_selected).ResetBuffer()
+            for i in xrange(self.GetPageCount()):
+                window = self.GetPage(i)
+                if window.GetTagName() == tagname:
+                    self.SetPageSelection(i)
                     window.RefreshView()
-                    self.RefreshTabsOpenedTitles()
+                    self.RefreshPageTitles()
                     self.RefreshFileMenu()
                     self.RefreshEditMenu()
                     self.RefreshToolBar()
-                    return
     
     def OnProjectTreeRightUp(self, event):
         cursor_pos = event.GetPosition()
@@ -1137,15 +1309,20 @@
                 ToolBar = self.ToolBar
             else:
                 ToolBar = self.Panes["ToolBar"]
-            ToolBar.DeleteTool(item)
-            ToolBar.Realize()
-            if wx.VERSION >= (2, 8, 0):
-                self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
-                self.AUIManager.Update()
+            if ToolBar:
+                ToolBar.DeleteTool(item)
+                ToolBar.Realize()
+                if wx.VERSION >= (2, 8, 0):
+                    self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
+                    self.AUIManager.Update()
 
     def RefreshToolBar(self):
-        language = self.Controler.GetCurrentElementEditingBodyType()
-        if language and language != self.CurrentLanguage:
+        selected = self.GetPageSelection()
+        if selected != -1:
+            language = self.Controler.GetEditedElementBodyType(self.GetPage(selected).GetTagName())
+        else:
+            language = None
+        if language is not None and language != self.CurrentLanguage:
             self.ResetToolBar()
             self.CurrentLanguage = language
             self.CurrentToolBar = []
@@ -1153,41 +1330,45 @@
                 ToolBar = self.ToolBar
             else:
                 ToolBar = self.Panes["ToolBar"]
-            for radio, modes, id, method, picture, help in ToolBarItems[language]:
-                if modes & self.DrawingMode:
-                    if radio or self.DrawingMode == FREEDRAWING_MODE:
-                        ToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
-                    else:
-                        ToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
-                    self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
-                    self.CurrentToolBar.append(id)
-            ToolBar.Realize()
-            if wx.VERSION >= (2, 8, 0):
-                self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
-                self.AUIManager.Update()
+            if ToolBar:
+                for radio, modes, id, method, picture, help in ToolBarItems[language]:
+                    if modes & self.DrawingMode:
+                        if radio or self.DrawingMode == FREEDRAWING_MODE:
+                            ToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
+                        else:
+                            ToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
+                        self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
+                        self.CurrentToolBar.append(id)
+                ToolBar.Realize()
+                if wx.VERSION >= (2, 8, 0):
+                    self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
+                    self.AUIManager.Update()
         elif not language:
             self.ResetToolBar()
             self.CurrentLanguage = language
         self.ResetCurrentMode()
 
-    def RefreshTabsOpenedTitles(self):
-        pous = self.Controler.GetElementsOpenedNames()
-        for i, pou in enumerate(pous):
-            self.TabsOpened.SetPageText(i, pou)
+    def RefreshPageTitles(self):
+        for idx in xrange(self.GetPageCount()):
+            window = self.GetPage(idx)
+            words = window.GetTagName().split("::")
+            self.SetPageText(idx, "-".join(words[1:]))
     
     def OnRefreshMenu(self, event):
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).RefreshView()
-            self.TabsOpened.GetPage(selected).Refresh()
+            window = self.GetPage(selected)
+            window.RefreshView()
+            self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
         event.Skip()
 
     def OnUndoMenu(self, event):
         self.Controler.LoadPrevious()
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).RefreshView()
-            self.TabsOpened.GetPage(selected).Refresh()
+            window = self.GetPage(selected)
+            window.RefreshView()
+            self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
         self.RefreshTitle()
         self.RefreshEditMenu()
         self.RefreshProjectTree()
@@ -1195,38 +1376,39 @@
     
     def OnRedoMenu(self, event):
         self.Controler.LoadNext()
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).RefreshView()
-            self.TabsOpened.GetPage(selected).Refresh()
+            window = self.GetPage(selected)
+            window.RefreshView()
+            self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
         self.RefreshTitle()
         self.RefreshEditMenu()
         self.RefreshProjectTree()
         event.Skip()
 
     def OnCutMenu(self, event):
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
             try:
-                self.TabsOpened.GetPage(selected).Viewer.Cut()
+                self.GetPage(selected).Cut()
             except:
                 pass
         event.Skip()
     
     def OnCopyMenu(self, event):
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
             try:
-                self.TabsOpened.GetPage(selected).Viewer.Copy()
+                self.GetPage(selected).Copy()
             except:
                 pass
         event.Skip()
     
     def OnPasteMenu(self, event):
-        selected = self.TabsOpened.GetSelection()
+        selected = self.GetPageSelection()
         if selected != -1:
             try:
-                self.TabsOpened.GetPage(selected).Viewer.Paste()
+                self.GetPage(selected).Paste()
             except:
                 pass
         event.Skip()
@@ -1251,12 +1433,11 @@
             selected = dialog.GetStringSelection()
             if not self.Controler.PouIsUsed(selected):
                 self.Controler.ProjectRemovePou(selected)
-                deleted = None
-                for i in xrange(self.TabsOpened.GetPageCount()):
-                    if self.TabsOpened.GetPageText(i) == selected:
-                        deleted = i
-                if deleted is not None:
-                    self.TabsOpened.DeletePage(deleted)
+                tagname = self.Controler.ComputePouName(selected)
+                idx = self.IsOpened(tagname)
+                if idx is not None:
+                    self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
+                    self.DeletePage(idx)
                 self.RefreshTitle()
                 self.RefreshEditMenu()
                 self.RefreshProjectTree()
@@ -1286,6 +1467,11 @@
         if dialog.ShowModal() == wx.ID_OK:
             selected = dialog.GetStringSelection()
             self.Controler.ProjectRemoveConfiguration(selected)
+            tagname = self.Controler.ComputeConfigurationName(selected)
+            idx = self.IsOpened(tagname)
+            if idx is not None:
+                self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
+                self.DeletePage(idx)
             self.RefreshTitle()
             self.RefreshEditMenu()
             self.RefreshProjectTree()
@@ -1318,6 +1504,11 @@
                 if dialog.ShowModal() == wx.ID_OK: 
                     selected = dialog.GetStringSelection()
                     self.Controler.ProjectRemovePouTransition(pouname, selected)
+                    tagname = self.Controler.ComputePouTransitionName(pouname, selected)
+                    idx = self.IsOpened(tagname)
+                    if idx is not None:
+                        self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
+                        self.DeletePage(idx)
                     self.RefreshTitle()
                     self.RefreshEditMenu()
                     self.RefreshProjectTree()
@@ -1351,6 +1542,11 @@
                 if dialog.ShowModal() == wx.ID_OK: 
                     selected = dialog.GetStringSelection()
                     self.Controler.ProjectRemovePouAction(pouname, selected)
+                    tagname = self.Controler.ComputePouActionName(pouname, selected)
+                    idx = self.IsOpened(tagname)
+                    if idx is not None:
+                        self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
+                        self.DeletePage(idx)
                     self.RefreshTitle()
                     self.RefreshEditMenu()
                     self.RefreshProjectTree()
@@ -1367,6 +1563,11 @@
             if dialog.ShowModal() == wx.ID_OK:
                 value = dialog.GetValue()
                 self.Controler.ProjectAddConfigurationResource(config_name, value)
+                tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
+                idx = self.IsOpened(tagname)
+                if idx is not None:
+                    self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
+                    self.DeletePage(idx)
                 self.RefreshTitle()
                 self.RefreshEditMenu()
                 self.RefreshProjectTree()
@@ -2161,7 +2362,76 @@
         return self.GetSizer().GetItem(1).GetWindow().GetValue()
 
 #-------------------------------------------------------------------------------
-#                            Pou Editor Panel
+#                            Variables Editor Panel
+#-------------------------------------------------------------------------------
+
+class VariablePanelIndexer(wx.Panel):
+    
+    def _init_sizers(self):
+        self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        self.SetSizer(self.MainSizer)
+    
+    def _init_ctrls(self, prnt):
+        wx.Panel.__init__(self, id=wx.NewId(),
+              name='VariablePanelIndexer', parent=prnt, pos=wx.Point(0, 0),
+              size=wx.Size(0, 300), style=wx.TAB_TRAVERSAL)
+        
+        self._init_sizers()
+    
+    def __init__(self, parent, controler):
+        self._init_ctrls(parent)
+        
+        self.ParentWindow = parent
+        self.Controler = controler
+        
+        self.VariablePanelList = {}
+        self.CurrentPanel = None
+        
+    def AddVariablePanel(self, tagname, element_type):
+        new_panel = VariablePanel(self, self.ParentWindow, self.Controler, element_type)
+        new_panel.SetTagName(tagname)
+        new_panel.Hide()
+        new_panel.RefreshView()
+        self.MainSizer.AddWindow(new_panel, 1, border=0, flag=wx.GROW)
+        self.VariablePanelList[tagname] = new_panel
+        
+    def RemoveVariablePanel(self, tagname):
+        if tagname in self.VariablePanelList:
+            panel = self.VariablePanelList.pop(tagname)
+            panel.Hide()
+            self.MainSizer.Remove(panel)
+            if self.CurrentPanel == tagname:
+                self.CurrentPanel = None
+    
+    def RemoveAllPanels(self):
+        if self.CurrentPanel is not None and self.CurrentPanel in self.VariablePanelList:
+            self.VariablePanelList[self.CurrentPanel].Hide()
+        self.VariablePanelList = {}
+        self.MainSizer.Clear()
+        self.CurrentPanel = None
+    
+    def UpdateVariablePanelTagName(self, old_tagname, new_tagname):
+        if old_name in self.VariablePanelList:
+            self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname)
+            if self.CurrentPanel == old_tagname:
+                self.CurrentPanel = new_tagname
+                
+    def ChangeVariablePanel(self, tagname):
+        if tagname in self.VariablePanelList and tagname != self.CurrentPanel:
+            if self.CurrentPanel is not None:
+                self.VariablePanelList[self.CurrentPanel].Hide()
+            self.CurrentPanel = tagname
+            self.VariablePanelList[self.CurrentPanel].RefreshView()
+            self.VariablePanelList[self.CurrentPanel].Show()
+            self.MainSizer.Layout()
+
+    def RefreshVariablePanel(self, tagname):
+        if tagname in self.VariablePanelList:
+            self.VariablePanelList[self.CurrentPanel].RefreshView()
+
+#-------------------------------------------------------------------------------
+#                            Variables Editor Panel
 #-------------------------------------------------------------------------------
 
 class VariableTable(wx.grid.PyGridTableBase):
@@ -2384,15 +2654,15 @@
                 message.ShowModal()
                 message.Destroy()
 
-[ID_POUEDITORPANEL, ID_POUEDITORPANELVIEWER, 
- ID_POUEDITORPANELVARIABLESGRID, ID_POUEDITORPANELRETURNTYPE, 
- ID_POUEDITORPANELCLASSFILTER, ID_POUEDITORPANELADDBUTTON,
- ID_POUEDITORPANELDELETEBUTTON, ID_POUEDITORPANELUPBUTTON, 
- ID_POUEDITORPANELDOWNBUTTON, ID_POUEDITORPANELSTATICTEXT1, 
- ID_POUEDITORPANELSTATICTEXT2, ID_POUEDITORPANELSTATICTEXT3,
-] = [wx.NewId() for _init_ctrls in range(12)]
-
-class PouEditorPanel(wx.SplitterWindow):
+[ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, 
+ ID_VARIABLEEDITORPANELRETURNTYPE, ID_VARIABLEEDITORPANELCLASSFILTER, 
+ ID_VARIABLEEDITORPANELADDBUTTON, ID_VARIABLEEDITORPANELDELETEBUTTON, 
+ ID_VARIABLEEDITORPANELUPBUTTON, ID_VARIABLEEDITORPANELDOWNBUTTON, 
+ ID_VARIABLEEDITORPANELSTATICTEXT1, ID_VARIABLEEDITORPANELSTATICTEXT2, 
+ ID_VARIABLEEDITORPANELSTATICTEXT3,
+] = [wx.NewId() for _init_ctrls in range(11)]
+
+class VariablePanel(wx.Panel):
     
     if wx.VERSION < (2, 6, 0):
         def Bind(self, event, function, id = None):
@@ -2401,11 +2671,11 @@
             else:
                 event(self, function)
     
-    def _init_coll_VariablePanelSizer_Items(self, parent):
+    def _init_coll_MainSizer_Items(self, parent):
         parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW)
         parent.AddSizer(self.ControlPanelSizer, 0, border=0, flag=wx.GROW)
     
-    def _init_coll_VariablePanelSizer_Growables(self, parent):
+    def _init_coll_MainSizer_Growables(self, parent):
         parent.AddGrowableCol(0)
         parent.AddGrowableRow(0)
     
@@ -2438,75 +2708,46 @@
         parent.AddGrowableRow(0)
 
     def _init_sizers(self):
-        self.VariablePanelSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0)
+        self.MainSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0)
         self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
         self.ChoicePanelSizer = wx.GridSizer(cols=1, hgap=5, rows=4, vgap=5)
         self.ButtonPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
         
-        self._init_coll_VariablePanelSizer_Items(self.VariablePanelSizer)
-        self._init_coll_VariablePanelSizer_Growables(self.VariablePanelSizer)
+        self._init_coll_MainSizer_Items(self.MainSizer)
+        self._init_coll_MainSizer_Growables(self.MainSizer)
         self._init_coll_ControlPanelSizer_Items(self.ControlPanelSizer)
         self._init_coll_ControlPanelSizer_Growables(self.ControlPanelSizer)
         self._init_coll_ChoicePanelSizer_Items(self.ChoicePanelSizer)
         self._init_coll_ButtonPanelSizer_Items(self.ButtonPanelSizer)
         self._init_coll_ButtonPanelSizer_Growables(self.ButtonPanelSizer)
         
-        self.VariablePanel.SetSizer(self.VariablePanelSizer)
-
-    def _init_ctrls(self, prnt, element_type):
-        wx.SplitterWindow.__init__(self, id=ID_POUEDITORPANEL,
-              name='EditVariablePanel', parent=prnt, point=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.SP_3D)
-        self.SetNeedUpdating(True)
-        self.SetMinimumPaneSize(1)
-        
-        if element_type == "config":
-            self.Viewer = wx.Panel(id=ID_POUEDITORPANELVIEWER,
-              name='ConfigPanel', parent=self, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=0)
-            self.Viewer.SetSizer(wx.BoxSizer(wx.VERTICAL))
-            self.Viewer.ResetBuffer = lambda: None
-            self.Viewer.RefreshView = lambda: None
-        elif element_type == "resource":
-            self.Viewer = ResourceEditor(self, self.ParentWindow, self.Controler)
-        elif element_type == "FBD":
-            self.Viewer = Viewer(self, self.ParentWindow, self.Controler)
-        elif element_type == "LD":
-            self.Viewer = LD_Viewer(self, self.ParentWindow, self.Controler)
-        elif element_type == "SFC":
-            self.Viewer = SFC_Viewer(self, self.ParentWindow, self.Controler)
-        else:
-            self.Viewer = TextViewer(self, self.ParentWindow, self.Controler)
-            self.Viewer.SetTextSyntax(element_type)
-            if element_type == "IL":
-                self.Viewer.SetKeywords(IL_KEYWORDS)
-            else:
-                self.Viewer.SetKeywords(ST_KEYWORDS)
-        
-        self.VariablePanel = wx.Panel(id=ID_POUEDITORPANELVIEWER,
-              name='VariablePanel', parent=self, pos=wx.Point(0, 0),
+        self.SetSizer(self.MainSizer)
+
+    def _init_ctrls(self, prnt):
+        wx.Panel.__init__(self, id=ID_VARIABLEEDITORPANEL,
+              name='VariableEditorPanel', parent=prnt, pos=wx.Point(0, 0),
               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
         
-        self.staticText1 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT1,
-              label='Return Type:', name='staticText1', parent=self.VariablePanel,
+        self.staticText1 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT1,
+              label='Return Type:', name='staticText1', parent=self,
               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
 
-        self.ReturnType = wx.Choice(id=ID_POUEDITORPANELRETURNTYPE,
-              name='ReturnType', parent=self.VariablePanel, pos=wx.Point(0, 0),
+        self.ReturnType = wx.Choice(id=ID_VARIABLEEDITORPANELRETURNTYPE,
+              name='ReturnType', parent=self, pos=wx.Point(0, 0),
               size=wx.Size(145, 24), style=0)
-        self.Bind(wx.EVT_CHOICE, self.OnReturnTypeChanged, id=ID_POUEDITORPANELRETURNTYPE)
-
-        self.staticText2 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT2,
-              label='Class Filter:', name='staticText2', parent=self.VariablePanel,
+        self.Bind(wx.EVT_CHOICE, self.OnReturnTypeChanged, id=ID_VARIABLEEDITORPANELRETURNTYPE)
+
+        self.staticText2 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT2,
+              label='Class Filter:', name='staticText2', parent=self,
               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
 
-        self.ClassFilter = wx.Choice(id=ID_POUEDITORPANELCLASSFILTER,
-              name='ClassFilter', parent=self.VariablePanel, pos=wx.Point(0, 0),
+        self.ClassFilter = wx.Choice(id=ID_VARIABLEEDITORPANELCLASSFILTER,
+              name='ClassFilter', parent=self, pos=wx.Point(0, 0),
               size=wx.Size(145, 24), style=0)
-        self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_POUEDITORPANELCLASSFILTER)
-
-        self.VariablesGrid = wx.grid.Grid(id=ID_POUEDITORPANELVARIABLESGRID,
-              name='VariablesGrid', parent=self.VariablePanel, pos=wx.Point(0, 0), 
+        self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER)
+
+        self.VariablesGrid = wx.grid.Grid(id=ID_VARIABLEEDITORPANELVARIABLESGRID,
+              name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
               size=wx.Size(0, 150), style=wx.VSCROLL)
         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
               'Sans'))
@@ -2526,54 +2767,33 @@
             wx.grid.EVT_GRID_EDITOR_SHOWN(self.VariablesGrid, self.OnVariablesGridEditorShown)
         self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
         
-        self.AddButton = wx.Button(id=ID_POUEDITORPANELADDBUTTON, label='Add',
-              name='AddButton', parent=self.VariablePanel, pos=wx.Point(345, 340),
+        self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label='Add',
+              name='AddButton', parent=self, pos=wx.Point(345, 340),
               size=wx.Size(72, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_POUEDITORPANELADDBUTTON)
-
-        self.DeleteButton = wx.Button(id=ID_POUEDITORPANELDELETEBUTTON, label='Delete',
-              name='DeleteButton', parent=self.VariablePanel, pos=wx.Point(425, 340),
+        self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON)
+
+        self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label='Delete',
+              name='DeleteButton', parent=self, pos=wx.Point(425, 340),
               size=wx.Size(72, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_POUEDITORPANELDELETEBUTTON)
-
-        self.UpButton = wx.Button(id=ID_POUEDITORPANELUPBUTTON, label='^',
-              name='UpButton', parent=self.VariablePanel, pos=wx.Point(505, 340),
+        self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON)
+
+        self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
+              name='UpButton', parent=self, pos=wx.Point(505, 340),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_POUEDITORPANELUPBUTTON)
-
-        self.DownButton = wx.Button(id=ID_POUEDITORPANELDOWNBUTTON, label='v',
-              name='DownButton', parent=self.VariablePanel, pos=wx.Point(545, 340),
+        self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_VARIABLEEDITORPANELUPBUTTON)
+
+        self.DownButton = wx.Button(id=ID_VARIABLEEDITORPANELDOWNBUTTON, label='v',
+              name='DownButton', parent=self, pos=wx.Point(545, 340),
               size=wx.Size(32, 32), style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_POUEDITORPANELDOWNBUTTON)
-
-        self.SplitHorizontally(self.Viewer, self.VariablePanel, -200)
+        self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_VARIABLEEDITORPANELDOWNBUTTON)
 
         self._init_sizers()
 
-    def __init__(self, parent, window, controler, element_type, pou_name = None, transition_name = None, action_name = None, config_name = None, resource_name = None):
+    def __init__(self, parent, window, controler, element_type):
+        self._init_ctrls(parent)
         self.ParentWindow = window
         self.Controler = controler
         self.ElementType = element_type
-        self.PouName = pou_name
-        self.TransitionName = transition_name
-        self.ActionName = action_name
-        self.ConfigName = config_name
-        self.ResourceName = resource_name
-        
-        if element_type == "config":
-            self._init_ctrls(parent, "config")
-            pou_type = "config"
-        elif element_type == "resource":
-            self._init_ctrls(parent, "resource")
-            pou_type = "resource"
-        else:
-            if element_type == "transition":
-                self._init_ctrls(parent, self.Controler.GetTransitionBodyType(pou_name, transition_name))
-            elif element_type == "action":
-                self._init_ctrls(parent, self.Controler.GetActionBodyType(pou_name, action_name))
-            else:
-                self._init_ctrls(parent, self.Controler.GetPouBodyType(pou_name))
-            pou_type = self.Controler.GetPouType(pou_name)
         
         self.Filter = "All"
         self.FilterChoices = []
@@ -2582,15 +2802,15 @@
             "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
             "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
         
-        if pou_type in ["config", "resource"]:
+        if element_type in ["config", "resource"]:
             self.DefaultTypes = {"All" : "Global"}
             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
         else:
             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
-        if pou_type in ["config", "resource"] or pou_type == "program":
+        if element_type in ["config", "resource"] or element_type in ["program", "transition", "action"]:
             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
-            if pou_type not in ["config", "resource"]:
+            if element_type not in ["config", "resource"]:
                 self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
             else:
                 self.FilterChoices = ["All","Global","Access"]
@@ -2612,7 +2832,7 @@
         self.OptionList = "Yes,No"
         self.TypeList = [value for value, parent in TypeHierarchy_list if not value.startswith("ANY")]
         
-        if pou_type == "function":
+        if element_type == "function":
             for value, parent in TypeHierarchy_list:
                 if not value.startswith("ANY"):
                     self.ReturnType.Append(value)
@@ -2630,80 +2850,35 @@
             self.VariablesGrid.SetColAttr(col, attr)
             self.VariablesGrid.SetColSize(col, self.ColSizes[col])
     
-    def SetIndex(self, index):
-        self.ControlerIndex = index
-        
-    def GetIndex(self):
-        return self.ControlerIndex
-    
-    def RefreshName(self, name_type, old_name, new_name):
-        if name_type == ITEM_POU and self.PouName == old_name:
-            self.PouName = new_name
-        elif name_type == ITEM_TRANSITION and self.TransitionName == old_name:
-            self.TransitionName = new_name
-        elif name_type == ITEM_ACTION and self.ActionName == old_name:
-            self.ActionName = new_name
-        elif name_type == ITEM_CONFIGURATION and self.ConfigName == old_name:
-            self.ConfigName = new_name
-        elif name_type == ITEM_RESOURCE and self.ResourceName == old_name:
-            self.ResourceName = new_name
-    
-    def SetMode(self, mode):
-        if self.ElementType not in ["resource", "config"]:
-            if self.ElementType == "transition":
-                language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName)
-            elif self.ElementType == "action":
-                language = self.Controler.GetActionBodyType(self.PouName, self.ActionName)
-            else:
-                language = self.Controler.GetPouBodyType(self.PouName)
-            if language not in ["IL", "ST"]:
-                self.Viewer.SetMode(mode)
-
-    def ResetBuffer(self):
-        self.Viewer.ResetBuffer()
-
+    def SetTagName(self, tagname):
+        self.TagName = tagname
+    
     def RefreshView(self):
         self.PouNames = self.Controler.GetProjectPouNames()
         
+        words = self.TagName.split("::")
         if self.ElementType == "config":
             self.PouIsUsed = False
             returnType = None
-            self.Values = self.Controler.GetConfigurationGlobalVars(self.ConfigName)
+            self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
         elif self.ElementType == "resource":
             self.PouIsUsed = False
             returnType = None
-            self.Values = self.Controler.GetConfigurationResourceGlobalVars(self.ConfigName, self.ResourceName)
-        else:
-            self.PouIsUsed = self.Controler.PouIsUsed(self.PouName)
-            returnType = self.Controler.GetCurrentElementEditingInterfaceReturnType()
-            self.Values = self.Controler.GetCurrentElementEditingInterfaceVars()
+            self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
+        else:
+            self.PouIsUsed = self.Controler.PouIsUsed(words[1])
+            returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
+            self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
         
         if returnType and self.ReturnType.IsEnabled():
             self.ReturnType.SetStringSelection(returnType)
         
         self.RefreshValues()
-        self.RefreshViewerVarList()
         self.RefreshButtons()
-        self.Viewer.RefreshView()
-    
-    def RefreshViewerVarList(self):
-        if self.ElementType not in ["config", "resource"]:
-            varlist = [var["Name"] for var in self.Values]
-            if self.ElementType == "transition":
-                language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName)
-                varlist.append(self.TransitionName)
-            elif self.ElementType == "action":
-                language = self.Controler.GetActionBodyType(self.PouName, self.ActionName)
-                varlist.append(self.ActionName)
-            else:
-                language = self.Controler.GetPouBodyType(self.PouName)
-                varlist.append(self.PouName)
-            if language in ["IL", "ST"]:
-                self.Viewer.SetVariables(varlist)
-                self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
     
     def OnReturnTypeChanged(self, event):
-        self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
+        words = self.TagName.split("::")
+        self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
         self.Controler.BufferProject()
         self.ParentWindow.RefreshTitle()
         self.ParentWindow.RefreshEditMenu()
@@ -2797,30 +2972,17 @@
                 self.SaveValues(False)
                 old_value = self.Table.GetOldValue()
                 if old_value != "":
-                    self.Controler.UpdateCurrentPouEditingUsedVariable(old_value, value)
+                    self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
                 self.Controler.BufferProject()
+                self.ParentWindow.RefreshEditor(variablepanel = False)
                 self.ParentWindow.RefreshTitle()
                 self.ParentWindow.RefreshEditMenu()
-                self.RefreshViewerVarList()
-                self.Viewer.RefreshView()
                 event.Skip()
         else:
             self.SaveValues()
             if colname == "Class":
                 self.Table.ResetView(self.VariablesGrid)
             event.Skip()
-
-    def OnVariablesGridCellLeftClick(self, event):
-        if event.GetCol() == "#":
-            row = event.GetRow()
-            var_name = self.Table.GetValueByName(row, "Name")
-            var_class = self.Table.GetValueByName(row, "Class")
-            var_type = self.Table.GetValueByName(row, "Type")
-            data = wx.TextDataObject(str((var_name, var_class, var_type)))
-            dragSource = wx.DropSource(self.VariablesGrid)
-            dragSource.SetData(data)
-            dragSource.DoDragDrop()
-        event.Skip()
     
     def OnVariablesGridEditorShown(self, event):
         row, col = event.GetRow(), event.GetCol() 
@@ -2850,8 +3012,7 @@
             self.Table.SetValueByName(row, "Type", base_type)
             self.Table.ResetView(self.VariablesGrid)
             self.SaveValues(False)
-            self.Viewer.RefreshView()
-            self.Viewer.VerifyVariableTypeCompatibility()
+            self.ParentWindow.RefreshEditor(variablepanel = False)
             self.Controler.BufferProject()
             self.ParentWindow.RefreshTitle()
             self.ParentWindow.RefreshEditMenu()
@@ -2864,7 +3025,7 @@
             var_name = self.Table.GetValueByName(row, "Name")
             var_class = self.Table.GetValueByName(row, "Class")
             var_type = self.Table.GetValueByName(row, "Type")
-            data = wx.TextDataObject(str((var_name, var_class, var_type)))
+            data = wx.TextDataObject(str((var_name, var_class, var_type, self.TagName)))
             dragSource = wx.DropSource(self.VariablesGrid)
             dragSource.SetData(data)
             dragSource.DoDragDrop()
@@ -2896,14 +3057,15 @@
         self.Table.ResetView(self.VariablesGrid)
 
     def SaveValues(self, buffer = True):
+        words = self.TagName.split("::")
         if self.ElementType == "config":
-            self.Controler.SetConfigurationGlobalVars(self.ConfigName, self.Values)
+            self.Controler.SetConfigurationGlobalVars(words[1], self.Values)
         elif self.ElementType == "resource":
-            self.Controler.SetConfigurationResourceGlobalVars(self.ConfigName, self.ResourceName, self.Values)
+            self.Controler.SetConfigurationResourceGlobalVars(words[1], words[2], self.Values)
         else:
             if self.ReturnType.IsEnabled():
-                self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
-            self.Controler.SetPouInterfaceVars(self.PouName, self.Values)
+                self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
+            self.Controler.SetPouInterfaceVars(words[1], self.Values)
         if buffer:
             self.Controler.BufferProject()
             self.ParentWindow.RefreshTitle()