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
) 
 776         wx
.EVT_MOTION(self
._notebook
, self
.OnNotebookMouseOver
) 
 778         templates 
= wx
.GetApp().GetDocumentManager().GetTemplates() 
 779         iconList 
= wx
.ImageList(16, 16, initialCount 
= len(templates
)) 
 780         self
._iconIndexLookup 
= [] 
 781         for template 
in templates
: 
 782             icon 
= template
.GetIcon() 
 784                 if icon
.GetHeight() != 16 or icon
.GetWidth() != 16: 
 787                     if wx
.GetApp().GetDebug(): 
 788                         print "Warning: icon for '%s' isn't 16x16, not crossplatform" % template
._docTypeName
 
 789                 iconIndex 
= iconList
.AddIcon(icon
) 
 790                 self
._iconIndexLookup
.append((template
, iconIndex
)) 
 792         icon 
= getBlankIcon() 
 793         if icon
.GetHeight() != 16 or icon
.GetWidth() != 16: 
 796             if wx
.GetApp().GetDebug(): 
 797                 print "Warning: getBlankIcon isn't 16x16, not crossplatform" 
 798         self
._blankIconIndex 
= iconList
.AddIcon(icon
) 
 799         self
._notebook
.AssignImageList(iconList
) 
 802     def GetNotebook(self
): 
 804         Returns the notebook used by the tabbed document interface. 
 806         return self
._notebook
 
 809     def GetActiveChild(self
): 
 811         Returns the active notebook page, which to the framework is treated as 
 814         index 
= self
._notebook
.GetSelection() 
 817         return self
._notebook
.GetPage(index
) 
 820     def OnNotebookPageChanged(self
, event
): 
 822         Activates a notebook page's view when it is selected. 
 824         index 
= self
._notebook
.GetSelection() 
 826             self
._notebook
.GetPage(index
).GetView().Activate() 
 829     def OnNotebookMouseOver(self
, event
): 
 830         # wxBug: On Windows XP the tooltips don't automatically disappear when you move the mouse and it is on a notebook tab, has nothing to do with this code!!! 
 831         index
, type = self
._notebook
.HitTest(event
.GetPosition()) 
 833             doc 
= self
._notebook
.GetPage(index
).GetView().GetDocument() 
 834             self
._notebook
.SetToolTip(wx
.ToolTip(doc
.GetFilename())) 
 836             self
._notebook
.SetToolTip(wx
.ToolTip("")) 
 840     def OnNotebookRightClick(self
, event
): 
 842         Handles right clicks for the notebook, enabling users to either close 
 843         a tab or select from the available documents if the user clicks on the 
 844         notebook's white space. 
 846         index
, type = self
._notebook
.HitTest(event
.GetPosition()) 
 848         x
, y 
= event
.GetX(), event
.GetY() 
 850             doc 
= self
._notebook
.GetPage(index
).GetView().GetDocument() 
 852             menu
.Append(id, _("Close")) 
 853             def OnRightMenuSelect(event
): 
 855             wx
.EVT_MENU(self
, id, OnRightMenuSelect
) 
 856             if self
._notebook
.GetPageCount() > 1: 
 858                 menu
.Append(id, _("Close All but \"%s\"" % doc
.GetPrintableName())) 
 859                 def OnRightMenuSelect(event
): 
 860                     for i 
in range(self
._notebook
.GetPageCount()-1, -1, -1): # Go from len-1 to 0 
 862                             doc 
= self
._notebook
.GetPage(i
).GetView().GetDocument() 
 863                             if not self
.GetDocumentManager().CloseDocument(doc
, False): 
 865                 wx
.EVT_MENU(self
, id, OnRightMenuSelect
) 
 866                 menu
.AppendSeparator() 
 868                 menu
.AppendMenu(wx
.NewId(), _("Select Tab"), tabsMenu
) 
 870             y 
= y 
- 25  # wxBug: It is offsetting click events in the blank notebook area 
 873         if self
._notebook
.GetPageCount() > 1: 
 875             for i 
in range(0, self
._notebook
.GetPageCount()): 
 878                 tabsMenu
.Append(id, self
._notebook
.GetPageText(i
)) 
 879                 def OnRightMenuSelect(event
): 
 880                     self
._notebook
.SetSelection(selectIDs
[event
.GetId()]) 
 881                 wx
.EVT_MENU(self
, id, OnRightMenuSelect
) 
 883         self
._notebook
.PopupMenu(menu
, wx
.Point(x
, y
)) 
 887     def AddNotebookPage(self
, panel
, title
): 
 889         Adds a document page to the notebook. 
 891         self
._notebook
.AddPage(panel
, title
) 
 892         index 
= self
._notebook
.GetPageCount() - 1 
 893         self
._notebook
.SetSelection(index
) 
 895         found 
= False  # Now set the icon 
 896         template 
= panel
.GetDocument().GetDocumentTemplate() 
 898             for t
, iconIndex 
in self
._iconIndexLookup
: 
 900                     self
._notebook
.SetPageImage(index
, iconIndex
) 
 904             self
._notebook
.SetPageImage(index
, self
._blankIconIndex
) 
 905         self
._notebook
.Layout() 
 908     def RemoveNotebookPage(self
, panel
): 
 910         Removes a document page from the notebook. 
 912         index 
= self
.GetNotebookPageIndex(panel
) 
 914             self
._notebook
.DeletePage(index
) 
 917     def ActivateNotebookPage(self
, panel
): 
 919         Sets the notebook to the specified panel. 
 921         index 
= self
.GetNotebookPageIndex(panel
) 
 923             self
._notebook
.SetFocus() 
 924             self
._notebook
.SetSelection(index
) 
 927     def GetNotebookPageTitle(self
, panel
): 
 928         self
._notebook
.GetPageText(self
.GetNotebookPageIndex(panel
)) 
 931     def SetNotebookPageTitle(self
, panel
, title
): 
 932         self
._notebook
.SetPageText(self
.GetNotebookPageIndex(panel
), title
) 
 935     def GetNotebookPageIndex(self
, panel
): 
 937         Returns the index of particular notebook panel. 
 940         for i 
in range(self
._notebook
.GetPageCount()): 
 941             if self
._notebook
.GetPage(i
) == panel
: 
 947     def ProcessEvent(self
, event
): 
 949         Processes an event, searching event tables and calling zero or more 
 950         suitable event handler function(s).  Note that the ProcessEvent 
 951         method is called from the wxPython docview framework directly since 
 952         wxPython does not have a virtual ProcessEvent function. 
 954         if wx
.GetApp().ProcessEventBeforeWindows(event
): 
 956         if self
._docManager 
and self
._docManager
.ProcessEvent(event
): 
 958         return DocMDIParentFrameMixIn
.ProcessEvent(self
, event
) 
 961     def ProcessUpdateUIEvent(self
, event
): 
 963         Processes a UI event, searching event tables and calling zero or more 
 964         suitable event handler function(s).  Note that the ProcessEvent 
 965         method is called from the wxPython docview framework directly since 
 966         wxPython does not have a virtual ProcessEvent function. 
 968         if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
): 
 970         if self
._docManager 
and self
._docManager
.ProcessUpdateUIEvent(event
): 
 972         return DocMDIParentFrameMixIn
.ProcessUpdateUIEvent(self
, event
) 
 975     def OnExit(self
, event
): 
 977         Called when File/Exit is chosen and closes the window. 
 982     def OnMRUFile(self
, event
): 
 984         Opens the appropriate file when it is selected from the file history 
 987         n 
= event
.GetId() - wx
.ID_FILE1
 
 988         filename 
= self
._docManager
.GetHistoryFile(n
) 
 990             self
._docManager
.CreateDocument(filename
, wx
.lib
.docview
.DOC_SILENT
) 
 992             self
._docManager
.RemoveFileFromHistory(n
) 
 993             msgTitle 
= wx
.GetApp().GetAppName() 
 995                 msgTitle 
= _("File Error") 
 996             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), 
 998                           wx
.OK | wx
.ICON_EXCLAMATION
, 
1002     def OnSize(self
, event
): 
1004         Called when the frame is resized and lays out the client window. 
1006         # Needed in case there are splitpanels around the mdi frame 
1010     def OnCloseWindow(self
, event
): 
1012         Called when the frame is closed.  Remembers the frame size. 
1014         self
.SaveEmbeddedWindowSizes() 
1016         # save and close services last 
1017         for service 
in wx
.GetApp().GetServices(): 
1018             if not service
.OnCloseFrame(event
): 
1021         # From docview.MDIParentFrame 
1022         if self
._docManager
.Clear(not event
.CanVeto()): 
1028 class DocMDIChildFrame(wx
.MDIChildFrame
): 
1030     The wxDocMDIChildFrame class provides a default frame for displaying 
1031     documents on separate windows. This class can only be used for MDI child 
1034     The class is part of the document/view framework supported by wxWindows, 
1035     and cooperates with the wxView, wxDocument, wxDocManager and wxDocTemplate 
1040     def __init__(self
, doc
, view
, frame
, id, title
, pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
, name
="frame"): 
1042         Constructor.  Note that the event table must be rebuilt for the 
1043         frame since the EvtHandler is not virtual. 
1045         wx
.MDIChildFrame
.__init
__(self
, frame
, id, title
, pos
, size
, style
, name
) 
1046         self
._childDocument 
= doc
 
1047         self
._childView 
= view
 
1050         # self.Create(doc, view, frame, id, title, pos, size, style, name) 
1051         self
._activeEvent 
= None 
1053         wx
.EVT_ACTIVATE(self
, self
.OnActivate
) 
1054         wx
.EVT_CLOSE(self
, self
.OnCloseWindow
) 
1056         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 
1057             mdiChildren 
= filter(lambda x
: isinstance(x
, wx
.MDIChildFrame
), frame
.GetChildren()) 
1058             if len(mdiChildren
) == 1: 
1062 ##    # Couldn't get this to work, but seems to work fine with single stage construction 
1063 ##    def Create(self, doc, view, frame, id, title, pos, size, style, name): 
1064 ##        self._childDocument = doc 
1065 ##        self._childView = view 
1066 ##        if wx.MDIChildFrame.Create(self, frame, id, title, pos, size, style, name): 
1068 ##                view.SetFrame(self) 
1074     def Activate(self
):  # Need this in case there are embedded sash windows and such, OnActivate is not getting called 
1076         Activates the current view. 
1079             self
._childView
.Activate(True) 
1082     def ProcessEvent(event
): 
1084         Processes an event, searching event tables and calling zero or more 
1085         suitable event handler function(s).  Note that the ProcessEvent 
1086         method is called from the wxPython docview framework directly since 
1087         wxPython does not have a virtual ProcessEvent function. 
1089         if self
._activeEvent 
== event
: 
1092         self
._activeEvent 
= event  
# Break recursion loops 
1095             self
._childView
.Activate(True) 
1097         if not self
._childView 
or not self
._childView
.ProcessEvent(event
): 
1098             if not isinstance(event
, wx
.CommandEvent
) or not self
.GetParent() or not self
.GetParent().ProcessEvent(event
): 
1105         self
._activeEvent 
= None 
1109     def OnActivate(self
, event
): 
1111         Sets the currently active view to be the frame's view. You may need to 
1112         override (but still call) this function in order to set the keyboard 
1113         focus for your subwindow. 
1115         if self
._activated 
!= 0: 
1117         self
._activated 
+= 1 
1118         wx
.MDIChildFrame
.Activate(self
) 
1119         if event
.GetActive() and self
._childView
: 
1120             self
._childView
.Activate(event
.GetActive()) 
1124     def OnCloseWindow(self
, event
): 
1126         Closes and deletes the current view and document. 
1130             if not event
.CanVeto(): 
1133                 ans 
= self
._childView
.Close(deleteWindow 
= False) 
1136                 self
._childView
.Activate(False) 
1137                 self
._childView
.Destroy() 
1138                 self
._childView 
= None 
1139                 if self
._childDocument
: 
1140                     self
._childDocument
.Destroy()  # This isn't in the wxWindows codebase but the document needs to be disposed of somehow 
1141                 self
._childDocument 
= None 
1149     def GetDocument(self
): 
1151         Returns the document associated with this frame. 
1153         return self
._childDocument
 
