PLCOpenEditor.py
changeset 27 dae55dd9ee14
parent 16 20dcc0dce64b
child 28 fc23e1f415d8
--- a/PLCOpenEditor.py	Sat Jul 07 11:35:17 2007 +0200
+++ b/PLCOpenEditor.py	Mon Jul 09 11:10:14 2007 +0200
@@ -29,9 +29,10 @@
 import wx
 
 from SFCViewer import *
-from FBDViewer import *
 from LDViewer import *
 from Viewer import *
+from TextViewer import *
+from RessourceEditor import *
 from PLCControler import *
 from plcopen import OpenPDFDoc
 from plcopen.structures import *
@@ -74,25 +75,6 @@
  wxID_PLCOPENEDITORFBDTOOLBAR, wxID_PLCOPENEDITORLDTOOLBAR,
 ] = [wx.NewId() for _init_ctrls in range(10)]
 
-[wxID_PLCOPENEDITORTOOLBARITEMS0, 
-] = [wx.NewId() for _init_coll_DefaultToolBar_Items in range(1)]
-
-SFC_ITEMS = [wxID_PLCOPENEDITORSFCTOOLBARITEMS1, 
- wxID_PLCOPENEDITORSFCTOOLBARITEMS2, wxID_PLCOPENEDITORSFCTOOLBARITEMS3, 
- wxID_PLCOPENEDITORSFCTOOLBARITEMS4, wxID_PLCOPENEDITORSFCTOOLBARITEMS5,
- wxID_PLCOPENEDITORSFCTOOLBARITEMS6,
-] = [wx.NewId() for _init_coll_SFCToolBar_Items in range(6)]
-
-FBD_ITEMS = [wxID_PLCOPENEDITORFBDTOOLBARITEMS1, 
- wxID_PLCOPENEDITORFBDTOOLBARITEMS2, wxID_PLCOPENEDITORFBDTOOLBARITEMS3, 
- wxID_PLCOPENEDITORFBDTOOLBARITEMS4, wxID_PLCOPENEDITORFBDTOOLBARITEMS5,
-] = [wx.NewId() for _init_coll_FBDToolBar_Items in range(5)]
-
-LD_ITEMS = [wxID_PLCOPENEDITORLDTOOLBARITEMS1, 
- wxID_PLCOPENEDITORLDTOOLBARITEMS2, wxID_PLCOPENEDITORLDTOOLBARITEMS3, 
- wxID_PLCOPENEDITORLDTOOLBARITEMS4,
-] = [wx.NewId() for _init_coll_LDToolBar_Items in range(4)]
-
 [wxID_PLCOPENEDITORFILEMENUITEMS0, wxID_PLCOPENEDITORFILEMENUITEMS1, 
  wxID_PLCOPENEDITORFILEMENUITEMS2, wxID_PLCOPENEDITORFILEMENUITEMS3, 
  wxID_PLCOPENEDITORFILEMENUITEMS5, wxID_PLCOPENEDITORFILEMENUITEMS6, 
@@ -125,6 +107,56 @@
 [wxID_PLCOPENEDITORCONFIGMENUITEMS0, wxID_PLCOPENEDITORCONFIGMENUITEMS1, 
 ] = [wx.NewId() for _init_coll_ConfigMenu_Items in range(2)]
 
+
+#-------------------------------------------------------------------------------
+#                            ToolBars definitions
+#-------------------------------------------------------------------------------
+
+
+[wxID_PLCOPENEDITORTOOLBARSELECTION, wxID_PLCOPENEDITORTOOLBARCOMMENT,
+ wxID_PLCOPENEDITORTOOLBARVARIABLE, wxID_PLCOPENEDITORTOOLBARBLOCK,
+ wxID_PLCOPENEDITORTOOLBARCONNECTION, wxID_PLCOPENEDITORTOOLBARWIRE,
+ wxID_PLCOPENEDITORTOOLBARPOWERRAIL, wxID_PLCOPENEDITORTOOLBARRUNG,
+ wxID_PLCOPENEDITORTOOLBARCOIL, wxID_PLCOPENEDITORTOOLBARCONTACT,
+ wxID_PLCOPENEDITORTOOLBARBRANCH, wxID_PLCOPENEDITORTOOLBARINITIALSTEP,
+ wxID_PLCOPENEDITORTOOLBARSTEP, wxID_PLCOPENEDITORTOOLBARTRANSITION,
+ wxID_PLCOPENEDITORTOOLBARACTIONBLOCK, wxID_PLCOPENEDITORTOOLBARDIVERGENCE,
+ wxID_PLCOPENEDITORTOOLBARJUMP,
+] = [wx.NewId() for _init_coll_DefaultToolBar_Items in range(17)]
+
+ToolBarItems = {
+    "FBD" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", "Images/comment.png", "Create a new comment"),
+             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", "Images/variable.png", "Create a new variable"),
+             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", "Images/block.png", "Create a new block"),
+             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", "Images/connection.png", "Create a new connection"),
+             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARWIRE, "OnWireTool", "Images/wire.png", "Create a new wire")],
+    "LD" :  [(True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", "Images/comment.png", "Create a new comment"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", "Images/powerrail.png", "Create a new power rail"),
+             (False, DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARRUNG, "OnRungTool", "Images/rung.png", "Create a new rung"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCOIL, "OnCoilTool", "Images/coil.png", "Create a new coil"),
+             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", "Images/contact.png", "Create a new contact"),
+             (False, DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARBRANCH, "OnBranchTool", "Images/branch.png", "Create a new branch"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", "Images/variable.png", "Create a new variable"),
+             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", "Images/block.png", "Create a new block"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", "Images/connection.png", "Create a new connection"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARWIRE, "OnWireTool", "Images/wire.png", "Create a new wire")],
+    "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", "Images/comment.png", "Create a new comment"),
+             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARINITIALSTEP, "OnInitialStepTool", "Images/initial_step.png", "Create a new initial step"),
+             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARSTEP, "OnStepTool", "Images/step.png", "Create a new step"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARTRANSITION, "OnTransitionTool", "Images/transition.png", "Create a new transition"),
+             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARACTIONBLOCK, "OnActionBlockTool", "Images/action.png", "Create a new action block"),
+             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARDIVERGENCE, "OnDivergenceTool", "Images/divergence.png", "Create a new divergence"),
+             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARJUMP, "OnJumpTool", "Images/jump.png", "Create a new jump"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", "Images/variable.png", "Create a new variable"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", "Images/block.png", "Create a new block"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", "Images/connection.png", "Create a new connection"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", "Images/powerrail.png", "Create a new power rail"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", "Images/contact.png", "Create a new contact"),
+             (True, FREEDRAWING_MODE, wxID_PLCOPENEDITORTOOLBARWIRE, "OnWireTool", "Images/wire.png", "Create a new wire")],
+    "ST" : [],
+    "IL" : []
+}
+
 class PLCOpenEditor(wx.Frame):
     _custom_classes = {'wx.SashWindow' : ['Viewer']}
     
