Viewer.py
changeset 145 4fb225afddf4
parent 144 b67a5de5a24a
child 154 203c4acdaf27
--- a/Viewer.py	Fri Jan 04 17:49:17 2008 +0100
+++ b/Viewer.py	Fri Jan 11 17:51:56 2008 +0100
@@ -68,6 +68,7 @@
     
     def OnDropText(self, x, y, data):
         x, y = self.ParentWindow.CalcUnscrolledPosition(x, y)
+        scaling = self.ParentWindow.Scaling
         values = eval(data)
         if values[1] == "program":
             message = wx.MessageDialog(self.ParentWindow, "Programs can't be used by other POUs!", "Error", wx.OK|wx.ICON_ERROR)
@@ -96,15 +97,20 @@
                     dialog.Destroy()
                 id = self.ParentWindow.GetNewId()
                 block = FBD_Block(self.ParentWindow, values[0], blockname, id)
+                width, height = block.GetMinSize()
+                if scaling is not None:
+                    x = round(float(x) / float(scaling[0])) * scaling[0]
+                    y = round(float(y) / float(scaling[1])) * scaling[1]
+                    width = round(float(width) / float(scaling[0]) + 0.5) * scaling[0]
+                    height = round(float(height) / float(scaling[1]) + 0.5) * scaling[1]
                 block.SetPosition(x, y)
-                width, height = block.GetMinSize()
                 block.SetSize(width, height)
                 self.ParentWindow.AddBlock(block)
                 self.ParentWindow.Controler.AddEditedElementBlock(self.ParentWindow.GetTagName(), id, values[0], blockname)
                 self.ParentWindow.RefreshBlockModel(block)
                 self.ParentWindow.RefreshBuffer()
                 self.ParentWindow.RefreshScrollBars()
-                self.ParentWindow.ParentWindow.RefreshVariablePanel(self.TagName)
+                self.ParentWindow.ParentWindow.RefreshVariablePanel(self.ParentWindow.GetTagName())
                 self.ParentWindow.Refresh()
         elif values[1] != "location":
             if values[3] == self.ParentWindow.GetTagName():
@@ -116,11 +122,16 @@
                 else:
                     var_type = INPUT
                 variable = FBD_Variable(self.ParentWindow, var_type, values[0], values[2], id)
+                width, height = variable.GetMinSize()
+                if scaling is not None:
+                    x = round(float(x) / float(scaling[0])) * scaling[0]
+                    y = round(float(y) / float(scaling[1])) * scaling[1]
+                    width = round(float(width) / float(scaling[0]) + 0.5) * scaling[0]
+                    height = round(float(height) / float(scaling[1]) + 0.5) * scaling[1]
                 variable.SetPosition(x, y)
-                width, height = variable.GetMinSize()
                 variable.SetSize(width, height)
                 self.ParentWindow.AddBlock(variable)
-                self.ParentWindow.Controler.AddEditedElementVariable(self.ParentWindow.TagName, id, var_type)
+                self.ParentWindow.Controler.AddEditedElementVariable(self.ParentWindow.GetTagName(), id, var_type)
                 self.ParentWindow.RefreshVariableModel(variable)
                 self.ParentWindow.RefreshBuffer()
                 self.ParentWindow.RefreshScrollBars()
@@ -269,8 +280,8 @@
         self.SetBackgroundColour(wx.Colour(255,255,255))
         self.ResetView()
         self.Scaling = None
-        #self.Scaling = (8, 8)
         self.DrawGrid = True
+        self.GridBrush = wx.TRANSPARENT_BRUSH
         self.DrawingWire = False
         self.current_id = 0
         self.TagName = tagname
@@ -293,6 +304,7 @@
         self.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown)
         self.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
         self.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
+        self.Bind(wx.EVT_RIGHT_DOWN, self.OnViewerRightDown)
         self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
@@ -304,6 +316,9 @@
         rect.x, rect.y = self.CalcScrolledPosition(rect.x, rect.y)
         return rect
     
+    def GetScaling(self):
+        return self.Scaling
+    
     def SetTagName(self, tagname):
         self.TagName = tagname
         
@@ -423,6 +438,29 @@
         self.ParentWindow.RefreshTitle()
         self.ParentWindow.RefreshEditMenu()
 
