# HG changeset patch
# User lbessard
# Date 1184053973 -7200
# Node ID fc23e1f415d87033f346036d98eddb023e137bac
# Parent  dae55dd9ee14e5e2d6f444bffaa5d0edfb321f44
Adding support for concurrent overriden standard function
Adding support for generate initial values
Adding support for expression into FBD variables

diff -r dae55dd9ee14 -r fc23e1f415d8 Dialogs.py
--- a/Dialogs.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/Dialogs.py	Tue Jul 10 09:52:53 2007 +0200
@@ -126,14 +126,20 @@
         EVT_PAINT(self, self.OnPaint)
         EVT_BUTTON(self, self.ButtonSizer.GetAffirmativeButton().GetId(), self.OnOK)
     
-    def FindTreeItem(self, root, name):
+    def FindTreeItem(self, root, name, inputs = None):
         if root.IsOk():
-            if self.TypeTree.GetItemText(root) == name:
+            pydata = self.TypeTree.GetPyData(root)
+            if inputs and "inputs" in pydata:
+                print inputs, pydata["inputs"]
+                same_inputs = pydata["inputs"] == inputs
+            else:
+                same_inputs = True
+            if self.TypeTree.GetItemText(root) == name and same_inputs:
                 return root
             else:
                 item, root_cookie = self.TypeTree.GetFirstChild(root)
                 while item.IsOk():
-                    result = self.FindTreeItem(item, name)
+                    result = self.FindTreeItem(item, name, inputs)
                     if result:
                         return result
                     item, root_cookie = self.TypeTree.GetNextChild(root, root_cookie)
@@ -155,13 +161,13 @@
 
     def SetBlockList(self, blocktypes):
         root = self.TypeTree.AddRoot("")
-        self.TypeTree.SetPyData(root, CATEGORY)
+        self.TypeTree.SetPyData(root, {"type" : CATEGORY})
         for category in blocktypes:
             category_item = self.TypeTree.AppendItem(root, category["name"])
-            self.TypeTree.SetPyData(category_item, CATEGORY)
+            self.TypeTree.SetPyData(category_item, {"type" : CATEGORY})
             for blocktype in category["list"]:
                 blocktype_item = self.TypeTree.AppendItem(category_item, blocktype["name"])
-                self.TypeTree.SetPyData(blocktype_item, BLOCK)
+                self.TypeTree.SetPyData(blocktype_item, {"type" : BLOCK, "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
 
     def SetMinBlockSize(self, size):
         self.MinBlockSize = size
@@ -169,7 +175,10 @@
     def SetValues(self, values):
         for name, value in values.items():
             if name == "type":
-                item = self.FindTreeItem(self.TypeTree.GetRootItem(), value)
+                inputs = None
+                if "inputs" in values:
+                    inputs = values["inputs"]
+                item = self.FindTreeItem(self.TypeTree.GetRootItem(), value, inputs)
                 if item:
                     self.TypeTree.SelectItem(item)
             elif name == "name":
@@ -180,7 +189,9 @@
 
     def GetValues(self):
         values = {}
-        values["type"] = self.TypeTree.GetItemText(self.TypeTree.GetSelection())
+        item = self.TypeTree.GetSelection()
+        values["type"] = self.TypeTree.GetItemText(item)
+        values["inputs"] = self.TypeTree.GetPyData(item)["inputs"]
         if self.Name.GetValue() != "":
             values["name"] = self.Name.GetValue()
         values["width"], values["height"] = self.Block.GetSize()
@@ -190,8 +201,9 @@
     def OnTypeTreeItemSelected(self, event):
         self.Name.SetValue("")
         selected = event.GetItem()
-        if self.TypeTree.GetPyData(selected) != CATEGORY:
-            blocktype = GetBlockType(self.TypeTree.GetItemText(selected))
+        pydata = self.TypeTree.GetPyData(selected)
+        if pydata["type"] != CATEGORY:
+            blocktype = GetBlockType(self.TypeTree.GetItemText(selected), pydata["inputs"])
             if blocktype:
                 self.Inputs.SetValue(len(blocktype["inputs"]))
                 self.Inputs.Enable(blocktype["extensible"])
@@ -231,12 +243,13 @@
         dc = wxClientDC(self.Preview)
         dc.Clear()
         item = self.TypeTree.GetSelection()
-        if self.TypeTree.GetPyData(item) == CATEGORY:
+        pydata = self.TypeTree.GetPyData(item)
+        if pydata["type"] == CATEGORY:
             self.Block = None
         else:
             blocktype = self.TypeTree.GetItemText(item)
             if blocktype:
-                self.Block = FBD_Block(self.Preview, blocktype, self.Name.GetValue(), extension = self.Inputs.GetValue())
+                self.Block = FBD_Block(self.Preview, blocktype, self.Name.GetValue(), extension = self.Inputs.GetValue(), inputs = pydata["inputs"])
                 width, height = self.MinBlockSize
                 min_width, min_height = self.Block.GetMinSize()
                 width, height = max(min_width, width), max(min_height, height)
@@ -260,9 +273,10 @@
 
 [wxID_VARIABLEPROPERTIESDIALOG, wxID_VARIABLEPROPERTIESDIALOGMAINPANEL, 
  wxID_VARIABLEPROPERTIESDIALOGNAME, wxID_VARIABLEPROPERTIESDIALOGCLASS, 
- wxID_VARIABLEPROPERTIESDIALOGPREVIEW, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT1,
- wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT2, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT3, 
-] = [wx.NewId() for _init_ctrls in range(8)]
+ wxID_VARIABLEPROPERTIESDIALOGPREVIEW, wxID_VARIABLEPROPERTIESDIALOGEXPRESSION,
+ wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT1, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT2,
+ wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT3, wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT4,
+] = [wx.NewId() for _init_ctrls in range(10)]
 
 class VariablePropertiesDialog(wx.Dialog):
     def _init_coll_flexGridSizer1_Items(self, parent):
@@ -282,9 +296,9 @@
         # generated method, don't edit
         wx.Dialog.__init__(self, id=wxID_VARIABLEPROPERTIESDIALOG,
               name='VariablePropertiesDialog', parent=prnt, pos=wx.Point(376, 223),
-              size=wx.Size(400, 320), style=wx.DEFAULT_DIALOG_STYLE,
+              size=wx.Size(400, 380), style=wx.DEFAULT_DIALOG_STYLE,
               title='Variable Properties')
-        self.SetClientSize(wx.Size(400, 320))
+        self.SetClientSize(wx.Size(400, 380))
 
         self.MainPanel = wx.Panel(id=wxID_VARIABLEPROPERTIESDIALOGMAINPANEL,
               name='MainPanel', parent=self, pos=wx.Point(0, 0),
@@ -296,25 +310,34 @@
               pos=wx.Point(24, 24), size=wx.Size(70, 17), style=0)
 
         self.staticText2 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT2,
-              label='Name:', name='staticText2', parent=self.MainPanel,
+              label='Expression:', name='staticText2', parent=self.MainPanel,
+              pos=wx.Point(24, 90), size=wx.Size(100, 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)
 
-        self.staticText3 = wx.StaticText(id=wxID_VARIABLEPROPERTIESDIALOGSTATICTEXT3,
-              label='Preview:', name='staticText3', parent=self.MainPanel,
-              pos=wx.Point(24, 78), size=wx.Size(100, 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)
 
         self.Class = wx.Choice(id=wxID_VARIABLEPROPERTIESDIALOGCLASS,
               name='Class', parent=self.MainPanel, pos=wx.Point(24, 48),
               size=wx.Size(145, 24), style=0)
         EVT_CHOICE(self, wxID_VARIABLEPROPERTIESDIALOGCLASS, self.OnClassChanged)
         
-        self.Name = wx.Choice(id=wxID_VARIABLEPROPERTIESDIALOGNAME,
+        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)
+        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)
-        EVT_CHOICE(self, wxID_VARIABLEPROPERTIESDIALOGNAME, self.OnNameChanged)
+        EVT_TEXT(self, wxID_VARIABLEPROPERTIESDIALOGEXPRESSION, self.OnExpressionChanged)
 
         self.Preview = wx.Panel(id=wxID_VARIABLEPROPERTIESDIALOGPREVIEW,
-              name='Preview', parent=self.MainPanel, pos=wx.Point(24, 104),
+              name='Preview', parent=self.MainPanel, pos=wx.Point(24, 170),
               size=wx.Size(350, 150), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
         self.Preview.SetBackgroundColour(wxColour(255,255,255))
 
@@ -338,8 +361,9 @@
     def RefreshNameList(self):
         selected = self.Name.GetStringSelection()
         self.Name.Clear()
+        self.Name.Append("")
         for name, var_type, value_type in self.VarList:
-            if var_type in ["Local","Temp"]:
+            if var_type in ["Local","Temp","Global","External"]:
                 self.Name.Append(name)
             elif var_type == "Input" and self.Class.GetStringSelection() == "Input":
                 self.Name.Append(name)
@@ -349,6 +373,8 @@
                 self.Name.Append(name)
         if self.Name.FindString(selected) != wxNOT_FOUND:
             self.Name.SetStringSelection(selected)
+        else:
+            self.Name.SetStringSelection("")
         self.Name.Enable(self.Name.GetCount() > 0)
             
     def SetMinVariableSize(self, size):
@@ -367,8 +393,13 @@
                     self.Class.SetStringSelection("Output")
                 if value == INOUT:
                     self.Class.SetStringSelection("InOut")
-            elif name == "name":
-                self.Name.SetStringSelection(value)
+            elif name == "name" and value != "":
+                if self.Name.FindString(value) != wxNOT_FOUND:
+                    self.Name.SetStringSelection(value)
+                    self.Expression.Enable(False)
+                else:
+                    self.Expression.SetValue(value)
+                    self.Name.Enable(False)
         self.RefreshPreview()
         
     def GetValues(self):
@@ -380,7 +411,11 @@
             values["type"] = OUTPUT
         elif classtype == "InOut":
             values["type"] = INOUT
-        values["name"] = self.Name.GetStringSelection()
+        expression = self.Expression.GetValue()
+        if self.Expression.IsEnabled() and expression != "":
+            values["name"] = expression
+        else:
+            values["name"] = self.Name.GetStringSelection()
         values["value_type"] = ""
         for var_name, var_type, value_type in self.VarList:
             if var_name == values["name"]:
@@ -390,17 +425,37 @@
 
     def OnClassChanged(self, event):
         self.RefreshNameList()
+        if self.Class.GetStringSelection() == "Input":
+            self.Expression.Enable(True)
+        else:
+            self.Expression.Enable(False)
         self.RefreshPreview()
         event.Skip()
 
     def OnNameChanged(self, event):
-        self.RefreshPreview()
-        event.Skip()
-        
+        if self.Name.GetStringSelection() != "":
+            self.Expression.Enable(False)
+        elif self.Class.GetStringSelection() == "Input":
+            self.Expression.Enable(True)
+        self.RefreshPreview()
+        event.Skip()
+    
+    def OnExpressionChanged(self, event):
+        if self.Expression.GetValue() != "":
+            self.Name.Enable(False)
+        else:
+            self.Name.Enable(True)
+        self.RefreshPreview()
+        event.Skip()
+    
     def RefreshPreview(self):
         dc = wxClientDC(self.Preview)
         dc.Clear()
-        name = self.Name.GetStringSelection()
+        expression = self.Expression.GetValue()
+        if self.Expression.IsEnabled() and expression != "":
+            name = expression
+        else:
+            name = self.Name.GetStringSelection()
         type = ""
         for var_name, var_type, value_type in self.VarList:
             if var_name == name:
@@ -510,7 +565,18 @@
             
     def SetMinConnectionSize(self, size):
         self.MinConnectionSize = size
-        
+    
+    def SetValues(self, values):
+        for name, value in values.items():
+            if name == "type":
+                if value == CONNECTOR:
+                    self.radioButton1.SetValue(True)
+                elif value == CONTINUATION:
+                    self.radioButton2.SetValue(True)
+            elif name == "name":
+                self.Name.SetValue(value)
+        self.RefreshPreview()
+    
     def GetValues(self):
         values = {}
         if self.radioButton1.GetValue():
@@ -650,9 +716,9 @@
 
         EVT_PAINT(self, self.OnPaint)
 
-    def SetElementSize(self, width, height):
+    def SetElementSize(self, size):
         min_width, min_height = self.Element.GetMinSize()
-        width, height = max(min_width, width), max(min_height, height)
+        width, height = max(min_width, size[0]), max(min_height, size[1])
         self.Element.SetSize(width, height)
         self.Element.SetPosition((150 - width) / 2, (150 - height) / 2)
 
@@ -825,7 +891,7 @@
 
     def SetMinSize(self, size):
         self.PowerRailMinSize = size
-        self.RefreshPreview()
+        self.RefreshPreview()    
 
     def GetValues(self):
         values = {}
diff -r dae55dd9ee14 -r fc23e1f415d8 LDViewer.py
--- a/LDViewer.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/LDViewer.py	Tue Jul 10 09:52:53 2007 +0200
@@ -1165,41 +1165,51 @@
 #-------------------------------------------------------------------------------
 
     def EditContactContent(self, contact):
-        dialog = LDElementDialog(self.Parent, "contact")
-        varlist = []
-        vars = self.Controler.GetCurrentElementEditingInterfaceVars()
-        if vars:
-            for var in vars:
-                if var["Class"] != "Output" and var["Type"] == "BOOL":
-                    varlist.append(var["Name"])
-        dialog.SetVariables(varlist)
-        dialog.SetValues({"name":contact.GetName(),"type":contact.GetType()})
-        if dialog.ShowModal() == wxID_OK:
-            values = dialog.GetValues()
-            contact.SetName(values["name"])
-            contact.SetType(values["type"])
-            contact.RefreshModel(False)
-            self.Refresh()
-        dialog.Destroy()
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.EditContactContent(self, contact)
+        else:
+            dialog = LDElementDialog(self.Parent, "contact")
+            varlist = []
+            vars = self.Controler.GetCurrentElementEditingInterfaceVars()
+            if vars:
+                for var in vars:
+                    if var["Class"] != "Output" and var["Type"] == "BOOL":
+                        varlist.append(var["Name"])
+            dialog.SetVariables(varlist)
+            dialog.SetValues({"name":contact.GetName(),"type":contact.GetType()})
+            if dialog.ShowModal() == wxID_OK:
+                values = dialog.GetValues()
+                contact.SetName(values["name"])
+                contact.SetType(values["type"])
+                contact.RefreshModel(False)
+                self.Refresh()
+            dialog.Destroy()
 
     def EditCoilContent(self, coil):
-        dialog = LDElementDialog(self.Parent, "coil")
-        varlist = []
-        vars = self.Controler.GetCurrentElementEditingInterfaceVars()
-        if vars:
-            for var in vars:
-                if var["Class"] != "Input" and var["Type"] == "BOOL":
-                    varlist.append(var["Name"])
-        returntype = self.Controler.GetCurrentElementEditingInterfaceReturnType()
-        if returntype == "BOOL":
-            varlist.append(self.Controler.GetCurrentElementEditingName())
-        dialog.SetVariables(varlist)
-        dialog.SetValues({"name":coil.GetName(),"type":coil.GetType()})
-        if dialog.ShowModal() == wxID_OK:
-            values = dialog.GetValues()
-            coil.SetName(values["name"])
-            coil.SetType(values["type"])
-            coil.RefreshModel(False)
-            self.Refresh()
-        dialog.Destroy()
-
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.EditCoilContent(self, coil)
+        else:
+            dialog = LDElementDialog(self.Parent, "coil")
+            varlist = []
+            vars = self.Controler.GetCurrentElementEditingInterfaceVars()
+            if vars:
+                for var in vars:
+                    if var["Class"] != "Input" and var["Type"] == "BOOL":
+                        varlist.append(var["Name"])
+            returntype = self.Controler.GetCurrentElementEditingInterfaceReturnType()
+            if returntype == "BOOL":
+                varlist.append(self.Controler.GetCurrentElementEditingName())
+            dialog.SetVariables(varlist)
+            dialog.SetValues({"name":coil.GetName(),"type":coil.GetType()})
+            if dialog.ShowModal() == wxID_OK:
+                values = dialog.GetValues()
+                coil.SetName(values["name"])
+                coil.SetType(values["type"])
+                coil.RefreshModel(False)
+                self.Refresh()
+            dialog.Destroy()
+
+    def EditPowerRailContent(self, powerrail):
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.EditPowerRailContent(self, powerrail)
+
diff -r dae55dd9ee14 -r fc23e1f415d8 PLCControler.py
--- a/PLCControler.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/PLCControler.py	Tue Jul 10 09:52:53 2007 +0200
@@ -370,14 +370,14 @@
 
     def GenerateProgram(self, filepath):
         if self.Project:
-            try:
-                program = GenerateCurrentProgram(self.Project)
-                programfile = open(filepath, "w")
-                programfile.write(program)
-                programfile.close()
-                return True
-            except:
-                pass
+            #try:
+            program = GenerateCurrentProgram(self.Project)
+            programfile = open(filepath, "w")
+            programfile.write(program)
+            programfile.close()
+            return True
+            #except:
+            #    pass
         return False
 
 #-------------------------------------------------------------------------------
diff -r dae55dd9ee14 -r fc23e1f415d8 PLCGenerator.py
--- a/PLCGenerator.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/PLCGenerator.py	Tue Jul 10 09:52:53 2007 +0200
@@ -66,7 +66,7 @@
     
     def IsAlreadyDefined(self, name):
         for list_type, retain, constant, vars in self.Interface:
-            for var_type, var_name in vars:
+            for var_type, var_name, var_initial in vars:
                 if name == var_name:
                     return True
         return False
@@ -78,7 +78,12 @@
             variables = []
             for var in varlist["value"].getVariable():
                 type = var.getType().getValue()
-                variables.append((type, var.getName()))
+                initial = var.getInitialValue()
+                if initial:
+                    initial_value = initial.getValue()
+                else:
+                    initial_value = None
+                variables.append((type, var.getName(), initial_value))
             self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), 
                             varlist["value"].getConstant(), variables))
     