@@ -242,6 +274,8 @@
               id=wxID_PLCOPENEDITORFILEMENUITEMS6)
         self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu,
               id=wxID_PLCOPENEDITORFILEMENUITEMS7)
+        self.Bind(wx.EVT_MENU, self.OnPropertiesMenu,
+              id=wxID_PLCOPENEDITORFILEMENUITEMS9)
         self.Bind(wx.EVT_MENU, self.OnQuitMenu,
               id=wxID_PLCOPENEDITORFILEMENUITEMS11)
 
@@ -351,16 +385,16 @@
         self.ToolBar = wxToolBar(id=wxID_PLCOPENEDITORTOOLBAR, name='ToolBar',
               parent=self.EditorPanel, pos=wx.Point(0, 0), size=wx.Size(0, 40),
               style=wxTB_HORIZONTAL | wxNO_BORDER)
-        self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORTOOLBARITEMS0, 
+        self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORTOOLBARSELECTION, 
               wxBitmap(os.path.join(CWD, 'Images/select.png')), wxNullBitmap, "Select an object")
         self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
-              id=wxID_PLCOPENEDITORTOOLBARITEMS0)
+              id=wxID_PLCOPENEDITORTOOLBARSELECTION)
         
         self.ProjectTree = wx.TreeCtrl(id=wxID_PLCOPENEDITORPROJECTTREE,
               name='treeCtrl1', parent=self.splitterWindow1, pos=wx.Point(0, 0),
               size=wx.Size(-1, -1),
               style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
-        self.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp)
+        self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp)
         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
               id=wxID_PLCOPENEDITORPROJECTTREE)
         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit,
