]>
Commit | Line | Data |
---|---|---|
d1dc2b32 RD |
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$ | |
3fa8f722 | 9 | # Copyright: (c) 2003-2005 ActiveGrid, Inc. (Port of wxWindows classes by Julian Smart et al) |
d1dc2b32 RD |
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() | |
74b89458 | 94 | self._frame.Show(True) |
d1dc2b32 RD |
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 | pass | |
126 | ||
127 | ||
128 | def OnClose(self, deleteWindow = True): | |
129 | if not self.GetDocument().Close(): | |
130 | return False | |
131 | self.Activate(False) | |
132 | if deleteWindow: | |
133 | if self.GetDocument().GetDocumentManager().GetMaxDocsOpen() == 1 and self.GetDocument().GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI: | |
134 | if self._textsw: | |
135 | self._textsw.Destroy() | |
136 | return True | |
137 | else: | |
138 | self._frame.Destroy() | |
139 | return True | |
140 | return True | |
141 | ||
142 | ||
143 | class MyTextWindow(wx.TextCtrl): | |
144 | ||
145 | ||
146 | def __init__(self, view, frame, pos, size, style): | |
147 | wx.TextCtrl.__init__(self, frame, -1, "", pos, size, style) | |
148 | self._view = view | |
149 | ||
150 | ||
151 | ||
152 | #---------------------------------------------------------------------- | |
153 | #---------------------------------------------------------------------- | |
154 | # TextEdit Sample Application | |
155 | ||
156 | ||
157 | class MyApp(wx.PySimpleApp): | |
158 | ||
159 | ||
160 | def OnInit(self): | |
161 | ||
162 | ||
163 | demoMode = wx.GetSingleChoiceIndex(_("Select the demo mode"), | |
164 | _("wxPython DocView Demo"), | |
165 | [_("SDI Single Document"), _("SDI"), _("MDI")]) | |
166 | ||
167 | if demoMode == 0 or demoMode == 1: | |
168 | flags = wx.lib.docview.DOC_SDI | |
169 | elif demoMode == 2: | |
170 | flags = wx.lib.docview.DOC_MDI | |
171 | else: | |
172 | return False | |
173 | ||
174 | self.SetAppName(_("DocView Demo")) | |
175 | ||
176 | docManager = wx.lib.docview.DocManager(flags = flags) | |
177 | docManager.AssociateTemplate(wx.lib.docview.DocTemplate(docManager, | |
178 | _("Text"), | |
179 | "*.text;*.txt", | |
180 | _("Text"), | |
181 | _(".txt"), | |
182 | _("Text Document"), | |
183 | _("Text View"), | |
184 | TextEditDocument, | |
185 | TextEditView)) | |
186 | #if wx.Platform == "__WXMAC__": | |
187 | # wx.FileName.MacRegisterDefaultTypeAndCreator("txt", 'TEXT', 'WXMA') | |
188 | ||
189 | if demoMode == 0: | |
190 | docManager.SetMaxDocsOpen(1) | |
191 | ||
192 | if demoMode == 2: # MDI | |
193 | self._frame = MyMDIFrame(docManager, None, -1, _("DocView Demo"), (0, 0), (500, 400), wx.DEFAULT_FRAME_STYLE) | |
194 | else: # SDI | |
195 | self._frame = MyFrame(docManager, None, -1, _("DocView Demo"), (0, 0), (500, 400), wx.DEFAULT_FRAME_STYLE) | |
196 | ||
197 | fileMenu = wx.Menu() | |
198 | editMenu = None | |
199 | ||
200 | fileMenu.Append(wx.ID_NEW, _("&New...")) | |
201 | fileMenu.Append(wx.ID_OPEN, _("&Open...")) | |
202 | ||
203 | if demoMode == 2: # MDI | |
204 | fileMenu.Append(wx.ID_CLOSE, _("&Close")) | |
205 | fileMenu.AppendSeparator() | |
206 | ||
207 | if demoMode == 0 or demoMode == 2: # Single Doc or MDI | |
208 | fileMenu.Append(wx.ID_SAVE, _("&Save")) | |
209 | fileMenu.Append(wx.ID_SAVEAS, _("Save &As")) | |
210 | fileMenu.AppendSeparator() | |
211 | fileMenu.Append(wx.ID_PRINT, _("&Print")) | |
212 | fileMenu.Append(wx.ID_PRINT_SETUP, _("Page &Setup")) | |
213 | fileMenu.Append(wx.ID_PREVIEW, _("Print Pre&view")) | |
214 | ||
215 | editMenu = wx.Menu() | |
216 | editMenu.Append(wx.ID_UNDO, _("&Undo")) | |
217 | editMenu.Append(wx.ID_REDO, _("&Redo")) | |
218 | ||
219 | self._frame.editMenu = editMenu | |
220 | ||
221 | fileMenu.AppendSeparator() | |
222 | fileMenu.Append(wx.ID_EXIT, _("E&xit")) | |
223 | ||
224 | docManager.FileHistoryUseMenu(fileMenu) | |
225 | ||
226 | helpMenu = wx.Menu() | |
227 | helpMenu.Append(wx.ID_ABOUT, _("&About")) | |
228 | ||
229 | menuBar = wx.MenuBar() | |
230 | menuBar.Append(fileMenu, _("&File")) | |
231 | if editMenu: | |
232 | menuBar.Append(editMenu, _("&Edit")) | |
233 | menuBar.Append(helpMenu, _("&Help")) | |
234 | ||
235 | self._frame.SetMenuBar(menuBar) | |
236 | self._frame.Centre(wx.BOTH) | |
237 | self._frame.Show(True) | |
238 | ||
239 | self.SetTopWindow(self._frame) | |
240 | ||
241 | if demoMode == 0: # Single doc | |
242 | docManager.OnFileNew(None) | |
243 | ||
244 | return True | |
245 | ||
246 | ||
247 | def GetMainFrame(self): | |
248 | return self._frame | |
249 | ||
250 | ||
251 | def GetDemoMode(self): | |
252 | return self._demoMode | |
253 | ||
254 | ||
255 | def CreateChildFrame(self, doc, view): | |
256 | subframe = wx.lib.docview.DocChildFrame(doc, view, self.GetMainFrame(), -1, wx.GetApp().GetAppName(), (10, 10), (300, 300), wx.DEFAULT_FRAME_STYLE) | |
257 | ||
258 | fileMenu = wx.Menu() | |
259 | fileMenu.Append(wx.ID_NEW, _("&New")) | |
260 | fileMenu.Append(wx.ID_OPEN, _("&Open")) | |
261 | fileMenu.Append(wx.ID_CLOSE, _("&Close")) | |
262 | fileMenu.AppendSeparator() | |
263 | fileMenu.Append(wx.ID_SAVE, _("&Save")) | |
264 | fileMenu.Append(wx.ID_SAVEAS, _("Save &As")) | |
265 | fileMenu.AppendSeparator() | |
266 | fileMenu.Append(wx.ID_PRINT, _("&Print")) | |
267 | fileMenu.Append(wx.ID_PRINT_SETUP, _("Page &Setup")) | |
268 | fileMenu.Append(wx.ID_PREVIEW, _("Print Pre&view")) | |
269 | ||
270 | editMenu = wx.Menu() | |
271 | editMenu.Append(wx.ID_UNDO, _("&Undo")) | |
272 | editMenu.Append(wx.ID_REDO, _("&Redo")) | |
273 | ||
274 | helpMenu = wx.Menu() | |
275 | helpMenu.Append(wx.ID_ABOUT, _("&About")) | |
276 | ||
277 | menuBar = wx.MenuBar() | |
278 | ||
279 | menuBar.Append(fileMenu, _("&File")) | |
280 | menuBar.Append(editMenu, _("&Edit")) | |
281 | menuBar.Append(helpMenu, _("&Help")) | |
282 | ||
283 | subframe.SetMenuBar(menuBar) | |
284 | subframe.Centre(wx.BOTH) | |
285 | return subframe | |
286 | ||
287 | ||
288 | class MyFrame(wx.lib.docview.DocParentFrame): | |
289 | ||
290 | ||
291 | def __init__(self, manager, frame, id, title, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, name = "frame"): | |
292 | wx.lib.docview.DocParentFrame.__init__(self, manager, frame, id, title, pos, size, style, name) | |
293 | self._frame = frame | |
294 | wx.EVT_MENU(self, wx.ID_ABOUT, self.OnAbout) | |
295 | ||
296 | ||
297 | def OnAbout(self, event): | |
298 | wx.MessageBox(wx.GetApp().GetAppName(), _("About DocView")) | |
299 | ||
300 | ||
301 | def GetMainFrame(self): | |
302 | return self._frame | |
303 | ||
304 | ||
305 | class MyMDIFrame(wx.lib.docview.DocMDIParentFrame): | |
306 | ||
307 | def __init__(self, manager, frame, id, title, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, name = "frame"): | |
308 | wx.lib.docview.DocMDIParentFrame.__init__(self, manager, frame, id, title, pos, size, style, name) | |
309 | self._frame = frame | |
310 | wx.EVT_MENU(self, wx.ID_ABOUT, self.OnAbout) | |
311 | ||
312 | ||
313 | def OnAbout(self, event): | |
314 | wx.MessageBox(wx.GetApp().GetAppName(), _("About DocView")) | |
315 | ||
316 | ||
317 | def GetMainFrame(self): | |
318 | return self._frame | |
319 | ||
320 | ||
321 | app = MyApp() | |
322 | app.MainLoop() | |
323 | ||
324 |