1 #----------------------------------------------------------------------------
3 # Purpose: Python extensions to the wxWindows docview framework
5 # Author: Peter Yared, Morgan Hua
9 # Copyright: (c) 2003-2005 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()
201 def OnAbout(self
, event
):
203 Invokes the about dialog.
205 aboutService
= wx
.GetApp().GetService(AboutService
)
207 aboutService
.ShowAbout()
210 def OnViewToolBar(self
, event
):
212 Toggles whether the ToolBar is visible.
214 self
._toolBar
.Show(not self
._toolBar
.IsShown())
218 def OnUpdateViewToolBar(self
, event
):
220 Updates the View ToolBar menu item.
222 event
.Check(self
.GetToolBar().IsShown())
225 def OnViewStatusBar(self
, event
):
227 Toggles whether the StatusBar is visible.
229 self
.GetStatusBar().Show(not self
.GetStatusBar().IsShown())
233 def OnUpdateViewStatusBar(self
, event
):
235 Updates the View StatusBar menu item.
237 event
.Check(self
.GetStatusBar().IsShown())
240 def UpdateStatus(self
, message
= _("Ready")):
242 Updates the StatusBar.
244 # wxBug: Menubar and toolbar help strings don't pop the status text back
245 if self
.GetStatusBar().GetStatusText() != message
:
246 self
.GetStatusBar().PushStatusText(message
)
249 class DocMDIParentFrameMixIn
:
251 Class with common code used by DocMDIParentFrame and DocTabbedParentFrame.
255 def _GetPosSizeFromConfig(self
, pos
, size
):
257 Adjusts the position and size of the frame using the saved config position and size.
259 config
= wx
.ConfigBase_Get()
260 if pos
== wx
.DefaultPosition
and size
== wx
.DefaultSize
and config
.ReadInt("MDIFrameMaximized", False):
262 size
= wx
.DisplaySize()
263 # 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
265 if pos
== wx
.DefaultPosition
:
266 pos
= config
.ReadInt("MDIFrameXLoc", -1), config
.ReadInt("MDIFrameYLoc", -1)
268 if wx
.Display_GetFromPoint(pos
) == -1: # Check if the frame position is offscreen
269 pos
= wx
.DefaultPosition
271 if size
== wx
.DefaultSize
:
272 size
= wx
.Size(config
.ReadInt("MDIFrameXSize", 450), config
.ReadInt("MDIFrameYSize", 300))
276 def _InitFrame(self
, embeddedWindows
):
278 Initializes the frame and creates the default menubar, toolbar, and status bar.
280 self
._embeddedWindows
= []
281 self
.SetDropTarget(_DocFrameFileDropTarget(self
._docManager
, self
))
283 if wx
.GetApp().GetDefaultIcon():
284 self
.SetIcon(wx
.GetApp().GetDefaultIcon())
286 wx
.EVT_MENU(self
, wx
.ID_ABOUT
, self
.OnAbout
)
287 wx
.EVT_SIZE(self
, self
.OnSize
)
289 self
.InitializePrintData()
291 toolBar
= self
.CreateDefaultToolBar()
292 self
.SetToolBar(toolBar
)
293 menuBar
= self
.CreateDefaultMenuBar()
294 statusBar
= self
.CreateDefaultStatusBar()
296 config
= wx
.ConfigBase_Get()
297 if config
.ReadInt("MDIFrameMaximized", False):
298 # wxBug: On maximize, statusbar leaves a residual that needs to be refereshed, happens even when user does it
301 self
.CreateEmbeddedWindows(embeddedWindows
)
304 if wx
.Platform
== '__WXMAC__':
305 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
307 wx
.GetApp().SetTopWindow(self
) # Need to do this here in case the services are looking for wx.GetApp().GetTopWindow()
308 for service
in wx
.GetApp().GetServices():
309 service
.InstallControls(self
, menuBar
= menuBar
, toolBar
= toolBar
, statusBar
= statusBar
)
310 if hasattr(service
, "ShowWindow"):
311 service
.ShowWindow() # instantiate service windows for correct positioning, we'll hide/show them later based on user preference
313 if wx
.Platform
!= '__WXMAC__':
314 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
317 def ProcessEvent(self
, event
):
319 Processes an event, searching event tables and calling zero or more
320 suitable event handler function(s). Note that the ProcessEvent
321 method is called from the wxPython docview framework directly since
322 wxPython does not have a virtual ProcessEvent function.
326 self
.OnFileSaveAll(event
)
329 return wx
.GetApp().ProcessEvent(event
)
332 def ProcessUpdateUIEvent(self
, event
):
334 Processes a UI event, searching event tables and calling zero or more
335 suitable event handler function(s). Note that the ProcessEvent
336 method is called from the wxPython docview framework directly since
337 wxPython does not have a virtual ProcessEvent function.
343 elif id == wx
.ID_COPY
:
346 elif id == wx
.ID_PASTE
:
349 elif id == wx
.ID_CLEAR
:
352 elif id == wx
.ID_SELECTALL
:
355 elif id == SAVEALL_ID
:
356 filesModified
= False
357 docs
= wx
.GetApp().GetDocumentManager().GetDocuments()
363 event
.Enable(filesModified
)
366 return wx
.GetApp().ProcessUpdateUIEvent(event
)
369 def CreateEmbeddedWindows(self
, windows
= 0):
371 Create the specified embedded windows around the edges of the frame.
373 frameSize
= self
.GetSize() # TODO: GetClientWindow.GetSize is still returning 0,0 since the frame isn't fully constructed yet, so using full frame size
374 defaultHSize
= int(frameSize
[0] / 6)
375 defaultVSize
= int(frameSize
[1] / 7)
376 defaultSubVSize
= int(frameSize
[1] / 2)
377 config
= wx
.ConfigBase_Get()
378 if windows
& (EMBEDDED_WINDOW_LEFT | EMBEDDED_WINDOW_TOPLEFT | EMBEDDED_WINDOW_BOTTOMLEFT
):
379 self
._leftEmbWindow
= self
._CreateEmbeddedWindow
(self
, (config
.ReadInt("MDIEmbedLeftSize", defaultHSize
), -1), wx
.LAYOUT_VERTICAL
, wx
.LAYOUT_LEFT
, visible
= config
.ReadInt("MDIEmbedLeftVisible", 1), sash
= wx
.SASH_RIGHT
)
381 self
._leftEmbWindow
= None
382 if windows
& EMBEDDED_WINDOW_TOPLEFT
:
383 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
)
385 self
._topLeftEmbWindow
= None
386 if windows
& EMBEDDED_WINDOW_BOTTOMLEFT
:
387 self
._bottomLeftEmbWindow
= self
._CreateEmbeddedWindow
(self
._leftEmbWindow
, (-1, config
.ReadInt("MDIEmbedBottomLeftSize", defaultSubVSize
)), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_BOTTOM
, visible
= config
.ReadInt("MDIEmbedBottomLeftVisible", 1))
389 self
._bottomLeftEmbWindow
= None
390 if windows
& (EMBEDDED_WINDOW_RIGHT | EMBEDDED_WINDOW_TOPRIGHT | EMBEDDED_WINDOW_BOTTOMRIGHT
):
391 self
._rightEmbWindow
= self
._CreateEmbeddedWindow
(self
, (config
.ReadInt("MDIEmbedRightSize", defaultHSize
), -1), wx
.LAYOUT_VERTICAL
, wx
.LAYOUT_RIGHT
, visible
= config
.ReadInt("MDIEmbedRightVisible", 1), sash
= wx
.SASH_LEFT
)
393 self
._rightEmbWindow
= None
394 if windows
& EMBEDDED_WINDOW_TOPRIGHT
:
395 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
)
397 self
._topRightEmbWindow
= None
398 if windows
& EMBEDDED_WINDOW_BOTTOMRIGHT
:
399 self
._bottomRightEmbWindow
= self
._CreateEmbeddedWindow
(self
._rightEmbWindow
, (-1, config
.ReadInt("MDIEmbedBottomRightSize", defaultSubVSize
)), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_BOTTOM
, visible
= config
.ReadInt("MDIEmbedBottomRightVisible", 1))
401 self
._bottomRightEmbWindow
= None
402 if windows
& EMBEDDED_WINDOW_TOP
:
403 self
._topEmbWindow
= self
._CreateEmbeddedWindow
(self
, (-1, config
.ReadInt("MDIEmbedTopSize", defaultVSize
)), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_TOP
, visible
= config
.ReadInt("MDIEmbedTopVisible", 1), sash
= wx
.SASH_BOTTOM
)
405 self
._topEmbWindow
= None
406 if windows
& EMBEDDED_WINDOW_BOTTOM
:
407 self
._bottomEmbWindow
= self
._CreateEmbeddedWindow
(self
, (-1, config
.ReadInt("MDIEmbedBottomSize", defaultVSize
)), wx
.LAYOUT_HORIZONTAL
, wx
.LAYOUT_BOTTOM
, visible
= config
.ReadInt("MDIEmbedBottomVisible", 1), sash
= wx
.SASH_TOP
)
409 self
._bottomEmbWindow
= None
412 def SaveEmbeddedWindowSizes(self
):
414 Saves the sizes of the embedded windows.
416 config
= wx
.ConfigBase_Get()
417 if not self
.IsMaximized():
418 config
.WriteInt("MDIFrameXLoc", self
.GetPositionTuple()[0])
419 config
.WriteInt("MDIFrameYLoc", self
.GetPositionTuple()[1])
420 config
.WriteInt("MDIFrameXSize", self
.GetSizeTuple()[0])
421 config
.WriteInt("MDIFrameYSize", self
.GetSizeTuple()[1])
422 config
.WriteInt("MDIFrameMaximized", self
.IsMaximized())
423 config
.WriteInt("ViewToolBar", self
._toolBar
.IsShown())
424 config
.WriteInt("ViewStatusBar", self
.GetStatusBar().IsShown())
426 if self
._leftEmbWindow
:
427 config
.WriteInt("MDIEmbedLeftSize", self
._leftEmbWindow
.GetSize()[0])
428 config
.WriteInt("MDIEmbedLeftVisible", self
._leftEmbWindow
.IsShown())
429 if self
._topLeftEmbWindow
:
430 if self
._topLeftEmbWindow
._sizeBeforeHidden
:
431 size
= self
._topLeftEmbWindow
._sizeBeforeHidden
[1]
433 size
= self
._topLeftEmbWindow
.GetSize()[1]
434 config
.WriteInt("MDIEmbedTopLeftSize", size
)
435 config
.WriteInt("MDIEmbedTopLeftVisible", self
._topLeftEmbWindow
.IsShown())
436 if self
._bottomLeftEmbWindow
:
437 if self
._bottomLeftEmbWindow
._sizeBeforeHidden
:
438 size
= self
._bottomLeftEmbWindow
._sizeBeforeHidden
[1]
440 size
= self
._bottomLeftEmbWindow
.GetSize()[1]
441 config
.WriteInt("MDIEmbedBottomLeftSize", size
)
442 config
.WriteInt("MDIEmbedBottomLeftVisible", self
._bottomLeftEmbWindow
.IsShown())
443 if self
._rightEmbWindow
:
444 config
.WriteInt("MDIEmbedRightSize", self
._rightEmbWindow
.GetSize()[0])
445 config
.WriteInt("MDIEmbedRightVisible", self
._rightEmbWindow
.IsShown())
446 if self
._topRightEmbWindow
:
447 if self
._topRightEmbWindow
._sizeBeforeHidden
:
448 size
= self
._topRightEmbWindow
._sizeBeforeHidden
[1]
450 size
= self
._topRightEmbWindow
.GetSize()[1]
451 config
.WriteInt("MDIEmbedTopRightSize", size
)
452 config
.WriteInt("MDIEmbedTopRightVisible", self
._topRightEmbWindow
.IsShown())
453 if self
._bottomRightEmbWindow
:
454 if self
._bottomRightEmbWindow
._sizeBeforeHidden
:
455 size
= self
._bottomRightEmbWindow
._sizeBeforeHidden
[1]
457 size
= self
._bottomRightEmbWindow
.GetSize()[1]
458 config
.WriteInt("MDIEmbedBottomRightSize", size
)
459 config
.WriteInt("MDIEmbedBottomRightVisible", self
._bottomRightEmbWindow
.IsShown())
460 if self
._topEmbWindow
:
461 config
.WriteInt("MDIEmbedTopSize", self
._topEmbWindow
.GetSize()[1])
462 config
.WriteInt("MDIEmbedTopVisible", self
._topEmbWindow
.IsShown())
463 if self
._bottomEmbWindow
:
464 config
.WriteInt("MDIEmbedBottomSize", self
._bottomEmbWindow
.GetSize()[1])
465 config
.WriteInt("MDIEmbedBottomVisible", self
._bottomEmbWindow
.IsShown())
468 def GetEmbeddedWindow(self
, loc
):
470 Returns the instance of the embedded window specified by the embedded window location constant.
472 if loc
== EMBEDDED_WINDOW_TOP
:
473 return self
._topEmbWindow
474 elif loc
== EMBEDDED_WINDOW_BOTTOM
:
475 return self
._bottomEmbWindow
476 elif loc
== EMBEDDED_WINDOW_LEFT
:
477 return self
._leftEmbWindow
478 elif loc
== EMBEDDED_WINDOW_RIGHT
:
479 return self
._rightEmbWindow
480 elif loc
== EMBEDDED_WINDOW_TOPLEFT
:
481 return self
._topLeftEmbWindow
482 elif loc
== EMBEDDED_WINDOW_BOTTOMLEFT
:
483 return self
._bottomLeftEmbWindow
484 elif loc
== EMBEDDED_WINDOW_TOPRIGHT
:
485 return self
._topRightEmbWindow
486 elif loc
== EMBEDDED_WINDOW_BOTTOMRIGHT
:
487 return self
._bottomRightEmbWindow
491 def _CreateEmbeddedWindow(self
, parent
, size
, orientation
, alignment
, visible
= True, sash
= None):
493 Creates the embedded window with the specified size, orientation, and alignment. If the
494 window is not visible it will retain the size with which it was last viewed.
496 window
= wx
.SashLayoutWindow(parent
, wx
.NewId(), style
= wx
.NO_BORDER | wx
.SW_3D
)
497 window
.SetDefaultSize(size
)
498 window
.SetOrientation(orientation
)
499 window
.SetAlignment(alignment
)
500 if sash
!= None: # wx.SASH_TOP is 0 so check for None instead of just doing "if sash:"
501 window
.SetSashVisible(sash
, True)
503 def OnEmbeddedWindowSashDrag(event
):
504 if event
.GetDragStatus() == wx
.SASH_STATUS_OUT_OF_RANGE
:
506 sashWindow
= event
.GetEventObject()
507 if sashWindow
.GetAlignment() == wx
.LAYOUT_TOP
or sashWindow
.GetAlignment() == wx
.LAYOUT_BOTTOM
:
508 size
= wx
.Size(-1, event
.GetDragRect().height
)
510 size
= wx
.Size(event
.GetDragRect().width
, -1)
511 event
.GetEventObject().SetDefaultSize(size
)
514 if isinstance(sashWindow
.GetParent(), wx
.SashLayoutWindow
):
516 parentSashWindow
= sashWindow
.GetParent() # Force a refresh
517 parentSashWindow
.Layout()
518 parentSashWindow
.Refresh()
519 parentSashWindow
.SetSize((parentSashWindow
.GetSize().width
+ 1, parentSashWindow
.GetSize().height
+ 1))
521 wx
.EVT_SASH_DRAGGED(window
, window
.GetId(), OnEmbeddedWindowSashDrag
)
522 window
._sizeBeforeHidden
= None
525 if isinstance(parent
, wx
.SashLayoutWindow
): # It's a window embedded in another sash window so remember its actual size to show it again
526 window
._sizeBeforeHidden
= size
530 def ShowEmbeddedWindow(self
, window
, show
= True):
532 Shows or hides the embedded window specified by the embedded window location constant.
535 if isinstance(window
.GetParent(), wx
.SashLayoutWindow
): # It is a parent sashwindow with multiple embedded sashwindows
536 parentSashWindow
= window
.GetParent()
537 if show
: # Make sure it is visible in case all of the subwindows were hidden
538 parentSashWindow
.Show()
539 if show
and window
._sizeBeforeHidden
:
540 if window
._sizeBeforeHidden
[1] == parentSashWindow
.GetClientSize()[1]:
541 if window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
) and self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
).IsShown():
542 window
.SetDefaultSize((window
._sizeBeforeHidden
[0], window
._sizeBeforeHidden
[0] - self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
).GetSize()[1]))
543 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
) and self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
).IsShown():
544 window
.SetDefaultSize((window
._sizeBeforeHidden
[0], window
._sizeBeforeHidden
[0] - self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
).GetSize()[1]))
545 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
) and self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
).IsShown():
546 window
.SetDefaultSize((window
._sizeBeforeHidden
[0], window
._sizeBeforeHidden
[0] - self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
).GetSize()[1]))
547 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
) and self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
).IsShown():
548 window
.SetDefaultSize((window
._sizeBeforeHidden
[0], window
._sizeBeforeHidden
[0] - self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
).GetSize()[1]))
550 window
.SetDefaultSize(window
._sizeBeforeHidden
)
551 # 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
552 if window
._sizeBeforeHidden
[1] < parentSashWindow
.GetClientSize()[1]:
553 otherWindowSize
= (-1, parentSashWindow
.GetClientSize()[1] - window
._sizeBeforeHidden
[1])
554 if window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
):
555 self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
).SetDefaultSize(otherWindowSize
)
556 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
):
557 self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
).SetDefaultSize(otherWindowSize
)
558 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
):
559 self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
).SetDefaultSize(otherWindowSize
)
560 elif window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
):
561 self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
).SetDefaultSize(otherWindowSize
)
564 if window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
) and not self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
).IsShown() \
565 or window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPRIGHT
) and not self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMRIGHT
).IsShown() \
566 or window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
) and not self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
).IsShown() \
567 or window
== self
.GetEmbeddedWindow(EMBEDDED_WINDOW_TOPLEFT
) and not self
.GetEmbeddedWindow(EMBEDDED_WINDOW_BOTTOMLEFT
).IsShown():
568 parentSashWindow
.Hide() # Hide the parent sashwindow if all of the children are hidden
569 parentSashWindow
.Layout() # Force a refresh
570 parentSashWindow
.Refresh()
571 parentSashWindow
.SetSize((parentSashWindow
.GetSize().width
+ 1, parentSashWindow
.GetSize().height
+ 1))
575 def HideEmbeddedWindow(self
):
577 Hides the embedded window specified by the embedded window location constant.
579 self
.ShowEmbeddedWindow(show
= False)
582 class DocTabbedChildFrame(wx
.Panel
):
584 The wxDocMDIChildFrame class provides a default frame for displaying
585 documents on separate windows. This class can only be used for MDI child
588 The class is part of the document/view framework supported by wxWindows,
589 and cooperates with the wxView, wxDocument, wxDocManager and wxDocTemplate
594 def __init__(self
, doc
, view
, frame
, id, title
, pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
, name
= "frame"):
596 Constructor. Note that the event table must be rebuilt for the
597 frame since the EvtHandler is not virtual.
599 wx
.Panel
.__init
__(self
, frame
.GetNotebook(), id)
600 self
._childDocument
= doc
601 self
._childView
= view
602 frame
.AddNotebookPage(self
, doc
.GetPrintableName())
609 Dummy method since the icon of tabbed frames are managed by the notebook.
614 def SetIcon(self
, icon
):
616 Dummy method since the icon of tabbed frames are managed by the notebook.
623 Removes the current notebook page.
625 wx
.GetApp().GetTopWindow().RemoveNotebookPage(self
)
630 Activates the current notebook page.
632 wx
.GetApp().GetTopWindow().ActivateNotebookPage(self
)
635 def Activate(self
): # Need this in case there are embedded sash windows and such, OnActivate is not getting called
637 Activates the current view.
639 # Called by Project Editor
641 self
._childView
.Activate(True)
646 Returns the frame's title.
648 wx
.GetApp().GetTopWindow().GetNotebookPageTitle(self
)
651 def SetTitle(self
, title
):
653 Sets the frame's title.
655 wx
.GetApp().GetTopWindow().SetNotebookPageTitle(self
, title
)
658 def ProcessEvent(event
):
660 Processes an event, searching event tables and calling zero or more
661 suitable event handler function(s). Note that the ProcessEvent
662 method is called from the wxPython docview framework directly since
663 wxPython does not have a virtual ProcessEvent function.
665 if not self
._childView
or not self
._childView
.ProcessEvent(event
):
666 if not isinstance(event
, wx
.CommandEvent
) or not self
.GetParent() or not self
.GetParent().ProcessEvent(event
):
674 def GetDocument(self
):
676 Returns the document associated with this frame.
678 return self
._childDocument
681 def SetDocument(self
, document
):
683 Sets the document for this frame.
685 self
._childDocument
= document
690 Returns the view associated with this frame.
692 return self
._childView
695 def SetView(self
, view
):
697 Sets the view for this frame.
699 self
._childView
= view
702 class DocTabbedParentFrame(wx
.Frame
, DocFrameMixIn
, DocMDIParentFrameMixIn
):
704 The DocTabbedParentFrame class provides a default top-level frame for
705 applications using the document/view framework. This class can only be
706 used for MDI parent frames that use a tabbed interface.
708 It cooperates with the wxView, wxDocument, wxDocManager and wxDocTemplate
713 def __init__(self
, docManager
, frame
, id, title
, pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
, name
= "DocTabbedParentFrame", embeddedWindows
= 0):
715 Constructor. Note that the event table must be rebuilt for the
716 frame since the EvtHandler is not virtual.
718 pos
, size
= self
._GetPosSizeFromConfig
(pos
, size
)
719 wx
.Frame
.__init
__(self
, frame
, id, title
, pos
, size
, style
, name
)
721 # From docview.MDIParentFrame
722 self
._docManager
= docManager
724 wx
.EVT_CLOSE(self
, self
.OnCloseWindow
)
726 wx
.EVT_MENU(self
, wx
.ID_EXIT
, self
.OnExit
)
727 wx
.EVT_MENU_RANGE(self
, wx
.ID_FILE1
, wx
.ID_FILE9
, self
.OnMRUFile
)
729 wx
.EVT_MENU(self
, wx
.ID_NEW
, self
.ProcessEvent
)
730 wx
.EVT_MENU(self
, wx
.ID_OPEN
, self
.ProcessEvent
)
731 wx
.EVT_MENU(self
, wx
.ID_CLOSE_ALL
, self
.ProcessEvent
)
732 wx
.EVT_MENU(self
, wx
.ID_CLOSE
, self
.ProcessEvent
)
733 wx
.EVT_MENU(self
, wx
.ID_REVERT
, self
.ProcessEvent
)
734 wx
.EVT_MENU(self
, wx
.ID_SAVE
, self
.ProcessEvent
)
735 wx
.EVT_MENU(self
, wx
.ID_SAVEAS
, self
.ProcessEvent
)
736 wx
.EVT_MENU(self
, wx
.ID_UNDO
, self
.ProcessEvent
)
737 wx
.EVT_MENU(self
, wx
.ID_REDO
, self
.ProcessEvent
)
738 wx
.EVT_MENU(self
, wx
.ID_PRINT
, self
.ProcessEvent
)
739 wx
.EVT_MENU(self
, wx
.ID_PRINT_SETUP
, self
.ProcessEvent
)
740 wx
.EVT_MENU(self
, wx
.ID_PREVIEW
, self
.ProcessEvent
)
741 wx
.EVT_MENU(self
, wx
.ID_ABOUT
, self
.OnAbout
)
743 wx
.EVT_UPDATE_UI(self
, wx
.ID_NEW
, self
.ProcessUpdateUIEvent
)
744 wx
.EVT_UPDATE_UI(self
, wx
.ID_OPEN
, self
.ProcessUpdateUIEvent
)
745 wx
.EVT_UPDATE_UI(self
, wx
.ID_CLOSE_ALL
, self
.ProcessUpdateUIEvent
)
746 wx
.EVT_UPDATE_UI(self
, wx
.ID_CLOSE
, self
.ProcessUpdateUIEvent
)
747 wx
.EVT_UPDATE_UI(self
, wx
.ID_REVERT
, self
.ProcessUpdateUIEvent
)
748 wx
.EVT_UPDATE_UI(self
, wx
.ID_SAVE
, self
.ProcessUpdateUIEvent
)
749 wx
.EVT_UPDATE_UI(self
, wx
.ID_SAVEAS
, self
.ProcessUpdateUIEvent
)
750 wx
.EVT_UPDATE_UI(self
, wx
.ID_UNDO
, self
.ProcessUpdateUIEvent
)
751 wx
.EVT_UPDATE_UI(self
, wx
.ID_REDO
, self
.ProcessUpdateUIEvent
)
752 wx
.EVT_UPDATE_UI(self
, wx
.ID_PRINT
, self
.ProcessUpdateUIEvent
)
753 wx
.EVT_UPDATE_UI(self
, wx
.ID_PRINT_SETUP
, self
.ProcessUpdateUIEvent
)
754 wx
.EVT_UPDATE_UI(self
, wx
.ID_PREVIEW
, self
.ProcessUpdateUIEvent
)
755 # End From docview.MDIParentFrame
757 self
.CreateNotebook()
758 self
._InitFrame
(embeddedWindows
)
761 def _LayoutFrame(self
):
765 wx
.LayoutAlgorithm().LayoutFrame(self
, self
._notebook
)
768 def CreateNotebook(self
):
770 Creates the notebook to use for the tabbed document interface.
772 self
._notebook
= wx
.Notebook(self
, wx
.NewId())
773 # self._notebook.SetSizer(wx.NotebookSizer(self._notebook))
774 wx
.EVT_NOTEBOOK_PAGE_CHANGED(self
, self
._notebook
.GetId(), self
.OnNotebookPageChanged
)
775 wx
.EVT_RIGHT_DOWN(self
._notebook
, self
.OnNotebookRightClick
)
777 templates
= wx
.GetApp().GetDocumentManager().GetTemplates()
778 iconList
= wx
.ImageList(16, 16, initialCount
= len(templates
))
779 self
._iconIndexLookup
= []
780 for template
in templates
:
781 icon
= template
.GetIcon()
783 if icon
.GetHeight() != 16:
784 icon
.SetHeight(16) # wxBug: img2py.py uses EmptyIcon which is 32x32
785 if icon
.GetWidth() != 16:
786 icon
.SetWidth(16) # wxBug: img2py.py uses EmptyIcon which is 32x32
787 iconIndex
= iconList
.AddIcon(icon
)
788 self
._iconIndexLookup
.append((template
, iconIndex
))
790 icon
= getBlankIcon()
791 if icon
.GetHeight() != 16:
792 icon
.SetHeight(16) # wxBug: img2py.py uses EmptyIcon which is 32x32
793 if icon
.GetWidth() != 16:
794 icon
.SetWidth(16) # wxBug: img2py.py uses EmptyIcon which is 32x32
795 self
._blankIconIndex
= iconList
.AddIcon(icon
)
796 self
._notebook
.AssignImageList(iconList
)
799 def GetNotebook(self
):
801 Returns the notebook used by the tabbed document interface.
803 return self
._notebook
806 def GetActiveChild(self
):
808 Returns the active notebook page, which to the framework is treated as
811 index
= self
._notebook
.GetSelection()
814 return self
._notebook
.GetPage(index
)
817 def OnNotebookPageChanged(self
, event
):
819 Activates a notebook page's view when it is selected.
821 index
= self
._notebook
.GetSelection()
823 self
._notebook
.GetPage(index
).GetView().Activate()
826 def OnNotebookRightClick(self
, event
):
828 Handles right clicks for the notebook, enabling users to either close
829 a tab or select from the available documents if the user clicks on the
830 notebook's white space.
832 index
, type = self
._notebook
.HitTest(event
.GetPosition())
834 x
, y
= event
.GetX(), event
.GetY()
836 doc
= self
._notebook
.GetPage(index
).GetView().GetDocument()
838 menu
.Append(id, _("Close"))
839 def OnRightMenuSelect(event
):
841 wx
.EVT_MENU(self
, id, OnRightMenuSelect
)
842 if self
._notebook
.GetPageCount() > 1:
843 menu
.AppendSeparator()
845 menu
.AppendMenu(wx
.NewId(), _("Select Tab"), tabsMenu
)
847 y
= y
- 25 # wxBug: It is offsetting click events in the blank notebook area
850 if self
._notebook
.GetPageCount() > 1:
852 for i
in range(0, self
._notebook
.GetPageCount()):
855 tabsMenu
.Append(id, self
._notebook
.GetPageText(i
))
856 def OnRightMenuSelect(event
):
857 self
._notebook
.SetSelection(selectIDs
[event
.GetId()])
858 wx
.EVT_MENU(self
, id, OnRightMenuSelect
)
860 self
._notebook
.PopupMenu(menu
, wx
.Point(x
, y
))
864 def AddNotebookPage(self
, panel
, title
):
866 Adds a document page to the notebook.
868 self
._notebook
.AddPage(panel
, title
)
869 index
= self
._notebook
.GetPageCount() - 1
870 self
._notebook
.SetSelection(index
)
872 found
= False # Now set the icon
873 template
= panel
.GetDocument().GetDocumentTemplate()
875 for t
, iconIndex
in self
._iconIndexLookup
:
877 self
._notebook
.SetPageImage(index
, iconIndex
)
881 self
._notebook
.SetPageImage(index
, self
._blankIconIndex
)
882 self
._notebook
.Layout()
885 def RemoveNotebookPage(self
, panel
):
887 Removes a document page from the notebook.
889 index
= self
.GetNotebookPageIndex(panel
)
891 self
._notebook
.DeletePage(index
)
894 def ActivateNotebookPage(self
, panel
):
896 Sets the notebook to the specified panel.
898 index
= self
.GetNotebookPageIndex(panel
)
900 self
._notebook
.SetSelection(index
)
903 def GetNotebookPageTitle(self
, panel
):
904 self
._notebook
.GetPageText(self
.GetNotebookPageIndex(panel
))
907 def SetNotebookPageTitle(self
, panel
, title
):
908 self
._notebook
.SetPageText(self
.GetNotebookPageIndex(panel
), title
)
911 def GetNotebookPageIndex(self
, panel
):
913 Returns the index of particular notebook panel.
916 for i
in range(self
._notebook
.GetPageCount()):
917 if self
._notebook
.GetPage(i
) == panel
:
923 def ProcessEvent(self
, event
):
925 Processes an event, searching event tables and calling zero or more
926 suitable event handler function(s). Note that the ProcessEvent
927 method is called from the wxPython docview framework directly since
928 wxPython does not have a virtual ProcessEvent function.
930 if wx
.GetApp().ProcessEventBeforeWindows(event
):
932 if self
._docManager
and self
._docManager
.ProcessEvent(event
):
934 return DocMDIParentFrameMixIn
.ProcessEvent(self
, event
)
937 def ProcessUpdateUIEvent(self
, event
):
939 Processes a UI event, searching event tables and calling zero or more
940 suitable event handler function(s). Note that the ProcessEvent
941 method is called from the wxPython docview framework directly since
942 wxPython does not have a virtual ProcessEvent function.
944 if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
):
946 if self
._docManager
and self
._docManager
.ProcessUpdateUIEvent(event
):
948 return DocMDIParentFrameMixIn
.ProcessUpdateUIEvent(self
, event
)
951 def OnExit(self
, event
):
953 Called when File/Exit is chosen and closes the window.
958 def OnMRUFile(self
, event
):
960 Opens the appropriate file when it is selected from the file history
963 n
= event
.GetId() - wx
.ID_FILE1
964 filename
= self
._docManager
.GetHistoryFile(n
)
966 self
._docManager
.CreateDocument(filename
, wx
.lib
.docview
.DOC_SILENT
)
968 self
._docManager
.RemoveFileFromHistory(n
)
969 msgTitle
= wx
.GetApp().GetAppName()
971 msgTitle
= _("File Error")
972 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),
974 wx
.OK | wx
.ICON_EXCLAMATION
,
978 def OnSize(self
, event
):
980 Called when the frame is resized and lays out the client window.
982 # Needed in case there are splitpanels around the mdi frame
986 def OnCloseWindow(self
, event
):
988 Called when the frame is closed. Remembers the frame size.
990 self
.SaveEmbeddedWindowSizes()
992 # save and close services last
993 for service
in wx
.GetApp().GetServices():
994 if not service
.OnCloseFrame(event
):
997 # From docview.MDIParentFrame
998 if self
._docManager
.Clear(not event
.CanVeto()):
1004 class DocMDIChildFrame(wx
.MDIChildFrame
):
1006 The wxDocMDIChildFrame class provides a default frame for displaying
1007 documents on separate windows. This class can only be used for MDI child
1010 The class is part of the document/view framework supported by wxWindows,
1011 and cooperates with the wxView, wxDocument, wxDocManager and wxDocTemplate
1016 def __init__(self
, doc
, view
, frame
, id, title
, pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
, name
= "frame"):
1018 Constructor. Note that the event table must be rebuilt for the
1019 frame since the EvtHandler is not virtual.
1021 wx
.MDIChildFrame
.__init
__(self
, frame
, id, title
, pos
, size
, style
, name
)
1022 self
._childDocument
= doc
1023 self
._childView
= view
1026 # self.Create(doc, view, frame, id, title, pos, size, style, name)
1027 self
._activeEvent
= None
1029 wx
.EVT_ACTIVATE(self
, self
.OnActivate
)
1030 wx
.EVT_CLOSE(self
, self
.OnCloseWindow
)
1032 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
1033 mdiChildren
= filter(lambda x
: isinstance(x
, wx
.MDIChildFrame
), frame
.GetChildren())
1034 if len(mdiChildren
) == 1:
1038 ## # Couldn't get this to work, but seems to work fine with single stage construction
1039 ## def Create(self, doc, view, frame, id, title, pos, size, style, name):
1040 ## self._childDocument = doc
1041 ## self._childView = view
1042 ## if wx.MDIChildFrame.Create(self, frame, id, title, pos, size, style, name):
1044 ## view.SetFrame(self)
1050 def Activate(self
): # Need this in case there are embedded sash windows and such, OnActivate is not getting called
1052 Activates the current view.
1055 self
._childView
.Activate(True)
1058 def ProcessEvent(event
):
1060 Processes an event, searching event tables and calling zero or more
1061 suitable event handler function(s). Note that the ProcessEvent
1062 method is called from the wxPython docview framework directly since
1063 wxPython does not have a virtual ProcessEvent function.
1065 if self
._activeEvent
== event
:
1068 self
._activeEvent
= event
# Break recursion loops
1071 self
._childView
.Activate(True)
1073 if not self
._childView
or not self
._childView
.ProcessEvent(event
):
1074 if not isinstance(event
, wx
.CommandEvent
) or not self
.GetParent() or not self
.GetParent().ProcessEvent(event
):
1081 self
._activeEvent
= None
1085 def OnActivate(self
, event
):
1087 Sets the currently active view to be the frame's view. You may need to
1088 override (but still call) this function in order to set the keyboard
1089 focus for your subwindow.
1091 if self
._activated
!= 0:
1093 self
._activated
+= 1
1094 wx
.MDIChildFrame
.Activate(self
)
1095 if event
.GetActive() and self
._childView
:
1096 self
._childView
.Activate(event
.GetActive())
1100 def OnCloseWindow(self
, event
):
1102 Closes and deletes the current view and document.
1106 if not event
.CanVeto():
1109 ans
= self
._childView
.Close(deleteWindow
= False)
1112 self
._childView
.Activate(False)
1113 self
._childView
.Destroy()
1114 self
._childView
= None
1115 if self
._childDocument
:
1116 self
._childDocument
.Destroy() # This isn't in the wxWindows codebase but the document needs to be disposed of somehow
1117 self
._childDocument
= None
1125 def GetDocument(self
):
1127 Returns the document associated with this frame.
1129 return self
._childDocument
1132 def SetDocument(self
, document
):
1134 Sets the document for this frame.
1136 self
._childDocument
= document
1141 Returns the view associated with this frame.
1143 return self
._childView
1146 def SetView(self
, view
):
1148 Sets the view for this frame.
1150 self
._childView
= view
1156 class DocService(wx
.EvtHandler
):
1158 An abstract class used to add reusable services to a docview application.
1163 """Initializes the DocService."""
1167 def GetDocumentManager(self
):
1168 """Returns the DocManager for the docview application."""
1169 return self
._docManager
1172 def SetDocumentManager(self
, docManager
):
1173 """Sets the DocManager for the docview application."""
1174 self
._docManager
= docManager
1177 def InstallControls(self
, frame
, menuBar
= None, toolBar
= None, statusBar
= None, document
= None):
1178 """Called to install controls into the menubar and toolbar of a SDI or MDI window. Override this method for a particular service."""
1182 def ProcessEventBeforeWindows(self
, event
):
1184 Processes an event before the main window has a chance to process the window.
1185 Override this method for a particular service.
1190 def ProcessUpdateUIEventBeforeWindows(self
, event
):
1192 Processes a UI event before the main window has a chance to process the window.
1193 Override this method for a particular service.
1198 def ProcessEvent(self
, event
):
1200 Processes an event, searching event tables and calling zero or more
1201 suitable event handler function(s). Note that the ProcessEvent
1202 method is called from the wxPython docview framework directly since
1203 wxPython does not have a virtual ProcessEvent function.
1208 def ProcessUpdateUIEvent(self
, event
):
1210 Processes a UI event, searching event tables and calling zero or more
1211 suitable event handler function(s). Note that the ProcessEvent
1212 method is called from the wxPython docview framework directly since
1213 wxPython does not have a virtual ProcessEvent function.
1218 def OnCloseFrame(self
, event
):
1220 Called when the a docview frame is being closed. Override this method
1221 so a service can either do cleanup or veto the frame being closed by
1229 Called when the the docview application is being closed. Override this method
1230 so a service can either do cleanup or veto the frame being closed by
1236 def GetMenuItemPos(self
, menu
, id):
1238 Utility method used to find the position of a menu item so that services can
1239 easily find where to insert a menu item in InstallControls.
1241 menuItems
= menu
.GetMenuItems()
1242 for i
, menuItem
in enumerate(menuItems
):
1243 if menuItem
.GetId() == id:
1250 Called by WindowMenuService to get views for services that don't
1251 have dedicated documents such as the Outline Service.
1256 class DocOptionsService(DocService
):
1258 A service that implements an options menu item and an options dialog with
1259 notebook tabs. New tabs can be added by other services by calling the
1260 "AddOptionsPanel" method.
1264 def __init__(self
, showGeneralOptions
=True, allowModeChanges
=True):
1266 Initializes the options service with the option of suppressing the default
1267 general options pane that is included with the options service by setting
1268 showGeneralOptions to False. It allowModeChanges is set to False, the
1269 default general options pane will allow users to change the document
1270 interface mode between SDI and MDI modes.
1272 DocService
.__init
__(self
)
1273 self
.ClearOptionsPanels()
1274 self
._allowModeChanges
= allowModeChanges
1275 self
._toolOptionsID
= wx
.NewId()
1276 if showGeneralOptions
:
1277 self
.AddOptionsPanel(GeneralOptionsPanel
)
1280 def InstallControls(self
, frame
, menuBar
= None, toolBar
= None, statusBar
= None, document
= None):
1282 Installs a "Tools" menu with an "Options" menu item.
1284 toolsMenuIndex
= menuBar
.FindMenu(_("&Tools"))
1285 if toolsMenuIndex
> -1:
1286 toolsMenu
= menuBar
.GetMenu(toolsMenuIndex
)
1288 toolsMenu
= wx
.Menu()
1289 if toolsMenuIndex
== -1:
1290 formatMenuIndex
= menuBar
.FindMenu(_("&Format"))
1291 menuBar
.Insert(formatMenuIndex
+ 1, toolsMenu
, _("&Tools"))
1293 if toolsMenu
.GetMenuItemCount():
1294 toolsMenu
.AppendSeparator()
1295 toolsMenu
.Append(self
._toolOptionsID
, _("&Options..."), _("Sets options"))
1296 wx
.EVT_MENU(frame
, self
._toolOptionsID
, frame
.ProcessEvent
)
1299 def ProcessEvent(self
, event
):
1301 Checks to see if the "Options" menu item has been selected.
1304 if id == self
._toolOptionsID
:
1305 self
.OnOptions(event
)
1311 def GetAllowModeChanges(self
):
1313 Return true if the default general options pane should allow users to
1314 change the document interface mode between SDI and MDI modes.
1316 return self
._allowModeChanges
1319 def SetAllowModeChanges(self
, allowModeChanges
):
1321 Set to true if the default general options pane should allow users to
1322 change the document interface mode between SDI and MDI modes.
1324 self
._allowModeChanges
= allowModeChanges
1327 def ClearOptionsPanels(self
):
1329 Clears all of the options panels that have been added into the
1332 self
._optionsPanels
= []
1335 def AddOptionsPanel(self
, optionsPanel
):
1337 Adds an options panel to the options dialog.
1339 self
._optionsPanels
.append(optionsPanel
)
1342 def OnOptions(self
, event
):
1344 Shows the options dialog, called when the "Options" menu item is selected.
1346 if len(self
._optionsPanels
) == 0:
1348 optionsDialog
= OptionsDialog(wx
.GetApp().GetTopWindow(), self
._optionsPanels
, self
._docManager
)
1349 if optionsDialog
.ShowModal() == wx
.ID_OK
:
1350 optionsDialog
.OnOK(optionsDialog
) # wxBug: wxDialog should be calling this automatically but doesn't
1351 optionsDialog
.Destroy()
1354 class OptionsDialog(wx
.Dialog
):
1356 A default options dialog used by the OptionsService that hosts a notebook
1357 tab of options panels.
1361 def __init__(self
, parent
, optionsPanelClasses
, docManager
):
1363 Initializes the options dialog with a notebook page that contains new
1364 instances of the passed optionsPanelClasses.
1366 wx
.Dialog
.__init
__(self
, parent
, -1, _("Options"), size
= (570, 365))
1368 self
._optionsPanels
= []
1369 self
._docManager
= docManager
1374 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
1376 optionsNotebook
= wx
.Notebook(self
, -1, size
= (560, 325))
1377 sizer
.Add(optionsNotebook
, 0, wx
.ALL | wx
.EXPAND
, SPACE
)
1378 for optionsPanelClass
in optionsPanelClasses
:
1379 optionsPanel
= optionsPanelClass(optionsNotebook
, -1)
1380 self
._optionsPanels
.append(optionsPanel
)
1381 sizer
.Add(self
.CreateButtonSizer(wx
.OK | wx
.CANCEL
), 0, wx
.ALIGN_RIGHT | wx
.RIGHT | wx
.BOTTOM
, HALF_SPACE
)
1382 self
.SetSizer(sizer
)
1384 if wx
.Platform
!= '__WXMAC__' or len(optionsPanelClasses
) < 6: # wxBug: Notebook tabs are truncated and user can't get to them on the Mac
1386 wx
.CallAfter(self
.DoRefresh
)
1389 def DoRefresh(self
):
1391 wxBug: On Windows XP when using a multiline notebook the default page doesn't get
1392 drawn, but it works when using a single line notebook.
1397 def GetDocManager(self
):
1399 Returns the document manager passed to the OptionsDialog constructor.
1401 return self
._docManager
1404 def OnOK(self
, event
):
1406 Calls the OnOK method of all of the OptionDialog's embedded panels
1408 for optionsPanel
in self
._optionsPanels
:
1409 optionsPanel
.OnOK(event
)
1412 class GeneralOptionsPanel(wx
.Panel
):
1414 A general options panel that is used in the OptionDialog to configure the
1415 generic properties of a pydocview application, such as "show tips at startup"
1416 and whether to use SDI or MDI for the application.
1420 def __init__(self
, parent
, id):
1422 Initializes the panel by adding an "Options" folder tab to the parent notebook and
1423 populating the panel with the generic properties of a pydocview application.
1425 wx
.Panel
.__init
__(self
, parent
, id)
1428 config
= wx
.ConfigBase_Get()
1429 self
._showTipsCheckBox
= wx
.CheckBox(self
, -1, _("Show tips at start up"))
1430 self
._showTipsCheckBox
.SetValue(config
.ReadInt("ShowTipAtStartup", True))
1431 if wx
.GetApp().GetService(DocOptionsService
).GetAllowModeChanges():
1432 choices
= [_("Show each document in its own window"), _("Show all documents in a single window with tabs")]
1433 if wx
.Platform
== "__WXMSW__":
1434 choices
.append(_("Show all documents in a single window with child windows"))
1435 self
._documentRadioBox
= wx
.RadioBox(self
, -1, _("Document Interface"),
1439 if config
.ReadInt("UseWinMDI", False):
1440 self
._documentRadioBox
.SetSelection(2)
1441 elif config
.ReadInt("UseMDI", True):
1442 self
._documentRadioBox
.SetSelection(1)
1444 self
._documentRadioBox
.SetSelection(0)
1445 def OnDocumentInterfaceSelect(event
):
1446 if not self
._documentInterfaceMessageShown
:
1447 msgTitle
= wx
.GetApp().GetAppName()
1449 msgTitle
= _("Document Options")
1450 wx
.MessageBox("Document interface changes will not appear until the application is restarted.",
1452 wx
.OK | wx
.ICON_INFORMATION
,
1454 self
._documentInterfaceMessageShown
= True
1455 wx
.EVT_RADIOBOX(self
, self
._documentRadioBox
.GetId(), OnDocumentInterfaceSelect
)
1456 optionsBorderSizer
= wx
.BoxSizer(wx
.VERTICAL
)
1457 optionsSizer
= wx
.BoxSizer(wx
.VERTICAL
)
1458 if wx
.GetApp().GetService(DocOptionsService
).GetAllowModeChanges():
1459 optionsSizer
.Add(self
._documentRadioBox
, 0, wx
.ALL
, HALF_SPACE
)
1460 optionsSizer
.Add(self
._showTipsCheckBox
, 0, wx
.ALL
, HALF_SPACE
)
1461 optionsBorderSizer
.Add(optionsSizer
, 0, wx
.ALL
, SPACE
)
1462 self
.SetSizer(optionsBorderSizer
)
1464 self
._documentInterfaceMessageShown
= False
1465 parent
.AddPage(self
, _("Options"))
1468 def OnOK(self
, optionsDialog
):
1470 Updates the config based on the selections in the options panel.
1472 config
= wx
.ConfigBase_Get()
1473 config
.WriteInt("ShowTipAtStartup", self
._showTipsCheckBox
.GetValue())
1474 if wx
.GetApp().GetService(DocOptionsService
).GetAllowModeChanges():
1475 config
.WriteInt("UseMDI", (self
._documentRadioBox
.GetSelection() == 1))
1476 config
.WriteInt("UseWinMDI", (self
._documentRadioBox
.GetSelection() == 2))
1479 class DocApp(wx
.PySimpleApp
):
1481 The DocApp class serves as the base class for pydocview applications and offers
1482 functionality such as services, creation of SDI and MDI frames, show tips,
1483 and a splash screen.
1489 Initializes the DocApp.
1492 self
._defaultIcon
= None
1493 self
._registeredCloseEvent
= False
1494 self
._useTabbedMDI
= True
1496 if not hasattr(self
, "_debug"): # only set if not already initialized
1498 if not hasattr(self
, "_singleInstance"): # only set if not already initialized
1499 self
._singleInstance
= True
1501 # if _singleInstance is TRUE only allow one single instance of app to run.
1502 # When user tries to run a second instance of the app, abort startup,
1503 # But if user also specifies files to open in command line, send message to running app to open those files
1504 if self
._singleInstance
:
1505 # create shared memory temporary file
1506 if wx
.Platform
== '__WXMSW__':
1507 tfile
= tempfile
.TemporaryFile(prefix
="ag", suffix
="tmp")
1508 fno
= tfile
.fileno()
1509 self
._sharedMemory
= mmap
.mmap(fno
, 1024, "shared_memory")
1511 tfile
= file(os
.path
.join(tempfile
.gettempdir(), tempfile
.gettempprefix() + self
.GetAppName() + '-' + wx
.GetUserId() + "AGSharedMemory"), 'w+b')
1516 fno
= tfile
.fileno()
1517 self
._sharedMemory
= mmap
.mmap(fno
, 1024)
1519 self
._singleInstanceChecker
= wx
.SingleInstanceChecker(self
.GetAppName() + '-' + wx
.GetUserId(), tempfile
.gettempdir())
1520 if self
._singleInstanceChecker
.IsAnotherRunning():
1521 # have running single instance open file arguments
1522 data
= pickle
.dumps(sys
.argv
[1:])
1524 self
._sharedMemory
.seek(0)
1525 marker
= self
._sharedMemory
.read_byte()
1526 if marker
== '\0' or marker
== '*': # available buffer
1527 self
._sharedMemory
.seek(0)
1528 self
._sharedMemory
.write_byte('-') # set writing marker
1529 self
._sharedMemory
.write(data
) # write files we tried to open to shared memory
1530 self
._sharedMemory
.seek(0)
1531 self
._sharedMemory
.write_byte('+') # set finished writing marker
1532 self
._sharedMemory
.flush()
1535 time
.sleep(1) # give enough time for buffer to be available
1539 self
._timer
= wx
.PyTimer(self
.DoBackgroundListenAndLoad
)
1540 self
._timer
.Start(250)
1545 def OpenMainFrame(self
):
1546 docManager
= self
.GetDocumentManager()
1547 if docManager
.GetFlags() & wx
.lib
.docview
.DOC_MDI
:
1548 if self
.GetUseTabbedMDI():
1549 frame
= wx
.lib
.pydocview
.DocTabbedParentFrame(docManager
, None, -1, self
.GetAppName())
1551 frame
= wx
.lib
.pydocview
.DocMDIParentFrame(docManager
, None, -1, self
.GetAppName())
1555 def DoBackgroundListenAndLoad(self
):
1557 Open any files specified in the given command line argument passed in via shared memory
1561 self
._sharedMemory
.seek(0)
1562 if self
._sharedMemory
.read_byte() == '+': # available data
1563 data
= self
._sharedMemory
.read(1024-1)
1564 self
._sharedMemory
.seek(0)
1565 self
._sharedMemory
.write_byte("*") # finished reading, set buffer free marker
1566 self
._sharedMemory
.flush()
1567 args
= pickle
.loads(data
)
1569 if arg
[0] != '/' and arg
[0] != '-' and os
.path
.exists(arg
):
1570 self
.GetDocumentManager().CreateDocument(arg
, wx
.lib
.docview
.DOC_SILENT
)
1572 # force display of running app
1573 topWindow
= wx
.GetApp().GetTopWindow()
1574 if topWindow
.IsIconized():
1575 topWindow
.Iconize(False)
1580 self
._timer
.Start(1000) # 1 second interval
1583 def OpenCommandLineArgs(self
):
1585 Called to open files that have been passed to the application from the
1590 if arg
[0] != '/' and arg
[0] != '-' and os
.path
.exists(arg
):
1591 self
.GetDocumentManager().CreateDocument(arg
, wx
.lib
.docview
.DOC_SILENT
)
1594 def GetDocumentManager(self
):
1596 Returns the document manager associated to the DocApp.
1598 return self
._docManager
1601 def SetDocumentManager(self
, docManager
):
1603 Sets the document manager associated with the DocApp and loads the
1604 DocApp's file history into the document manager.
1606 self
._docManager
= docManager
1607 config
= wx
.ConfigBase_Get()
1608 self
.GetDocumentManager().FileHistoryLoad(config
)
1611 def ProcessEventBeforeWindows(self
, event
):
1613 Enables services to process an event before the main window has a chance to
1616 for service
in self
._services
:
1617 if service
.ProcessEventBeforeWindows(event
):
1622 def ProcessUpdateUIEventBeforeWindows(self
, event
):
1624 Enables services to process a UI event before the main window has a chance
1625 to process the window.
1627 for service
in self
._services
:
1628 if service
.ProcessUpdateUIEventBeforeWindows(event
):
1633 def ProcessEvent(self
, event
):
1635 Processes an event, searching event tables and calling zero or more
1636 suitable event handler function(s). Note that the ProcessEvent
1637 method is called from the wxPython docview framework directly since
1638 wxPython does not have a virtual ProcessEvent function.
1640 for service
in self
._services
:
1641 if service
.ProcessEvent(event
):
1646 def ProcessUpdateUIEvent(self
, event
):
1648 Processes a UI event, searching event tables and calling zero or more
1649 suitable event handler function(s). Note that the ProcessEvent
1650 method is called from the wxPython docview framework directly since
1651 wxPython does not have a virtual ProcessEvent function.
1653 for service
in self
._services
:
1654 if service
.ProcessUpdateUIEvent(event
):
1659 def InstallService(self
, service
):
1661 Installs an instance of a DocService into the DocApp.
1663 service
.SetDocumentManager(self
._docManager
)
1664 self
._services
.append(service
)
1668 def GetServices(self
):
1670 Returns the DocService instances that have been installed into the DocApp.
1672 return self
._services
1675 def GetService(self
, type):
1677 Returns the instance of a particular type of service that has been installed
1678 into the DocApp. For example, "wx.GetApp().GetService(pydocview.OptionsService)"
1679 returns the isntance of the OptionsService that is running within the DocApp.
1681 for service
in self
._services
:
1682 if isinstance(service
, type):
1689 Called when the DocApp is exited, enables the installed DocServices to exit
1690 and saves the DocManager's file history.
1692 for service
in self
._services
:
1694 config
= wx
.ConfigBase_Get()
1695 self
._docManager
.FileHistorySave(config
)
1697 if hasattr(self
, "_singleInstanceChecker"):
1698 del self
._singleInstanceChecker
1701 def GetDefaultDocManagerFlags(self
):
1703 Returns the default flags to use when creating the DocManager.
1705 config
= wx
.ConfigBase_Get()
1706 if config
.ReadInt("UseMDI", True) or config
.ReadInt("UseWinMDI", False):
1707 flags
= wx
.lib
.docview
.DOC_MDI | wx
.lib
.docview
.DOC_OPEN_ONCE
1708 if config
.ReadInt("UseWinMDI", False):
1709 self
.SetUseTabbedMDI(False)
1711 flags
= wx
.lib
.docview
.DOC_SDI | wx
.lib
.docview
.DOC_OPEN_ONCE
1715 def ShowTip(self
, frame
, tipProvider
):
1717 Shows the tip window, generally this is called when an application starts.
1718 A wx.TipProvider must be passed.
1720 config
= wx
.ConfigBase_Get()
1721 showTip
= config
.ReadInt("ShowTipAtStartup", 1)
1723 index
= config
.ReadInt("TipIndex", 0)
1724 showTipResult
= wx
.ShowTip(wx
.GetApp().GetTopWindow(), tipProvider
, showAtStartup
= showTip
)
1725 if showTipResult
!= showTip
:
1726 config
.WriteInt("ShowTipAtStartup", showTipResult
)
1729 def GetEditMenu(self
, frame
):
1731 Utility method that finds the Edit menu within the menubar of a frame.
1733 menuBar
= frame
.GetMenuBar()
1736 editMenuIndex
= menuBar
.FindMenu(_("&Edit"))
1737 if editMenuIndex
== -1:
1739 return menuBar
.GetMenu(editMenuIndex
)
1742 def GetUseTabbedMDI(self
):
1744 Returns True if Windows MDI should use folder tabs instead of child windows.
1746 return self
._useTabbedMDI
1749 def SetUseTabbedMDI(self
, useTabbedMDI
):
1751 Set to True if Windows MDI should use folder tabs instead of child windows.
1753 self
._useTabbedMDI
= useTabbedMDI
1756 def CreateDocumentFrame(self
, view
, doc
, flags
, id = -1, title
= "", pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
):
1758 Called by the DocManager to create and return a new Frame for a Document.
1759 Chooses whether to create an MDIChildFrame or SDI Frame based on the
1762 docflags
= self
.GetDocumentManager().GetFlags()
1763 if docflags
& wx
.lib
.docview
.DOC_SDI
:
1764 frame
= self
.CreateSDIDocumentFrame(doc
, view
, id, title
, pos
, size
, style
)
1767 # wxBug: operating system bug, first window is set to the position of last window closed, ignoring passed in position on frame creation
1768 # also, initial size is incorrect for the same reasons
1769 if frame
.GetPosition() != pos
:
1771 if frame
.GetSize() != size
:
1774 if doc
and doc
.GetCommandProcessor():
1775 doc
.GetCommandProcessor().SetEditMenu(self
.GetEditMenu(frame
))
1776 elif docflags
& wx
.lib
.docview
.DOC_MDI
:
1777 if self
.GetUseTabbedMDI():
1778 frame
= self
.CreateTabbedDocumentFrame(doc
, view
, id, title
, pos
, size
, style
)
1780 frame
= self
.CreateMDIDocumentFrame(doc
, view
, id, title
, pos
, size
, style
)
1782 if doc
.GetDocumentTemplate().GetIcon():
1783 frame
.SetIcon(doc
.GetDocumentTemplate().GetIcon())
1784 elif wx
.GetApp().GetTopWindow().GetIcon():
1785 frame
.SetIcon(wx
.GetApp().GetTopWindow().GetIcon())
1786 if doc
and doc
.GetCommandProcessor():
1787 doc
.GetCommandProcessor().SetEditMenu(self
.GetEditMenu(wx
.GetApp().GetTopWindow()))
1788 if not frame
.GetIcon() and self
._defaultIcon
:
1789 frame
.SetIcon(self
.GetDefaultIcon())
1790 view
.SetFrame(frame
)
1794 def CreateSDIDocumentFrame(self
, doc
, view
, id = -1, title
= "", pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
):
1796 Creates and returns an SDI Document Frame.
1798 frame
= DocSDIFrame(doc
, view
, None, id, title
, pos
, size
, style
)
1802 def CreateTabbedDocumentFrame(self
, doc
, view
, id = -1, title
= "", pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
):
1804 Creates and returns an MDI Document Frame for a Tabbed MDI view
1806 frame
= DocTabbedChildFrame(doc
, view
, wx
.GetApp().GetTopWindow(), id, title
, pos
, size
, style
)
1810 def CreateMDIDocumentFrame(self
, doc
, view
, id = -1, title
= "", pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
):
1812 Creates and returns an MDI Document Frame.
1814 # if any child windows are maximized, then user must want any new children maximized
1815 # if no children exist, then use the default value from registry
1816 # wxBug: Only current window is maximized, so need to check every child frame
1817 parentFrame
= wx
.GetApp().GetTopWindow()
1818 childrenMaximized
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
) and child
.IsMaximized(), parentFrame
.GetChildren())
1819 if childrenMaximized
:
1822 children
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), parentFrame
.GetChildren())
1824 # other windows exist and none are maximized
1827 # get default setting from registry
1828 maximize
= wx
.ConfigBase_Get().ReadInt("MDIChildFrameMaximized", False)
1830 frame
= wx
.lib
.docview
.DocMDIChildFrame(doc
, view
, wx
.GetApp().GetTopWindow(), id, title
, pos
, size
, style
)
1831 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
1832 frame
.Maximize(True)
1834 ## wx.EVT_MAXIMIZE(frame, self.OnMaximize) # wxBug: This doesn't work, need to save MDIChildFrameMaximized state on close of windows instead
1835 wx
.EVT_CLOSE(frame
, self
.OnCloseChildWindow
)
1836 if not self
._registeredCloseEvent
:
1837 wx
.EVT_CLOSE(parentFrame
, self
.OnCloseMainWindow
) # need to check on this, but only once
1838 self
._registeredCloseEvent
= True
1843 def SaveMDIDocumentFrameMaximizedState(self
, maximized
):
1845 Remember in the config whether the MDI Frame is maximized so that it can be restored
1848 config
= wx
.ConfigBase_Get()
1849 maximizeFlag
= config
.ReadInt("MDIChildFrameMaximized", False)
1850 if maximized
!= maximizeFlag
:
1851 config
.WriteInt("MDIChildFrameMaximized", maximized
)
1854 def OnCloseChildWindow(self
, event
):
1856 Called when an MDI Child Frame is closed. Calls SaveMDIDocumentFrameMaximizedState to
1857 remember whether the MDI Frame is maximized so that it can be restored on open.
1859 self
.SaveMDIDocumentFrameMaximizedState(event
.GetEventObject().IsMaximized())
1863 def OnCloseMainWindow(self
, event
):
1865 Called when the MDI Parent Frame is closed. Remembers whether the MDI Parent Frame is
1868 children
= event
.GetEventObject().GetChildren()
1869 childrenMaximized
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
)and child
.IsMaximized(), children
)
1870 if childrenMaximized
:
1871 self
.SaveMDIDocumentFrameMaximizedState(True)
1873 childrenNotMaximized
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), children
)
1875 if childrenNotMaximized
:
1876 # other windows exist and none are maximized
1877 self
.SaveMDIDocumentFrameMaximizedState(False)
1882 def GetDefaultIcon(self
):
1884 Returns the application's default icon.
1886 return self
._defaultIcon
1889 def SetDefaultIcon(self
, icon
):
1891 Sets the application's default icon.
1893 self
._defaultIcon
= icon
1898 Returns True if the application is in debug mode.
1903 def SetDebug(self
, debug
):
1905 Sets the application's debug mode.
1910 def GetSingleInstance(self
):
1912 Returns True if the application is in single instance mode. Used to determine if multiple instances of the application is allowed to launch.
1914 return self
._singleInstance
1917 def SetSingleInstance(self
, singleInstance
):
1919 Sets application's single instance mode.
1921 self
._singleInstance
= singleInstance
1925 def CreateChildDocument(self
, parentDocument
, documentType
, objectToEdit
, path
= ''):
1927 Creates a child window of a document that edits an object. The child window
1928 is managed by the parent document frame, so it will be prompted to close if its
1929 parent is closed, etc. Child Documents are useful when there are complicated
1930 Views of a Document and users will need to tunnel into the View.
1932 for document
in self
.GetDocumentManager().GetDocuments()[:]: # Cloning list to make sure we go through all docs even as they are deleted
1933 if isinstance(document
, ChildDocument
) and document
.GetParentDocument() == parentDocument
:
1934 if document
.GetData() == objectToEdit
:
1935 if hasattr(document
.GetFirstView().GetFrame(), "SetFocus"):
1936 document
.GetFirstView().GetFrame().SetFocus()
1938 for temp
in wx
.GetApp().GetDocumentManager().GetTemplates():
1939 if temp
.GetDocumentType() == documentType
:
1942 newDoc
= temp
.CreateDocument(path
, 0, data
= objectToEdit
, parentDocument
= parentDocument
)
1943 newDoc
.SetDocumentName(temp
.GetDocumentName())
1944 newDoc
.SetDocumentTemplate(temp
)
1946 newDoc
.OnNewDocument()
1948 if not newDoc
.OnOpenDocument(path
):
1949 newDoc
.DeleteAllViews() # Implicitly deleted by DeleteAllViews
1954 def CloseChildDocuments(self
, parentDocument
):
1956 Closes the child windows of a Document.
1958 for document
in self
.GetDocumentManager().GetDocuments()[:]: # Cloning list to make sure we go through all docs even as they are deleted
1959 if isinstance(document
, ChildDocument
) and document
.GetParentDocument() == parentDocument
:
1960 if document
.GetFirstView().GetFrame():
1961 document
.GetFirstView().GetFrame().SetFocus()
1962 if document
.GetFirstView().OnClose(deleteWindow
= False):
1963 if document
.GetFirstView().GetFrame():
1964 document
.GetFirstView().GetFrame().Close() # wxBug: Need to do this for some random reason
1972 Returns True if the application is in MDI mode.
1974 return self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_MDI
1979 Returns True if the application is in SDI mode.
1981 return self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
1984 def ShowSplash(self
, image
):
1986 Shows a splash window with the given image. Input parameter 'image' can either be a wx.Bitmap or a filename.
1988 if isinstance(image
, wx
.Bitmap
):
1991 splash_bmp
= wx
.Image(image
).ConvertToBitmap()
1992 self
._splash
= wx
.SplashScreen(splash_bmp
,wx
.SPLASH_CENTRE_ON_SCREEN | wx
.SPLASH_NO_TIMEOUT
,0, None, -1)
1996 def CloseSplash(self
):
1998 Closes the splash window.
2001 self
._splash
.Close(True)
2004 class _DocFrameFileDropTarget(wx
.FileDropTarget
):
2006 Class used to handle drops into the document frame.
2009 def __init__(self
, docManager
, docFrame
):
2011 Initializes the FileDropTarget class with the active docManager and the docFrame.
2013 wx
.FileDropTarget
.__init
__(self
)
2014 self
._docManager
= docManager
2015 self
._docFrame
= docFrame
2018 def OnDropFiles(self
, x
, y
, filenames
):
2020 Called when files are dropped in the drop target and tells the docManager to open
2024 for file in filenames
:
2025 self
._docManager
.CreateDocument(file, wx
.lib
.docview
.DOC_SILENT
)
2027 msgTitle
= wx
.GetApp().GetAppName()
2029 msgTitle
= _("File Error")
2030 wx
.MessageBox("Could not open '%s'. '%s'" % (docview
.FileNameFromPath(file), sys
.exc_value
),
2032 wx
.OK | wx
.ICON_EXCLAMATION
,
2033 self
._docManager
.FindSuitableParent())
2036 class DocMDIParentFrame(wx
.lib
.docview
.DocMDIParentFrame
, DocFrameMixIn
, DocMDIParentFrameMixIn
):
2038 The DocMDIParentFrame is the primary frame which the DocApp uses to host MDI child windows. It offers
2039 features such as a default menubar, toolbar, and status bar, and a mechanism to manage embedded windows
2040 on the edges of the DocMDIParentFrame.
2044 def __init__(self
, docManager
, parent
, id, title
, pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
, name
= "DocMDIFrame", embeddedWindows
= 0):
2046 Initializes the DocMDIParentFrame with the default menubar, toolbar, and status bar. Use the
2047 optional embeddedWindows parameter with the embedded window constants to create embedded
2048 windows around the edges of the DocMDIParentFrame.
2050 pos
, size
= self
._GetPosSizeFromConfig
(pos
, size
)
2051 wx
.lib
.docview
.DocMDIParentFrame
.__init
__(self
, docManager
, parent
, id, title
, pos
, size
, style
, name
)
2052 self
._InitFrame
(embeddedWindows
)
2055 def _LayoutFrame(self
):
2059 wx
.LayoutAlgorithm().LayoutMDIFrame(self
)
2060 self
.GetClientWindow().Refresh()
2063 def ProcessEvent(self
, event
):
2065 Processes an event, searching event tables and calling zero or more
2066 suitable event handler function(s). Note that the ProcessEvent
2067 method is called from the wxPython docview framework directly since
2068 wxPython does not have a virtual ProcessEvent function.
2070 if wx
.GetApp().ProcessEventBeforeWindows(event
):
2072 if wx
.lib
.docview
.DocMDIParentFrame
.ProcessEvent(self
, event
):
2074 return DocMDIParentFrameMixIn
.ProcessEvent(self
, event
)
2077 def ProcessUpdateUIEvent(self
, event
):
2079 Processes a UI event, searching event tables and calling zero or more
2080 suitable event handler function(s). Note that the ProcessEvent
2081 method is called from the wxPython docview framework directly since
2082 wxPython does not have a virtual ProcessEvent function.
2084 if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
):
2086 if wx
.lib
.docview
.DocMDIParentFrame
.ProcessUpdateUIEvent(self
, event
): # Let the views handle the event before the services
2088 if event
.GetId() == wx
.ID_ABOUT
: # Using ID_ABOUT to update the window menu, the window menu items are not triggering
2089 self
.UpdateWindowMenu()
2091 return DocMDIParentFrameMixIn
.ProcessUpdateUIEvent(self
, event
)
2094 def UpdateWindowMenu(self
):
2096 Updates the WindowMenu on Windows platforms.
2098 if wx
.Platform
== '__WXMSW__':
2099 children
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), self
.GetChildren())
2100 windowCount
= len(children
)
2101 hasWindow
= windowCount
>= 1
2102 has2OrMoreWindows
= windowCount
>= 2
2104 windowMenu
= self
.GetWindowMenu()
2106 windowMenu
.Enable(wx
.IDM_WINDOWTILE
, hasWindow
)
2107 windowMenu
.Enable(wx
.IDM_WINDOWTILEHOR
, hasWindow
)
2108 windowMenu
.Enable(wx
.IDM_WINDOWCASCADE
, hasWindow
)
2109 windowMenu
.Enable(wx
.IDM_WINDOWICONS
, hasWindow
)
2110 windowMenu
.Enable(wx
.IDM_WINDOWTILEVERT
, hasWindow
)
2111 wx
.IDM_WINDOWPREV
= 4006 # wxBug: Not defined for some reason
2112 windowMenu
.Enable(wx
.IDM_WINDOWPREV
, has2OrMoreWindows
)
2113 windowMenu
.Enable(wx
.IDM_WINDOWNEXT
, has2OrMoreWindows
)
2117 def OnSize(self
, event
):
2119 Called when the DocMDIParentFrame is resized and lays out the MDI client window.
2121 # Needed in case there are splitpanels around the mdi frame
2125 def OnCloseWindow(self
, event
):
2127 Called when the DocMDIParentFrame is closed. Remembers the frame size.
2129 self
.SaveEmbeddedWindowSizes()
2131 # save and close services last.
2132 for service
in wx
.GetApp().GetServices():
2133 if not service
.OnCloseFrame(event
):
2136 # save and close documents
2137 # documents with a common view, e.g. project view, should save the document, but not close the window
2138 # and let the service close the window.
2139 wx
.lib
.docview
.DocMDIParentFrame
.OnCloseWindow(self
, event
)
2142 class DocSDIFrame(wx
.lib
.docview
.DocChildFrame
, DocFrameMixIn
):
2144 The DocSDIFrame host DocManager Document windows. It offers features such as a default menubar,
2145 toolbar, and status bar.
2149 def __init__(self
, doc
, view
, parent
, id, title
, pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
, style
= wx
.DEFAULT_FRAME_STYLE
, name
= "DocSDIFrame"):
2151 Initializes the DocSDIFrame with the default menubar, toolbar, and status bar.
2153 wx
.lib
.docview
.DocChildFrame
.__init
__(self
, doc
, view
, parent
, id, title
, pos
, size
, style
, name
)
2154 self
._fileMenu
= None
2156 self
._docManager
= doc
.GetDocumentManager()
2158 self
._docManager
= None
2159 self
.SetDropTarget(_DocFrameFileDropTarget(self
._docManager
, self
))
2161 wx
.EVT_MENU(self
, wx
.ID_ABOUT
, self
.OnAbout
)
2162 wx
.EVT_MENU(self
, wx
.ID_EXIT
, self
.OnExit
)
2163 wx
.EVT_MENU_RANGE(self
, wx
.ID_FILE1
, wx
.ID_FILE9
, self
.OnMRUFile
)
2165 self
.InitializePrintData()
2167 menuBar
= self
.CreateDefaultMenuBar(sdi
=True)
2168 toolBar
= self
.CreateDefaultToolBar()
2169 self
.SetToolBar(toolBar
)
2170 statusBar
= self
.CreateDefaultStatusBar()
2172 for service
in wx
.GetApp().GetServices():
2173 service
.InstallControls(self
, menuBar
= menuBar
, toolBar
= toolBar
, statusBar
= statusBar
, document
= doc
)
2175 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
2178 def _LayoutFrame(self
):
2185 def OnExit(self
, event
):
2187 Called when the application is exitting.
2189 if self
._childView
.GetDocumentManager().Clear(force
= False):
2195 def OnMRUFile(self
, event
):
2197 Opens the appropriate file when it is selected from the file history
2200 n
= event
.GetId() - wx
.ID_FILE1
2201 filename
= self
._docManager
.GetHistoryFile(n
)
2203 self
._docManager
.CreateDocument(filename
, wx
.lib
.docview
.DOC_SILENT
)
2205 self
._docManager
.RemoveFileFromHistory(n
)
2206 msgTitle
= wx
.GetApp().GetAppName()
2208 msgTitle
= _("File Error")
2209 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),
2211 wx
.OK | wx
.ICON_EXCLAMATION
,
2215 def ProcessEvent(self
, event
):
2217 Processes an event, searching event tables and calling zero or more
2218 suitable event handler function(s). Note that the ProcessEvent
2219 method is called from the wxPython docview framework directly since
2220 wxPython does not have a virtual ProcessEvent function.
2222 if wx
.GetApp().ProcessEventBeforeWindows(event
):
2225 self
._childView
.Activate(True)
2228 if id == SAVEALL_ID
:
2229 self
.OnFileSaveAll(event
)
2232 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
2235 return wx
.GetApp().ProcessEvent(event
)
2238 def ProcessUpdateUIEvent(self
, event
):
2240 Processes a UI event, searching event tables and calling zero or more
2241 suitable event handler function(s). Note that the ProcessEvent
2242 method is called from the wxPython docview framework directly since
2243 wxPython does not have a virtual ProcessEvent function.
2245 if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
):
2248 if hasattr(self
._childView
, "GetDocumentManager"):
2249 docMgr
= self
._childView
.GetDocumentManager()
2251 if docMgr
.GetCurrentDocument() != self
._childView
.GetDocument():
2253 if docMgr
.ProcessUpdateUIEvent(event
): # Let the views handle the event before the services
2259 elif id == wx
.ID_COPY
:
2262 elif id == wx
.ID_PASTE
:
2265 elif id == wx
.ID_CLEAR
:
2268 elif id == wx
.ID_SELECTALL
:
2271 elif id == SAVEALL_ID
:
2272 filesModified
= False
2273 docs
= wx
.GetApp().GetDocumentManager().GetDocuments()
2275 if doc
.IsModified():
2276 filesModified
= True
2279 event
.Enable(filesModified
)
2282 return wx
.GetApp().ProcessUpdateUIEvent(event
)
2285 def OnCloseWindow(self
, event
):
2287 Called when the window is saved. Enables services to help close the frame.
2289 for service
in wx
.GetApp().GetServices():
2290 service
.OnCloseFrame(event
)
2291 wx
.lib
.docview
.DocChildFrame
.OnCloseWindow(self
, event
)
2292 if self
._fileMenu
and self
._docManager
:
2293 self
._docManager
.FileHistoryRemoveMenu(self
._fileMenu
)
2296 class AboutService(DocService
):
2298 About Dialog Service that installs under the Help menu to show the properties of the current application.
2301 def __init__(self
, aboutDialog
=None, image
=None):
2303 Initializes the AboutService.
2306 self
._dlg
= aboutDialog
2309 self
._dlg
= AboutDialog
# use default AboutDialog
2313 def ShowAbout(self
):
2315 Show the AboutDialog
2318 dlg
= self
._dlg
(wx
.GetApp().GetTopWindow(), self
._image
)
2320 dlg
= self
._dlg
(wx
.GetApp().GetTopWindow())
2321 dlg
.CenterOnScreen()
2326 def SetAboutDialog(self
, dlg
):
2328 Customize the AboutDialog
2333 class AboutDialog(wx
.Dialog
):
2335 Opens an AboutDialog. Shared by DocMDIParentFrame and DocSDIFrame.
2338 def __init__(self
, parent
, image
=None):
2340 Initializes the about dialog.
2342 wx
.Dialog
.__init
__(self
, parent
, -1, _("About ") + wx
.GetApp().GetAppName(), style
= wx
.DEFAULT_DIALOG_STYLE
)
2344 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
2346 imageItem
= wx
.StaticBitmap(self
, -1, image
.ConvertToBitmap(), (0,0), (image
.GetWidth(), image
.GetHeight()))
2347 sizer
.Add(imageItem
, 0, wx
.ALIGN_CENTER|wx
.ALL
, 0)
2348 sizer
.Add(wx
.StaticText(self
, -1, wx
.GetApp().GetAppName()), 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5)
2350 btn
= wx
.Button(self
, wx
.ID_OK
)
2351 sizer
.Add(btn
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5)
2353 self
.SetSizer(sizer
)
2354 self
.SetAutoLayout(True)
2359 class FilePropertiesService(DocService
):
2361 Service that installs under the File menu to show the properties of the file associated
2362 with the current document.
2365 PROPERTIES_ID
= wx
.NewId()
2370 Initializes the PropertyService.
2372 self
._customEventHandlers
= []
2375 def InstallControls(self
, frame
, menuBar
= None, toolBar
= None, statusBar
= None, document
= None):
2377 Installs a File/Properties menu item.
2379 fileMenu
= menuBar
.GetMenu(menuBar
.FindMenu(_("&File")))
2380 exitMenuItemPos
= self
.GetMenuItemPos(fileMenu
, wx
.ID_EXIT
)
2381 fileMenu
.InsertSeparator(exitMenuItemPos
)
2382 fileMenu
.Insert(exitMenuItemPos
, FilePropertiesService
.PROPERTIES_ID
, _("&Properties"), _("Show file properties"))
2383 wx
.EVT_MENU(frame
, FilePropertiesService
.PROPERTIES_ID
, self
.ProcessEvent
)
2384 wx
.EVT_UPDATE_UI(frame
, FilePropertiesService
.PROPERTIES_ID
, self
.ProcessUpdateUIEvent
)
2387 def ProcessEvent(self
, event
):
2389 Detects when the File/Properties menu item is selected.
2392 if id == FilePropertiesService
.PROPERTIES_ID
:
2393 for eventHandler
in self
._customEventHandlers
:
2394 if eventHandler
.ProcessEvent(event
):
2397 self
.ShowPropertiesDialog()
2403 def ProcessUpdateUIEvent(self
, event
):
2405 Updates the File/Properties menu item.
2408 if id == FilePropertiesService
.PROPERTIES_ID
:
2409 for eventHandler
in self
._customEventHandlers
:
2410 if eventHandler
.ProcessUpdateUIEvent(event
):
2413 event
.Enable(wx
.GetApp().GetDocumentManager().GetCurrentDocument() != None)
2419 def ShowPropertiesDialog(self
, filename
= None):
2421 Shows the PropertiesDialog for the specified file.
2424 filename
= wx
.GetApp().GetDocumentManager().GetCurrentDocument().GetFilename()
2426 filePropertiesDialog
= FilePropertiesDialog(wx
.GetApp().GetTopWindow(), filename
)
2427 if filePropertiesDialog
.ShowModal() == wx
.ID_OK
:
2429 filePropertiesDialog
.Destroy()
2432 def GetCustomEventHandlers(self
):
2434 Returns the custom event handlers for the PropertyService.
2436 return self
._customEventHandlers
2439 def AddCustomEventHandler(self
, handler
):
2441 Adds a custom event handlers for the PropertyService. A custom event handler enables
2442 a different dialog to be provided for a particular file.
2444 self
._customEventHandlers
.append(handler
)
2447 def RemoveCustomEventHandler(self
, handler
):
2449 Removes a custom event handler from the PropertyService.
2451 self
._customEventHandlers
.remove(handler
)
2454 def chopPath(self
, text
, length
= 36):
2456 Simple version of textwrap. textwrap.fill() unfortunately chops lines at spaces
2457 and creates odd word boundaries. Instead, we will chop the path without regard to
2458 spaces, but pay attention to path delimiters.
2464 while start
< textLen
:
2465 end
= start
+ length
2469 # see if we can find a delimiter to chop the path
2471 lastSep
= text
.rfind(os
.sep
, start
, end
+ 1)
2472 if lastSep
!= -1 and lastSep
!= start
:
2476 chopped
= chopped
+ '\n' + text
[start
:end
]
2478 chopped
= text
[start
:end
]
2485 class FilePropertiesDialog(wx
.Dialog
):
2487 Dialog that shows the properties of a file. Invoked by the PropertiesService.
2491 def __init__(self
, parent
, filename
):
2493 Initializes the properties dialog.
2495 wx
.Dialog
.__init
__(self
, parent
, -1, _("File Properties"), size
= (310, 330))
2500 filePropertiesService
= wx
.GetApp().GetService(FilePropertiesService
)
2502 fileExists
= os
.path
.exists(filename
)
2504 notebook
= wx
.Notebook(self
, -1)
2505 tab
= wx
.Panel(notebook
, -1)
2507 gridSizer
= RowColSizer()
2509 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Filename:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=0, col
=0)
2510 gridSizer
.Add(wx
.StaticText(tab
, -1, os
.path
.basename(filename
)), row
=0, col
=1)
2512 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Location:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=1, col
=0)
2513 gridSizer
.Add(wx
.StaticText(tab
, -1, filePropertiesService
.chopPath(os
.path
.dirname(filename
))), flag
=wx
.BOTTOM
, border
=SPACE
, row
=1, col
=1)
2515 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Size:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=2, col
=0)
2517 gridSizer
.Add(wx
.StaticText(tab
, -1, str(os
.path
.getsize(filename
)) + ' ' + _("bytes")), row
=2, col
=1)
2519 lineSizer
= wx
.BoxSizer(wx
.VERTICAL
) # let the line expand horizontally without vertical expansion
2520 lineSizer
.Add(wx
.StaticLine(tab
, -1, size
= (10,-1)), 0, wx
.EXPAND
)
2521 gridSizer
.Add(lineSizer
, flag
=wx
.EXPAND|wx
.ALIGN_CENTER_VERTICAL|wx
.TOP
, border
=HALF_SPACE
, row
=3, col
=0, colspan
=2)
2523 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Created:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=4, col
=0)
2525 gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getctime(filename
))), row
=4, col
=1)
2527 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Modified:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=5, col
=0)
2529 gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getmtime(filename
))), row
=5, col
=1)
2531 gridSizer
.Add(wx
.StaticText(tab
, -1, _("Accessed:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=6, col
=0)
2533 gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getatime(filename
))), row
=6, col
=1)
2535 # add a border around the inside of the tab
2536 spacerGrid
= wx
.BoxSizer(wx
.VERTICAL
)
2537 spacerGrid
.Add(gridSizer
, 0, wx
.ALL
, SPACE
);
2538 tab
.SetSizer(spacerGrid
)
2539 notebook
.AddPage(tab
, _("General"))
2541 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
2542 sizer
.Add(notebook
, 0, wx
.ALL | wx
.EXPAND
, SPACE
)
2543 sizer
.Add(self
.CreateButtonSizer(wx
.OK
), 0, wx
.ALIGN_RIGHT | wx
.RIGHT | wx
.BOTTOM
, HALF_SPACE
)
2546 self
.SetDimensions(-1, -1, 310, -1, wx
.SIZE_USE_EXISTING
)
2547 self
.SetSizer(sizer
)
2551 class ChildDocument(wx
.lib
.docview
.Document
):
2553 A ChildDocument is a document that represents a portion of a Document. The child
2554 document is managed by the parent document, so it will be prompted to close if its
2555 parent is closed, etc. Child Documents are useful when there are complicated
2556 Views of a Document and users will need to tunnel into the View.
2562 Returns the data that the ChildDocument contains.
2567 def SetData(self
, data
):
2569 Sets the data that the ChildDocument contains.
2574 def GetParentDocument(self
):
2576 Returns the parent Document of the ChildDocument.
2578 return self
._parentDocument
2581 def SetParentDocument(self
, parentDocument
):
2583 Sets the parent Document of the ChildDocument.
2585 self
._parentDocument
= parentDocument
2588 def OnSaveDocument(self
, filename
):
2590 Called when the ChildDocument is saved and does the minimum such that the
2591 ChildDocument looks like a real Document to the framework.
2593 self
.SetFilename(filename
, True)
2595 self
.SetDocumentSaved(True)
2599 def OnOpenDocument(self
, filename
):
2601 Called when the ChildDocument is opened and does the minimum such that the
2602 ChildDocument looks like a real Document to the framework.
2604 self
.SetFilename(filename
, True)
2606 self
.SetDocumentSaved(True)
2607 self
.UpdateAllViews()
2613 Called when the ChildDocument is saved and does the minimum such that the
2614 ChildDocument looks like a real Document to the framework.
2616 return self
.OnSaveDocument(self
._documentFile
)
2621 Called when the ChildDocument is saved and does the minimum such that the
2622 ChildDocument looks like a real Document to the framework.
2624 return self
.OnSaveDocument(self
._documentFile
)
2627 class ChildDocTemplate(wx
.lib
.docview
.DocTemplate
):
2629 A ChildDocTemplate is a DocTemplate subclass that enables the creation of ChildDocuments
2630 that represents a portion of a Document. The child document is managed by the parent document,
2631 so it will be prompted to close if its parent is closed, etc. Child Documents are useful
2632 when there are complicated Views of a Document and users will need to tunnel into the View.
2636 def __init__(self
, manager
, description
, filter, dir, ext
, docTypeName
, viewTypeName
, docType
, viewType
, flags
= wx
.lib
.docview
.TEMPLATE_INVISIBLE
, icon
= None):
2638 Initializes the ChildDocTemplate.
2640 wx
.lib
.docview
.DocTemplate
.__init
__(self
, manager
, description
, filter, dir, ext
, docTypeName
, viewTypeName
, docType
, viewType
, flags
= flags
, icon
= icon
)
2643 def CreateDocument(self
, path
, flags
, data
= None, parentDocument
= None):
2645 Called when a ChildDocument is to be created and does the minimum such that the
2646 ChildDocument looks like a real Document to the framework.
2648 doc
= self
._docType
()
2649 doc
.SetFilename(path
)
2651 doc
.SetParentDocument(parentDocument
)
2652 doc
.SetDocumentTemplate(self
)
2653 self
.GetDocumentManager().AddDocument(doc
)
2654 doc
.SetCommandProcessor(doc
.OnCreateCommandProcessor())
2655 if doc
.OnCreate(path
, flags
):
2658 if doc
in self
.GetDocumentManager().GetDocuments():
2659 doc
.DeleteAllViews()
2663 class WindowMenuService(DocService
):
2665 The WindowMenuService is a service that implements a standard Window menu that is used
2666 by the DocSDIFrame. The MDIFrame automatically includes a Window menu and does not use
2667 the WindowMenuService.
2673 Initializes the WindowMenu and its globals.
2675 self
.ARRANGE_WINDOWS_ID
= wx
.NewId()
2676 self
.SELECT_WINDOW_1_ID
= wx
.NewId()
2677 self
.SELECT_WINDOW_2_ID
= wx
.NewId()
2678 self
.SELECT_WINDOW_3_ID
= wx
.NewId()
2679 self
.SELECT_WINDOW_4_ID
= wx
.NewId()
2680 self
.SELECT_WINDOW_5_ID
= wx
.NewId()
2681 self
.SELECT_WINDOW_6_ID
= wx
.NewId()
2682 self
.SELECT_WINDOW_7_ID
= wx
.NewId()
2683 self
.SELECT_WINDOW_8_ID
= wx
.NewId()
2684 self
.SELECT_WINDOW_9_ID
= wx
.NewId()
2685 self
.SELECT_MORE_WINDOWS_ID
= wx
.NewId()
2688 def InstallControls(self
, frame
, menuBar
= None, toolBar
= None, statusBar
= None, document
= None):
2690 Installs the Window menu.
2693 if not self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
:
2694 return # Only need windows menu for SDI mode, MDI frame automatically creates one
2696 if not _WINDOWS
: # Arrange All and window navigation doesn't work on Linux
2699 windowMenu
= wx
.Menu()
2700 item
= windowMenu
.Append(self
.ARRANGE_WINDOWS_ID
, _("&Arrange All"), _("Arrange the open windows"))
2701 windowMenu
.AppendSeparator()
2703 wx
.EVT_MENU(frame
, self
.ARRANGE_WINDOWS_ID
, frame
.ProcessEvent
)
2704 wx
.EVT_UPDATE_UI(frame
, self
.ARRANGE_WINDOWS_ID
, frame
.ProcessUpdateUIEvent
)
2705 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_1_ID
, frame
.ProcessEvent
) # wxNewId may have been nonsequential, so can't use EVT_MENU_RANGE
2706 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_2_ID
, frame
.ProcessEvent
)
2707 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_3_ID
, frame
.ProcessEvent
)
2708 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_4_ID
, frame
.ProcessEvent
)
2709 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_5_ID
, frame
.ProcessEvent
)
2710 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_6_ID
, frame
.ProcessEvent
)
2711 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_7_ID
, frame
.ProcessEvent
)
2712 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_8_ID
, frame
.ProcessEvent
)
2713 wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_9_ID
, frame
.ProcessEvent
)
2714 wx
.EVT_MENU(frame
, self
.SELECT_MORE_WINDOWS_ID
, frame
.ProcessEvent
)
2716 helpMenuIndex
= menuBar
.FindMenu(_("&Help"))
2717 menuBar
.Insert(helpMenuIndex
, windowMenu
, _("&Window"))
2719 self
._lastFrameUpdated
= None
2722 def ProcessEvent(self
, event
):
2724 Processes a Window menu event.
2727 if id == self
.ARRANGE_WINDOWS_ID
:
2728 self
.OnArrangeWindows(event
)
2730 elif id == self
.SELECT_MORE_WINDOWS_ID
:
2731 self
.OnSelectMoreWindows(event
)
2733 elif id == self
.SELECT_WINDOW_1_ID
or id == self
.SELECT_WINDOW_2_ID
or id == self
.SELECT_WINDOW_3_ID
or id == self
.SELECT_WINDOW_4_ID
or id == self
.SELECT_WINDOW_5_ID
or id == self
.SELECT_WINDOW_6_ID
or id == self
.SELECT_WINDOW_7_ID
or id == self
.SELECT_WINDOW_8_ID
or id == self
.SELECT_WINDOW_9_ID
:
2734 self
.OnSelectWindowMenu(event
)
2740 def ProcessUpdateUIEvent(self
, event
):
2742 Updates the Window menu items.
2745 if id == self
.ARRANGE_WINDOWS_ID
:
2746 frame
= event
.GetEventObject()
2747 if not self
._lastFrameUpdated
or self
._lastFrameUpdated
!= frame
:
2748 self
.BuildWindowMenu(frame
) # It's a new frame, so update the windows menu... this is as if the View::OnActivateMethod had been invoked
2749 self
._lastFrameUpdated
= frame
2755 def BuildWindowMenu(self
, currentFrame
):
2757 Builds the Window menu and adds menu items for all of the open documents in the DocManager.
2759 windowMenuIndex
= currentFrame
.GetMenuBar().FindMenu(_("&Window"))
2760 windowMenu
= currentFrame
.GetMenuBar().GetMenu(windowMenuIndex
)
2761 ids
= self
._GetWindowMenuIDList
()
2762 frames
= self
._GetWindowMenuFrameList
(currentFrame
)
2763 max = WINDOW_MENU_NUM_ITEMS
2764 if max > len(frames
):
2767 for i
in range(0, max):
2769 item
= windowMenu
.FindItemById(ids
[i
])
2770 label
= '&' + str(i
+ 1) + ' ' + frame
.GetTitle()
2772 item
= windowMenu
.AppendCheckItem(ids
[i
], label
)
2774 windowMenu
.SetLabel(ids
[i
], label
)
2775 windowMenu
.Check(ids
[i
], (frame
== currentFrame
))
2776 if len(frames
) > WINDOW_MENU_NUM_ITEMS
: # Add the more items item
2777 if not windowMenu
.FindItemById(self
.SELECT_MORE_WINDOWS_ID
):
2778 windowMenu
.Append(self
.SELECT_MORE_WINDOWS_ID
, _("&More Windows..."))
2779 else: # Remove any extra items
2780 if windowMenu
.FindItemById(self
.SELECT_MORE_WINDOWS_ID
):
2781 windowMenu
.Remove(self
.SELECT_MORE_WINDOWS_ID
)
2785 for j
in range(i
+ 1, WINDOW_MENU_NUM_ITEMS
):
2786 if windowMenu
.FindItemById(ids
[j
]):
2787 windowMenu
.Remove(ids
[j
])
2790 def _GetWindowMenuIDList(self
):
2792 Returns a list of the Window menu item IDs.
2794 return [self
.SELECT_WINDOW_1_ID
, self
.SELECT_WINDOW_2_ID
, self
.SELECT_WINDOW_3_ID
, self
.SELECT_WINDOW_4_ID
, self
.SELECT_WINDOW_5_ID
, self
.SELECT_WINDOW_6_ID
, self
.SELECT_WINDOW_7_ID
, self
.SELECT_WINDOW_8_ID
, self
.SELECT_WINDOW_9_ID
]
2797 def _GetWindowMenuFrameList(self
, currentFrame
= None):
2799 Returns the Frame associated with each menu item in the Window menu.
2802 # get list of windows for documents
2803 for doc
in self
._docManager
.GetDocuments():
2804 for view
in doc
.GetViews():
2805 frame
= view
.GetFrame()
2806 if frame
not in frameList
:
2807 if frame
== currentFrame
and len(frameList
) >= WINDOW_MENU_NUM_ITEMS
:
2808 frameList
.insert(WINDOW_MENU_NUM_ITEMS
- 1, frame
)
2810 frameList
.append(frame
)
2811 # get list of windows for general services
2812 for service
in wx
.GetApp().GetServices():
2813 view
= service
.GetView()
2815 frame
= view
.GetFrame()
2816 if frame
not in frameList
:
2817 if frame
== currentFrame
and len(frameList
) >= WINDOW_MENU_NUM_ITEMS
:
2818 frameList
.insert(WINDOW_MENU_NUM_ITEMS
- 1, frame
)
2820 frameList
.append(frame
)
2825 def OnArrangeWindows(self
, event
):
2827 Called by Window/Arrange and tiles the frames on the desktop.
2829 currentFrame
= event
.GetEventObject()
2831 tempFrame
= wx
.Frame(None, -1, "", pos
= wx
.DefaultPosition
, size
= wx
.DefaultSize
)
2832 sizex
= tempFrame
.GetSize()[0]
2833 sizey
= tempFrame
.GetSize()[1]
2839 frames
= self
._GetWindowMenuFrameList
()
2840 frames
.remove(currentFrame
)
2841 frames
.append(currentFrame
) # Make the current frame the last frame so that it is the last one to appear
2842 for frame
in frames
:
2844 delta
= frame
.GetClientAreaOrigin()[1]
2845 frame
.SetPosition((posx
, posy
))
2846 frame
.SetSize((sizex
, sizey
))
2847 # TODO: Need to loop around if posx + delta + size > displaysize
2851 if posx
+ sizex
> wx
.DisplaySize()[0] or posy
+ sizey
> wx
.DisplaySize()[1]:
2854 currentFrame
.SetFocus()
2857 def OnSelectWindowMenu(self
, event
):
2859 Called when the Window menu item representing a Frame is selected and brings the selected
2860 Frame to the front of the desktop.
2863 index
= self
._GetWindowMenuIDList
().index(id)
2865 currentFrame
= event
.GetEventObject()
2866 frame
= self
._GetWindowMenuFrameList
(currentFrame
)[index
]
2868 wx
.CallAfter(frame
.Raise
)
2871 def OnSelectMoreWindows(self
, event
):
2873 Called when the "Window/Select More Windows..." menu item is selected and enables user to
2874 select from the Frames that do not in the Window list. Useful when there are more than
2875 10 open frames in the application.
2877 frames
= self
._GetWindowMenuFrameList
() # TODO - make the current window the first one
2878 strings
= map(lambda frame
: frame
.GetTitle(), frames
)
2879 # Should preselect the current window, but not supported by wx.GetSingleChoice
2880 res
= wx
.GetSingleChoiceIndex(_("Select a window to show:"),
2886 frames
[res
].SetFocus()
2889 #----------------------------------------------------------------------------
2890 # File generated by encode_bitmaps.py
2891 #----------------------------------------------------------------------------
2892 from wx
import ImageFromStream
, BitmapFromImage
2895 #----------------------------------------------------------------------
2898 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
2899 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
2900 \x00\x00[IDAT8\x8d\xed\x93\xb1\n\x001\x08C\x13{\xff\xff\xc7mn\xb8El\x91\x16\
2901 \x97\x0e\x97M\x90\x97\x88JZCE\x8f/4\xba\xb2fZc\n\x00\x00i\xcd \t\x8d\xae\x08\
2902 \xb1\xad\x9c\x0e\x1eS\x1e\x01\xc8\xcf\xdcC\xa6\x112\xf7\x08:N\xb0\xd2\x0f\
2903 \xb8\x010\xdd\x81\xdf\xf1\x8eX\xfd\xc6\xf2\x08/D\xbd\x19(\xc8\xa5\xd9\xfa\
2904 \x00\x00\x00\x00IEND\xaeB`\x82'
2907 return BitmapFromImage(getNewImage())
2910 stream
= cStringIO
.StringIO(getNewData())
2911 return ImageFromStream(stream
)
2913 #----------------------------------------------------------------------
2916 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
2917 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
2918 \x00\x00\x95IDAT8\x8d\xa5\x92\xc1\x12\x03!\x08C\x13\xec\x87\xfb\xe3B\x0f.]\
2919 \xb0\x8e[m.\xea\x0c/\x06\x06R\n\xfe\xd1\xeb\xd7B\xd5f~\x17)\xdc2Pm\x16!\x7f\
2920 \xab6\xe3i\x0b\x9e\xe8\x93\xc0BD\x86\xdfV0\x00\x90R`\xda\xcc\x0c\x00\x0c\x00\
2921 \xc1\x05>\x9a\x87\x19t\x180\x981\xbd\xfd\xe4\xc4Y\x82\xf7\x14\xca\xe7\xb7\
2922 \xa6\t\xee6\x1c\xba\xe18\xab\xc1 \xc3\xb5N?L\xaa5\xb5\xd0\x8dw`JaJ\xb0\x0b\
2923 \x03!\xc1\t\xdc\xb9k\x0f\x9e\xd1\x0b\x18\xf6\xe0x\x95]\xf2\\\xb2\xd6\x1b}\
2924 \x14BL\xb9{t\xc7\x00\x00\x00\x00IEND\xaeB`\x82'
2926 def getOpenBitmap():
2927 return BitmapFromImage(getOpenImage())
2930 stream
= cStringIO
.StringIO(getOpenData())
2931 return ImageFromStream(stream
)
2933 #----------------------------------------------------------------------
2936 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
2937 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
2938 \x00\x00\x9fIDAT8\x8d\xa5\x93\xdb\x0e\x830\x0cC\xed\x84\xdfF\xeb\xb4\xef\xa6\
2939 \xde\x030z\t\x94\tK\x91z\xcb\x01\xbb*i\x8e\'\x9a\x00@yQ\xb4Is\x8e\x00\xb6\
2940 \x0f$Uu\x05\x0e\x01\x91$\r!\xa49\x94\x17I\x02\xc9_\xe3:Nq\x93}XL|\xeb\xe9\
2941 \x05\xa4p\rH\xa29h^[ Y\xd5\xb9\xb5\x17\x94gu\x19DA\x96\xe0c\xfe^\xcf\xe7Y\
2942 \x95\x05\x00M\xf5\x16Z;\x7f\xfdAd\xcf\xee\x1cj\xc1%|\xdan"LL\x19\xda\xe1}\
2943 \x90:\x00#\x95_l5\x04\xec\x89\x9f\xef?|\x8d\x97o\xe1\x8e\xbeJ\xfc\xb1\xde\
2944 \xea\xf8\xb9\xc4\x00\x00\x00\x00IEND\xaeB`\x82'
2946 def getCopyBitmap():
2947 return BitmapFromImage(getCopyImage())
2950 stream
= cStringIO
.StringIO(getCopyData())
2951 return ImageFromStream(stream
)
2953 #----------------------------------------------------------------------
2956 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
2957 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
2958 \x00\x00\xa1IDAT8\x8d\xa5\x93\xd9\x0e\xc3 \x0c\x04\xc7\xa6\xbf]\xc5U\xbf\xbb\
2959 \xd9>$4\\9\xaa\xacd\t\x0c\x1e/H6\xf3\xc4\x1d=FI\xcd\x1f\x95{\xf3d{\x003O]\
2960 \x01\x80\x94/\x0c\x8a\n\xa0\x01\x8a\x88\xdfaD m\x85y\xdd\xde\xc9\x10/\xc9\
2961 \xf9\xc0S2\xf3%\xf2\xba\x04\x94\xea\xfe`\xf4\x9c#U\x80\xbd.\x97\x015\xec&\
2962 \x00@\x9a\xba\x9c\xd9\x0b\x08\xe0\r4\x9fxU\xd2\x84\xe6\xa7N\x1dl\x1dkGe\xee\
2963 \x14\xd0>\xa3\x85\xfc\xe5`\x08]\x87I}\x84\x8e\x04!\xf3\xb48\x18\r\x8bf4\xea\
2964 \xde;\xbc9\xce_!\\\\T\xf75'\xd6\x00\x00\x00\x00IEND\xaeB`\x82"
2966 def getPasteBitmap():
2967 return BitmapFromImage(getPasteImage())
2969 def getPasteImage():
2970 stream
= cStringIO
.StringIO(getPasteData())
2971 return ImageFromStream(stream
)
2973 #----------------------------------------------------------------------
2976 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
2977 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
2978 \x00\x00lIDAT8\x8d\xc5\x93\xe1\n\xc0 \x08\x84=\xed\xc1}\xf1\xcd\xfd\x18B\x98\
2979 mX\x83\x1d\x04\x11\xfayV\x02,\xb4#\xde\xca&\xa2\xe6\x1b;\x0f\xab$\x82\x05\
2980 \x83\x03U\xbdaf\xe9\xea\x13]\xe5\x16\xa2\xd32\xc0].\x03\xa2Z<PU\x02\x90\xc5\
2981 \x0e\xd5S\xc0,p\xa6\xef[xs\xb0t\x89`A|\xff\x12\xe0\x11\xde\x0fS\xe5;\xbb#\
2982 \xfc>\x8d\x17\x18\xfd(\xb72\xc2\x06\x00\x00\x00\x00\x00IEND\xaeB`\x82'
2984 def getSaveBitmap():
2985 return BitmapFromImage(getSaveImage())
2988 stream
= cStringIO
.StringIO(getSaveData())
2989 return ImageFromStream(stream
)
2991 #----------------------------------------------------------------------
2992 def getSaveAllData():
2994 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
2995 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
2996 \x00\x01\tIDAT8\x8d\xa5\x93\xe1m\x830\x10\x85\xdfA\xd7H\x827\xf0\x02\xado\
2997 \x04\x8f`Fh\xfb\xb7\xad\xcd&$Y\x80\x11\xcc\x06\x8c\xe0E\xd2\xeb\x8f\x16\x04!\
2998 8R\xf3\xa4\x93Nw\xd2\xf3\xa7g\x9b\xa8(\xf1\x88\x9er\xcb\xc3~\')%x\xef\xa7Y\
2999 \x8c\x11J)\x00\xc0\xf1t&PQn\x163\x0b\x00\x99\xcb{/\x00\xc49\'T\x94(\xfe\x83\
3000 \x1dB\x98\xfa\x95\xc1a\xbf\x13\xf9\xbe\xc8\xd7\xe7\x87\x18c\xe0\xbd\x073\xa3\
3001 \xaek\x10\x11\xfa\xbe\xcfgPU\x15RJ\x8bSB\x08h\x9af1\xdb$\xc8aw]\x87\xae\xeb\
3002 \xd6\x04\xd7i\x1bc\xc0\xccPJ\xa1m[03\x98\x19Z\xeb\x951QQ\xc2\xbc<K\x8c\x11"\
3003 \x92\xc5N)M\xbd\xd6\x1a\xafo\xef\x94}\x07#6\x00Xk\x7f\xef\xfdO\xc7\xd3\x19\
3004 \xc0,\x83\x10\x02\x88h\xaa1m\xad\xf5M\xf4E\x06s\x93-\xcd\xf1\xef\x1a\x8c\'^c\
3005 \xdf5\x18\x95C\xbei`\xad\xc50\x0cp\xce-\x96[\xd8s\xd1\xa3\xdf\xf9\x075\xf1v>\
3006 \x92\xcb\xbc\xdd\x00\x00\x00\x00IEND\xaeB`\x82'
3008 def getSaveAllBitmap():
3009 return BitmapFromImage(getSaveAllImage())
3011 def getSaveAllImage():
3012 stream
= cStringIO
.StringIO(getSaveAllData())
3013 return ImageFromStream(stream
)
3015 #----------------------------------------------------------------------
3018 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3019 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3020 \x00\x00\xa1IDAT8\x8d\xa5S[\x0e\x02!\x0c\xec\xd0\xbd\xb6\x1a\xf5\xda\x96\xd9\
3021 \x0f\xa1V\x96\x00\xbaMHI\xd3y\xf0(\x90T\xce\xc4\xd6+2\x1bg@$E\x97\x80\xd9H\
3022 \x8e\xf1\x00\xc6\x0e\xda&''\x05\x80\xab\x1f\x08\xa2\xfa\xcc\xc5\xd0\xc1H\xbd\
3023 \n\x89\xbc\xef\xc1\tV\xd5\x91\x14\xcc\xc6\x9a\xa5<#WV\xed\x8d\x18\x94\xc2\
3024 \xd1s'\xa2\xb2\xe7\xc2\xf4STAf\xe3\x16\x0bm\xdc\xae\x17'\xbf?\x9e\x0e\x8an\
3025 \x86G\xc8\xf6\xf9\x91I\xf5\x8b\xa0\n\xff}\x04w\x80\xa4ng\x06l/QD\x04u\x1aW\
3026 \x06(:\xf0\xfd\x99q\xce\xf6\xe2\x0e\xa5\xa2~.\x00=\xb5t\x00\x00\x00\x00IEND\
3029 def getPrintBitmap():
3030 return BitmapFromImage(getPrintImage())
3032 def getPrintImage():
3033 stream
= cStringIO
.StringIO(getPrintData())
3034 return ImageFromStream(stream
)
3036 #----------------------------------------------------------------------
3037 def getPrintPreviewData():
3039 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3040 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3041 \x00\x00\xa8IDAT8\x8d\x9d\x93K\x0e\xc30\x08Dg \xd7n\xcd\xc1\x9b\xd2E\x83E\\\
3042 \xffT$/\x82\xc5\x83\x19\x13\x02p,\x82\xa2\x1c\xde\x01p\xf71\x83\xe4\x14"\xab\
3043 \xeeQ\xec\xef\xb3\xdbe{\x82\x0c\xcb\xdf\xc7\xaa{\x86\xb7\xb0-@\xaf(\xc7\xd4\
3044 \x03\x9203P\x94\x14\xa5\x99\xa1\xf5b\x08\x88b+\x05~\xbejQ\x0f\xe2\xbd\x00\
3045 \xe0\x14\x05\xdc\x9d\xa2\xa0(\xcc\xec\x9b\xbb\xee(\xba~F\xea15a\n(\xcfG\x1d5\
3046 d\xe4\xdcTB\xc8\x88\xb1CB\x9b\x9b\x02\x02\x92O@\xaa\x0fXl\xe2\xcd\x0f\xf2g\
3047 \xad\x89\x8d\xbf\xf1\x06\xb9V9 \x0c\x1d\xff\xc6\x07\x8aF\x9e\x04\x12\xb5\xf9\
3048 O\x00\x00\x00\x00IEND\xaeB`\x82'
3050 def getPrintPreviewBitmap():
3051 return BitmapFromImage(getPrintPreviewImage())
3053 def getPrintPreviewImage():
3054 stream
= cStringIO
.StringIO(getPrintPreviewData())
3055 return ImageFromStream(stream
)
3057 #----------------------------------------------------------------------
3060 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3061 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3062 \x00\x00rIDAT8\x8d\xad\x93\xc1\x0e\xc0 \x08CW\xdco{\xf2\xbb';\xb18\x07\x9d\
3063 \x0b\xe3\xa2\x98\xe6\xb5$\x02H\xd92%\xde\xa3\xf6CY\xff\nH'\xf8\x05`\xb1Y\xfc\
3064 \x10\x00)`\xfdR\x82\x15w\n0W\xe6N\x01\xda\xab\x8e\xe7g\xc0\xe8\xae\xbdj\x04\
3065 \xda#\xe7;\xa8] \xbb\xbb\tL0\x8bX\xa5?\xd2c\x84\xb9 \r6\x96\x97\x0c\xf362\
3066 \xb1k\x90]\xe7\x13\x85\xca7&\xcf\xda\xcdU\x00\x00\x00\x00IEND\xaeB`\x82"
3069 return BitmapFromImage(getCutImage())
3072 stream
= cStringIO
.StringIO(getCutData())
3073 return ImageFromStream(stream
)
3075 #----------------------------------------------------------------------
3078 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3079 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3080 \x00\x00lIDAT8\x8d\xed\x92Q\x0b\x800\x08\x84\xd5\xf5\xb7\x07W\xfdo\xed!\xaca\
3081 \xb2\x11{\xe9!a\xa0\xc7\xeec\x1ec\x96B3%S\xeeO\x00\x96\xd1\x05\xd3j\xed\x0c\
3082 \x10\xad\xdb\xce\x97\xc0R\xe8\x0c\x12\xe6\xbd\xcfQs\x1d\xb8\xf5\xd4\x90\x19#\
3083 \xc4\xfbG\x06\xa6\xd5X\x9a'\x0e*\r1\xee\xfd\x1a\xd0\x83\x98V\x03\x1a\xa1\xb7\
3084 k<@\x12\xec\xff\x95\xe7\x01\x07L\x0e(\xe5\xa4\xff\x1c\x88\x00\x00\x00\x00IEN\
3087 def getUndoBitmap():
3088 return BitmapFromImage(getUndoImage())
3091 stream
= cStringIO
.StringIO(getUndoData())
3092 return ImageFromStream(stream
)
3094 #----------------------------------------------------------------------
3097 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3098 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3099 \x00\x00jIDAT8\x8d\xed\x92\xcd\n\xc0 \x0c\x83\x9bv\xaf\xed\x16\xf0\xbd\xd7]&\
3100 \xf8\x8f\xe0e\x87\t9$\xb6\x1f\xb5\x08\xa8\xc9\xce\xd1\xad\xeeO\x00\x8e\xdc\\\
3101 gp\xb2,\x80FL\tP\x13\xa8\tI\x17\xa1'\x9f$\xd2\xe6\xb9\xef\x86=\xa5\xfb\x1a\
3102 \xb8\xbc\x03h\x84\xdf\xc1\xeb|\x19\xd0k.\x00\xe4\xb8h\x94\xbf\xa3\x95\xef$\
3103 \xe7\xbbh\xf4\x7f\xe5}\xc0\x03&\x1b&\xe5\xc2\x03!\xa6\x00\x00\x00\x00IEND\
3106 def getRedoBitmap():
3107 return BitmapFromImage(getRedoImage())
3110 stream
= cStringIO
.StringIO(getRedoData())
3111 return ImageFromStream(stream
)
3113 #----------------------------------------------------------------------------
3117 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
3118 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
3119 \x00\x00]IDAT8\x8d\xed\x931\x0e\xc00\x08\x03m\x92\xff\xff8q\x87\xb6C\x11\x89\
3120 \xa8X:\xd4\x13\x03:\x1b\x01\xa45T\xd4\xefBsh\xd7Hk\xdc\x02\x00@\x8a\x19$\xa1\
3121 9\x14A,\x95\xf3\x82G)\xd3\x00\xf24\xf7\x90\x1ev\x07\xee\x1e\xf4:\xc1J?\xe0\
3122 \x0b\x80\xc7\x1d\xf8\x1dg\xc4\xea7\x96G8\x00\xa8\x91\x19(\x85#P\x7f\x00\x00\
3123 \x00\x00IEND\xaeB`\x82'
3126 def getBlankBitmap():
3127 return BitmapFromImage(getBlankImage())
3129 def getBlankImage():
3130 stream
= cStringIO
.StringIO(getBlankData())
3131 return ImageFromStream(stream
)
3134 return wx
.IconFromBitmap(getBlankBitmap())