"Closing view crashes Python" plus some new features:
    New feature added to the IDE is 'Extensions'.  Under
    Tools|Options|Extensions, you can add calls to external programs.
    For example you can add a "Notepad" extension (under windows) that
    will exec Notepad on the currently open file.  A new "Notepad"
    menu item will appear under the Tools menu.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34638 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
	
		
			
				
	
	
		
			326 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			326 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #----------------------------------------------------------------------------
 | |
| # Name:         DocViewDemo.py
 | |
| # Purpose:      Port of the wxWindows docview sample classes
 | |
| #
 | |
| # Author:       Peter Yared
 | |
| #
 | |
| # Created:      8/1/03
 | |
| # CVS-ID:       $Id$
 | |
| # Copyright:    (c) 2003-2005 ActiveGrid, Inc. (Port of wxWindows classes by Julian Smart et al)
 | |
| # License:      wxWindows License
 | |
| #----------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| # This isn't the most object oriented code (it is somewhat repetitive,
 | |
| # but it is true to the wxWindows C++ demos.
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| import wx
 | |
| import wx.lib.docview
 | |
| _ = wx.GetTranslation
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| #----------------------------------------------------------------------
 | |
| # TextEdit document and view classes
 | |
| 
 | |
| class TextEditDocument(wx.lib.docview.Document):
 | |
| 
 | |
| 
 | |
|     def OnSaveDocument(self, filename):
 | |
|         view = self.GetFirstView()
 | |
|         if not view.GetTextSW().SaveFile(filename):
 | |
|             return False
 | |
|         self.Modify(False)
 | |
|         self.SetDocumentSaved(True)
 | |
| ##        if wx.Platform == "__WXMAC__":
 | |
| ##            fn = wx.Filename(filename)
 | |
| ##            fn.MacSetDefaultTypeAndCreator()
 | |
|         return True
 | |
| 
 | |
| 
 | |
|     def OnOpenDocument(self, filename):
 | |
|         view = self.GetFirstView()
 | |
|         if not view.GetTextSW().LoadFile(filename):
 | |
|             return False
 | |
|         self.SetFilename(filename, True)
 | |
|         self.Modify(False)
 | |
|         self.UpdateAllViews()
 | |
|         self._savedYet = True
 | |
|         return True
 | |
| 
 | |
| 
 | |
|     def IsModified(self):
 | |
|         view = self.GetFirstView()
 | |
|         if view:
 | |
|             return wx.lib.docview.Document.IsModified(self) or (view.GetTextSW() and view.GetTextSW().IsModified())
 | |
|         else:
 | |
|             return wx.lib.docview.Document.IsModified(self)
 | |
| 
 | |
| 
 | |
|     def Modify(self, mod):
 | |
|         view = self.GetFirstView()
 | |
|         wx.lib.docview.Document.Modify(self, mod)
 | |
|         if not mod and view and view.GetTextSW():
 | |
|             view.GetTextSW().DiscardEdits()
 | |
| 
 | |
| 
 | |
| class TextEditView(wx.lib.docview.View):
 | |
| 
 | |
| 
 | |
|     def OnCreate(self, doc, flags):
 | |
|         flags = doc.GetDocumentManager().GetFlags()
 | |
|         if flags & wx.lib.docview.DOC_SDI and doc.GetDocumentManager().GetMaxDocsOpen() == 1:
 | |
|             self._frame = wx.GetApp().GetMainFrame()
 | |
|             self.SetFrame(self._frame)
 | |
|             sizer = wx.BoxSizer()
 | |
|             self._textsw = MyTextWindow(self, self._frame, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE)
 | |
|             sizer.Add(self._textsw, 1, wx.EXPAND, 0)
 | |
|             self._frame.SetSizer(sizer)
 | |
|             self._frame.Layout()
 | |
|             self.Activate(True)
 | |
|             return True
 | |
|         elif flags & wx.lib.docview.DOC_MDI:
 | |