+    # Refresh the current scaling
+    def RefreshScaling(self, refresh=True):
+        properties = self.Controler.GetProjectProperties()
+        scaling = properties["scaling"][self.CurrentLanguage]
+        if scaling != (0, 0):
+            self.Scaling = scaling
+            if self.DrawGrid:
+                bitmap = wx.EmptyBitmap(*scaling)
+                dc = wx.MemoryDC(bitmap)
+                dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
+                dc.Clear()
+                dc.SetPen(wx.Pen(wx.Colour(180, 180, 180)))
+                dc.DrawPoint(0, 0)
+                self.GridBrush = wx.BrushFromBitmap(bitmap)
+            else:
+                self.GridBrush = wx.TRANSPARENT_BRUSH
+        else:
+            self.Scaling = None
+            self.GridBrush = wx.TRANSPARENT_BRUSH
+        if refresh:
+            self.Refresh()
+        
+        
 #-------------------------------------------------------------------------------
 #                          Refresh functions
 #-------------------------------------------------------------------------------
@@ -571,6 +609,7 @@
                 contact_type = CONTACT_NORMAL
             contact = LD_Contact(self, contact_type, instance["name"], instance["id"])
             contact.SetPosition(instance["x"], instance["y"])
+            contact.SetSize(instance["width"], instance["height"])
             self.AddBlock(contact)
             connectors = contact.GetConnectors()
             connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
@@ -595,6 +634,7 @@
                 coil_type = COIL_NORMAL
             coil = LD_Coil(self, coil_type, instance["name"], instance["id"])
             coil.SetPosition(instance["x"], instance["y"])
+            coil.SetSize(instance["width"], instance["height"])
             self.AddBlock(coil)
             connectors = coil.GetConnectors()
             connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
@@ -624,6 +664,7 @@
         elif instance["type"] == "transition":
             transition = SFC_Transition(self, instance["condition_type"], instance["condition"], instance["priority"], instance["id"])
             transition.SetPosition(instance["x"], instance["y"])
+            transition.SetSize(instance["width"], instance["height"])
             self.AddBlock(transition)
             connectors = transition.GetConnectors()
             connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
@@ -658,6 +699,7 @@
         elif instance["type"] == "jump":
             jump = SFC_Jump(self, instance["target"], instance["id"])
             jump.SetPosition(instance["x"], instance["y"])
+            jump.SetSize(instance["width"], instance["height"])
             self.AddBlock(jump)
             connector = jump.GetConnector()
             connector.SetPosition(wx.Point(*instance["connector"]["position"]))
@@ -877,36 +919,42 @@
         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
             self.SelectedElement.AlignElements(ALIGN_LEFT, None)
             self.RefreshBuffer()
+            self.Refresh()
         event.Skip()
     
     def OnAlignCenterMenu(self, event):
         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
             self.SelectedElement.AlignElements(ALIGN_CENTER, None)
             self.RefreshBuffer()
+            self.Refresh()
         event.Skip()
     
     def OnAlignRightMenu(self, event):
         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
             self.SelectedElement.AlignElements(ALIGN_RIGHT, None)
             self.RefreshBuffer()
+            self.Refresh()
         event.Skip()
     
     def OnAlignTopMenu(self, event):
         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
             self.SelectedElement.AlignElements(None, ALIGN_TOP)
             self.RefreshBuffer()
+            self.Refresh()
         event.Skip()
     
     def OnAlignMiddleMenu(self, event):
         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
             self.SelectedElement.AlignElements(None, ALIGN_MIDDLE)
             self.RefreshBuffer()
+            self.Refresh()
         event.Skip()
     
     def OnAlignBottomMenu(self, event):
         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
             self.SelectedElement.AlignElements(None, ALIGN_BOTTOM)
             self.RefreshBuffer()
+            self.Refresh()
         event.Skip()
         
     def OnNoModifierMenu(self, event):
@@ -1004,7 +1052,10 @@
                     self.SelectedElement.SetSelected(True)
             else:
                 element = self.FindElement(pos)
-                connector = self.FindBlockConnector(pos)
+                if element is None or element.TestHandle(pos) == (0, 0):
+                    connector = self.FindBlockConnector(pos)
+                else:
+                    connector = None
                 if self.DrawingWire:
                     self.DrawingWire = False
                     if connector:
@@ -1020,6 +1071,7 @@
                     else:
                         rect = self.SelectedElement.GetRedrawRect()
                         self.SelectedElement.Delete()
+                        self.SelectedElement = None
                         element = None
                         self.RefreshRect(self.GetScrolledRect(rect))
                 elif connector:
@@ -1031,7 +1083,7 @@
                         wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(pos.x, pos.y), EAST])
                     wire.oldPos = pos
                     wire.Handle = (HANDLE_POINT, 0)