1156     def SetDocument(self
, document
): 
1158         Sets the document for this frame. 
1160         self
._childDocument 
= document
 
1165         Returns the view associated with this frame. 
1167         return self
._childView
 
1170     def SetView(self
, view
): 
1172         Sets the view for this frame. 
1174         self
._childView 
= view
 
1180 class DocService(wx
.EvtHandler
): 
1182     An abstract class used to add reusable services to a docview application. 
1187         """Initializes the DocService.""" 
1191     def GetDocumentManager(self
): 
1192         """Returns the DocManager for the docview application.""" 
1193         return self
._docManager
 
1196     def SetDocumentManager(self
, docManager
): 
1197         """Sets the DocManager for the docview application.""" 
1198         self
._docManager 
= docManager
 
1201     def InstallControls(self
, frame
, menuBar
=None, toolBar
=None, statusBar
=None, document
=None): 
1202         """Called to install controls into the menubar and toolbar of a SDI or MDI window.  Override this method for a particular service.""" 
1206     def ProcessEventBeforeWindows(self
, event
): 
1208         Processes an event before the main window has a chance to process the window.  
1209         Override this method for a particular service. 
1214     def ProcessUpdateUIEventBeforeWindows(self
, event
): 
1216         Processes a UI event before the main window has a chance to process the window. 
1217         Override this method for a particular service. 
1222     def ProcessEvent(self
, event
): 
1224         Processes an event, searching event tables and calling zero or more 
1225         suitable event handler function(s).  Note that the ProcessEvent 
1226         method is called from the wxPython docview framework directly since 
1227         wxPython does not have a virtual ProcessEvent function. 
1232     def ProcessUpdateUIEvent(self
, event
): 
1234         Processes a UI event, searching event tables and calling zero or more 
1235         suitable event handler function(s).  Note that the ProcessEvent 
1236         method is called from the wxPython docview framework directly since 
1237         wxPython does not have a virtual ProcessEvent function. 
1242     def OnCloseFrame(self
, event
): 
1244         Called when the a docview frame is being closed.  Override this method 
1245         so a service can either do cleanup or veto the frame being closed by 
1253         Called when the the docview application is being closed.  Override this method 
1254         so a service can either do cleanup or veto the frame being closed by 
1260     def GetMenuItemPos(self
, menu
, id): 
1262         Utility method used to find the position of a menu item so that services can 
1263         easily find where to insert a menu item in InstallControls. 
1265         menuItems 
= menu
.GetMenuItems() 
1266         for i
, menuItem 
in enumerate(menuItems
): 
1267             if menuItem
.GetId() == id: 
1274         Called by WindowMenuService to get views for services that don't 
1275         have dedicated documents such as the Outline Service. 
1280 class DocOptionsService(DocService
): 
1282     A service that implements an options menu item and an options dialog with 
1283     notebook tabs.  New tabs can be added by other services by calling the 
1284     "AddOptionsPanel" method. 
1288     def __init__(self
, showGeneralOptions
=True, supportedModes
=wx
.lib
.docview
.DOC_SDI 
& wx
.lib
.docview
.DOC_MDI
): 
1290         Initializes the options service with the option of suppressing the default 
1291         general options pane that is included with the options service by setting 
1292         showGeneralOptions to False.  It allowModeChanges is set to False, the 
1293         default general options pane will allow users to change the document 
1294         interface mode between SDI and MDI modes. 
1296         DocService
.__init
__(self
) 
1297         self
.ClearOptionsPanels() 
1298         self
._supportedModes 
= supportedModes
 
1299         self
._toolOptionsID 
= wx
.NewId() 
1300         if showGeneralOptions
: 
1301             self
.AddOptionsPanel(GeneralOptionsPanel
) 
1304     def InstallControls(self
, frame
, menuBar
=None, toolBar
=None, statusBar
=None, document
=None): 
1306         Installs a "Tools" menu with an "Options" menu item. 
1308         toolsMenuIndex 
= menuBar
.FindMenu(_("&Tools")) 
1309         if toolsMenuIndex 
> -1: 
1310             toolsMenu 
= menuBar
.GetMenu(toolsMenuIndex
) 
1312             toolsMenu 
= wx
.Menu() 
1313         if toolsMenuIndex 
== -1: 
1314             formatMenuIndex 
= menuBar
.FindMenu(_("&Format")) 
1315             menuBar
.Insert(formatMenuIndex 
+ 1, toolsMenu
, _("&Tools")) 
1317             if toolsMenu
.GetMenuItemCount(): 
1318                 toolsMenu
.AppendSeparator() 
1319             toolsMenu
.Append(self
._toolOptionsID
, _("&Options..."), _("Sets options")) 
1320             wx
.EVT_MENU(frame
, self
._toolOptionsID
, frame
.ProcessEvent
) 
1323     def ProcessEvent(self
, event
): 
1325         Checks to see if the "Options" menu item has been selected. 
1328         if id == self
._toolOptionsID
: 
1329             self
.OnOptions(event
) 
1335     def GetSupportedModes(self
): 
1337         Return the modes supported by the application.  Use docview.DOC_SDI and 
1338         docview.DOC_MDI flags to check if SDI and/or MDI modes are supported. 
1340         return self
._supportedModes        
 
1343     def SetSupportedModes(self
, _supportedModessupportedModes
): 
1345         Sets the modes supported by the application.  Use docview.DOC_SDI and 
1346         docview.DOC_MDI flags to set if SDI and/or MDI modes are supported. 
1348         self
._supportedModes 
= supportedModes
 
1351     def ClearOptionsPanels(self
): 
1353         Clears all of the options panels that have been added into the 
1356         self
._optionsPanels 
= [] 
1359     def AddOptionsPanel(self
, optionsPanel
): 
1361         Adds an options panel to the options dialog.  
1363         self
._optionsPanels
.append(optionsPanel
) 
1366     def OnOptions(self
, event
): 
1368         Shows the options dialog, called when the "Options" menu item is selected. 
1370         if len(self
._optionsPanels
) == 0: 
1372         optionsDialog 
= OptionsDialog(wx
.GetApp().GetTopWindow(), self
._optionsPanels
, self
._docManager
) 
1373         if optionsDialog
.ShowModal() == wx
.ID_OK
: 
1374             optionsDialog
.OnOK(optionsDialog
)  # wxBug: wxDialog should be calling this automatically but doesn't 
1375         optionsDialog
.Destroy() 
1378 class OptionsDialog(wx
.Dialog
): 
1380     A default options dialog used by the OptionsService that hosts a notebook 
1381     tab of options panels. 
1385     def __init__(self
, parent
, optionsPanelClasses
, docManager
): 
1387         Initializes the options dialog with a notebook page that contains new 
1388         instances of the passed optionsPanelClasses. 
1390         wx
.Dialog
.__init
__(self
, parent
, -1, _("Options"), size 
= (570, 365)) 
1392         self
._optionsPanels 
= [] 
1393         self
._docManager 
= docManager
 
1398         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
1400         optionsNotebook 
= wx
.Notebook(self
, -1, size
=(560, 325)) 
1401         sizer
.Add(optionsNotebook
, 0, wx
.ALL | wx
.EXPAND
, SPACE
) 
1402         for optionsPanelClass 
in optionsPanelClasses
: 
1403             optionsPanel 
= optionsPanelClass(optionsNotebook
, -1) 
1404             self
._optionsPanels
.append(optionsPanel
) 
1405         sizer
.Add(self
.CreateButtonSizer(wx
.OK | wx
.CANCEL
), 0, wx
.ALIGN_RIGHT | wx
.RIGHT | wx
.BOTTOM
, HALF_SPACE
) 
1406         self
.SetSizer(sizer
) 
1408         if wx
.Platform 
!= '__WXMAC__' or len(optionsPanelClasses
) < 6:  # wxBug: Notebook tabs are truncated and user can't get to them on the Mac 
1410         wx
.CallAfter(self
.DoRefresh
) 
1413     def DoRefresh(self
): 
1415         wxBug: On Windows XP when using a multiline notebook the default page doesn't get 
1416         drawn, but it works when using a single line notebook. 
1421     def GetDocManager(self
): 
1423         Returns the document manager passed to the OptionsDialog constructor. 
1425         return self
._docManager
 
1428     def OnOK(self
, event
): 
1430         Calls the OnOK method of all of the OptionDialog's embedded panels 
1432         for optionsPanel 
in self
._optionsPanels
: 
1433             optionsPanel
.OnOK(event
) 
1436 class GeneralOptionsPanel(wx
.Panel
): 
1438     A general options panel that is used in the OptionDialog to configure the 
1439     generic properties of a pydocview application, such as "show tips at startup" 
1440     and whether to use SDI or MDI for the application. 
1444     def __init__(self
, parent
, id): 
1446         Initializes the panel by adding an "Options" folder tab to the parent notebook and 
1447         populating the panel with the generic properties of a pydocview application.  
1449         wx
.Panel
.__init
__(self
, parent
, id) 
1452         config 
= wx
.ConfigBase_Get() 
1453         self
._showTipsCheckBox 
= wx
.CheckBox(self
, -1, _("Show tips at start up")) 
1454         self
._showTipsCheckBox
.SetValue(config
.ReadInt("ShowTipAtStartup", True)) 
1455         if self
._AllowModeChanges
(): 
1456             supportedModes 
= wx
.GetApp().GetService(DocOptionsService
).GetSupportedModes() 
1458             self
._sdiChoice 
= _("Show each document in its own window") 
1459             self
._mdiChoice 
= _("Show all documents in a single window with tabs") 
1460             self
._winMdiChoice 
= _("Show all documents in a single window with child windows") 
1461             if supportedModes 
& wx
.lib
.docview
.DOC_SDI
: 
1462                 choices
.append(self
._sdiChoice
) 
1463             choices
.append(self
._mdiChoice
) 
1464             if wx
.Platform 
== "__WXMSW__": 
1465                 choices
.append(self
._winMdiChoice
) 
1466             self
._documentRadioBox 
= wx
.RadioBox(self
, -1, _("Document Interface"), 
1470             if config
.ReadInt("UseWinMDI", False): 
1471                 self
._documentRadioBox
.SetStringSelection(self
._winMdiChoice
) 
1472             elif config
.ReadInt("UseMDI", True): 
1473                 self
._documentRadioBox
.SetStringSelection(self
._mdiChoice
) 
1475                 self
._documentRadioBox
.SetStringSelection(self
._sdiChoice
) 
1476             def OnDocumentInterfaceSelect(event
): 
1477                 if not self
._documentInterfaceMessageShown
: 
1478                     msgTitle 
= wx
.GetApp().GetAppName() 
1480                         msgTitle 
= _("Document Options") 
1481                     wx
.MessageBox(_("Document interface changes will not appear until the application is restarted."), 
1483                                   wx
.OK | wx
.ICON_INFORMATION
, 
1485                     self
._documentInterfaceMessageShown 
= True 
1486             wx
.EVT_RADIOBOX(self
, self
._documentRadioBox
.GetId(), OnDocumentInterfaceSelect
) 
1487         optionsBorderSizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
1488         optionsSizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
1489         if self
._AllowModeChanges
(): 
1490             optionsSizer
.Add(self
._documentRadioBox
, 0, wx
.ALL
, HALF_SPACE
) 
1491         optionsSizer
.Add(self
._showTipsCheckBox
, 0, wx
.ALL
, HALF_SPACE
) 
1492         optionsBorderSizer
.Add(optionsSizer
, 0, wx
.ALL
, SPACE
) 
1493         self
.SetSizer(optionsBorderSizer
) 
1495         self
._documentInterfaceMessageShown 
= False 
1496         parent
.AddPage(self
, _("Options")) 
1499     def _AllowModeChanges(self
): 
1500         supportedModes 
= wx
.GetApp().GetService(DocOptionsService
).GetSupportedModes() 
1501         return supportedModes 
& wx
.lib
.docview
.DOC_SDI 
and supportedModes 
& wx
.lib
.docview
.DOC_MDI 
or wx
.Platform 
== "__WXMSW__" and supportedModes 
& wx
.lib
.docview
.DOC_MDI  
# More than one mode is supported, allow selection 
1504     def OnOK(self
, optionsDialog
): 
1506         Updates the config based on the selections in the options panel. 
1508         config 
= wx
.ConfigBase_Get() 
1509         config
.WriteInt("ShowTipAtStartup", self
._showTipsCheckBox
.GetValue()) 
1510         if self
._AllowModeChanges
(): 
1511             config
.WriteInt("UseMDI", (self
._documentRadioBox
.GetStringSelection() == self
._mdiChoice
)) 
1512             config
.WriteInt("UseWinMDI", (self
._documentRadioBox
.GetStringSelection() == self
._winMdiChoice
)) 
1515 class DocApp(wx
.PySimpleApp
): 
1517     The DocApp class serves as the base class for pydocview applications and offers 
1518     functionality such as services, creation of SDI and MDI frames, show tips, 
1519     and a splash screen. 
1525         Initializes the DocApp. 
1528         self
._defaultIcon 
= None 
1529         self
._registeredCloseEvent 
= False 
1530         self
._useTabbedMDI 
= True 
1532         if not hasattr(self
, "_debug"):  # only set if not already initialized 
1534         if not hasattr(self
, "_singleInstance"):  # only set if not already initialized 
1535             self
._singleInstance 
= True 
1537         # if _singleInstance is TRUE only allow one single instance of app to run. 
1538         # When user tries to run a second instance of the app, abort startup, 
1539         # But if user also specifies files to open in command line, send message to running app to open those files 
1540         if self
._singleInstance
: 
1541             # create shared memory temporary file 
1542             if wx
.Platform 
== '__WXMSW__': 
1543                 tfile 
= tempfile
.TemporaryFile(prefix
="ag", suffix
="tmp") 
1544                 fno 
= tfile
.fileno() 
1545                 self
._sharedMemory 
= mmap
.mmap(fno
, 1024, "shared_memory") 
1547                 tfile 
= file(os
.path
.join(tempfile
.gettempdir(), tempfile
.gettempprefix() + self
.GetAppName() + '-' + wx
.GetUserId() + "AGSharedMemory"), 'w+b') 
1552                 fno 
= tfile
.fileno() 
1553                 self
._sharedMemory 
= mmap
.mmap(fno
, 1024) 
1555             self
._singleInstanceChecker 
= wx
.SingleInstanceChecker(self
.GetAppName() + '-' + wx
.GetUserId(), tempfile
.gettempdir()) 
1556             if self
._singleInstanceChecker
.IsAnotherRunning(): 
1557                 # have running single instance open file arguments 
1558                 data 
= pickle
.dumps(sys
.argv
[1:]) 
1560                     self
._sharedMemory
.seek(0) 
1561                     marker 
= self
._sharedMemory
.read_byte() 
1562                     if marker 
== '\0' or marker 
== '*':        # available buffer 
1563                         self
._sharedMemory
.seek(0) 
1564                         self
._sharedMemory
.write_byte('-')     # set writing marker 
1565                         self
._sharedMemory
.write(data
)  # write files we tried to open to shared memory 
1566                         self
._sharedMemory
.seek(0) 
1567                         self
._sharedMemory
.write_byte('+')     # set finished writing marker 
1568                         self
._sharedMemory
.flush() 
1571                         time
.sleep(1)  # give enough time for buffer to be available 
1575                 self
._timer 
= wx
.PyTimer(self
.DoBackgroundListenAndLoad
) 
1576                 self
._timer
.Start(250) 
1581     def OpenMainFrame(self
): 
1582         docManager 
= self
.GetDocumentManager() 
1583         if docManager
.GetFlags() & wx
.lib
.docview
.DOC_MDI
: 
1584             if self
.GetUseTabbedMDI(): 
1585                 frame 
= wx
.lib
.pydocview
.DocTabbedParentFrame(docManager
, None, -1, self
.GetAppName()) 
1587                 frame 
= wx
.lib
.pydocview
.DocMDIParentFrame(docManager
, None, -1, self
.GetAppName())                 
1591     def DoBackgroundListenAndLoad(self
): 
1593         Open any files specified in the given command line argument passed in via shared memory 
1597         self
._sharedMemory
.seek(0) 
1598         if self
._sharedMemory
.read_byte() == '+':  # available data 
1599             data 
= self
._sharedMemory
.read(1024-1) 
1600             self
._sharedMemory
.seek(0) 
1601             self
._sharedMemory
.write_byte("*")     # finished reading, set buffer free marker 
1602             self
._sharedMemory
.flush() 
1603             args 
= pickle
.loads(data
) 
1605                 if arg
[0] != '/' and arg
[0] != '-' and os
.path
.exists(arg
): 
1606                     self
.GetDocumentManager().CreateDocument(os
.path
.normpath(arg
), wx
.lib
.docview
.DOC_SILENT
) 
1608             # force display of running app 
1609             topWindow 
= wx
.GetApp().GetTopWindow() 
1610             if topWindow
.IsIconized(): 
1611                 topWindow
.Iconize(False) 
1616         self
._timer
.Start(1000) # 1 second interval 
1619     def OpenCommandLineArgs(self
): 
1621         Called to open files that have been passed to the application from the 
1626             if arg
[0] != '/' and arg
[0] != '-' and os
.path
.exists(arg
): 
1627                 self
.GetDocumentManager().CreateDocument(os
.path
.normpath(arg
), wx
.lib
.docview
.DOC_SILENT
) 
1630     def GetDocumentManager(self
): 
1632         Returns the document manager associated to the DocApp. 
1634         return self
._docManager
 
1637     def SetDocumentManager(self
, docManager
): 
1639         Sets the document manager associated with the DocApp and loads the 
1640         DocApp's file history into the document manager. 
1642         self
._docManager 
= docManager
 
1643         config 
= wx
.ConfigBase_Get() 
1644         self
.GetDocumentManager().FileHistoryLoad(config
) 
1647     def ProcessEventBeforeWindows(self
, event
): 
1649         Enables services to process an event before the main window has a chance to 
1652         for service 
in self
._services
: 
1653             if service
.ProcessEventBeforeWindows(event
): 
1658     def ProcessUpdateUIEventBeforeWindows(self
, event
): 
1660         Enables services to process a UI event before the main window has a chance 
1661         to process the window. 
1663         for service 
in self
._services
: 
1664             if service
.ProcessUpdateUIEventBeforeWindows(event
): 
1669     def ProcessEvent(self
, event
): 
1671         Processes an event, searching event tables and calling zero or more 
1672         suitable event handler function(s).  Note that the ProcessEvent 
1673         method is called from the wxPython docview framework directly since 
1674         wxPython does not have a virtual ProcessEvent function. 
1676         for service 
in self
._services
: 
1677             if service
.ProcessEvent(event
): 
1682     def ProcessUpdateUIEvent(self
, event
): 
1684         Processes a UI event, searching event tables and calling zero or more 
1685         suitable event handler function(s).  Note that the ProcessEvent 
1686         method is called from the wxPython docview framework directly since 
1687         wxPython does not have a virtual ProcessEvent function. 
1689         for service 
in self
._services
: 
1690             if service
.ProcessUpdateUIEvent(event
): 
1695     def InstallService(self
, service
): 
1697         Installs an instance of a DocService into the DocApp. 
1699         service
.SetDocumentManager(self
._docManager
) 
1700         self
._services
.append(service
) 
1704     def GetServices(self
): 
1706         Returns the DocService instances that have been installed into the DocApp. 
1708         return self
._services
 
1711     def GetService(self
, type): 
1713         Returns the instance of a particular type of service that has been installed 
1714         into the DocApp.  For example, "wx.GetApp().GetService(pydocview.OptionsService)" 
1715         returns the isntance of the OptionsService that is running within the DocApp. 
1717         for service 
in self
._services
: 
1718             if isinstance(service
, type): 
1725         Called when the DocApp is exited, enables the installed DocServices to exit 
1726         and saves the DocManager's file history. 
1728         for service 
in self
._services
: 
1730         config 
= wx
.ConfigBase_Get() 
1731         self
._docManager
.FileHistorySave(config
) 
1733         if hasattr(self
, "_singleInstanceChecker"): 
1734             del self
._singleInstanceChecker
 
1737     def GetDefaultDocManagerFlags(self
): 
1739         Returns the default flags to use when creating the DocManager. 
1741         config 
= wx
.ConfigBase_Get() 
1742         if config
.ReadInt("UseMDI", True) or config
.ReadInt("UseWinMDI", False): 
1743             flags 
= wx
.lib
.docview
.DOC_MDI | wx
.lib
.docview
.DOC_OPEN_ONCE
 
1744             if config
.ReadInt("UseWinMDI", False): 
1745                 self
.SetUseTabbedMDI(False) 
1747             flags 
= wx
.lib
.docview
.DOC_SDI | wx
.lib
.docview
.DOC_OPEN_ONCE
 
1751     def ShowTip(self
, frame
, tipProvider
): 
1753         Shows the tip window, generally this is called when an application starts. 
1754         A wx.TipProvider must be passed. 
1756         config 
= wx
.ConfigBase_Get() 
1757         showTip 
= config
.ReadInt("ShowTipAtStartup", 1) 
1759             index 
= config
.ReadInt("TipIndex", 0) 
1760             showTipResult 
= wx
.ShowTip(wx
.GetApp().GetTopWindow(), tipProvider
, showAtStartup 
= showTip
) 
1761             if showTipResult 
!= showTip
: 
1762                 config
.WriteInt("ShowTipAtStartup", showTipResult
) 
1765     def GetEditMenu(self
, frame
): 
1767         Utility method that finds the Edit menu within the menubar of a frame. 
1769         menuBar 
= frame
.GetMenuBar() 
1772         editMenuIndex 
= menuBar
.FindMenu(_("&Edit")) 
1773         if editMenuIndex 
== -1: 
1775         return menuBar
.GetMenu(editMenuIndex
) 
1778     def GetUseTabbedMDI(self
): 
1780         Returns True if Windows MDI should use folder tabs instead of child windows. 
1782         return self
._useTabbedMDI
 
1785     def SetUseTabbedMDI(self
, useTabbedMDI
): 
1787         Set to True if Windows MDI should use folder tabs instead of child windows. 
1789         self
._useTabbedMDI 
= useTabbedMDI
 
1792     def CreateDocumentFrame(self
, view
, doc
, flags
, id = -1, title 
= "", pos 
= wx
.DefaultPosition
, size 
= wx
.DefaultSize
, style 
= wx
.DEFAULT_FRAME_STYLE
): 
1794         Called by the DocManager to create and return a new Frame for a Document.  
1795         Chooses whether to create an MDIChildFrame or SDI Frame based on the 
1798         docflags 
= self
.GetDocumentManager().GetFlags() 
1799         if docflags 
& wx
.lib
.docview
.DOC_SDI
: 
1800             frame 
= self
.CreateSDIDocumentFrame(doc
, view
, id, title
, pos
, size
, style
) 
1803             # wxBug: operating system bug, first window is set to the position of last window closed, ignoring passed in position on frame creation 
1804             #        also, initial size is incorrect for the same reasons 
1805             if frame
.GetPosition() != pos
: 
1807             if frame
.GetSize() != size
: 
1810             if doc 
and doc
.GetCommandProcessor(): 
1811                 doc
.GetCommandProcessor().SetEditMenu(self
.GetEditMenu(frame
)) 
1812         elif docflags 
& wx
.lib
.docview
.DOC_MDI
: 
1813             if self
.GetUseTabbedMDI(): 
1814                 frame 
= self
.CreateTabbedDocumentFrame(doc
, view
, id, title
, pos
, size
, style
) 
1816                 frame 
= self
.CreateMDIDocumentFrame(doc
, view
, id, title
, pos
, size
, style
) 
1818                     if doc
.GetDocumentTemplate().GetIcon(): 
1819                         frame
.SetIcon(doc
.GetDocumentTemplate().GetIcon()) 
1820                     elif wx
.GetApp().GetTopWindow().GetIcon(): 
1821                         frame
.SetIcon(wx
.GetApp().GetTopWindow().GetIcon()) 
1822             if doc 
and doc
.GetCommandProcessor(): 
1823                 doc
.GetCommandProcessor().SetEditMenu(self
.GetEditMenu(wx
.GetApp().GetTopWindow())) 
1824         if not frame
.GetIcon() and self
._defaultIcon
: 
1825             frame
.SetIcon(self
.GetDefaultIcon()) 
1826         view
.SetFrame(frame
) 
1830     def CreateSDIDocumentFrame(self
, doc
, view
, id=-1, title
="", pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
): 
1832         Creates and returns an SDI Document Frame. 
1834         frame 
= DocSDIFrame(doc
, view
, None, id, title
, pos
, size
, style
) 
1838     def CreateTabbedDocumentFrame(self
, doc
, view
, id=-1, title
="", pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
): 
1840         Creates and returns an MDI Document Frame for a Tabbed MDI view 
1842         frame 
= DocTabbedChildFrame(doc
, view
, wx
.GetApp().GetTopWindow(), id, title
, pos
, size
, style
) 
1846     def CreateMDIDocumentFrame(self
, doc
, view
, id=-1, title
="", pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
): 
1848         Creates and returns an MDI Document Frame. 
1850         # if any child windows are maximized, then user must want any new children maximized 
1851         # if no children exist, then use the default value from registry 
1852         # wxBug:  Only current window is maximized, so need to check every child frame 
1853         parentFrame 
= wx
.GetApp().GetTopWindow() 
1854         childrenMaximized 
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
) and child
.IsMaximized(), parentFrame
.GetChildren()) 
1855         if childrenMaximized
: 
1858             children 
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), parentFrame
.GetChildren()) 
1860                 # other windows exist and none are maximized 
1863                 # get default setting from registry 
1864                 maximize 
= wx
.ConfigBase_Get().ReadInt("MDIChildFrameMaximized", False) 
1866         frame 
= wx
.lib
.docview
.DocMDIChildFrame(doc
, view
, wx
.GetApp().GetTopWindow(), id, title
, pos
, size
, style
) 
1867         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 
1868             frame
.Maximize(True) 
1870 ##        wx.EVT_MAXIMIZE(frame, self.OnMaximize) # wxBug: This doesn't work, need to save MDIChildFrameMaximized state on close of windows instead 
1871         wx
.EVT_CLOSE(frame
, self
.OnCloseChildWindow
) 
1872         if not self
._registeredCloseEvent
: 
1873             wx
.EVT_CLOSE(parentFrame
, self
.OnCloseMainWindow
) # need to check on this, but only once 
1874             self
._registeredCloseEvent 
= True 
1879     def SaveMDIDocumentFrameMaximizedState(self
, maximized
): 
1881         Remember in the config whether the MDI Frame is maximized so that it can be restored 
1884         config 
= wx
.ConfigBase_Get() 
1885         maximizeFlag 
= config
.ReadInt("MDIChildFrameMaximized", False) 
1886         if maximized 
!= maximizeFlag
: 
1887             config
.WriteInt("MDIChildFrameMaximized", maximized
) 
1890     def OnCloseChildWindow(self
, event
): 
1892         Called when an MDI Child Frame is closed.  Calls SaveMDIDocumentFrameMaximizedState to 
1893         remember whether the MDI Frame is maximized so that it can be restored on open. 
1895         self
.SaveMDIDocumentFrameMaximizedState(event
.GetEventObject().IsMaximized()) 
1899     def OnCloseMainWindow(self
, event
): 
1901         Called when the MDI Parent Frame is closed.  Remembers whether the MDI Parent Frame is 
1904         children 
= event
.GetEventObject().GetChildren() 
1905         childrenMaximized 
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
)and child
.IsMaximized(), children
) 
1906         if childrenMaximized
: 
1907             self
.SaveMDIDocumentFrameMaximizedState(True) 
1909             childrenNotMaximized 
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), children
) 
1911             if childrenNotMaximized
: 
1912                 # other windows exist and none are maximized 
1913                 self
.SaveMDIDocumentFrameMaximizedState(False) 
1918     def GetDefaultIcon(self
): 
1920         Returns the application's default icon. 
1922         return self
._defaultIcon
 
