Viewer.py
changeset 213 4931959ea256
parent 206 f7c85a5939dc
child 216 93af9ac5aeaf
--- a/Viewer.py	Wed Jun 04 17:48:26 2008 +0200
+++ b/Viewer.py	Mon Jun 23 18:48:49 2008 +0200
@@ -306,6 +306,8 @@
         self.Scaling = None
         self.DrawGrid = True
         self.GridBrush = wx.TRANSPARENT_BRUSH
+        self.PageSize = None
+        self.PagePen = wx.TRANSPARENT_PEN
         self.DrawingWire = False
         self.current_id = 0
         self.TagName = tagname
@@ -324,12 +326,12 @@
         self.SetDropTarget(ViewerDropTarget(self))
         
         dc = wx.ClientDC(self)
-        font = wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
+        font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
         dc.SetFont(font)
         width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
         while width > 260:
             faces["size"] -= 1
-            font = wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
+            font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
             dc.SetFont(font)
             width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
         self.SetFont(font)
@@ -344,7 +346,7 @@
         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
         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_SCROLLWIN, self.OnMoveWindow)
         self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
     
     def GetScrolledRect(self, rect):
@@ -374,7 +376,7 @@
 
     def GetLogicalDC(self, buffered=False):
         if buffered:
-            dc = wx.BufferedPaintDC(self)
+            dc = wx.AutoBufferedPaintDC(self)
         else:
             dc = wx.ClientDC(self)
         dc.SetFont(self.GetFont())
@@ -489,6 +491,13 @@
         else:
             self.Scaling = None
             self.GridBrush = wx.TRANSPARENT_BRUSH
+        page_size = properties["pageSize"]
+        if page_size != (0, 0):
+            self.PageSize = map(int, page_size)
+            self.PagePen = wx.Pen(wx.Colour(180, 180, 180))
+        else:
+            self.PageSize = None
+            self.PagePen = wx.TRANSPARENT_PEN
         if refresh:
             self.Refresh(False)
         
@@ -524,14 +533,18 @@
     
         self.Refresh(False)
     
-    def RefreshScrollBars(self):
-        xstart, ystart = self.GetViewStart()
-        window_size = self.GetClientSize()
+    def GetMaxSize(self):
         maxx = maxy = 0
         for element in self.GetElements():
             bbox = element.GetBoundingBox()
             maxx = max(maxx, bbox.x + bbox.width)
             maxy = max(maxy, bbox.y + bbox.height)
+        return maxx, maxy
+    
+    def RefreshScrollBars(self):
+        xstart, ystart = self.GetViewStart()
+        window_size = self.GetClientSize()
+        maxx, maxy = self.GetMaxSize()
         maxx = max(maxx + WINDOW_BORDER, xstart * SCROLLBAR_UNIT + window_size[0])
         maxy = max(maxy + WINDOW_BORDER, ystart * SCROLLBAR_UNIT + window_size[1])
         if self.rubberBand.IsShown():
@@ -539,7 +552,8 @@
             maxx = max(maxx, extent.x + extent.width)
             maxy = max(maxy, extent.y + extent.height)
         self.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
-            maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, xstart, ystart, True)
+            round(maxx / SCROLLBAR_UNIT), round(maxy / SCROLLBAR_UNIT), 
+            xstart, ystart, True)
         
     # Load instance from given informations
     def loadInstance(self, instance, ids):
@@ -2320,16 +2334,36 @@
         self.RefreshScrollBars()
         event.Skip()
 
-    def OnPaint(self, event):
-        dc = self.GetLogicalDC(True)
-        dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
-        dc.Clear()
-        dc.BeginDrawing()
-        if self.Scaling and self.DrawGrid:
+    def DoDrawing(self, dc, printing = False):
+        if printing:
+            if getattr(dc, "printing", False):
+                font = wx.Font(self.GetFont().GetPointSize(), wx.MODERN, wx.NORMAL, wx.NORMAL)
+                dc.SetFont(font)
+            else:
+                dc.SetFont(self.GetFont())
+        else:
+            dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
+            dc.Clear()
+            dc.BeginDrawing()
+        if self.Scaling is not None and self.DrawGrid and not printing:
             dc.SetPen(wx.TRANSPARENT_PEN)
             dc.SetBrush(self.GridBrush)
+            xstart, ystart = self.GetViewStart()
+            window_size = self.GetClientSize()
             width, height = self.GetVirtualSize()
+            width = max(width, xstart * SCROLLBAR_UNIT + window_size[0])
+            height = max(height, ystart * SCROLLBAR_UNIT + window_size[1])
             dc.DrawRectangle(0, 0, width, height)
+        if self.PageSize is not None and not printing:
+            dc.SetPen(self.PagePen)
+            xstart, ystart = self.GetViewStart()
+            window_size = self.GetClientSize()
+            for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], window_size[0], self.PageSize[0]):
+                dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, ystart * SCROLLBAR_UNIT, 
+                            xstart * SCROLLBAR_UNIT + x + 1, ystart * SCROLLBAR_UNIT + window_size[1])
+            for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], window_size[1], self.PageSize[1]):
+                dc.DrawLine(xstart * SCROLLBAR_UNIT, ystart * SCROLLBAR_UNIT + y + 1, 
+                            xstart * SCROLLBAR_UNIT + window_size[0], ystart * SCROLLBAR_UNIT + y + 1)
         
         # Draw all elements
         for comment in self.Comments:
@@ -2343,11 +2377,15 @@
                 block.Draw(dc)
         
         if self.SelectedElement:
-            self.SelectedElement.Draw(dc)
-        
-        if self.rubberBand.IsShown():
-            self.rubberBand.Draw(dc)
-        dc.EndDrawing()
-        event.Skip()
-
-
+                self.SelectedElement.Draw(dc)
+        
+        if not printing:
+            if self.rubberBand.IsShown():
+                self.rubberBand.Draw(dc)
+            dc.EndDrawing()
+
+    def OnPaint(self, event):
+        self.DoDrawing(self.GetLogicalDC(True))
+        event.Skip()
+
+