-                    wire.ProcessDragging(0, 0)
+                    wire.ProcessDragging(0, 0, self.Scaling)
                     wire.Handle = (HANDLE_POINT, 1)
                     self.AddWire(wire)
                     if self.SelectedElement:
@@ -1104,10 +1156,17 @@
                 connector = self.FindBlockConnector(pos)
                 if self.SelectedElement.EndConnected is not None:
                     self.DrawingWire = False
+                    self.SelectedElement.StartConnected.HighlightParentBlock(False)
+                    self.SelectedElement.EndConnected.HighlightParentBlock(False)
                     self.SelectedElement.ResetPoints()
                     self.SelectedElement.OnMotion(event, dc, self.Scaling)
                     self.SelectedElement.GeneratePoints()
                     self.SelectedElement.RefreshModel()
+                    if self.HighlightedElement is not None:
+                        self.HighlightedElement.SetHighlighted(False)
+                        self.HighlightedElement = None
+                    self.SelectedElement.SetHighlighted(True)
+                    self.HighlightedElement = self.SelectedElement
                     self.SelectedElement.SetSelected(True)
                     self.RefreshBuffer()
                 elif connector is None or self.SelectedElement.GetDragging():
@@ -1124,17 +1183,26 @@
             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
         event.Skip()
     
+    def OnViewerRightDown(self, event):
+        if self.Mode == MODE_SELECTION:
+            dc = self.GetLogicalDC()
+            pos = event.GetLogicalPosition(dc)
+            element = self.FindElement(pos)
+            if self.SelectedElement and self.SelectedElement != element:
+                self.SelectedElement.SetSelected(False)
+                self.SelectedElement = None
+            if element:
+                self.SelectedElement = element
+                self.SelectedElement.OnRightDown(event, dc, self.Scaling)
+                self.SelectedElement.Refresh()
+        event.Skip()
+    
     def OnViewerRightUp(self, event):
         dc = self.GetLogicalDC()
-        pos = event.GetLogicalPosition(dc)
-        element = self.FindElement(pos)
-        if element:
-            if self.SelectedElement and self.SelectedElement != element:
-                self.SelectedElement.SetSelected(False)
-            self.SelectedElement = element
-            self.SelectedElement.SetSelected(True)
-            self.SelectedElement.OnRightUp(event, self.GetLogicalDC(), self.Scaling)
+        if self.SelectedElement:
+            self.SelectedElement.OnRightUp(event, dc, self.Scaling)
             wx.CallAfter(self.SetCursor, wx.NullCursor)
+            self.SelectedElement.Refresh()
         else:
             self.PopupDefaultMenu(False)
         event.Skip()
@@ -1154,7 +1222,6 @@
         if not event.Dragging():
             highlighted = self.FindElement(pos) 
             if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
-                rect = self.HighlightedElement.GetRedrawRect()
                 self.HighlightedElement.SetHighlighted(False)
                 self.HighlightedElement = None
             if highlighted is not None and self.HighlightedElement != highlighted:
@@ -1284,6 +1351,12 @@
 #                          Model adding functions
 #-------------------------------------------------------------------------------
 
+    def GetScaledSize(self, width, height):
+        if self.Scaling is not None:
+            width = round(float(width) / float(self.Scaling[0]) + 0.4) * self.Scaling[0]
+            height = round(float(height) / float(self.Scaling[1]) + 0.4) * self.Scaling[1]
+        return width, height
+
     def AddNewBlock(self, bbox):
         dialog = BlockPropertiesDialog(self.ParentWindow)
         dialog.SetBlockList(self.Controler.GetBlockTypes(self.TagName))
@@ -1298,7 +1371,7 @@
             else:
                 block = FBD_Block(self, values["type"], "", id, values["extension"], values["inputs"])
             block.SetPosition(bbox.x, bbox.y)
-            block.SetSize(values["width"], values["height"])
+            block.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             self.AddBlock(block)
             self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
             self.RefreshBlockModel(block)
@@ -1326,7 +1399,7 @@
             values = dialog.GetValues()
             variable = FBD_Variable(self, values["type"], values["name"], values["value_type"], id)
             variable.SetPosition(bbox.x, bbox.y)
-            variable.SetSize(values["width"], values["height"])
+            variable.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             self.AddBlock(variable)
             self.Controler.AddEditedElementVariable(self.TagName, id, values["type"])
             self.RefreshVariableModel(variable)