1925     def SetDefaultIcon(self
, icon
): 
1927         Sets the application's default icon. 
1929         self
._defaultIcon 
= icon
 
1934         Returns True if the application is in debug mode. 
1939     def SetDebug(self
, debug
): 
1941         Sets the application's debug mode. 
1946     def GetSingleInstance(self
): 
1948         Returns True if the application is in single instance mode.  Used to determine if multiple instances of the application is allowed to launch. 
1950         return self
._singleInstance
 
1953     def SetSingleInstance(self
, singleInstance
): 
1955         Sets application's single instance mode. 
1957         self
._singleInstance 
= singleInstance
 
1961     def CreateChildDocument(self
, parentDocument
, documentType
, objectToEdit
, path
=''): 
1963         Creates a child window of a document that edits an object.  The child window 
1964         is managed by the parent document frame, so it will be prompted to close if its 
1965         parent is closed, etc.  Child Documents are useful when there are complicated  
1966         Views of a Document and users will need to tunnel into the View. 
1968         for document 
in self
.GetDocumentManager().GetDocuments()[:]:  # Cloning list to make sure we go through all docs even as they are deleted 
1969             if isinstance(document
, ChildDocument
) and document
.GetParentDocument() == parentDocument
: 
1970                 if document
.GetData() == objectToEdit
: 
1971                     if hasattr(document
.GetFirstView().GetFrame(), "SetFocus"): 
1972                         document
.GetFirstView().GetFrame().SetFocus() 
1974         for temp 
in wx
.GetApp().GetDocumentManager().GetTemplates(): 
1975             if temp
.GetDocumentType() == documentType
: 
1978         newDoc 
= temp
.CreateDocument(path
, 0, data 
= objectToEdit
, parentDocument 
= parentDocument
) 
1979         newDoc
.SetDocumentName(temp
.GetDocumentName()) 
1980         newDoc
.SetDocumentTemplate(temp
) 
1982             newDoc
.OnNewDocument() 
1984             if not newDoc
.OnOpenDocument(path
): 
1985                 newDoc
.DeleteAllViews()  # Implicitly deleted by DeleteAllViews 
1990     def CloseChildDocuments(self
, parentDocument
): 
1992         Closes the child windows of a Document. 
1994         for document 
in self
.GetDocumentManager().GetDocuments()[:]:  # Cloning list to make sure we go through all docs even as they are deleted 
1995             if isinstance(document
, ChildDocument
) and document
.GetParentDocument() == parentDocument
: 
1996                 if document
.GetFirstView().GetFrame(): 
1997                     document
.GetFirstView().GetFrame().SetFocus() 
1998                 if not document
.GetFirstView().OnClose(): 
2005         Returns True if the application is in MDI mode. 
2007         return self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_MDI
 
2012         Returns True if the application is in SDI mode. 
2014         return self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
 
2017     def ShowSplash(self
, image
): 
2019         Shows a splash window with the given image.  Input parameter 'image' can either be a wx.Bitmap or a filename. 
2021         if isinstance(image
, wx
.Bitmap
): 
2024             splash_bmp 
= wx
.Image(image
).ConvertToBitmap() 
2025         self
._splash 
= wx
.SplashScreen(splash_bmp
,wx
.SPLASH_CENTRE_ON_SCREEN | wx
.SPLASH_NO_TIMEOUT
,0, None, -1)  
2029     def CloseSplash(self
): 
2031         Closes the splash window. 
2034             self
._splash
.Close(True) 
2037 class _DocFrameFileDropTarget(wx
.FileDropTarget
): 
2039     Class used to handle drops into the document frame. 
2042     def __init__(self
, docManager
, docFrame
): 
2044         Initializes the FileDropTarget class with the active docManager and the docFrame. 
2046         wx
.FileDropTarget
.__init
__(self
) 
2047         self
._docManager 
= docManager
 
2048         self
._docFrame 
= docFrame
 