@@ -391,11 +425,16 @@
             self.RefreshProjectTree()
         
         self.CurrentToolBar = []
+        self.CurrentLanguage = ""
+        self.DrawingMode = DRIVENDRAWING_MODE
         
         self.RefreshFileMenu()
         self.RefreshEditMenu()
         self.RefreshToolBar()
 
+    def GetDrawingMode(self):
+        return self.DrawingMode
+
     def RefreshFileMenu(self):
         if self.FileMenu:
             if self.Controler.HasOpenedProject():
@@ -441,6 +480,20 @@
                 self.EditMenu.FindItemByPosition(5).Enable(False)
             self.EditMenu.FindItemByPosition(6).Enable(False)
 
+    def ShowProperties(self):
+        old_values = self.Controler.GetProjectProperties()
+        old_values["projectName"] = self.Controler.GetProjectName()
+        dialog = ProjectDialog(self)
+        dialog.SetValues(old_values)
+        if dialog.ShowModal() == wxID_OK:
+            new_values = dialog.GetValues()
+            projectname = new_values.pop("projectName")
+            new_values["creationDateTime"] = old_values["creationDateTime"]
+            self.Controler.SetProjectName(projectname)
+            self.Controler.SetProjectProperties(new_values)
+            self.RefreshProjectTree()
+        dialog.Destroy()
+
     def OnNewProjectMenu(self, event):
         dialog = ProjectDialog(self)
         if dialog.ShowModal() == wxID_OK:
@@ -529,7 +582,7 @@
         if filepath != "":
             directory, filename = os.path.split(filepath)
         else:
-            directory, filename = os.getcwd(), "%s.od"%self.Controler.GetProjectName()
+            directory, filename = os.getcwd(), "%s.xml"%self.Controler.GetProjectName()
         dialog = wxFileDialog(self, "Choose a file", directory, filename,  "PLCOpen files (*.xml)|*.xml|All files|*.*", wxSAVE|wxOVERWRITE_PROMPT)
         if dialog.ShowModal() == wxID_OK:
             filepath = dialog.GetPath()
@@ -545,6 +598,10 @@
                 message.Destroy()
         dialog.Destroy()
 
+    def OnPropertiesMenu(self, event):
+        self.ShowProperties()
+        event.Skip()
+
     def OnQuitMenu(self, event):
         self.ToolBar.Reparent(self)
         self.Controler.Reset()
@@ -557,7 +614,7 @@
             window = self.TabsOpened.GetPage(selected)
             if not isinstance(window, TextViewer):
                 window.SetMode(MODE_SELECTION)
-        self.ToolBar.ToggleTool(wxID_PLCOPENEDITORTOOLBARITEMS0, True)
+        self.ToolBar.ToggleTool(wxID_PLCOPENEDITORTOOLBARSELECTION, True)
 
     def ResetToolToggle(self, id):
         tool = self.ToolBar.FindById(id)
@@ -569,101 +626,134 @@
             self.TabsOpened.GetPage(selected).SetMode(MODE_SELECTION)
         event.Skip()
     
