]> git.saurik.com Git - wxWidgets.git/blame - wxPython/samples/frogedit/FrogEdit.py
Calling a virtual function from a destructor is not good:
[wxWidgets.git] / wxPython / samples / frogedit / FrogEdit.py
CommitLineData
4491d3ae 1#!/usr/bin/env python
1918b6f7
RD
2
3# simple text editor
4#
5# Copyright 2001 Adam Feuer and Steve Howell
6#
7# License: Python
8
9import os, string, re
10import sys
11from wxPython.wx import *
12from StatusBar import *
13from FrogEditor import FrogEditor
14
1918b6f7
RD
15
16ABOUT_TEXT = """FrogEdit : Copyright 2001 Adam Feuer and Steve Howell
17wxEditor component : Copyright 1999 - 2001 Dirk Holtwic, Robin Dunn, Adam Feuer, Steve Howell
18
19FrogEdit was built using Python, wxPython, and wxWindows."""
20
21
22##---------------------------------------------------------------------
23
24def chomp(line):
25 line = string.split(line,'\n')[0]
26 return string.split(line,'\r')[0]
27
28##---------------------------------------------------------------------
29
30class OutlinerPanel(wxPanel):
31
32 def Close(self, event):
33 self.parent.Close()
34 wxPanel.Close(self)
35
36##----------------------------------------------------------------------
78e8819c 37
1918b6f7
RD
38
39class FrogEditFrame(wxFrame):
40 def __init__(self, parent, ID, title, pos=wxDefaultPosition,
41 size=wxDefaultSize, style=wxDEFAULT_FRAME_STYLE):
42
43 wxFrame.__init__(self, parent, ID, title, pos, size, style)
44
45 splitter = wxSplitterWindow(self, -1, style=wxNO_3D|wxSP_3D)
46 win = OutlinerPanel(splitter, -1, style=wxCLIP_CHILDREN)
47 win.parent = self
48 log = self.MakeLogWindow(splitter)
78e8819c 49
1918b6f7
RD
50 self.MakeStatusbar()
51 self.MakeEditorWindow(win, log)
52 self.SetUpSplitter(splitter, win, log)
53 self.MakeMenus()
54 self.MakeMainWindow(win)
55 self.RegisterEventHandlers()
56 self.InitVariables()
57
78e8819c
RD
58 win.Layout()
59
1918b6f7
RD
60
61##------------- Init Misc
62
63 def RegisterEventHandlers(self):
64 EVT_CLOSE(self,self.OnCloseWindow)
65
66 def InitVariables(self):
67 self.fileName = None
68 self.edl.UnTouchBuffer()
78e8819c 69
1918b6f7
RD
70 def MakeMenus(self):
71 self.MainMenu = wxMenuBar()
72 self.AddMenus(self.MainMenu)
73 self.SetMenuBar(self.MainMenu)
74
75##------------- Init Subwindows
76
77 def MakeEditorWindow(self, win, log):
78 self.edl = FrogEditor(win, -1, style=wxSUNKEN_BORDER, statusBar = self.sb)
79 self.edl.SetControlFuncs = self.SetControlFuncs
80 self.edl.SetAltFuncs = self.SetAltFuncs
81 self.edl.SetStatus(log)
82
83 def MakeStatusbar(self):
84 self.sb = CustomStatusBar(self)
85 self.SetStatusBar(self.sb)
86
87 def MakeLogWindow(self, container):
88 log = wxTextCtrl(container, -1,
89 style = wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL)
90 wxLog_SetActiveTarget(wxLogTextCtrl(log))
91 wxLogMessage('window handle: %s' % self.GetHandle())
92 return log
93
94 def SetUpSplitter(self, splitter, win, log):
95 splitter.SplitHorizontally(win, log)
1e4a197e 96 splitter.SetSashPosition(360, True)
1918b6f7
RD
97 splitter.SetMinimumPaneSize(40)
98
99 def MakeToolbar(self, win):
100 toolbarBox = wxBoxSizer(wxHORIZONTAL)
101 self.AddButtons(win, toolbarBox)
102 return toolbarBox
103
104 def MakeMainWindow(self, win):
105 mainBox = wxBoxSizer(wxVERTICAL)
106 mainBox.Add(self.MakeToolbar(win))
107 borderWidth = 5
108 mainBox.Add(self.edl, 1, wxALL|wxGROW, borderWidth)
109 win.SetSizer(mainBox)
1e4a197e 110 win.SetAutoLayout(True)
1918b6f7
RD
111
112##-------------- Init Menus
113
114 # override this to add more menus
115 def AddMenus(self, menu):
116 self.AddFileMenu(menu)
117 self.AddEditMenu(menu)
118 self.AddHelpMenu(menu)
119
120 def AddMenuItem(self, menu, itemText, itemDescription, itemHandler):
121 menuId = wxNewId()
122 menu.Append(menuId, itemText, itemDescription)
123 EVT_MENU(self, menuId, itemHandler)
124 return menuId
125
126 def AddFileMenu(self, menu):
127 fileMenu = wxMenu()
128 self.AddMenuItem(fileMenu, '&New File\tCtrl-N', 'New File', self.OnNewFile)
129 self.AddMenuItem(fileMenu, '&Open File\tCtrl-O', 'Open File', self.OnOpenFile)
130 self.AddMenuItem(fileMenu, '&Save File\tCtrl-S', 'Save File', self.OnSaveFile)
131 self.AddMenuItem(fileMenu, 'Save File &As\tCtrl-A', 'Save File As',self.OnSaveFileAs)
132 self.AddMenuItem(fileMenu, 'E&xit\tAlt-X', 'Exit', self.OnFileExit)
133 menu.Append(fileMenu, 'File')
134
135 def AddEditMenu(self, menu):
136 editMenu = wxMenu()
137 self.AddMenuItem(editMenu, 'Cut\tCtrl-X', 'Cut', self.edl.OnCutSelection)
138 self.AddMenuItem(editMenu, '&Copy\tCtrl-C', 'Copy', self.edl.OnCopySelection)
139 self.AddMenuItem(editMenu, 'Paste\tCtrl-V', 'Paste', self.edl.OnPaste)
140 self.AddMenuItem(editMenu, 'Edit preferences', 'Edit Preferences', self.OnEditPreferences)
141 menu.Append(editMenu, 'Edit')
142
143 def AddHelpMenu(self, menu):
144 helpMenu = wxMenu()
145 self.AddMenuItem(helpMenu, 'About', 'About the program', self.OnHelpAbout)
146 menu.Append(helpMenu, 'Help')
147
148##---------------- Init Buttons
149
150
151 def NewButton(self, window, container, name, pos, size, handler):
152 buttonId = wxNewId()
153 if pos == None or size == None:
154 container.Add(wxButton(window, buttonId, name), 0, 0)
155 else:
156 container.Add(wxButton(window, buttonId, name, pos, size), 0, 0)
157 EVT_BUTTON(self, buttonId, handler)
158 return buttonId
159
160 # override this to make more buttons
161 def AddButtons(self, window, container):
162 buttonPos = None
163 buttonSize = None
164 self.NewButton(window, container, "New", buttonPos, buttonSize, self.OnNewFile)
165 self.NewButton(window, container, "Open", buttonPos, buttonSize, self.OnOpenFile)
166 self.NewButton(window, container, "Save", buttonPos, buttonSize, self.OnSaveFile)
167
168
169##-------------- Init Dialogs
170
171 def MessageDialog(self, text, title):
172 messageDialog = wxMessageDialog(self, text, title, wxOK | wxICON_INFORMATION)
173 messageDialog.ShowModal()
174 messageDialog.Destroy()
78e8819c 175
1918b6f7
RD
176 def OkCancelDialog(self, text, title):
177 dialog = wxMessageDialog(self, text, title, wxOK | wxCANCEL | wxICON_INFORMATION)
178 result = dialog.ShowModal()
179 dialog.Destroy()
180 if result == wxID_OK:
1e4a197e 181 return True
1918b6f7 182 else:
1e4a197e 183 return False
1918b6f7
RD
184
185 def SelectFileDialog(self, defaultDir=None, defaultFile=None, wildCard=None):
186 if defaultDir == None:
187 defaultDir = "."
188 if defaultFile == None:
189 defaultFile = ""
190 if wildCard == None:
191 wildCard = "*.*"
192 fileName = None
193 fileDialog = wxFileDialog(self, "Choose a file", defaultDir, defaultFile, wildCard, wxOPEN|wxMULTIPLE)
78e8819c 194 result = fileDialog.ShowModal()
1918b6f7
RD
195 if result == wxID_OK:
196 fileName = fileDialog.GetPath()
197 wxLogMessage('You selected: %s\n' % fileName)
78e8819c 198 fileDialog.Destroy()
1918b6f7
RD
199 return fileName
200
201 def OpenFileError(self, fileName):
202 wxLogMessage('Open file error.')
203 self.MessageDialog("Error opening file '%s'!" % fileName, "Error")
204
205
206 def SaveFileError(self, fileName):
207 wxLogMessage('Save file error.')
208 self.MessageDialog("Error saving file '%s'!" % fileName, "Error")
209
210##---------------- Utility functions
211
212
213 def SetControlFuncs(self, action):
214 "for overriding editor's keys"
215 FrogEditor.SetControlFuncs(self.edl, action)
216 action['a'] = self.OnSaveFileAs
217 action['o'] = self.OnOpenFile
218 action['n'] = self.OnNewFile
219 action['s'] = self.OnSaveFile
220
221 def SetAltFuncs(self, action):
222 FrogEditor.SetAltFuncs(self.edl, action)
78e8819c 223 action['x'] = self.OnFileExit
1918b6f7
RD
224
225 def GetCurrentDir(self):
226 if self.fileName is not None:
227 return os.path.split(self.fileName)[0]
228 return "."
78e8819c 229
1918b6f7
RD
230 def GetFileName(self):
231 if self.fileName is not None:
232 return os.path.split(self.fileName)[1]
233 return ""
234
235 def NewFile(self):
236 self.edl.SetText([""])
237 self.fileName = None
238 self.sb.setFileName("")
239
240 def SaveFile(self, fileName):
241 try:
242 contents = string.join(self.edl.GetText(), '\n')
243 f = open(fileName, 'w')
244 f.write(contents)
245 f.close()
246 self.edl.UnTouchBuffer()
247 self.sb.setFileName(fileName)
1e4a197e 248 return True
1918b6f7 249 except:
1e4a197e 250 return False
1918b6f7
RD
251
252 def OpenFile(self, fileName):
253 try:
254 f = open(fileName, 'r')
255 contents = f.readlines()
256 f.close()
257 contents = [chomp(line) for line in contents]
258 if len(contents) == 0:
259 contents = [""]
260 self.edl.SetText(contents)
261 self.fileName = fileName
262 self.sb.setFileName(fileName)
1e4a197e 263 return True
1918b6f7 264 except:
1e4a197e 265 return False
78e8819c 266
1918b6f7
RD
267
268
269##---------------- Event handlers
270
271
272 def OnCloseWindow(self, event):
273 self.edl.OnCloseWindow(event)
274 self.Destroy()
275
276 def OnNewFile(self, event):
277 if self.edl.BufferWasTouched():
278 if not self.OkCancelDialog("New file - abandon changes?", "New File"):
279 return
280 self.NewFile()
281 self.edl.SetFocus()
78e8819c 282
1918b6f7
RD
283 def OnOpenFile(self, event):
284 if self.edl.BufferWasTouched():
285 if not self.OkCancelDialog("Open file - abandon changes?", "Open File"):
286 return
287 fileName = self.SelectFileDialog(self.GetCurrentDir())
288 if fileName is not None:
1e4a197e 289 if self.OpenFile(fileName) is False:
1918b6f7
RD
290 self.OpenFileError(fileName)
291 self.edl.SetFocus()
78e8819c 292
1918b6f7
RD
293 def OnSaveFile(self, event):
294 if self.fileName is None:
295 return self.OnSaveFileAs(event)
296 wxLogMessage("Saving %s..." % self.fileName)
1e4a197e 297 if self.SaveFile(self.fileName) is not True:
1918b6f7
RD
298 self.SaveFileError(self.fileName)
299 self.edl.SetFocus()
78e8819c 300
1918b6f7
RD
301 def OnSaveFileAs(self, event):
302 fileName = self.SelectFileDialog(self.GetCurrentDir(),self.GetFileName())
303 if fileName is not None:
304 self.fileName = fileName
305 wxLogMessage("Saving %s..." % self.fileName)
1e4a197e 306 if self.SaveFile(self.fileName) is not True:
1918b6f7
RD
307 self.SaveFileError(self.fileName)
308 self.edl.SetFocus()
78e8819c
RD
309
310 def OnFileExit(self, event):
1918b6f7
RD
311 if self.edl.BufferWasTouched():
312 if not self.OkCancelDialog("Exit program - abandon changes?", "Exit"):
313 return
314 self.OnCloseWindow(event)
315
316 def OnEditPreferences(self, event):
317 self.MessageDialog("Edit preferences is not implemented yet.", "Not implemented.")
318 pass
78e8819c 319
1918b6f7
RD
320 def OnHelpAbout(self, event):
321 self.MessageDialog(ABOUT_TEXT, "About FrogEdit")
322 pass
78e8819c 323
1918b6f7
RD
324 def Show(self, show):
325 wxFrame.Show(self, show)
326 self.edl.SetFocus()
327
328##------------- Startup stuff
329
330 def LoadInitialFile(self, fileName):
331 if fileName is not None:
1e4a197e 332 if self.OpenFile(fileName) is False:
78e8819c 333 self.OpenFileError(fileName)
1918b6f7
RD
334
335
336
337
338##-------------- Application Launcher utility class
339
340class FrogEditLauncher:
341
342 def MakeAppFrame(self):
343 return FrogEditFrame(None, -1, "FrogEdit", size=(640, 480),
78e8819c
RD
344 style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
345
1918b6f7
RD
346 def GetArgvFilename(self):
347 if len(sys.argv) > 1:
348 return sys.argv[1]
349 else:
350 return None
351
352 def Main(self):
1918b6f7 353 app = wxPySimpleApp()
78e8819c 354 win = self.MakeAppFrame()
1e4a197e 355 win.Show(True)
1918b6f7
RD
356 win.LoadInitialFile(self.GetArgvFilename())
357 app.MainLoop()
358
359
360##-------------- Main program
361
362
363if __name__ == '__main__':
364
365 launcher = FrogEditLauncher()
366 launcher.Main()