@@ -1343,7 +1416,7 @@
             values = dialog.GetValues()
             connection = FBD_Connector(self, values["type"], values["name"], id)
             connection.SetPosition(bbox.x, bbox.y)
-            connection.SetSize(values["width"], values["height"])
+            connection.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             self.AddBlock(connection)
             self.Controler.AddEditedElementConnection(self.TagName, id, values["type"])
             self.RefreshConnectionModel(connection)
@@ -1363,7 +1436,7 @@
             comment = Comment(self, value, id)
             comment.SetPosition(bbox.x, bbox.y)
             min_width, min_height = comment.GetMinSize()
-            comment.SetSize(max(min_width,bbox.width),max(min_height,bbox.height))
+            comment.SetSize(*self.GetScaledSize(max(min_width,bbox.width),max(min_height,bbox.height)))
             self.AddComment(comment)
             self.Controler.AddEditedElementComment(self.TagName, id)
             self.RefreshCommentModel(comment)
@@ -1388,7 +1461,7 @@
             values = dialog.GetValues()
             contact = LD_Contact(self, values["type"], values["name"], id)
             contact.SetPosition(bbox.x, bbox.y)
-            contact.SetSize(values["width"], values["height"])
+            contact.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             self.AddBlock(contact)
             self.Controler.AddEditedElementContact(self.TagName, id)
             self.RefreshContactModel(contact)
@@ -1416,7 +1489,7 @@
             values = dialog.GetValues()
             coil = LD_Coil(self, values["type"], values["name"], id)
             coil.SetPosition(bbox.x, bbox.y)
-            coil.SetSize(values["width"], values["height"])
+            coil.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             self.AddBlock(coil)
             self.Controler.AddEditedElementCoil(self.TagName, id)
             self.RefreshCoilModel(coil)
@@ -1433,7 +1506,7 @@
             values = dialog.GetValues()
             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"])
+            powerrail.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             self.AddBlock(powerrail)
             self.Controler.AddEditedElementPowerRail(self.TagName, id, values["type"])
             self.RefreshPowerRailModel(powerrail)
@@ -1466,7 +1539,7 @@
                 step.RemoveAction()
             step.SetPosition(bbox.x, bbox.y)
             min_width, min_height = step.GetMinSize()
-            step.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+            step.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
             self.AddBlock(step)
             self.Controler.AddEditedElementStep(self.TagName, id)
             self.RefreshStepModel(step)
@@ -1484,7 +1557,7 @@
             transition = SFC_Transition(self, values["type"], values["value"], values["priority"], 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))
+            transition.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
             self.AddBlock(transition)
             self.Controler.AddEditedElementTransition(self.TagName, id)
             self.RefreshTransitionModel(transition)
@@ -1502,7 +1575,7 @@
             divergence = SFC_Divergence(self, values["type"], values["number"], id)
             divergence.SetPosition(bbox.x, bbox.y)
             min_width, min_height = divergence.GetMinSize(True)
-            divergence.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+            divergence.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
             self.AddBlock(divergence)
             self.Controler.AddEditedElementDivergence(self.TagName, id, values["type"])
             self.RefreshDivergenceModel(divergence)
@@ -1523,7 +1596,7 @@
             jump = SFC_Jump(self, value, id)
             jump.SetPosition(bbox.x, bbox.y)
             min_width, min_height = jump.GetMinSize()
-            jump.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+            jump.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
             self.AddBlock(jump)
             self.Controler.AddEditedElementJump(self.TagName, id)
             self.RefreshJumpModel(jump)
@@ -1543,7 +1616,7 @@
             actionblock = SFC_ActionBlock(self, actions, id)
             actionblock.SetPosition(bbox.x, bbox.y)
             min_width, min_height = actionblock.GetMinSize()
-            actionblock.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+            actionblock.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
             self.AddBlock(actionblock)
             self.Controler.AddEditedElementActionBlock(self.TagName, id)
             self.RefreshActionBlockModel(actionblock)
@@ -1572,7 +1645,7 @@
             new_values = dialog.GetValues()
             if "name" in new_values:
                 block.SetName(new_values["name"])
-            block.SetSize(new_values["width"], new_values["height"])
+            block.SetSize(*self.GetScaledSize(new_values["width"], new_values["height"]))
             block.SetType(new_values["type"], new_values["extension"])
             block.SetExecutionOrder(new_values["executionOrder"])
             self.RefreshBlockModel(block)
