#---------------------------------------------------------------------------- # 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): 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()