-    def OnSFCCommentTool(self, event):
-        self.ResetToolToggle(wxID_PLCOPENEDITORSFCTOOLBARITEMS1)
+    def OnCommentTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARCOMMENT)
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
             self.TabsOpened.GetPage(selected).SetMode(MODE_COMMENT)
         event.Skip()
     
-    def OnSFCInitialStepTool(self, event):
-        self.ResetToolToggle(wxID_PLCOPENEDITORSFCTOOLBARITEMS2)
-        selected = self.TabsOpened.GetSelection()
-        if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_INITIAL_STEP)
-        event.Skip()
-    
-    def OnSFCStepTool(self, event):
-        selected = self.TabsOpened.GetSelection()
-        if selected != -1:
-            self.TabsOpened.GetPage(selected).AddStep()
-        event.Skip()
-
-    def OnSFCActionBlockTool(self, event):
-        selected = self.TabsOpened.GetSelection()
-        if selected != -1:
-            self.TabsOpened.GetPage(selected).AddStepAction()
-        event.Skip()
-
-    def OnSFCDivergenceTool(self, event):
-        selected = self.TabsOpened.GetSelection()
-        if selected != -1:
-            self.TabsOpened.GetPage(selected).AddDivergence()
-        event.Skip()
-    
-    def OnSFCJumpTool(self, event):
-        selected = self.TabsOpened.GetSelection()
-        if selected != -1:
-            self.TabsOpened.GetPage(selected).AddJump()
-        event.Skip()
-    
-    def OnFBDCommentTool(self, event):
-        self.ResetToolToggle(wxID_PLCOPENEDITORFBDTOOLBARITEMS1)
-        selected = self.TabsOpened.GetSelection()
-        if selected != -1:
-            self.TabsOpened.GetPage(selected).SetMode(MODE_COMMENT)
-        event.Skip()
-    
-    def OnFBDVariableTool(self, event):
-        self.ResetToolToggle(wxID_PLCOPENEDITORFBDTOOLBARITEMS2)
+    def OnVariableTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARVARIABLE)
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
             self.TabsOpened.GetPage(selected).SetMode(MODE_VARIABLE)
         event.Skip()
     
-    def OnFBDBlockTool(self, event):
-        self.ResetToolToggle(wxID_PLCOPENEDITORFBDTOOLBARITEMS3)
+    def OnBlockTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARBLOCK)
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
             self.TabsOpened.GetPage(selected).SetMode(MODE_BLOCK)
         event.Skip()
         
-    def OnFBDConnectionTool(self, event):
-        self.ResetToolToggle(wxID_PLCOPENEDITORFBDTOOLBARITEMS4)
+    def OnConnectionTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARCONNECTION)
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
             self.TabsOpened.GetPage(selected).SetMode(MODE_CONNECTION)
         event.Skip()
 
-    def OnFBDWireTool(self, event):
-        self.ResetToolToggle(wxID_PLCOPENEDITORFBDTOOLBARITEMS5)
+    def OnWireTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARWIRE)
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
             self.TabsOpened.GetPage(selected).SetMode(MODE_WIRE)
         event.Skip()
 
-    def OnLDCoilTool(self, event):
+    def OnPowerRailTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARPOWERRAIL)
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            self.TabsOpened.GetPage(selected).SetMode(MODE_POWERRAIL)
+        event.Skip()
+
+    def OnRungTool(self, event):
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
             self.TabsOpened.GetPage(selected).AddRung()
         event.Skip()
     