2051     def OnDropFiles(self
, x
, y
, filenames
): 
2053         Called when files are dropped in the drop target and tells the docManager to open 
2057             for file in filenames
: 
2058                 self
._docManager
.CreateDocument(file, wx
.lib
.docview
.DOC_SILENT
) 
2060             msgTitle 
= wx
.GetApp().GetAppName() 
2062                 msgTitle 
= _("File Error") 
2063             wx
.MessageBox("Could not open '%s'.  '%s'" % (docview
.FileNameFromPath(file), sys
.exc_value
), 
2065                           wx
.OK | wx
.ICON_EXCLAMATION
, 
2066                           self
._docManager
.FindSuitableParent()) 
2069 class DocMDIParentFrame(wx
.lib
.docview
.DocMDIParentFrame
, DocFrameMixIn
, DocMDIParentFrameMixIn
): 
2071     The DocMDIParentFrame is the primary frame which the DocApp uses to host MDI child windows.  It offers 
2072     features such as a default menubar, toolbar, and status bar, and a mechanism to manage embedded windows 
2073     on the edges of the DocMDIParentFrame. 
2077     def __init__(self
, docManager
, parent
, id, title
, pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
, name
="DocMDIFrame", embeddedWindows
=0): 
2079         Initializes the DocMDIParentFrame with the default menubar, toolbar, and status bar.  Use the 
2080         optional embeddedWindows parameter with the embedded window constants to create embedded 
2081         windows around the edges of the DocMDIParentFrame. 
2083         pos
, size 
= self
._GetPosSizeFromConfig
(pos
, size
) 
2084         wx
.lib
.docview
.DocMDIParentFrame
.__init
__(self
, docManager
, parent
, id, title
, pos
, size
, style
, name
) 
2085         self
._InitFrame
(embeddedWindows
) 
2088     def _LayoutFrame(self
): 
2092         wx
.LayoutAlgorithm().LayoutMDIFrame(self
) 
2093         self
.GetClientWindow().Refresh() 
2096     def ProcessEvent(self
, event
): 
2098         Processes an event, searching event tables and calling zero or more 
2099         suitable event handler function(s).  Note that the ProcessEvent 
2100         method is called from the wxPython docview framework directly since 
2101         wxPython does not have a virtual ProcessEvent function. 
2103         if wx
.GetApp().ProcessEventBeforeWindows(event
): 
2105         if wx
.lib
.docview
.DocMDIParentFrame
.ProcessEvent(self
, event
): 
2107         return DocMDIParentFrameMixIn
.ProcessEvent(self
, event
) 
2110     def ProcessUpdateUIEvent(self
, event
): 
2112         Processes a UI event, searching event tables and calling zero or more 
2113         suitable event handler function(s).  Note that the ProcessEvent 
2114         method is called from the wxPython docview framework directly since 
2115         wxPython does not have a virtual ProcessEvent function. 
2117         if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
): 
2119         if wx
.lib
.docview
.DocMDIParentFrame
.ProcessUpdateUIEvent(self
, event
):  # Let the views handle the event before the services 
2121         if event
.GetId() == wx
.ID_ABOUT
:  # Using ID_ABOUT to update the window menu, the window menu items are not triggering 
2122             self
.UpdateWindowMenu() 
2124         return DocMDIParentFrameMixIn
.ProcessUpdateUIEvent(self
, event
) 
2127     def UpdateWindowMenu(self
): 
2129         Updates the WindowMenu on Windows platforms. 
2131         if wx
.Platform 
== '__WXMSW__': 
2132             children 
= filter(lambda child
: isinstance(child
, wx
.MDIChildFrame
), self
.GetChildren()) 
2133             windowCount 
= len(children
) 
2134             hasWindow 
= windowCount 
>= 1 
2135             has2OrMoreWindows 
= windowCount 
>= 2 
2137             windowMenu 
= self
.GetWindowMenu() 
2139                 windowMenu
.Enable(wx
.IDM_WINDOWTILE
, hasWindow
) 
2140                 windowMenu
.Enable(wx
.IDM_WINDOWTILEHOR
, hasWindow
) 
2141                 windowMenu
.Enable(wx
.IDM_WINDOWCASCADE
, hasWindow
) 
2142                 windowMenu
.Enable(wx
.IDM_WINDOWICONS
, hasWindow
) 
2143                 windowMenu
.Enable(wx
.IDM_WINDOWTILEVERT
, hasWindow
) 
2144                 wx
.IDM_WINDOWPREV 
= 4006  # wxBug: Not defined for some reason 
2145                 windowMenu
.Enable(wx
.IDM_WINDOWPREV
, has2OrMoreWindows
) 
2146                 windowMenu
.Enable(wx
.IDM_WINDOWNEXT
, has2OrMoreWindows
) 
2150     def OnSize(self
, event
): 
2152         Called when the DocMDIParentFrame is resized and lays out the MDI client window. 
2154         # Needed in case there are splitpanels around the mdi frame 
2158     def OnCloseWindow(self
, event
): 
2160         Called when the DocMDIParentFrame is closed.  Remembers the frame size. 
2162         self
.SaveEmbeddedWindowSizes() 
2164         # save and close services last. 
2165         for service 
in wx
.GetApp().GetServices(): 
2166             if not service
.OnCloseFrame(event
): 
2169         # save and close documents 
2170         # documents with a common view, e.g. project view, should save the document, but not close the window 
2171         # and let the service close the window. 
2172         wx
.lib
.docview
.DocMDIParentFrame
.OnCloseWindow(self
, event
) 
2175 class DocSDIFrame(wx
.lib
.docview
.DocChildFrame
, DocFrameMixIn
): 
2177     The DocSDIFrame host DocManager Document windows.  It offers features such as a default menubar, 
2178     toolbar, and status bar. 
2182     def __init__(self
, doc
, view
, parent
, id, title
, pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
, style
=wx
.DEFAULT_FRAME_STYLE
, name
="DocSDIFrame"): 
2184         Initializes the DocSDIFrame with the default menubar, toolbar, and status bar. 
2186         wx
.lib
.docview
.DocChildFrame
.__init
__(self
, doc
, view
, parent
, id, title
, pos
, size
, style
, name
) 
2187         self
._fileMenu 
= None 
2189             self
._docManager 
= doc
.GetDocumentManager() 
2191             self
._docManager 
= None 
2192         self
.SetDropTarget(_DocFrameFileDropTarget(self
._docManager
, self
)) 
2194         wx
.EVT_MENU(self
, wx
.ID_ABOUT
, self
.OnAbout
) 
2195         wx
.EVT_MENU(self
, wx
.ID_EXIT
, self
.OnExit
) 
2196         wx
.EVT_MENU_RANGE(self
, wx
.ID_FILE1
, wx
.ID_FILE9
, self
.OnMRUFile
) 
2198         self
.InitializePrintData() 
2200         menuBar 
= self
.CreateDefaultMenuBar(sdi
=True) 
2201         toolBar 
= self
.CreateDefaultToolBar() 
2202         self
.SetToolBar(toolBar
) 
2203         statusBar 
= self
.CreateDefaultStatusBar() 
2205         for service 
in wx
.GetApp().GetServices(): 
2206             service
.InstallControls(self
, menuBar 
= menuBar
, toolBar 
= toolBar
, statusBar 
= statusBar
, document 
= doc
) 
2208         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 
2211     def _LayoutFrame(self
): 
2218     def OnExit(self
, event
): 
2220         Called when the application is exitting. 
2222         if self
._childView
.GetDocumentManager().Clear(force 
= False): 
2228     def OnMRUFile(self
, event
): 
2230         Opens the appropriate file when it is selected from the file history 
2233         n 
= event
.GetId() - wx
.ID_FILE1
 
2234         filename 
= self
._docManager
.GetHistoryFile(n
) 
2236             self
._docManager
.CreateDocument(filename
, wx
.lib
.docview
.DOC_SILENT
) 
2238             self
._docManager
.RemoveFileFromHistory(n
) 
2239             msgTitle 
= wx
.GetApp().GetAppName() 
2241                 msgTitle 
= _("File Error") 
2242             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), 
2244                           wx
.OK | wx
.ICON_EXCLAMATION
, 
2248     def ProcessEvent(self
, event
): 
2250         Processes an event, searching event tables and calling zero or more 
2251         suitable event handler function(s).  Note that the ProcessEvent 
2252         method is called from the wxPython docview framework directly since 
2253         wxPython does not have a virtual ProcessEvent function. 
2255         if wx
.GetApp().ProcessEventBeforeWindows(event
): 
2258             self
._childView
.Activate(True) 
2261         if id == SAVEALL_ID
: 
2262             self
.OnFileSaveAll(event
) 
2265         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 
2268             return wx
.GetApp().ProcessEvent(event
) 
2271     def ProcessUpdateUIEvent(self
, event
): 
2273         Processes a UI event, searching event tables and calling zero or more 
2274         suitable event handler function(s).  Note that the ProcessEvent 
2275         method is called from the wxPython docview framework directly since 
2276         wxPython does not have a virtual ProcessEvent function. 
2278         if wx
.GetApp().ProcessUpdateUIEventBeforeWindows(event
): 
2281             if hasattr(self
._childView
, "GetDocumentManager"): 
2282                 docMgr 
= self
._childView
.GetDocumentManager() 
2284                     if docMgr
.GetCurrentDocument() != self
._childView
.GetDocument(): 
2286                     if docMgr
.ProcessUpdateUIEvent(event
):  # Let the views handle the event before the services 
2292         elif id == wx
.ID_COPY
: 
2295         elif id == wx
.ID_PASTE
: 
2298         elif id == wx
.ID_CLEAR
: 
2301         elif id == wx
.ID_SELECTALL
: 
2304         elif id == SAVEALL_ID
: 
2305             filesModified 
= False 
2306             docs 
= wx
.GetApp().GetDocumentManager().GetDocuments() 
2308                 if doc
.IsModified(): 
2309                     filesModified 
= True 
2312             event
.Enable(filesModified
) 
2315             return wx
.GetApp().ProcessUpdateUIEvent(event
) 
2318     def OnCloseWindow(self
, event
): 
2320         Called when the window is saved.  Enables services to help close the frame. 
2322         for service 
in wx
.GetApp().GetServices(): 
2323             service
.OnCloseFrame(event
) 
2324         wx
.lib
.docview
.DocChildFrame
.OnCloseWindow(self
, event
) 
2325         if self
._fileMenu 
and self
._docManager
: 
2326             self
._docManager
.FileHistoryRemoveMenu(self
._fileMenu
) 
2329 class AboutService(DocService
): 
2331     About Dialog Service that installs under the Help menu to show the properties of the current application. 
2334     def __init__(self
, aboutDialog
=None, image
=None): 
2336         Initializes the AboutService. 
2339             self
._dlg 
= aboutDialog
 
2342             self
._dlg 
= AboutDialog  
# use default AboutDialog 
2346     def ShowAbout(self
): 
2348         Show the AboutDialog 
2351             dlg 
= self
._dlg
(wx
.GetApp().GetTopWindow(), self
._image
) 
2353             dlg 
= self
._dlg
(wx
.GetApp().GetTopWindow()) 
2354         dlg
.CenterOnScreen() 
2359     def SetAboutDialog(self
, dlg
): 
2361         Customize the AboutDialog 
2366 class AboutDialog(wx
.Dialog
): 
2368     Opens an AboutDialog.  Shared by DocMDIParentFrame and DocSDIFrame. 
2371     def __init__(self
, parent
, image
=None): 
2373         Initializes the about dialog. 
2375         wx
.Dialog
.__init
__(self
, parent
, -1, _("About ") + wx
.GetApp().GetAppName(), style 
= wx
.DEFAULT_DIALOG_STYLE
) 
2377         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
2379             imageItem 
= wx
.StaticBitmap(self
, -1, image
.ConvertToBitmap(), (0,0), (image
.GetWidth(), image
.GetHeight())) 
2380             sizer
.Add(imageItem
, 0, wx
.ALIGN_CENTER|wx
.ALL
, 0) 
2381         sizer
.Add(wx
.StaticText(self
, -1, wx
.GetApp().GetAppName()), 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5) 
2383         btn 
= wx
.Button(self
, wx
.ID_OK
) 
2384         sizer
.Add(btn
, 0, wx
.ALIGN_CENTRE|wx
.ALL
, 5) 
2386         self
.SetSizer(sizer
) 
2387         self
.SetAutoLayout(True) 
2392 class FilePropertiesService(DocService
): 
2394     Service that installs under the File menu to show the properties of the file associated 
2395     with the current document. 
2398     PROPERTIES_ID 
= wx
.NewId() 
2403         Initializes the PropertyService. 
2405         self
._customEventHandlers 
= [] 
2408     def InstallControls(self
, frame
, menuBar
=None, toolBar
=None, statusBar
=None, document
=None): 
2410         Installs a File/Properties menu item. 
2412         fileMenu 
= menuBar
.GetMenu(menuBar
.FindMenu(_("&File"))) 
2413         exitMenuItemPos 
= self
.GetMenuItemPos(fileMenu
, wx
.ID_EXIT
) 
2414         fileMenu
.InsertSeparator(exitMenuItemPos
) 
2415         fileMenu
.Insert(exitMenuItemPos
, FilePropertiesService
.PROPERTIES_ID
, _("&Properties"), _("Show file properties")) 
2416         wx
.EVT_MENU(frame
, FilePropertiesService
.PROPERTIES_ID
, self
.ProcessEvent
) 
2417         wx
.EVT_UPDATE_UI(frame
, FilePropertiesService
.PROPERTIES_ID
, self
.ProcessUpdateUIEvent
) 
2420     def ProcessEvent(self
, event
): 
2422         Detects when the File/Properties menu item is selected. 
2425         if id == FilePropertiesService
.PROPERTIES_ID
: 
2426             for eventHandler 
in self
._customEventHandlers
: 
2427                 if eventHandler
.ProcessEvent(event
): 
2430             self
.ShowPropertiesDialog() 
2436     def ProcessUpdateUIEvent(self
, event
): 
2438         Updates the File/Properties menu item. 
2441         if id == FilePropertiesService
.PROPERTIES_ID
: 
2442             for eventHandler 
in self
._customEventHandlers
: 
2443                 if eventHandler
.ProcessUpdateUIEvent(event
): 
2446             event
.Enable(wx
.GetApp().GetDocumentManager().GetCurrentDocument() != None) 
2452     def ShowPropertiesDialog(self
, filename
=None): 
2454         Shows the PropertiesDialog for the specified file. 
2457             filename 
= wx
.GetApp().GetDocumentManager().GetCurrentDocument().GetFilename() 
2459         filePropertiesDialog 
= FilePropertiesDialog(wx
.GetApp().GetTopWindow(), filename
) 
2460         if filePropertiesDialog
.ShowModal() == wx
.ID_OK
: 
2462         filePropertiesDialog
.Destroy() 
2465     def GetCustomEventHandlers(self
): 
2467         Returns the custom event handlers for the PropertyService. 
2469         return self
._customEventHandlers
 
