Viewer.py
changeset 42 4a8400732001
parent 28 fc23e1f415d8
child 45 42637f721b5b
--- a/Viewer.py	Tue Jul 17 12:25:50 2007 +0200
+++ b/Viewer.py	Wed Jul 18 11:51:30 2007 +0200
@@ -120,6 +120,9 @@
         self.DrawGrid = True
         self.current_id = 0    
         
+        # Initialize Block, Wire and Comment numbers
+        self.block_id = self.wire_id = self.comment_id = 0
+        
         # Initialize Viewer mode to Selection mode
         self.Mode = MODE_SELECTION
         self.SavedMode = False
@@ -153,14 +156,60 @@
         return dc
 
 #-------------------------------------------------------------------------------
+#                         Element management functions
+#-------------------------------------------------------------------------------
+
+    def AddBlock(self, block):
+        self.block_id += 1
+        self.Blocks[block] = self.block_id
+        
+    def AddWire(self, wire):
+        self.wire_id += 1
+        self.Wires[wire] = self.wire_id
+        
+    def AddComment(self, comment):
+        self.comment_id += 1
+        self.Comments[comment] = self.comment_id
+
+    def IsBlock(self, block):
+        return self.Blocks.get(block, False)
+        
+    def IsWire(self, wire):
+        return self.Wires.get(wire, False)
+        
+    def IsComment(self, comment):
+        return self.Comments.get(comment, False)
+
+    def RemoveBlock(self, block):
+        self.Blocks.pop(block)
+        
+    def RemoveWire(self, wire):
+        self.Wires.pop(wire)
+        
+    def RemoveComment(self, comment):
+        self.Comments.pop(comment)
+
+    def GetElements(self, sort_blocks=False, sort_wires=False, sort_comments=False):
+        blocks = self.Blocks.keys()
+        wires = self.Wires.keys()
+        comments = self.Comments.keys()
+        if sort_blocks:
+            blocks.sort(lambda x,y:self.Blocks[x].__cmp__(self.Blocks[y]))
+        if sort_wires:
+            wires.sort(lambda x,y:self.Wires[x].__cmp__(self.Wires[y]))
+        if sort_comments:
+            comments.sort(lambda x,y:self.Comments[x].__cmp__(self.Comments[y]))
+        return blocks + wires + comments
+
+#-------------------------------------------------------------------------------
 #                              Reset functions
 #-------------------------------------------------------------------------------
 
     # Resets Viewer lists
     def ResetView(self):
-        self.Blocks = []
-        self.Wires = []
-        self.Elements = []
+        self.Blocks = {}
+        self.Wires = {}
+        self.Comments = {}
         self.SelectedElement = None
     
     # Changes Viewer mode
@@ -197,14 +246,14 @@
             instance = self.Controler.GetCurrentElementEditingInstanceInfos(exclude=ids)
             if instance:
                 self.loadInstance(instance, ids)
-        self.RefreshScrollBar()
+        self.RefreshScrollBars()
         self.Refresh()
     
-    def RefreshScrollBar(self):
+    def RefreshScrollBars(self):
         xstart, ystart = self.GetViewStart()
         window_size = self.GetClientSize()
         maxx = maxy = 0
-        for element in self.Elements:
+        for element in self.GetElements():
             posx, posy = element.GetPosition()
             width, height = element.GetSize()
             maxx = max(maxx, posx + width)
@@ -226,8 +275,7 @@
             variable = FBD_Variable(self, INPUT, instance["name"], instance["value_type"], instance["id"])
             variable.SetPosition(instance["x"], instance["y"])
             variable.SetSize(instance["width"], instance["height"])
-            self.Blocks.append(variable)
-            self.Elements.append(variable)
+            self.AddBlock(variable)
             connectors = variable.GetConnectors()
             connectors["output"].SetPosition(wxPoint(*instance["connector"]["position"]))
             if instance["connector"]["negated"]:
@@ -238,8 +286,7 @@
             variable = FBD_Variable(self, OUTPUT, instance["name"], instance["value_type"], instance["id"])
             variable.SetPosition(instance["x"], instance["y"])
             variable.SetSize(instance["width"], instance["height"])
-            self.Blocks.append(variable)
-            self.Elements.append(variable)
+            self.AddBlock(variable)
             connectors = variable.GetConnectors()
             connectors["input"].SetPosition(wxPoint(*instance["connector"]["position"]))
             if instance["connector"]["negated"]:
@@ -251,8 +298,7 @@
             variable = FBD_Variable(self, INOUT, instance["name"], instance["value_type"], instance["id"])
             variable.SetPosition(instance["x"], instance["y"])
             variable.SetSize(instance["width"], instance["height"])
-            self.Blocks.append(variable)
-            self.Elements.append(variable)
+            self.AddBlock(variable)
             connectors = variable.GetConnectors()
             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
@@ -269,16 +315,14 @@
             connection = FBD_Connector(self, CONTINUATION, instance["name"], instance["id"])
             connection.SetPosition(instance["x"], instance["y"])
             connection.SetSize(instance["width"], instance["height"])
-            self.Blocks.append(connection)
-            self.Elements.append(connection)
+            self.AddBlock(connection)
             connector = connection.GetConnector()
             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
         elif instance["type"] == "connection":
             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)
-            self.Elements.append(connection)
+            self.AddBlock(connection)
             connector = connection.GetConnector()
             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
             self.CreateWires(connector, instance["connector"]["links"], ids)
@@ -286,20 +330,18 @@
             comment = Comment(self, instance["content"], instance["id"])
             comment.SetPosition(instance["x"], instance["y"])
             comment.SetSize(instance["width"], instance["height"])
-            self.Elements.append(comment)
+            self.AddComment(comment)
         elif instance["type"] == "leftPowerRail":
             leftpowerrail = LD_PowerRail(self, LEFTRAIL, instance["id"], [True for i in range(len(instance["connectors"]))])
             leftpowerrail.SetPosition(instance["x"], instance["y"])
-            self.Blocks.append(leftpowerrail)
-            self.Elements.append(leftpowerrail)
+            self.AddBlock(leftpowerrail)
             connectors = leftpowerrail.GetConnectors()
             for i, connector in enumerate(instance["connectors"]):
                 connectors[i].SetPosition(wxPoint(*connector["position"]))
         elif instance["type"] == "rightPowerRail":
             rightpowerrail = LD_PowerRail(self, RIGHTRAIL, instance["id"], [True for i in range(len(instance["connectors"]))])
             rightpowerrail.SetPosition(instance["x"], instance["y"])
-            self.Blocks.append(rightpowerrail)
-            self.Elements.append(rightpowerrail)
+            self.AddBlock(rightpowerrail)
             connectors = rightpowerrail.GetConnectors()
             for i, connector in enumerate(instance["connectors"]):
                 connectors[i].SetPosition(wxPoint(*connector["position"]))
@@ -323,8 +365,7 @@
                 contact_type = CONTACT_NORMAL
             contact = LD_Contact(self, contact_type, instance["name"], instance["id"])
             contact.SetPosition(instance["x"], instance["y"])
-            self.Blocks.append(contact)
-            self.Elements.append(contact)
+            self.AddBlock(contact)
             connectors = contact.GetConnectors()
             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
@@ -348,8 +389,7 @@
                 coil_type = COIL_NORMAL
             coil = LD_Coil(self, coil_type, instance["name"], instance["id"])
             coil.SetPosition(instance["x"], instance["y"])
-            self.Blocks.append(coil)
-            self.Elements.append(coil)
+            self.AddBlock(coil)
             connectors = coil.GetConnectors()
             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
@@ -362,8 +402,7 @@
             step = SFC_Step(self, instance["name"], initial, instance["id"])
             step.SetPosition(instance["x"], instance["y"])
             step.SetSize(instance["width"], instance["height"])
-            self.Blocks.append(step)
-            self.Elements.append(step)
+            self.AddBlock(step)
             if "output" in instance["connectors"]:
                 step.AddOutput()
             if "action" in instance["connectors"]:
@@ -379,8 +418,7 @@
         elif instance["type"] == "transition":
             transition = SFC_Transition(self, instance["condition_type"], instance["condition"], instance["id"])
             transition.SetPosition(instance["x"], instance["y"])
-            self.Blocks.append(transition)
-            self.Elements.append(transition)
+            self.AddBlock(transition)
             connectors = transition.GetConnectors()
             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
@@ -400,8 +438,7 @@
                     len(instance["connectors"]["inputs"]), instance["id"])
             divergence.SetPosition(instance["x"], instance["y"])
             divergence.SetSize(instance["width"], instance["height"])
-            self.Blocks.append(divergence)
-            self.Elements.append(divergence)
+            self.AddBlock(divergence)
             connectors = divergence.GetConnectors()
             for i, input_connector in enumerate(instance["connectors"]["inputs"]):
                 connector = connectors["inputs"][i]
@@ -413,8 +450,7 @@
         elif instance["type"] == "jump":
             jump = SFC_Jump(self, instance["target"], instance["id"])
             jump.SetPosition(instance["x"], instance["y"])
-            self.Blocks.append(jump)
-            self.Elements.append(jump)
+            self.AddBlock(jump)
             connector = jump.GetConnector()
             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
             self.CreateWires(connector, instance["connector"]["links"], ids)
@@ -422,8 +458,7 @@
             actionBlock = SFC_ActionBlock(self, instance["actions"], instance["id"])
             actionBlock.SetPosition(instance["x"], instance["y"])
             actionBlock.SetSize(instance["width"], instance["height"])
-            self.Blocks.append(actionBlock)
-            self.Elements.append(actionBlock)
+            self.AddBlock(actionBlock)
             connector = actionBlock.GetConnector()
             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
             self.CreateWires(connector, instance["connector"]["links"], ids)
@@ -434,8 +469,7 @@
                 block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]))
             block.SetPosition(instance["x"], instance["y"])
             block.SetSize(instance["width"], instance["height"])
-            self.Blocks.append(block)
-            self.Elements.append(block)
+            self.AddBlock(block)
             connectors = block.GetConnectors()
             for i, input_connector in enumerate(instance["connectors"]["inputs"]):
                 connector = connectors["inputs"][i]
@@ -472,8 +506,7 @@
                         end_connector.Connect((wire, -1), False)
                         wire.ConnectStartPoint(None, start_connector)
                         wire.ConnectEndPoint(None, end_connector)
-                        self.Wires.append(wire)
-                        self.Elements.append(wire)
+                        self.AddWire(wire)
 
 #-------------------------------------------------------------------------------
 #                          Search Element functions
@@ -495,7 +528,7 @@
         if self.SelectedElement and not (exclude_group and isinstance(self.SelectedElement, Graphic_Group)):
             if self.SelectedElement.HitTest(pos) or self.SelectedElement.TestHandle(pos) != (0, 0):
                 return self.SelectedElement
-        for element in self.Elements:
+        for element in self.GetElements():
             if element.HitTest(pos) or element.TestHandle(pos) != (0, 0):
                 return element
         return None
@@ -508,16 +541,18 @@
         return None
     
     def FindElementById(self, id):
-        for element in self.Elements:
+        for element in self.Blocks:
+            if element.GetId() == id:
+                return element
+        for element in self.Comments:
             if element.GetId() == id:
                 return element
         return None
     
     def SearchElements(self, bbox):
         elements = []
-        for element in self.Elements:
-            element_bbox = element.GetBoundingBox()
-            if element_bbox.x >= bbox.x and element_bbox.y >= bbox.y and element_bbox.x + element_bbox.width <= bbox.x + bbox.width and element_bbox.y + element_bbox.height <= bbox.y + bbox.height:
+        for element in self.GetElements():
+            if element.IsInSelection(bbox):
                 elements.append(element)
         return elements
 
@@ -611,42 +646,42 @@
 #-------------------------------------------------------------------------------
 
     def OnNoModifierMenu(self, event):
-        if self.SelectedElement and self.SelectedElement in self.Blocks:
+        if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.SelectedElement.SetConnectorNegated(False)
         event.Skip()
     
     def OnNegatedMenu(self, event):
-        if self.SelectedElement and self.SelectedElement in self.Blocks:
+        if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.SelectedElement.SetConnectorNegated(True)
         event.Skip()
 
     def OnRisingEdgeMenu(self, event):
-        if self.SelectedElement and self.SelectedElement in self.Blocks:
+        if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.SelectedElement.SetConnectorEdge("rising")
         event.Skip()
 
     def OnFallingEdgeMenu(self, event):
-        if self.SelectedElement and self.SelectedElement in self.Blocks:
+        if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.SelectedElement.SetConnectorEdge("falling")
         event.Skip()
 
     def OnAddSegmentMenu(self, event):
-        if self.SelectedElement and self.SelectedElement in self.Wires:
+        if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.SelectedElement.AddSegment()
         event.Skip()
 
     def OnDeleteSegmentMenu(self, event):
-        if self.SelectedElement and self.SelectedElement in self.Wires:
+        if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.SelectedElement.DeleteSegment()
         event.Skip()
 
     def OnAddBranchMenu(self, event):
-        if self.SelectedElement and self.SelectedElement in self.Blocks:
+        if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.AddDivergenceBranch(self.SelectedElement)
         event.Skip()
 
     def OnDeleteBranchMenu(self, event):
-        if self.SelectedElement and self.SelectedElement in self.Blocks:
+        if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.RemoveDivergenceBranch(self.SelectedElement)
         event.Skip()
 
@@ -711,8 +746,7 @@
                 wire.Handle = (HANDLE_POINT, 0)
                 wire.ProcessDragging(0, 0)
                 wire.Handle = (HANDLE_POINT, 1)
-                self.Wires.append(wire)
-                self.Elements.append(wire)
+                self.AddWire(wire)
                 if self.SelectedElement:
                     self.SelectedElement.SetSelected(False)
                 self.SelectedElement = wire
@@ -767,10 +801,7 @@
             self.ReleaseMouse()
             self.Refresh()
         elif self.Mode == MODE_WIRE and self.SelectedElement:
-            dc = self.GetLogicalDC()
-            pos = GetScaledEventPosition(event, dc, self.Scaling)
-            connector = self.FindBlockConnector(pos, False)
-            if connector and connector != self.SelectedElement.StartConnected:
+            if self.SelectedElement.EndConnected != None:
                 self.SelectedElement.ResetPoints()
                 self.SelectedElement.OnMotion(event, dc, self.Scaling)
                 self.SelectedElement.GeneratePoints()
@@ -834,7 +865,7 @@
                 move_window.y = 1
             if move_window.x != 0 or move_window.y != 0:
                 self.Scroll(xstart + move_window.x, ystart + move_window.y)
-            self.RefreshScrollBar()
+            self.RefreshScrollBars()
         event.Skip()
 
 #-------------------------------------------------------------------------------
@@ -842,6 +873,9 @@
 #-------------------------------------------------------------------------------
 
     def OnChar(self, event):
+        xpos, ypos = self.GetScrollPos(wxHORIZONTAL), self.GetScrollPos(wxVERTICAL)
+        xmax = self.GetScrollRange(wxHORIZONTAL) - self.GetScrollThumb(wxHORIZONTAL)
+        ymax = self.GetScrollRange(wxVERTICAL) - self.GetScrollThumb(wxVERTICAL)
         keycode = event.GetKeyCode()
         if self.Scaling:
             scaling = self.Scaling
@@ -851,16 +885,35 @@
             self.SelectedElement.Clean()
             self.SelectedElement.Delete()
             self.SelectedElement = None
-        elif keycode == WXK_LEFT and self.SelectedElement:
-            self.SelectedElement.Move(-scaling[0], 0)
-        elif keycode == WXK_RIGHT and self.SelectedElement:
-            self.SelectedElement.Move(scaling[0], 0)
-        elif keycode == WXK_UP and self.SelectedElement:
-            self.SelectedElement.Move(0, -scaling[1])
-        elif keycode == WXK_DOWN and self.SelectedElement:
-            self.SelectedElement.Move(0, scaling[1])
+        elif keycode == WXK_LEFT:
+            if event.ControlDown() and event.ShiftDown():
+                self.Scroll(0, ypos)
+            elif event.ControlDown():
+                self.Scroll(max(0, xpos - 1), ypos)
+            elif self.SelectedElement:
+                self.SelectedElement.Move(-scaling[0], 0)
+        elif keycode == WXK_RIGHT:
+            if event.ControlDown() and event.ShiftDown():
+                self.Scroll(xmax, ypos)
+            elif event.ControlDown():
+                self.Scroll(min(xpos + 1, xmax), ypos)
+            elif self.SelectedElement:
+                self.SelectedElement.Move(scaling[0], 0)
+        elif keycode == WXK_UP:
+            if event.ControlDown() and event.ShiftDown():
+                self.Scroll(xpos, 0)
+            elif event.ControlDown():
+                self.Scroll(xpos, max(0, ypos - 1))
+            elif self.SelectedElement:
+                self.SelectedElement.Move(0, -scaling[1])
+        elif keycode == WXK_DOWN:
+            if event.ControlDown() and event.ShiftDown():
+                self.Scroll(xpos, ymax)
+            elif event.ControlDown():
+                self.Scroll(xpos, min(ypos + 1, ymax))
+            elif self.SelectedElement:
+                self.SelectedElement.Move(0, scaling[1])
         self.Refresh()
-        event.Skip()
 
 #-------------------------------------------------------------------------------
 #                          Model adding functions
@@ -879,10 +932,10 @@
                 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)
-            self.Elements.append(block)
+            self.AddBlock(block)
             self.Controler.AddCurrentElementEditingBlock(id)
             self.RefreshBlockModel(block)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
     
@@ -904,10 +957,10 @@
             variable = FBD_Variable(self, values["type"], values["name"], values["value_type"], id)
             variable.SetPosition(bbox.x, bbox.y)
             variable.SetSize(values["width"], values["height"])
-            self.Blocks.append(variable)
-            self.Elements.append(variable)
+            self.AddBlock(variable)
             self.Controler.AddCurrentElementEditingVariable(id, values["type"])
             self.RefreshVariableModel(variable)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -920,10 +973,10 @@
             connection = FBD_Connector(self, values["type"], values["name"], id)
             connection.SetPosition(bbox.x, bbox.y)
             connection.SetSize(values["width"], values["height"])
-            self.Blocks.append(connection)
-            self.Elements.append(connection)
+            self.AddBlock(connection)
             self.Controler.AddCurrentElementEditingConnection(id, values["type"])
             self.RefreshConnectionModel(connection)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -936,9 +989,10 @@
             comment.SetPosition(bbox.x, bbox.y)
             min_width, min_height = comment.GetMinSize()
             comment.SetSize(max(min_width,bbox.width),max(min_height,bbox.height))
-            self.Elements.append(comment)
+            self.AddComment(comment)
             self.Controler.AddCurrentElementEditingComment(id)
             self.RefreshCommentModel(comment)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -959,10 +1013,10 @@
             contact = LD_Contact(self, values["type"], values["name"], id)
             contact.SetPosition(bbox.x, bbox.y)
             contact.SetSize(values["width"], values["height"])
-            self.Blocks.append(contact)
-            self.Elements.append(contact)
+            self.AddBlock(contact)
             self.Controler.AddCurrentElementEditingContact(id)
             self.RefreshContactModel(contact)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -986,10 +1040,10 @@
             coil = LD_Coil(self, values["type"], values["name"], id)
             coil.SetPosition(bbox.x, bbox.y)
             coil.SetSize(values["width"], values["height"])
-            self.Blocks.append(coil)
-            self.Elements.append(coil)
+            self.AddBlock(coil)
             self.Controler.AddCurrentElementEditingCoil(id)
             self.RefreshCoilModel(contact)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1002,10 +1056,10 @@
             powerrail = LD_PowerRail(self, values["type"], id, [True for i in xrange(values["number"])])
             powerrail.SetPosition(bbox.x, bbox.y)
             powerrail.SetSize(values["width"], values["height"])
-            self.Blocks.append(powerrail)
-            self.Elements.append(powerrail)
+            self.AddBlock(powerrail)
             self.Controler.AddCurrentElementEditingPowerRail(id, values["type"])
             self.RefreshPowerRailModel(powerrail)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1019,10 +1073,10 @@
             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.AddBlock(transition)
             self.Controler.AddCurrentElementEditingTransition(id)
             self.RefreshTransitionModel(transition)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1036,10 +1090,10 @@
             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.AddBlock(divergence)
             self.Controler.AddCurrentElementEditingDivergence(id, values["type"])
             self.RefreshDivergenceModel(divergence)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1062,6 +1116,7 @@
             block.SetSize(values["width"], values["height"])
             block.SetType(values["type"], values["extension"])
             self.RefreshBlockModel(block)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1090,6 +1145,7 @@
                 self.Controler.RemoveCurrentElementEditingInstance(id)
                 self.Controler.AddCurrentElementEditingVariable(id, values["type"])
             self.RefreshVariableModel(variable)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1109,6 +1165,7 @@
                 self.Controler.RemoveCurrentElementEditingInstance(id)
                 self.Controler.AddCurrentElementEditingConnection(id, values["type"])
             self.RefreshConnectionModel(connection)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1130,6 +1187,7 @@
             contact.SetType(values["type"])
             contact.SetSize(values["width"], values["height"])
             self.RefreshContactModel(contact)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1154,6 +1212,7 @@
             coil.SetType(values["type"])
             coil.SetSize(values["width"], values["height"])
             self.RefreshContactModel(coil)
+            self.RefreshScrollBars()
             self.Refresh()
         dialog.Destroy()
 
@@ -1170,43 +1229,46 @@
                 self.Controler.RemoveCurrentElementEditingInstance(id)
                 self.Controler.AddCurrentElementEditingPowerRail(id, values["type"])
             self.RefreshPowerRailModel(powerrail)
+            self.RefreshScrollBars()
             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()
+##
+##
+##    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.RefreshScrollBars()
+##            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.RefreshScrollBars()
+##            self.Refresh()
+##        dialog.Destroy()
 
 #-------------------------------------------------------------------------------
 #                          Model update functions
@@ -1335,8 +1397,7 @@
                 if element not in elements:
                     elements.append(element)
         block.Clean()
-        self.Blocks.remove(block)
-        self.Elements.remove(block)
+        self.RemoveBlock(block)
         self.Controler.RemoveCurrentElementEditingInstance(block.GetId())
         for element in elements:
             element.RefreshModel()
@@ -1348,8 +1409,7 @@
         else:
             elements = []
         variable.Clean()
-        self.Blocks.remove(variable)
-        self.Elements.remove(variable)
+        self.RemoveBlock(variable)
         self.Controler.RemoveCurrentElementEditingInstance(variable.GetId())
         for element in elements:
             element.RefreshModel()
@@ -1360,22 +1420,20 @@
         else:
             elements = []
         connection.Clean()
-        self.Blocks.remove(connection)
-        self.Elements.remove(connection)
+        self.RemoveBlock(connection)
         self.Controler.RemoveCurrentElementEditingInstance(connection.GetId())
         for element in elements:
             element.RefreshModel()
 
     def DeleteComment(self, comment):
-        self.Elements.remove(comment)
+        self.RemoveComment(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)
+            self.RemoveWire(wire)
             for connector in connected:
                 connector.RefreshParentBlock()
 
@@ -1383,8 +1441,7 @@
         connectors = contact.GetConnectors()
         elements = connectors["output"].GetConnectedBlocks()
         contact.Clean()
-        self.Blocks.remove(contact)
-        self.Elements.remove(contact)
+        self.RemoveBlock(contact)
         self.Controler.RemoveCurrentElementEditingInstance(contact.GetId())
         for element in elements:
             element.RefreshModel()
@@ -1393,8 +1450,7 @@
         connectors = coil.GetConnectors()
         elements = connectors["output"].GetConnectedBlocks()
         coil.Clean()
-        self.Blocks.remove(coil)
-        self.Elements.remove(coil)
+        self.RemoveBlock(coil)
         self.Controler.RemoveCurrentElementEditingInstance(coil.GetId())
         for element in elements:
             element.RefreshModel()
@@ -1407,8 +1463,7 @@
                     if element not in elements:
                         elements.append(element)
         powerrrail.Clean()
-        self.Blocks.remove(powerrrail)
-        self.Elements.remove(powerrrail)
+        self.RemoveBlock(powerrrail)
         self.Controler.RemoveCurrentElementEditingInstance(powerrrail.GetId())
         for element in elements:
             element.RefreshModel()
@@ -1425,8 +1480,7 @@
                 if element not in elements:
                     elements.append(element)
         step.Clean()
-        self.Blocks.remove(step)
-        self.Elements.remove(step)
+        self.RemoveBlock(step)
         self.Controler.RemoveCurrentElementEditingInstance(step.GetId())
         for element in elements:
             element.RefreshModel()
@@ -1439,8 +1493,7 @@
                 if element not in elements:
                     elements.append(element)
         transition.Clean()
-        self.Blocks.remove(transition)
-        self.Elements.remove(transition)
+        self.RemoveBlock(transition)
         self.Controler.RemoveCurrentElementEditingInstance(transition.GetId())
         for element in elements:
             element.RefreshModel()
@@ -1453,22 +1506,19 @@
                 if element not in elements:
                     elements.append(element)
         divergence.Clean()
-        self.Blocks.remove(divergence)
-        self.Elements.remove(divergence)
+        self.RemoveBlock(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.RemoveBlock(jump)
         self.Controler.RemoveCurrentElementEditingInstance(jump.GetId())
     
     def DeleteActionBlock(self, actionblock):
         actionblock.Clean()
-        self.Blocks.remove(actionblock)
-        self.Elements.remove(actionblock)
+        self.RemoveBlock(actionblock)
         self.Controler.RemoveCurrentElementEditingInstance(actionblock.GetId())
 
 
@@ -1490,7 +1540,7 @@
 #-------------------------------------------------------------------------------
 
     def OnMoveWindow(self, event):
-        self.RefreshScrollBar()
+        self.RefreshScrollBars()
         event.Skip()
 
     def OnPaint(self, event):
@@ -1503,12 +1553,15 @@
                 dc.DrawLine(i * self.Scaling[0], 0, i * self.Scaling[0], height)
             for i in xrange(1, height / self.Scaling[1] + 1):
                 dc.DrawLine(0, i * self.Scaling[1], width, i * self.Scaling[1])
+        for comment in self.Comments:
+            if comment != self.SelectedElement:
+                comment.Draw(dc)
         for wire in self.Wires:
             if wire != self.SelectedElement:
                 wire.Draw(dc)
-        for element in self.Elements:
-            if element not in self.Wires and element != self.SelectedElement:
-                element.Draw(dc)
+        for block in self.Blocks:
+            if block != self.SelectedElement:
+                block.Draw(dc)
         if self.SelectedElement:
             self.SelectedElement.Draw(dc)
         if self.rubberBand.IsShown():