-    def OnLDContactTool(self, event):
+    def OnCoilTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARCOIL)
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).AddContact()
-        event.Skip()
-    
-    def OnLDBlockTool(self, event):
+            self.TabsOpened.GetPage(selected).SetMode(MODE_COIL)
+        event.Skip()
+    
+    def OnContactTool(self, event):
+        if self.DrawingMode == FREEDRAWING_MODE:
+            self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARCONTACT)
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
-            self.TabsOpened.GetPage(selected).AddBlock()
-        event.Skip()
-    
-    def OnLDBranchTool(self, event): 
+            if self.DrawingMode == FREEDRAWING_MODE:
+                self.TabsOpened.GetPage(selected).SetMode(MODE_CONTACT)
+            else:
+                self.TabsOpened.GetPage(selected).AddContact()
+        event.Skip()
+    
+    def OnBranchTool(self, event): 
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
             self.TabsOpened.GetPage(selected).AddBranch()
+        event.Skip()    
+    
+    def OnInitialStepTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARINITIALSTEP)
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            self.TabsOpened.GetPage(selected).SetMode(MODE_INITIALSTEP)
+        event.Skip()
+    
+    def OnStepTool(self, event):
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARSTEP)
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            if self.GetDrawingMode() == FREEDRAWING_MODE:
+                self.TabsOpened.GetPage(selected).SetMode(MODE_STEP)
+            else:
+                self.TabsOpened.GetPage(selected).AddStep()
+        event.Skip()
+
+    def OnActionBlockTool(self, event):
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARACTIONBLOCK)
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            if self.GetDrawingMode() == FREEDRAWING_MODE:
+                self.TabsOpened.GetPage(selected).SetMode(MODE_ACTION)
+            else:
+                self.TabsOpened.GetPage(selected).AddStepAction()
+        event.Skip()
+
+    def OnTransitionTool(self, event):
+        self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARTRANSITION)
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            self.TabsOpened.GetPage(selected).SetMode(MODE_TRANSITION)
+        event.Skip()
+
+    def OnDivergenceTool(self, event):
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARDIVERGENCE)
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            if self.GetDrawingMode() == FREEDRAWING_MODE:
+                self.TabsOpened.GetPage(selected).SetMode(MODE_DIVERGENCE)
+            else:
+                self.TabsOpened.GetPage(selected).AddDivergence()
+        event.Skip()
+    
+    def OnJumpTool(self, event):
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            self.ResetToolToggle(wxID_PLCOPENEDITORTOOLBARJUMP)
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            if self.GetDrawingMode() == FREEDRAWING_MODE:
+                self.TabsOpened.GetPage(selected).SetMode(MODE_JUMP)
+            else:
+                self.TabsOpened.GetPage(selected).AddJump()
         event.Skip()
         
     def OnPouSelectedChanged(self, event):
@@ -785,18 +875,7 @@
         name = self.ProjectTree.GetItemText(selected)
         data = self.ProjectTree.GetPyData(selected)
         if name == "Properties":
-            old_values = self.Controler.GetProjectProperties()
-            old_values["projectName"] = self.Controler.GetProjectName()
-            dialog = ProjectDialog(self)
-            dialog.SetValues(old_values)
-            if dialog.ShowModal() == wxID_OK:
-                new_values = dialog.GetValues()
-                projectname = new_values.pop("projectName")
-                new_values["creationDateTime"] = old_values["creationDateTime"]
-                self.Controler.SetProjectName(projectname)
-                self.Controler.SetProjectProperties(new_values)
-                self.RefreshProjectTree()
-            dialog.Destroy()
+            self.ShowProperties()
         elif data == ITEM_CLASS:
             item = self.ProjectTree.GetItemParent(selected)
             item_type = self.ProjectTree.GetPyData(item)
@@ -889,7 +968,7 @@
                         varlist.append(var["Name"])
             if idx != None:
                 if language == "FBD":
-                    new_window = FBD_Viewer(self.TabsOpened, self, self.Controler)
+                    new_window = Viewer(self.TabsOpened, self, self.Controler)
                 elif language == "LD":
                     new_window = LD_Viewer(self.TabsOpened, self, self.Controler)
                 elif language == "SFC":
@@ -1017,92 +1096,29 @@
                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
         while item.IsOk():
             to_delete.append(item)