2472     def AddCustomEventHandler(self
, handler
): 
2474         Adds a custom event handlers for the PropertyService.  A custom event handler enables 
2475         a different dialog to be provided for a particular file. 
2477         self
._customEventHandlers
.append(handler
) 
2480     def RemoveCustomEventHandler(self
, handler
): 
2482         Removes a custom event handler from the PropertyService. 
2484         self
._customEventHandlers
.remove(handler
) 
2487     def chopPath(self
, text
, length
=36): 
2489         Simple version of textwrap.  textwrap.fill() unfortunately chops lines at spaces 
2490         and creates odd word boundaries.  Instead, we will chop the path without regard to 
2491         spaces, but pay attention to path delimiters. 
2497         while start 
< textLen
: 
2498             end 
= start 
+ length
 
2502             # see if we can find a delimiter to chop the path 
2504                 lastSep 
= text
.rfind(os
.sep
, start
, end 
+ 1) 
2505                 if lastSep 
!= -1 and lastSep 
!= start
: 
2509                 chopped 
= chopped 
+ '\n' + text
[start
:end
] 
2511                 chopped 
= text
[start
:end
] 
2518 class FilePropertiesDialog(wx
.Dialog
): 
2520     Dialog that shows the properties of a file.  Invoked by the PropertiesService. 
2524     def __init__(self
, parent
, filename
): 
2526         Initializes the properties dialog. 
2528         wx
.Dialog
.__init
__(self
, parent
, -1, _("File Properties"), size
=(310, 330)) 
2533         filePropertiesService 
= wx
.GetApp().GetService(FilePropertiesService
) 
2535         fileExists 
= os
.path
.exists(filename
) 
2537         notebook 
= wx
.Notebook(self
, -1) 
2538         tab 
= wx
.Panel(notebook
, -1) 
2540         gridSizer 
= RowColSizer() 
2542         gridSizer
.Add(wx
.StaticText(tab
, -1, _("Filename:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=0, col
=0) 
2543         gridSizer
.Add(wx
.StaticText(tab
, -1, os
.path
.basename(filename
)), row
=0, col
=1) 
2545         gridSizer
.Add(wx
.StaticText(tab
, -1, _("Location:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=1, col
=0) 
2546         gridSizer
.Add(wx
.StaticText(tab
, -1, filePropertiesService
.chopPath(os
.path
.dirname(filename
))), flag
=wx
.BOTTOM
, border
=SPACE
, row
=1, col
=1) 
2548         gridSizer
.Add(wx
.StaticText(tab
, -1, _("Size:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=2, col
=0) 
2550             gridSizer
.Add(wx
.StaticText(tab
, -1, str(os
.path
.getsize(filename
)) + ' ' + _("bytes")), row
=2, col
=1) 
2552         lineSizer 
= wx
.BoxSizer(wx
.VERTICAL
)    # let the line expand horizontally without vertical expansion 
2553         lineSizer
.Add(wx
.StaticLine(tab
, -1, size 
= (10,-1)), 0, wx
.EXPAND
) 
2554         gridSizer
.Add(lineSizer
, flag
=wx
.EXPAND|wx
.ALIGN_CENTER_VERTICAL|wx
.TOP
, border
=HALF_SPACE
, row
=3, col
=0, colspan
=2) 
2556         gridSizer
.Add(wx
.StaticText(tab
, -1, _("Created:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=4, col
=0) 
2558             gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getctime(filename
))), row
=4, col
=1) 
2560         gridSizer
.Add(wx
.StaticText(tab
, -1, _("Modified:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=5, col
=0) 
2562             gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getmtime(filename
))), row
=5, col
=1) 
2564         gridSizer
.Add(wx
.StaticText(tab
, -1, _("Accessed:")), flag
=wx
.RIGHT
, border
=HALF_SPACE
, row
=6, col
=0) 
2566             gridSizer
.Add(wx
.StaticText(tab
, -1, time
.ctime(os
.path
.getatime(filename
))), row
=6, col
=1) 
2568         # add a border around the inside of the tab 
2569         spacerGrid 
= wx
.BoxSizer(wx
.VERTICAL
) 
2570         spacerGrid
.Add(gridSizer
, 0, wx
.ALL
, SPACE
); 
2571         tab
.SetSizer(spacerGrid
) 
2572         notebook
.AddPage(tab
, _("General")) 
2574         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
2575         sizer
.Add(notebook
, 0, wx
.ALL | wx
.EXPAND
, SPACE
) 
2576         sizer
.Add(self
.CreateButtonSizer(wx
.OK
), 0, wx
.ALIGN_RIGHT | wx
.RIGHT | wx
.BOTTOM
, HALF_SPACE
) 
2579         self
.SetDimensions(-1, -1, 310, -1, wx
.SIZE_USE_EXISTING
) 
2580         self
.SetSizer(sizer
) 
2584 class ChildDocument(wx
.lib
.docview
.Document
): 
2586     A ChildDocument is a document that represents a portion of a Document.  The child 
2587     document is managed by the parent document, so it will be prompted to close if its 
2588     parent is closed, etc.  Child Documents are useful when there are complicated  
2589     Views of a Document and users will need to tunnel into the View. 
2595         Returns the data that the ChildDocument contains. 
2600     def SetData(self
, data
): 
2602         Sets the data that the ChildDocument contains. 
2607     def GetParentDocument(self
): 
2609         Returns the parent Document of the ChildDocument. 
2611         return self
._parentDocument
 
2614     def SetParentDocument(self
, parentDocument
): 
2616         Sets the parent Document of the ChildDocument. 
2618         self
._parentDocument 
= parentDocument
 
2621     def OnSaveDocument(self
, filename
): 
2623         Called when the ChildDocument is saved and does the minimum such that the 
2624         ChildDocument looks like a real Document to the framework. 
2626         self
.SetFilename(filename
, True) 
2628         self
.SetDocumentSaved(True) 
2632     def OnOpenDocument(self
, filename
): 
2634         Called when the ChildDocument is opened and does the minimum such that the 
2635         ChildDocument looks like a real Document to the framework. 
2637         self
.SetFilename(filename
, True) 
2639         self
.SetDocumentSaved(True) 
2640         self
.UpdateAllViews() 
2646         Called when the ChildDocument is saved and does the minimum such that the 
2647         ChildDocument looks like a real Document to the framework. 
2649         return self
.OnSaveDocument(self
._documentFile
) 
2654         Called when the ChildDocument is saved and does the minimum such that the 
2655         ChildDocument looks like a real Document to the framework. 
2657         return self
.OnSaveDocument(self
._documentFile
)         
2660 class ChildDocTemplate(wx
.lib
.docview
.DocTemplate
): 
2662     A ChildDocTemplate is a DocTemplate subclass that enables the creation of ChildDocuments 
2663     that represents a portion of a Document.  The child document is managed by the parent document, 
2664     so it will be prompted to close if its parent is closed, etc.  Child Documents are useful 
2665     when there are complicated  Views of a Document and users will need to tunnel into the View. 
2669     def __init__(self
, manager
, description
, filter, dir, ext
, docTypeName
, viewTypeName
, docType
, viewType
, flags
=wx
.lib
.docview
.TEMPLATE_INVISIBLE
, icon
=None): 
2671         Initializes the ChildDocTemplate. 
2673         wx
.lib
.docview
.DocTemplate
.__init
__(self
, manager
, description
, filter, dir, ext
, docTypeName
, viewTypeName
, docType
, viewType
, flags
=flags
, icon
=icon
) 
2676     def CreateDocument(self
, path
, flags
, data
=None, parentDocument
=None): 
2678         Called when a ChildDocument is to be created and does the minimum such that the 
2679         ChildDocument looks like a real Document to the framework. 
2681         doc 
= self
._docType
() 
2682         doc
.SetFilename(path
) 
2684         doc
.SetParentDocument(parentDocument
) 
2685         doc
.SetDocumentTemplate(self
) 
2686         self
.GetDocumentManager().AddDocument(doc
) 
2687         doc
.SetCommandProcessor(doc
.OnCreateCommandProcessor()) 
2688         if doc
.OnCreate(path
, flags
): 
2691             if doc 
in self
.GetDocumentManager().GetDocuments(): 
2692                 doc
.DeleteAllViews() 
2696 class WindowMenuService(DocService
): 
2698     The WindowMenuService is a service that implements a standard Window menu that is used 
2699     by the DocSDIFrame.  The MDIFrame automatically includes a Window menu and does not use 
2700     the WindowMenuService. 
2706         Initializes the WindowMenu and its globals. 
2708         self
.ARRANGE_WINDOWS_ID 
= wx
.NewId() 
2709         self
.SELECT_WINDOW_1_ID 
= wx
.NewId() 
2710         self
.SELECT_WINDOW_2_ID 
= wx
.NewId() 
2711         self
.SELECT_WINDOW_3_ID 
= wx
.NewId() 
2712         self
.SELECT_WINDOW_4_ID 
= wx
.NewId() 
2713         self
.SELECT_WINDOW_5_ID 
= wx
.NewId() 
2714         self
.SELECT_WINDOW_6_ID 
= wx
.NewId() 
2715         self
.SELECT_WINDOW_7_ID 
= wx
.NewId() 
2716         self
.SELECT_WINDOW_8_ID 
= wx
.NewId() 
2717         self
.SELECT_WINDOW_9_ID 
= wx
.NewId() 
2718         self
.SELECT_MORE_WINDOWS_ID 
= wx
.NewId() 
2721     def InstallControls(self
, frame
, menuBar
=None, toolBar
=None, statusBar
=None, document
=None): 
2723         Installs the Window menu. 
2726         if not self
.GetDocumentManager().GetFlags() & wx
.lib
.docview
.DOC_SDI
: 
2727             return  # Only need windows menu for SDI mode, MDI frame automatically creates one 
2729         if not _WINDOWS
:  # Arrange All and window navigation doesn't work on Linux 
2732         windowMenu 
= wx
.Menu() 
2733         item 
= windowMenu
.Append(self
.ARRANGE_WINDOWS_ID
, _("&Arrange All"), _("Arrange the open windows")) 
2734         windowMenu
.AppendSeparator() 
2736         wx
.EVT_MENU(frame
, self
.ARRANGE_WINDOWS_ID
, frame
.ProcessEvent
) 
2737         wx
.EVT_UPDATE_UI(frame
, self
.ARRANGE_WINDOWS_ID
, frame
.ProcessUpdateUIEvent
) 
2738         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_1_ID
, frame
.ProcessEvent
)  # wxNewId may have been nonsequential, so can't use EVT_MENU_RANGE 
2739         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_2_ID
, frame
.ProcessEvent
) 
2740         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_3_ID
, frame
.ProcessEvent
) 
2741         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_4_ID
, frame
.ProcessEvent
) 
2742         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_5_ID
, frame
.ProcessEvent
) 
2743         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_6_ID
, frame
.ProcessEvent
) 
2744         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_7_ID
, frame
.ProcessEvent
) 
2745         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_8_ID
, frame
.ProcessEvent
) 
2746         wx
.EVT_MENU(frame
, self
.SELECT_WINDOW_9_ID
, frame
.ProcessEvent
) 
2747         wx
.EVT_MENU(frame
, self
.SELECT_MORE_WINDOWS_ID
, frame
.ProcessEvent
) 
2749         helpMenuIndex 
= menuBar
.FindMenu(_("&Help")) 
2750         menuBar
.Insert(helpMenuIndex
, windowMenu
, _("&Window")) 
2752         self
._lastFrameUpdated 
= None 
2755     def ProcessEvent(self
, event
): 
2757         Processes a Window menu event. 
2760         if id == self
.ARRANGE_WINDOWS_ID
: 
2761             self
.OnArrangeWindows(event
) 
2763         elif id == self
.SELECT_MORE_WINDOWS_ID
: 
2764             self
.OnSelectMoreWindows(event
) 
2766         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
: 
2767             self
.OnSelectWindowMenu(event
) 
2773     def ProcessUpdateUIEvent(self
, event
): 
2775         Updates the Window menu items. 
2778         if id == self
.ARRANGE_WINDOWS_ID
: 
2779             frame 
= event
.GetEventObject() 
2780             if not self
._lastFrameUpdated 
or self
._lastFrameUpdated 
!= frame
: 
2781                 self
.BuildWindowMenu(frame
)  # It's a new frame, so update the windows menu... this is as if the View::OnActivateMethod had been invoked 
2782                 self
._lastFrameUpdated 
= frame
 
