]> git.saurik.com Git - wxWidgets.git/blob - wxPython/samples/docview/DocViewDemo.py
fixed deadlock when calling wxPostEvent() from worker thread
[wxWidgets.git] / wxPython / samples / docview / DocViewDemo.py
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