-            item, root_cookie = self.ProjectTree.GetNextChild(item, root_cookie)
+            item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
         for item in to_delete:
             self.ProjectTree.Delete(item)
-
+    
     def ResetToolBar(self):
         for item in self.CurrentToolBar:
+            self.Unbind(wx.EVT_MENU, id=item)
             self.ToolBar.DeleteTool(item)
 
     def RefreshToolBar(self):
         language = self.Controler.GetCurrentElementEditingBodyType()
-        if language == "SFC":
-            if self.CurrentToolBar != SFC_ITEMS:
-                self.ResetToolBar()
-                self.CurrentToolBar = SFC_ITEMS
-                self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS1, 
-                      wxBitmap(os.path.join(CWD, 'Images/comment.png')), wxNullBitmap, "Create a new comment")
-                self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS2, 
-                      wxBitmap(os.path.join(CWD, 'Images/initial_step.png')), wxNullBitmap, "Create a new initial step")
-                self.ToolBar.AddSimpleTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS3, 
-                      wxBitmap(os.path.join(CWD, 'Images/step.png')), "Create a new step")
-                self.ToolBar.AddSimpleTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS4, 
-                      wxBitmap(os.path.join(CWD, 'Images/action.png')), "Add action block to step")
-                self.ToolBar.AddSimpleTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS5, 
-                      wxBitmap(os.path.join(CWD, 'Images/divergence.png')), "Create a new divergence")
-                self.ToolBar.AddSimpleTool(wxID_PLCOPENEDITORSFCTOOLBARITEMS6, 
-                      wxBitmap(os.path.join(CWD, 'Images/jump.png')), "Create a new jump")
-                self.Bind(wx.EVT_TOOL, self.OnSFCCommentTool, 
-                      id=wxID_PLCOPENEDITORSFCTOOLBARITEMS1)
-                self.Bind(wx.EVT_TOOL, self.OnSFCInitialStepTool,
-                      id=wxID_PLCOPENEDITORSFCTOOLBARITEMS2)
-                self.Bind(wx.EVT_TOOL, self.OnSFCStepTool,
-                      id=wxID_PLCOPENEDITORSFCTOOLBARITEMS3)
-                self.Bind(wx.EVT_TOOL, self.OnSFCActionBlockTool,
-                      id=wxID_PLCOPENEDITORSFCTOOLBARITEMS4)
-                self.Bind(wx.EVT_TOOL, self.OnSFCDivergenceTool,
-                      id=wxID_PLCOPENEDITORSFCTOOLBARITEMS5)
-                self.Bind(wx.EVT_TOOL, self.OnSFCJumpTool,
-                      id=wxID_PLCOPENEDITORSFCTOOLBARITEMS6)
-        elif language == "FBD":
-            if self.CurrentToolBar != FBD_ITEMS:
-                self.ResetToolBar()
-                self.CurrentToolBar = FBD_ITEMS
-                self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS1, 
-                      wxBitmap(os.path.join(CWD, 'Images/comment.png')), wxNullBitmap, "Create a new comment")
-                self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS2, 
-                      wxBitmap(os.path.join(CWD, 'Images/variable.png')), wxNullBitmap, "Create a new variable")
-                self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS3, 
-                      wxBitmap(os.path.join(CWD, 'Images/block.png')), wxNullBitmap, "Create a new block")
-                self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS4, 
-                      wxBitmap(os.path.join(CWD, 'Images/connection.png')), wxNullBitmap, "Create a new connection")
-                self.ToolBar.AddRadioTool(wxID_PLCOPENEDITORFBDTOOLBARITEMS5, 
-                      wxBitmap(os.path.join(CWD, 'Images/wire.png')), wxNullBitmap, "Create a new wire")
-                self.Bind(wx.EVT_TOOL, self.OnFBDCommentTool, 
-                      id=wxID_PLCOPENEDITORFBDTOOLBARITEMS1)
-                self.Bind(wx.EVT_TOOL, self.OnFBDVariableTool,
-                      id=wxID_PLCOPENEDITORFBDTOOLBARITEMS2)
-                self.Bind(wx.EVT_TOOL, self.OnFBDBlockTool,
-                      id=wxID_PLCOPENEDITORFBDTOOLBARITEMS3)
-                self.Bind(wx.EVT_TOOL, self.OnFBDConnectionTool, 
-                      id=wxID_PLCOPENEDITORFBDTOOLBARITEMS4)
-                self.Bind(wx.EVT_TOOL, self.OnFBDWireTool, 
-                      id=wxID_PLCOPENEDITORFBDTOOLBARITEMS5)
-        elif language == "LD":
-            if self.CurrentToolBar != LD_ITEMS:
-                self.ResetToolBar()
-                self.CurrentToolBar = LD_ITEMS
-                self.ToolBar.AddSimpleTool(wxID_PLCOPENEDITORLDTOOLBARITEMS1, 
-                      wxBitmap(os.path.join(CWD, 'Images/coil.png')), "Create a new rung")
-                self.ToolBar.AddSimpleTool(wxID_PLCOPENEDITORLDTOOLBARITEMS2, 
-                      wxBitmap(os.path.join(CWD, 'Images/contact.png')), "Create a new contact")
-                self.ToolBar.AddSimpleTool(wxID_PLCOPENEDITORLDTOOLBARITEMS3, 
-                      wxBitmap(os.path.join(CWD, 'Images/block.png')), "Create a new block")
-                self.ToolBar.AddSimpleTool(wxID_PLCOPENEDITORLDTOOLBARITEMS4, 
-                      wxBitmap(os.path.join(CWD, 'Images/branch.png')), "Create a new branch")
-                self.Bind(wx.EVT_TOOL, self.OnLDCoilTool,
-                      id=wxID_PLCOPENEDITORLDTOOLBARITEMS1)
-                self.Bind(wx.EVT_TOOL, self.OnLDContactTool,
-                      id=wxID_PLCOPENEDITORLDTOOLBARITEMS2)
-                self.Bind(wx.EVT_TOOL, self.OnLDBlockTool, 
-                      id=wxID_PLCOPENEDITORLDTOOLBARITEMS3)
-                self.Bind(wx.EVT_TOOL, self.OnLDBranchTool, 
-                      id=wxID_PLCOPENEDITORLDTOOLBARITEMS4)
-        else:
-            if len(self.CurrentToolBar) > 0:
-                self.ResetToolBar()
-                self.CurrentToolBar = []
+        if language and language != self.CurrentLanguage:
+            self.ResetToolBar()
+            self.CurrentLanguage = language
+            self.CurrentToolBar = []
+            for radio, modes, id, method, picture, help in ToolBarItems[language]:
+                if modes & self.DrawingMode:
+                    if radio or self.DrawingMode == FREEDRAWING_MODE:
+                        self.ToolBar.AddRadioTool(id, wxBitmap(os.path.join(CWD, picture)), wxNullBitmap, help)
+                    else:
+                        self.ToolBar.AddSimpleTool(id, wxBitmap(os.path.join(CWD, picture)), help)
+                    self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
+                    self.CurrentToolBar.append(id)
         self.ResetCurrentMode()
 
     def RefreshTabsOpenedTitles(self):
@@ -2063,7 +2079,7 @@
 
         self.OptionList = "Yes,No"
         self.TypeList = ""
-        for value in TypeHierarchy.keys():
+        for value, parent in TypeHierarchy_list:
             if not value.startswith("ANY"):
                 self.TypeList += "%s,"%value
         self.TypeList = self.TypeList[:-1]
@@ -2208,6 +2224,7 @@
         self.RefreshValues()
     
     def RefreshValues(self):
+        self.VariablesGrid.SetGridCursor(0, 0)
         data = []
         for variable in self.Values:
             if variable["Class"] in self.ClassList: