Changing file headers
authorlbessard
Thu, 02 Aug 2007 16:51:58 +0200
changeset 58 39cd981ff242
parent 57 9bf197698af0
child 59 af079a11837b
Changing file headers
Adding support for automatically modifying variable and POU names when changing
Dialogs.py
LDViewer.py
PLCControler.py
PLCGenerator.py
PLCOpenEditor.py
RessourceEditor.py
SFCViewer.py
TextViewer.py
Viewer.py
__init__.py
examples/example.xml
generate_IEC_std.py
graphics/FBD_Objects.py
graphics/GraphicCommons.py
graphics/LD_Objects.py
graphics/SFC_Objects.py
graphics/__init__.py
obf.py
plcopen/__init__.py
plcopen/docpdf.py
plcopen/plcopen.py
plcopen/structures.py
xmlclass/__init__.py
xmlclass/xmlclass.py
--- a/Dialogs.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/Dialogs.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
@@ -32,13 +32,12 @@
 #                          Create New Block Dialog
 #-------------------------------------------------------------------------------
 
-[wxID_BLOCKPROPERTIESDIALOG, wxID_BLOCKPROPERTIESDIALOGMAINPANEL, 
- wxID_BLOCKPROPERTIESDIALOGNAME, wxID_BLOCKPROPERTIESDIALOGTYPETREE, 
- wxID_BLOCKPROPERTIESDIALOGTYPEDESC, wxID_BLOCKPROPERTIESDIALOGINPUTS, 
- wxID_BLOCKPROPERTIESDIALOGPREVIEW, wxID_BLOCKPROPERTIESDIALOGSTATICTEXT1, 
- wxID_BLOCKPROPERTIESDIALOGSTATICTEXT2, wxID_BLOCKPROPERTIESDIALOGSTATICTEXT3, 
- wxID_BLOCKPROPERTIESDIALOGSTATICTEXT4, 
-] = [wx.NewId() for _init_ctrls in range(11)]
+[wxID_BLOCKPROPERTIESDIALOG, wxID_BLOCKPROPERTIESDIALOGNAME, 
+ wxID_BLOCKPROPERTIESDIALOGTYPETREE, wxID_BLOCKPROPERTIESDIALOGTYPEDESC, 
+ wxID_BLOCKPROPERTIESDIALOGINPUTS, wxID_BLOCKPROPERTIESDIALOGPREVIEW, 
+ wxID_BLOCKPROPERTIESDIALOGSTATICTEXT1, wxID_BLOCKPROPERTIESDIALOGSTATICTEXT2, 
+ wxID_BLOCKPROPERTIESDIALOGSTATICTEXT3, wxID_BLOCKPROPERTIESDIALOGSTATICTEXT4, 
+] = [wx.NewId() for _init_ctrls in range(10)]
 
 [CATEGORY, BLOCK] = range(2)
 
@@ -46,76 +45,121 @@
     def _init_coll_flexGridSizer1_Items(self, parent):
         # generated method, don't edit
 
-        parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
+        parent.AddSizer(self.MainSizer, 0, border=20, flag=wxGROW|wxTOP|wxLEFT|wxRIGHT)
+        parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT)
+
+    def _init_coll_flexGridSizer1_Growables(self, parent):
+        # generated method, don't edit
+
+        parent.AddGrowableCol(0)
+        parent.AddGrowableRow(0)
+
+    def _init_coll_MainSizer_Items(self, parent):
+        # generated method, don't edit
+
+        parent.AddSizer(self.LeftBoxSizer, 1, border=5, flag=wxGROW|wxRIGHT)
+        parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wxGROW|wxLEFT)
+
+    def _init_coll_LeftBoxSizer_Items(self, parent):
+        # generated method, don't edit
+
+        parent.AddWindow(self.TypeTree, 3, border=5, flag=wxGROW|wxBOTTOM)
+        parent.AddWindow(self.TypeDesc, 1, border=0, flag=wxGROW)
+
+    def _init_coll_RightGridSizer_Items(self, parent):
+        # generated method, don't edit
+
+        parent.AddSizer(self.RightUpGridSizer, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.staticText4, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.Preview, 0, border=0, flag=wxGROW)
+
+    def _init_coll_RightGridSizer_Growables(self, parent):
+        # generated method, don't edit
+
+        parent.AddGrowableCol(0)
+        parent.AddGrowableRow(2)
+
+    def _init_coll_RightUpGridSizer_Items(self, parent):
+        # generated method, don't edit
+
+        parent.AddWindow(self.staticText2, 0, border=0, flag=wxGROW|wxALIGN_BOTTOM)
+        parent.AddWindow(self.staticText3, 0, border=0, flag=wxGROW|wxALIGN_BOTTOM)
+        parent.AddWindow(self.Name, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.Inputs, 0, border=0, flag=wxGROW)
 
     def _init_sizers(self):
         # generated method, don't edit
-        self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
-
+        self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+        self.MainSizer = wx.BoxSizer(wxHORIZONTAL)
+        self.LeftBoxSizer = wx.StaticBoxSizer(self.staticbox1, wxVERTICAL)
+        self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
+        self.RightUpGridSizer = wx.GridSizer(cols=2, hgap=5, rows=2, vgap=5)
+        
         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
-
+        self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+        self._init_coll_MainSizer_Items(self.MainSizer)
+        self._init_coll_LeftBoxSizer_Items(self.LeftBoxSizer)
+        self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+        self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+        self._init_coll_RightUpGridSizer_Items(self.RightUpGridSizer)
+        
         self.SetSizer(self.flexGridSizer1)
 
     def _init_ctrls(self, prnt):
         # generated method, don't edit
         wx.Dialog.__init__(self, id=wxID_BLOCKPROPERTIESDIALOG,
               name='BlockPropertiesDialog', parent=prnt, pos=wx.Point(376, 223),
-              size=wx.Size(600, 360), style=wx.DEFAULT_DIALOG_STYLE,
+              size=wx.Size(600, 360), style=wx.DEFAULT_DIALOG_STYLE|wxRESIZE_BORDER,
               title='Block Properties')
         self.SetClientSize(wx.Size(600, 360))
 
-        self.MainPanel = wx.Panel(id=wxID_BLOCKPROPERTIESDIALOGMAINPANEL,
-              name='MainPanel', parent=self, pos=wx.Point(0, 0),
-              size=wx.Size(600, 320), style=wx.TAB_TRAVERSAL)
-        self.MainPanel.SetAutoLayout(True)
-
         self.staticbox1 = wx.StaticBox(id=wxID_BLOCKPROPERTIESDIALOGSTATICTEXT1,
-              label='Type:', name='staticBox1', parent=self.MainPanel,
-              pos=wx.Point(24, 24), size=wx.Size(245, 280), style=0)
+              label='Type:', name='staticBox1', parent=self,
+              pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0)
 
         self.staticText2 = wx.StaticText(id=wxID_BLOCKPROPERTIESDIALOGSTATICTEXT2,
-              label='Name:', name='staticText2', parent=self.MainPanel,
-              pos=wx.Point(274, 24), size=wx.Size(70, 17), style=0)
+              label='Name:', name='staticText2', parent=self,
+              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
 
         self.staticText3 = wx.StaticText(id=wxID_BLOCKPROPERTIESDIALOGSTATICTEXT2,
-              label='Inputs:', name='staticText4', parent=self.MainPanel,
-              pos=wx.Point(424, 24), size=wx.Size(70, 17), style=0)
+              label='Inputs:', name='staticText4', parent=self,
+              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
 
         self.staticText4 = wx.StaticText(id=wxID_BLOCKPROPERTIESDIALOGSTATICTEXT4,
-              label='Preview:', name='staticText4', parent=self.MainPanel,
-              pos=wx.Point(274, 80), size=wx.Size(100, 17), style=0)
+              label='Preview:', name='staticText4', parent=self,
+              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
 
         self.TypeTree = wx.TreeCtrl(id=wxID_BLOCKPROPERTIESDIALOGTYPETREE,
-              name='TypeTree', parent=self.MainPanel, pos=wx.Point(34, 44),
-              size=wx.Size(225, 180), style=wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER)
+              name='TypeTree', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 0), style=wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER)
         EVT_TREE_SEL_CHANGED(self, wxID_BLOCKPROPERTIESDIALOGTYPETREE, self.OnTypeTreeItemSelected)
 
         self.TypeDesc = wx.TextCtrl(id=wxID_BLOCKPROPERTIESDIALOGTYPEDESC,
-              name='TypeDesc', parent=self.MainPanel, pos=wx.Point(34, 230),
-              size=wx.Size(225, 65), style=wx.TE_READONLY|wx.TE_MULTILINE)
+              name='TypeDesc', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 0), style=wx.TE_READONLY|wx.TE_MULTILINE)
 
         self.Name = wx.TextCtrl(id=wxID_BLOCKPROPERTIESDIALOGNAME, value='',
-              name='Name', parent=self.MainPanel, pos=wx.Point(274, 48),
-              size=wx.Size(145, 24), style=0)
+              name='Name', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 24), style=0)
         EVT_TEXT(self, wxID_BLOCKPROPERTIESDIALOGNAME, self.OnNameChanged)
 
         self.Inputs = wx.SpinCtrl(id=wxID_BLOCKPROPERTIESDIALOGINPUTS,
-              name='Inputs', parent=self.MainPanel, pos=wx.Point(424, 48),
-              size=wx.Size(145, 24), style=wxSP_ARROW_KEYS, min=2, max=20)
+              name='Inputs', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 24), style=wxSP_ARROW_KEYS, min=2, max=20)
         EVT_SPINCTRL(self, wxID_BLOCKPROPERTIESDIALOGINPUTS, self.OnInputsChanged)
 
         self.Preview = wx.Panel(id=wxID_BLOCKPROPERTIESDIALOGPREVIEW,
-              name='Preview', parent=self.MainPanel, pos=wx.Point(274, 104),
-              size=wx.Size(300, 200), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+              name='Preview', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
         self.Preview.SetBackgroundColour(wxColour(255,255,255))
         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
 
+        self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL|wxCENTRE)
+        
         self._init_sizers()
 
     def __init__(self, parent):
         self._init_ctrls(parent)
-        self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL|wxCENTRE)
-        self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT)
         self.Name.SetValue("")
         self.Name.Enable(False)
         self.Inputs.Enable(False)
@@ -269,7 +313,7 @@
 #                          Create New Variable Dialog
 #-------------------------------------------------------------------------------
 
-[wxID_VARIABLEPROPERTIESDIALOG, wxID_VARIABLEPROPERTIESDIALOGMAINPANEL, 
+[wxID_VARIABLEPROPERTIESDIALOG, wxID_VARIABLEPROPERTIESDIALOGSPACER, 
  wxID_VARIABLEPROPERTIESDIALOGNAME, wxID_VARIABLEPROPERTIESDIALOGCLASS, 
  wxID_VARIABLEPROPERTIESDIALOGPREVIEW, wxID_VARIABLEPROPERTIESDIALOGEXPRESSION,
  wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT1, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT2,
@@ -280,14 +324,79 @@
     def _init_coll_flexGridSizer1_Items(self, parent):
         # generated method, don't edit
 
-        parent.AddWindow(self.MainPanel, 0, border=0, flag=0)
-
+        parent.AddSizer(self.MainSizer, 0, border=20, flag=wxGROW|wxTOP|wxLEFT|wxRIGHT)
+        parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT)
+        
+    def _init_coll_flexGridSizer1_Growables(self, parent):
+        # generated method, don't edit
+
+        parent.AddGrowableCol(0)
+        parent.AddGrowableRow(0)
+    
+    def _init_coll_MainSizer_Items(self, parent):
+        # generated method, don't edit
+
+        parent.AddSizer(self.TopSizer, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.staticText4, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.Preview, 0, border=0, flag=wxGROW)
+        
+    def _init_coll_MainSizer_Growables(self, parent):
+        # generated method, don't edit
+
+        parent.AddGrowableCol(0)
+        parent.AddGrowableRow(2)
+    
+    def _init_coll_TopSizer_Items(self, parent):
+        # generated method, don't edit
+
+        parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wxGROW|wxRIGHT)
+        parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wxGROW|wxLEFT)
+    
+    def _init_coll_LeftGridSizer_Items(self, parent):
+        # generated method, don't edit
+
+        parent.AddWindow(self.staticText1, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.Class, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.Spacer, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.staticText2, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.Expression, 0, border=0, flag=wxGROW)
+    
+    def _init_coll_LeftGridSizer_Growables(self, parent):
+        # generated method, don't edit
+
+        parent.AddGrowableCol(0)
+        parent.AddGrowableRow(2)
+            
+    def _init_coll_RightGridSizer_Items(self, parent):
+        # generated method, don't edit
+
+        parent.AddWindow(self.staticText3, 0, border=0, flag=wxGROW)
+        parent.AddWindow(self.Name, 0, border=0, flag=wxGROW)
+        
+    def _init_coll_RightGridSizer_Growables(self, parent):
+        # generated method, don't edit
+
+        parent.AddGrowableCol(0)
+        parent.AddGrowableRow(1)
+        
     def _init_sizers(self):
         # generated method, don't edit
-        self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
+        self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
+        self.TopSizer = wx.BoxSizer(wxHORIZONTAL)
+        self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=5, vgap=5)
+        self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
 
         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
-
+        self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
+        self._init_coll_MainSizer_Items(self.MainSizer)
+        self._init_coll_MainSizer_Growables(self.MainSizer)
+        self._init_coll_TopSizer_Items(self.TopSizer)
+        self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
+        self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
+        self._init_coll_RightGridSizer_Items(self.RightGridSizer)
+        self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
+        
         self.SetSizer(self.flexGridSizer1)
 
     def _init_ctrls(self, prnt):
@@ -298,54 +407,53 @@
               title='Variable Properties')
         self.SetClientSize(wx.Size(400, 380))
 
-        self.MainPanel = wx.Panel(id=wxID_VARIABLEPROPERTIESDIALOGMAINPANEL,
-              name='MainPanel', parent=self, pos=wx.Point(0, 0),
-              size=wx.Size(400, 280), style=wx.TAB_TRAVERSAL)
-        self.MainPanel.SetAutoLayout(True)
-
         self.staticText1 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT1,
-              label='Class:', name='staticText1', parent=self.MainPanel,
-              pos=wx.Point(24, 24), size=wx.Size(70, 17), style=0)
+              label='Class:', name='staticText1', parent=self,
+              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
 
         self.staticText2 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT2,
-              label='Expression:', name='staticText2', parent=self.MainPanel,
-              pos=wx.Point(24, 90), size=wx.Size(100, 17), style=0)
+              label='Expression:', name='staticText2', parent=self,
+              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
 
         self.staticText3 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT3,
-              label='Name:', name='staticText3', parent=self.MainPanel,
-              pos=wx.Point(204, 24), size=wx.Size(70, 17), style=0)
+              label='Name:', name='staticText3', parent=self,
+              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
 
         self.staticText4 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT4,
-              label='Preview:', name='staticText4', parent=self.MainPanel,
-              pos=wx.Point(24, 144), size=wx.Size(100, 17), style=0)
+              label='Preview:', name='staticText4', parent=self,
+              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
 
         self.Class = wx.Choice(id=wxID_VARIABLEPROPERTIESDIALOGCLASS,
-              name='Class', parent=self.MainPanel, pos=wx.Point(24, 48),
-              size=wx.Size(145, 24), style=0)
+              name='Class', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 24), style=0)
         EVT_CHOICE(self, wxID_VARIABLEPROPERTIESDIALOGCLASS, self.OnClassChanged)
         
         self.Name = wx.ListBox(id=wxID_VARIABLEPROPERTIESDIALOGNAME,
-              name='Name', parent=self.MainPanel, pos=wx.Point(204, 48),
-              size=wx.Size(145, 90), style=wx.LB_SINGLE)
+              name='Name', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 90), style=wx.LB_SINGLE)
         EVT_LISTBOX(self, wxID_VARIABLEPROPERTIESDIALOGNAME, self.OnNameChanged)
 
         self.Expression = wx.TextCtrl(id=wxID_VARIABLEPROPERTIESDIALOGEXPRESSION,
-              name='Expression', parent=self.MainPanel, pos=wx.Point(24, 114),
-              size=wx.Size(145, 24), style=0)
+              name='Expression', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 24), style=0)
         EVT_TEXT(self, wxID_VARIABLEPROPERTIESDIALOGEXPRESSION, self.OnExpressionChanged)
 
+        self.Spacer = wx.Panel(id=wxID_VARIABLEPROPERTIESDIALOGSPACER,
+              name='Spacer', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
         self.Preview = wx.Panel(id=wxID_VARIABLEPROPERTIESDIALOGPREVIEW,
-              name='Preview', parent=self.MainPanel, pos=wx.Point(24, 170),
-              size=wx.Size(350, 150), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
+              name='Preview', parent=self, pos=wx.Point(0, 0),
+              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
         self.Preview.SetBackgroundColour(wxColour(255,255,255))
         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
 
+        self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL|wxCENTRE)
+
         self._init_sizers()
 
     def __init__(self, parent):
         self._init_ctrls(parent)
-        self.ButtonSizer = self.CreateButtonSizer(wxOK|wxCANCEL|wxCENTRE)
-        self.flexGridSizer1.Add(self.ButtonSizer, 1, wxALIGN_RIGHT)
         self.Variable = None
         self.VarList = []
         self.MinVariableSize = None
--- a/LDViewer.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/LDViewer.py	Thu Aug 02 16:51:58 2007 +0200
@@ -2,9 +2,9 @@
 # -*- coding: utf-8 -*-
 
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
-#based on the plcopen standard.
+#based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/PLCControler.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/PLCControler.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
@@ -476,6 +476,7 @@
         if old_name in self.ElementsOpened:
             idx = self.ElementsOpened.index(old_name)
             self.ElementsOpened[idx] = new_name
+        self.Project.updateElementName(old_name, new_name)
         self.RefreshPouUsingTree()
         self.RefreshBlockTypes()
         self.BufferProject()
@@ -649,7 +650,6 @@
             for vartype, varlist in self.ExtractVarLists(vars):
                 configuration.globalVars.append(varlist)
         self.RefreshBlockTypes()
-        self.BufferProject()
     
     # Return the configuration globalvars
     def GetConfigurationGlobalVars(self, name):
@@ -692,7 +692,6 @@
             for vartype, varlist in self.ExtractVarLists(vars):
                 resource.globalVars.append(varlist)
         self.RefreshBlockTypes()
-        self.BufferProject()
     
     # Return the resource globalvars
     def GetConfigurationResourceGlobalVars(self, config_name, name):
@@ -769,7 +768,6 @@
         # Set Pou interface
         pou.setVars(self.ExtractVarLists(vars))
         self.RefreshBlockTypes()
-        self.BufferProject()
     
     # Replace the return type of the pou given by its name (only for functions)
     def SetPouInterfaceReturnType(self, name, type):
@@ -784,7 +782,15 @@
         # Change return type
         return_type.setValue(type)
         self.RefreshBlockTypes()
-        self.BufferProject()
+    
+    def UpdateProjectUsedPous(self, old_name, new_name):
+        if self.Project:
+            self.Project.updateElementName(old_name, new_name)
+    
+    def UpdateCurrentPouEditingUsedVariable(self, old_name, new_name):
+        pou = self.GetCurrentElementEditing()
+        if pou:
+            pou.updateElementName(old_name, new_name)
     
     # Return the return type of the pou given by its name
     def GetPouInterfaceReturnTypeByName(self, name):
@@ -2038,7 +2044,10 @@
             self.Buffering = False
 
     def ProjectIsSaved(self):
-        return self.ProjectBuffer.IsCurrentSaved()
+        if self.ProjectBuffer:
+            return self.ProjectBuffer.IsCurrentSaved()
+        else:
+            return False
 
     def LoadPrevious(self):
         self.Project = self.Copy(self.ProjectBuffer.Previous())
--- a/PLCGenerator.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/PLCGenerator.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/PLCOpenEditor.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/PLCOpenEditor.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
@@ -1951,6 +1951,7 @@
         # The base class must be initialized *first*
         wxPyGridTableBase.__init__(self)
         self.data = data
+        self.old_value = None
         self.colnames = colnames
         self.Parent = parent
         # XXX
@@ -1984,8 +1985,14 @@
 
     def SetValue(self, row, col, value):
         if col < len(self.colnames):
-            self.data[row][self.GetColLabelValue(col)] = value
-        
+            colname = self.GetColLabelValue(col)
+            if colname == "Name":
+                self.old_value = self.data[row][colname]
+            self.data[row][colname] = value
+    
+    def GetOldValue(self):
+        return self.old_value
+    
     def ResetView(self, grid):
         """
         (wxGrid) -> Reset the grid view.   Call this to
@@ -2515,7 +2522,14 @@
                 message.Destroy()
                 event.Veto()
             else:
-                self.SaveValues()
+                self.SaveValues(False)
+                old_value = self.Table.GetOldValue()
+                if old_value != "":
+                    self.Controler.UpdateCurrentPouEditingUsedVariable(old_value, value)
+                self.Controler.BufferProject()
+                self.Parent.RefreshTitle()
+                self.Parent.RefreshEditMenu()
+                self.Viewer.RefreshView()
                 event.Skip()
         else:
             self.SaveValues()
@@ -2557,7 +2571,7 @@
         self.Table.SetData(data)
         self.Table.ResetView(self.VariablesGrid)
 
-    def SaveValues(self):
+    def SaveValues(self, buffer = True):
         if self.ElementType == "config":
             self.Controler.SetConfigurationGlobalVars(self.ConfigName, self.Values)
         elif self.ElementType == "resource":
@@ -2566,6 +2580,10 @@
             if self.ReturnType.IsEnabled():
                 self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
             self.Controler.SetPouInterfaceVars(self.PouName, self.Values)
+        if buffer:
+            self.Controler.BufferProject()
+            self.Parent.RefreshTitle()
+            self.Parent.RefreshEditMenu()
 
 ##[wxID_EDITVARIABLEDIALOG, wxID_EDITVARIABLEDIALOGMAINPANEL, 
 ## wxID_EDITVARIABLEDIALOGVARIABLESGRID, wxID_EDITVARIABLEDIALOGRETURNTYPE, 
--- a/RessourceEditor.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/RessourceEditor.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/SFCViewer.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/SFCViewer.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard.
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/TextViewer.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/TextViewer.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/Viewer.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/Viewer.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/__init__.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/__init__.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/examples/example.xml	Fri Jul 27 10:03:24 2007 +0200
+++ b/examples/example.xml	Thu Aug 02 16:51:58 2007 +0200
@@ -39,21 +39,7 @@
                 <BOOL/>
               </type>
               <initialValue>
-                <arrayValue>
-                  <value>
-                    <simpleValue value="4"/>
-                  </value>
-                  <value>
-                    <arrayValue>
-                      <value>
-                        <simpleValue value="0"/>
-                      </value>
-                      <value>
-                        <simpleValue value="1"/>
-                      </value>
-                    </arrayValue>
-                  </value>
-                </arrayValue>
+                <simpleValue value="true"/>
               </initialValue>
             </variable>
             <variable name="IN3">
@@ -874,7 +860,7 @@
     <configurations>
       <configuration name="ConfigTest">
         <resource name="ResourceTest">
-          <task interval="00:00:00.010000" name="Toto" priority="6">
+          <task name="Toto" priority="6" single="Tutu">
             <pouInstance type="SFCTest" name="Program1"/>
           </task>
           <globalVars>
--- a/generate_IEC_std.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/generate_IEC_std.py	Thu Aug 02 16:51:58 2007 +0200
@@ -1,3 +1,27 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard. 
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
 """
 
  THIS CODE GENARATES C++ CODE FOR IEC2CC COMPILER
@@ -20,6 +44,32 @@
 #import pprint
 #pp = pprint.PrettyPrinter(indent=4)
 
+matiec_header = """/*
+ * (c) 2003 Mario de Sousa
+ *
+ * Offered to the public under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * This code is made available on the understanding that it will not be
+ * used in safety-critical situations without a full and competent review.
+ */
+
+/*
+ * An IEC 61131-3 IL and ST compiler.
+ *
+ * Based on the
+ * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
+ *
+ */
+ 
+ """
+
 def ANY_to_compiler_test_type_GEN(typename, paramname):
     """
     Convert ANY_XXX IEC type declaration into IEC2CC's generated type test.
@@ -201,7 +251,7 @@
 """
 Generate the long enumeration of std function types
 """
-function_type_decl =  """
+function_type_decl =  matiec_header + """
 /****
  * IEC 61131-3 standard function lib
  * generated code, do not edit by hand
@@ -218,7 +268,7 @@
 """
 Generate the funct that return enumerated according function name
 """
-get_function_type_decl = """
+get_function_type_decl = matiec_header + """
 /****
  * IEC 61131-3 standard function lib
  * generated code, do not edit by hand
@@ -241,7 +291,7 @@
 Generate the part of generate_cc_st_c::visit(function_invocation)
 that is responsible to generate C code for std lib calls.
 """
-st_code_gen = """
+st_code_gen = matiec_header + """
 /****
  * IEC 61131-3 standard function lib
  * generated code, do not edit by hand
@@ -278,7 +328,7 @@
 Generate the part of generate_cc_il_c::visit(il_function_call)
 that is responsible to generate C code for std lib calls.
 """
-il_code_gen = """
+il_code_gen = matiec_header + """
 /****
  * IEC 61131-3 standard function lib
  * generated code, do not edit by hand
@@ -315,7 +365,7 @@
 Generate the part of search_expression_type_c::visit(function_invocation)
 that is responsible of returning type symbol for function invocation.
 """
-search_type_code =  """
+search_type_code =  matiec_header + """
 /****
  * IEC 61131-3 standard function lib
  * generated code, do not edit by hand
@@ -417,7 +467,7 @@
 """
 Generate the C implementation of the IEC standard function library.
 """
-iec_std_lib_generated =  """
+iec_std_lib_generated = matiec_header + """
 /****
  * IEC 61131-3 standard function lib
  * generated code, do not edit by hand
--- a/graphics/FBD_Objects.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/graphics/FBD_Objects.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/graphics/GraphicCommons.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/graphics/GraphicCommons.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
@@ -86,6 +86,28 @@
 # Contants for defining which drawing mode is selected for app
 [FREEDRAWING_MODE, DRIVENDRAWING_MODE] = [1, 2]
 
+CURSORS = None
+
+def ResetCursors():
+    global CURSORS
+    if CURSORS == None:
+        CURSORS = [wxNullCursor, 
+                   wxStockCursor(wxCURSOR_HAND),
+                   wxStockCursor(wxCURSOR_SIZENWSE),
+                   wxStockCursor(wxCURSOR_SIZENESW),
+                   wxStockCursor(wxCURSOR_SIZEWE),
+                   wxStockCursor(wxCURSOR_SIZENS)]
+           
+HANDLE_CURSORS = {
+    (1, 1) : 2,
+    (3, 3) : 2,
+    (1, 3) : 3,
+    (3, 1) : 3,
+    (1, 2) : 4,
+    (3, 2) : 4,
+    (2, 1) : 5,
+    (2, 3) : 5
+}
 
 """
 Basic vector operations for calculate wire points
@@ -265,6 +287,8 @@
         self.Pos = wxPoint(0, 0)
         self.Size = wxSize(0, 0)
         self.BoundingBox = wxRect(0, 0, 0, 0)
+        self.CurrentCursor = 0
+        ResetCursors()
     
     # Make a clone of this element
     def Clone(self):
@@ -339,8 +363,12 @@
     
     # Test if the point is on a handle of this element
     def TestHandle(self, pt):
+        extern_rect = wxRect(self.BoundingBox.x - HANDLE_SIZE - 2, self.BoundingBox.y - HANDLE_SIZE - 2, 
+            self.BoundingBox.width + 2 * HANDLE_SIZE + 4, self.BoundingBox.height + 2 * HANDLE_SIZE + 4)
+        intern_rect = wxRect(self.BoundingBox.x - 2, self.BoundingBox.y - 2, 
+            self.BoundingBox.width + 4, self.BoundingBox.height + 4)
         # Verify that this element is selected
-        if self.Selected:
+        if self.Selected and extern_rect.InsideXY(pt.x, pt.y) and not intern_rect.InsideXY(pt.x, pt.y):
             # Find if point is on a handle horizontally
             if self.BoundingBox.x - HANDLE_SIZE - 2 <= pt.x < self.BoundingBox.x - 2:
                 handle_x = 1
@@ -368,25 +396,17 @@
     def OnLeftDown(self, event, dc, scaling):
         pos = event.GetLogicalPosition(dc)
         # Test if an handle have been clicked
-        result = self.TestHandle(pos)
+        handle = self.TestHandle(pos)
         # Find which type of handle have been clicked,
         # Save a resize event and change the cursor
-        if result == (1, 1) or result == (3, 3):
-            self.Handle = (HANDLE_RESIZE, result)
-            self.Parent.SetCursor(wxStockCursor(wxCURSOR_SIZENWSE))
-        elif result == (1, 3) or result == (3, 1):
-            self.Handle = (HANDLE_RESIZE, result)
-            self.Parent.SetCursor(wxStockCursor(wxCURSOR_SIZENESW))
-        elif result == (1, 2) or result == (3, 2):
-            self.Handle = (HANDLE_RESIZE, result)
-            self.Parent.SetCursor(wxStockCursor(wxCURSOR_SIZEWE))
-        elif result == (2, 1) or result == (2, 3):
-            self.Handle = (HANDLE_RESIZE, result)
-            self.Parent.SetCursor(wxStockCursor(wxCURSOR_SIZENS))
-        # If no handle have been clicked, save a move event, and change the cursor
+        cursor = HANDLE_CURSORS.get(handle, 1)
+        if cursor != self.CurrentCursor:
+            self.Parent.SetCursor(CURSORS[cursor])
+            self.CurrentCursor = cursor
+        if cursor > 1:
+            self.Handle = (HANDLE_RESIZE, handle)
         else:
             self.Handle = (HANDLE_MOVE, None)
-            self.Parent.SetCursor(wxStockCursor(wxCURSOR_HAND))
             self.SetSelected(False)
         # Initializes the last position
         self.oldPos = GetScaledEventPosition(event, dc, scaling)
@@ -402,6 +422,9 @@
             self.ProcessDragging(movex, movey)
             self.RefreshModel()
             self.Parent.RefreshBuffer()
+        if self.CurrentCursor != 0:
+            self.Parent.SetCursor(CURSORS[0])
+            self.CurrentCursor = 0
         self.SetSelected(True)
         self.oldPos = None
 
@@ -433,17 +456,13 @@
         else:
             pos = event.GetLogicalPosition(dc)
             handle = self.TestHandle(pos)
-            if handle == (1, 1) or handle == (3, 3):
-                wxCallAfter(self.Parent.SetCursor, wxStockCursor(wxCURSOR_SIZENWSE))
-            elif handle == (1, 3) or handle == (3, 1):
-                wxCallAfter(self.Parent.SetCursor, wxStockCursor(wxCURSOR_SIZENESW))
-            elif handle == (1, 2) or handle == (3, 2):
-                wxCallAfter(self.Parent.SetCursor, wxStockCursor(wxCURSOR_SIZEWE))
-            elif handle == (2, 1) or handle == (2, 3):
-                wxCallAfter(self.Parent.SetCursor, wxStockCursor(wxCURSOR_SIZENS))
-            else:
-                wxCallAfter(self.Parent.SetCursor, wxNullCursor)
-    
+            # Find which type of handle have been clicked,
+            # Save a resize event and change the cursor
+            cursor = HANDLE_CURSORS.get(handle, 0)
+            if cursor != self.CurrentCursor:
+                self.Parent.SetCursor(CURSORS[cursor])
+                self.CurrentCursor = cursor
+
     # Moves the element
     def Move(self, dx, dy, exclude = []):
         self.Pos.x += dx
--- a/graphics/LD_Objects.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/graphics/LD_Objects.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/graphics/SFC_Objects.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/graphics/SFC_Objects.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/graphics/__init__.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/graphics/__init__.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/obf.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/obf.py	Thu Aug 02 16:51:58 2007 +0200
@@ -1,3 +1,27 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
+#based on the plcopen standard. 
+#
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+#See COPYING file for copyrights details.
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU General Public
+#License as published by the Free Software Foundation; either
+#version 2.1 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#General Public License for more details.
+#
+#You should have received a copy of the GNU General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
 from py_compile import compile
 from commands import getoutput
 from os import remove,getcwd,rename
--- a/plcopen/__init__.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/plcopen/__init__.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/plcopen/docpdf.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/plcopen/docpdf.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/plcopen/plcopen.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/plcopen/plcopen.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
@@ -106,6 +106,18 @@
             return ind1 + "<%s>%s</%s>\n"%(name, self.text, name)
     setattr(cls, "generateXMLText", generateXMLText)
     
+    def updateElementName(self, old_name, new_name):
+        index = self.text.find(old_name)
+        while index != -1:
+            if index > 0 and (self.text[index - 1].isalnum() or self.text[index - 1] == "_"):
+                index = self.text.find(old_name, index + len(old_name))
+            elif index < len(self.text) - len(old_name) and (self.text[index + len(old_name)].isalnum() or self.text[index + len(old_name)] == "_"):
+                index = self.text.find(old_name, index + len(old_name))
+            else:
+                self.text = self.text[:index] + new_name + self.text[index + len(old_name):]
+                index = self.text.find(old_name, index + len(new_name))
+    setattr(cls, "updateElementName", updateElementName)
+    
 if "project" in PLCOpenClasses:
     cls = PLCOpenClasses["project"]
     cls.singleLineAttributes = False
@@ -233,8 +245,52 @@
                 raise ValueError, "\"%s\" resource doesn't exist in \"%s\" configuration !!!"%(name, config_name)
     setattr(cls, "removeConfigurationResource", removeConfigurationResource)
 
+    def updateElementName(self, old_name, new_name):
+        for pou in self.types.getPouElements():
+            pou.updateElementName(old_name, new_name)
+        for configuration in self.instances.configurations.getConfiguration():
+            configuration.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 PLCOpenClasses["project_fileHeader"].singleLineAttributes = False
 
+if "configurations_configuration" in PLCOpenClasses:
+    cls = PLCOpenClasses["configurations_configuration"]
+    
+    def updateElementName(self, old_name, new_name):
+        for resource in self.getResource():
+            resource.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
+
+if "configuration_resource" in PLCOpenClasses:
+    cls = PLCOpenClasses["configuration_resource"]
+    
+    def updateElementName(self, old_name, new_name):
+        for instance in self.getPouInstance():
+            instance.updateElementName(old_name, new_name)
+        for task in self.getTask():
+            task.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
+if "resource_task" in PLCOpenClasses:
+    cls = PLCOpenClasses["resource_task"]
+    
+    def updateElementName(self, old_name, new_name):
+        if self.single == old_name:
+            self.single = new_name
+        for instance in self.getPouInstance():
+            instance.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
+if "pouInstance" in PLCOpenClasses:
+    cls = PLCOpenClasses["pouInstance"]
+    
+    def updateElementName(self, old_name, new_name):
+        if self.type == old_name:
+            self.type = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "project_types" in PLCOpenClasses:
     cls = PLCOpenClasses["project_types"]
 
@@ -425,6 +481,14 @@
                 raise ValueError, "Action with name %s doesn't exists!"%name
     setattr(cls, "removeAction", removeAction)
 
+    def updateElementName(self, old_name, new_name):
+        self.body.updateElementName(old_name, new_name)
+        for action in self.getActionList():
+            action.updateElementName(old_name, new_name)
+        for transition in self.getTransitionList():
+            transition.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "transitions_transition" in PLCOpenClasses:
     cls = PLCOpenClasses["transitions_transition"]
 
@@ -439,6 +503,10 @@
     setattr(cls, "setText", setText)
     setattr(cls, "getText", getText)
 
+    def updateElementName(self, old_name, new_name):
+        self.body.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "actions_action" in PLCOpenClasses:
     cls = PLCOpenClasses["actions_action"]
 
@@ -453,6 +521,10 @@
     setattr(cls, "setText", setText)
     setattr(cls, "getText", getText)
 
+    def updateElementName(self, old_name, new_name):
+        self.body.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "body" in PLCOpenClasses:
     cls = PLCOpenClasses["body"]
     
@@ -531,6 +603,14 @@
         else:
             raise TypeError, "%s body don't have text!"%self.content["name"]
     setattr(cls, "getText", getText)
+    
+    def updateElementName(self, old_name, new_name):
+        if self.content["name"] in ["IL", "ST"]:
+            self.content["value"].updateElementName(old_name, new_name)
+        else:
+            for element in self.content["value"].getContent():
+                element["value"].updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
 
 def getX(self):
     return self.position.getX()
@@ -558,6 +638,10 @@
     def getContentText(self):
         return self.content.getText()
     setattr(cls, "getContentText", getContentText)
+    
+    def updateElementName(self, old_name, new_name):
+        self.content.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
 
 if "block" in PLCOpenClasses:
     cls = PLCOpenClasses["block"]
@@ -566,6 +650,11 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
 
+    def updateElementName(self, old_name, new_name):
+        if self.typeName == old_name:
+            self.typeName = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "inputVariables_variable" in PLCOpenClasses:
     cls = PLCOpenClasses["inputVariables_variable"]
 
@@ -603,6 +692,10 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
 
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
 if "contact" in PLCOpenClasses:
     cls = PLCOpenClasses["contact"]
     setattr(cls, "getX", getX)
@@ -622,6 +715,11 @@
         return None
     setattr(cls, "getContactEdge", getContactEdge)
 
+    def updateElementName(self, old_name, new_name):
+        if self.variable == old_name:
+            self.variable = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "coil" in PLCOpenClasses:
     cls = PLCOpenClasses["coil"]
     setattr(cls, "getX", getX)
@@ -641,12 +739,21 @@
         return None
     setattr(cls, "getCoilStorage", getCoilStorage)
 
+    def updateElementName(self, old_name, new_name):
+        if self.variable == old_name:
+            self.variable = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "rightPowerRail" in PLCOpenClasses:
     cls = PLCOpenClasses["rightPowerRail"]
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
 
 if "step" in PLCOpenClasses:
     cls = PLCOpenClasses["step"]
@@ -655,6 +762,10 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
 
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
 if "transition" in PLCOpenClasses:
     cls = PLCOpenClasses["transition"]
     setattr(cls, "getX", getX)
@@ -687,6 +798,16 @@
         return ""
     setattr(cls, "getConditionContent", getConditionContent)
 
+    def updateElementName(self, old_name, new_name):
+        if self.condition:
+            content = self.condition.getContent()
+            if content["name"] == "reference":
+                if content["value"].getName() == old_name:
+                    content["value"].setName(new_name)
+            elif content["name"] == "inline":
+                content["value"].updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "selectionDivergence" in PLCOpenClasses:
     cls = PLCOpenClasses["selectionDivergence"]
     setattr(cls, "getX", getX)
@@ -694,6 +815,10 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
 
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
 if "selectionConvergence" in PLCOpenClasses:
     cls = PLCOpenClasses["selectionConvergence"]
     setattr(cls, "getX", getX)
@@ -701,6 +826,10 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
     
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+    
 if "simultaneousDivergence" in PLCOpenClasses:
     cls = PLCOpenClasses["simultaneousDivergence"]
     setattr(cls, "getX", getX)
@@ -708,12 +837,20 @@
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
     
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+    
 if "simultaneousDivergence" in PLCOpenClasses:
     cls = PLCOpenClasses["simultaneousConvergence"]
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
 
 if "jumpStep" in PLCOpenClasses:
     cls = PLCOpenClasses["jumpStep"]
@@ -721,6 +858,11 @@
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
 
 if "actionBlock_action" in PLCOpenClasses:
     cls = PLCOpenClasses["actionBlock_action"]
@@ -759,6 +901,13 @@
         return None
     setattr(cls, "getInlineContent", getInlineContent)
 
+    def updateElementName(self, old_name, new_name):
+        if self.reference and self.reference.getName() == old_name:
+            self.reference.setName(new_name)
+        if self.inline:
+            self.inline.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "actionBlock" in PLCOpenClasses:
     cls = PLCOpenClasses["actionBlock"]
     setattr(cls, "getX", getX)
@@ -806,6 +955,11 @@
         return actions
     setattr(cls, "getActions", getActions)
 
+    def updateElementName(self, old_name, new_name):
+        for action in self.action:
+            action.updateElementName(old_name, new_name)
+    setattr(cls, "updateElementName", updateElementName)
+
 if "inVariable" in PLCOpenClasses:
     cls = PLCOpenClasses["inVariable"]
     setattr(cls, "getX", getX)
@@ -824,6 +978,11 @@
             return self.edge.getValue()
         return None
     setattr(cls, "getConnectorEdge", getConnectorEdge)
+    
+    def updateElementName(self, old_name, new_name):
+        if self.expression == old_name:
+            self.expression = new_name
+    setattr(cls, "updateElementName", updateElementName)
 
 if "outVariable" in PLCOpenClasses:
     cls = PLCOpenClasses["outVariable"]
@@ -844,6 +1003,11 @@
         return None
     setattr(cls, "getConnectorEdge", getConnectorEdge)
 
+    def updateElementName(self, old_name, new_name):
+        if self.expression == old_name:
+            self.expression = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "inOutVariable" in PLCOpenClasses:
     cls = PLCOpenClasses["inOutVariable"]
     setattr(cls, "getX", getX)
@@ -875,12 +1039,21 @@
         return None
     setattr(cls, "getOutputEdge", getOutputEdge)
 
+    def updateElementName(self, old_name, new_name):
+        if self.expression == old_name:
+            self.expression = new_name
+    setattr(cls, "updateElementName", updateElementName)
+
 if "continuation" in PLCOpenClasses:
     cls = PLCOpenClasses["continuation"]
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
 
 if "connector" in PLCOpenClasses:
     cls = PLCOpenClasses["connector"]
@@ -888,6 +1061,10 @@
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
     setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
 
 if "connection" in PLCOpenClasses:
     cls = PLCOpenClasses["connection"]
--- a/plcopen/structures.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/plcopen/structures.py	Thu Aug 02 16:51:58 2007 +0200
@@ -6,7 +6,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -18,7 +18,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/xmlclass/__init__.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/xmlclass/__init__.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software
--- a/xmlclass/xmlclass.py	Fri Jul 27 10:03:24 2007 +0200
+++ b/xmlclass/xmlclass.py	Thu Aug 02 16:51:58 2007 +0200
@@ -4,7 +4,7 @@
 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
 #based on the plcopen standard. 
 #
-#Copyright (C): Edouard TISSERANT and Laurent BESSARD
+#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
 #See COPYING file for copyrights details.
 #
@@ -16,7 +16,7 @@
 #This library is distributed in the hope that it will be useful,
 #but WITHOUT ANY WARRANTY; without even the implied warranty of
 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#Lesser General Public License for more details.
+#General Public License for more details.
 #
 #You should have received a copy of the GNU General Public
 #License along with this library; if not, write to the Free Software