2788     def BuildWindowMenu(self
, currentFrame
): 
2790         Builds the Window menu and adds menu items for all of the open documents in the DocManager. 
2792         windowMenuIndex 
= currentFrame
.GetMenuBar().FindMenu(_("&Window")) 
2793         windowMenu 
= currentFrame
.GetMenuBar().GetMenu(windowMenuIndex
) 
2794         ids 
= self
._GetWindowMenuIDList
() 
2795         frames 
= self
._GetWindowMenuFrameList
(currentFrame
) 
2796         max = WINDOW_MENU_NUM_ITEMS
 
2797         if max > len(frames
): 
2800         for i 
in range(0, max): 
2802             item 
= windowMenu
.FindItemById(ids
[i
]) 
2803             label 
= '&' + str(i 
+ 1) + ' ' + frame
.GetTitle() 
2805                 item 
= windowMenu
.AppendCheckItem(ids
[i
], label
) 
2807                 windowMenu
.SetLabel(ids
[i
], label
) 
2808             windowMenu
.Check(ids
[i
], (frame 
== currentFrame
)) 
2809         if len(frames
) > WINDOW_MENU_NUM_ITEMS
:  # Add the more items item 
2810             if not windowMenu
.FindItemById(self
.SELECT_MORE_WINDOWS_ID
): 
2811                 windowMenu
.Append(self
.SELECT_MORE_WINDOWS_ID
, _("&More Windows...")) 
2812         else:  # Remove any extra items 
2813             if windowMenu
.FindItemById(self
.SELECT_MORE_WINDOWS_ID
): 
2814                 windowMenu
.Remove(self
.SELECT_MORE_WINDOWS_ID
) 
2818             for j 
in range(i 
+ 1, WINDOW_MENU_NUM_ITEMS
): 
2819                 if windowMenu
.FindItemById(ids
[j
]): 
2820                     windowMenu
.Remove(ids
[j
]) 
2823     def _GetWindowMenuIDList(self
): 
2825         Returns a list of the Window menu item IDs. 
2827         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
] 
2830     def _GetWindowMenuFrameList(self
, currentFrame
=None): 
2832         Returns the Frame associated with each menu item in the Window menu. 
2835         # get list of windows for documents 
2836         for doc 
in self
._docManager
.GetDocuments(): 
2837             for view 
in doc
.GetViews(): 
2838                 frame 
= view
.GetFrame() 
2839                 if frame 
not in frameList
: 
2840                     if frame 
== currentFrame 
and len(frameList
) >= WINDOW_MENU_NUM_ITEMS
: 
2841                         frameList
.insert(WINDOW_MENU_NUM_ITEMS 
- 1, frame
) 
2843                         frameList
.append(frame
) 
2844         # get list of windows for general services 
2845         for service 
in wx
.GetApp().GetServices(): 
2846             view 
= service
.GetView() 
2848                 frame 
= view
.GetFrame() 
2849                 if frame 
not in frameList
: 
2850                     if frame 
== currentFrame 
and len(frameList
) >= WINDOW_MENU_NUM_ITEMS
: 
2851                         frameList
.insert(WINDOW_MENU_NUM_ITEMS 
- 1, frame
) 
2853                         frameList
.append(frame
) 
2858     def OnArrangeWindows(self
, event
): 
2860         Called by Window/Arrange and tiles the frames on the desktop. 
2862         currentFrame 
= event
.GetEventObject() 
2864         tempFrame 
= wx
.Frame(None, -1, "", pos 
= wx
.DefaultPosition
, size 
= wx
.DefaultSize
) 
2865         sizex 
= tempFrame
.GetSize()[0] 
2866         sizey 
= tempFrame
.GetSize()[1] 
2872         frames 
= self
._GetWindowMenuFrameList
() 
2873         frames
.remove(currentFrame
) 
2874         frames
.append(currentFrame
) # Make the current frame the last frame so that it is the last one to appear 
2875         for frame 
in frames
: 
2877                 delta 
= frame
.GetClientAreaOrigin()[1] 
2878             frame
.SetPosition((posx
, posy
)) 
2879             frame
.SetSize((sizex
, sizey
)) 
2880             # TODO: Need to loop around if posx + delta + size > displaysize 
2884             if posx 
+ sizex 
> wx
.DisplaySize()[0] or posy 
+ sizey 
> wx
.DisplaySize()[1]: 
2887         currentFrame
.SetFocus() 
2890     def OnSelectWindowMenu(self
, event
): 
2892         Called when the Window menu item representing a Frame is selected and brings the selected 
2893         Frame to the front of the desktop. 
2896         index 
= self
._GetWindowMenuIDList
().index(id) 
2898             currentFrame 
= event
.GetEventObject() 
2899             frame 
= self
._GetWindowMenuFrameList
(currentFrame
)[index
] 
2901                 wx
.CallAfter(frame
.Raise
) 
2904     def OnSelectMoreWindows(self
, event
): 
2906         Called when the "Window/Select More Windows..." menu item is selected and enables user to 
2907         select from the Frames that do not in the Window list.  Useful when there are more than 
2908         10 open frames in the application. 
2910         frames 
= self
._GetWindowMenuFrameList
()  # TODO - make the current window the first one 
2911         strings 
= map(lambda frame
: frame
.GetTitle(), frames
) 
2912         # Should preselect the current window, but not supported by wx.GetSingleChoice 
2913         res 
= wx
.GetSingleChoiceIndex(_("Select a window to show:"), 
2919         frames
[res
].SetFocus() 
2922 #---------------------------------------------------------------------------- 
2923 # File generated by encode_bitmaps.py 
2924 #---------------------------------------------------------------------------- 
2925 from wx 
import ImageFromStream
, BitmapFromImage
 
2928 #---------------------------------------------------------------------- 
2931 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
2932 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
2933 \x00\x00[IDAT8\x8d\xed\x93\xb1\n\x001\x08C\x13{\xff\xff\xc7mn\xb8El\x91\x16\ 
2934 \x97\x0e\x97M\x90\x97\x88JZCE\x8f/4\xba\xb2fZc\n\x00\x00i\xcd \t\x8d\xae\x08\ 
2935 \xb1\xad\x9c\x0e\x1eS\x1e\x01\xc8\xcf\xdcC\xa6\x112\xf7\x08:N\xb0\xd2\x0f\ 
2936 \xb8\x010\xdd\x81\xdf\xf1\x8eX\xfd\xc6\xf2\x08/D\xbd\x19(\xc8\xa5\xd9\xfa\ 
2937 \x00\x00\x00\x00IEND\xaeB`\x82'  
2940     return BitmapFromImage(getNewImage()) 
2943     stream 
= cStringIO
.StringIO(getNewData()) 
2944     return ImageFromStream(stream
) 
2946 #---------------------------------------------------------------------- 
2949 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
2950 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
2951 \x00\x00\x95IDAT8\x8d\xa5\x92\xc1\x12\x03!\x08C\x13\xec\x87\xfb\xe3B\x0f.]\ 
2952 \xb0\x8e[m.\xea\x0c/\x06\x06R\n\xfe\xd1\xeb\xd7B\xd5f~\x17)\xdc2Pm\x16!\x7f\ 
2953 \xab6\xe3i\x0b\x9e\xe8\x93\xc0BD\x86\xdfV0\x00\x90R`\xda\xcc\x0c\x00\x0c\x00\ 
2954 \xc1\x05>\x9a\x87\x19t\x180\x981\xbd\xfd\xe4\xc4Y\x82\xf7\x14\xca\xe7\xb7\ 
2955 \xa6\t\xee6\x1c\xba\xe18\xab\xc1 \xc3\xb5N?L\xaa5\xb5\xd0\x8dw`JaJ\xb0\x0b\ 
2956 \x03!\xc1\t\xdc\xb9k\x0f\x9e\xd1\x0b\x18\xf6\xe0x\x95]\xf2\\\xb2\xd6\x1b}\ 
2957 \x14BL\xb9{t\xc7\x00\x00\x00\x00IEND\xaeB`\x82'  
2959 def getOpenBitmap(): 
2960     return BitmapFromImage(getOpenImage()) 
2963     stream 
= cStringIO
.StringIO(getOpenData()) 
2964     return ImageFromStream(stream
) 
2966 #---------------------------------------------------------------------- 
2969 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
2970 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
2971 \x00\x00\x9fIDAT8\x8d\xa5\x93\xdb\x0e\x830\x0cC\xed\x84\xdfF\xeb\xb4\xef\xa6\ 
2972 \xde\x030z\t\x94\tK\x91z\xcb\x01\xbb*i\x8e\'\x9a\x00@yQ\xb4Is\x8e\x00\xb6\ 
2973 \x0f$Uu\x05\x0e\x01\x91$\r!\xa49\x94\x17I\x02\xc9_\xe3:Nq\x93}XL|\xeb\xe9\ 
2974 \x05\xa4p\rH\xa29h^[ Y\xd5\xb9\xb5\x17\x94gu\x19DA\x96\xe0c\xfe^\xcf\xe7Y\ 
2975 \x95\x05\x00M\xf5\x16Z;\x7f\xfdAd\xcf\xee\x1cj\xc1%|\xdan"LL\x19\xda\xe1}\ 
2976 \x90:\x00#\x95_l5\x04\xec\x89\x9f\xef?|\x8d\x97o\xe1\x8e\xbeJ\xfc\xb1\xde\ 
2977 \xea\xf8\xb9\xc4\x00\x00\x00\x00IEND\xaeB`\x82'  
2979 def getCopyBitmap(): 
2980     return BitmapFromImage(getCopyImage()) 
2983     stream 
= cStringIO
.StringIO(getCopyData()) 
2984     return ImageFromStream(stream
) 
2986 #---------------------------------------------------------------------- 
2989 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
2990 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
2991 \x00\x00\xa1IDAT8\x8d\xa5\x93\xd9\x0e\xc3 \x0c\x04\xc7\xa6\xbf]\xc5U\xbf\xbb\ 
2992 \xd9>$4\\9\xaa\xacd\t\x0c\x1e/H6\xf3\xc4\x1d=FI\xcd\x1f\x95{\xf3d{\x003O]\ 
2993 \x01\x80\x94/\x0c\x8a\n\xa0\x01\x8a\x88\xdfaD m\x85y\xdd\xde\xc9\x10/\xc9\ 
2994 \xf9\xc0S2\xf3%\xf2\xba\x04\x94\xea\xfe`\xf4\x9c#U\x80\xbd.\x97\x015\xec&\ 
2995 \x00@\x9a\xba\x9c\xd9\x0b\x08\xe0\r4\x9fxU\xd2\x84\xe6\xa7N\x1dl\x1dkGe\xee\ 
2996 \x14\xd0>\xa3\x85\xfc\xe5`\x08]\x87I}\x84\x8e\x04!\xf3\xb48\x18\r\x8bf4\xea\ 
2997 \xde;\xbc9\xce_!\\\\T\xf75'\xd6\x00\x00\x00\x00IEND\xaeB`\x82"  
2999 def getPasteBitmap(): 
3000     return BitmapFromImage(getPasteImage()) 
3002 def getPasteImage(): 
3003     stream 
= cStringIO
.StringIO(getPasteData()) 
3004     return ImageFromStream(stream
) 
3006 #---------------------------------------------------------------------- 
3009 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
3010 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
3011 \x00\x00lIDAT8\x8d\xc5\x93\xe1\n\xc0 \x08\x84=\xed\xc1}\xf1\xcd\xfd\x18B\x98\ 
3012 mX\x83\x1d\x04\x11\xfayV\x02,\xb4#\xde\xca&\xa2\xe6\x1b;\x0f\xab$\x82\x05\ 
3013 \x83\x03U\xbdaf\xe9\xea\x13]\xe5\x16\xa2\xd32\xc0].\x03\xa2Z<PU\x02\x90\xc5\ 
3014 \x0e\xd5S\xc0,p\xa6\xef[xs\xb0t\x89`A|\xff\x12\xe0\x11\xde\x0fS\xe5;\xbb#\ 
3015 \xfc>\x8d\x17\x18\xfd(\xb72\xc2\x06\x00\x00\x00\x00\x00IEND\xaeB`\x82'  
3017 def getSaveBitmap(): 
3018     return BitmapFromImage(getSaveImage()) 
3021     stream 
= cStringIO
.StringIO(getSaveData()) 
3022     return ImageFromStream(stream
) 
3024 #---------------------------------------------------------------------- 
3025 def getSaveAllData(): 
3027 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
3028 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
3029 \x00\x01\tIDAT8\x8d\xa5\x93\xe1m\x830\x10\x85\xdfA\xd7H\x827\xf0\x02\xado\ 
3030 \x04\x8f`Fh\xfb\xb7\xad\xcd&$Y\x80\x11\xcc\x06\x8c\xe0E\xd2\xeb\x8f\x16\x04!\ 
3031 8R\xf3\xa4\x93Nw\xd2\xf3\xa7g\x9b\xa8(\xf1\x88\x9er\xcb\xc3~\')%x\xef\xa7Y\ 
3032 \x8c\x11J)\x00\xc0\xf1t&PQn\x163\x0b\x00\x99\xcb{/\x00\xc49\'T\x94(\xfe\x83\ 
3033 \x1dB\x98\xfa\x95\xc1a\xbf\x13\xf9\xbe\xc8\xd7\xe7\x87\x18c\xe0\xbd\x073\xa3\ 
3034 \xaek\x10\x11\xfa\xbe\xcfgPU\x15RJ\x8bSB\x08h\x9af1\xdb$\xc8aw]\x87\xae\xeb\ 
3035 \xd6\x04\xd7i\x1bc\xc0\xccPJ\xa1m[03\x98\x19Z\xeb\x951QQ\xc2\xbc<K\x8c\x11"\ 
3036 \x92\xc5N)M\xbd\xd6\x1a\xafo\xef\x94}\x07#6\x00Xk\x7f\xef\xfdO\xc7\xd3\x19\ 
3037 \xc0,\x83\x10\x02\x88h\xaa1m\xad\xf5M\xf4E\x06s\x93-\xcd\xf1\xef\x1a\x8c\'^c\ 
3038 \xdf5\x18\x95C\xbei`\xad\xc50\x0cp\xce-\x96[\xd8s\xd1\xa3\xdf\xf9\x075\xf1v>\ 
3039 \x92\xcb\xbc\xdd\x00\x00\x00\x00IEND\xaeB`\x82'  
3041 def getSaveAllBitmap(): 
3042     return BitmapFromImage(getSaveAllImage()) 
3044 def getSaveAllImage(): 
3045     stream 
= cStringIO
.StringIO(getSaveAllData()) 
3046     return ImageFromStream(stream
) 
3048 #---------------------------------------------------------------------- 
3051 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
3052 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
3053 \x00\x00\xa1IDAT8\x8d\xa5S[\x0e\x02!\x0c\xec\xd0\xbd\xb6\x1a\xf5\xda\x96\xd9\ 
3054 \x0f\xa1V\x96\x00\xbaMHI\xd3y\xf0(\x90T\xce\xc4\xd6+2\x1bg@$E\x97\x80\xd9H\ 
3055 \x8e\xf1\x00\xc6\x0e\xda&''\x05\x80\xab\x1f\x08\xa2\xfa\xcc\xc5\xd0\xc1H\xbd\ 
3056 \n\x89\xbc\xef\xc1\tV\xd5\x91\x14\xcc\xc6\x9a\xa5<#WV\xed\x8d\x18\x94\xc2\ 
3057 \xd1s'\xa2\xb2\xe7\xc2\xf4STAf\xe3\x16\x0bm\xdc\xae\x17'\xbf?\x9e\x0e\x8an\ 
3058 \x86G\xc8\xf6\xf9\x91I\xf5\x8b\xa0\n\xff}\x04w\x80\xa4ng\x06l/QD\x04u\x1aW\ 
3059 \x06(:\xf0\xfd\x99q\xce\xf6\xe2\x0e\xa5\xa2~.\x00=\xb5t\x00\x00\x00\x00IEND\ 
3062 def getPrintBitmap(): 
3063     return BitmapFromImage(getPrintImage()) 
3065 def getPrintImage(): 
3066     stream 
= cStringIO
.StringIO(getPrintData()) 
3067     return ImageFromStream(stream
) 
3069 #---------------------------------------------------------------------- 
3070 def getPrintPreviewData(): 
3072 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
3073 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
3074 \x00\x00\xa8IDAT8\x8d\x9d\x93K\x0e\xc30\x08Dg \xd7n\xcd\xc1\x9b\xd2E\x83E\\\ 
3075 \xffT$/\x82\xc5\x83\x19\x13\x02p,\x82\xa2\x1c\xde\x01p\xf71\x83\xe4\x14"\xab\ 
3076 \xeeQ\xec\xef\xb3\xdbe{\x82\x0c\xcb\xdf\xc7\xaa{\x86\xb7\xb0-@\xaf(\xc7\xd4\ 
3077 \x03\x9203P\x94\x14\xa5\x99\xa1\xf5b\x08\x88b+\x05~\xbejQ\x0f\xe2\xbd\x00\ 
3078 \xe0\x14\x05\xdc\x9d\xa2\xa0(\xcc\xec\x9b\xbb\xee(\xba~F\xea15a\n(\xcfG\x1d5\ 
3079 d\xe4\xdcTB\xc8\x88\xb1CB\x9b\x9b\x02\x02\x92O@\xaa\x0fXl\xe2\xcd\x0f\xf2g\ 
3080 \xad\x89\x8d\xbf\xf1\x06\xb9V9 \x0c\x1d\xff\xc6\x07\x8aF\x9e\x04\x12\xb5\xf9\ 
3081 O\x00\x00\x00\x00IEND\xaeB`\x82'  
3083 def getPrintPreviewBitmap(): 
3084     return BitmapFromImage(getPrintPreviewImage()) 
3086 def getPrintPreviewImage(): 
3087     stream 
= cStringIO
.StringIO(getPrintPreviewData()) 
3088     return ImageFromStream(stream
) 
3090 #---------------------------------------------------------------------- 
3093 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
3094 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
3095 \x00\x00rIDAT8\x8d\xad\x93\xc1\x0e\xc0 \x08CW\xdco{\xf2\xbb';\xb18\x07\x9d\ 
3096 \x0b\xe3\xa2\x98\xe6\xb5$\x02H\xd92%\xde\xa3\xf6CY\xff\nH'\xf8\x05`\xb1Y\xfc\ 
3097 \x10\x00)`\xfdR\x82\x15w\n0W\xe6N\x01\xda\xab\x8e\xe7g\xc0\xe8\xae\xbdj\x04\ 
3098 \xda#\xe7;\xa8] \xbb\xbb\tL0\x8bX\xa5?\xd2c\x84\xb9 \r6\x96\x97\x0c\xf362\ 
3099 \xb1k\x90]\xe7\x13\x85\xca7&\xcf\xda\xcdU\x00\x00\x00\x00IEND\xaeB`\x82"  
3102     return BitmapFromImage(getCutImage()) 
3105     stream 
= cStringIO
.StringIO(getCutData()) 
3106     return ImageFromStream(stream
) 
3108 #---------------------------------------------------------------------- 
3111 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
3112 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
3113 \x00\x00lIDAT8\x8d\xed\x92Q\x0b\x800\x08\x84\xd5\xf5\xb7\x07W\xfdo\xed!\xaca\ 
3114 \xb2\x11{\xe9!a\xa0\xc7\xeec\x1ec\x96B3%S\xeeO\x00\x96\xd1\x05\xd3j\xed\x0c\ 
3115 \x10\xad\xdb\xce\x97\xc0R\xe8\x0c\x12\xe6\xbd\xcfQs\x1d\xb8\xf5\xd4\x90\x19#\ 
3116 \xc4\xfbG\x06\xa6\xd5X\x9a'\x0e*\r1\xee\xfd\x1a\xd0\x83\x98V\x03\x1a\xa1\xb7\ 
3117 k<@\x12\xec\xff\x95\xe7\x01\x07L\x0e(\xe5\xa4\xff\x1c\x88\x00\x00\x00\x00IEN\ 
3120 def getUndoBitmap(): 
3121     return BitmapFromImage(getUndoImage()) 
3124     stream 
= cStringIO
.StringIO(getUndoData()) 
3125     return ImageFromStream(stream
) 
3127 #---------------------------------------------------------------------- 
3130 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
3131 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
3132 \x00\x00jIDAT8\x8d\xed\x92\xcd\n\xc0 \x0c\x83\x9bv\xaf\xed\x16\xf0\xbd\xd7]&\ 
3133 \xf8\x8f\xe0e\x87\t9$\xb6\x1f\xb5\x08\xa8\xc9\xce\xd1\xad\xeeO\x00\x8e\xdc\\\ 
3134 gp\xb2,\x80FL\tP\x13\xa8\tI\x17\xa1'\x9f$\xd2\xe6\xb9\xef\x86=\xa5\xfb\x1a\ 
3135 \xb8\xbc\x03h\x84\xdf\xc1\xeb|\x19\xd0k.\x00\xe4\xb8h\x94\xbf\xa3\x95\xef$\ 
3136 \xe7\xbbh\xf4\x7f\xe5}\xc0\x03&\x1b&\xe5\xc2\x03!\xa6\x00\x00\x00\x00IEND\ 
3139 def getRedoBitmap(): 
3140     return BitmapFromImage(getRedoImage()) 
3143     stream 
= cStringIO
.StringIO(getRedoData()) 
3144     return ImageFromStream(stream
) 
3146 #---------------------------------------------------------------------------- 
3150 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
3151 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
3152 \x00\x00]IDAT8\x8d\xed\x931\x0e\xc00\x08\x03m\x92\xff\xff8q\x87\xb6C\x11\x89\ 
3153 \xa8X:\xd4\x13\x03:\x1b\x01\xa45T\xd4\xefBsh\xd7Hk\xdc\x02\x00@\x8a\x19$\xa1\ 
3154 9\x14A,\x95\xf3\x82G)\xd3\x00\xf24\xf7\x90\x1ev\x07\xee\x1e\xf4:\xc1J?\xe0\ 
3155 \x0b\x80\xc7\x1d\xf8\x1dg\xc4\xea7\x96G8\x00\xa8\x91\x19(\x85#P\x7f\x00\x00\ 
3156 \x00\x00IEND\xaeB`\x82'  
3159 def getBlankBitmap(): 
3160     return BitmapFromImage(getBlankImage()) 
3162 def getBlankImage(): 
3163     stream 
= cStringIO
.StringIO(getBlankData()) 
3164     return ImageFromStream(stream
) 
3167     return wx
.IconFromBitmap(getBlankBitmap())