Viewer.py
changeset 90 2245e8776086
parent 80 c798a68c5560
child 91 e8e9ddeed76c
--- a/Viewer.py	Mon Sep 10 16:12:29 2007 +0200
+++ b/Viewer.py	Mon Sep 10 18:16:07 2007 +0200
@@ -49,38 +49,38 @@
     
     def __init__(self, parent):
         wx.TextDropTarget.__init__(self)
-        self.Parent = parent
+        self.ParentWindow = parent
     
     def OnDropText(self, x, y, data):
         values = eval(data)
         if values[1] in ["function", "functionBlock", "program"]:
-            id = self.Parent.GetNewId()
-            block = FBD_Block(self.Parent, values[0], values[2], id)
+            id = self.ParentWindow.GetNewId()
+            block = FBD_Block(self.ParentWindow, values[0], values[2], id)
             block.SetPosition(x, y)
             width, height = block.GetMinSize()
             block.SetSize(width, height)
-            self.Parent.AddBlock(block)
-            self.Parent.Controler.AddCurrentElementEditingBlock(id)
-            self.Parent.RefreshBlockModel(block)
-            self.Parent.RefreshScrollBars()
-            self.Parent.Refresh()
+            self.ParentWindow.AddBlock(block)
+            self.ParentWindow.Controler.AddCurrentElementEditingBlock(id)
+            self.ParentWindow.RefreshBlockModel(block)
+            self.ParentWindow.RefreshScrollBars()
+            self.ParentWindow.Update()
         elif values[1] != "location":
-            id = self.Parent.GetNewId()
+            id = self.ParentWindow.GetNewId()
             if values[1] == "Output":
                 var_type = OUTPUT
             elif values[1] == "InOut":
                 var_type = INPUT
             else:
                 var_type = INPUT
-            variable = FBD_Variable(self.Parent, var_type, values[0], values[2], id)
+            variable = FBD_Variable(self.ParentWindow, var_type, values[0], values[2], id)
             variable.SetPosition(x, y)
             width, height = variable.GetMinSize()
             variable.SetSize(width, height)
