]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/samples/ide/activegrid/tool/AbstractEditor.py
wxHotkeyModifier --> wxKeyModifier
[wxWidgets.git] / wxPython / samples / ide / activegrid / tool / AbstractEditor.py
index 1361b422e8b495e6f60357106ad1e59976af883b..f8e9d16e4ef03904130838b2d121ee8306700b3c 100644 (file)
@@ -48,8 +48,17 @@ class CanvasView(wx.lib.docview.View):
         self._pt2 = None
         self._needEraseLasso = False
         self._propShape = None
+        self._maxWidth = 2000
+        self._maxHeight = 16000
 
 
+    def OnDraw(self, dc):
+        """ for Print Preview and Print """
+        dc.BeginDrawing()
+        self._canvas.Redraw(dc)
+        dc.EndDrawing()
+        
+
     def OnCreate(self, doc, flags):
         frame = wx.GetApp().CreateDocumentFrame(self, doc, flags)
         frame.Show()
@@ -66,22 +75,42 @@ class CanvasView(wx.lib.docview.View):
         if activate and self._canvas:
             # In MDI mode just calling set focus doesn't work and in SDI mode using CallAfter causes an endless loop
             if self.GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI:
-                self._canvas.SetFocus()
+                self.SetFocus()
             else:
-                wx.CallAfter(self._canvas.SetFocus)
+                wx.CallAfter(self.SetFocus)
+
+
+    def SetFocus(self):
+        if self._canvas:
+            self._canvas.SetFocus()
 
 
     def OnFocus(self, event):
-        self._canvas.SetFocus()
         self.FocusColorPropertyShape(True)
         event.Skip()
 
 
+    def FocusOnClick(self, event):
+        self.SetFocus()
+        event.Skip()
+
+
     def OnKillFocus(self, event):
         self.FocusColorPropertyShape(False)
         event.Skip()
 
 
+    def HasFocus(self):
+        winWithFocus = wx.Window.FindFocus()
+        if not winWithFocus:
+            return False
+        while winWithFocus:
+            if winWithFocus == self._canvas:
+                return True
+            winWithFocus = winWithFocus.GetParent()
+        return False
+
+
     def OnClose(self, deleteWindow = True):
         statusC = wx.GetApp().CloseChildDocuments(self.GetDocument())
         statusP = wx.lib.docview.View.OnClose(self, deleteWindow = deleteWindow)
@@ -104,19 +133,17 @@ class CanvasView(wx.lib.docview.View):
         wx.EVT_KEY_DOWN(self._canvas, self.OnKeyPressed)
         
         # need this otherwise mouse clicks don't set focus to this view
-        wx.EVT_LEFT_DOWN(self._canvas, self.OnFocus)
-        wx.EVT_LEFT_DCLICK(self._canvas, self.OnFocus)
-        wx.EVT_RIGHT_DOWN(self._canvas, self.OnFocus)
-        wx.EVT_RIGHT_DCLICK(self._canvas, self.OnFocus)
-        wx.EVT_MIDDLE_DOWN(self._canvas, self.OnFocus)
-        wx.EVT_MIDDLE_DCLICK(self._canvas, self.OnFocus)
+        wx.EVT_LEFT_DOWN(self._canvas, self.FocusOnClick)
+        wx.EVT_LEFT_DCLICK(self._canvas, self.FocusOnClick)
+        wx.EVT_RIGHT_DOWN(self._canvas, self.FocusOnClick)
+        wx.EVT_RIGHT_DCLICK(self._canvas, self.FocusOnClick)
+        wx.EVT_MIDDLE_DOWN(self._canvas, self.FocusOnClick)
+        wx.EVT_MIDDLE_DCLICK(self._canvas, self.FocusOnClick)
         
         wx.EVT_KILL_FOCUS(self._canvas, self.OnKillFocus)
         wx.EVT_SET_FOCUS(self._canvas, self.OnFocus)
 
-        maxWidth = 2000
-        maxHeight = 16000
-        self._canvas.SetScrollbars(20, 20, maxWidth / 20, maxHeight / 20)
+        self._canvas.SetScrollbars(20, 20, self._maxWidth / 20, self._maxHeight / 20)
         
         self._canvas.SetBackgroundColour(wx.WHITE)
         self._diagram = ogl.Diagram()
@@ -374,7 +401,7 @@ class CanvasView(wx.lib.docview.View):
             shape.SetBrush(brush)
         if text:
             shape.AddText(text)
-        shape.SetShadowMode(ogl.SHADOW_RIGHT)
+        shape.SetShadowMode(ogl.SHADOW_NONE)
         self._diagram.AddShape(shape)
         shape.Show(True)
         if not eventHandler:
@@ -394,9 +421,28 @@ class CanvasView(wx.lib.docview.View):
 
         if shape:
             shape.Select(False)
+            for line in shape.GetLines():
+                shape.RemoveLine(line)
+                self._diagram.RemoveShape(line)
+            for obj in self._diagram.GetShapeList():
+                for line in obj.GetLines():
+                    if self.IsShapeContained(shape, line.GetTo()) or self.IsShapeContained(shape, line.GetFrom()):
+                        obj.RemoveLine(line)
+                        self._diagram.RemoveShape(line)
+                    if line == shape:
+                        obj.RemoveLine(line)
+                    
+            shape.RemoveFromCanvas(self._canvas)
             self._diagram.RemoveShape(shape)
-            if isinstance(shape, ogl.CompositeShape):
-                shape.RemoveFromCanvas(self._canvas)
+
+
+    def IsShapeContained(self, parent, shape):
+        if parent == shape:
+            return True
+        elif shape.GetParent():
+            return self.IsShapeContained(parent, shape.GetParent())
+            
+        return False
 
 
     def UpdateShape(self, model):
@@ -528,7 +574,10 @@ class CanvasView(wx.lib.docview.View):
 
         # draw new selection
         if self._propShape and self._propShape in self._diagram.GetShapeList():
-            self._propShape.SetBrush(SELECT_BRUSH)
+            if self.HasFocus():
+                self._propShape.SetBrush(SELECT_BRUSH)
+            else:
+                self._propShape.SetBrush(INACTIVE_SELECT_BRUSH)
             if (self._propShape._textColourName in ["BLACK", "WHITE"]):  # Would use GetTextColour() but it is broken
                 self._propShape.SetTextColour("WHITE", 0)
             self._propShape.Draw(dc)
@@ -635,7 +684,16 @@ class EditorCanvasShapeEvtHandler(ogl.ShapeEvtHandler):
         self._view.SetSelection(model, keys == self.SHIFT_KEY or keys == self.CONTROL_KEY)
 
 
+    def OnMovePre(self, dc, x, y, oldX, oldY, display):
+        """ Prevent objects from being dragged outside of viewable area """
+        if (x > self._view._maxWidth) or (y > self._view._maxHeight):
+            return False
+
+        return ogl.ShapeEvtHandler.OnMovePre(self, dc, x, y, oldX, oldY, display)
+
+
     def OnMovePost(self, dc, x, y, oldX, oldY, display):
+        """ Update the model's record of where the shape should be.  Also enable redo/undo.  """
         if x == oldX and y == oldY:
             return
         if not self._view.GetDocument():