@@ -138,7 +143,7 @@
                 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]:
                     self.Interface.append(("VAR", False, False, []))
                 if not self.IsAlreadyDefined(name):
-                    self.Interface[-1][3].append((type, name))
+                    self.Interface[-1][3].append((type, name, None))
                     vars = []
                     for variable in instance.inputVariables.getVariable():
                         connections = variable.connectionPointIn.getConnections()
@@ -428,7 +433,7 @@
         while self.IsAlreadyDefined(name):
             i += 1
             name = "%s%d"%(edge, i)
-        self.Interface[-1][3].append((edge, name))
+        self.Interface[-1][3].append((edge, name, None))
         self.Program += "  %s(CLK := %s);\n"%(name, text)
         return "%s.Q"%name
     
@@ -445,8 +450,11 @@
             if constant:
                 program += " CONSTANT"
             program += "\n"
-            for var_type, var_name in variables:
-                program += "    %s : %s;\n"%(var_name, var_type)
+            for var_type, var_name, var_initial in variables:
+                if var_initial != None:
+                    program += "    %s : %s := %s;\n"%(var_name, var_type, {"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(),str(var_initial)))
+                else:
+                    program += "    %s : %s;\n"%(var_name, var_type)
             program += "  END_VAR\n"
         program += "\n"
         program += self.Program
diff -r dae55dd9ee14 -r fc23e1f415d8 PLCOpenEditor.py
--- a/PLCOpenEditor.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/PLCOpenEditor.py	Tue Jul 10 09:52:53 2007 +0200
@@ -426,7 +426,7 @@
         
         self.CurrentToolBar = []
         self.CurrentLanguage = ""
-        self.DrawingMode = DRIVENDRAWING_MODE
+        self.DrawingMode = FREEDRAWING_MODE
         
         self.RefreshFileMenu()
         self.RefreshEditMenu()
@@ -2078,14 +2078,10 @@
         self.RefreshUpDownButtons()
 
         self.OptionList = "Yes,No"
-        self.TypeList = ""
-        for value, parent in TypeHierarchy_list:
-            if not value.startswith("ANY"):
-                self.TypeList += "%s,"%value
-        self.TypeList = self.TypeList[:-1]
+        self.TypeList = ",".join([value for value, parent in TypeHierarchy_list if not value.startswith("ANY")])
         
         if pou_type == "function":
-            for value in TypeHierarchy.keys():
+            for value, parent in TypeHierarchy_list:
                 if not value.startswith("ANY"):
                     self.ReturnType.Append(value)
             self.ReturnType.Enable(True)
@@ -2220,8 +2216,10 @@
         new_index = max(0, min(value_index + move, len(self.Values) - 1))
         if new_index != value_index:
             self.Values.insert(new_index, self.Values.pop(value_index))
+            self.RefreshValues()
             self.VariablesGrid.SetGridCursor(new_index, self.VariablesGrid.GetGridCursorCol())
-        self.RefreshValues()
+        else:
+            self.RefreshValues()
     
     def RefreshValues(self):
         self.VariablesGrid.SetGridCursor(0, 0)
diff -r dae55dd9ee14 -r fc23e1f415d8 SFCViewer.py
--- a/SFCViewer.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/SFCViewer.py	Tue Jul 10 09:52:53 2007 +0200
@@ -767,78 +767,230 @@
 #-------------------------------------------------------------------------------
 
     def DeleteStep(self, step):
-        step_connectors = step.GetConnectors()
-        if not step.GetInitial() or not step_connectors["output"]:
-            previous = step.GetPreviousConnector()
-            if previous:
-                previous_block = previous.GetParentBlock()
-            else:
-                previous_block = None
-            next = step.GetNextConnector()
-            if next:
-                next_block = next.GetParentBlock()
-            else:
-                next_block = None
-            if isinstance(next_block, SFC_Transition):
-                self.RemoveTransition(next_block)
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.DeleteStep(self, step)
+        else:
+            step_connectors = step.GetConnectors()
+            if not step.GetInitial() or not step_connectors["output"]:
+                previous = step.GetPreviousConnector()
+                if previous:
+                    previous_block = previous.GetParentBlock()
+                else:
+                    previous_block = None
                 next = step.GetNextConnector()
                 if next:
                     next_block = next.GetParentBlock()
                 else:
                     next_block = None
-            elif isinstance(previous_block, SFC_Transition):
-                self.RemoveTransition(previous_block)
-                previous = step.GetPreviousConnector()
-                if previous:
-                    previous_block = previous.GetParentBlock()
-                else:
-                    previous_block = None
-            wire = self.RemoveStep(step)
-            self.SelectedElement = None
-            if next_block:
-                if isinstance(next_block, SFC_Divergence) and next_block.GetType() == SIMULTANEOUS_CONVERGENCE and isinstance(previous_block, SFC_Divergence) and previous_block.GetType() == SIMULTANEOUS_DIVERGENCE:
-                    wire.Clean()
-                    self.Wires.remove(wire)
-                    self.Elements.remove(wire)
-                    next_block.RemoveBranch(next)
-                    if next_block.GetBranchNumber() < 2:
-                        self.DeleteDivergence(next_block)
+                if isinstance(next_block, SFC_Transition):
+                    self.RemoveTransition(next_block)
+                    next = step.GetNextConnector()
+                    if next:
+                        next_block = next.GetParentBlock()
                     else:
-                        next_block.RefreshModel()
-                    previous_block.RemoveBranch(previous)
-                    if previous_block.GetBranchNumber() < 2:
-                        self.DeleteDivergence(previous_block)
+                        next_block = None
+                elif isinstance(previous_block, SFC_Transition):
+                    self.RemoveTransition(previous_block)
+                    previous = step.GetPreviousConnector()
+                    if previous:
+                        previous_block = previous.GetParentBlock()
                     else:
-                        previous_block.RefreshModel()
-                else:
-                    pos = previous.GetPosition(False)
-                    next_pos = next.GetPosition(False)
-                    wire_size = GetWireSize(previous_block)
-                    previous_block.RefreshOutputPosition((0, pos.y + wire_size - next_pos.y))
-                    wire.SetPoints([wxPoint(pos.x, pos.y + wire_size), wxPoint(pos.x, pos.y)])
-                    if isinstance(next_block, SFC_Divergence):
-                        next_block.RefreshPosition()
-                    previous_block.RefreshOutputModel(True)
-            else:
-                if isinstance(previous_block, SFC_Step):
-                    previous_block.RemoveOutput()
-                    self.RefreshStepModel(previous_block)
-                elif isinstance(previous_block, SFC_Divergence):
-                    if previous_block.GetType() in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
-                        self.DeleteDivergence(previous_block)
-                    else:
+                        previous_block = None
+                wire = self.RemoveStep(step)
+                self.SelectedElement = None
+                if next_block:
+                    if isinstance(next_block, SFC_Divergence) and next_block.GetType() == SIMULTANEOUS_CONVERGENCE and isinstance(previous_block, SFC_Divergence) and previous_block.GetType() == SIMULTANEOUS_DIVERGENCE:
+                        wire.Clean()
+                        self.Wires.remove(wire)
+                        self.Elements.remove(wire)
+                        next_block.RemoveBranch(next)
+                        if next_block.GetBranchNumber() < 2:
+                            self.DeleteDivergence(next_block)
+                        else:
+                            next_block.RefreshModel()
                         previous_block.RemoveBranch(previous)
                         if previous_block.GetBranchNumber() < 2:
                             self.DeleteDivergence(previous_block)
                         else:
-                            self.RefreshDivergenceModel(previous_block)
+                            previous_block.RefreshModel()
+                    else:
+                        pos = previous.GetPosition(False)
+                        next_pos = next.GetPosition(False)
+                        wire_size = GetWireSize(previous_block)
+                        previous_block.RefreshOutputPosition((0, pos.y + wire_size - next_pos.y))
+                        wire.SetPoints([wxPoint(pos.x, pos.y + wire_size), wxPoint(pos.x, pos.y)])
+                        if isinstance(next_block, SFC_Divergence):
+                            next_block.RefreshPosition()
+                        previous_block.RefreshOutputModel(True)
+                else:
+                    if isinstance(previous_block, SFC_Step):
+                        previous_block.RemoveOutput()
+                        self.RefreshStepModel(previous_block)
+                    elif isinstance(previous_block, SFC_Divergence):
+                        if previous_block.GetType() in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
+                            self.DeleteDivergence(previous_block)
+                        else:
+                            previous_block.RemoveBranch(previous)
+                            if previous_block.GetBranchNumber() < 2:
+                                self.DeleteDivergence(previous_block)
+                            else:
+                                self.RefreshDivergenceModel(previous_block)
         
     def DeleteTransition(self, transition):
-        previous = transition.GetPreviousConnector()
-        previous_block = previous.GetParentBlock()
-        next = transition.GetNextConnector()
-        next_block = next.GetParentBlock()
-        if isinstance(previous_block, SFC_Divergence) and previous_block.GetType() == SELECTION_DIVERGENCE and isinstance(next_block, SFC_Divergence) and next_block.GetType() == SELECTION_CONVERGENCE:
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.DeleteTransition(self, transition)
+        else:
+            previous = transition.GetPreviousConnector()
+            previous_block = previous.GetParentBlock()
+            next = transition.GetNextConnector()
+            next_block = next.GetParentBlock()
+            if isinstance(previous_block, SFC_Divergence) and previous_block.GetType() == SELECTION_DIVERGENCE and isinstance(next_block, SFC_Divergence) and next_block.GetType() == SELECTION_CONVERGENCE:
+                wires = previous.GetWires()
+                if len(wires) != 1:
+                    return
+                wire = wires[0][0]
+                wire.Clean()
+                self.Wires.remove(wire)
+                self.Elements.remove(wire)
+                wires = next.GetWires()
+                if len(wires) != 1:
+                    return
+                wire = wires[0][0]
+                wire.Clean()
+                self.Wires.remove(wire)
+                self.Elements.remove(wire)
+                transition.Clean()
+                self.Blocks.remove(transition)
+                self.Elements.remove(transition)
+                self.Controler.RemoveCurrentElementEditingInstance(transition.GetId())
+                previous_block.RemoveBranch(previous)
+                if previous_block.GetBranchNumber() < 2:
+                    self.DeleteDivergence(previous_block)
+                else:
+                    self.RefreshDivergenceModel(previous_block)
+                next_block.RemoveBranch(next)
+                if next_block.GetBranchNumber() < 2:
+                    self.DeleteDivergence(next_block)
+                else:
+                    self.RefreshDivergenceModel(next_block)
+            self.Parent.RefreshProjectTree()
+
+    def DeleteDivergence(self, divergence):
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.DeleteDivergence(self, divergence)
+        else:
+            connectors = divergence.GetConnectors()
+            type = divergence.GetType()
+            if type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
+                wires = connectors["outputs"][0].GetWires()
+                if len(wires) > 1:
+                    return
+                elif len(wires) == 1:
+                    next = wires[0][0].StartConnected
+                    next_block = next.GetParentBlock()
+                    wire = wires[0][0]
+                    wire.Clean()
+                    self.Wires.remove(wire)
+                    self.Elements.remove(wire)
+                else:
+                    next = None
+                    next_block = None
+                for index, connector in enumerate(connectors["inputs"]):
+                    if next and index == 0:
+                        wires = connector.GetWires()
+                        wire = wires[0][0]
+                        previous = wires[0][0].EndConnected
+                        wire.Clean()
+                        self.Wires.remove(wire)
+                        self.Elements.remove(wire)
+                    else:
+                        if type == SELECTION_CONVERGENCE:
+                            wires = connector.GetWires()
+                            previous_block = wires[0][0].EndConnected.GetParentBlock()
+                            self.RemoveTransition(previous_block)
+                        wires = connector.GetWires()
+                        wire = wires[0][0]
+                        previous_connector = wire.EndConnected
+                        previous_block = previous_connector.GetParentBlock()
+                        wire.Clean()
+                        self.Wires.remove(wire)
+                        self.Elements.remove(wire)
+                        if isinstance(previous_block, SFC_Step):
+                            previous_block.RemoveOutput()
+                            self.RefreshStepModel(previous_block)
+                        elif isinstance(previous_block, SFC_Divergence):
+                            if previous_block.GetType() in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]:
+                                previous_block.RemoveBranch(previous_connector)
+                                if previous_block.GetBranchNumber() < 2:
+                                    self.DeleteDivergence(previous_block)
+                                else:
+                                    self.RefreshDivergenceModel(previous_block)
+                            else:
+                                self.DeleteDivergence(previous_block)
+                divergence.Clean()
+                self.Blocks.remove(divergence)
+                self.Elements.remove(divergence)
+                self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId())
+                if next:
+                    wire = self.ConnectConnectors(next, previous)
+                    previous_block = previous.GetParentBlock()
+                    pos = previous.GetPosition(False)
+                    next_pos = next.GetPosition(False)
+                    wire_size = GetWireSize(previous_block)
+                    previous_block.RefreshOutputPosition((0, previous_pos.y + wire_size - next_pos.y))
+                    wire.SetPoints([wxPoint(previous_pos.x, previous_pos.y + wire_size), 
+                        wxPoint(previous_pos.x, previous_pos.y)])
+                    if isinstance(next_block, SFC_Divergence):
+                        next_block.RefreshPosition()
+                    previous_block.RefreshOutputModel(True)
+            elif divergence.GetBranchNumber() == 1:
+                wires = connectors["inputs"][0].GetWires()
+                if len(wires) != 1:
+                    return
+                wire = wires[0][0]
+                previous = wire.EndConnected
+                previous_block = previous.GetParentBlock()
+                wire.Clean()
+                self.Wires.remove(wire)
+                self.Elements.remove(wire)
+                wires = connectors["outputs"][0].GetWires()
+                if len(wires) != 1:
+                    return
+                wire = wires[0][0]
+                next = wire.StartConnected
+                next_block = next.GetParentBlock()
+                wire.Clean()
+                self.Wires.remove(wire)
+                self.Elements.remove(wire)
+                divergence.Clean()
+                self.Blocks.remove(divergence)
+                self.Elements.remove(divergence)
+                self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId())
+                wire = self.ConnectConnectors(next, previous)
+                previous_pos = previous.GetPosition(False)
+                next_pos = next.GetPosition(False)
+                wire_size = GetWireSize(previous_block)
+                previous_block.RefreshOutputPosition((previous_pos.x - next_pos.x, previous_pos.y + wire_size - next_pos.y))
+                wire.SetPoints([wxPoint(previous_pos.x, previous_pos.y + wire_size), 
+                    wxPoint(previous_pos.x, previous_pos.y)])
+                if isinstance(next_block, SFC_Divergence):
+                    next_block.RefreshPosition()
+                previous_block.RefreshOutputModel(True)
+            self.Parent.RefreshProjectTree()
+
+    def DeleteJump(self, jump):
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.DeleteJump(self, jump)
+        else:
+            previous = jump.GetPreviousConnector()
+            previous_block = previous.GetParentBlock()
+            if isinstance(previous_block, SFC_Transition):
+                self.RemoveTransition(previous_block)
+                previous = jump.GetPreviousConnector()
+                if previous:
+                    previous_block = previous.GetParentBlock()
+                else:
+                    previous_block = None
             wires = previous.GetWires()
             if len(wires) != 1:
                 return
@@ -846,188 +998,48 @@
             wire.Clean()
             self.Wires.remove(wire)
             self.Elements.remove(wire)
-            wires = next.GetWires()
+            jump.Clean()
+            self.Blocks.remove(jump)
+            self.Elements.remove(jump)
+            self.Controler.RemoveCurrentElementEditingInstance(jump.GetId())
+            if isinstance(previous_block, SFC_Step):
+                previous_block.RemoveOutput()
+                self.RefreshStepModel(previous_block)
+            elif isinstance(previous_block, SFC_Divergence):
+                if previous_block.GetType() in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
+                    self.DeleteDivergence(previous_block)
+                else:
+                    previous_block.RemoveBranch(previous)
+                    if previous_block.GetBranchNumber() < 2:
+                        self.DeleteDivergence(previous_block)
+                    else:
+                        previous_block.RefreshModel()
+            self.Parent.RefreshProjectTree()
+
+    def DeleteActionBlock(self, actionblock):
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.DeleteActionBlock(self, actionblock)
+        else:
+            connector = actionblock.GetConnector()
+            wires = connector.GetWires()
             if len(wires) != 1:
                 return
             wire = wires[0][0]
+            step = wire.EndConnected.GetParentBlock()
             wire.Clean()
             self.Wires.remove(wire)
             self.Elements.remove(wire)
-            transition.Clean()
-            self.Blocks.remove(transition)
-            self.Elements.remove(transition)
-            self.Controler.RemoveCurrentElementEditingInstance(transition.GetId())
-            previous_block.RemoveBranch(previous)
-            if previous_block.GetBranchNumber() < 2:
-                self.DeleteDivergence(previous_block)
-            else:
-                self.RefreshDivergenceModel(previous_block)
-            next_block.RemoveBranch(next)
-            if next_block.GetBranchNumber() < 2:
-                self.DeleteDivergence(next_block)
-            else:
-                self.RefreshDivergenceModel(next_block)
-        self.Parent.RefreshProjectTree()
-
-    def DeleteDivergence(self, divergence):
-        connectors = divergence.GetConnectors()
-        type = divergence.GetType()
-        if type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
-            wires = connectors["outputs"][0].GetWires()
-            if len(wires) > 1:
-                return
-            elif len(wires) == 1:
-                next = wires[0][0].StartConnected
-                next_block = next.GetParentBlock()
-                wire = wires[0][0]
-                wire.Clean()
-                self.Wires.remove(wire)
-                self.Elements.remove(wire)
-            else:
-                next = None
-                next_block = None
-            for index, connector in enumerate(connectors["inputs"]):
-                if next and index == 0:
-                    wires = connector.GetWires()
-                    wire = wires[0][0]
-                    previous = wires[0][0].EndConnected
-                    wire.Clean()
-                    self.Wires.remove(wire)
-                    self.Elements.remove(wire)
-                else:
-                    if type == SELECTION_CONVERGENCE:
-                        wires = connector.GetWires()
-                        previous_block = wires[0][0].EndConnected.GetParentBlock()
-                        self.RemoveTransition(previous_block)
-                    wires = connector.GetWires()
-                    wire = wires[0][0]
-                    previous_connector = wire.EndConnected
-                    previous_block = previous_connector.GetParentBlock()
-                    wire.Clean()
-                    self.Wires.remove(wire)
-                    self.Elements.remove(wire)
-                    if isinstance(previous_block, SFC_Step):
-                        previous_block.RemoveOutput()
-                        self.RefreshStepModel(previous_block)
-                    elif isinstance(previous_block, SFC_Divergence):
-                        if previous_block.GetType() in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]:
-                            previous_block.RemoveBranch(previous_connector)
-                            if previous_block.GetBranchNumber() < 2:
-                                self.DeleteDivergence(previous_block)
-                            else:
-                                self.RefreshDivergenceModel(previous_block)
-                        else:
-                            self.DeleteDivergence(previous_block)
-            divergence.Clean()
-            self.Blocks.remove(divergence)
-            self.Elements.remove(divergence)
-            self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId())
-            if next:
-                wire = self.ConnectConnectors(next, previous)
-                previous_block = previous.GetParentBlock()
-                pos = previous.GetPosition(False)
-                next_pos = next.GetPosition(False)
-                wire_size = GetWireSize(previous_block)
-                previous_block.RefreshOutputPosition((0, previous_pos.y + wire_size - next_pos.y))
-                wire.SetPoints([wxPoint(previous_pos.x, previous_pos.y + wire_size), 
-                    wxPoint(previous_pos.x, previous_pos.y)])
-                if isinstance(next_block, SFC_Divergence):
-                    next_block.RefreshPosition()
-                previous_block.RefreshOutputModel(True)
-        elif divergence.GetBranchNumber() == 1:
-            wires = connectors["inputs"][0].GetWires()
-            if len(wires) != 1:
-                return
-            wire = wires[0][0]
-            previous = wire.EndConnected
-            previous_block = previous.GetParentBlock()
-            wire.Clean()
-            self.Wires.remove(wire)
-            self.Elements.remove(wire)
-            wires = connectors["outputs"][0].GetWires()
-            if len(wires) != 1:
-                return
-            wire = wires[0][0]
-            next = wire.StartConnected
-            next_block = next.GetParentBlock()
-            wire.Clean()
-            self.Wires.remove(wire)
-            self.Elements.remove(wire)
-            divergence.Clean()
-            self.Blocks.remove(divergence)
-            self.Elements.remove(divergence)
-            self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId())
-            wire = self.ConnectConnectors(next, previous)
-            previous_pos = previous.GetPosition(False)
-            next_pos = next.GetPosition(False)
-            wire_size = GetWireSize(previous_block)
-            previous_block.RefreshOutputPosition((previous_pos.x - next_pos.x, previous_pos.y + wire_size - next_pos.y))
-            wire.SetPoints([wxPoint(previous_pos.x, previous_pos.y + wire_size), 
-                wxPoint(previous_pos.x, previous_pos.y)])
-            if isinstance(next_block, SFC_Divergence):
-                next_block.RefreshPosition()
-            previous_block.RefreshOutputModel(True)
-        self.Parent.RefreshProjectTree()
-
-    def DeleteJump(self, jump):
-        previous = jump.GetPreviousConnector()
-        previous_block = previous.GetParentBlock()
-        if isinstance(previous_block, SFC_Transition):
-            self.RemoveTransition(previous_block)
-            previous = jump.GetPreviousConnector()
-            if previous:
-                previous_block = previous.GetParentBlock()
-            else:
-                previous_block = None
-        wires = previous.GetWires()
-        if len(wires) != 1:
-            return
-        wire = wires[0][0]
-        wire.Clean()
-        self.Wires.remove(wire)
-        self.Elements.remove(wire)
-        jump.Clean()
-        self.Blocks.remove(jump)
-        self.Elements.remove(jump)
-        self.Controler.RemoveCurrentElementEditingInstance(jump.GetId())
-        if isinstance(previous_block, SFC_Step):
-            previous_block.RemoveOutput()
-            self.RefreshStepModel(previous_block)
-        elif isinstance(previous_block, SFC_Divergence):
-            if previous_block.GetType() in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
-                self.DeleteDivergence(previous_block)
-            else:
-                previous_block.RemoveBranch(previous)
-                if previous_block.GetBranchNumber() < 2:
-                    self.DeleteDivergence(previous_block)
-                else:
-                    previous_block.RefreshModel()
-        self.Parent.RefreshProjectTree()
-
-    def DeleteActionBlock(self, actionblock):
-        connector = actionblock.GetConnector()
-        wires = connector.GetWires()
-        if len(wires) != 1:
-            return
-        wire = wires[0][0]
-        step = wire.EndConnected.GetParentBlock()
-        wire.Clean()
-        self.Wires.remove(wire)
-        self.Elements.remove(wire)
-        actionblock.Clean()
-        self.Blocks.remove(actionblock)
-        self.Elements.remove(actionblock)
-        self.Controler.RemoveCurrentElementEditingInstance(actionblock.GetId())
-        step.RemoveAction()
-        self.RefreshStepModel(step)
-        step.RefreshOutputPosition()
-        step.RefreshOutputModel(True)
-        self.Parent.RefreshProjectTree()
-
-    def DeleteComment(self, comment):
-        self.Elements.remove(self.SelectedElement)
-        self.Controler.RemoveCurrentElementEditingInstance(comment.GetId())
-        
+            actionblock.Clean()
+            self.Blocks.remove(actionblock)
+            self.Elements.remove(actionblock)
+            self.Controler.RemoveCurrentElementEditingInstance(actionblock.GetId())
+            step.RemoveAction()
+            self.RefreshStepModel(step)
+            step.RefreshOutputPosition()
+            step.RefreshOutputModel(True)
+            self.Parent.RefreshProjectTree()
+
     def DeleteWire(self, wire):
-        pass
-
+        if self.GetDrawingMode() == FREEDRAWING_MODE:
+            Viewer.DeleteWire(self, wire)
+    
diff -r dae55dd9ee14 -r fc23e1f415d8 Viewer.py
--- a/Viewer.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/Viewer.py	Tue Jul 10 09:52:53 2007 +0200
@@ -274,7 +274,7 @@
             connector = connection.GetConnector()
             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
         elif instance["type"] == "connection":
-            connection = FBD_Connection(self, CONNECTOR, instance["name"], instance["id"])
+            connection = FBD_Connector(self, CONNECTOR, instance["name"], instance["id"])
             connection.SetPosition(instance["x"], instance["y"])
             connection.SetSize(instance["width"], instance["height"])
             self.Blocks.append(connection)
@@ -874,9 +874,9 @@
             id = self.GetNewId()
             values = dialog.GetValues()
             if "name" in values:
-                block = FBD_Block(self, values["type"], values["name"], id, values["extension"])
+                block = FBD_Block(self, values["type"], values["name"], id, values["extension"], values["inputs"])
             else:
-                block = FBD_Block(self, values["type"], "", id, values["extension"])
+                block = FBD_Block(self, values["type"], "", id, values["extension"], values["inputs"])
             block.SetPosition(bbox.x, bbox.y)
             block.SetSize(values["width"], values["height"])
             self.Blocks.append(block)
@@ -952,7 +952,7 @@
                     varlist.append(var["Name"])
         dialog.SetVariables(varlist)
         dialog.SetValues({"name":"","type":CONTACT_NORMAL})
-        dialog.SetElementSize(bbox.width, bbox.height)
+        dialog.SetElementSize((bbox.width, bbox.height))
         if dialog.ShowModal() == wxID_OK:
             id = self.GetNewId()
             values = dialog.GetValues()
@@ -979,7 +979,7 @@
             varlist.append(self.Controler.GetCurrentElementEditingName())
         dialog.SetVariables(varlist)
         dialog.SetValues({"name":"","type":COIL_NORMAL})
-        dialog.SetElementSize(bbox.width, bbox.height)
+        dialog.SetElementSize((bbox.width, bbox.height))
         if dialog.ShowModal() == wxID_OK:
             id = self.GetNewId()
             values = dialog.GetValues()
@@ -1043,209 +1043,6 @@
             self.Refresh()
         dialog.Destroy()
 
-#-------------------------------------------------------------------------------
-#                          Model update functions
-#-------------------------------------------------------------------------------
-
-    def RefreshBlockModel(self, block):
-        blockid = block.GetId()
-        infos = {}
-        infos["type"] = block.GetType()
-        infos["name"] = block.GetName()
-        infos["x"], infos["y"] = block.GetPosition()
-        infos["width"], infos["height"] = block.GetSize()
-        infos["connectors"] = block.GetConnectors()
-        self.Controler.SetCurrentElementEditingBlockInfos(blockid, infos)
-    
-    def RefreshVariableModel(self, variable):
-        variableid = variable.GetId()
-        infos = {}
-        infos["name"] = variable.GetName()
-        infos["x"], infos["y"] = variable.GetPosition()
-        infos["width"], infos["height"] = variable.GetSize()
-        infos["connectors"] = variable.GetConnectors()
-        self.Controler.SetCurrentElementEditingVariableInfos(variableid, infos)
-
-    def RefreshConnectionModel(self, connection):
-        connectionid = connection.GetId()
-        infos = {}
-        infos["name"] = connection.GetName()
-        infos["x"], infos["y"] = connection.GetPosition()
-        infos["width"], infos["height"] = connection.GetSize()
-        infos["connector"] = connection.GetConnector()
-        self.Controler.SetCurrentElementEditingConnectionInfos(connectionid, infos)
-
-    def RefreshCommentModel(self, comment):
-        commentid = comment.GetId()
-        infos = {}
-        infos["content"] = comment.GetContent()
-        infos["x"], infos["y"] = comment.GetPosition()
-        infos["width"], infos["height"] = comment.GetSize()
-        self.Controler.SetCurrentElementEditingCommentInfos(commentid, infos)
-
-    def RefreshPowerRailModel(self, powerrail):
-        powerrailid = powerrail.GetId()
-        infos = {}
-        infos["x"], infos["y"] = powerrail.GetPosition()
-        infos["width"], infos["height"] = powerrail.GetSize()
-        infos["connectors"] = powerrail.GetConnectors()
-        self.Controler.SetCurrentElementEditingPowerRailInfos(powerrailid, infos)
-
-    def RefreshContactModel(self, contact):
-        contactid = contact.GetId()
-        infos = {}
-        infos["name"] = contact.GetName()
-        infos["type"] = contact.GetType()
-        infos["x"], infos["y"] = contact.GetPosition()
-        infos["width"], infos["height"] = contact.GetSize()
-        infos["connectors"] = contact.GetConnectors()
-        self.Controler.SetCurrentElementEditingContactInfos(contactid, infos)
-
-    def RefreshCoilModel(self, coil):
-        coilid = coil.GetId()
-        infos = {}
-        infos["name"] = coil.GetName()
-        infos["type"] = coil.GetType()
-        infos["x"], infos["y"] = coil.GetPosition()
-        infos["width"], infos["height"] = coil.GetSize()
-        infos["connectors"] = coil.GetConnectors()
-        self.Controler.SetCurrentElementEditingCoilInfos(coilid, infos)
-
-    def RefreshStepModel(self, step):
-        stepid = step.GetId()
-        infos = {}
-        infos["name"] = step.GetName()
-        infos["initial"] = step.GetInitial()
-        infos["x"], infos["y"] = step.GetPosition()
-        infos["width"], infos["height"] = step.GetSize()
-        infos["connectors"] = step.GetConnectors()
-        self.Controler.SetCurrentElementEditingStepInfos(stepid, infos)
-
-    def RefreshTransitionModel(self, transition):
-        transitionid = transition.GetId()
-        infos = {}
-        infos["type"] = transition.GetType()
-        infos["condition"] = transition.GetCondition()
-        infos["x"], infos["y"] = transition.GetPosition()
-        infos["width"], infos["height"] = transition.GetSize()
-        infos["connectors"] = transition.GetConnectors()
-        self.Controler.SetCurrentElementEditingTransitionInfos(transitionid, infos)
-
-    def RefreshDivergenceModel(self, divergence):
-        divergenceid = divergence.GetId()
-        infos = {}
-        infos["x"], infos["y"] = divergence.GetPosition()
-        infos["width"], infos["height"] = divergence.GetSize()
-        infos["connectors"] = divergence.GetConnectors()
-        self.Controler.SetCurrentElementEditingDivergenceInfos(divergenceid, infos)
-
-    def RefreshJumpModel(self, jump):
-        jumpid = jump.GetId()
-        infos = {}
-        infos["target"] = jump.GetTarget()
-        infos["x"], infos["y"] = jump.GetPosition()
-        infos["width"], infos["height"] = jump.GetSize()
-        infos["connector"] = jump.GetConnector()
-        self.Controler.SetCurrentElementEditingJumpInfos(jumpid, infos)
-
-    def RefreshActionBlockModel(self, actionblock):
-        actionblockid = actionblock.GetId()
-        infos = {}
-        infos["actions"] = actionblock.GetActions()
-        infos["x"], infos["y"] = actionblock.GetPosition()
-        infos["width"], infos["height"] = actionblock.GetSize()
-        infos["connector"] = actionblock.GetConnector()
-        self.Controler.SetCurrentElementEditingActionBlockInfos(actionblockid, infos)
-
-
-#-------------------------------------------------------------------------------
-#                          Model delete functions
-#-------------------------------------------------------------------------------
-
-
-    def DeleteBlock(self, block):
-        elements = []
-        for output in block.GetConnectors()["outputs"]:
-            for element in output.GetConnectedBlocks():
-                if element not in elements:
-                    elements.append(element)
-        block.Clean()
-        self.Blocks.remove(block)
-        self.Elements.remove(block)
-        self.Controler.RemoveCurrentElementEditingInstance(block.GetId())
-        for element in elements:
-            element.RefreshModel()
-
-    def DeleteVariable(self, variable):
-        connectors = variable.GetConnectors()
-        if connectors["output"]:
-            elements = connectors["output"].GetConnectedBlocks()
-        else:
-            elements = []
-        variable.Clean()
-        self.Blocks.remove(variable)
-        self.Elements.remove(variable)
-        self.Controler.RemoveCurrentElementEditingInstance(variable.GetId())
-        for element in elements:
-            element.RefreshModel()
-
-    def DeleteConnection(self, connection):
-        if connection.GetType() == CONTINUATION:
-            elements = connection.GetConnector().GetConnectedBlocks()
-        else:
-            elements = []
-        connection.Clean()
-        self.Blocks.remove(connection)
-        self.Elements.remove(connection)
-        self.Controler.RemoveCurrentElementEditingInstance(connection.GetId())
-        for element in elements:
-            element.RefreshModel()
-
-    def DeleteComment(self, comment):
-        self.Elements.remove(comment)
-        self.Controler.RemoveCurrentElementEditingInstance(comment.GetId())
-
-    def DeleteWire(self, wire):
-        connected = wire.GetConnected()
-        wire.Clean()
-        self.Wires.remove(wire)
-        self.Elements.remove(wire)
-        for connector in connected:
-            connector.RefreshParentBlock()
-
-    def DeleteContact(self, contact):
-        connectors = contact.GetConnectors()
-        elements = connectors["output"].GetConnectedBlocks()
-        contact.Clean()
-        self.Blocks.remove(contact)
-        self.Elements.remove(contact)
-        self.Controler.RemoveCurrentElementEditingInstance(contact.GetId())
-        for element in elements:
-            element.RefreshModel()
-
-    def DeleteCoil(self, coil):
-        connectors = coil.GetConnectors()
-        elements = connectors["output"].GetConnectedBlocks()
-        coil.Clean()
-        self.Blocks.remove(coil)
-        self.Elements.remove(coil)
-        self.Controler.RemoveCurrentElementEditingInstance(coil.GetId())
-        for element in elements:
-            element.RefreshModel()
-
-    def DeletePowerRail(self, powerrail):
-        elements = []
-        if powerrail.GetType() == LEFTRAIL:
-            for connector in powerrail.GetConnectors():
-                for element in connector.GetConnectedBlocks():
-                    if element not in elements:
-                        elements.append(element)
-        powerrrail.Clean()
-        self.Blocks.remove(powerrrail)
-        self.Elements.remove(powerrrail)
-        self.Controler.RemoveCurrentElementEditingInstance(powerrrail.GetId())
-        for element in elements:
-            element.RefreshModel()
 
 #-------------------------------------------------------------------------------
 #                          Edit element content functions
@@ -1255,7 +1052,7 @@
         dialog = BlockPropertiesDialog(self.Parent)
         dialog.SetBlockList(self.Controler.GetBlockTypes())
         dialog.SetMinBlockSize(block.GetSize())
-        values = {"name" : block.GetName(), "type" : block.GetType()}
+        values = {"name" : block.GetName(), "type" : block.GetType(), "inputs" : block.GetInputTypes()}
         values["extension"] = block.GetExtension()
         dialog.SetValues(values)
         if dialog.ShowModal() == wxID_OK:
@@ -1296,6 +1093,384 @@
             self.Refresh()
         dialog.Destroy()
 
+    def EditConnectionContent(self, connection):
+        dialog = ConnectionPropertiesDialog(self.Parent)
+        dialog.SetMinConnectionSize(connection.GetSize())
+        values = {"name" : connection.GetName(), "type" : connection.GetType()}
+        dialog.SetValues(values)
+        if dialog.ShowModal() == wxID_OK:
+            old_type = connection.GetType()
+            values = dialog.GetValues()
+            connection.SetName(values["name"])
+            connection.SetType(values["type"])
+            connection.SetSize(values["width"], values["height"])
+            if old_type != values["type"]:
+                id = connection.GetId()
+                self.Controler.RemoveCurrentElementEditingInstance(id)
+                self.Controler.AddCurrentElementEditingConnection(id, values["type"])
+            self.RefreshConnectionModel(connection)
+            self.Refresh()
+        dialog.Destroy()
+
+    def EditContactContent(self, contact):
+        dialog = LDElementDialog(self.Parent, "contact")
+        varlist = []
+        vars = self.Controler.GetCurrentElementEditingInterfaceVars()
+        if vars:
+            for var in vars:
+                if var["Class"] != "Output" and var["Type"] == "BOOL":
+                    varlist.append(var["Name"])
+        dialog.SetVariables(varlist)
+        values = {"name" : contact.GetName(), "type" : contact.GetType()}
+        dialog.SetValues(values)
+        dialog.SetElementSize(contact.GetSize())
+        if dialog.ShowModal() == wxID_OK:
+            values = dialog.GetValues()
+            contact.SetName(values["name"])
+            contact.SetType(values["type"])
+            contact.SetSize(values["width"], values["height"])
+            self.RefreshContactModel(contact)
+            self.Refresh()
+        dialog.Destroy()
+
+    def EditCoilContent(self, coil):
+        dialog = LDElementDialog(self.Parent, "coil")
+        varlist = []
+        vars = self.Controler.GetCurrentElementEditingInterfaceVars()
+        if vars:
+            for var in vars:
+                if var["Class"] != "Input" and var["Type"] == "BOOL":
+                    varlist.append(var["Name"])
+        returntype = self.Controler.GetCurrentElementEditingInterfaceReturnType()
+        if returntype == "BOOL":
+            varlist.append(self.Controler.GetCurrentElementEditingName())
+        dialog.SetVariables(varlist)
+        values = {"name" : coil.GetName(), "type" : coil.GetType()}
+        dialog.SetValues(values)
+        dialog.SetElementSize(contact.GetSize())
+        if dialog.ShowModal() == wxID_OK:
+            values = dialog.GetValues()
+            coil.SetName(values["name"])
+            coil.SetType(values["type"])
+            coil.SetSize(values["width"], values["height"])
+            self.RefreshContactModel(coil)
+            self.Refresh()
+        dialog.Destroy()
+
+    def EditPowerRailContent(self, powerrail):
+        dialog = LDPowerRailDialog(self.Parent, powerrail.GetType(), len(powerrail.GetConnectors()))
+        dialog.SetMinSize(powerrail.GetSize())
+        if dialog.ShowModal() == wxID_OK:
+            old_type = powerrail.GetType()
+            values = dialog.GetValues()
+            powerrail.SetType(values["type"])
+            powerrail.SetSize(values["width"], values["height"])
+            if old_type != values["type"]:
+                id = powerrail.GetId()
+                self.Controler.RemoveCurrentElementEditingInstance(id)
+                self.Controler.AddCurrentElementEditingPowerRail(id, values["type"])
+            self.RefreshPowerRailModel(powerrail)
+            self.Refresh()
+        dialog.Destroy()
+
+
+    def AddNewTransition(self, bbox):
+        dialog = TransitionContentDialog(self.Parent)
+        dialog.SetTransitions(self.Controler.GetCurrentElementEditingTransitions())
+        if dialog.ShowModal() == wxID_OK:
+            id = self.GetNewId()
+            values = dialog.GetValues()
+            transition = SFC_Transition(self, values["type"], values["value"], id)
+            transition.SetPosition(bbox.x, bbox.y)
+            min_width, min_height = transition.GetMinSize()
+            transition.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+            self.Blocks.append(transition)
+            self.Elements.append(transition)
+            self.Controler.AddCurrentElementEditingTransition(id)
+            self.RefreshTransitionModel(transition)
+            self.Refresh()
+        dialog.Destroy()
+
+    def AddNewDivergence(self, bbox):
+        dialog = DivergenceCreateDialog(self.Parent)
+        dialog.SetMinSize((bbox.width, bbox.height))
+        if dialog.ShowModal() == wxID_OK:
+            id = self.GetNewId()
+            values = dialog.GetValues()
+            divergence = SFC_Divergence(self, values["type"], values["number"], id)
+            divergence.SetPosition(bbox.x, bbox.y)
+            min_width, min_height = divergence.GetMinSize()
+            divergence.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+            self.Blocks.append(divergence)
+            self.Elements.append(divergence)
+            self.Controler.AddCurrentElementEditingDivergence(id, values["type"])
+            self.RefreshDivergenceModel(divergence)
+            self.Refresh()
+        dialog.Destroy()
+
+#-------------------------------------------------------------------------------
+#                          Model update functions
+#-------------------------------------------------------------------------------
+
+    def RefreshBlockModel(self, block):
+        blockid = block.GetId()
+        infos = {}
+        infos["type"] = block.GetType()
+        infos["name"] = block.GetName()
+        infos["x"], infos["y"] = block.GetPosition()
+        infos["width"], infos["height"] = block.GetSize()
+        infos["connectors"] = block.GetConnectors()
+        self.Controler.SetCurrentElementEditingBlockInfos(blockid, infos)
+    
+    def RefreshVariableModel(self, variable):
+        variableid = variable.GetId()
+        infos = {}
+        infos["name"] = variable.GetName()
+        infos["x"], infos["y"] = variable.GetPosition()
+        infos["width"], infos["height"] = variable.GetSize()
+        infos["connectors"] = variable.GetConnectors()
+        self.Controler.SetCurrentElementEditingVariableInfos(variableid, infos)
+
+    def RefreshConnectionModel(self, connection):
+        connectionid = connection.GetId()
+        infos = {}
+        infos["name"] = connection.GetName()
+        infos["x"], infos["y"] = connection.GetPosition()
+        infos["width"], infos["height"] = connection.GetSize()
+        infos["connector"] = connection.GetConnector()
+        self.Controler.SetCurrentElementEditingConnectionInfos(connectionid, infos)
+
+    def RefreshCommentModel(self, comment):
+        commentid = comment.GetId()
+        infos = {}
+        infos["content"] = comment.GetContent()
+        infos["x"], infos["y"] = comment.GetPosition()
+        infos["width"], infos["height"] = comment.GetSize()
+        self.Controler.SetCurrentElementEditingCommentInfos(commentid, infos)
+
+    def RefreshPowerRailModel(self, powerrail):
+        powerrailid = powerrail.GetId()
+        infos = {}
+        infos["x"], infos["y"] = powerrail.GetPosition()
+        infos["width"], infos["height"] = powerrail.GetSize()
+        infos["connectors"] = powerrail.GetConnectors()
+        self.Controler.SetCurrentElementEditingPowerRailInfos(powerrailid, infos)
+
+    def RefreshContactModel(self, contact):
+        contactid = contact.GetId()
+        infos = {}
+        infos["name"] = contact.GetName()
+        infos["type"] = contact.GetType()
+        infos["x"], infos["y"] = contact.GetPosition()
+        infos["width"], infos["height"] = contact.GetSize()
+        infos["connectors"] = contact.GetConnectors()
+        self.Controler.SetCurrentElementEditingContactInfos(contactid, infos)
+
+    def RefreshCoilModel(self, coil):
+        coilid = coil.GetId()
+        infos = {}
+        infos["name"] = coil.GetName()
+        infos["type"] = coil.GetType()
+        infos["x"], infos["y"] = coil.GetPosition()
+        infos["width"], infos["height"] = coil.GetSize()
+        infos["connectors"] = coil.GetConnectors()
+        self.Controler.SetCurrentElementEditingCoilInfos(coilid, infos)
+
+    def RefreshStepModel(self, step):
+        stepid = step.GetId()
+        infos = {}
+        infos["name"] = step.GetName()
+        infos["initial"] = step.GetInitial()
+        infos["x"], infos["y"] = step.GetPosition()
+        infos["width"], infos["height"] = step.GetSize()
+        infos["connectors"] = step.GetConnectors()
+        self.Controler.SetCurrentElementEditingStepInfos(stepid, infos)
+
+    def RefreshTransitionModel(self, transition):
+        transitionid = transition.GetId()
+        infos = {}
+        infos["type"] = transition.GetType()
+        infos["condition"] = transition.GetCondition()
+        infos["x"], infos["y"] = transition.GetPosition()
+        infos["width"], infos["height"] = transition.GetSize()
+        infos["connectors"] = transition.GetConnectors()
+        self.Controler.SetCurrentElementEditingTransitionInfos(transitionid, infos)
+
+    def RefreshDivergenceModel(self, divergence):
+        divergenceid = divergence.GetId()
+        infos = {}
+        infos["x"], infos["y"] = divergence.GetPosition()
+        infos["width"], infos["height"] = divergence.GetSize()
+        infos["connectors"] = divergence.GetConnectors()
+        self.Controler.SetCurrentElementEditingDivergenceInfos(divergenceid, infos)
+
+    def RefreshJumpModel(self, jump):
+        jumpid = jump.GetId()
+        infos = {}
+        infos["target"] = jump.GetTarget()
+        infos["x"], infos["y"] = jump.GetPosition()
+        infos["width"], infos["height"] = jump.GetSize()
+        infos["connector"] = jump.GetConnector()
+        self.Controler.SetCurrentElementEditingJumpInfos(jumpid, infos)
+
+    def RefreshActionBlockModel(self, actionblock):
+        actionblockid = actionblock.GetId()
+        infos = {}
+        infos["actions"] = actionblock.GetActions()
+        infos["x"], infos["y"] = actionblock.GetPosition()
+        infos["width"], infos["height"] = actionblock.GetSize()
+        infos["connector"] = actionblock.GetConnector()
+        self.Controler.SetCurrentElementEditingActionBlockInfos(actionblockid, infos)
+
+
+#-------------------------------------------------------------------------------
+#                          Model delete functions
+#-------------------------------------------------------------------------------
+
+
+    def DeleteBlock(self, block):
+        elements = []
+        for output in block.GetConnectors()["outputs"]:
+            for element in output.GetConnectedBlocks():
+                if element not in elements:
+                    elements.append(element)
+        block.Clean()
+        self.Blocks.remove(block)
+        self.Elements.remove(block)
+        self.Controler.RemoveCurrentElementEditingInstance(block.GetId())
+        for element in elements:
+            element.RefreshModel()
+
+    def DeleteVariable(self, variable):
+        connectors = variable.GetConnectors()
+        if connectors["output"]:
+            elements = connectors["output"].GetConnectedBlocks()
+        else:
+            elements = []
+        variable.Clean()
+        self.Blocks.remove(variable)
+        self.Elements.remove(variable)
+        self.Controler.RemoveCurrentElementEditingInstance(variable.GetId())
+        for element in elements:
+            element.RefreshModel()
+
+    def DeleteConnection(self, connection):
+        if connection.GetType() == CONTINUATION:
+            elements = connection.GetConnector().GetConnectedBlocks()
+        else:
+            elements = []
+        connection.Clean()
+        self.Blocks.remove(connection)
+        self.Elements.remove(connection)
+        self.Controler.RemoveCurrentElementEditingInstance(connection.GetId())
+        for element in elements:
+            element.RefreshModel()
+
+    def DeleteComment(self, comment):
+        self.Elements.remove(comment)
+        self.Controler.RemoveCurrentElementEditingInstance(comment.GetId())
+
+    def DeleteWire(self, wire):
+        if wire in self.Wires:
+            connected = wire.GetConnected()
+            wire.Clean()
+            self.Wires.remove(wire)
+            self.Elements.remove(wire)
+            for connector in connected:
+                connector.RefreshParentBlock()
+
+    def DeleteContact(self, contact):
+        connectors = contact.GetConnectors()
+        elements = connectors["output"].GetConnectedBlocks()
+        contact.Clean()
+        self.Blocks.remove(contact)
+        self.Elements.remove(contact)
+        self.Controler.RemoveCurrentElementEditingInstance(contact.GetId())
+        for element in elements:
+            element.RefreshModel()
+
+    def DeleteCoil(self, coil):
+        connectors = coil.GetConnectors()
+        elements = connectors["output"].GetConnectedBlocks()
+        coil.Clean()
+        self.Blocks.remove(coil)
+        self.Elements.remove(coil)
+        self.Controler.RemoveCurrentElementEditingInstance(coil.GetId())
+        for element in elements:
+            element.RefreshModel()
+
+    def DeletePowerRail(self, powerrail):
+        elements = []
+        if powerrail.GetType() == LEFTRAIL:
+            for connector in powerrail.GetConnectors():
+                for element in connector.GetConnectedBlocks():
+                    if element not in elements:
+                        elements.append(element)
+        powerrrail.Clean()
+        self.Blocks.remove(powerrrail)
+        self.Elements.remove(powerrrail)
+        self.Controler.RemoveCurrentElementEditingInstance(powerrrail.GetId())
+        for element in elements:
+            element.RefreshModel()
+
+    def DeleteStep(self, step):
+        elements = []
+        connectors = step.GetConnectors()
+        if connectors["output"]:
+            for element in connectors["output"].GetConnectedBlocks():
+                if element not in elements:
+                    elements.append(element)
+        if connectors["action"]:
+            for element in connectors["action"].GetConnectedBlocks():
+                if element not in elements:
+                    elements.append(element)
+        step.Clean()
+        self.Blocks.remove(step)
+        self.Elements.remove(step)
+        self.Controler.RemoveCurrentElementEditingInstance(step.GetId())
+        for element in elements:
+            element.RefreshModel()
+            
+    def DeleteTransition(self, transition):
+        elements = []
+        connectors = transition.GetConnectors()
+        if connectors["output"]:
+            for element in connectors["output"].GetConnectedBlocks():
+                if element not in elements:
+                    elements.append(element)
+        transition.Clean()
+        self.Blocks.remove(transition)
+        self.Elements.remove(transition)
+        self.Controler.RemoveCurrentElementEditingInstance(transition.GetId())
+        for element in elements:
+            element.RefreshModel()
+
+    def DeleteDivergence(self, divergence):
+        elements = []
+        connectors = divergence.GetConnectors()
+        for output in connectors["outputs"]:
+            for element in output.GetConnectedBlocks():
+                if element not in elements:
+                    elements.append(element)
+        divergence.Clean()
+        self.Blocks.remove(divergence)
+        self.Elements.remove(divergence)
+        self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId())
+        for element in elements:
+            element.RefreshModel()
+    
+    def DeleteJump(self, jump):
+        jump.Clean()
+        self.Blocks.remove(jump)
+        self.Elements.remove(jump)
+        self.Controler.RemoveCurrentElementEditingInstance(jump.GetId())
+    
+    def DeleteActionBlock(self, actionblock):
+        actionblock.Clean()
+        self.Blocks.remove(actionblock)
+        self.Elements.remove(actionblock)
+        self.Controler.RemoveCurrentElementEditingInstance(actionblock.GetId())
+
 
 #-------------------------------------------------------------------------------
 #                            Editing functions
diff -r dae55dd9ee14 -r fc23e1f415d8 graphics/FBD_Objects.py
--- a/graphics/FBD_Objects.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/graphics/FBD_Objects.py	Tue Jul 10 09:52:53 2007 +0200
@@ -40,7 +40,7 @@
 class FBD_Block(Graphic_Element):
     
     # Create a new block
-    def __init__(self, parent, type, name, id = None, extension = 0):
+    def __init__(self, parent, type, name, id = None, extension = 0, inputs = None):
         Graphic_Element.__init__(self, parent)
         self.Type = None
         self.Extension = None
@@ -48,7 +48,7 @@
         self.Id = id
         self.Inputs = []
         self.Outputs = []
-        self.SetType(type, extension)
+        self.SetType(type, extension, inputs)
     
     # Destructor
     def __del__(self):
@@ -129,6 +129,9 @@
                 return output
         return None
     
+    def GetInputTypes(self):
+        return tuple([input.GetType() for input in self.Inputs])
+    
     # Returns all the block connectors 
     def GetConnectors(self):
         return {"inputs" : self.Inputs, "outputs" : self.Outputs}
@@ -146,13 +149,13 @@
         return None
     
     # Changes the block type
-    def SetType(self, type, extension):
+    def SetType(self, type, extension, inputs = None):
         if type != self.Type or self.Extension != extension: 
             self.Type = type
             self.Extension = extension
             # Find the block definition from type given and create the corresponding
             # inputs and outputs
-            blocktype = GetBlockType(type)
+            blocktype = GetBlockType(type, inputs)
             if blocktype:
                 inputs = [input for input in blocktype["inputs"]]
                 outputs = [output for output in blocktype["outputs"]]
@@ -338,7 +341,7 @@
             self.Input.SetPosition(wxPoint(0, self.Size[1] / 2))
         if self.Output:
             self.Output.SetPosition(wxPoint(self.Size[0], self.Size[1] / 2))
-        self.RefreshConnected(self)
+        self.RefreshConnected()
     
     # Refresh the position of wires connected to connector
     def RefreshConnected(self, exclude = []):
@@ -495,7 +498,7 @@
     # Unconnect connector
     def Clean(self):
         if self.Connector:
-            self.Connector.UnConnect()
+            self.Connector.UnConnect(delete = True)
     
     # Delete this connection by calling the appropriate method
     def Delete(self):
@@ -517,7 +520,7 @@
             self.Connector.SetPosition(wxPoint(0, self.Size[1] / 2))
         else:
             self.Connector.SetPosition(wxPoint(self.Size[0], self.Size[1] / 2))
-        self.RefreshConnected(self)
+        self.RefreshConnected()
     
     # Refresh the position of wires connected to connector
     def RefreshConnected(self, exclude = []):
@@ -534,6 +537,18 @@
     def GetConnector(self, position = None, name = None):
         return self.Connector
     
+    # Changes the variable type
+    def SetType(self, type):
+        if type != self.Type:
+            self.Type = type
+            self.Clean()
+            # Create an input or output connector according to connection type
+            if self.Type == CONNECTOR:
+                self.Connector = Connector(self, "", "ANY", wxPoint(0, 0), WEST, onlyone = True)
+            else:
+                self.Connector = Connector(self, "", "ANY", wxPoint(0, 0), EAST)
+            self.RefreshConnectors()
+    
     # Returns the connection type
     def GetType(self):
         return self.Type
@@ -554,6 +569,11 @@
             text_height += 1
         return text_width + text_height + 20, text_height + 10
     
+    # Method called when a LeftDClick event have been generated
+    def OnLeftDClick(self, event, dc, scaling):
+        # Edit the connection properties
+        self.Parent.EditConnectionContent(self)
+    
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the default menu
diff -r dae55dd9ee14 -r fc23e1f415d8 graphics/GraphicCommons.py
--- a/graphics/GraphicCommons.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/graphics/GraphicCommons.py	Tue Jul 10 09:52:53 2007 +0200
@@ -36,30 +36,30 @@
 """
 
 # FBD and SFC constants
-MIN_MOVE = 5            # Minimum move before starting a element dragging
-CONNECTOR_SIZE = 8      # Size of connectors
-BLOCK_LINE_SIZE = 20    # Minimum size of each line in a block
-HANDLE_SIZE = 6         # Size of the squares for handles
-ANCHOR_DISTANCE = 5     # Distance where wire is automativally attached to a connector
-POINT_RADIUS = 2        # Radius of the point of wire ends
-MIN_SEGMENT_SIZE = 2    # Minimum size of the endling segments of a wire
+MIN_MOVE = 5                            # Minimum move before starting a element dragging
+CONNECTOR_SIZE = 8                      # Size of connectors
+BLOCK_LINE_SIZE = 20                    # Minimum size of each line in a block
+HANDLE_SIZE = 6                         # Size of the squares for handles
+ANCHOR_DISTANCE = 5                     # Distance where wire is automativally attached to a connector
+POINT_RADIUS = 2                        # Radius of the point of wire ends
+MIN_SEGMENT_SIZE = 2                    # Minimum size of the endling segments of a wire
 
 # LD constants
-LD_LINE_SIZE = 40                   # Distance between two lines in a ladder rung
-LD_ELEMENT_SIZE = (21, 15)          # Size (width, height) of a ladder element (contact or coil)
-LD_WIRE_SIZE = 30                   # Size of a wire between two contact
-LD_WIRECOIL_SIZE = 70               # Size of a wire between a coil and a contact
-LD_OFFSET = (10, 10)                # Distance (x, y) between each comment and rung of the ladder
-LD_COMMENT_DEFAULTSIZE = (600, 40)  # Size (width, height) of a comment box
+LD_LINE_SIZE = 40                       # Distance between two lines in a ladder rung
+LD_ELEMENT_SIZE = (21, 15)              # Size (width, height) of a ladder element (contact or coil)
+LD_WIRE_SIZE = 30                       # Size of a wire between two contact
+LD_WIRECOIL_SIZE = 70                   # Size of a wire between a coil and a contact
+LD_OFFSET = (10, 10)                    # Distance (x, y) between each comment and rung of the ladder
+LD_COMMENT_DEFAULTSIZE = (600, 40)      # Size (width, height) of a comment box
 
 # SFC constants
-SFC_STEP_DEFAULT_SIZE = (40, 30)      # Default size of a SFC step
-SFC_TRANSITION_SIZE = (20, 2)         # Size of a SFC transition
-SFC_DEFAULT_SEQUENCE_INTERVAL = 40    # Default size of the interval between two divergence branches
-SFC_SIMULTANEOUS_SEQUENCE_EXTRA = 20  # Size of extra lines for simultaneous divergence and convergence
-SFC_JUMP_SIZE = (12, 13)              # Size of a SFC jump to step
-SFC_WIRE_MIN_SIZE = 25                # Size of a wire between two elements
-SFC_ACTION_MIN_SIZE = (100, 30)       # Minimum size of an action block line
+SFC_STEP_DEFAULT_SIZE = (40, 30)        # Default size of a SFC step
+SFC_TRANSITION_SIZE = (20, 2)           # Size of a SFC transition
+SFC_DEFAULT_SEQUENCE_INTERVAL = 40      # Default size of the interval between two divergence branches
+SFC_SIMULTANEOUS_SEQUENCE_EXTRA = 20    # Size of extra lines for simultaneous divergence and convergence
+SFC_JUMP_SIZE = (12, 13)                # Size of a SFC jump to step
+SFC_WIRE_MIN_SIZE = 25                  # Size of a wire between two elements
+SFC_ACTION_MIN_SIZE = (100, 30)         # Minimum size of an action block line
 
 # Type definition constants for graphic elements
 [INPUT, OUTPUT, INOUT] = range(3)
diff -r dae55dd9ee14 -r fc23e1f415d8 graphics/LD_Objects.py
--- a/graphics/LD_Objects.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/graphics/LD_Objects.py	Tue Jul 10 09:52:53 2007 +0200
@@ -208,13 +208,13 @@
             # Initializes the last position
             self.oldPos = GetScaledEventPosition(event, dc, scaling)
         else:
-            self.RealConnectors = {"Inputs":[],"Outputs":[]}
-            for input in self.Inputs:
-                position = input.GetRelPosition()
-                self.RealConnectors["Inputs"].append(float(position.x)/float(self.Size[0]))
-            for output in self.Outputs:
-                position = output.GetRelPosition()
-                self.RealConnectors["Outputs"].append(float(position.x)/float(self.Size[0]))
+##            self.RealConnectors = {"Inputs":[],"Outputs":[]}
+##            for input in self.Inputs:
+##                position = input.GetRelPosition()
+##                self.RealConnectors["Inputs"].append(float(position.x)/float(self.Size[0]))
+##            for output in self.Outputs:
+##                position = output.GetRelPosition()
+##                self.RealConnectors["Outputs"].append(float(position.x)/float(self.Size[0]))
             Graphic_Element.OnLeftDown(self, event, dc, scaling)
     
     # Method called when a LeftUp event have been generated
@@ -232,6 +232,11 @@
             block.RefreshModel(False)
         Graphic_Element.OnLeftUp(self, event, dc, scaling)
     
+    # Method called when a LeftDClick event have been generated
+    def OnLeftDClick(self, event, dc, scaling):
+        # Edit the powerrail properties
+        self.Parent.EditPowerRailContent(self)
+    
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         pos = GetScaledEventPosition(event, dc, scaling)
diff -r dae55dd9ee14 -r fc23e1f415d8 plcopen/structures.py
--- a/plcopen/structures.py	Mon Jul 09 11:10:14 2007 +0200
+++ b/plcopen/structures.py	Tue Jul 10 09:52:53 2007 +0200
@@ -128,10 +128,15 @@
 Function that returns the block definition associated to the block type given
 """
 
-def GetBlockType(type):
+def GetBlockType(type, inputs = None):
     for category in BlockTypes:
         for blocktype in category["list"]:
-            if blocktype["name"] == type:
+            if inputs:
+                block_inputs = tuple([var_type for name, var_type, modifier in blocktype["inputs"]])
+                same_inputs = inputs == block_inputs
+            else:
+                same_inputs = True
+            if blocktype["name"] == type and same_inputs:
                 return blocktype
     return None
 
diff -r dae55dd9ee14 -r fc23e1f415d8 test.xml
--- a/test.xml	Mon Jul 09 11:10:14 2007 +0200
+++ b/test.xml	Tue Jul 10 09:52:53 2007 +0200
@@ -3,14 +3,11 @@
          xmlns="http://www.plcopen.org/xml/tc6.xsd"
          xmlns:xhtml="http://www.w3.org/1999/xhtml"
          xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd http://www.plcopen.org/xml/tc6.xsd">
-  <fileHeader contentDescription=""
-              companyName="test"
-              companyURL=""
-              productName="test"
-              productRelease=""
-              productVersion="test"
-              creationDateTime="2007-07-09 08:54:39"/>
-  <contentHeader name="test">
+  <fileHeader companyName="Lolitech"
+              productName="PLCOpenEditorExample"
+              productVersion="1.0"
+              creationDateTime="2006-09-07 18:52:43"/>
+  <contentHeader name="Test">
     <coordinateInfo>
       <fbd>
         <scaling y="0" x="0"/>
@@ -25,9 +22,875 @@
   </contentHeader>
   <types>
     <dataTypes/>
-    <pous/>
+    <pous>
+      <pou name="FBDTest" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="IN1">
+              <type>
+                <BOOL/>
+              </type>
+              <initialValue>
+                <simpleValue value="false"/>
+              </initialValue>
+            </variable>
+            <variable name="IN2">
+              <type>
+                <BOOL/>
+              </type>
+              <initialValue>
+                <simpleValue value="true"/>
+              </initialValue>
+            </variable>
+            <variable name="IN3">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="OUT">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </outputVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="2" width="89" height="27">
+              <position y="84" x="64"/>
+              <connectionPointOut>
+                <relPosition y="13" x="89"/>
+              </connectionPointOut>
+              <expression>IN1</expression>
+            </inVariable>
+            <inVariable localId="3" width="90" height="27">
+              <position y="204" x="63"/>
+              <connectionPointOut>
+                <relPosition y="13" x="90"/>
+              </connectionPointOut>
+              <expression>IN2</expression>
+            </inVariable>
+            <outVariable localId="4" width="95" height="33">
+              <position y="182" x="587"/>
+              <connectionPointIn>
+                <relPosition y="16" x="0"/>
+                <connection refLocalId="11" formalParameter="Q1">
+                  <position y="198" x="587"/>
+                  <position y="198" x="517"/>
+                </connection>
+              </connectionPointIn>
+              <expression>OUT</expression>
+            </outVariable>
+            <block localId="6" height="84" width="99" typeName="AND">
+              <position y="105" x="235"/>
+              <inputVariables>
+                <variable formalParameter="" edge="rising">
+                  <connectionPointIn>
+                    <relPosition y="36" x="0"/>
+                    <connection refLocalId="2">
+                      <position y="141" x="235"/>
+                      <position y="141" x="190"/>
+                      <position y="97" x="190"/>
+                      <position y="97" x="153"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="">
+                  <connectionPointIn>
+                    <relPosition y="68" x="0"/>
+                    <connection refLocalId="3">
+                      <position y="173" x="235"/>
+                      <position y="173" x="190"/>
+                      <position y="217" x="190"/>
+                      <position y="217" x="153"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="" negated="true">
+                  <connectionPointOut>
+                    <relPosition y="36" x="99"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="7" width="90" height="28">
+              <position y="336" x="63"/>
+              <connectionPointOut>
+                <relPosition y="14" x="90"/>
+              </connectionPointOut>
+              <expression>IN3</expression>
+            </inVariable>
+            <block localId="8" height="87" width="99" typeName="OR">
+              <position y="246" x="235"/>
+              <inputVariables>
+                <variable formalParameter="IN1" negated="true">
+                  <connectionPointIn>
+                    <relPosition y="36" x="0"/>
+                    <connection refLocalId="3">
+                      <position y="282" x="235"/>
+                      <position y="282" x="190"/>
+                      <position y="217" x="190"/>
+                      <position y="217" x="153"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition y="69" x="0"/>
+                    <connection refLocalId="7">
+                      <position y="315" x="235"/>
+                      <position y="315" x="191"/>
+                      <position y="350" x="191"/>
+                      <position y="350" x="153"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition y="36" x="99"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <comment localId="10" height="37" width="261">
+              <position y="32" x="243"/>
+              <content>POU qui sert a tester PLCOpenEditor.</content>
+            </comment>
+            <block localId="11" height="91" width="97" instanceName="SR1" typeName="SR">
+              <position y="161" x="420"/>
+              <inputVariables>
+                <variable formalParameter="S1">
+                  <connectionPointIn>
+                    <relPosition y="37" x="0"/>
+                    <connection refLocalId="6" formalParameter="OUT">
+                      <position y="198" x="420"/>
+                      <position y="198" x="369"/>
+                      <position y="141" x="369"/>
+                      <position y="141" x="334"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R">
+                  <connectionPointIn>
+                    <relPosition y="72" x="0"/>
+                    <connection refLocalId="8" formalParameter="OUT">
+                      <position y="233" x="420"/>
+                      <position y="233" x="369"/>
+                      <position y="282" x="369"/>
+                      <position y="282" x="334"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition y="37" x="97"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="LDTest" pouType="function">
+        <interface>
+          <returnType>
+            <BOOL/>
+          </returnType>
+          <inputVars>
+            <variable name="IN1">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="IN2">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="IN3">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="IN4">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+        </interface>
+        <body>
+          <LD>
+            <comment localId="1" height="40" width="600">
+              <position y="10" x="10"/>
+              <content>Commentaire</content>
+            </comment>
+            <leftPowerRail localId="2" height="80" width="2">
+              <position y="60" x="10"/>
+              <connectionPointOut formalParameter="">
+                <relPosition y="20" x="2"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition y="60" x="2"/>
+              </connectionPointOut>
+            </leftPowerRail>
+            <coil localId="3" width="21" storage="none" height="15" negated="false">
+              <position y="72" x="265"/>
+              <connectionPointIn>
+                <relPosition y="8" x="0"/>
+                <connection refLocalId="7">
+                  <position y="80" x="265"/>
+                  <position y="80" x="195"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="8" x="21"/>
+              </connectionPointOut>
+              <variable>LDTest</variable>
+            </coil>
+            <rightPowerRail localId="4" height="40" width="2">
+              <position y="60" x="316"/>
+              <connectionPointIn>
+                <relPosition y="20" x="0"/>
+                <connection refLocalId="3">
+                  <position y="80" x="316"/>
+                  <position y="80" x="286"/>
+                </connection>
+              </connectionPointIn>
+            </rightPowerRail>
+            <contact localId="5" width="21" height="15" edge="none" negated="true">
+              <position y="72" x="42"/>
+              <connectionPointIn>
+                <relPosition y="8" x="0"/>
+                <connection refLocalId="2">
+                  <position y="80" x="42"/>
+                  <position y="80" x="12"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="8" x="21"/>
+              </connectionPointOut>
+              <variable>IN1</variable>
+            </contact>
+            <contact localId="7" width="21" height="15" edge="none" negated="false">
+              <position y="72" x="174"/>
+              <connectionPointIn>
+                <relPosition y="8" x="0"/>
+                <connection refLocalId="5">
+                  <position y="80" x="174"/>
+                  <position y="80" x="63"/>
+                </connection>
+                <connection refLocalId="9">
+                  <position y="80" x="174"/>
+                  <position y="80" x="144"/>
+                  <position y="120" x="144"/>
+                  <position y="120" x="114"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="8" x="21"/>
+              </connectionPointOut>
+              <variable>IN2</variable>
+            </contact>
+            <contact localId="8" width="21" height="15" edge="none" negated="false">
+              <position y="112" x="42"/>
+              <connectionPointIn>
+                <relPosition y="8" x="0"/>
+                <connection refLocalId="2">
+                  <position y="120" x="42"/>
+                  <position y="120" x="12"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="8" x="21"/>
+              </connectionPointOut>
+              <variable>IN3</variable>
+            </contact>
+            <contact localId="9" width="21" height="15" edge="none" negated="true">
+              <position y="112" x="93"/>
+              <connectionPointIn>
+                <relPosition y="8" x="0"/>
+                <connection refLocalId="8">
+                  <position y="120" x="93"/>
+                  <position y="120" x="63"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="8" x="21"/>
+              </connectionPointOut>
+              <variable>IN4</variable>
+            </contact>
+          </LD>
+        </body>
+      </pou>
+      <pou name="ILTest" pouType="function">
+        <interface>
+          <returnType>
+            <REAL/>
+          </returnType>
+          <inputVars>
+            <variable name="X1">
+              <type>
+                <REAL/>
+              </type>
+              <initialValue>
+                <simpleValue value="1.0"/>
+              </initialValue>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="Temp">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </localVars>
+          <inputVars>
+            <variable name="X2">
+              <type>
+                <REAL/>
+              </type>
+              <initialValue>
+                <simpleValue value="0.0"/>
+              </initialValue>
+            </variable>
+            <variable name="Y1">
+              <type>
+                <REAL/>
+              </type>
+              <initialValue>
+                <simpleValue value="1.0"/>
+              </initialValue>
+            </variable>
+            <variable name="Y2">
+              <type>
+                <REAL/>
+              </type>
+              <initialValue>
+                <simpleValue value="0.0"/>
+              </initialValue>
+            </variable>
+            <variable name="TMax">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="ERROR">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </outputVars>
+        </interface>
+        <body>
+          <IL>
+     LD   Y1
+     SUB  Y2     (* Substract Y2 from Y1 *)
+     ST   Temp   (* Store Y1-Y2 in Temp *)
+     MUL  Temp   (* Multiply by Temp to square *)
+     ADD( X1     (* Defer ADD *)
+     SUB  X2     (* Substract X1 from X2 *)
+     ST   Temp   (* Store X1-X2 in Temp *)
+     MUL  Temp   (* Multiply by Temp to square *)
+     )
+     SQRT        (* Call Square root fun *)
+     ST   ILTest (* Setup function result *)
+     GT   TMax   (* Greater than TMax ? *)
+     JMPC ERR    (* Yes, Jump to Error *)
+     S    ERROR  (* Set ERROR *)
+     RET         (* Normal return *)
+ERR: RET         (* Error return, ENO not set *)
+          </IL>
+        </body>
+      </pou>
+      <pou name="SFCTest" pouType="program">
+        <interface>
+          <inputVars>
+            <variable name="IN1">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="IN2">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="IN3">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="IN4">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="IN5">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+        </interface>
+        <actions>
+          <action name="ACT1">
+            <body>
+              <ST>
+IF IN1 THEN
+  IN2 := 1;
+ELSE
+  IN3 := 1;
+END_IF;
+              </ST>
+            </body>
+          </action>
+        </actions>
+        <transitions>
+          <transition name="TR1">
+            <body>
+              <ST>:= AND(IN1, IN2, IN3);</ST>
+            </body>
+          </transition>
+        </transitions>
+        <body>
+          <SFC>
+            <step localId="1" height="31" width="46" initialStep="true" name="Start">
+              <position y="46" x="82"/>
+              <connectionPointOut formalParameter="">
+                <relPosition y="31" x="23"/>
+              </connectionPointOut>
+            </step>
+            <transition localId="2" height="2" width="20">
+              <position y="102" x="95"/>
+              <connectionPointIn>
+                <relPosition y="0" x="10"/>
+                <connection refLocalId="1">
+                  <position y="102" x="105"/>
+                  <position y="77" x="105"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="2" x="10"/>
+              </connectionPointOut>
+              <condition>
+                <reference name="TR1"/>
+              </condition>
+            </transition>
+            <step localId="3" height="27" width="29" initialStep="false" name="Init">
+              <position y="129" x="91"/>
+              <connectionPointIn>
+                <relPosition y="0" x="14"/>
+                <connection refLocalId="2">
+                  <position y="129" x="105"/>
+                  <position y="104" x="105"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition y="27" x="14"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition y="13" x="29"/>
+              </connectionPointOutAction>
+            </step>
+            <selectionDivergence localId="4" height="1" width="391">
+              <position y="181" x="105"/>
+              <connectionPointIn>
+                <relPosition y="0" x="0"/>
+                <connection refLocalId="3">
+                  <position y="181" x="105"/>
+                  <position y="156" x="105"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition y="1" x="0"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition y="1" x="228"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition y="1" x="391"/>
+              </connectionPointOut>
+            </selectionDivergence>
+            <transition localId="5" height="2" width="20">
+              <position y="207" x="95"/>
+              <connectionPointIn>
+                <relPosition y="0" x="10"/>
+                <connection refLocalId="4">
+                  <position y="207" x="105"/>
+                  <position y="182" x="105"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="2" x="10"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>IN2 AND IN3</ST>
+                </inline>
+              </condition>
+            </transition>
+            <step localId="6" height="27" width="48" initialStep="false" name="Step1">
+              <position y="262" x="81"/>
+              <connectionPointIn>
+                <relPosition y="0" x="24"/>
+                <connection refLocalId="21">
+                  <position y="262" x="105"/>
+                  <position y="237" x="105"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition y="27" x="24"/>
+              </connectionPointOut>
+            </step>
+            <transition localId="7" height="2" width="20">
+              <position y="207" x="323"/>
+              <connectionPointIn>
+                <relPosition y="0" x="10"/>
+                <connection refLocalId="4">
+                  <position y="207" x="333"/>
+                  <position y="182" x="333"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="2" x="10"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>IN3</ST>
+                </inline>
+              </condition>
+            </transition>
+            <step localId="8" height="27" width="48" initialStep="false" name="Step2">
+              <position y="234" x="309"/>
+              <connectionPointIn>
+                <relPosition y="0" x="24"/>
+                <connection refLocalId="7">
+                  <position y="234" x="333"/>
+                  <position y="209" x="333"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition y="27" x="24"/>
+              </connectionPointOut>
+            </step>
+            <transition localId="9" height="2" width="20">
+              <position y="207" x="486"/>
+              <connectionPointIn>
+                <relPosition y="0" x="10"/>
+                <connection refLocalId="4">
+                  <position y="207" x="496"/>
+                  <position y="182" x="496"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="2" x="10"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>IN4</ST>
+                </inline>
+              </condition>
+            </transition>
+            <step localId="10" height="27" width="48" initialStep="false" name="Step3">
+              <position y="234" x="472"/>
+              <connectionPointIn>
+                <relPosition y="0" x="24"/>
+                <connection refLocalId="9">
+                  <position y="234" x="496"/>
+                  <position y="209" x="496"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition y="27" x="24"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition y="13" x="48"/>
+              </connectionPointOutAction>
+            </step>
+            <transition localId="11" height="2" width="20">
+              <position y="342" x="95"/>
+              <connectionPointIn>
+                <relPosition y="0" x="10"/>
+                <connection refLocalId="23">
+                  <position y="342" x="105"/>
+                  <position y="317" x="105"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="2" x="10"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>IN5</ST>
+                </inline>
+              </condition>
+            </transition>
+            <jumpStep localId="12" height="13" width="12" targetName="Start">
+              <position y="369" x="99"/>
+              <connectionPointIn>
+                <relPosition y="0" x="6"/>
+                <connection refLocalId="11">
+                  <position y="369" x="105"/>
+                  <position y="344" x="105"/>
+                </connection>
+              </connectionPointIn>
+            </jumpStep>
+            <actionBlock localId="13" height="30" width="100">
+              <position y="127" x="145"/>
+              <connectionPointIn>
+                <relPosition y="15" x="0"/>
+                <connection refLocalId="3">
+                  <position y="142" x="145"/>
+                  <position y="142" x="120"/>
+                </connection>
+              </connectionPointIn>
+              <action qualifier="N">
+                <reference name="ACT1"/>
+              </action>
+            </actionBlock>
+            <transition localId="14" height="2" width="20">
+              <position y="286" x="323"/>
+              <connectionPointIn>
+                <relPosition y="0" x="10"/>
+                <connection refLocalId="8">
+                  <position y="286" x="333"/>
+                  <position y="261" x="333"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="2" x="10"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>IN5</ST>
+                </inline>
+              </condition>
+            </transition>
+            <transition localId="15" height="2" width="20">
+              <position y="316" x="486"/>
+              <connectionPointIn>
+                <relPosition y="0" x="10"/>
+                <connection refLocalId="10">
+                  <position y="316" x="496"/>
+                  <position y="261" x="496"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="2" x="10"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>IN5</ST>
+                </inline>
+              </condition>
+            </transition>
+            <selectionConvergence localId="16" height="1" width="163">
+              <position y="343" x="333"/>
+              <connectionPointIn>
+                <relPosition y="0" x="0"/>
+                <connection refLocalId="14">
+                  <position y="343" x="333"/>
+                  <position y="288" x="333"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointIn>
+                <relPosition y="0" x="163"/>
+                <connection refLocalId="15">
+                  <position y="343" x="496"/>
+                  <position y="318" x="496"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="1" x="80"/>
+              </connectionPointOut>
+            </selectionConvergence>
+            <jumpStep localId="19" height="13" width="12" targetName="Init">
+              <position y="369" x="407"/>
+              <connectionPointIn>
+                <relPosition y="0" x="6"/>
+                <connection refLocalId="16">
+                  <position y="369" x="413"/>
+                  <position y="344" x="413"/>
+                </connection>
+              </connectionPointIn>
+            </jumpStep>
+            <actionBlock localId="20" height="60" width="181">
+              <position y="232" x="545"/>
+              <connectionPointIn>
+                <relPosition y="15" x="0"/>
+                <connection refLocalId="10">
+                  <position y="247" x="545"/>
+                  <position y="247" x="520"/>
+                </connection>
+              </connectionPointIn>
+              <action indicator="IN5" qualifier="N">
+                <reference name="ACT1"/>
+              </action>
+              <action qualifier="D" duration="T#10s">
+                <reference name="IN1"/>
+              </action>
+            </actionBlock>
+            <simultaneousDivergence localId="21" height="3" width="118">
+              <position y="234" x="105"/>
+              <connectionPointIn>
+                <relPosition y="0" x="0"/>
+                <connection refLocalId="5">
+                  <position y="234" x="105"/>
+                  <position y="209" x="105"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition y="3" x="0"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition y="3" x="118"/>
+              </connectionPointOut>
+            </simultaneousDivergence>
+            <step localId="22" height="27" width="48" initialStep="false" name="Step4">
+              <position y="262" x="199"/>
+              <connectionPointIn>
+                <relPosition y="0" x="24"/>
+                <connection refLocalId="21">
+                  <position y="262" x="223"/>
+                  <position y="237" x="223"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition y="27" x="24"/>
+              </connectionPointOut>
+            </step>
+            <simultaneousConvergence localId="23" height="3" width="118">
+              <position y="314" x="105"/>
+              <connectionPointIn>
+                <relPosition y="0" x="0"/>
+                <connection refLocalId="6">
+                  <position y="314" x="105"/>
+                  <position y="289" x="105"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointIn>
+                <relPosition y="0" x="118"/>
+                <connection refLocalId="22">
+                  <position y="314" x="223"/>
+                  <position y="289" x="223"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition y="3" x="0"/>
+              </connectionPointOut>
+            </simultaneousConvergence>
+          </SFC>
+        </body>
+      </pou>
+      <pou name="STTest" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Collision">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Gate">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Pump">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Temp">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="Speed">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="PumpSpeed">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Brakes">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Control_State">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </outputVars>
+        </interface>
+        <body>
+          <ST>
+IF Collision THEN
+  Speed := 0;
+  Brakes := TRUE;
+END_IF;
+
+IF (Gate = TRUE) AND
+    (Pump = TRUE) AND (Temp > 200.0) THEN
+  Control_State := TRUE;
+ELSE
+  Control_State := FALSE;
+  PumpSpeed := 10.0;
+END_IF;
+          </ST>
+        </body>
+      </pou>
+    </pous>
   </types>
   <instances>
-    <configurations/>
+    <configurations>
+      <configuration name="ConfigTest">
+        <resource name="ResourceTest">
+          <task interval="01:00:00.100000" name="Toto" priority="6">
+            <pouInstance type="SFCTest" name="Program1"/>
+          </task>
+          <globalVars>
+            <variable name="Titi" address="M30">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </globalVars>
+        </resource>
+        <globalVars>
+          <variable name="Toto" address="M10">
+            <type>
+              <INT/>
+            </type>
+          </variable>
+          <variable name="Tutu" address="M20">
+            <type>
+              <BOOL/>
+            </type>
+          </variable>
+        </globalVars>
+      </configuration>
+      <configuration name="ConfigTest2"/>
+    </configurations>
   </instances>
 </project>