-            self.Parent.AddBlock(variable)
-            self.Parent.Controler.AddCurrentElementEditingVariable(id, var_type)
-            self.Parent.RefreshVariableModel(variable)
-            self.Parent.RefreshScrollBars()
-            self.Parent.Refresh()
+            self.ParentWindow.AddBlock(variable)
+            self.ParentWindow.Controler.AddCurrentElementEditingVariable(id, var_type)
+            self.ParentWindow.RefreshVariableModel(variable)
+            self.ParentWindow.RefreshScrollBars()
+            self.ParentWindow.Update()
             
 
 """
@@ -161,7 +161,7 @@
         self.Mode = MODE_SELECTION
         self.SavedMode = False
         
-        self.Parent = window
+        self.ParentWindow = window
         self.Controler = controler
         
         self.SetDropTarget(ViewerDropTarget(self))
@@ -174,8 +174,9 @@
         self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
         self.Bind(wx.EVT_CHAR, self.OnChar)
-        self.Bind(wx.EVT_SCROLLWIN, self.OnMoveWindow)
-        self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
+        if wx.VERSION < (2, 7, 0):
+            self.Bind(wx.EVT_SCROLLWIN, self.OnMoveWindow)
+            self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
     
     # Returns a new id
     def GetNewId(self):
@@ -186,8 +187,12 @@
     def __del__(self):
         self.ResetView()
 
-    def GetLogicalDC(self):
-        dc = wx.ClientDC(self)
+    def GetLogicalDC(self, buffered=False):
+        if buffered:
+            dc = wx.BufferedPaintDC(self)
+        else:
+            dc = wx.ClientDC(self)
+        dc.SetFont(wx.NORMAL_FONT)
         self.DoPrepareDC(dc)
         return dc
 
@@ -265,17 +270,17 @@
         if self.Mode != MODE_SELECTION and self.SelectedElement:
             self.SelectedElement.SetSelected(False)
             self.SelectedElement = None
-            self.Refresh()
+            self.Refresh(False)
     
     # Return current drawing mode
     def GetDrawingMode(self):
-        return self.Parent.GetDrawingMode()
+        return self.ParentWindow.GetDrawingMode()
     
     # Buffer the last model state
     def RefreshBuffer(self):
         self.Controler.BufferProject()
-        self.Parent.RefreshTitle()
-        self.Parent.RefreshEditMenu()
+        self.ParentWindow.RefreshTitle()
+        self.ParentWindow.RefreshEditMenu()
 
 #-------------------------------------------------------------------------------
 #                          Refresh functions
@@ -298,7 +303,7 @@
             if instance:
                 self.loadInstance(instance, ids)
         self.RefreshScrollBars()
-        self.Refresh()
+        self.Refresh(False)
     
     def RefreshScrollBars(self):
         xstart, ystart = self.GetViewStart()
@@ -518,10 +523,25 @@
             connector.SetPosition(wx.Point(*instance["connector"]["position"]))
             self.CreateWires(connector, instance["connector"]["links"], ids)
         else:
+            connectors = {"inputs" : [], "outputs" : []}
+            for input in instance["connectors"]["inputs"]:
+                if input["negated"]:
+                    connectors["inputs"].append((input["name"], None, "negated"))
+                elif input["edge"]:
+                    connectors["inputs"].append((input["name"], None, input["edge"]))
+                else:
+                    connectors["inputs"].append((input["name"], None, "none"))
+            for output in instance["connectors"]["outputs"]:
+                if output["negated"]:
+                    connectors["outputs"].append((output["name"], None, "negated"))
+                elif output["edge"]:
+                    connectors["outputs"].append((output["name"], None, output["edge"]))
+                else:
+                    connectors["outputs"].append((output["name"], None, "none"))
             if instance["name"] != None:
-                block = FBD_Block(self, instance["type"], instance["name"], instance["id"], len(instance["connectors"]["inputs"]))
-            else:
-                block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]))
+                block = FBD_Block(self, instance["type"], instance["name"], instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors)
+            else:
+                block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors)
             block.SetPosition(instance["x"], instance["y"])
             block.SetSize(instance["width"], instance["height"])
             self.AddBlock(block)
@@ -685,17 +705,6 @@
         self.ContextualMenu.FindItemByPosition(9).Enable(False)
         self.PopupMenu(self.ContextualMenu)
 
-    def EditCommentContent(self, comment):
-        dialog = wx.TextEntryDialog(self.Parent, "Edit comment", "Please enter comment text", comment.GetContent(), wx.OK|wx.CANCEL|wx.TE_MULTILINE)
-        if dialog.ShowModal() == wx.ID_OK:
-            value = dialog.GetValue()
-            comment.SetContent(value)
-            infos = {"content" : value}
-            infos["width"], infos["height"] = comment.GetSize()
-            self.Controler.SetCurrentElementEditingCommentInfos(comment.GetId(), infos)
-            self.Refresh()
-        dialog.Destroy()
-
 #-------------------------------------------------------------------------------
 #                            Menu items functions
 #-------------------------------------------------------------------------------
@@ -783,11 +792,11 @@
                 if self.SelectedElement and self.SelectedElement != element:
                     self.SelectedElement.SetSelected(False)
                     self.SelectedElement = None
-                    self.Refresh()
+                    self.Refresh(False)
                 if element:
                     self.SelectedElement = element
                     self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
-                    self.Refresh()
+                    self.Refresh(False)
                 else:
                     self.rubberBand.Reset()
                     self.rubberBand.OnLeftDown(event, dc, self.Scaling)
@@ -815,7 +824,7 @@
             elif self.SelectedElement:
                 self.SelectedElement.SetSelected(False)
                 self.SelectedElement = None
-            self.Refresh()
+            self.Refresh(False)
         event.Skip()
 
     def OnViewerLeftUp(self, event):
@@ -826,12 +835,12 @@
                 if len(elements) == 1:
                     self.SelectedElement = elements[0]
                     self.SelectedElement.SetSelected(True)
-                    self.Refresh()
+                    self.Refresh(False)
                 elif len(elements) > 1:
                     self.SelectedElement = Graphic_Group(self)
                     self.SelectedElement.SetElements(elements)
                     self.SelectedElement.SetSelected(True)
-                    self.Refresh()
+                    self.Refresh(False)
             else:
                 bbox = self.rubberBand.GetCurrentExtent()
                 self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)                
@@ -864,8 +873,7 @@
         elif self.Mode == MODE_SELECTION and self.SelectedElement:
             self.SelectedElement.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)
             wx.CallAfter(self.SetCursor, wx.NullCursor)
-            self.ReleaseMouse()
-            self.Refresh()
+            self.Refresh(False)
         elif self.Mode == MODE_WIRE and self.SelectedElement:
             if self.SelectedElement.EndConnected != None:
                 self.SelectedElement.ResetPoints()
@@ -877,9 +885,9 @@
             else:
                 self.SelectedElement.Delete()
                 self.SelectedElement = None
-            self.Refresh()
+            self.Refresh(False)
         if not self.SavedMode:
-            wx.CallAfter(self.Parent.ResetCurrentMode)
+            wx.CallAfter(self.ParentWindow.ResetCurrentMode)
         event.Skip()
     
     def OnViewerRightUp(self, event):
@@ -894,21 +902,21 @@
             self.SelectedElement.OnRightUp(event, self.GetLogicalDC(), self.Scaling)
             wx.CallAfter(self.SetCursor, wx.NullCursor)
             self.ReleaseMouse()
-            self.Refresh()
+            self.Refresh(False)
         event.Skip()
     
     def OnViewerLeftDClick(self, event):
         if self.Mode == MODE_SELECTION and self.SelectedElement:
             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
-            self.Refresh()
+            self.Refresh(False)
         event.Skip()
     
     def OnViewerMotion(self, event):
         if self.rubberBand.IsShown():
             self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling)
         elif self.Mode == MODE_SELECTION and self.SelectedElement:
-            self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
-            self.Refresh()
+            if self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling):
+                self.Refresh(False)
         elif self.Mode == MODE_WIRE and self.SelectedElement:
             dc = self.GetLogicalDC()
             pos = GetScaledEventPosition(event, dc, self.Scaling)
@@ -917,7 +925,7 @@
                 self.SelectedElement.ResetPoints()
                 self.SelectedElement.OnMotion(event, dc, self.Scaling)
                 self.SelectedElement.GeneratePoints()
-                self.Refresh()
+                self.Refresh(False)
         event.Skip()
 
     def UpdateScrollPos(self, event):
@@ -957,7 +965,7 @@
             self.SelectedElement = None
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         elif keycode == wx.WXK_LEFT:
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll(0, ypos)
@@ -968,7 +976,7 @@
                 self.SelectedElement.RefreshModel()
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
-                self.Refresh()
+                self.Refresh(False)
         elif keycode == wx.WXK_RIGHT:
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll(xmax, ypos)
@@ -979,7 +987,7 @@
                 self.SelectedElement.RefreshModel()
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
-                self.Refresh()
+                self.Refresh(False)
         elif keycode == wx.WXK_UP:
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll(xpos, 0)
@@ -990,7 +998,7 @@
                 self.SelectedElement.RefreshModel()
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
-                self.Refresh()
+                self.Refresh(False)
         elif keycode == wx.WXK_DOWN:
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll(xpos, ymax)
@@ -1001,14 +1009,14 @@
                 self.SelectedElement.RefreshModel()
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
-                self.Refresh()
+                self.Refresh(False)
 
 #-------------------------------------------------------------------------------
 #                          Model adding functions
 #-------------------------------------------------------------------------------
 
     def AddNewBlock(self, bbox):
-        dialog = BlockPropertiesDialog(self.Parent)
+        dialog = BlockPropertiesDialog(self.ParentWindow)
         dialog.SetBlockList(self.Controler.GetBlockTypes())
         dialog.SetPouNames(self.Controler.GetProjectPouNames())
         dialog.SetPouElementNames(self.Controler.GetCurrentElementEditingVariables())
@@ -1027,12 +1035,12 @@
             self.RefreshBlockModel(block)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Parent.RefreshEditor()
-            self.Refresh()
+            self.ParentWindow.RefreshEditor()
+            self.Refresh(False)
         dialog.Destroy()
     
     def AddNewVariable(self, bbox):
-        dialog = VariablePropertiesDialog(self.Parent)
+        dialog = VariablePropertiesDialog(self.ParentWindow)
         dialog.SetMinVariableSize((bbox.width, bbox.height))
         varlist = []
         vars = self.Controler.GetCurrentElementEditingInterfaceVars()
@@ -1055,11 +1063,11 @@
             self.RefreshVariableModel(variable)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def AddNewConnection(self, bbox):
-        dialog = ConnectionPropertiesDialog(self.Parent)
+        dialog = ConnectionPropertiesDialog(self.ParentWindow)
         dialog.SetMinConnectionSize((bbox.width, bbox.height))
         if dialog.ShowModal() == wx.ID_OK:
             id = self.GetNewId()
@@ -1072,11 +1080,11 @@
             self.RefreshConnectionModel(connection)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def AddNewComment(self, bbox):
-        dialog = wx.TextEntryDialog(self.Parent, "Add a new comment", "Please enter comment text", "", wx.OK|wx.CANCEL|wx.TE_MULTILINE)
+        dialog = wx.TextEntryDialog(self.ParentWindow, "Add a new comment", "Please enter comment text", "", wx.OK|wx.CANCEL|wx.TE_MULTILINE)
         if dialog.ShowModal() == wx.ID_OK:
             value = dialog.GetValue()
             id = self.GetNewId()
@@ -1089,11 +1097,11 @@
             self.RefreshCommentModel(comment)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def AddNewContact(self, bbox):
-        dialog = LDElementDialog(self.Parent, "contact")
+        dialog = LDElementDialog(self.ParentWindow, "contact")
         varlist = []
         vars = self.Controler.GetCurrentElementEditingInterfaceVars()
         if vars:
@@ -1114,11 +1122,11 @@
             self.RefreshContactModel(contact)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def AddNewCoil(self, bbox):
-        dialog = LDElementDialog(self.Parent, "coil")
+        dialog = LDElementDialog(self.ParentWindow, "coil")
         varlist = []
         vars = self.Controler.GetCurrentElementEditingInterfaceVars()
         if vars:
@@ -1142,11 +1150,11 @@
             self.RefreshCoilModel(coil)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def AddNewPowerRail(self, bbox):
-        dialog = LDPowerRailDialog(self.Parent)
+        dialog = LDPowerRailDialog(self.ParentWindow)
         dialog.SetMinSize((bbox.width, bbox.height))
         if dialog.ShowModal() == wx.ID_OK:
             id = self.GetNewId()
@@ -1159,11 +1167,11 @@
             self.RefreshPowerRailModel(powerrail)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def AddNewStep(self, bbox, initial = False):
-        dialog = StepContentDialog(self.Parent, initial)
+        dialog = StepContentDialog(self.ParentWindow, initial)
         dialog.SetPouNames(self.Controler.GetProjectPouNames())
         dialog.SetVariables(self.Controler.GetCurrentElementEditingInterfaceVars())
         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
@@ -1192,11 +1200,11 @@
             self.RefreshStepModel(step)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def AddNewTransition(self, bbox):
-        dialog = TransitionContentDialog(self.Parent, self.GetDrawingMode() == FREEDRAWING_MODE)
+        dialog = TransitionContentDialog(self.ParentWindow, self.GetDrawingMode() == FREEDRAWING_MODE)
         dialog.SetTransitions(self.Controler.GetCurrentElementEditingTransitions())
         if dialog.ShowModal() == wx.ID_OK:
             id = self.GetNewId()
@@ -1210,11 +1218,11 @@
             self.RefreshTransitionModel(transition)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def AddNewDivergence(self, bbox):
-        dialog = DivergenceCreateDialog(self.Parent)
+        dialog = DivergenceCreateDialog(self.ParentWindow)
         dialog.SetMinSize((bbox.width, bbox.height))
         if dialog.ShowModal() == wx.ID_OK:
             id = self.GetNewId()
@@ -1228,7 +1236,7 @@
             self.RefreshDivergenceModel(divergence)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
 
@@ -1237,7 +1245,7 @@
 #-------------------------------------------------------------------------------
 
     def EditBlockContent(self, block):
-        dialog = BlockPropertiesDialog(self.Parent)
+        dialog = BlockPropertiesDialog(self.ParentWindow)
         dialog.SetBlockList(self.Controler.GetBlockTypes())
         dialog.SetPouNames(self.Controler.GetProjectPouNames())
         dialog.SetPouElementNames(self.Controler.GetCurrentElementEditingVariables())
@@ -1254,11 +1262,11 @@
             self.RefreshBlockModel(block)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def EditVariableContent(self, variable):
-        dialog = VariablePropertiesDialog(self.Parent)
+        dialog = VariablePropertiesDialog(self.ParentWindow)
         dialog.SetMinVariableSize(variable.GetSize())
         varlist = []
         vars = self.Controler.GetCurrentElementEditingInterfaceVars()
@@ -1285,11 +1293,11 @@
             self.RefreshVariableModel(variable)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def EditConnectionContent(self, connection):
-        dialog = ConnectionPropertiesDialog(self.Parent)
+        dialog = ConnectionPropertiesDialog(self.ParentWindow)
         dialog.SetMinConnectionSize(connection.GetSize())
         values = {"name" : connection.GetName(), "type" : connection.GetType()}
         dialog.SetValues(values)
@@ -1306,11 +1314,11 @@
             self.RefreshConnectionModel(connection)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def EditContactContent(self, contact):
-        dialog = LDElementDialog(self.Parent, "contact")
+        dialog = LDElementDialog(self.ParentWindow, "contact")
         varlist = []
         vars = self.Controler.GetCurrentElementEditingInterfaceVars()
         if vars:
@@ -1329,11 +1337,11 @@
             self.RefreshContactModel(contact)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def EditCoilContent(self, coil):
-        dialog = LDElementDialog(self.Parent, "coil")
+        dialog = LDElementDialog(self.ParentWindow, "coil")
         varlist = []
         vars = self.Controler.GetCurrentElementEditingInterfaceVars()
         if vars:
@@ -1355,11 +1363,11 @@
             self.RefreshCoilModel(coil)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def EditPowerRailContent(self, powerrail):
-        dialog = LDPowerRailDialog(self.Parent, powerrail.GetType(), len(powerrail.GetConnectors()))
+        dialog = LDPowerRailDialog(self.ParentWindow, powerrail.GetType(), len(powerrail.GetConnectors()))
         dialog.SetMinSize(powerrail.GetSize())
         if dialog.ShowModal() == wx.ID_OK:
             old_type = powerrail.GetType()
@@ -1373,11 +1381,11 @@
             self.RefreshPowerRailModel(powerrail)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def EditStepContent(self, step):
-        dialog = StepContentDialog(self.Parent, step.GetInitial())
+        dialog = StepContentDialog(self.ParentWindow, step.GetInitial())
         dialog.SetPouNames(self.Controler.GetProjectPouNames())
         dialog.SetVariables(self.Controler.GetCurrentElementEditingInterfaceVars())
         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
@@ -1407,10 +1415,10 @@
             step.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         
     def EditTransitionContent(self, transition):
-        dialog = TransitionContentDialog(self.Parent, self.GetDrawingMode() == FREEDRAWING_MODE)
+        dialog = TransitionContentDialog(self.ParentWindow, self.GetDrawingMode() == FREEDRAWING_MODE)
         dialog.SetTransitions(self.Controler.GetCurrentElementEditingTransitions())
         dialog.SetValues({"type":transition.GetType(),"value":transition.GetCondition(), "priority":transition.GetPriority()})
         dialog.SetElementSize(transition.GetSize())
@@ -1421,7 +1429,7 @@
             transition.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def EditJumpContent(self, jump):
@@ -1429,7 +1437,7 @@
         for block in self.Blocks:
             if isinstance(block, SFC_Step):
                 choices.append(block.GetName())
-        dialog = wx.SingleChoiceDialog(self.Parent, "Edit jump target", "Please choose a target", choices, wx.OK|wx.CANCEL)
+        dialog = wx.SingleChoiceDialog(self.ParentWindow, "Edit jump target", "Please choose a target", choices, wx.OK|wx.CANCEL)
         dialog.SetSelection(choices.index(jump.GetTarget()))
         if dialog.ShowModal() == wx.ID_OK:
             value = dialog.GetStringSelection()
@@ -1437,11 +1445,11 @@
             jump.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
         dialog.Destroy()
 
     def EditActionBlockContent(self, actionblock):
-        dialog = ActionBlockDialog(self.Parent)
+        dialog = ActionBlockDialog(self.ParentWindow)
         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
         dialog.SetActionList(self.Controler.GetCurrentElementEditingActions())
         dialog.SetVariableList(self.Controler.GetCurrentElementEditingInterfaceVars())
@@ -1452,7 +1460,18 @@
             actionblock.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.Refresh(False)
+        dialog.Destroy()
+
+    def EditCommentContent(self, comment):
+        dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", comment.GetContent(), wx.OK|wx.CANCEL|wx.TE_MULTILINE)
+        if dialog.ShowModal() == wx.ID_OK:
+            value = dialog.GetValue()
+            comment.SetContent(value)
+            comment.RefreshModel()
+            self.RefreshBuffer()
+            self.RefreshScrollBars()
+            self.Refresh(False)
         dialog.Destroy()
 
 #-------------------------------------------------------------------------------
@@ -1587,7 +1606,7 @@
         self.Controler.RemoveCurrentElementEditingInstance(block.GetId())
         for element in elements:
             element.RefreshModel()
-        wx.CallAfter(self.Parent.RefreshEditor)
+        wx.CallAfter(self.ParentWindow.RefreshEditor)
 
     def DeleteVariable(self, variable):
         connectors = variable.GetConnectors()
@@ -1732,9 +1751,10 @@
         event.Skip()
 
     def OnPaint(self, event):
-        dc = self.GetLogicalDC()
+        dc = self.GetLogicalDC(True)
         dc.Clear()
         dc.SetPen(wx.Pen(wx.Colour(230, 230, 230)))
+        dc.BeginDrawing()
         if self.Scaling and self.DrawGrid:
             width, height = dc.GetSize()
             for i in xrange(1, width / self.Scaling[0] + 1):
@@ -1753,7 +1773,8 @@
         if self.SelectedElement:
             self.SelectedElement.Draw(dc)
         if self.rubberBand.IsShown():
-            self.rubberBand.Draw()
+            self.rubberBand.Draw(dc)
+        dc.EndDrawing()
         event.Skip()