|             self._frame = wx.lib.docview.DocMDIChildFrame(doc, self, wx.GetApp().GetMainFrame(), -1, wx.GetApp().GetAppName(), (10, 10), (300, 300), wx.DEFAULT_FRAME_STYLE)
 | |
|             self.SetFrame(self._frame)
 | |
|             sizer = wx.BoxSizer()
 | |
|             self._textsw = MyTextWindow(self, self._frame, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE)
 | |
|             sizer.Add(self._textsw, 1, wx.EXPAND, 0)
 | |
|             self._frame.SetSizer(sizer)
 | |
|             self._frame.Layout()
 | |
|             self._frame.Show(True)
 | |
|             self.Activate(True)
 | |
|             return True
 | |
|         else:  # flags & wx.lib.docview.DOC_SDI
 | |
|             self._frame = wx.GetApp().CreateChildFrame(doc, self)
 | |
|             width, height = self._frame.GetClientSize()
 | |
|             self._textsw = MyTextWindow(self, self._frame, (0, 0), (width, height), wx.TE_MULTILINE)
 | |
|             self._frame.SetTitle(_("TextEditView"))
 | |
|             self._frame.Show(True)
 | |
|             self.Activate(True)
 | |
|             return True
 | |
| 
 | |
| 
 | |
|     # Since ProcessEvent is not virtual, we have to trap the relevant events using this pseudo-ProcessEvent instead of EVT_MENU
 | |
|     def ProcessEvent(self, event):
 | |
|         id = event.GetId()
 | |
|         if id == wx.ID_UNDO:
 | |
|             self._textsw.Undo()
 | |
|             return True
 | |
|         elif id == wx.ID_REDO:
 | |
|             self._textsw.Redo()
 | |
|             return True
 | |
|         else:
 | |
|             return wx.lib.docview.View.ProcessEvent(self, event)
 | |
| 
 | |
| 
 | |
|     def GetTextSW(self):
 | |
|         return self._textsw
 | |
| 
 | |
| 
 | |
|     def OnDraw(self, dc):
 | |
|         """ For Print and Print Preview """
 | |
|         pass
 | |
| 
 | |
| 
 | |
|     def OnClose(self, deleteWindow = True):
 | |
|         if not self.GetDocument().Close():
 | |
|             return False
 | |
|         self.Activate(False)
 | |
|         if deleteWindow:
 | |
|             if self.GetDocument().GetDocumentManager().GetMaxDocsOpen() == 1 and self.GetDocument().GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI:
 | |
|                 if self._textsw:
 | |
|                     self._textsw.Destroy()
 | |
|                 return True
 | |
|             else:
 | |
|                 self._frame.Destroy()
 | |
|                 return True
 | |
|         return True
 | |
| 
 | |
| 
 | |
| class MyTextWindow(wx.TextCtrl):
 | |
| 
 | |
| 
 | |
|     def __init__(self, view, frame, pos, size, style):
 | |
|         wx.TextCtrl.__init__(self, frame, -1, "", pos, size, style)
 | |
|         self._view = view
 | |
| 
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| #----------------------------------------------------------------------
 | |
| # TextEdit Sample Application
 | |
| 
 | |
| 
 | |
| class MyApp(wx.PySimpleApp):
 | |
| 
 | |
| 
 | |
|     def OnInit(self):
 | |
| 
 | |
| 
 | |
|         demoMode = wx.GetSingleChoiceIndex(_("Select the demo mode"),
 | |
|                                            _("wxPython DocView Demo"),
 | |
|                                            [_("SDI Single Document"), _("SDI"), _("MDI")])
 | |
| 
 | |
|         if demoMode == 0 or demoMode == 1:
 | |
|             flags = wx.lib.docview.DOC_SDI
 | |
|         elif demoMode == 2:
 | |
|             flags = wx.lib.docview.DOC_MDI
 | |
|         else:
 | |
|             return False
 | |
| 
 | |
|         self.SetAppName(_("DocView Demo"))
 | |