@@ -1604,7 +1677,7 @@
             new_values = dialog.GetValues()
             variable.SetName(new_values["name"])
             variable.SetType(new_values["type"], new_values["value_type"])
-            variable.SetSize(new_values["width"], new_values["height"])
+            variable.SetSize(*self.GetScaledSize(new_values["width"], new_values["height"]))
             variable.SetExecutionOrder(new_values["executionOrder"])
             if old_values["type"] != new_values["type"]:
                 id = variable.GetId()
@@ -1628,7 +1701,7 @@
             values = dialog.GetValues()
             connection.SetName(values["name"])
             connection.SetType(values["type"])
-            connection.SetSize(values["width"], values["height"])
+            connection.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             if old_type != values["type"]:
                 id = connection.GetId()
                 self.Controler.RemoveEditedElementInstance(self.TagName, id)
@@ -1655,7 +1728,7 @@
             values = dialog.GetValues()
             contact.SetName(values["name"])
             contact.SetType(values["type"])
-            contact.SetSize(values["width"], values["height"])
+            contact.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             self.RefreshContactModel(contact)
             self.RefreshBuffer()
             self.RefreshScrollBars()
@@ -1681,7 +1754,7 @@
             values = dialog.GetValues()
             coil.SetName(values["name"])
             coil.SetType(values["type"])
-            coil.SetSize(values["width"], values["height"])
+            coil.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             self.RefreshCoilModel(coil)
             self.RefreshBuffer()
             self.RefreshScrollBars()
@@ -1695,7 +1768,7 @@
             old_type = powerrail.GetType()
             values = dialog.GetValues()
             powerrail.SetType(values["type"], [True for i in xrange(values["number"])])
-            powerrail.SetSize(values["width"], values["height"])
+            powerrail.SetSize(*self.GetScaledSize(values["width"], values["height"]))
             if old_type != values["type"]:
                 id = powerrail.GetId()
                 self.Controler.RemoveEditedElementInstance(self.TagName, id)
@@ -1733,7 +1806,7 @@
                 step.AddAction()    
             else:
                 step.RemoveAction()
-            step.UpdateSize(values["width"], values["height"])
+            step.UpdateSize(*self.GetScaledSize(values["width"], values["height"]))
             step.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
@@ -1779,6 +1852,7 @@
         if dialog.ShowModal() == wx.ID_OK:
             actions = dialog.GetValues()
             actionblock.SetActions(actions)
+            actionblock.SetSize(*self.GetScaledSize(*actionblock.GetSize()))
             actionblock.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
@@ -1793,6 +1867,7 @@
         if dialog.ShowModal() == wx.ID_OK:
             value = dialog.GetValue()
             comment.SetContent(value)
+            comment.SetSize(*self.GetScaledSize(*comment.GetSize()))
             comment.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
@@ -1808,7 +1883,8 @@
         infos = {}
         infos["type"] = block.GetType()
         infos["name"] = block.GetName()
-        infos["executionOrder"] = block.GetExecutionOrder()
+        if self.CurrentLanguage == "FBD":
+            infos["executionOrder"] = block.GetExecutionOrder()
         infos["x"], infos["y"] = block.GetPosition()
         infos["width"], infos["height"] = block.GetSize()
         infos["connectors"] = block.GetConnectors()
@@ -1818,7 +1894,8 @@
         variableid = variable.GetId()
         infos = {}
         infos["name"] = variable.GetName()
-        infos["executionOrder"] = variable.GetExecutionOrder()
+        if self.CurrentLanguage == "FBD":
+            infos["executionOrder"] = variable.GetExecutionOrder()
         infos["x"], infos["y"] = variable.GetPosition()
         infos["width"], infos["height"] = variable.GetSize()
         infos["connectors"] = variable.GetConnectors()
@@ -1828,7 +1905,6 @@
         connectionid = connection.GetId()
         infos = {}
         infos["name"] = connection.GetName()
-        infos["executionOrder"] = connection.GetExecutionOrder()
         infos["x"], infos["y"] = connection.GetPosition()
         infos["width"], infos["height"] = connection.GetSize()
         infos["connector"] = connection.GetConnector()
@@ -2163,15 +2239,14 @@
 
     def OnPaint(self, event):
         dc = self.GetLogicalDC(True)
+        dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
         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):
-                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])
+            dc.SetPen(wx.TRANSPARENT_PEN)
+            dc.SetBrush(self.GridBrush)
+            width, height = self.GetVirtualSize()
+            dc.DrawRectangle(0, 0, width, height)
         
         # Draw all elements
         for comment in self.Comments: