]>
Commit | Line | Data |
---|---|---|
1 | #---------------------------------------------------------------------------- | |
2 | # Name: DocViewDemo.py | |
3 | # Purpose: Port of the wxWindows docview sample classes | |
4 | # | |
5 | # Author: Peter Yared | |
6 | # | |
7 | # Created: 8/1/03 | |
8 | # CVS-ID: $Id$ | |
9 | # Copyright: (c) 2003-2005 ActiveGrid, Inc. (Port of wxWindows classes by Julian Smart et al) | |
10 | # License: wxWindows License | |
11 | #---------------------------------------------------------------------------- | |
12 | ||
13 | ||
14 | ||
15 | #---------------------------------------------------------------------- | |
16 | # This isn't the most object oriented code (it is somewhat repetitive, | |
17 | # but it is true to the wxWindows C++ demos. | |
18 | #---------------------------------------------------------------------- | |
19 | ||
20 | ||
21 | import wx | |
22 | import wx.lib.docview | |
23 | _ = wx.GetTranslation | |
24 | ||
25 | ||
26 | #---------------------------------------------------------------------- | |
27 | #---------------------------------------------------------------------- | |
28 | # TextEdit document and view classes | |
29 | ||
30 | class TextEditDocument(wx.lib.docview.Document): | |
31 | ||
32 | ||
33 | def OnSaveDocument(self, filename): | |
34 | view = self.GetFirstView() | |
35 | if not view.GetTextSW().SaveFile(filename): | |
36 | return False | |
37 | self.Modify(False) | |
38 | self.SetDocumentSaved(True) | |
39 | ## if wx.Platform == "__WXMAC__": | |
40 | ## fn = wx.Filename(filename) | |
41 | ## fn.MacSetDefaultTypeAndCreator() | |
42 | return True | |
43 | ||
44 | ||
45 | def OnOpenDocument(self, filename): | |
46 | view = self.GetFirstView() | |
47 | if not view.GetTextSW().LoadFile(filename): | |
48 | return False | |
49 | self.SetFilename(filename, True) | |
50 | self.Modify(False) | |
51 | self.UpdateAllViews() | |
52 | self._savedYet = True | |
53 | return True | |
54 | ||
55 | ||
56 | def IsModified(self): | |
57 | view = self.GetFirstView() | |
58 | if view: | |
59 | return wx.lib.docview.Document.IsModified(self) or (view.GetTextSW() and view.GetTextSW().IsModified()) | |
60 | else: | |
61 | return wx.lib.docview.Document.IsModified(self) | |
62 | ||
63 | ||
64 | def Modify(self, mod): | |
65 | view = self.GetFirstView() | |
66 | wx.lib.docview.Document.Modify(self, mod) | |
67 | if not mod and view and view.GetTextSW(): | |
68 | view.GetTextSW().DiscardEdits() | |
69 | ||
70 | ||
71 | class TextEditView(wx.lib.docview.View): | |
72 | ||
73 | ||
74 | def OnCreate(self, doc, flags): | |
75 | flags = doc.GetDocumentManager().GetFlags() | |
76 | if flags & wx.lib.docview.DOC_SDI and doc.GetDocumentManager().GetMaxDocsOpen() == 1: | |
77 | self._frame = wx.GetApp().GetMainFrame() | |
78 | self.SetFrame(self._frame) | |
79 | sizer = wx.BoxSizer() | |
80 | self._textsw = MyTextWindow(self, self._frame, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE) | |
81 | sizer.Add(self._textsw, 1, wx.EXPAND, 0) | |
82 | self._frame.SetSizer(sizer) | |
83 | self._frame.Layout() | |
84 | self.Activate(True) | |
85 | return True | |
86 | elif flags & wx.lib.docview.DOC_MDI: | |
87 | self._frame = wx.lib.docview.DocMDIChildFrame(doc, self, wx.GetApp().GetMainFrame(), -1, wx.GetApp().GetAppName(), (10, 10), (300, 300), wx.DEFAULT_FRAME_STYLE) | |
88 | self.SetFrame(self._frame) | |
89 | sizer = wx.BoxSizer() | |
90 | self._textsw = MyTextWindow(self, self._frame, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE) | |
91 | sizer.Add(self._textsw, 1, wx.EXPAND, 0) | |
92 | self._frame.SetSizer(sizer) | |
93 | self._frame.Layout() | |
94 | self._frame.Show(True) | |
95 | self.Activate(True) | |
96 | return True | |
97 | else: # flags & wx.lib.docview.DOC_SDI | |
98 | self._frame = wx.GetApp().CreateChildFrame(doc, self) | |
99 | width, height = self._frame.GetClientSize() | |
100 | self._textsw = MyTextWindow(self, self._frame, (0, 0), (width, height), wx.TE_MULTILINE) | |
101 | self._frame.SetTitle(_("TextEditView")) | |
102 | self._frame.Show(True) | |
103 | self.Activate(True) | |
104 | return True | |
105 | ||
106 | ||
107 | # Since ProcessEvent is not virtual, we have to trap the relevant events using this pseudo-ProcessEvent instead of EVT_MENU | |
108 | def ProcessEvent(self, event): | |
109 | id = event.GetId() | |
110 | if id == wx.ID_UNDO: | |
111 | self._textsw.Undo() | |
112 | return True | |
113 | elif id == wx.ID_REDO: | |
114 | self._textsw.Redo() | |
115 | return True | |
116 | else: | |
117 | return wx.lib.docview.View.ProcessEvent(self, event) | |
118 | ||
119 | ||
120 | def GetTextSW(self): | |
121 | return self._textsw | |
122 | ||
123 | ||
124 | def OnDraw(self, dc): | |
125 | """ For Print and Print Preview """ | |
126 | pass | |
127 | ||
128 | ||
129 | def OnClose(self, deleteWindow = True): | |
130 | if not self.GetDocument().Close(): | |
131 | return False | |
132 | self.Activate(False) | |
133 | if deleteWindow: | |
134 | if self.GetDocument().GetDocumentManager().GetMaxDocsOpen() == 1 and self.GetDocument().GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI: | |
135 | if self._textsw: | |
136 | self._textsw.Destroy() | |
137 | return True | |
138 | else: | |
139 | self._frame.Destroy() | |
140 | return True | |
141 | return True | |
142 | ||
143 | ||
144 | class MyTextWindow(wx.TextCtrl): | |
145 | ||
146 | ||
147 | def __init__(self, view, frame, pos, size, style): | |
148 | wx.TextCtrl.__init__(self, frame, -1, "", pos, size, style) | |
149 | self._view = view | |
150 | ||
151 | ||
152 | ||
153 | #---------------------------------------------------------------------- | |
154 | #---------------------------------------------------------------------- | |
155 | # TextEdit Sample Application | |
156 | ||
157 | ||
158 | class MyApp(wx.PySimpleApp): | |
159 | ||
160 | ||
161 | def OnInit(self): | |
162 | ||
163 | ||
164 | demoMode = wx.GetSingleChoiceIndex(_("Select the demo mode"), | |
165 | _("wxPython DocView Demo"), | |
166 | [_("SDI Single Document"), _("SDI"), _("MDI")]) | |
167 | ||
168 | if demoMode == 0 or demoMode == 1: | |
169 | flags = wx.lib.docview.DOC_SDI | |
170 | elif demoMode == 2: | |
171 | flags = wx.lib.docview.DOC_MDI | |
172 | else: | |
173 | return False | |
174 | ||
175 | self.SetAppName(_("DocView Demo")) | |
176 | ||
177 | docManager = wx.lib.docview.DocManager(flags = flags) | |
178 | docManager.AssociateTemplate(wx.lib.docview.DocTemplate(docManager, | |
179 | _("Text"), | |
180 | "*.text;*.txt", | |
181 | _("Text"), | |
182 | _(".txt"), | |
183 | _("Text Document"), | |
184 | _("Text View"), | |
185 | TextEditDocument, | |
186 | TextEditView)) | |
187 | #if wx.Platform == "__WXMAC__": | |
188 | # wx.FileName.MacRegisterDefaultTypeAndCreator("txt", 'TEXT', 'WXMA') | |
189 | ||
190 | if demoMode == 0: | |
191 | docManager.SetMaxDocsOpen(1) | |
192 | ||
193 | if demoMode == 2: # MDI | |
194 | self._frame = MyMDIFrame(docManager, None, -1, _("DocView Demo"), (0, 0), (500, 400), wx.DEFAULT_FRAME_STYLE) | |
195 | else: # SDI | |
196 | self._frame = MyFrame(docManager, None, -1, _("DocView Demo"), (0, 0), (500, 400), wx.DEFAULT_FRAME_STYLE) | |
197 | ||
198 | fileMenu = wx.Menu() | |
199 | editMenu = None | |
200 | ||
201 | fileMenu.Append(wx.ID_NEW, _("&New...")) | |
202 | fileMenu.Append(wx.ID_OPEN, _("&Open...")) | |
203 | ||
204 | if demoMode == 2: # MDI | |
205 | fileMenu.Append(wx.ID_CLOSE, _("&Close")) | |
206 | fileMenu.AppendSeparator() | |
207 | ||
208 | if demoMode == 0 or demoMode == 2: # Single Doc or MDI | |
209 | fileMenu.Append(wx.ID_SAVE, _("&Save")) | |
210 | fileMenu.Append(wx.ID_SAVEAS, _("Save &As")) | |
211 | fileMenu.AppendSeparator() | |
212 | fileMenu.Append(wx.ID_PRINT, _("&Print")) | |
213 | fileMenu.Append(wx.ID_PRINT_SETUP, _("Page &Setup")) | |
214 | fileMenu.Append(wx.ID_PREVIEW, _("Print Pre&view")) | |
215 | ||
216 | editMenu = wx.Menu() | |
217 | editMenu.Append(wx.ID_UNDO, _("&Undo")) | |
218 | editMenu.Append(wx.ID_REDO, _("&Redo")) | |
219 | ||
220 | self._frame.editMenu = editMenu | |
221 | ||
222 | fileMenu.AppendSeparator() | |
223 | fileMenu.Append(wx.ID_EXIT, _("E&xit")) | |
224 | ||
225 | docManager.FileHistoryUseMenu(fileMenu) | |
226 | ||
227 | helpMenu = wx.Menu() | |
228 | helpMenu.Append(wx.ID_ABOUT, _("&About")) | |
229 | ||
230 | menuBar = wx.MenuBar() | |
231 | menuBar.Append(fileMenu, _("&File")) | |
232 | if editMenu: | |
233 | menuBar.Append(editMenu, _("&Edit")) | |
234 | menuBar.Append(helpMenu, _("&Help")) | |
235 | ||
236 | self._frame.SetMenuBar(menuBar) | |
237 | self._frame.Centre(wx.BOTH) | |
238 | self._frame.Show(True) | |
239 | ||
240 | self.SetTopWindow(self._frame) | |
241 | ||
242 | if demoMode == 0: # Single doc | |
243 | docManager.OnFileNew(None) | |
244 | ||
245 | return True | |
246 | ||
247 | ||
248 | def GetMainFrame(self): | |
249 | return self._frame | |
250 | ||
251 | ||
252 | def GetDemoMode(self): | |
253 | return self._demoMode | |
254 | ||
255 | ||
256 | def CreateChildFrame(self, doc, view): | |
257 | subframe = wx.lib.docview.DocChildFrame(doc, view, self.GetMainFrame(), -1, wx.GetApp().GetAppName(), (10, 10), (300, 300), wx.DEFAULT_FRAME_STYLE) | |
258 | ||
259 | fileMenu = wx.Menu() | |
260 | fileMenu.Append(wx.ID_NEW, _("&New")) | |
261 | fileMenu.Append(wx.ID_OPEN, _("&Open")) | |
262 | fileMenu.Append(wx.ID_CLOSE, _("&Close")) | |
263 | fileMenu.AppendSeparator() | |
264 | fileMenu.Append(wx.ID_SAVE, _("&Save")) | |
265 | fileMenu.Append(wx.ID_SAVEAS, _("Save &As")) | |
266 | fileMenu.AppendSeparator() | |
267 | fileMenu.Append(wx.ID_PRINT, _("&Print")) | |
268 | fileMenu.Append(wx.ID_PRINT_SETUP, _("Page &Setup")) | |
269 | fileMenu.Append(wx.ID_PREVIEW, _("Print Pre&view")) | |
270 | ||
271 | editMenu = wx.Menu() | |
272 | editMenu.Append(wx.ID_UNDO, _("&Undo")) | |
273 | editMenu.Append(wx.ID_REDO, _("&Redo")) | |
274 | ||
275 | helpMenu = wx.Menu() | |
276 | helpMenu.Append(wx.ID_ABOUT, _("&About")) | |
277 | ||
278 | menuBar = wx.MenuBar() | |
279 | ||
280 | menuBar.Append(fileMenu, _("&File")) | |
281 | menuBar.Append(editMenu, _("&Edit")) | |
282 | menuBar.Append(helpMenu, _("&Help")) | |
283 | ||
284 | subframe.SetMenuBar(menuBar) | |
285 | subframe.Centre(wx.BOTH) | |
286 | return subframe | |
287 | ||
288 | ||
289 | class MyFrame(wx.lib.docview.DocParentFrame): | |
290 | ||
291 | ||
292 | def __init__(self, manager, frame, id, title, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, name = "frame"): | |
293 | wx.lib.docview.DocParentFrame.__init__(self, manager, frame, id, title, pos, size, style, name) | |
294 | self._frame = frame | |
295 | wx.EVT_MENU(self, wx.ID_ABOUT, self.OnAbout) | |
296 | ||
297 | ||
298 | def OnAbout(self, event): | |
299 | wx.MessageBox(wx.GetApp().GetAppName(), _("About DocView")) | |
300 | ||
301 | ||
302 | def GetMainFrame(self): | |
303 | return self._frame | |
304 | ||
305 | ||
306 | class MyMDIFrame(wx.lib.docview.DocMDIParentFrame): | |
307 | ||
308 | def __init__(self, manager, frame, id, title, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, name = "frame"): | |
309 | wx.lib.docview.DocMDIParentFrame.__init__(self, manager, frame, id, title, pos, size, style, name) | |
310 | self._frame = frame | |
311 | wx.EVT_MENU(self, wx.ID_ABOUT, self.OnAbout) | |
312 | ||
313 | ||
314 | def OnAbout(self, event): | |
315 | wx.MessageBox(wx.GetApp().GetAppName(), _("About DocView")) | |
316 | ||
317 | ||
318 | def GetMainFrame(self): | |
319 | return self._frame | |
320 | ||
321 | ||
322 | app = MyApp() | |
323 | app.MainLoop() | |
324 | ||
325 |