| 
 | |
|         docManager = wx.lib.docview.DocManager(flags = flags)
 | |
|         docManager.AssociateTemplate(wx.lib.docview.DocTemplate(docManager,
 | |
|                                                          _("Text"),
 | |
|                                                          "*.text;*.txt",
 | |
|                                                          _("Text"),
 | |
|                                                          _(".txt"),
 | |
|                                                          _("Text Document"),
 | |
|                                                          _("Text View"),
 | |
|                                                          TextEditDocument,
 | |
|                                                          TextEditView))
 | |
|         #if wx.Platform == "__WXMAC__":
 | |
|         #     wx.FileName.MacRegisterDefaultTypeAndCreator("txt", 'TEXT', 'WXMA')
 | |
| 
 | |
|         if demoMode == 0:
 | |
|             docManager.SetMaxDocsOpen(1)
 | |
| 
 | |
|         if demoMode == 2:  # MDI
 | |
|             self._frame = MyMDIFrame(docManager, None, -1, _("DocView Demo"), (0, 0), (500, 400), wx.DEFAULT_FRAME_STYLE)
 | |
|         else:  # SDI
 | |
|             self._frame = MyFrame(docManager, None, -1, _("DocView Demo"), (0, 0), (500, 400), wx.DEFAULT_FRAME_STYLE)
 | |
| 
 | |
|         fileMenu = wx.Menu()
 | |
|         editMenu = None
 | |
| 
 | |
|         fileMenu.Append(wx.ID_NEW, _("&New..."))
 | |
|         fileMenu.Append(wx.ID_OPEN, _("&Open..."))
 | |
| 
 | |
|         if demoMode == 2:  # MDI
 | |
|             fileMenu.Append(wx.ID_CLOSE, _("&Close"))
 | |
|             fileMenu.AppendSeparator()
 | |
| 
 | |
|         if demoMode == 0 or demoMode == 2:  # Single Doc or MDI
 | |
|             fileMenu.Append(wx.ID_SAVE, _("&Save"))
 | |
|             fileMenu.Append(wx.ID_SAVEAS, _("Save &As"))
 | |
|             fileMenu.AppendSeparator()
 | |
|             fileMenu.Append(wx.ID_PRINT, _("&Print"))
 | |
|             fileMenu.Append(wx.ID_PRINT_SETUP, _("Page &Setup"))
 | |
|             fileMenu.Append(wx.ID_PREVIEW, _("Print Pre&view"))
 | |
| 
 | |
|             editMenu = wx.Menu()
 | |
|             editMenu.Append(wx.ID_UNDO, _("&Undo"))
 | |
|             editMenu.Append(wx.ID_REDO, _("&Redo"))
 | |
| 
 | |
|             self._frame.editMenu = editMenu
 | |
| 
 | |
|         fileMenu.AppendSeparator()
 | |
|         fileMenu.Append(wx.ID_EXIT, _("E&xit"))
 | |
| 
 | |
|         docManager.FileHistoryUseMenu(fileMenu)
 | |
| 
 | |
|         helpMenu = wx.Menu()
 | |
|         helpMenu.Append(wx.ID_ABOUT, _("&About"))
 | |
| 
 | |
|         menuBar = wx.MenuBar()
 | |
|         menuBar.Append(fileMenu, _("&File"))
 | |
|         if editMenu:
 | |
|             menuBar.Append(editMenu, _("&Edit"))
 | |
|         menuBar.Append(helpMenu, _("&Help"))
 | |
| 
 | |
|         self._frame.SetMenuBar(menuBar)
 | |
|         self._frame.Centre(wx.BOTH)
 | |
|         self._frame.Show(True)
 | |
| 
 | |
|         self.SetTopWindow(self._frame)
 | |
| 
 | |
|         if demoMode == 0:  # Single doc
 | |
|             docManager.OnFileNew(None)
 | |
| 
 | |
|         return True
 | |
| 
 | |
| 
 | |
|     def GetMainFrame(self):
 | |
|         return self._frame
 | |
| 
 | |
| 
 | |
|     def GetDemoMode(self):
 | |
|         return self._demoMode
 | |
| 
 | |
| 
 | |
|     def CreateChildFrame(self, doc, view):
 | |
|         subframe = wx.lib.docview.DocChildFrame(doc, view, self.GetMainFrame(), -1, wx.GetApp().GetAppName(), (10, 10), (300, 300), wx.DEFAULT_FRAME_STYLE)
 | |
| 
 | |
|         fileMenu = wx.Menu()
 | |
|         fileMenu.Append(wx.ID_NEW, _("&New"))
 | |
|         fileMenu.Append(wx.ID_OPEN, _("&Open"))
 | |
|         fileMenu.Append(wx.ID_CLOSE, _("&Close"))
 | |
|         fileMenu.AppendSeparator()
 | |
|         fileMenu.Append(wx.ID_SAVE, _("&Save"))
 | |
|         fileMenu.Append(wx.ID_SAVEAS, _("Save &As"))
 | |
|         fileMenu.AppendSeparator()
 | |
|         fileMenu.Append(wx.ID_PRINT, _("&Print"))
 | |
|         fileMenu.Append(wx.ID_PRINT_SETUP, _("Page &Setup"))
 | |
|         fileMenu.Append(wx.ID_PREVIEW, _("Print Pre&view"))
 | |
| 
 | |
|         editMenu = wx.Menu()
 | |
|         editMenu.Append(wx.ID_UNDO, _("&Undo"))
 | |
|         editMenu.Append(wx.ID_REDO, _("&Redo"))
 | |
| 
 | |
|         helpMenu = wx.Menu()
 | |
|         helpMenu.Append(wx.ID_ABOUT, _("&About"))
 | |
| 
 | |
|         menuBar = wx.MenuBar()
 | |
| 
 | |
|         menuBar.Append(fileMenu, _("&File"))
 | |
|         menuBar.Append(editMenu, _("&Edit"))
 | |
|         menuBar.Append(helpMenu, _("&Help"))
 | |
| 
 | |
|         subframe.SetMenuBar(menuBar)
 | |
|         subframe.Centre(wx.BOTH)
 | |
|         return subframe
 | |
| 
 | |
| 
 | |
| class MyFrame(wx.lib.docview.DocParentFrame):
 | |
| 
 | |
| 
 | |
|     def __init__(self, manager, frame, id, title, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, name = "frame"):
 | |
|         wx.lib.docview.DocParentFrame.__init__(self, manager, frame, id, title, pos, size, style, name)
 | |
|         self._frame = frame
 | |
|         wx.EVT_MENU(self, wx.ID_ABOUT, self.OnAbout)
 | |
| 
 | |
| 
 | |
|     def OnAbout(self, event):
 | |
|         wx.MessageBox(wx.GetApp().GetAppName(), _("About DocView"))
 | |
| 
 | |
| 
 | |
|     def GetMainFrame(self):
 | |
|         return self._frame
 | |
| 
 | |
| 
 | |
| class MyMDIFrame(wx.lib.docview.DocMDIParentFrame):
 | |
| 
 | |
|     def __init__(self, manager, frame, id, title, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, name = "frame"):
 | |
|         wx.lib.docview.DocMDIParentFrame.__init__(self, manager, frame, id, title, pos, size, style, name)
 | |
|         self._frame = frame
 | |
|         wx.EVT_MENU(self, wx.ID_ABOUT, self.OnAbout)
 | |
| 
 | |
| 
 | |
|     def OnAbout(self, event):
 | |
|         wx.MessageBox(wx.GetApp().GetAppName(), _("About DocView"))
 | |
| 
 | |
| 
 | |
|     def GetMainFrame(self):
 | |
|         return self._frame
 | |
| 
 | |
| 
 | |
| app = MyApp()
 | |
| app.MainLoop()
 | |
| 
 | |
| 
 |