📄 abstracteditor.py
字号:
#----------------------------------------------------------------------------# Name: AbstractEditor.py# Purpose: Non-text editor for DataModel and Process## Author: Peter Yared, Morgan Hua## Created: 7/28/04# CVS-ID: $Id: AbstractEditor.py,v 1.7 2006/04/20 06:26:01 RD Exp $# Copyright: (c) 2004-2005 ActiveGrid, Inc.# License: wxWindows License#----------------------------------------------------------------------------import wximport wx.lib.docviewimport wx.lib.ogl as oglimport PropertyService_ = wx.GetTranslationSELECT_BRUSH = wx.Brush("BLUE", wx.SOLID)SHAPE_BRUSH = wx.Brush("WHEAT", wx.SOLID)LINE_BRUSH = wx.BLACK_BRUSHINACTIVE_SELECT_BRUSH = wx.Brush("LIGHT BLUE", wx.SOLID)NORMALFONT = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)SLANTFONT = wx.Font(NORMALFONT.GetPointSize(), NORMALFONT.GetFamily(), wx.SLANT, NORMALFONT.GetWeight())BOLDFONT = wx.Font(NORMALFONT.GetPointSize(), NORMALFONT.GetFamily(), NORMALFONT.GetStyle(), wx.BOLD)DEFAULT_BACKGROUND_COLOR = wx.Colour(0xEE, 0xEE, 0xEE)HEADER_BRUSH = wx.Brush(wx.Colour(0xDB, 0xEB, 0xFF), wx.SOLID)BODY_BRUSH = wx.Brush(wx.WHITE, wx.SOLID)PARKING_VERTICAL = 1PARKING_HORIZONTAL = 2PARKING_OFFSET = 30 # space between shapesFORCE_REDRAW_METHOD = "ForceRedraw"def GetRawModel(model): if hasattr(model, "GetRawModel"): rawModel = model.GetRawModel() else: rawModel = model return rawModeldef GetLabel(model): model = GetRawModel(model) if hasattr(model, "__xmlname__"): label = model.__xmlname__ try: if (len(label) > 0): label = label[0].upper() + label[1:] if (hasattr(model, "complexType")): label += ': %s/%s' % (model.complexType.name, model.name) else: if model.name: label += ': %s' % model.name elif model.ref: label += ': %s' % model.ref except AttributeError: pass else: label = str(model) return labelclass CanvasView(wx.lib.docview.View): #---------------------------------------------------------------------------- # Overridden methods #---------------------------------------------------------------------------- def __init__(self, brush=SHAPE_BRUSH, background=DEFAULT_BACKGROUND_COLOR): wx.lib.docview.View.__init__(self) self._brush = brush self._backgroundColor = background self._canvas = None self._pt1 = None self._pt2 = None self._needEraseLasso = False self._propShape = None self._maxWidth = 2000 self._maxHeight = 16000 self._valetParking = False 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() sizer = wx.BoxSizer() self._CreateCanvas(frame) sizer.Add(self._canvas, 1, wx.EXPAND, 0) frame.SetSizer(sizer) frame.Layout() self.Activate() wx.EVT_RIGHT_DOWN(self._canvas, self.OnRightClick) return True def OnActivateView(self, activate, activeView, deactiveView): 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.SetFocus() else: wx.CallAfter(self.SetFocus) def SetFocus(self): if self._canvas: self._canvas.SetFocus() def OnFocus(self, event): 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) if hasattr(self, "ClearOutline"): wx.CallAfter(self.ClearOutline) # need CallAfter because when closing the document, it is Activated and then Close, so need to match OnActivateView's CallAfter if not (statusC and statusP): return False self.Activate(False) if deleteWindow and self.GetFrame(): self.GetFrame().Destroy() return True def _CreateCanvas(self, parent): self._canvas = ogl.ShapeCanvas(parent) wx.EVT_LEFT_DOWN(self._canvas, self.OnLeftClick) wx.EVT_LEFT_UP(self._canvas, self.OnLeftUp) wx.EVT_MOTION(self._canvas, self.OnLeftDrag) wx.EVT_LEFT_DCLICK(self._canvas, self.OnLeftDoubleClick) 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.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) self._canvas.SetScrollbars(20, 20, self._maxWidth / 20, self._maxHeight / 20) self._canvas.SetBackgroundColour(self._backgroundColor) self._diagram = ogl.Diagram() self._canvas.SetDiagram(self._diagram) self._diagram.SetCanvas(self._canvas) self._canvas.SetFont(NORMALFONT) def OnClear(self, event): """ Deletion of selected objects from view. *Must Override* """ self.SetPropertyModel(None) def SetLastRightClick(self, x, y): self._lastRightClick = (x,y) def GetLastRightClick(self): if hasattr(self, "_lastRightClick"): return self._lastRightClick return (-1,-1) def OnKeyPressed(self, event): key = event.KeyCode() if key == wx.WXK_DELETE: self.OnClear(event) else: event.Skip() def OnRightClick(self, event): """ force selection underneath right click position. """ self.Activate() self._canvas.SetFocus() dc = wx.ClientDC(self._canvas) self._canvas.PrepareDC(dc) x, y = event.GetLogicalPosition(dc) # this takes into account scrollbar offset self.SetLastRightClick(x, y) shape = self._canvas.FindShape(x, y)[0] model = None if not shape: self.SetSelection(None) self.SetPropertyShape(None) elif hasattr(shape, "GetModel"): self.BringToFront(shape) self.SetPropertyShape(shape) self.SetSelection(shape) shape.Select(True, dc) model = shape.GetModel() elif shape.GetParent() and isinstance(shape.GetParent(), ogl.CompositeShape): # ComplexTypeHeader for ComplexTypeShape self.BringToFront(shape) self.SetPropertyShape(shape.GetParent()) self.SetSelection(shape.GetParent()) shape.GetParent().Select(True, dc) model = shape.GetParent().GetModel() self.SetPropertyModel(model) return (shape, model) def OnLeftClick(self, event): self.Activate() self._canvas.SetFocus() self.EraseRubberBand() dc = wx.ClientDC(self._canvas) self._canvas.PrepareDC(dc) # keep track of mouse down for group select self._pt1 = event.GetLogicalPosition(dc) # this takes into account scrollbar offset self._pt2 = None shape = self._canvas.FindShape(self._pt1[0], self._pt1[1])[0] if shape: self.BringToFront(shape) self._pt1 = None event.Skip() # pass on event to shape handler to take care of selection return elif event.ControlDown() or event.ShiftDown(): # extend select, don't deselect pass else: # click on empty part of canvas, deselect everything forceRedrawShapes = [] needRefresh = False for shape in self._diagram.GetShapeList(): if hasattr(shape, "GetModel"): if shape.Selected(): needRefresh = True shape.Select(False, dc) if hasattr(shape, FORCE_REDRAW_METHOD): forceRedrawShapes.append(shape) if needRefresh: self._canvas.Redraw(dc) self.SetPropertyModel(None) if len(self.GetSelection()) == 0: self.SetPropertyShape(None)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -