1 #----------------------------------------------------------------------------
3 # Purpose: Python extensions to the wxWindows docview framework
5 # Author: Peter Yared, Morgan Hua, Matt Fryer
9 # Copyright: (c) 2003-2006 ActiveGrid, Inc.
10 # License: wxWindows license
11 #----------------------------------------------------------------------------
18 from wxPython
.lib
.rcsizer
import RowColSizer
27 if wx
.Platform
== '__WXMSW__':
32 #----------------------------------------------------------------------------
34 #----------------------------------------------------------------------------
36 VIEW_TOOLBAR_ID
= wx
.NewId()
37 VIEW_STATUSBAR_ID
= wx
.NewId()
39 EMBEDDED_WINDOW_TOP
= 1
40 EMBEDDED_WINDOW_BOTTOM
= 2
41 EMBEDDED_WINDOW_LEFT
= 4
42 EMBEDDED_WINDOW_RIGHT
= 8
43 EMBEDDED_WINDOW_TOPLEFT
= 16
44 EMBEDDED_WINDOW_BOTTOMLEFT
= 32
45 EMBEDDED_WINDOW_TOPRIGHT
= 64
46 EMBEDDED_WINDOW_BOTTOMRIGHT
= 128
47 EMBEDDED_WINDOW_ALL
= EMBEDDED_WINDOW_TOP | EMBEDDED_WINDOW_BOTTOM | EMBEDDED_WINDOW_LEFT | EMBEDDED_WINDOW_RIGHT | \
48 EMBEDDED_WINDOW_TOPLEFT | EMBEDDED_WINDOW_BOTTOMLEFT | EMBEDDED_WINDOW_TOPRIGHT | EMBEDDED_WINDOW_BOTTOMRIGHT
50 SAVEALL_ID
= wx
.NewId()
52 WINDOW_MENU_NUM_ITEMS
= 9
57 Class with common code used by DocMDIParentFrame, DocTabbedParentFrame, and
62 def GetDocumentManager(self
):
64 Returns the document manager associated with the DocMDIParentFrame.
66 return self
._docManager
69 def InitializePrintData(self
):
71 Initializes the PrintData that is used when printing.
73 self
._printData
= wx
.PrintData()
74 self
._printData
.SetPaperId(wx
.PAPER_LETTER
)
77 def CreateDefaultMenuBar(self
, sdi
=False):
79 Creates the default MenuBar. Contains File, Edit, View, Tools, and Help menus.
81 menuBar
= wx
.MenuBar()
84 fileMenu
.Append(wx
.ID_NEW
, _("&New...\tCtrl+N"), _("Creates a new document"))
85 fileMenu
.Append(wx
.ID_OPEN
, _("&Open...\tCtrl+O"), _("Opens an existing document"))
86 fileMenu
.Append(wx
.ID_CLOSE
, _("&Close"), _("Closes the active document"))
88 fileMenu
.Append(wx
.ID_CLOSE_ALL
, _("Close A&ll"), _("Closes all open documents"))
89 fileMenu
.AppendSeparator()
90 fileMenu
.Append(wx
.ID_SAVE
, _("&Save\tCtrl+S"), _("Saves the active document"))
91 fileMenu
.Append(wx
.ID_SAVEAS
, _("Save &As..."), _("Saves the active document with a new name"))
92 fileMenu
.Append(SAVEALL_ID
, _("Save All\tCtrl+Shift+A"), _("Saves the all active documents"))
93 wx
.EVT_MENU(self
, SAVEALL_ID
, self
.ProcessEvent
)
94 wx
.EVT_UPDATE_UI(self
, SAVEALL_ID
, self
.ProcessUpdateUIEvent
)
95 fileMenu
.AppendSeparator()
96 fileMenu
.Append(wx
.ID_PRINT
, _("&Print\tCtrl+P"), _("Prints the active document"))
97 fileMenu
.Append(wx
.ID_PREVIEW
, _("Print Pre&view"), _("Displays full pages"))
98 fileMenu
.Append(wx
.ID_PRINT_SETUP
, _("Page Set&up"), _("Changes page layout settings"))
99 fileMenu
.AppendSeparator()
100 if wx
.Platform
== '__WXMAC__':
101 fileMenu
.Append(wx
.ID_EXIT
, _("&Quit"), _("Closes this program"))
103 fileMenu
.Append(wx
.ID_EXIT
, _("E&xit"), _("Closes this program"))
104 self
._docManager
.FileHistoryUseMenu(fileMenu
)
105 self
._docManager
.FileHistoryAddFilesToMenu()
106 menuBar
.Append(fileMenu
, _("&File"));
109 editMenu
.Append(wx
.ID_UNDO
, _("&Undo\tCtrl+Z"), _("Reverses the last action"))
110 editMenu
.Append(wx
.ID_REDO
, _("&Redo\tCtrl+Y"), _("Reverses the last undo"))
111 editMenu
.AppendSeparator()
112 #item = wxMenuItem(self.editMenu, wxID_CUT, _("Cu&t\tCtrl+X"), _("Cuts the selection and puts it on the Clipboard"))
113 #item.SetBitmap(getCutBitmap())
114 #editMenu.AppendItem(item)
115 editMenu
.Append(wx
.ID_CUT
, _("Cu&t\tCtrl+X"), _("Cuts the selection and puts it on the Clipboard"))
116 wx
.EVT_MENU(self
, wx
.ID_CUT
, self
.ProcessEvent
)
117 wx
.EVT_UPDATE_UI(self
, wx
.ID_CUT
, self
.ProcessUpdateUIEvent
)
118 editMenu
.Append(wx
.ID_COPY
, _("&Copy\tCtrl+C"), _("Copies the selection and puts it on the Clipboard"))
119 wx
.EVT_MENU(self
, wx
.ID_COPY
, self
.ProcessEvent
)
120 wx
.EVT_UPDATE_UI(self
, wx
.ID_COPY
, self
.ProcessUpdateUIEvent
)
121 editMenu
.Append(wx
.ID_PASTE
, _("&Paste\tCtrl+V"), _("Inserts Clipboard contents"))
122 wx
.EVT_MENU(self
, wx
.ID_PASTE
, self
.ProcessEvent
)
123 wx
.EVT_UPDATE_UI(self
, wx
.ID_PASTE
, self
.ProcessUpdateUIEvent
)
124 editMenu
.Append(wx
.ID_CLEAR
, _("&Delete"), _("Erases the selection"))
125 wx
.EVT_MENU(self
, wx
.ID_CLEAR
, self
.ProcessEvent
)
126 wx
.EVT_UPDATE_UI(self
, wx
.ID_CLEAR
, self
.ProcessUpdateUIEvent
)
127 editMenu
.AppendSeparator()
128 editMenu
.Append(wx
.ID_SELECTALL
, _("Select A&ll\tCtrl+A"), _("Selects all available data"))
129 wx
.EVT_MENU(self
, wx
.ID_SELECTALL
, self
.ProcessEvent
)
130 wx
.EVT_UPDATE_UI(self
, wx
.ID_SELECTALL
, self
.ProcessUpdateUIEvent
)
131 menuBar
.Append(editMenu
, _("&Edit"))
133 if self
.GetDocument() and self
.GetDocument().GetCommandProcessor():
134 self
.GetDocument().GetCommandProcessor().SetEditMenu(editMenu
)
137 viewMenu
.AppendCheckItem(VIEW_TOOLBAR_ID
, _("&Toolbar"), _("Shows or hides the toolbar"))
138 wx
.EVT_MENU(self
, VIEW_TOOLBAR_ID
, self
.OnViewToolBar
)
139 wx
.EVT_UPDATE_UI(self
, VIEW_TOOLBAR_ID
, self
.OnUpdateViewToolBar
)
140 viewMenu
.AppendCheckItem(VIEW_STATUSBAR_ID
, _("&Status Bar"), _("Shows or hides the status bar"))
141 wx
.EVT_MENU(self
, VIEW_STATUSBAR_ID
, self
.OnViewStatusBar
)
142 wx
.EVT_UPDATE_UI(self
, VIEW_STATUSBAR_ID
, self
.OnUpdateViewStatusBar
)
143 menuBar
.Append(viewMenu
, _("&View"))
146 helpMenu
.Append(wx
.ID_ABOUT
, _("&About" + " " + wx
.GetApp().GetAppName()), _("Displays program information, version number, and copyright"))
147 menuBar
.Append(helpMenu
, _("&Help"))
149 wx
.EVT_MENU(self
, wx
.ID_ABOUT
, self
.OnAbout
)
150 wx
.EVT_UPDATE_UI(self
, wx
.ID_ABOUT
, self
.ProcessUpdateUIEvent
) # Using ID_ABOUT to update the window menu, the window menu items are not triggering
152 if sdi
: # TODO: Is this really needed?
153 wx
.EVT_COMMAND_FIND_CLOSE(self
, -1, self
.ProcessEvent
)
158 def CreateDefaultStatusBar(self
):
160 Creates the default StatusBar.
162 wx
.Frame
.CreateStatusBar(self
)
163 self
.GetStatusBar().Show(wx
.ConfigBase_Get().ReadInt("ViewStatusBar", True))
165 return self
.GetStatusBar()
168 def CreateDefaultToolBar(self
):
170 Creates the default ToolBar.
172 self
._toolBar
= self
.CreateToolBar(wx
.TB_HORIZONTAL | wx
.NO_BORDER | wx
.TB_FLAT
)
173 self
._toolBar
.AddSimpleTool(wx
.ID_NEW
, getNewBitmap(), _("New"), _("Creates a new document"))
174 self
._toolBar
.AddSimpleTool(wx
.ID_OPEN
, getOpenBitmap(), _("Open"), _("Opens an existing document"))
175 self
._toolBar
.AddSimpleTool(wx
.ID_SAVE
, getSaveBitmap(), _("Save"), _("Saves the active document"))
176 self
._toolBar
.AddSimpleTool(SAVEALL_ID
, getSaveAllBitmap(), _("Save All"), _("Saves all the active documents"))
177 self
._toolBar
.AddSeparator()
178 self
._toolBar
.AddSimpleTool(wx
.ID_PRINT
, getPrintBitmap(), _("Print"), _("Displays full pages"))
179 self
._toolBar
.AddSimpleTool(wx
.ID_PREVIEW
, getPrintPreviewBitmap(), _("Print Preview"), _("Prints the active document"))
180 self
._toolBar
.AddSeparator()
181 self
._toolBar
.AddSimpleTool(wx
.ID_CUT
, getCutBitmap(), _("Cut"), _("Cuts the selection and puts it on the Clipboard"))
182 self
._toolBar
.AddSimpleTool(wx
.ID_COPY
, getCopyBitmap(), _("Copy"), _("Copies the selection and puts it on the Clipboard"))
183 self
._toolBar
.AddSimpleTool(wx
.ID_PASTE
, getPasteBitmap(), _("Paste"), _("Inserts Clipboard contents"))
184 self
._toolBar
.AddSimpleTool(wx
.ID_UNDO
, getUndoBitmap(), _("Undo"), _("Reverses the last action"))
185 self
._toolBar
.AddSimpleTool(wx
.ID_REDO
, getRedoBitmap(), _("Redo"), _("Reverses the last undo"))
186 self
._toolBar
.Realize()
187 self
._toolBar
.Show(wx
.ConfigBase_Get().ReadInt("ViewToolBar", True))
192 def OnFileSaveAll(self
, event
):
194 Saves all of the currently open documents.
196 docs
= wx
.GetApp().GetDocumentManager().GetDocuments()
198 # save child documents first
200 if isinstance(doc
, wx
.lib
.pydocview
.ChildDocument
):
203 # save parent and other documents later
205 if not isinstance(doc
, wx
.lib
.pydocview
.ChildDocument
):
209 def OnAbout(self
, event
):
211 Invokes the about dialog.
213 aboutService
= wx
.GetApp().GetService(AboutService
)
215 aboutService
.ShowAbout()
218 def OnViewToolBar(self
, event
):
220 Toggles whether the ToolBar is visible.
222 self
._toolBar
.Show(not self
._toolBar
.IsShown())
226 def OnUpdateViewToolBar(self
, event
):
228 Updates the View ToolBar menu item.
230 event
.Check(self
.GetToolBar().IsShown())
233 def OnViewStatusBar(self
, event
):
235 Toggles whether the StatusBar is visible.
237 self
.GetStatusBar().Show(not self
.GetStatusBar().IsShown())
241 def OnUpdateViewStatusBar(self
, event
):
243 Updates the View StatusBar menu item.
245 event
.Check(self
.GetStatusBar().IsShown())
248 def UpdateStatus(self
, message
= _("Ready")):
250 Updates the StatusBar.
252 # wxBug: Menubar and toolbar help strings don't pop the status text back
253 if self
.GetStatusBar().GetStatusText() != message
:
254 self
.GetStatusBar().PushStatusText(message
)
257 class DocMDIParentFrameMixIn
:
259 Class with common code used by DocMDIParentFrame and DocTabbedParentFrame.
263 def _GetPosSizeFromConfig(self
, pos
, size
):
265 Adjusts the position and size of the frame using the saved config position and size.
267 config
= wx
.ConfigBase_Get()
268 if pos
== wx
.DefaultPosition
and size
== wx
.DefaultSize
and config
.ReadInt("MDIFrameMaximized", False):
270 size
= wx
.DisplaySize()
271 # wxBug: Need to set to fill screen to get around bug where maximize is leaving shadow of statusbar, check out maximize call at end of this function
273 if pos
== wx
.DefaultPosition
:
274 pos
= config
.ReadInt("MDIFrameXLoc", -1), config
.ReadInt("MDIFrameYLoc", -1)
276 if wx
.Display_GetFromPoint(pos
) == -1: # Check if the frame position is offscreen
277 pos
= wx
.DefaultPosition
279 if size
== wx
.DefaultSize
:
280 size
= wx
.Size(config
.ReadInt("MDIFrameXSize", 450), config
.ReadInt("MDIFrameYSize", 300))
284 def _InitFrame(self
, embeddedWindows
, minSize
):
286 Initializes the frame and creates the default menubar, toolbar, and status bar.
288 self
._embeddedWindows
= []
289 self
.SetDropTarget(_DocFrameFileDropTarget(self
._docManager
, self
))
291 if wx
.GetApp().GetDefaultIcon():
292 self
.SetIcon(wx
.GetApp().GetDefaultIcon())
294 wx
.EVT_MENU(self
, wx
.ID_ABOUT
, self
.OnAbout
)
295 wx
.EVT_SIZE(self
, self
.OnSize
)
297 self
.InitializePrintData()
299 toolBar
= self
.CreateDefaultToolBar()
300 self
.SetToolBar(toolBar
)
301 menuBar
= self
.CreateDefaultMenuBar()
302 statusBar
= self
.CreateDefaultStatusBar()
304 config
= wx
.ConfigBase_Get()
305 if config
.ReadInt("MDIFrameMaximized", False):
306 # wxBug: On maximize, statusbar leaves a residual that needs to be refereshed, happens even when user does it
309 self
.CreateEmbeddedWindows(embeddedWindows
, minSize
)
312 if wx
.Platform
== '__WXMAC__':
313 self
.SetMenuBar(menuBar
) # wxBug: Have to set the menubar at the very end or the automatic MDI "window" menu doesn't get put in the right place when the services add new menus to the menubar
315 wx
.GetApp().SetTopWindow(self
) # Need to do this here in case the services are looking for wx.GetApp().GetTopWindow()
316 for service
in wx
.GetApp().GetServices():
317 service
.InstallControls(self
, menuBar
= menuBar
, toolBar
= toolBar
, statusBar
= statusBar
)
318 if hasattr(service
, "ShowWindow"):
319 service
.ShowWindow() # instantiate service windows for correct positioning, we'll hide/show them later based on user preference
321 if wx
.Platform
!= '__WXMAC__':
322 self
.SetMenuBar(menuBar
) # wxBug: Have to set the menubar at the very end or the automatic MDI "window" menu doesn't get put in the right place when the services add new menus to the menubar
325 def ProcessEvent(self
, event
):
327 Processes an event, searching event tables and calling zero or more
328 suitable event handler function(s). Note that the ProcessEvent
329 method is called from the wxPython docview framework directly since
330 wxPython does not have a virtual ProcessEvent function.
334 self
.OnFileSaveAll(event
)
337 return wx
.GetApp().ProcessEvent(event
)
340 def ProcessUpdateUIEvent(self
, event
):
342 Processes a UI event, searching event tables and calling zero or more
343 suitable event handler function(s). Note that the ProcessEvent
344 method is called from the wxPython docview framework directly since
345 wxPython does not have a virtual ProcessEvent function.
351 elif id == wx
.ID_COPY
:
354 elif id == wx
.ID_PASTE
:
357 elif id == wx
.ID_CLEAR
:
360 elif id == wx
.ID_SELECTALL
:
363 elif id == SAVEALL_ID
:
364 filesModified
= False
365 docs
= wx
.GetApp().GetDocumentManager().GetDocuments()
371 event
.Enable(filesModified
)
374 return wx
.GetApp().ProcessUpdateUIEvent(event
)
377 def CreateEmbeddedWindows(self
, windows
=0, minSize
=20):
379 Create the specified embedded windows around the edges of the frame.
381 frameSize
= self
.GetSize() # TODO: GetClientWindow.GetSize is still returning 0,0 since the frame isn't fully constructed yet, so using full frame size
382 defaultHSize
= max(minSize
, int(frameSize
[0] / 6))
383 defaultVSize
= max(minSize
, int(frameSize
[1] / 7))
384 defaultSubVSize
= int(frameSize
[1] / 2)
385 config
= wx
.ConfigBase_Get()
386 if windows
& (EMBEDDED_WINDOW_LEFT | EMBEDDED_WINDOW_TOPLEFT | EMBEDDED_WINDOW_BOTTOMLEFT
):
387 self
._leftEmbWindow
= self
._CreateEmbeddedWindow
(self
, (max(minSize
,config
.ReadInt("MDIEmbedLeftSize", defaultHSize
)), -1), wx
.LAYOUT_VERTICAL
, wx
.LAYOUT_LEFT
, visible
= config
.ReadInt("MDIEmbedLeftVisible", 1), sash
= wx
.SASH_RIGHT
)
389 self
._leftEmbWindow
= None
390 if windows
& EMBEDDED_WINDOW_TOPLEFT
:
391 self
._topLeftEmbWindow
= self
._CreateEmbeddedWindow
(self
._leftEmbWindow
, (-1, config
.ReadInt("MDIEmbedTopLeftSize", defaultSubVSize
)), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_TOP
, visible
= config
.ReadInt("MDIEmbedTopLeftVisible", 1), sash
= wx
.SASH_BOTTOM
)
393 self
._topLeftEmbWindow
= None
394 if windows
& EMBEDDED_WINDOW_BOTTOMLEFT
:
395 self
._bottomLeftEmbWindow
= self
._CreateEmbeddedWindow
(self
._leftEmbWindow
, (-1, config
.ReadInt("MDIEmbedBottomLeftSize", defaultSubVSize
)), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_BOTTOM
, visible
= config
.ReadInt("MDIEmbedBottomLeftVisible", 1))
397 self
._bottomLeftEmbWindow
= None
398 if windows
& (EMBEDDED_WINDOW_RIGHT | EMBEDDED_WINDOW_TOPRIGHT | EMBEDDED_WINDOW_BOTTOMRIGHT
):
399 self
._rightEmbWindow
= self
._CreateEmbeddedWindow
(self
, (max(minSize
,config
.ReadInt("MDIEmbedRightSize", defaultHSize
)), -1), wx
.LAYOUT_VERTICAL
, wx
.LAYOUT_RIGHT
, visible
= config
.ReadInt("MDIEmbedRightVisible", 1), sash
= wx
.SASH_LEFT
)
401 self
._rightEmbWindow
= None
402 if windows
& EMBEDDED_WINDOW_TOPRIGHT
:
403 self
._topRightEmbWindow
= self
._CreateEmbeddedWindow
(self
._rightEmbWindow
, (-1, config
.ReadInt("MDIEmbedTopRightSize", defaultSubVSize
)), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_TOP
, visible
= config
.ReadInt("MDIEmbedTopRightVisible", 1), sash
= wx
.SASH_BOTTOM
)
405 self
._topRightEmbWindow
= None
406 if windows
& EMBEDDED_WINDOW_BOTTOMRIGHT
:
407 self
._bottomRightEmbWindow
= self
._CreateEmbeddedWindow
(self
._rightEmbWindow
, (-1, config
.ReadInt("MDIEmbedBottomRightSize", defaultSubVSize
)), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_BOTTOM
, visible
= config
.ReadInt("MDIEmbedBottomRightVisible", 1))
409 self
._bottomRightEmbWindow
= None
410 if windows
& EMBEDDED_WINDOW_TOP
:
411 self
._topEmbWindow
= self
._CreateEmbeddedWindow
(self
, (-1, max(minSize
,config
.ReadInt("MDIEmbedTopSize", defaultVSize
))), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_TOP
, visible
= config
.ReadInt("MDIEmbedTopVisible", 1), sash
= wx
.SASH_BOTTOM
)
413 self
._topEmbWindow
= None
414 if windows
& EMBEDDED_WINDOW_BOTTOM
:
415 self
._bottomEmbWindow
= self
._CreateEmbeddedWindow
(self
, (-1, max(minSize
,config
.ReadInt("MDIEmbedBottomSize", defaultVSize
))), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_BOTTOM
, visible
= config
.ReadInt("MDIEmbedBottomVisible", 1), sash
= wx
.SASH_TOP
)
417 self
._bottomEmbWindow
= None
420 def SaveEmbeddedWindowSizes(self
):
422 Saves the sizes of the embedded windows.
424 config
= wx
.ConfigBase_Get()
425 if not self
.IsMaximized():
426 config
.WriteInt("MDIFrameXLoc", self
.GetPositionTuple()[0])
427 config
.WriteInt("MDIFrameYLoc", self
.GetPositionTuple()[1])
428 config
.WriteInt("MDIFrameXSize", self
.GetSizeTuple()[0])
429 config
.WriteInt("MDIFrameYSize", self
.GetSizeTuple()[1])
430 config
.WriteInt("MDIFrameMaximized", self
.IsMaximized())
431 config
.WriteInt("ViewToolBar", self
._toolBar
.IsShown())
432 config
.WriteInt("ViewStatusBar", self
.GetStatusBar().IsShown())
434 if self
._leftEmbWindow
:
435 config
.WriteInt("MDIEmbedLeftSize", self
._leftEmbWindow
.GetSize()[0])
436 config
.WriteInt("MDIEmbedLeftVisible", self
._leftEmbWindow
.IsShown())
437 if self
._topLeftEmbWindow
:
438 if self
._topLeftEmbWindow
._sizeBeforeHidden
:
439 size
= self
._topLeftEmbWindow
._sizeBeforeHidden
[1]
441 size
= self
._topLeftEmbWindow
.GetSize()[1]
442 config
.WriteInt("MDIEmbedTopLeftSize", size
)
443 config
.WriteInt("MDIEmbedTopLeftVisible", self
._topLeftEmbWindow
.IsShown())
444 if self
._bottomLeftEmbWindow
:
445 if self
._bottomLeftEmbWindow
._sizeBeforeHidden
:
446 size
= self
._bottomLeftEmbWindow
._sizeBeforeHidden
[1]
448 size
= self
._bottomLeftEmbWindow
.GetSize()[1]
449 config
.WriteInt("MDIEmbedBottomLeftSize", size
)
450 config
.WriteInt("MDIEmbedBottomLeftVisible", self
._bottomLeftEmbWindow
.IsShown())
451 if self
._rightEmbWindow
:
452 config
.WriteInt("MDIEmbedRightSize", self
._rightEmbWindow
.GetSize()[0])
453 config
.WriteInt("MDIEmbedRightVisible", self
._rightEmbWindow
.IsShown())
454 if self
._topRightEmbWindow
:
455 if self
._topRightEmbWindow
._sizeBeforeHidden
:
456 size
= self
._topRightEmbWindow
._sizeBeforeHidden
[1]
458 size
= self
._topRightEmbWindow
.GetSize()[1]
459 config
.WriteInt("MDIEmbedTopRightSize", size
)
460 config
.WriteInt("MDIEmbedTopRightVisible", self
._topRightEmbWindow
.IsShown())
461 if self
._bottomRightEmbWindow
:
462 if self
._bottomRightEmbWindow
._sizeBeforeHidden
:
463 size
= self
._bottomRightEmbWindow
._sizeBeforeHidden
[1]
465 size
= self
._bottomRightEmbWindow
.GetSize()[1]
466 config
.WriteInt("MDIEmbedBottomRightSize", size
)
467 config
.WriteInt("MDIEmbedBottomRightVisible", self
._bottomRightEmbWindow
.IsShown())
468 if self
._topEmbWindow
:
469 config
.WriteInt("MDIEmbedTopSize", self
._topEmbWindow
.GetSize()[1])
470 config
.WriteInt("MDIEmbedTopVisible", self
._topEmbWindow
.IsShown())
471 if self
._bottomEmbWindow
:
472 config
.WriteInt("MDIEmbedBottomSize", self
._bottomEmbWindow
.GetSize()[1])
473 config
.WriteInt("MDIEmbedBottomVisible", self
._bottomEmbWindow
.IsShown())
476 def GetEmbeddedWindow(self
, loc
):
478 Returns the instance of the embedded window specified by the embedded window location constant.
480 if loc
== EMBEDDED_WINDOW_TOP
:
481 return self
._topEmbWindow
482 elif loc
== EMBEDDED_WINDOW_BOTTOM
:
483 return self
._bottomEmbWindow
484 elif loc
== EMBEDDED_WINDOW_LEFT
:
485 return self
._leftEmbWindow
486 elif loc
== EMBEDDED_WINDOW_RIGHT
:
487 return self
._rightEmbWindow
488 elif loc
== EMBEDDED_WINDOW_TOPLEFT
:
489 return self
._topLeftEmbWindow
490 elif loc
== EMBEDDED_WINDOW_BOTTOMLEFT
:
491 return self
._bottomLeftEmbWindow
492 elif loc
== EMBEDDED_WINDOW_TOPRIGHT
:
493 return self
._topRightEmbWindow
494 elif loc
== EMBEDDED_WINDOW_BOTTOMRIGHT
:
495 return self
._bottomRightEmbWindow
499 def _CreateEmbeddedWindow(self
, parent
, size
, orientation
, alignment
, visible
=True, sash
=None):
501 Creates the embedded window with the specified size, orientation, and alignment. If the
502 window is not visible it will retain the size with which it was last viewed.
504 window
= wx
.SashLayoutWindow(parent
, wx
.NewId(), style
= wx
.NO_BORDER | wx
.SW_3D
)
505 window
.SetDefaultSize(size
)
506 window
.SetOrientation(orientation
)
507 window
.SetAlignment(alignment
)
508 if sash
!= None: # wx.SASH_TOP is 0 so check for None instead of just doing "if sash:"
509 window
.SetSashVisible(sash
, True)
511 def OnEmbeddedWindowSashDrag(event
):
512 if event
.GetDragStatus() == wx
.SASH_STATUS_OUT_OF_RANGE
:
514 sashWindow
= event
.GetEventObject()
515 if sashWindow
.GetAlignment() == wx
.LAYOUT_TOP
or sashWindow
.GetAlignment() == wx
.LAYOUT_BOTTOM
:
516 size
= wx
.Size(-1, event
.GetDragRect().height
)
518 size
= wx
.Size(event
.GetDragRect().width
, -1)
519 event
.GetEventObject().SetDefaultSize(size
)
522 if isinstance(sashWindow
.GetParent(), wx
.SashLayoutWindow
):
524 parentSashWindow
= sashWindow
.GetParent() # Force a refresh
525 parentSashWindow
.Layout()
526 parentSashWindow
.Refresh()
527 parentSashWindow
.SetSize((parentSashWindow
.GetSize().width
+ 1, parentSashWindow
.GetSize().height
+ 1))
529 wx
.EVT_SASH_DRAGGED(window
, window
.GetId(), OnEmbeddedWindowSashDrag
)
530 window
._sizeBeforeHidden
= None
533 if isinstance(parent
, wx
.SashLayoutWindow
): # It's a window embedded in another sash window so remember its actual size to show it again
534 window
._sizeBeforeHidden
= size
538 def ShowEmbeddedWindow(self
, window
, show
=True):
540 Shows or hides the embedded window specified by the embedded window location constant.
543 if isinstance(window
.GetParent(), wx
.SashLayoutWindow
): # It is a parent sashwindow with multiple embedded sashwindows
544 parentSashWindow
= window
.GetParent()
545 if show
: # Make sure it is visible in case all of the subwindows were hidden
546 parentSashWindow
.Show()
547 if show
and window
._sizeBeforeHidden
:
548 if window
._sizeBeforeHidden
[1] == parentSashWindow
.GetClientSize()[1]:
549 if window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
) and self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
).IsShown():
550 window
.SetDefaultSize((window
._sizeBeforeHidden
[0], window
._sizeBeforeHidden
[0] - self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
).GetSize()[1]))
551 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
) and self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
).IsShown():
552 window
.SetDefaultSize((window
._sizeBeforeHidden
[0], window
._sizeBeforeHidden
[0] - self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
).GetSize()[1]))
553 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
) and self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
).IsShown():
554 window
.SetDefaultSize((window
._sizeBeforeHidden
[0], window
._sizeBeforeHidden
[0] - self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
).GetSize()[1]))
555 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
) and self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
).IsShown():
556 window
.SetDefaultSize((window
._sizeBeforeHidden
[0], window
._sizeBeforeHidden
[0] - self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
).GetSize()[1]))
558 window
.SetDefaultSize(window
._sizeBeforeHidden
)
559 # If it is not the size of the full parent sashwindow set the other window's size so that if it gets shown it will have a cooresponding size
560 if window
._sizeBeforeHidden
[1] < parentSashWindow
.GetClientSize()[1]:
561 otherWindowSize
= (-1, parentSashWindow
.GetClientSize()[1] - window
._sizeBeforeHidden
[1])
562 if window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
):
563 self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
).SetDefaultSize(otherWindowSize
)
564 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
):
565 self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
).SetDefaultSize(otherWindowSize
)
566 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
):
567 self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
).SetDefaultSize(otherWindowSize
)
568 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
):
569 self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
).SetDefaultSize(otherWindowSize
)
572 if window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
) and not self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
).IsShown() \
573 or window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
) and not self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
).IsShown() \
574 or window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
) and not self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
).IsShown() \
575 or window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
) and not self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
).IsShown():
576 parentSashWindow
.Hide() # Hide the parent sashwindow if all of the children are hidden
577 parentSashWindow
.Layout() # Force a refresh
578 parentSashWindow
.Refresh()
579 parentSashWindow
.SetSize((parentSashWindow
.GetSize().width
+ 1, parentSashWindow
.GetSize().height
+ 1))
583 def HideEmbeddedWindow(self
, window
):
585 Hides the embedded window specified by the embedded window location constant.
587 self
.ShowEmbeddedWindow(window
, show
=False)
590 class DocTabbedChildFrame(wx
.Panel
):
592 The wxDocMDIChildFrame class provides a default frame for displaying
593 documents on separate windows. This class can only be used for MDI child
596 The class is part of the document/view framework supported by wxWindows,
597 and cooperates with the wxView, wxDocument, wxDocManager and wxDocTemplate
602 def __init__(self
, doc
, view
, frame
, id, title
, pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
, name
="frame"):
604 Constructor. Note that the event table must be rebuilt for the
605 frame since the EvtHandler is not virtual.
607 wx
.Panel
.__init
__(self
, frame
.GetNotebook(), id)
608 self
._childDocument
= doc
609 self
._childView
= view
610 frame
.AddNotebookPage(self
, doc
.GetPrintableName())
617 Dummy method since the icon of tabbed frames are managed by the notebook.
622 def SetIcon(self
, icon
):
624 Dummy method since the icon of tabbed frames are managed by the notebook.
631 Removes the current notebook page.
633 wx
.GetApp().GetTopWindow().RemoveNotebookPage(self
)
638 Activates the current notebook page.
640 wx
.GetApp().GetTopWindow().ActivateNotebookPage(self
)
643 def Activate(self
): # Need this in case there are embedded sash windows and such, OnActivate is not getting called
645 Activates the current view.
647 # Called by Project Editor
649 self
._childView
.Activate(True)
654 Returns the frame's title.
656 return wx
.GetApp().GetTopWindow().GetNotebookPageTitle(self
)
659 def SetTitle(self
, title
):
661 Sets the frame's title.
663 wx
.GetApp().GetTopWindow().SetNotebookPageTitle(self
, title
)
666 def OnTitleIsModified(self
):
668 Add/remove to the frame's title an indication that the document is dirty.
669 If the document is dirty, an '*' is appended to the title
671 title
= self
.GetTitle()
673 if self
.GetDocument().IsModified():
674 if not title
.endswith("*"):
678 if title
.endswith("*"):
683 def ProcessEvent(event
):
685 Processes an event, searching event tables and calling zero or more
686 suitable event handler function(s). Note that the ProcessEvent
687 method is called from the wxPython docview framework directly since
688 wxPython does not have a virtual ProcessEvent function.
690 if not self
._childView
or not self
._childView
.ProcessEvent(event
):
691 if not isinstance(event
, wx
.CommandEvent
) or not self
.GetParent() or not self
.GetParent().ProcessEvent(event
):
699 def GetDocument(self
):
701 Returns the document associated with this frame.
703 return self
._childDocument
706 def SetDocument(self
, document
):
708 Sets the document for this frame.
710 self
._childDocument
= document
715 Returns the view associated with this frame.
717 return self
._childView
720 def SetView(self
, view
):
722 Sets the view for this frame.
724 self
._childView
= view
727 class DocTabbedParentFrame(wx
.Frame
, DocFrameMixIn
, DocMDIParentFrameMixIn
):
729 The DocTabbedParentFrame class provides a default top-level frame for
730 applications using the document/view framework. This class can only be
731 used for MDI parent frames that use a tabbed interface.
733 It cooperates with the wxView, wxDocument, wxDocManager and wxDocTemplate
738 def __init__(self
, docManager
, frame
, id, title
, pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
, name
= "DocTabbedParentFrame", embeddedWindows
= 0, minSize
=20):
740 Constructor. Note that the event table must be rebuilt for the
741 frame since the EvtHandler is not virtual.
743 pos
, size
= self
._GetPosSizeFromConfig
(pos
, size
)
744 wx
.Frame
.__init
__(self
, frame
, id, title
, pos
, size
, style
, name
)
746 # From docview.MDIParentFrame
747 self
._docManager
= docManager
749 wx
.EVT_CLOSE(self
, self
.OnCloseWindow
)
751 wx
.EVT_MENU(self
, wx
.ID_EXIT
, self
.OnExit
)
752 wx
.EVT_MENU_RANGE(self
, wx
.ID_FILE1
, wx
.ID_FILE9
, self
.OnMRUFile
)
754 wx
.EVT_MENU(self
, wx
.ID_NEW
, self
.ProcessEvent
)
755 wx
.EVT_MENU(self
, wx
.ID_OPEN
, self
.ProcessEvent
)
756 wx
.EVT_MENU(self
, wx
.ID_CLOSE_ALL
, self
.ProcessEvent
)
757 wx
.EVT_MENU(self
, wx
.ID_CLOSE
, self
.ProcessEvent
)
758 wx
.EVT_MENU(self
, wx
.ID_REVERT
, self
.ProcessEvent
)
759 wx
.EVT_MENU(self
, wx
.ID_SAVE
, self
.ProcessEvent
)
760 wx
.EVT_MENU(self
, wx
.ID_SAVEAS
, self
.ProcessEvent
)
761 wx
.EVT_MENU(self
, wx
.ID_UNDO
, self
.ProcessEvent
)
762 wx
.EVT_MENU(self
, wx
.ID_REDO
, self
.ProcessEvent
)
763 wx
.EVT_MENU(self
, wx
.ID_PRINT
, self
.ProcessEvent
)
764 wx
.EVT_MENU(self
, wx
.ID_PRINT_SETUP
, self
.ProcessEvent
)
765 wx
.EVT_MENU(self
, wx
.ID_PREVIEW
, self
.ProcessEvent
)
766 wx
.EVT_MENU(self
, wx
.ID_ABOUT
, self
.OnAbout
)
768 wx
.EVT_UPDATE_UI(self
, wx
.ID_NEW
, self
.ProcessUpdateUIEvent
)
769 wx
.EVT_UPDATE_UI(self
, wx
.ID_OPEN
, self
.ProcessUpdateUIEvent
)
770 wx
.EVT_UPDATE_UI(self
, wx
.ID_CLOSE_ALL
, self
.ProcessUpdateUIEvent
)
771 wx
.EVT_UPDATE_UI(self
, wx
.ID_CLOSE
, self
.ProcessUpdateUIEvent
)
772 wx
.EVT_UPDATE_UI(self
, wx
.ID_REVERT
, self
.ProcessUpdateUIEvent
)
773 wx
.EVT_UPDATE_UI(self
, wx
.ID_SAVE
, self
.ProcessUpdateUIEvent
)
774 wx
.EVT_UPDATE_UI(self
, wx
.ID_SAVEAS
, self
.ProcessUpdateUIEvent
)
775 wx
.EVT_UPDATE_UI(self
, wx
.ID_UNDO
, self
.ProcessUpdateUIEvent
)
776 wx
.EVT_UPDATE_UI(self
, wx
.ID_REDO
, self
.ProcessUpdateUIEvent
)
777 wx
.EVT_UPDATE_UI(self
, wx
.ID_PRINT
, self
.ProcessUpdateUIEvent
)
778 wx
.EVT_UPDATE_UI(self
, wx
.ID_PRINT_SETUP
, self
.ProcessUpdateUIEvent
)
779 wx
.EVT_UPDATE_UI(self
, wx
.ID_PREVIEW
, self
.ProcessUpdateUIEvent
)
780 # End From docview.MDIParentFrame
782 self
.CreateNotebook()
783 self
._InitFrame
(embeddedWindows
, minSize
)
786 def _LayoutFrame(self
):
790 wx
.LayoutAlgorithm().LayoutFrame(self
, self
._notebook
)
793 def CreateNotebook(self
):
795 Creates the notebook to use for the tabbed document interface.
797 if wx
.Platform
!= "__WXMAC__":
798 self
._notebook
= wx
.Notebook(self
, wx
.NewId())
800 self
._notebook
= wx
.Listbook(self
, wx
.NewId(), style
=wx
.LB_LEFT
)
801 # self._notebook.SetSizer(wx.NotebookSizer(self._notebook))
802 if wx
.Platform
!= "__WXMAC__":
803 wx
.EVT_NOTEBOOK_PAGE_CHANGED(self
, self
._notebook
.GetId(), self
.OnNotebookPageChanged
)
805 wx
.EVT_LISTBOOK_PAGE_CHANGED(self
, self
._notebook
.GetId(), self
.OnNotebookPageChanged
)
806 wx
.EVT_RIGHT_DOWN(self
._notebook
, self
.OnNotebookRightClick
)
807 wx
.EVT_MIDDLE_DOWN(self
._notebook
, self
.OnNotebookMiddleClick
)
809 # wxBug: wx.Listbook does not implement HitTest the same way wx.Notebook
810 # does, so for now don't fire MouseOver events.
811 if wx
.Platform
!= "__WXMAC__":
812 wx
.EVT_MOTION(self
._notebook
, self
.OnNotebookMouseOver
)
814 templates
= wx
.GetApp().GetDocumentManager().GetTemplates()
815 iconList
= wx
.ImageList(16, 16, initialCount
= len(templates
))
816 self
._iconIndexLookup
= []
817 for template
in templates
:
818 icon
= template
.GetIcon()
820 if icon
.GetHeight() != 16 or icon
.GetWidth() != 16:
823 if wx
.GetApp().GetDebug():
824 print "Warning: icon for '%s' isn't 16x16, not crossplatform" % template
._docTypeName
825 iconIndex
= iconList
.AddIcon(icon
)
826 self
._iconIndexLookup
.append((template
, iconIndex
))
828 icon
= getBlankIcon()
829 if icon
.GetHeight() != 16 or icon
.GetWidth() != 16:
832 if wx
.GetApp().GetDebug():
833 print "Warning: getBlankIcon isn't 16x16, not crossplatform"
834 self
._blankIconIndex
= iconList
.AddIcon(icon
)
835 self
._notebook
.AssignImageList(iconList
)
838 def GetNotebook(self
):
840 Returns the notebook used by the tabbed document interface.
842 return self
._notebook
845 def GetActiveChild(self
):
847 Returns the active notebook page, which to the framework is treated as
850 index
= self
._notebook
.GetSelection()
853 return self
._notebook
.GetPage(index
)
856 def OnNotebookPageChanged(self
, event
):
858 Activates a notebook page's view when it is selected.
860 index
= self
._notebook
.GetSelection()
862 self
._notebook
.GetPage(index
).GetView().Activate()
865 def OnNotebookMouseOver(self
, event
):
866 # wxBug: On Windows XP the tooltips don't automatically disappear when you move the mouse and it is on a notebook tab, has nothing to do with this code!!!
867 index
, type = self
._notebook
.HitTest(event
.GetPosition())
870 doc
= self
._notebook
.GetPage(index
).GetView().GetDocument()
871 # wxBug: Tooltips no longer appearing on tabs except on
872 # about a 2 pixel area between tab top and contents that will show tip.
873 self
._notebook
.GetParent().SetToolTip(wx
.ToolTip(doc
.GetFilename()))
875 self
._notebook
.SetToolTip(wx
.ToolTip(""))
879 def OnNotebookMiddleClick(self
, event
):
881 Handles middle clicks for the notebook, closing the document whose tab was
884 index
, type = self
._notebook
.HitTest(event
.GetPosition())
886 doc
= self
._notebook
.GetPage(index
).GetView().GetDocument()
890 def OnNotebookRightClick(self
, event
):
892 Handles right clicks for the notebook, enabling users to either close
893 a tab or select from the available documents if the user clicks on the
894 notebook's white space.
896 index
, type = self
._notebook
.HitTest(event
.GetPosition())
898 x
, y
= event
.GetX(), event
.GetY()
900 doc
= self
._notebook
.GetPage(index
).GetView().GetDocument()
902 menu
.Append(id, _("Close"))
903 def OnRightMenuSelect(event
):
905 wx
.EVT_MENU(self
, id, OnRightMenuSelect
)
906 if self
._notebook
.GetPageCount() > 1:
908 menu
.Append(id, _("Close All but \"%s\"" % doc
.GetPrintableName()))
909 def OnRightMenuSelect(event
):
910 for i
in range(self
._notebook
.GetPageCount()-1, -1, -1): # Go from len-1 to 0
912 doc
= self
._notebook
.GetPage(i
).GetView().GetDocument()
913 if not self
.GetDocumentManager().CloseDocument(doc
, False):
915 wx
.EVT_MENU(self
, id, OnRightMenuSelect
)
916 menu
.AppendSeparator()
918 menu
.AppendMenu(wx
.NewId(), _("Select Tab"), tabsMenu
)
920 y
= y
- 25 # wxBug: It is offsetting click events in the blank notebook area
923 if self
._notebook
.GetPageCount() > 1:
925 for i
in range(0, self
._notebook
.GetPageCount()):
928 tabsMenu
.Append(id, self
._notebook
.GetPageText(i
))
929 def OnRightMenuSelect(event
):
930 self
._notebook
.SetSelection(selectIDs
[event
.GetId()])
931 wx
.EVT_MENU(self
, id, OnRightMenuSelect
)
933 self
._notebook
.PopupMenu(menu
, wx
.Point(x
, y
))
937 def AddNotebookPage(self
, panel
, title
):
939 Adds a document page to the notebook.
941 self
._notebook
.AddPage(panel
, title
)
942 index
= self
._notebook
.GetPageCount() - 1
943 self
._notebook
.SetSelection(index
)
945 found
= False # Now set the icon
946 template
= panel
.GetDocument().GetDocumentTemplate()
948 for t
, iconIndex
in self
._iconIndexLookup
:
950 self
._notebook
.SetPageImage(index
, iconIndex
)
954 self
._notebook
.SetPageImage(index
, self
._blankIconIndex
)
956 # wxBug: the wxListbook used on Mac needs its tabs list resized
957 # whenever a new tab is added, but the only way to do this is
958 # to resize the entire control
959 if wx
.Platform
== "__WXMAC__":
960 content_size
= self
._notebook
.GetSize()
961 self
._notebook
.SetSize((content_size
.x
+2, -1))
962 self
._notebook
.SetSize((content_size
.x
, -1))
964 self
._notebook
.Layout()
966 windowMenuService
= wx
.GetApp().GetService(WindowMenuService
)
967 if windowMenuService
:
968 windowMenuService
.BuildWindowMenu(wx
.GetApp().GetTopWindow()) # build file menu list when we open a file
971 def RemoveNotebookPage(self
, panel
):
973 Removes a document page from the notebook.
975 index
= self
.GetNotebookPageIndex(panel
)
977 if self
._notebook
.GetPageCount() == 1 or index
< 2:
980 self
._notebook
.SetSelection(index
- 1)
981 elif index
< self
._notebook
.GetPageCount():
982 self
._notebook
.SetSelection(index
+ 1)
983 self
._notebook
.DeletePage(index
)
984 self
._notebook
.GetParent().SetToolTip(wx
.ToolTip(""))
986 windowMenuService
= wx
.GetApp().GetService(WindowMenuService
)
987 if windowMenuService
:
988 windowMenuService
.BuildWindowMenu(wx
.GetApp().GetTopWindow()) # build file menu list when we open a file
991 def ActivateNotebookPage(self
, panel
):
993 Sets the notebook to the specified panel.
995 index
= self
.GetNotebookPageIndex(panel
)
997 self
._notebook
.SetFocus()
998 self
._notebook
.SetSelection(index
)
1001 def GetNotebookPageTitle(self
, panel
):
1002 index
= self
.GetNotebookPageIndex(panel
)
1004 return self
._notebook
.GetPageText(self
.GetNotebookPageIndex(panel
))
1009 def SetNotebookPageTitle(self
, panel
, title
):
1010 self
._notebook
.SetPageText(self
.GetNotebookPageIndex(panel
), title
)
1013 def GetNotebookPageIndex(self
, panel
):
1015 Returns the index of particular notebook panel.
1018 for i
in range(self
._notebook
.GetPageCount()):
1019 if self
._notebook
.GetPage(i
) == panel
:
1025 def ProcessEvent(self
, event
):
1027 Processes an event, searching event tables and calling zero or more
1028 suitable event handler function(s). Note that the ProcessEvent
1029 method is called from the wxPython docview framework directly since
1030 wxPython does not have a virtual ProcessEvent function.
1032 if wx
.GetApp().ProcessEventBeforeWindows(event
):
1034 if self
._docManager
and self
._docManager
.ProcessEvent(event
):
1036 return DocMDIParentFrameMixIn
.ProcessEvent(self
, event
)
1039 def ProcessUpdateUIEvent(self
, event
):
1041 Processes a UI event, searching event tables and calling zero or more
1042 suitable event handler function(s). Note that the ProcessEvent
1043 method is called from the wxPython docview framework directly since
1044 wxPython does not have a virtual ProcessEvent function.
1046 if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
):
1048 if self
._docManager
and self
._docManager
.ProcessUpdateUIEvent(event
):
1050 return DocMDIParentFrameMixIn
.ProcessUpdateUIEvent(self
, event
)
1053 def OnExit(self
, event
):
1055 Called when File/Exit is chosen and closes the window.
1060 def OnMRUFile(self
, event
):
1062 Opens the appropriate file when it is selected from the file history
1065 n
= event
.GetId() - wx
.ID_FILE1
1066 filename
= self
._docManager
.GetHistoryFile(n
)
1068 self
._docManager
.CreateDocument(filename
, wx
.lib
.docview
.DOC_SILENT
)
1070 self
._docManager
.RemoveFileFromHistory(n
)
1071 msgTitle
= wx
.GetApp().GetAppName()
1073 msgTitle
= _("File Error")
1074 wx
.MessageBox("The file '%s' doesn't exist and couldn't be opened.\nIt has been removed from the most recently used files list" % FileNameFromPath(file),
1076 wx
.OK | wx
.ICON_EXCLAMATION
,
1080 def OnSize(self
, event
):
1082 Called when the frame is resized and lays out the client window.
1084 # Needed in case there are splitpanels around the mdi frame
1088 def OnCloseWindow(self
, event
):
1090 Called when the frame is closed. Remembers the frame size.
1092 self
.SaveEmbeddedWindowSizes()
1094 # save and close services last
1095 for service
in wx
.GetApp().GetServices():
1096 if not service
.OnCloseFrame(event
):
1099 # From docview.MDIParentFrame
1100 if self
._docManager
.Clear(not event
.CanVeto()):
1106 class DocMDIChildFrame(wx
.MDIChildFrame
):
1108 The wxDocMDIChildFrame class provides a default frame for displaying
1109 documents on separate windows. This class can only be used for MDI child
1112 The class is part of the document/view framework supported by wxWindows,
1113 and cooperates with the wxView, wxDocument, wxDocManager and wxDocTemplate
1118 def __init__(self
, doc
, view
, frame
, id, title
, pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
, name
="frame"):
1120 Constructor. Note that the event table must be rebuilt for the
1121 frame since the EvtHandler is not virtual.
1123 wx
.MDIChildFrame
.__init
__(self
, frame
, id, title
, pos
, size
, style
, name
)
1124 self
._childDocument
= doc
1125 self
._childView
= view
1128 # self.Create(doc, view, frame, id, title, pos, size, style, name)
1129 self
._activeEvent
= None
1131 wx
.EVT_ACTIVATE(self
, self
.OnActivate
)
1132 wx
.EVT_CLOSE(self
, self
.OnCloseWindow
)
1134 if frame
: # wxBug: For some reason the EVT_ACTIVATE event is not getting triggered for the first mdi client window that is opened so we have to do it manually
1135 mdiChildren
= filter(lambda x
: isinstance(x
, wx
.MDIChildFrame
), frame
.GetChildren())
1136 if len(mdiChildren
) == 1:
1140 ## # Couldn't get this to work, but seems to work fine with single stage construction
1141 ## def Create(self, doc, view, frame, id, title, pos, size, style, name):
1142 ## self._childDocument = doc
1143 ## self._childView = view
1144 ## if wx.MDIChildFrame.Create(self, frame, id, title, pos, size, style, name):
1146 ## view.SetFrame(self)
1152 def Activate(self
): # Need this in case there are embedded sash windows and such, OnActivate is not getting called
1154 Activates the current view.
1157 self
._childView
.Activate(True)
1160 def OnTitleIsModified(self
):
1162 Add/remove to the frame's title an indication that the document is dirty.
1163 If the document is dirty, an '*' is appended to the title
1165 title
= self
.GetTitle()
1167 if self
.GetDocument().IsModified():
1168 if title
.endswith("*"):
1172 self
.SetTitle(title
)
1174 if title
.endswith("*"):
1176 self
.SetTitle(title
)
1181 def ProcessEvent(event
):
1183 Processes an event, searching event tables and calling zero or more
1184 suitable event handler function(s). Note that the ProcessEvent
1185 method is called from the wxPython docview framework directly since
1186 wxPython does not have a virtual ProcessEvent function.
1188 if self
._activeEvent
== event
:
1191 self
._activeEvent
= event
# Break recursion loops
1194 self
._childView
.Activate(True)
1196 if not self
._childView
or not self
._childView
.ProcessEvent(event
):
1197 if not isinstance(event
, wx
.CommandEvent
) or not self
.GetParent() or not self
.GetParent().ProcessEvent(event
):
1204 self
._activeEvent
= None
1208 def OnActivate(self
, event
):
1210 Sets the currently active view to be the frame's view. You may need to
1211 override (but still call) this function in order to set the keyboard
1212 focus for your subwindow.
1214 if self
._activated
!= 0:
1216 self
._activated
+= 1
1217 wx
.MDIChildFrame
.Activate(self
)
1218 if event
.GetActive() and self
._childView
:
1219 self
._childView
.Activate(event
.GetActive())
1223 def OnCloseWindow(self
, event
):
1225 Closes and deletes the current view and document.
1229 if not event
.CanVeto():
1232 ans
= self
._childView
.Close(deleteWindow
= False)
1235 self
._childView
.Activate(False)
1236 self
._childView
.Destroy()
1237 self
._childView
= None
1238 if self
._childDocument
:
1239 self
._childDocument
.Destroy() # This isn't in the wxWindows codebase but the document needs to be disposed of somehow
1240 self
._childDocument
= None
1248 def GetDocument(self
):
1250 Returns the document associated with this frame.
1252 return self
._childDocument
1255 def SetDocument(self
, document
):
1257 Sets the document for this frame.
1259 self
._childDocument
= document
1264 Returns the view associated with this frame.
1266 return self
._childView
1269 def SetView(self
, view
):
1271 Sets the view for this frame.
1273 self
._childView
= view
1276 class DocService(wx
.EvtHandler
):
1278 An abstract class used to add reusable services to a docview application.
1283 """Initializes the DocService."""
1287 def GetDocumentManager(self
):
1288 """Returns the DocManager for the docview application."""
1289 return self
._docManager
1292 def SetDocumentManager(self
, docManager
):
1293 """Sets the DocManager for the docview application."""
1294 self
._docManager
= docManager
1297 def InstallControls(self
, frame
, menuBar
=None, toolBar
=None, statusBar
=None, document
=None):
1298 """Called to install controls into the menubar and toolbar of a SDI or MDI window. Override this method for a particular service."""
1302 def ProcessEventBeforeWindows(self
, event
):
1304 Processes an event before the main window has a chance to process the window.
1305 Override this method for a particular service.
1310 def ProcessUpdateUIEventBeforeWindows(self
, event
):
1312 Processes a UI event before the main window has a chance to process the window.
1313 Override this method for a particular service.
1318 def ProcessEvent(self
, event
):
1320 Processes an event, searching event tables and calling zero or more
1321 suitable event handler function(s). Note that the ProcessEvent
1322 method is called from the wxPython docview framework directly since
1323 wxPython does not have a virtual ProcessEvent function.
1328 def ProcessUpdateUIEvent(self
, event
):
1330 Processes a UI event, searching event tables and calling zero or more
1331 suitable event handler function(s). Note that the ProcessEvent
1332 method is called from the wxPython docview framework directly since
1333 wxPython does not have a virtual ProcessEvent function.
1338 def OnCloseFrame(self
, event
):
1340 Called when the a docview frame is being closed. Override this method
1341 so a service can either do cleanup or veto the frame being closed by
1349 Called when the the docview application is being closed. Override this method
1350 so a service can either do cleanup or veto the frame being closed by
1356 def GetMenuItemPos(self
, menu
, id):
1358 Utility method used to find the position of a menu item so that services can
1359 easily find where to insert a menu item in InstallControls.
1361 menuItems
= menu
.GetMenuItems()
1362 for i
, menuItem
in enumerate(menuItems
):
1363 if menuItem
.GetId() == id:
1370 Called by WindowMenuService to get views for services that don't
1371 have dedicated documents such as the Outline Service.
1376 class DocOptionsService(DocService
):
1378 A service that implements an options menu item and an options dialog with
1379 notebook tabs. New tabs can be added by other services by calling the
1380 "AddOptionsPanel" method.
1384 def __init__(self
, showGeneralOptions
=True, supportedModes
=wx
.lib
.docview
.DOC_SDI
& wx
.lib
.docview
.DOC_MDI
):
1386 Initializes the options service with the option of suppressing the default
1387 general options pane that is included with the options service by setting
1388 showGeneralOptions to False. It allowModeChanges is set to False, the
1389 default general options pane will allow users to change the document
1390 interface mode between SDI and MDI modes.
1392 DocService
.__init
__(self
)
1393 self
.ClearOptionsPanels()
1394 self
._supportedModes
= supportedModes
1395 self
._toolOptionsID
= wx
.ID_PREFERENCES
1396 if showGeneralOptions
:
1397 self
.AddOptionsPanel(GeneralOptionsPanel
)
1400 def InstallControls(self
, frame
, menuBar
=None, toolBar
=None, statusBar
=None, document
=None):
1402 Installs a "Tools" menu with an "Options" menu item.
1404 toolsMenuIndex
= menuBar
.FindMenu(_("&Tools"))
1405 if toolsMenuIndex
> -1:
1406 toolsMenu
= menuBar
.GetMenu(toolsMenuIndex
)
1408 toolsMenu
= wx
.Menu()
1409 if toolsMenuIndex
== -1:
1410 formatMenuIndex
= menuBar
.FindMenu(_("&Format"))
1411 menuBar
.Insert(formatMenuIndex
+ 1, toolsMenu
, _("&Tools"))
1413 if toolsMenu
.GetMenuItemCount():
1414 toolsMenu
.AppendSeparator()
1415 toolsMenu
.Append(self
._toolOptionsID
, _("&Options..."), _("Sets options"))
1416 wx
.EVT_MENU(frame
, self
._toolOptionsID
, frame
.ProcessEvent
)
1419 def ProcessEvent(self
, event
):
1421 Checks to see if the "Options" menu item has been selected.
1424 if id == self
._toolOptionsID
:
1425 self
.OnOptions(event
)
1431 def GetSupportedModes(self
):
1433 Return the modes supported by the application. Use docview.DOC_SDI and
1434 docview.DOC_MDI flags to check if SDI and/or MDI modes are supported.
1436 return self
._supportedModes
1439 def SetSupportedModes(self
, _supportedModessupportedModes
):
1441 Sets the modes supported by the application. Use docview.DOC_SDI and
1442 docview.DOC_MDI flags to set if SDI and/or MDI modes are supported.
1444 self
._supportedModes
= supportedModes
1447 def ClearOptionsPanels(self
):
1449 Clears all of the options panels that have been added into the
1452 self
._optionsPanels
= []
1455 def AddOptionsPanel(self
, optionsPanel
):
1457 Adds an options panel to the options dialog.
1459 self
._optionsPanels
.append(optionsPanel
)
1462 def OnOptions(self
, event
):
1464 Shows the options dialog, called when the "Options" menu item is selected.
1466 if len(self
._optionsPanels
) == 0:
1468 optionsDialog
= OptionsDialog(wx
.GetApp().GetTopWindow(), self
._optionsPanels
, self
._docManager
)
1469 optionsDialog
.CenterOnParent()
1470 if optionsDialog
.ShowModal() == wx
.ID_OK
:
1471 optionsDialog
.OnOK(optionsDialog
) # wxBug: wxDialog should be calling this automatically but doesn't
1472 optionsDialog
.Destroy()
1475 class OptionsDialog(wx
.Dialog
):
1477 A default options dialog used by the OptionsService that hosts a notebook
1478 tab of options panels.
1482 def __init__(self
, parent
, optionsPanelClasses
, docManager
):
1484 Initializes the options dialog with a notebook page that contains new
1485 instances of the passed optionsPanelClasses.
1487 wx
.Dialog
.__init
__(self
, parent
, -1, _("Options"))
1489 self
._optionsPanels
= []
1490 self
._docManager
= docManager
1495 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
1497 if wx
.Platform
== "__WXMAC__":
1498 optionsNotebook
= wx
.Listbook(self
, wx
.NewId(), style
=wx
.LB_DEFAULT
)
1500 optionsNotebook
= wx
.Notebook(self
, wx
.NewId(), style
=wx
.NB_MULTILINE
) # NB_MULTILINE is windows platform only
1501 sizer
.Add(optionsNotebook
, 0, wx
.ALL | wx
.EXPAND
, SPACE
)
1503 if wx
.Platform
== "__WXMAC__":
1504 iconList
= wx
.ImageList(16, 16, initialCount
= len(optionsPanelClasses
))
1505 self
._iconIndexLookup
= []
1507 for optionsPanelClass
in optionsPanelClasses
:
1508 optionsPanel
= optionsPanelClass(optionsNotebook
, -1)
1509 self
._optionsPanels
.append(optionsPanel
)
1511 # We need to populate the image list before setting notebook images
1512 if hasattr(optionsPanel
, "GetIcon"):
1513 icon
= optionsPanel
.GetIcon()
1517 if icon
.GetHeight() != 16 or icon
.GetWidth() != 16:
1520 if wx
.GetApp().GetDebug():
1521 print "Warning: icon for '%s' isn't 16x16, not crossplatform" % template
._docTypeName
1522 iconIndex
= iconList
.AddIcon(icon
)
1523 self
._iconIndexLookup
.append((optionsPanel
, iconIndex
))
1526 # use -1 to represent that this panel has no icon
1527 self
._iconIndexLookup
.append((optionsPanel
, -1))
1529 optionsNotebook
.AssignImageList(iconList
)
1531 # Add icons to notebook
1532 for index
in range(0, len(optionsPanelClasses
)-1):
1533 iconIndex
= self
._iconIndexLookup
[index
][1]
1535 optionsNotebook
.SetPageImage(index
, iconIndex
)
1537 for optionsPanelClass
in optionsPanelClasses
:
1538 optionsPanel
= optionsPanelClass(optionsNotebook
, -1)
1539 self
._optionsPanels
.append(optionsPanel
)
1541 sizer
.Add(self
.CreateButtonSizer(wx
.OK | wx
.CANCEL
), 0, wx
.ALIGN_RIGHT | wx
.RIGHT | wx
.BOTTOM
, HALF_SPACE
)
1542 self
.SetSizer(sizer
)
1545 wx
.CallAfter(self
.DoRefresh
)
1548 def DoRefresh(self
):
1550 wxBug: On Windows XP when using a multiline notebook the default page doesn't get
1551 drawn, but it works when using a single line notebook.
1556 def GetDocManager(self
):
1558 Returns the document manager passed to the OptionsDialog constructor.
1560 return self
._docManager
1563 def OnOK(self
, event
):
1565 Calls the OnOK method of all of the OptionDialog's embedded panels
1567 for optionsPanel
in self
._optionsPanels
:
1568 optionsPanel
.OnOK(event
)
1571 class GeneralOptionsPanel(wx
.Panel
):
1573 A general options panel that is used in the OptionDialog to configure the
1574 generic properties of a pydocview application, such as "show tips at startup"
1575 and whether to use SDI or MDI for the application.
1579 def __init__(self
, parent
, id):
1581 Initializes the panel by adding an "Options" folder tab to the parent notebook and
1582 populating the panel with the generic properties of a pydocview application.
1584 wx
.Panel
.__init
__(self
, parent
, id)
1587 config
= wx
.ConfigBase_Get()
1588 self
._showTipsCheckBox
= wx
.CheckBox(self
, -1, _("Show tips at start up"))
1589 self
._showTipsCheckBox
.SetValue(config
.ReadInt("ShowTipAtStartup", True))
1590 if self
._AllowModeChanges
():
1591 supportedModes
= wx
.GetApp().GetService(DocOptionsService
).GetSupportedModes()
1593 self
._sdiChoice
= _("Show each document in its own window")
1594 self
._mdiChoice
= _("Show all documents in a single window with tabs")
1595 self
._winMdiChoice
= _("Show all documents in a single window with child windows")
1596 if supportedModes
& wx
.lib
.docview
.DOC_SDI
:
1597 choices
.append(self
._sdiChoice
)
1598 choices
.append(self
._mdiChoice
)
1599 if wx
.Platform
== "__WXMSW__":
1600 choices
.append(self
._winMdiChoice
)
1601 self
._documentRadioBox
= wx
.RadioBox(self
, -1, _("Document Display Style"),
1605 if config
.ReadInt("UseWinMDI", False):
1606 self
._documentRadioBox
.SetStringSelection(self
._winMdiChoice
)
1607 elif config
.ReadInt("UseMDI", True):
1608 self
._documentRadioBox
.SetStringSelection(self
._mdiChoice
)
1610 self
._documentRadioBox
.SetStringSelection(self
._sdiChoice
)
1611 def OnDocumentInterfaceSelect(event
):
1612 if not self
._documentInterfaceMessageShown
:
1613 msgTitle
= wx
.GetApp().GetAppName()
1615 msgTitle
= _("Document Options")
1616 wx
.MessageBox(_("Document interface changes will not appear until the application is restarted."),
1618 wx
.OK | wx
.ICON_INFORMATION
,
1620 self
._documentInterfaceMessageShown
= True
1621 wx
.EVT_RADIOBOX(self
, self
._documentRadioBox
.GetId(), OnDocumentInterfaceSelect
)
1622 optionsBorderSizer
= wx
.BoxSizer(wx
.VERTICAL
)
1623 optionsSizer
= wx
.BoxSizer(wx
.VERTICAL
)
1624 if self
._AllowModeChanges
():
1625 optionsSizer
.Add(self
._documentRadioBox
, 0, wx
.ALL
, HALF_SPACE
)
1626 optionsSizer
.Add(self
._showTipsCheckBox
, 0, wx
.ALL
, HALF_SPACE
)
1627 optionsBorderSizer
.Add(optionsSizer
, 0, wx
.ALL
, SPACE
)
1628 self
.SetSizer(optionsBorderSizer
)
1630 self
._documentInterfaceMessageShown
= False
1631 parent
.AddPage(self
, _("General"))
1634 def _AllowModeChanges(self
):
1635 supportedModes
= wx
.GetApp().GetService(DocOptionsService
).GetSupportedModes()
1636 return supportedModes
& wx
.lib
.docview
.DOC_SDI
and supportedModes
& wx
.lib
.docview
.DOC_MDI
or wx
.Platform
== "__WXMSW__" and supportedModes
& wx
.lib
.docview
.DOC_MDI
# More than one mode is supported, allow selection
1639 def OnOK(self
, optionsDialog
):
1641 Updates the config based on the selections in the options panel.
1643 config
= wx
.ConfigBase_Get()
1644 config
.WriteInt("ShowTipAtStartup", self
._showTipsCheckBox
.GetValue())
1645 if self
._AllowModeChanges
():
1646 config
.WriteInt("UseMDI", (self
._documentRadioBox
.GetStringSelection() == self
._mdiChoice
))
1647 config
.WriteInt("UseWinMDI", (self
._documentRadioBox
.GetStringSelection() == self
._winMdiChoice
))
1651 """ Return icon for options panel on the Mac. """
1652 return wx
.GetApp().GetDefaultIcon()
1655 class DocApp(wx
.PySimpleApp
):
1657 The DocApp class serves as the base class for pydocview applications and offers
1658 functionality such as services, creation of SDI and MDI frames, show tips,
1659 and a splash screen.
1665 Initializes the DocApp.
1668 self
._defaultIcon
= None
1669 self
._registeredCloseEvent
= False
1670 self
._useTabbedMDI
= True
1672 if not hasattr(self
, "_debug"): # only set if not already initialized
1674 if not hasattr(self
, "_singleInstance"): # only set if not already initialized
1675 self
._singleInstance
= True
1677 # if _singleInstance is TRUE only allow one single instance of app to run.
1678 # When user tries to run a second instance of the app, abort startup,
1679 # But if user also specifies files to open in command line, send message to running app to open those files
1680 if self
._singleInstance
:
1681 # create shared memory temporary file
1682 if wx
.Platform
== '__WXMSW__':
1683 tfile
= tempfile
.TemporaryFile(prefix
="ag", suffix
="tmp")
1684 fno
= tfile
.fileno()
1685 self
._sharedMemory
= mmap
.mmap(fno
, 1024, "shared_memory")
1687 tfile
= file(os
.path
.join(tempfile
.gettempdir(), tempfile
.gettempprefix() + self
.GetAppName() + '-' + wx
.GetUserId() + "AGSharedMemory"), 'w+b')
1692 fno
= tfile
.fileno()
1693 self
._sharedMemory
= mmap
.mmap(fno
, 1024)
1695 self
._singleInstanceChecker
= wx
.SingleInstanceChecker(self
.GetAppName() + '-' + wx
.GetUserId(), tempfile
.gettempdir())
1696 if self
._singleInstanceChecker
.IsAnotherRunning():
1697 # have running single instance open file arguments
1698 data
= pickle
.dumps(sys
.argv
[1:])
1700 self
._sharedMemory
.seek(0)
1701 marker
= self
._sharedMemory
.read_byte()
1702 if marker
== '\0' or marker
== '*': # available buffer
1703 self
._sharedMemory
.seek(0)
1704 self
._sharedMemory
.write_byte('-') # set writing marker
1705 self
._sharedMemory
.write(data
) # write files we tried to open to shared memory
1706 self
._sharedMemory
.seek(0)
1707 self
._sharedMemory
.write_byte('+') # set finished writing marker
1708 self
._sharedMemory
.flush()
1711 time
.sleep(1) # give enough time for buffer to be available
1715 self
._timer
= wx
.PyTimer(self
.DoBackgroundListenAndLoad
)
1716 self
._timer
.Start(250)
1721 def OpenMainFrame(self
):
1722 docManager
= self
.GetDocumentManager()
1723 if docManager
.GetFlags() & wx
.lib
.docview
.DOC_MDI
:
1724 if self
.GetUseTabbedMDI():
1725 frame
= wx
.lib
.pydocview
.DocTabbedParentFrame(docManager
, None, -1, self
.GetAppName())
1727 frame
= wx
.lib
.pydocview
.DocMDIParentFrame(docManager
, None, -1, self
.GetAppName())
1730 def MacOpenFile(self
, filename
):
1731 self
.GetDocumentManager().CreateDocument(os
.path
.normpath(filename
), wx
.lib
.docview
.DOC_SILENT
)
1733 # force display of running app
1734 topWindow
= wx
.GetApp().GetTopWindow()
1735 if topWindow
.IsIconized():
1736 topWindow
.Iconize(False)
1740 def DoBackgroundListenAndLoad(self
):
1742 Open any files specified in the given command line argument passed in via shared memory
1746 self
._sharedMemory
.seek(0)
1747 if self
._sharedMemory
.read_byte() == '+': # available data
1748 data
= self
._sharedMemory
.read(1024-1)
1749 self
._sharedMemory
.seek(0)
1750 self
._sharedMemory
.write_byte("*") # finished reading, set buffer free marker
1751 self
._sharedMemory
.flush()
1752 args
= pickle
.loads(data
)
1754 if (wx
.Platform
!= "__WXMSW__" or arg
[0] != "/") and arg
[0] != '-' and os
.path
.exists(arg
):
1755 self
.GetDocumentManager().CreateDocument(os
.path
.normpath(arg
), wx
.lib
.docview
.DOC_SILENT
)
1757 # force display of running app
1758 topWindow
= wx
.GetApp().GetTopWindow()
1759 if topWindow
.IsIconized():
1760 topWindow
.Iconize(False)
1765 self
._timer
.Start(1000) # 1 second interval
1768 def OpenCommandLineArgs(self
):
1770 Called to open files that have been passed to the application from the
1775 if (wx
.Platform
!= "__WXMSW__" or arg
[0] != "/") and arg
[0] != '-' and os
.path
.exists(arg
):
1776 self
.GetDocumentManager().CreateDocument(os
.path
.normpath(arg
), wx
.lib
.docview
.DOC_SILENT
)
1779 def GetDocumentManager(self
):
1781 Returns the document manager associated to the DocApp.
1783 return self
._docManager
1786 def SetDocumentManager(self
, docManager
):
1788 Sets the document manager associated with the DocApp and loads the
1789 DocApp's file history into the document manager.
1791 self
._docManager
= docManager
1792 config
= wx
.ConfigBase_Get()
1793 self
.GetDocumentManager().FileHistoryLoad(config
)
1796 def ProcessEventBeforeWindows(self
, event
):
1798 Enables services to process an event before the main window has a chance to
1801 for service
in self
._services
:
1802 if service
.ProcessEventBeforeWindows(event
):
1807 def ProcessUpdateUIEventBeforeWindows(self
, event
):
1809 Enables services to process a UI event before the main window has a chance
1810 to process the window.
1812 for service
in self
._services
:
1813 if service
.ProcessUpdateUIEventBeforeWindows(event
):
1818 def ProcessEvent(self
, event
):
1820 Processes an event, searching event tables and calling zero or more
1821 suitable event handler function(s). Note that the ProcessEvent
1822 method is called from the wxPython docview framework directly since
1823 wxPython does not have a virtual ProcessEvent function.
1825 for service
in self
._services
:
1826 if service
.ProcessEvent(event
):
1831 def ProcessUpdateUIEvent(self
, event
):
1833 Processes a UI event, searching event tables and calling zero or more
1834 suitable event handler function(s). Note that the ProcessEvent
1835 method is called from the wxPython docview framework directly since
1836 wxPython does not have a virtual ProcessEvent function.
1838 for service
in self
._services
:
1839 if service
.ProcessUpdateUIEvent(event
):
1844 def InstallService(self
, service
):
1846 Installs an instance of a DocService into the DocApp.
1848 service
.SetDocumentManager(self
._docManager
)
1849 self
._services
.append(service
)
1853 def GetServices(self
):
1855 Returns the DocService instances that have been installed into the DocApp.
1857 return self
._services
1860 def GetService(self
, type):
1862 Returns the instance of a particular type of service that has been installed
1863 into the DocApp. For example, "wx.GetApp().GetService(pydocview.OptionsService)"
1864 returns the isntance of the OptionsService that is running within the DocApp.
1866 for service
in self
._services
:
1867 if isinstance(service
, type):
1874 Called when the DocApp is exited, enables the installed DocServices to exit
1875 and saves the DocManager's file history.
1877 for service
in self
._services
:
1879 config
= wx
.ConfigBase_Get()
1880 self
._docManager
.FileHistorySave(config
)
1882 if hasattr(self
, "_singleInstanceChecker"):
1883 del self
._singleInstanceChecker
1886 def GetDefaultDocManagerFlags(self
):
1888 Returns the default flags to use when creating the DocManager.
1890 config
= wx
.ConfigBase_Get()
1891 if config
.ReadInt("UseMDI", True) or config
.ReadInt("UseWinMDI", False):
1892 flags
= wx
.lib
.docview
.DOC_MDI | wx
.lib
.docview
.DOC_OPEN_ONCE
1893 if config
.ReadInt("UseWinMDI", False):
1894 self
.SetUseTabbedMDI(False)
1896 flags
= wx
.lib
.docview
.DOC_SDI | wx
.lib
.docview
.DOC_OPEN_ONCE
1900 def ShowTip(self
, frame
, tipProvider
):
1902 Shows the tip window, generally this is called when an application starts.
1903 A wx.TipProvider must be passed.
1905 config
= wx
.ConfigBase_Get()
1906 showTip
= config
.ReadInt("ShowTipAtStartup", 1)
1908 index
= config
.ReadInt("TipIndex", 0)
1909 showTipResult
= wx
.ShowTip(wx
.GetApp().GetTopWindow(), tipProvider
, showAtStartup
= showTip
)
1910 if showTipResult
!= showTip
:
1911 config
.WriteInt("ShowTipAtStartup", showTipResult
)
1914 def GetEditMenu(self
, frame
):
1916 Utility method that finds the Edit menu within the menubar of a frame.
1918 menuBar
= frame
.GetMenuBar()
1921 editMenuIndex
= menuBar
.FindMenu(_("&Edit"))
1922 if editMenuIndex
== -1:
1924 return menuBar
.GetMenu(editMenuIndex
)
1927 def GetUseTabbedMDI(self
):
1929 Returns True if Windows MDI should use folder tabs instead of child windows.
1931 return self
._useTabbedMDI
1934 def SetUseTabbedMDI(self
, useTabbedMDI
):
1936 Set to True if Windows MDI should use folder tabs instead of child windows.
1938 self
._useTabbedMDI
= useTabbedMDI
1941 def CreateDocumentFrame(self
, view
, doc
, flags
, id = -1, title
= "", pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
):
1943 Called by the DocManager to create and return a new Frame for a Document.
1944 Chooses whether to create an MDIChildFrame or SDI Frame based on the
1947 docflags
= self
.GetDocumentManager().GetFlags()
1948 if docflags
& wx
.lib
.docview
.DOC_SDI
:
1949 frame
= self
.CreateSDIDocumentFrame(doc
, view
, id, title
, pos
, size
, style
)
1952 # wxBug: operating system bug, first window is set to the position of last window closed, ignoring passed in position on frame creation
1953 # also, initial size is incorrect for the same reasons
1954 if frame
.GetPosition() != pos
:
1956 if frame
.GetSize() != size
:
1959 if doc
and doc
.GetCommandProcessor():
1960 doc
.GetCommandProcessor().SetEditMenu(self
.GetEditMenu(frame
))
1961 elif docflags
& wx
.lib
.docview
.DOC_MDI
:
1962 if self
.GetUseTabbedMDI():
1963 frame
= self
.CreateTabbedDocumentFrame(doc
, view
, id, title
, pos
, size
, style
)
1965 frame
= self
.CreateMDIDocumentFrame(doc
, view
, id, title
, pos
, size
, style
)
1967 if doc
.GetDocumentTemplate().GetIcon():
1968 frame
.SetIcon(doc
.GetDocumentTemplate().GetIcon())
1969 elif wx
.GetApp().GetTopWindow().GetIcon():
1970 frame
.SetIcon(wx
.GetApp().GetTopWindow().GetIcon())
1971 if doc
and doc
.GetCommandProcessor():
1972 doc
.GetCommandProcessor().SetEditMenu(self
.GetEditMenu(wx
.GetApp().GetTopWindow()))
1973 if not frame
.GetIcon() and self
._defaultIcon
:
1974 frame
.SetIcon(self
.GetDefaultIcon())
1975 view
.SetFrame(frame
)
1979 def CreateSDIDocumentFrame(self
, doc
, view
, id=-1, title
="", pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
):
1981 Creates and returns an SDI Document Frame.
1983 frame
= DocSDIFrame(doc
, view
, None, id, title
, pos
, size
, style
)
1987 def CreateTabbedDocumentFrame(self
, doc
, view
, id=-1, title
="", pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
):
1989 Creates and returns an MDI Document Frame for a Tabbed MDI view
1991 frame
= DocTabbedChildFrame(doc
, view
, wx
.GetApp().GetTopWindow(), id, title
, pos
, size
, style
)
1995 def CreateMDIDocumentFrame(self
, doc
, view
, id=-1, title
="", pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
):
1997 Creates and returns an MDI Document Frame.
1999 # if any child windows are maximized, then user must want any new children maximized
2000 # if no children exist, then use the default value from registry
2001 # wxBug: Only current window is maximized, so need to check every child frame
2002 parentFrame
= wx
.GetApp().GetTopWindow()
2003 childrenMaximized
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
) and child
.IsMaximized(), parentFrame
.GetChildren())
2004 if childrenMaximized
:
2007 children
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), parentFrame
.GetChildren())
2009 # other windows exist and none are maximized
2012 # get default setting from registry
2013 maximize
= wx
.ConfigBase_Get().ReadInt("MDIChildFrameMaximized", False)
2015 frame
= wx
.lib
.docview
.DocMDIChildFrame(doc
, view
, wx
.GetApp().GetTopWindow(), id, title
, pos
, size
, style
)
2016 if maximize
: # wxBug: Should already be maximizing new child frames if one is maximized but it's not so we have to force it to
2017 frame
.Maximize(True)
2019 ## wx.EVT_MAXIMIZE(frame, self.OnMaximize) # wxBug: This doesn't work, need to save MDIChildFrameMaximized state on close of windows instead
2020 wx
.EVT_CLOSE(frame
, self
.OnCloseChildWindow
)
2021 if not self
._registeredCloseEvent
:
2022 wx
.EVT_CLOSE(parentFrame
, self
.OnCloseMainWindow
) # need to check on this, but only once
2023 self
._registeredCloseEvent
= True
2028 def SaveMDIDocumentFrameMaximizedState(self
, maximized
):
2030 Remember in the config whether the MDI Frame is maximized so that it can be restored
2033 config
= wx
.ConfigBase_Get()
2034 maximizeFlag
= config
.ReadInt("MDIChildFrameMaximized", False)
2035 if maximized
!= maximizeFlag
:
2036 config
.WriteInt("MDIChildFrameMaximized", maximized
)
2039 def OnCloseChildWindow(self
, event
):
2041 Called when an MDI Child Frame is closed. Calls SaveMDIDocumentFrameMaximizedState to
2042 remember whether the MDI Frame is maximized so that it can be restored on open.
2044 self
.SaveMDIDocumentFrameMaximizedState(event
.GetEventObject().IsMaximized())
2048 def OnCloseMainWindow(self
, event
):
2050 Called when the MDI Parent Frame is closed. Remembers whether the MDI Parent Frame is
2053 children
= event
.GetEventObject().GetChildren()
2054 childrenMaximized
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
)and child
.IsMaximized(), children
)
2055 if childrenMaximized
:
2056 self
.SaveMDIDocumentFrameMaximizedState(True)
2058 childrenNotMaximized
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), children
)
2060 if childrenNotMaximized
:
2061 # other windows exist and none are maximized
2062 self
.SaveMDIDocumentFrameMaximizedState(False)
2067 def GetDefaultIcon(self
):
2069 Returns the application's default icon.
2071 return self
._defaultIcon
2074 def SetDefaultIcon(self
, icon
):
2076 Sets the application's default icon.
2078 self
._defaultIcon
= icon
2083 Returns True if the application is in debug mode.
2088 def SetDebug(self
, debug
):
2090 Sets the application's debug mode.
2095 def GetSingleInstance(self
):
2097 Returns True if the application is in single instance mode. Used to determine if multiple instances of the application is allowed to launch.
2099 return self
._singleInstance
2102 def SetSingleInstance(self
, singleInstance
):
2104 Sets application's single instance mode.
2106 self
._singleInstance
= singleInstance
2110 def CreateChildDocument(self
, parentDocument
, documentType
, objectToEdit
, path
=''):
2112 Creates a child window of a document that edits an object. The child window
2113 is managed by the parent document frame, so it will be prompted to close if its
2114 parent is closed, etc. Child Documents are useful when there are complicated
2115 Views of a Document and users will need to tunnel into the View.
2117 for document
in self
.GetDocumentManager().GetDocuments()[:]: # Cloning list to make sure we go through all docs even as they are deleted
2118 if isinstance(document
, ChildDocument
) and document
.GetParentDocument() == parentDocument
:
2119 if document
.GetData() == objectToEdit
:
2120 if hasattr(document
.GetFirstView().GetFrame(), "SetFocus"):
2121 document
.GetFirstView().GetFrame().SetFocus()
2123 for temp
in wx
.GetApp().GetDocumentManager().GetTemplates():
2124 if temp
.GetDocumentType() == documentType
:
2127 newDoc
= temp
.CreateDocument(path
, 0, data
= objectToEdit
, parentDocument
= parentDocument
)
2128 newDoc
.SetDocumentName(temp
.GetDocumentName())
2129 newDoc
.SetDocumentTemplate(temp
)
2131 newDoc
.OnNewDocument()
2133 if not newDoc
.OnOpenDocument(path
):
2134 newDoc
.DeleteAllViews() # Implicitly deleted by DeleteAllViews
2139 def CloseChildDocuments(self
, parentDocument
):
2141 Closes the child windows of a Document.
2143 for document
in self
.GetDocumentManager().GetDocuments()[:]: # Cloning list to make sure we go through all docs even as they are deleted
2144 if isinstance(document
, ChildDocument
) and document
.GetParentDocument() == parentDocument
:
2145 if document
.GetFirstView().GetFrame():
2146 document
.GetFirstView().GetFrame().SetFocus()
2147 if not document
.GetFirstView().OnClose():
2154 Returns True if the application is in MDI mode.
2156 return self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_MDI
2161 Returns True if the application is in SDI mode.
2163 return self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
2166 def ShowSplash(self
, image
):
2168 Shows a splash window with the given image. Input parameter 'image' can either be a wx.Bitmap or a filename.
2170 if isinstance(image
, wx
.Bitmap
):
2173 splash_bmp
= wx
.Image(image
).ConvertToBitmap()
2174 self
._splash
= wx
.SplashScreen(splash_bmp
, wx
.SPLASH_CENTRE_ON_SCREEN|wx
.SPLASH_NO_TIMEOUT
, 0, None, -1, style
=wx
.SIMPLE_BORDER|wx
.FRAME_NO_TASKBAR
)
2178 def CloseSplash(self
):
2180 Closes the splash window.
2183 self
._splash
.Close(True)
2186 class _DocFrameFileDropTarget(wx
.FileDropTarget
):
2188 Class used to handle drops into the document frame.
2191 def __init__(self
, docManager
, docFrame
):
2193 Initializes the FileDropTarget class with the active docManager and the docFrame.
2195 wx
.FileDropTarget
.__init
__(self
)
2196 self
._docManager
= docManager
2197 self
._docFrame
= docFrame
2200 def OnDropFiles(self
, x
, y
, filenames
):
2202 Called when files are dropped in the drop target and tells the docManager to open
2206 for file in filenames
:
2207 self
._docManager
.CreateDocument(file, wx
.lib
.docview
.DOC_SILENT
)
2209 msgTitle
= wx
.GetApp().GetAppName()
2211 msgTitle
= _("File Error")
2212 wx
.MessageBox("Could not open '%s'. '%s'" % (wx
.lib
.docview
.FileNameFromPath(file), sys
.exc_value
),
2214 wx
.OK | wx
.ICON_EXCLAMATION
,
2215 self
._docManager
.FindSuitableParent())
2218 class DocMDIParentFrame(wx
.lib
.docview
.DocMDIParentFrame
, DocFrameMixIn
, DocMDIParentFrameMixIn
):
2220 The DocMDIParentFrame is the primary frame which the DocApp uses to host MDI child windows. It offers
2221 features such as a default menubar, toolbar, and status bar, and a mechanism to manage embedded windows
2222 on the edges of the DocMDIParentFrame.
2226 def __init__(self
, docManager
, parent
, id, title
, pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
, name
="DocMDIFrame", embeddedWindows
=0, minSize
=20):
2228 Initializes the DocMDIParentFrame with the default menubar, toolbar, and status bar. Use the
2229 optional embeddedWindows parameter with the embedded window constants to create embedded
2230 windows around the edges of the DocMDIParentFrame.
2232 pos
, size
= self
._GetPosSizeFromConfig
(pos
, size
)
2233 wx
.lib
.docview
.DocMDIParentFrame
.__init
__(self
, docManager
, parent
, id, title
, pos
, size
, style
, name
)
2234 self
._InitFrame
(embeddedWindows
, minSize
)
2237 def _LayoutFrame(self
):
2241 wx
.LayoutAlgorithm().LayoutMDIFrame(self
)
2242 self
.GetClientWindow().Refresh()
2245 def ProcessEvent(self
, event
):
2247 Processes an event, searching event tables and calling zero or more
2248 suitable event handler function(s). Note that the ProcessEvent
2249 method is called from the wxPython docview framework directly since
2250 wxPython does not have a virtual ProcessEvent function.
2252 if wx
.GetApp().ProcessEventBeforeWindows(event
):
2254 if wx
.lib
.docview
.DocMDIParentFrame
.ProcessEvent(self
, event
):
2256 return DocMDIParentFrameMixIn
.ProcessEvent(self
, event
)
2259 def ProcessUpdateUIEvent(self
, event
):
2261 Processes a UI event, searching event tables and calling zero or more
2262 suitable event handler function(s). Note that the ProcessEvent
2263 method is called from the wxPython docview framework directly since
2264 wxPython does not have a virtual ProcessEvent function.
2266 if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
):
2268 if wx
.lib
.docview
.DocMDIParentFrame
.ProcessUpdateUIEvent(self
, event
): # Let the views handle the event before the services
2270 if event
.GetId() == wx
.ID_ABOUT
: # Using ID_ABOUT to update the window menu, the window menu items are not triggering
2271 self
.UpdateWindowMenu()
2273 return DocMDIParentFrameMixIn
.ProcessUpdateUIEvent(self
, event
)
2276 def UpdateWindowMenu(self
):
2278 Updates the WindowMenu on Windows platforms.
2280 if wx
.Platform
== '__WXMSW__':
2281 children
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), self
.GetChildren())
2282 windowCount
= len(children
)
2283 hasWindow
= windowCount
>= 1
2284 has2OrMoreWindows
= windowCount
>= 2
2286 windowMenu
= self
.GetWindowMenu()
2288 windowMenu
.Enable(wx
.IDM_WINDOWTILE
, hasWindow
)
2289 windowMenu
.Enable(wx
.IDM_WINDOWTILEHOR
, hasWindow
)
2290 windowMenu
.Enable(wx
.IDM_WINDOWCASCADE
, hasWindow
)
2291 windowMenu
.Enable(wx
.IDM_WINDOWICONS
, hasWindow
)
2292 windowMenu
.Enable(wx
.IDM_WINDOWTILEVERT
, hasWindow
)
2293 wx
.IDM_WINDOWPREV
= 4006 # wxBug: Not defined for some reason
2294 windowMenu
.Enable(wx
.IDM_WINDOWPREV
, has2OrMoreWindows
)
2295 windowMenu
.Enable(wx
.IDM_WINDOWNEXT
, has2OrMoreWindows
)
2299 def OnSize(self
, event
):
2301 Called when the DocMDIParentFrame is resized and lays out the MDI client window.
2303 # Needed in case there are splitpanels around the mdi frame
2307 def OnCloseWindow(self
, event
):
2309 Called when the DocMDIParentFrame is closed. Remembers the frame size.
2311 self
.SaveEmbeddedWindowSizes()
2313 # save and close services last.
2314 for service
in wx
.GetApp().GetServices():
2315 if not service
.OnCloseFrame(event
):
2318 # save and close documents
2319 # documents with a common view, e.g. project view, should save the document, but not close the window
2320 # and let the service close the window.
2321 wx
.lib
.docview
.DocMDIParentFrame
.OnCloseWindow(self
, event
)
2324 class DocSDIFrame(wx
.lib
.docview
.DocChildFrame
, DocFrameMixIn
):
2326 The DocSDIFrame host DocManager Document windows. It offers features such as a default menubar,
2327 toolbar, and status bar.
2331 def __init__(self
, doc
, view
, parent
, id, title
, pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
, name
="DocSDIFrame"):
2333 Initializes the DocSDIFrame with the default menubar, toolbar, and status bar.
2335 wx
.lib
.docview
.DocChildFrame
.__init
__(self
, doc
, view
, parent
, id, title
, pos
, size
, style
, name
)
2336 self
._fileMenu
= None
2338 self
._docManager
= doc
.GetDocumentManager()
2340 self
._docManager
= None
2341 self
.SetDropTarget(_DocFrameFileDropTarget(self
._docManager
, self
))
2343 wx
.EVT_MENU(self
, wx
.ID_ABOUT
, self
.OnAbout
)
2344 wx
.EVT_MENU(self
, wx
.ID_EXIT
, self
.OnExit
)
2345 wx
.EVT_MENU_RANGE(self
, wx
.ID_FILE1
, wx
.ID_FILE9
, self
.OnMRUFile
)
2347 self
.InitializePrintData()
2349 menuBar
= self
.CreateDefaultMenuBar(sdi
=True)
2350 toolBar
= self
.CreateDefaultToolBar()
2351 self
.SetToolBar(toolBar
)
2352 statusBar
= self
.CreateDefaultStatusBar()
2354 for service
in wx
.GetApp().GetServices():
2355 service
.InstallControls(self
, menuBar
= menuBar
, toolBar
= toolBar
, statusBar
= statusBar
, document
= doc
)
2357 self
.SetMenuBar(menuBar
) # wxBug: Need to do this in SDI to mimic MDI... because have to set the menubar at the very end or the automatic MDI "window" menu doesn't get put in the right place when the services add new menus to the menubar
2360 def _LayoutFrame(self
):
2367 def OnExit(self
, event
):
2369 Called when the application is exitting.
2371 if self
._childView
.GetDocumentManager().Clear(force
= False):
2377 def OnMRUFile(self
, event
):
2379 Opens the appropriate file when it is selected from the file history
2382 n
= event
.GetId() - wx
.ID_FILE1
2383 filename
= self
._docManager
.GetHistoryFile(n
)
2385 self
._docManager
.CreateDocument(filename
, wx
.lib
.docview
.DOC_SILENT
)
2387 self
._docManager
.RemoveFileFromHistory(n
)
2388 msgTitle
= wx
.GetApp().GetAppName()
2390 msgTitle
= _("File Error")
2391 wx
.MessageBox("The file '%s' doesn't exist and couldn't be opened.\nIt has been removed from the most recently used files list" % docview
.FileNameFromPath(file),
2393 wx
.OK | wx
.ICON_EXCLAMATION
,
2397 def ProcessEvent(self
, event
):
2399 Processes an event, searching event tables and calling zero or more
2400 suitable event handler function(s). Note that the ProcessEvent
2401 method is called from the wxPython docview framework directly since
2402 wxPython does not have a virtual ProcessEvent function.
2404 if wx
.GetApp().ProcessEventBeforeWindows(event
):
2407 self
._childView
.Activate(True)
2410 if id == SAVEALL_ID
:
2411 self
.OnFileSaveAll(event
)
2414 if hasattr(self
._childView
, "GetDocumentManager") and self
._childView
.GetDocumentManager().ProcessEvent(event
): # Need to call docmanager here since super class relies on DocParentFrame which we are not using
2417 return wx
.GetApp().ProcessEvent(event
)
2420 def ProcessUpdateUIEvent(self
, event
):
2422 Processes a UI event, searching event tables and calling zero or more
2423 suitable event handler function(s). Note that the ProcessEvent
2424 method is called from the wxPython docview framework directly since
2425 wxPython does not have a virtual ProcessEvent function.
2427 if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
):
2430 if hasattr(self
._childView
, "GetDocumentManager"):
2431 docMgr
= self
._childView
.GetDocumentManager()
2433 if docMgr
.GetCurrentDocument() != self
._childView
.GetDocument():
2435 if docMgr
.ProcessUpdateUIEvent(event
): # Let the views handle the event before the services
2441 elif id == wx
.ID_COPY
:
2444 elif id == wx
.ID_PASTE
:
2447 elif id == wx
.ID_CLEAR
:
2450 elif id == wx
.ID_SELECTALL
:
2453 elif id == SAVEALL_ID
:
2454 filesModified
= False
2455 docs
= wx
.GetApp().GetDocumentManager().GetDocuments()
2457 if doc
.IsModified():
2458 filesModified
= True
2461 event
.Enable(filesModified
)
2464 return wx
.GetApp().ProcessUpdateUIEvent(event
)
2467 def OnCloseWindow(self
, event
):
2469 Called when the window is saved. Enables services to help close the frame.
2471 for service
in wx
.GetApp().GetServices():
2472 service
.OnCloseFrame(event
)
2473 wx
.lib
.docview
.DocChildFrame
.OnCloseWindow(self
, event
)
2474 if self
._fileMenu
and self
._docManager
:
2475 self
._docManager
.FileHistoryRemoveMenu(self
._fileMenu
)
2478 class AboutService(DocService
):
2480 About Dialog Service that installs under the Help menu to show the properties of the current application.
2483 def __init__(self
, aboutDialog
=None, image
=None):
2485 Initializes the AboutService.
2488 self
._dlg
= aboutDialog
2491 self
._dlg
= AboutDialog
# use default AboutDialog
2495 def ShowAbout(self
):
2497 Show the AboutDialog
2500 dlg
= self
._dlg
(wx
.GetApp().GetTopWindow(), self
._image
)
2502 dlg
= self
._dlg
(wx
.GetApp().GetTopWindow())
2503 dlg
.CenterOnParent()
2508 def SetAboutDialog(self
, dlg
):
2510 Customize the AboutDialog
2515 class AboutDialog(wx
.Dialog
):
2517 Opens an AboutDialog. Shared by DocMDIParentFrame and DocSDIFrame.
2520 def __init__(self
, parent
, image
=None):
2522 Initializes the about dialog.
2524 wx
.Dialog
.__init
__(self
, parent
, -1, _("About ") + wx
.GetApp().GetAppName(), style
= wx
.DEFAULT_DIALOG_STYLE
)
2526 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
2528 imageItem
= wx
.StaticBitmap(self
, -1, image
.ConvertToBitmap(), (0,0), (image
.GetWidth(), image
.GetHeight()))
2529 sizer
.Add(imageItem
, 0, wx
.ALIGN_CENTER|wx
.ALL
, 0)
2530 sizer
.Add(wx
.StaticText(self
, -1, wx
.GetApp().GetAppName()), 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5)
2532 btn
= wx
.Button(self
, wx
.ID_OK
)
2533 sizer
.Add(btn
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5)
2535 self
.SetSizer(sizer
)
2540 class FilePropertiesService(DocService
):
2542 Service that installs under the File menu to show the properties of the file associated
2543 with the current document.
2546 PROPERTIES_ID
= wx
.NewId()
2551 Initializes the PropertyService.
2553 self
._customEventHandlers
= []
2556 def InstallControls(self
, frame
, menuBar
=None, toolBar
=None, statusBar
=None, document
=None):
2558 Installs a File/Properties menu item.
2560 fileMenu
= menuBar
.GetMenu(menuBar
.FindMenu(_("&File")))
2561 exitMenuItemPos
= self
.GetMenuItemPos(fileMenu
, wx
.ID_EXIT
)
2562 fileMenu
.InsertSeparator(exitMenuItemPos
)
2563 fileMenu
.Insert(exitMenuItemPos
, FilePropertiesService
.PROPERTIES_ID
, _("&Properties"), _("Show file properties"))
2564 wx
.EVT_MENU(frame
, FilePropertiesService
.PROPERTIES_ID
, self
.ProcessEvent
)
2565 wx
.EVT_UPDATE_UI(frame
, FilePropertiesService
.PROPERTIES_ID
, self
.ProcessUpdateUIEvent
)
2568 def ProcessEvent(self
, event
):
2570 Detects when the File/Properties menu item is selected.
2573 if id == FilePropertiesService
.PROPERTIES_ID
:
2574 for eventHandler
in self
._customEventHandlers
:
2575 if eventHandler
.ProcessEvent(event
):
2578 self
.ShowPropertiesDialog()
2584 def ProcessUpdateUIEvent(self
, event
):
2586 Updates the File/Properties menu item.
2589 if id == FilePropertiesService
.PROPERTIES_ID
:
2590 for eventHandler
in self
._customEventHandlers
:
2591 if eventHandler
.ProcessUpdateUIEvent(event
):
2594 event
.Enable(wx
.GetApp().GetDocumentManager().GetCurrentDocument() != None)
2600 def ShowPropertiesDialog(self
, filename
=None):
2602 Shows the PropertiesDialog for the specified file.
2605 filename
= wx
.GetApp().GetDocumentManager().GetCurrentDocument().GetFilename()
2607 filePropertiesDialog
= FilePropertiesDialog(wx
.GetApp().GetTopWindow(), filename
)
2608 filePropertiesDialog
.CenterOnParent()
2609 if filePropertiesDialog
.ShowModal() == wx
.ID_OK
:
2611 filePropertiesDialog
.Destroy()
2614 def GetCustomEventHandlers(self
):
2616 Returns the custom event handlers for the PropertyService.
2618 return self
._customEventHandlers
2621 def AddCustomEventHandler(self
, handler
):
2623 Adds a custom event handlers for the PropertyService. A custom event handler enables
2624 a different dialog to be provided for a particular file.
2626 self
._customEventHandlers
.append(handler
)
2629 def RemoveCustomEventHandler(self
, handler
):
2631 Removes a custom event handler from the PropertyService.
2633 self
._customEventHandlers
.remove(handler
)
2636 def chopPath(self
, text
, length
=36):
2638 Simple version of textwrap. textwrap.fill() unfortunately chops lines at spaces
2639 and creates odd word boundaries. Instead, we will chop the path without regard to
2640 spaces, but pay attention to path delimiters.
2646 while start
< textLen
:
2647 end
= start
+ length
2651 # see if we can find a delimiter to chop the path
2653 lastSep
= text
.rfind(os
.sep
, start
, end
+ 1)
2654 if lastSep
!= -1 and lastSep
!= start
:
2658 chopped
= chopped
+ '\n' + text
[start
:end
]
2660 chopped
= text
[start
:end
]
2667 class FilePropertiesDialog(wx
.Dialog
):
2669 Dialog that shows the properties of a file. Invoked by the PropertiesService.
2673 def __init__(self
, parent
, filename
):
2675 Initializes the properties dialog.
2677 wx
.Dialog
.__init
__(self
, parent
, -1, _("File Properties"), size
=(310, 330))
2682 filePropertiesService
= wx
.GetApp().GetService(FilePropertiesService
)
2684 fileExists
= os
.path
.exists(filename
)
2686 notebook
= wx
.Notebook(self
, -1)
2687 tab
= wx
.Panel(notebook
, -1)
2689 gridSizer
= RowColSizer()
2691 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Filename:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=0, col
=0)
2692 gridSizer
.Add(wx
.StaticText(tab
, -1, os
.path
.basename(filename
)), row
=0, col
=1)
2694 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Location:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=1, col
=0)
2695 gridSizer
.Add(wx
.StaticText(tab
, -1, filePropertiesService
.chopPath(os
.path
.dirname(filename
))), flag
=wx
.BOTTOM
, border
=SPACE
, row
=1, col
=1)
2697 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Size:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=2, col
=0)
2699 gridSizer
.Add(wx
.StaticText(tab
, -1, str(os
.path
.getsize(filename
)) + ' ' + _("bytes")), row
=2, col
=1)
2701 lineSizer
= wx
.BoxSizer(wx
.VERTICAL
) # let the line expand horizontally without vertical expansion
2702 lineSizer
.Add(wx
.StaticLine(tab
, -1, size
= (10,-1)), 0, wx
.EXPAND
)
2703 gridSizer
.Add(lineSizer
, flag
=wx
.EXPAND|wx
.ALIGN_CENTER_VERTICAL|wx
.TOP
, border
=HALF_SPACE
, row
=3, col
=0, colspan
=2)
2705 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Created:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=4, col
=0)
2707 gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getctime(filename
))), row
=4, col
=1)
2709 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Modified:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=5, col
=0)
2711 gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getmtime(filename
))), row
=5, col
=1)
2713 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Accessed:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=6, col
=0)
2715 gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getatime(filename
))), row
=6, col
=1)
2717 # add a border around the inside of the tab
2718 spacerGrid
= wx
.BoxSizer(wx
.VERTICAL
)
2719 spacerGrid
.Add(gridSizer
, 0, wx
.ALL
, SPACE
);
2720 tab
.SetSizer(spacerGrid
)
2721 notebook
.AddPage(tab
, _("General"))
2723 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
2724 sizer
.Add(notebook
, 0, wx
.ALL | wx
.EXPAND
, SPACE
)
2725 sizer
.Add(self
.CreateButtonSizer(wx
.OK
), 0, wx
.ALIGN_RIGHT | wx
.RIGHT | wx
.BOTTOM
, HALF_SPACE
)
2728 self
.SetDimensions(-1, -1, 310, -1, wx
.SIZE_USE_EXISTING
)
2729 self
.SetSizer(sizer
)
2733 class ChildDocument(wx
.lib
.docview
.Document
):
2735 A ChildDocument is a document that represents a portion of a Document. The child
2736 document is managed by the parent document, so it will be prompted to close if its
2737 parent is closed, etc. Child Documents are useful when there are complicated
2738 Views of a Document and users will need to tunnel into the View.
2744 Returns the data that the ChildDocument contains.
2749 def SetData(self
, data
):
2751 Sets the data that the ChildDocument contains.
2756 def GetParentDocument(self
):
2758 Returns the parent Document of the ChildDocument.
2760 return self
._parentDocument
2763 def SetParentDocument(self
, parentDocument
):
2765 Sets the parent Document of the ChildDocument.
2767 self
._parentDocument
= parentDocument
2770 def OnSaveDocument(self
, filename
):
2772 Called when the ChildDocument is saved and does the minimum such that the
2773 ChildDocument looks like a real Document to the framework.
2775 self
.SetFilename(filename
, True)
2777 self
.SetDocumentSaved(True)
2781 def OnOpenDocument(self
, filename
):
2783 Called when the ChildDocument is opened and does the minimum such that the
2784 ChildDocument looks like a real Document to the framework.
2786 self
.SetFilename(filename
, True)
2788 self
.SetDocumentSaved(True)
2789 self
.UpdateAllViews()
2795 Called when the ChildDocument is saved and does the minimum such that the
2796 ChildDocument looks like a real Document to the framework.
2798 return self
.OnSaveDocument(self
._documentFile
)
2803 Called when the ChildDocument is saved and does the minimum such that the
2804 ChildDocument looks like a real Document to the framework.
2806 return self
.OnSaveDocument(self
._documentFile
)
2809 class ChildDocTemplate(wx
.lib
.docview
.DocTemplate
):
2811 A ChildDocTemplate is a DocTemplate subclass that enables the creation of ChildDocuments
2812 that represents a portion of a Document. The child document is managed by the parent document,
2813 so it will be prompted to close if its parent is closed, etc. Child Documents are useful
2814 when there are complicated Views of a Document and users will need to tunnel into the View.
2818 def __init__(self
, manager
, description
, filter, dir, ext
, docTypeName
, viewTypeName
, docType
, viewType
, flags
=wx
.lib
.docview
.TEMPLATE_INVISIBLE
, icon
=None):
2820 Initializes the ChildDocTemplate.
2822 wx
.lib
.docview
.DocTemplate
.__init
__(self
, manager
, description
, filter, dir, ext
, docTypeName
, viewTypeName
, docType
, viewType
, flags
=flags
, icon
=icon
)
2825 def CreateDocument(self
, path
, flags
, data
=None, parentDocument
=None):
2827 Called when a ChildDocument is to be created and does the minimum such that the
2828 ChildDocument looks like a real Document to the framework.
2830 doc
= self
._docType
()
2831 doc
.SetFilename(path
)
2833 doc
.SetParentDocument(parentDocument
)
2834 doc
.SetDocumentTemplate(self
)
2835 self
.GetDocumentManager().AddDocument(doc
)
2836 doc
.SetCommandProcessor(doc
.OnCreateCommandProcessor())
2837 if doc
.OnCreate(path
, flags
):
2840 if doc
in self
.GetDocumentManager().GetDocuments():
2841 doc
.DeleteAllViews()
2845 class WindowMenuService(DocService
):
2847 The WindowMenuService is a service that implements a standard Window menu that is used
2848 by the DocSDIFrame. The MDIFrame automatically includes a Window menu and does not use
2849 the WindowMenuService.
2852 #----------------------------------------------------------------------------
2854 #----------------------------------------------------------------------------
2855 ARRANGE_WINDOWS_ID
= wx
.NewId()
2856 SELECT_MORE_WINDOWS_ID
= wx
.NewId()
2857 SELECT_NEXT_WINDOW_ID
= wx
.NewId()
2858 SELECT_PREV_WINDOW_ID
= wx
.NewId()
2859 CLOSE_CURRENT_WINDOW_ID
= wx
.NewId()
2864 Initializes the WindowMenu and its globals.
2866 self
._selectWinIds
= []
2867 for i
in range(0, 9):
2868 self
._selectWinIds
.append(wx
.NewId())
2871 def InstallControls(self
, frame
, menuBar
=None, toolBar
=None, statusBar
=None, document
=None):
2873 Installs the Window menu.
2877 if hasattr(frame
, "GetWindowMenu"):
2878 windowMenu
= frame
.GetWindowMenu()
2880 needWindowMenu
= True
2881 windowMenu
= wx
.Menu()
2883 needWindowMenu
= False
2885 if self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
:
2886 if not _WINDOWS
: # Arrange All and window navigation doesn't work on Linux
2889 item
= windowMenu
.Append(self
.ARRANGE_WINDOWS_ID
, _("&Arrange All"), _("Arrange the open windows"))
2890 wx
.EVT_MENU(frame
, self
.ARRANGE_WINDOWS_ID
, frame
.ProcessEvent
)
2891 wx
.EVT_UPDATE_UI(frame
, self
.ARRANGE_WINDOWS_ID
, frame
.ProcessUpdateUIEvent
)
2892 windowMenu
.AppendSeparator()
2894 for i
, id in enumerate(self
._selectWinIds
):
2895 wx
.EVT_MENU(frame
, id, frame
.ProcessEvent
)
2896 wx
.EVT_MENU(frame
, self
.SELECT_MORE_WINDOWS_ID
, frame
.ProcessEvent
)
2897 elif wx
.GetApp().GetUseTabbedMDI():
2898 item
= windowMenu
.Append(self
.SELECT_PREV_WINDOW_ID
, _("Previous"), _("Previous Tab"))
2899 wx
.EVT_MENU(frame
, self
.SELECT_PREV_WINDOW_ID
, frame
.ProcessEvent
)
2900 wx
.EVT_UPDATE_UI(frame
, self
.SELECT_PREV_WINDOW_ID
, frame
.ProcessUpdateUIEvent
)
2901 item
= windowMenu
.Append(self
.SELECT_NEXT_WINDOW_ID
, _("Next"), _("Next Tab"))
2902 wx
.EVT_MENU(frame
, self
.SELECT_NEXT_WINDOW_ID
, frame
.ProcessEvent
)
2903 wx
.EVT_UPDATE_UI(frame
, self
.SELECT_NEXT_WINDOW_ID
, frame
.ProcessUpdateUIEvent
)
2904 item
= windowMenu
.Append(self
.CLOSE_CURRENT_WINDOW_ID
, _("Close Current\tCtrl+F4"), _("Close Current Tab"))
2905 wx
.EVT_MENU(frame
, self
.CLOSE_CURRENT_WINDOW_ID
, frame
.ProcessEvent
)
2906 wx
.EVT_UPDATE_UI(frame
, self
.CLOSE_CURRENT_WINDOW_ID
, frame
.ProcessUpdateUIEvent
)
2909 for i
, id in enumerate(self
._selectWinIds
):
2910 wx
.EVT_MENU(frame
, id, self
.OnCtrlKeySelect
)
2913 helpMenuIndex
= menuBar
.FindMenu(_("&Help"))
2914 menuBar
.Insert(helpMenuIndex
, windowMenu
, _("&Window"))
2916 self
._lastFrameUpdated
= None
2919 def OnCtrlKeySelect(self
, event
):
2920 i
= self
._selectWinIds
.index(event
.GetId())
2921 notebook
= wx
.GetApp().GetTopWindow()._notebook
2922 if i
< notebook
.GetPageCount():
2923 notebook
.SetSelection(i
)
2926 def ProcessEvent(self
, event
):
2928 Processes a Window menu event.
2931 if id == self
.ARRANGE_WINDOWS_ID
:
2932 self
.OnArrangeWindows(event
)
2934 elif id == self
.SELECT_MORE_WINDOWS_ID
:
2935 self
.OnSelectMoreWindows(event
)
2937 elif id in self
._selectWinIds
:
2938 self
.OnSelectWindowMenu(event
)
2940 elif wx
.GetApp().GetUseTabbedMDI():
2941 if id == self
.SELECT_NEXT_WINDOW_ID
:
2942 notebook
= wx
.GetApp().GetTopWindow()._notebook
2943 i
= notebook
.GetSelection()
2944 notebook
.SetSelection(i
+1)
2946 elif id == self
.SELECT_PREV_WINDOW_ID
:
2947 notebook
= wx
.GetApp().GetTopWindow()._notebook
2948 i
= notebook
.GetSelection()
2949 notebook
.SetSelection(i
-1)
2951 elif id == self
.CLOSE_CURRENT_WINDOW_ID
:
2952 notebook
= wx
.GetApp().GetTopWindow()._notebook
2953 i
= notebook
.GetSelection()
2955 doc
= notebook
.GetPage(i
).GetView().GetDocument()
2956 wx
.GetApp().GetDocumentManager().CloseDocument(doc
, False)
2962 def ProcessUpdateUIEvent(self
, event
):
2964 Updates the Window menu items.
2967 if id == self
.ARRANGE_WINDOWS_ID
:
2968 frame
= event
.GetEventObject()
2969 if not self
._lastFrameUpdated
or self
._lastFrameUpdated
!= frame
:
2970 self
.BuildWindowMenu(frame
) # It's a new frame, so update the windows menu... this is as if the View::OnActivateMethod had been invoked
2971 self
._lastFrameUpdated
= frame
2973 elif wx
.GetApp().GetUseTabbedMDI():
2974 if id == self
.SELECT_NEXT_WINDOW_ID
:
2975 self
.BuildWindowMenu(event
.GetEventObject()) # build file list only when we are updating the windows menu
2977 notebook
= wx
.GetApp().GetTopWindow()._notebook
2978 i
= notebook
.GetSelection()
2983 if i
>= notebook
.GetPageCount():
2988 elif id == self
.SELECT_PREV_WINDOW_ID
:
2989 notebook
= wx
.GetApp().GetTopWindow()._notebook
2990 i
= notebook
.GetSelection()
3000 elif id == self
.CLOSE_CURRENT_WINDOW_ID
:
3001 event
.Enable(wx
.GetApp().GetTopWindow()._notebook
.GetSelection() != -1)
3009 def BuildWindowMenu(self
, currentFrame
):
3011 Builds the Window menu and adds menu items for all of the open documents in the DocManager.
3013 if wx
.GetApp().GetUseTabbedMDI():
3014 currentFrame
= wx
.GetApp().GetTopWindow()
3016 windowMenuIndex
= currentFrame
.GetMenuBar().FindMenu(_("&Window"))
3017 windowMenu
= currentFrame
.GetMenuBar().GetMenu(windowMenuIndex
)
3019 if self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
:
3020 frames
= self
._GetWindowMenuFrameList
(currentFrame
)
3021 max = WINDOW_MENU_NUM_ITEMS
3022 if max > len(frames
):
3025 for i
in range(0, max):
3027 item
= windowMenu
.FindItemById(self
._selectWinIds
[i
])
3028 label
= '&' + str(i
+ 1) + ' ' + frame
.GetTitle()
3030 item
= windowMenu
.AppendCheckItem(self
._selectWinIds
[i
], label
)
3032 windowMenu
.SetLabel(self
._selectWinIds
[i
], label
)
3033 windowMenu
.Check(self
._selectWinIds
[i
], (frame
== currentFrame
))
3034 if len(frames
) > WINDOW_MENU_NUM_ITEMS
: # Add the more items item
3035 if not windowMenu
.FindItemById(self
.SELECT_MORE_WINDOWS_ID
):
3036 windowMenu
.Append(self
.SELECT_MORE_WINDOWS_ID
, _("&More Windows..."))
3037 else: # Remove any extra items
3038 if windowMenu
.FindItemById(self
.SELECT_MORE_WINDOWS_ID
):
3039 windowMenu
.Remove(self
.SELECT_MORE_WINDOWS_ID
)
3041 for j
in range(i
+ 1, WINDOW_MENU_NUM_ITEMS
):
3042 if windowMenu
.FindItemById(self
._selectWinIds
[j
]):
3043 windowMenu
.Remove(self
._selectWinIds
[j
])
3045 elif wx
.GetApp().GetUseTabbedMDI():
3046 notebook
= wx
.GetApp().GetTopWindow()._notebook
3047 numPages
= notebook
.GetPageCount()
3049 for id in self
._selectWinIds
:
3050 item
= windowMenu
.FindItemById(id)
3052 windowMenu
.DeleteItem(item
)
3053 if numPages
== 0 and self
._sep
:
3054 windowMenu
.DeleteItem(self
._sep
)
3057 if numPages
> len(self
._selectWinIds
):
3058 for i
in range(len(self
._selectWinIds
), numPages
):
3059 self
._selectWinIds
.append(wx
.NewId())
3060 wx
.EVT_MENU(currentFrame
, self
._selectWinIds
[i
], self
.OnCtrlKeySelect
)
3062 for i
in range(0, numPages
):
3063 if i
== 0 and not self
._sep
:
3064 self
._sep
= windowMenu
.AppendSeparator()
3066 menuLabel
= "%s\tCtrl+%s" % (notebook
.GetPageText(i
), i
+1)
3068 menuLabel
= notebook
.GetPageText(i
)
3069 windowMenu
.Append(self
._selectWinIds
[i
], menuLabel
)
3072 def _GetWindowMenuIDList(self
):
3074 Returns a list of the Window menu item IDs.
3076 return self
._selectWinIds
3079 def _GetWindowMenuFrameList(self
, currentFrame
=None):
3081 Returns the Frame associated with each menu item in the Window menu.
3084 # get list of windows for documents
3085 for doc
in self
._docManager
.GetDocuments():
3086 for view
in doc
.GetViews():
3087 frame
= view
.GetFrame()
3088 if frame
not in frameList
:
3089 if frame
== currentFrame
and len(frameList
) >= WINDOW_MENU_NUM_ITEMS
:
3090 frameList
.insert(WINDOW_MENU_NUM_ITEMS
- 1, frame
)
3092 frameList
.append(frame
)
3093 # get list of windows for general services
3094 for service
in wx
.GetApp().GetServices():
3095 view
= service
.GetView()
3097 frame
= view
.GetFrame()
3098 if frame
not in frameList
:
3099 if frame
== currentFrame
and len(frameList
) >= WINDOW_MENU_NUM_ITEMS
:
3100 frameList
.insert(WINDOW_MENU_NUM_ITEMS
- 1, frame
)
3102 frameList
.append(frame
)
3107 def OnArrangeWindows(self
, event
):
3109 Called by Window/Arrange and tiles the frames on the desktop.
3111 currentFrame
= event
.GetEventObject()
3113 tempFrame
= wx
.Frame(None, -1, "", pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
)
3114 sizex
= tempFrame
.GetSize()[0]
3115 sizey
= tempFrame
.GetSize()[1]
3121 frames
= self
._GetWindowMenuFrameList
()
3122 frames
.remove(currentFrame
)
3123 frames
.append(currentFrame
) # Make the current frame the last frame so that it is the last one to appear
3124 for frame
in frames
:
3126 delta
= frame
.GetClientAreaOrigin()[1]
3127 frame
.SetPosition((posx
, posy
))
3128 frame
.SetSize((sizex
, sizey
))
3129 # TODO: Need to loop around if posx + delta + size > displaysize
3133 if posx
+ sizex
> wx
.DisplaySize()[0] or posy
+ sizey
> wx
.DisplaySize()[1]:
3136 currentFrame
.SetFocus()
3139 def OnSelectWindowMenu(self
, event
):
3141 Called when the Window menu item representing a Frame is selected and brings the selected
3142 Frame to the front of the desktop.
3145 index
= self
._selectWinIds
.index(id)
3147 currentFrame
= event
.GetEventObject()
3148 frame
= self
._GetWindowMenuFrameList
(currentFrame
)[index
]
3150 wx
.CallAfter(frame
.Raise
)
3153 def OnSelectMoreWindows(self
, event
):
3155 Called when the "Window/Select More Windows..." menu item is selected and enables user to
3156 select from the Frames that do not in the Window list. Useful when there are more than
3157 10 open frames in the application.
3159 frames
= self
._GetWindowMenuFrameList
() # TODO - make the current window the first one
3160 strings
= map(lambda frame
: frame
.GetTitle(), frames
)
3161 # Should preselect the current window, but not supported by wx.GetSingleChoice
3162 res
= wx
.GetSingleChoiceIndex(_("Select a window to show:"),
3168 frames
[res
].SetFocus()
3171 #----------------------------------------------------------------------------
3172 # File generated by encode_bitmaps.py
3173 #----------------------------------------------------------------------------
3174 from wx
import ImageFromStream
, BitmapFromImage
3177 #----------------------------------------------------------------------
3180 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3181 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3182 \x00\x01\x04IDAT8\x8d\xa5\x93\xbdj\x02A\x10\xc7\x7f{gme\xe5c\xe4\t\x82\x85\
3183 \x85\x85oa\xe5+\xd8Z\xd8'e\xfa\x80\xd8\xd8X\x19R\xc4\x07\x90\x04\xd1J\x08\
3184 \x17\x0cr\\V\xe1\xe4\xfc\x80\xb58\xf7\xd8\xbd\x0f\xa280\xec\xec2\xbf\xff\xce\
3185 \xcc\xb2B8.\xf7X\xc9\xdc|L\x97J\xc7\xbe\x0c\x01\xf0\xd6\x01\x00RFtZu\x91Q\
3186 \x10\x8e\x9b\xf8\xe4\xf3[-w*\xf1\xafm\xec\xcf\x83\x89\x1a\xad\x94\xea\xbe\
3187 \x8c\x95\x99/\x1c\x17\xe7\xdaR\xcb%xh\xd4hw_\x95yn\xb5\xe0\xcb\x90\xea%\x0eO\
3188 \xf1\xba\xd9\xc7\xe5\xbf\x0f\xdfX]\xda)\x140A\r\x03<6klO\xf0w\x84~\xef\xc9\
3189 \xca/lA\xc3@\x02\xe7\x99U\x81\xb7\x0e\xa8\xec\xed\x04\x13\xde\x1c\xfe\x11\
3190 \x902\xb2@\xc8\xc2\x8b\xd9\xbcX\xc0\x045\xac\xc1 Jg\xe6\x08\xe8)\xa7o\xd5\
3191 \xb0\xbf\xcb\nd\x86x\x0b\x9c+p\x0b\x0c\xa9\x16~\xbc_\xeb\x9d\xd3\x03\xcb3q\
3192 \xefo\xbc\xfa/\x14\xd9\x19\x1f\xfb\x8aa\x87\xf2\xf7\x16\x00\x00\x00\x00IEND\
3196 return BitmapFromImage(getNewImage())
3199 stream
= cStringIO
.StringIO(getNewData())
3200 return ImageFromStream(stream
)
3202 #----------------------------------------------------------------------
3205 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3206 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3207 \x00\x01gIDAT8\x8d\xa5\x93=KBQ\x18\xc7\x7fWo)5\x1594DC\x04!\xd1\x0bM-\xd1\
3208 \xd0T\x81\xba\xb7\xf8\x01Z\x9a\xdb\xfa\x08AC\x10\x0e\xb5\x86\xbaDC`CMaN\xd9\
3209 \x0bQF7\xe2z\xc1kz\xcd\xc4\x97\xd3\xa0\xde\xbc\\oE\xfd\xa7s\xce\xf3\xfc\x7f\
3210 \xe7y\xce\x8b$\xb9\xdc\xfcG2@\xf1bC\x00\x18%\xcd\x12\x1c^\xdc\x97~\x04\x18\
3211 \xe7K\xa2of\x05\x80\xfe\x8e@\xc3\xc8\xf2zJ\x13\xac+\xe6\xfax(a\x81\xca\xa2w\
3212 \x8a\x86\x91\x85\xaanE\xf7\x0c\xe0\xf3\xcf\x03P}|3\x97\x93\x11U\xcc\x85\xd3&\
3213 D\xee\xf4\x88\xb2\xfa5)\xab(\x99"\x00\xb9\x87c\x0b;\x19\xf1\x0b\x80\xb9pZ\
3214 \xb2\x00\x00\xd3T\xcb\xa5\x00(\xe4Uf\xd7\xb6m\xbd\xa7\x0e\xd6\x89\xc7\xa2\
3215 \xc2\x04<_\xdf\xe3\x15\x1a\xb5V\xbfc\xab\x9b6S7\xc9FIC\xbf\xcb\xe0\x15\x1a\
3216 \xbe\xe9e|\xad@C\xbfu4\x9d\xecnQ\x99\xdci\x02\x00\xea\x1f\x1a\x15]a\xa8pcK\
3217 \xae\xbf?9\x82\x02\xc1\x90$\x1b\xba\x82<\xe8\xeb\x9a\\\xcb)\xdd|\x14r\x15<\
3218 \xad\xb1\xab\x99\x98bdb\xd4q\xa7\xefd\xbb\x05\xa7\xdd\x8f\x0e/\x9d\x01\x85\
3219 \xbc\nX+8K\\\x99\xe5\x02x\x16\xf6\xba\x02$\xc9\xe56\x1fF[\xda\x8bn\x9er\xa7\
3220 \x02\xc1\x90\xedoH\xed\xdf\x18\x8fE\xc5o\x0c\x8e\x80\xbf\xea\x13\xa8\x18\x89\
3221 5\xe7L\xb3:\x00\x00\x00\x00IEND\xaeB`\x82'
3223 def getOpenBitmap():
3224 return BitmapFromImage(getOpenImage())
3227 stream
= cStringIO
.StringIO(getOpenData())
3228 return ImageFromStream(stream
)
3230 #----------------------------------------------------------------------
3233 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3234 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3235 \x00\x01_IDAT8\x8d\x8d\x92\xbfK\x02a\x18\xc7?w\xfa\'\xd8\xd0\xa0\xe4v\xd0$M\
3236 \x8dB\x11\x11\xa5B\x7f@C\xd0RC{k8E\x834\xb45\n\x15\xfd\x80hhh\xd2\xadI\x82\
3237 \xa4!\xb8\x84\xca\xd4;\xa5\xf2R\xe1m\xd0\xfb\xf5^\x1e~\xe1\xe5^\x9e{\xbe\x9f\
3238 \xf7\xfb\xbcwJ\xa9\xa2\x0bFj\x98\xdf\x00\xd4\xea\x06\x00f\xdbbosQ!L\xa5\x8a.\
3239 \xaa_"\xb0\x8e\xce\xcb\xa2\xfc)\xc4N\xfeT(j\x84\xb1\xabT\xd1E,\x19w\x80\x8d\
3240 \x97Ww?A"\xd5n\xf2*\x96\x8c\x13K\xc6\xd1R\x1aZJcai\x1e\x80\xf4j\x9a\xed\xfd\
3241 \xa2\xf0\x01B\xe7\x1b\xa9\xd9\x1d>;\x03X\xd9X\xf7AToC\xb3\xeb\xc6\x96e\xb6-\
3242 \x1en\xef\xb999\x03\xe0\xea\xf2B\x00Dku\x83)\xcd\x85\x8c;}n9\r\x80\xd1\x87b\
3243 \xbe\x00\xb33\xc3\x04f\xdbr\x9a;\x03\xbfI\x86\x1a\xfd\xe0\x01\xaam\xec\x0c\
3244 \x86\r\xf6\x8d{\xcd\xf6;\x00\xb3\'\x01\xde?\x9a>\xba\x9cH6\xb7,x~\xaa:=Q\x9f\
3245 \xb9\xe7\x1fE\xae\xb7\\\xb6\x1f\xe0\x8d\x15H$\x99\x1b?\x12@\xd7\xdf\xd0\x0f\
3246 \nN!\x91\x98\x9e\xd8\x0c\x10\xbd>\xdeU\xeco\np\xf7\xf8\xebK\x14fvF\xc8ds\xce\
3247 \xff\xbd\xb6u(\xbc\x89\xbc\x17\xf6\x9f\x14E\x8d\x04\x8a\xdeDa\xcads\xca\x1f\
3248 \x0cI\xd4\xda\x88E\x9d\xc4\x00\x00\x00\x00IEND\xaeB`\x82'
3250 def getCopyBitmap():
3251 return BitmapFromImage(getCopyImage())
3254 stream
= cStringIO
.StringIO(getCopyData())
3255 return ImageFromStream(stream
)
3257 #----------------------------------------------------------------------
3260 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3261 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3262 \x00\x01\x90IDAT8\x8d\x8d\x93?H\x02a\x18\x87\x9fSw\xb1\xa9!q\xc8\xb0?B\xd0\
3263 \x98\x10DS\x10\x98\x82C\xd1\x12\x1a\xcd\rb&\xad\x1a\x144F`[\xd4 hBPKC\x83P\
3264 \x8b4\xe4\xa9tP\x82\x98\x88`$\x82\x8b\xd8p\xddu\xa7\xa5\xfd\x96{\xbf\xef\xfd\
3265 \xbd\xcf\xf7~w\xf7\n\x82\xc1\x08@M\xect\xd1(x\x12ef\xcaN./\x11\\\xdc\xd3\xa6\
3266 pz\x8d\x82\x12\x0b\x82\xc1HM\xect-c\xf7\xaa!\x10\xc9\xe0]rR\xac\xb4\x01\xc8\
3267 \xe5%\xe2\xbbF5_|\x0c\xa9\x10\x03=\nD2\x00$\xef\x9e\xc9\xe5%ryI\xde?\xe8\xe8\
3268 |\xe9\xabT\x17\xc0\xd4\x0b\xd8\nl\xa8q\xfd\xa3%\xb7\xd9x\xe1\xad=\xc2q\xba\
3269 \xc2\x8e\xfbU\xe7\xef\x03\x00\x98m\xd6\xef\xa7\xb23\xc9\xdbm\x06\xfb\x8a\x8f\
3270 \xe0y\x8a\xc0\xc4\x10\x00\xc0\xcdEB\x8d\x97\xd7}j\xbc\xb0\xe6!~\x99d\xd11\
3271 \x04\xa0-R$]'\xa84M4\xca\x05p8\x7f\x07\xd4?Z\x98mr\x07\x95\xa6\x9c\xf6o{\xb0\
3272 \xce\xbb\x00\xb0\x03\xe9\xc3\xd8\xf0+h;x\xf9\xfc\xcb\xd5\x0bh>Pzw1>\x0bg\xa7\
3273 )]\xaaQ.\x00`\xdb\x0c\x0f\x00hN\xf4o{~=\xf9\xa9\x0eY\xb1\x8awI\xf3\x0ej\x05\
3274 \xb0\x98\x1f\x00x-\xd5\xb0\xce\xc3\xd1~LW\x98\x15\xab\xccM\x8f\xfe\xaf\x03\
3275 \x00w0\xccS\xfdgm\xfb\xc3\xd7\xf7++w\xd5\x16\x0f\x92\t\xe4\xe9zN\x86\xbe\xa7\
3276 1\xaa\xfbLY\xb1:\x10 (\xe3\x0c?\x03\xf2_\xb9W=\xc2\x17\x1c\xf8\x87\x9a\x03\
3277 \x12\xd7\xb9\x00\x00\x00\x00IEND\xaeB`\x82"
3279 def getPasteBitmap():
3280 return BitmapFromImage(getPasteImage())
3282 def getPasteImage():
3283 stream
= cStringIO
.StringIO(getPasteData())
3284 return ImageFromStream(stream
)
3286 #----------------------------------------------------------------------
3289 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3290 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3291 \x00\x01\x1dIDAT8\x8d\x9d\x93=N\xc3@\x10\x85\xbf\xf5\xa2-\xf1\x11\xa0\x8dC\
3292 \x8f\x82\xa0\xe5\xa7\xa6\xe2\x04\xb4p\x00\x1a\xfb\x02\x11T\xf4\xa4\xa0\xc1\
3293 \xc1\\\x01\x90R"\xc5\xa4\x89RD\x14\x04$\xa2@\x01\xb1\x04C\xe1\xc8\xb1`\x1dC^\
3294 5;?\xef\xcd\x8cv\x94r4\xf1\xc5\xa7P\x82a\xff\xb7o\xfd@+\x94\xa3\xb9o"2\xa8K\
3295 \x18\x86R\x84\xc1\x87\xc8\xdd\xf3X|\xdf\x17\x11\x91\x9bc$\x8a"q\xf2\x8cZk\
3296 \xab\xfa\xd3\x18\x1e\xdf\x12\xba\xef\x06\x80\xdb\x13\x95\xc5\x1ckE\t\xd6\xb6\
3297 \xf7\xec\x04I\x92\x94\xaa\xff\xc4\\\x1d\xf0\xd2\xfd\x1bA\x99:\xc0B\xfe\xb1\
3298 \xbb\xf1@\x10\x043\xc5\x8f6\xaf\x00\xe8u\xc0]\x9e\x10\x0c\xfb@m\x92\xb0\xbf8\
3299 \xcd\x1e\xb5\xacm\xdb;\x18\xb5\xc0]%8}\xcd\x85+\x99\xd5\x8e\xbf2\xfb\xfc\xb0\
3300 g\x1f!U\xac\xe0y^\xe62\xc6p\xd6h\x14\x8e4s\x89\xc6\xa4\xcb[\xa9V\xffG\xa0\
3301 \xb5\xce\x8a\x97j[\xb4\xe3\xb8\x90@)\'\xfd\xbe\xd7\xf5\xe2\x83\xeau\xec~w\'\
3302 \x9a\x12\x00\\6\xc3\xd2\xab,\xec`^|\x03\xb6\xdf|Q.\xa7\x15\x89\x00\x00\x00\
3305 def getSaveBitmap():
3306 return BitmapFromImage(getSaveImage())
3309 stream
= cStringIO
.StringIO(getSaveData())
3310 return ImageFromStream(stream
)
3312 #----------------------------------------------------------------------
3313 def getSaveAllData():
3315 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3316 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3317 \x00\x01UIDAT8\x8d\x9d\x93\xbfK\xc3@\x1c\xc5\xdf%\x01g\xeb \x1d\x8a\x8b\x83M\
3318 \x11\xe9\x16\x8a\x8b\xff@\xa0\xdd\x14\'\x17\x17A2\xe9,\x08\xc9\x14\x82n.nn\
3319 \x9a\xde?\xe0R;\xb88\x99v\xe8`\x86\n."\x81\xb6\xb4\xb4~\x1d\xd2\xc4^\x92j\
3320 \xf5\x03\xc7\xfd~\xf7\xeeq\xc7<\x17\x84)\xa3\x1e\x04\x863\xfd\xf10\xac\xb7\
3321 \x8fe&,\xf2\\\x10\xf9\x06q\xce)I\x7fL\xf4\xda\'2M\x93\x88\x88\x1e.@\x9csb\
3322 \x92\x8c\xb8x.\xa8X6\xd0z\xb2c\xd1?9\x89\x1c\xfc\xd7\x89\x82\x04\xeb\x9f:Z\
3323 \xf5l\';9\xe0\xf1\xea\x14\xca\x12\xb0\xe2\xebh8 ))\x00\x00\xc5\xb2\x81\x8e\
3324 \xc4\xb1\xb5GB\xd9< \x14\xf6\t\xf7\xef&*Ga\xf6\x99\x02Y\x0c&\xc0\xc7\x08x\
3325 \xe9\x01A\x10\xa0y\xc9\x16\x17\x98\xdd\x1cQ\xd1\x8d\x9f\x05<\xcf\x136\xcf#\
3326 \x15b\xc4\xc9\xee\x1b,\xcb\x8a\xfbA\x10\xc4\xed\xf3\xc3\x01\x00\xc0o\x03J\
3327 \xa9&\xb3\x86c\xd3r![\xe47\x14 |\x14\xcf\xb7\x13JNZ7\xab\xc2\xe9\xddn7\x9e\
3328 \xbb>\xcb\x01\x98\xc9\xa0T\x93Y\x93\xdbH\xa2\xaa*4MC\xb5Z\xcdt \x84\x98\xfa(\
3329 S\xf2\xf9\xfc\xdc+0&\xc9\xa9\xc1\x86\xf3}\x1d\xbf\r\xacm\x84\xf5\xc2\x02\x00\
3330 Pw\xefR\x99d\xf1\x05z\x94\xd0b\xcb S\xf3\x00\x00\x00\x00IEND\xaeB`\x82'
3332 def getSaveAllBitmap():
3333 return BitmapFromImage(getSaveAllImage())
3335 def getSaveAllImage():
3336 stream
= cStringIO
.StringIO(getSaveAllData())
3337 return ImageFromStream(stream
)
3339 #----------------------------------------------------------------------
3342 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3343 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3344 \x00\x01\xa7IDAT8\x8d\xa5S=K\xc3P\x14=\xef\xb5 \x0e\xf6\x17\xb8$X\x10\xa7\
3345 \x82\xb4\n]\x05A\x07\xebd%\xfe\x02\x97\x82\xe0\xa0\x83\xa3\x88\xb5E\xfd\x07j\
3346 \x0bq\xea\x07\x18(8:5\x16\xa2H\xf1\x8bN\x12\tt\xe9\x8b\xddZ\x9eC|i\x93\xd4\
3347 \x0f\xf0\xc0\xe1\xe6\xbe\xdc{\xde\xb9\xc9{\x84\xd0\x10\xfe\x83\xb0x8m\xf6\
3348 \xb8i\xf7=/\xfb\xad\x07O\x9e]\x9f%\x01\x05BC 4\x84\x1d\xbd\xc7\xfdx\xb2\x1d^\
3349 \x99\x9c\x1f\xe6\x8ey\xb5Z\xe5\xa2^\x90\n\xa1\x83\xb91\xb2{;p\xf0\xfc\xe1\
3350 \xc4W\xdb\x89\xe3\xcb\x19\xa8\xaa\x8aJ\xb9\xc4\x87\r\xd0\xe1\xc4o\xf9/\x08\
3351 \x03\xc0\xc5\xf9\x19\x07\x80\xfb\xaf\x9d\xc5\xae-6(4\xed>\x9aoA\x01zq~\xc6\
3352 \x15E\x81\xa2(\xee\xe2\xd4\x84\x13\xe5H\xb0\xc1?\x06\x05\x80b\xb1\xe8\x16\
3353 \xbc\xda\x0e[\xcc\xa1i\xf71\xfcw\xf2\xf9\xbcG\x84\x14\n\x05\x1e\x8b\xc5\xa0\
3354 \xd5\xae\xb1\xbd\x95\x81eY#gm\xb7\xdb\x9e|cs\x1fw7\x97$lZm\xc4\x00,-. \x9b?\
3355 \xc1tT\x1e)\xc0\x18C$\x12\x01c\xce\x87\xe9\xbe\xeb\xa8\x94K\x9cNGeh\xb5k\x00\
3356 \x80\xd1\xa8#\x91H@\x96\xe5\x00%I\xc2\xe3K\x0b\x9a\xa6A\x92$W8\xbc\x92Z%\xeb\
3357 \xe95n4\xea\x01\xab\x9dN\xc7\xe3"9\x1fGr>\xeeYs\x8fr:\x9d\x06c\x0c\x86ax\nL\
3358 \xcb;\xbb\x1f\x84\xd0\x10*\xe5\x12WU\x15\xcd7`f\xf2\xc7z\x00\x80\xae\xeb\xc8\
3359 \xe5rXI\xad\x12"nc\xa5\\\xe2{G*\xba\xef\xfa\xaf\x02\xa2\xd9u \xe0?\xe7\xdfA4\
3360 \x03\xc0\'\xe3\x82\xc9\x18g\x90\x8e]\x00\x00\x00\x00IEND\xaeB`\x82'
3362 def getPrintBitmap():
3363 return BitmapFromImage(getPrintImage())
3365 def getPrintImage():
3366 stream
= cStringIO
.StringIO(getPrintData())
3367 return ImageFromStream(stream
)
3369 #----------------------------------------------------------------------
3370 def getPrintPreviewData():
3372 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3373 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3374 \x00\x01mIDAT8\x8d\x8d\x92\xbdK\x02a\x1c\xc7?w\x1a\x85E\x04588XHa\xd1\x14!AB\
3375 \r.\xbd\x07m-By.M\xfe\x03N\x05\x0e\xed\xf9\x124\x045\x04\x15\xdc\xda&4\xb5DC\
3376 J\x8a\x81E\t.\x82\x918\xd8\xf0pOw\xde\x19}\xe1\xe1w\xf7;>\xdf\xdf\xcbs\xca\
3377 \xddC\xb9C\x97\x1e\x8bU\xf9\x9c\xd8]V\xba\xbf\x9b\xa5\x02\xf8\xa6\xc6-ge=\
3378 \x0c@p)\xcc\xc1\xe1\xa5\xad\x80\xcd\xa0\x97\x86\xfb`5\xba\xf3\xa7\x89\xdb)Y\
3379 \xff\x16\xf1"{%s\xb77\xd7\x9d\xcd\xadm\xdb86\x03\x03\x0eE\xc2\x04\xdbPk\xc1y\
3380 2Edf\xday\x84\xe6\xdb\x93\x84\x8c\xd8h\x8bSk\xf5j\xdcdPj\x8eX`C\x06\x9c?\x8a\
3381 \xe3\xef/\xa3\xeb:\xb1\xfd=\xdb.,#4\xdav\x18-m\x01b\xd0\xc9\xe6N\xe5.Ts\xcbN\
3382 pz\x0e\xa2~\x91\x0bx\x00-m\xe9D-W>%h\xc0\x1f_\xbf\x15\xef\xeb\x90\xaf\xc1\
3383 \xe2\x18x="\x82\xb8\x15\xd9\x81yYf\x18\xe0\xac"\xc0\xc0\x10\x84\xc6D4\xcb\
3384 \xf2#u\xc3\xb2m`t\x00&\x07E4\xcb]x.QH\xa6\xec$\x13\xf83q^\xb44^\x8f\xb8\xa5"\
3385 p\x9c\x88\xa3\x91\xe1\x9d5\x00\x14Eu\xc9y\x9c\xa4\xeb\xba\xe5}\xb6\x9a\x01`\
3386 \xc1\x07\xf39\x97\xa2(\xaa\xab\x17+\xd5]\xe0\xf5dC\x9a\xfc\xcb\xc0\xc9\xd00\
3387 \xf9\x011\xc9\x87\xf3\xb4\xd1t\xaf\x00\x00\x00\x00IEND\xaeB`\x82'
3389 def getPrintPreviewBitmap():
3390 return BitmapFromImage(getPrintPreviewImage())
3392 def getPrintPreviewImage():
3393 stream
= cStringIO
.StringIO(getPrintPreviewData())
3394 return ImageFromStream(stream
)
3396 #----------------------------------------------------------------------
3399 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3400 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3401 \x00\x01HIDAT8\x8d\x85\x92OK\x02Q\x14\xc5\x7f\xa3\x05}\x1b\xa1\xc0\x9d\xb4\
3402 \xaaf6\x93a\x10\xe3^\x83l\xdf\xc6\xa5\x1bIA\xb4\xa0\x9cM\xe5"\x84\x18\xff\
3403 \x108\xbb\xf0\x93\xb4v\x15h\xa9\xaf\x16\xaf\x85\xbcat^\xd3\x81\xb79\xf7\xdc\
3404 \xf3\xce{\xf7b$\x92\x84O\xa7\xd3\x91\x9b\\\xf8\xd4\xeb\xb5\xb5z\x02\r\x9e\
3405 \x1e\x1f\xa4\x8eo5\x1b\x12`\xd0\xef\x05u\xadA.\x97\xc3u\xef\xd7LZ\xcd\x86\
3406 \xb4\xedlD\xab5\xd0A\x08\xc1l6e>_\xc4\x1b\x88o\x01@\xde\xc9\x07\x91k\xd7Ui\
3407 \x9a\x96\xd6xk\x93(\x14\xce\r@\x1e\x1e\x1cE\xc4\x9e\xe7\x91J\xa58\xce\x9e\
3408 \x18\x7f\x1a\x00,\x17\xab\x98\xb6\x9dE\x08!M\xd3\x8aDW0\x8cDR[P\xb1U\xa3\xef\
3409 \x8f"\xb7C\xcc\'\xee\xbdw\xf1</h\xceL\x86Z\x9d\xf6\to\x17\xbb2m90z\xc6\xf7!3\
3410 \x19\x92\xb6\x1c\xc6\xdd\xab\x886v\x8ci\xcb\t\x9a\x15\xc2K\xa45P\xb7\x17o+\
3411 \x00,\xa6\x9f\x00\x14o+\xec\x9f\x15X\xba\x97\xf1\tTC\x1c\xfe]e\x80v\xa9\xcc\
3412 \xb8\xeb2\xfb\xf8\xe2\xf5\xaeA\xbbT\xd6\xea"c\x1c\xf4{r\xfbe\xf5Y?\xa7\xd5\
3413 \x80W\xd1w\n7k\xa3\xd4\xee\x81\x8a\x18\x16\xea8\x80_\\\xa2\x8b\x88!\xd2S\x08\
3414 \x00\x00\x00\x00IEND\xaeB`\x82'
3417 return BitmapFromImage(getCutImage())
3420 stream
= cStringIO
.StringIO(getCutData())
3421 return ImageFromStream(stream
)
3423 #----------------------------------------------------------------------
3426 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3427 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3428 \x00\x01\xa7IDAT8\x8d\xa5\x90\xbfK[Q\x18\x86\x9fs#\x8d\x7fBu\xc8\xd6\xc9\xc1\
3429 \xa1\x83\xd0\x16\xa1C@*\x98\xc4\xa2\x12\xda\x8e5\x9b\x83\x04\x07Aph\x17)\x16\
3430 \xdd\xd4\xc1\xa1Z\x1b\xc5&9\xa6P\xbaw\xa8\x9b\x9b\xa0S\xb0\xe2\x8f\\%1^\x8d\
3431 \xde\xfa9\x84s\xf1\xea\xa5\x06<p\x86\xc3\xf9\x9e\xe7\xbc\xefQ\xca\n\xf1\x90\
3432 \xd5t\xdf@\xba\x10\x95r\xcd\x01`\xee\xf5o\xd5\xb0 ]\x88\n@\xd7\xb3^\x00.\xaf\
3433 \xce\xd8\x9d>\x10\x80\x1fC[\x9eH\x05UH\x17\xa2r\x13\xac\x9d_Pq\x8f\x01(96\
3434 \xdf\x16\xd7X\xff\xb8\xaf\x02\x05\x066\xa0+5\xe6\xb3\x0b\x1c\xeeW\x00x\xd1\
3435 \xf3\x14\x80\xaf\x93\xbf\xd8\xcb\xb8\xeaN\x05\xd3\xd7\xbc\x9a\xd1\xdf\x19\
3436 \x8cL@\xa4~\x9f\x9a\xec\xa3\xb3\xa7\r\x80|.+>\xc1\xfb\xd5\xe72\xf0\xf2-U\xa7\
3437 \xec\x83c\xf1\x84\xd79\x9f\xcbJj\xa9/\xf8\x13\xcb\xe7U.\xaf\xcep\xa5\x06P\
3438 \x8f\x1d\xf1'\x8c\xc5\x13*\x9f\xcb\x8a'\xe8_l\x17\x80\xe57\x1b\xea\xd4\xae\
3439 \xc7w\xfe9\x94\x1c\xdb\x83\x1e\x0f4\t\xc0^\xc6UFb\xee\xacS\xdba\xf8\xd5\x08\
3440 \xdd\xd3O\xc4t7\xab\xb8m\x93Z\xf2w\xbe\xfdgJk-\xb3\xc5\x11\xc6\xde\x8dS\x95\
3441 \x8a\xd7\xbf\xe4\xd8\xec\x9c\xecr\xb2Sfm\xf9\x0f3\xc9\x15\xdf\xcb^\x82X<\xa1\
3442 \x06#\x13\x0c}\x1a\x06 \xdc\xfc\xc87\xf0?\xb8\x1e\xc1\n\xa1\xac\x10Zk\xe9\
3443 \x18k\x95\x9fGS\xf2\xa58*\x9f7S\xd2\x92\x0c\x8b\xd6Z\xccL\xd0\xf6\x1d\xb4\
3444 \xd6\xd2\x92\x0c\xcb\xea\xdf\x0f\r\xc1w\x047%\x8d\xc0\x81\x02#i\x04VV\x88k\
3445 \x82\xbe\xde\xc2\xb0\xb2\xea\xa7\x00\x00\x00\x00IEND\xaeB`\x82"
3447 def getUndoBitmap():
3448 return BitmapFromImage(getUndoImage())
3451 stream
= cStringIO
.StringIO(getUndoData())
3452 return ImageFromStream(stream
)
3454 #----------------------------------------------------------------------
3457 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3458 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3459 \x00\x01\x88IDAT8\x8d\xa5\x92\xc1K\x02A\x14\xc6\xbfQ\t\xbc\x14tJ\xfb\x0f2\
3460 \x08\xbaD\xdd:\xe5!\xd2\xad$/\x82FP\x06\x99\x87\x04\xa1\x83D\x10\x0b\x85\xd4\
3461 \xa9\x8c (\x82<\xad\xce\xa9\xff\xc0[\xd2)\xbcu\t\xb2\xd0\xa5\xb5\x94\x14z\
3462 \x1dd\x87]\x1bBh\xe0\xc1\xf0\xde\xfb~3\xef\x9ba\xcc\xe1\xc4\x7f\x96K\x96\xdc\
3463 \xd6\xfcd\xeeO\x94;\xd67\xc0\x14Fg\xd7E\xae~\xa5S\xe3\xd3@!\xfe(\x051s\x84m\
3464 \xcdOV!\x004\xbf\r\x00\x80\xde\xae\xe2B\xbb\x94B\\\x00\x10\xb9\x9a\x12\xe2,W\
3465 Eqc~S\xec\xd7\x94\x18\xaa\xafY*e^l\x10\x87\xf5\xb4,W\xb1<\x98\x16q\x98W\xa1\
3466 \xb7\xab\x00\x80F\xa7\x0e\x00(\x164\xb2\x02\xc0\x1cN(\xb9qRr\xe3\xc49'\xe6p\
3467 \xc2\x1a3\xfb\xa3t\xfb\xbcK\xe7O[\xa4V\xc2\xe4K\x0e\xdb\xfa\\\x00\x10\xf3\
3468 \x1c\x00\x00\x02AEj\x94\xd11P\xffz\x93\x95\xba\x80^\xe1\xf4\xde\x08\x01@)\
3469 \xf3\xc2\xdek-!\xae5u\xe8\xcf-\x00\x80gi\x80l\x1e\xf4\xae\xc4j\x14c\x89!1o\
3470 \xad\xa9\x8b\xda\xc6\xf5\n\x16v&\xbb\x16\xc8~b\xb1\xa0\x91\xfa\x10G4\xb2h;\
3471 \xbd\xd1\xfe\x10=\xfc\xe8\x1eg\x91\xbc\xfc\x06\x81\xa0\xc2\xd2\x13\xa789\xbe\
3472 \x91\xde\xce\x14\x07\x82\nC\xaf\xeb\xd6\xe0\x9c\x93/9Lj%L\xa9\xf2\x1c\xa5\
3473 \xcas\xe4\r\xb9m\xaf\xf0'\xc0\x84xCnR+\xe1_\xe2\xbe\x00V\x88\xec\x9f\xf4\x05\
3474 0!\xb2\xfc\x0f\xe0\xc4\xb6\xad\x97R\xe5z\x00\x00\x00\x00IEND\xaeB`\x82"
3476 def getRedoBitmap():
3477 return BitmapFromImage(getRedoImage())
3480 stream
= cStringIO
.StringIO(getRedoData())
3481 return ImageFromStream(stream
)
3483 #----------------------------------------------------------------------------
3487 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3488 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3489 \x00\x00]IDAT8\x8d\xed\x931\x0e\xc00\x08\x03m\x92\xff\xff8q\x87\xb6C\x11\x89\
3490 \xa8X:\xd4\x13\x03:\x1b\x01\xa45T\xd4\xefBsh\xd7Hk\xdc\x02\x00@\x8a\x19$\xa1\
3491 9\x14A,\x95\xf3\x82G)\xd3\x00\xf24\xf7\x90\x1ev\x07\xee\x1e\xf4:\xc1J?\xe0\
3492 \x0b\x80\xc7\x1d\xf8\x1dg\xc4\xea7\x96G8\x00\xa8\x91\x19(\x85#P\x7f\x00\x00\
3493 \x00\x00IEND\xaeB`\x82'
3496 def getBlankBitmap():
3497 return BitmapFromImage(getBlankImage())
3499 def getBlankImage():
3500 stream
= cStringIO
.StringIO(getBlankData())
3501 return ImageFromStream(stream
)
3504 return wx
.IconFromBitmap(getBlankBitmap())