X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/39cc7a0bae66d5b82ce9a9cc71a51f4efda52166..1918b6f78959585e7d141aadc49bedfd5d0511f1:/wxPython/samples/frogedit/FrogEdit.py diff --git a/wxPython/samples/frogedit/FrogEdit.py b/wxPython/samples/frogedit/FrogEdit.py new file mode 100644 index 0000000000..68f3e27a04 --- /dev/null +++ b/wxPython/samples/frogedit/FrogEdit.py @@ -0,0 +1,366 @@ +#!/usr/local/bin/python + +# simple text editor +# +# Copyright 2001 Adam Feuer and Steve Howell +# +# License: Python + +import os, string, re +import sys +from wxPython.wx import * +from StatusBar import * +from FrogEditor import FrogEditor + +TRUE = 1 +FALSE = 0 + +ABOUT_TEXT = """FrogEdit : Copyright 2001 Adam Feuer and Steve Howell +wxEditor component : Copyright 1999 - 2001 Dirk Holtwic, Robin Dunn, Adam Feuer, Steve Howell + +FrogEdit was built using Python, wxPython, and wxWindows.""" + + +##--------------------------------------------------------------------- + +def chomp(line): + line = string.split(line,'\n')[0] + return string.split(line,'\r')[0] + +##--------------------------------------------------------------------- + +class OutlinerPanel(wxPanel): + + def Close(self, event): + self.parent.Close() + wxPanel.Close(self) + +##---------------------------------------------------------------------- + + +class FrogEditFrame(wxFrame): + def __init__(self, parent, ID, title, pos=wxDefaultPosition, + size=wxDefaultSize, style=wxDEFAULT_FRAME_STYLE): + + wxFrame.__init__(self, parent, ID, title, pos, size, style) + + splitter = wxSplitterWindow(self, -1, style=wxNO_3D|wxSP_3D) + win = OutlinerPanel(splitter, -1, style=wxCLIP_CHILDREN) + win.parent = self + log = self.MakeLogWindow(splitter) + + self.MakeStatusbar() + self.MakeEditorWindow(win, log) + self.SetUpSplitter(splitter, win, log) + self.MakeMenus() + self.MakeMainWindow(win) + self.RegisterEventHandlers() + self.InitVariables() + + +##------------- Init Misc + + def RegisterEventHandlers(self): + EVT_CLOSE(self,self.OnCloseWindow) + + def InitVariables(self): + self.fileName = None + self.edl.UnTouchBuffer() + + def MakeMenus(self): + self.MainMenu = wxMenuBar() + self.AddMenus(self.MainMenu) + self.SetMenuBar(self.MainMenu) + +##------------- Init Subwindows + + def MakeEditorWindow(self, win, log): + self.edl = FrogEditor(win, -1, style=wxSUNKEN_BORDER, statusBar = self.sb) + self.edl.SetControlFuncs = self.SetControlFuncs + self.edl.SetAltFuncs = self.SetAltFuncs + self.edl.SetStatus(log) + + def MakeStatusbar(self): + self.sb = CustomStatusBar(self) + self.SetStatusBar(self.sb) + + def MakeLogWindow(self, container): + log = wxTextCtrl(container, -1, + style = wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL) + wxLog_SetActiveTarget(wxLogTextCtrl(log)) + wxLogMessage('window handle: %s' % self.GetHandle()) + return log + + def SetUpSplitter(self, splitter, win, log): + splitter.SplitHorizontally(win, log) + splitter.SetSashPosition(360, true) + splitter.SetMinimumPaneSize(40) + + def MakeToolbar(self, win): + toolbarBox = wxBoxSizer(wxHORIZONTAL) + self.AddButtons(win, toolbarBox) + return toolbarBox + + def MakeMainWindow(self, win): + mainBox = wxBoxSizer(wxVERTICAL) + mainBox.Add(self.MakeToolbar(win)) + borderWidth = 5 + mainBox.Add(self.edl, 1, wxALL|wxGROW, borderWidth) + win.SetSizer(mainBox) + win.SetAutoLayout(true) + +##-------------- Init Menus + + # override this to add more menus + def AddMenus(self, menu): + self.AddFileMenu(menu) + self.AddEditMenu(menu) + self.AddHelpMenu(menu) + + def AddMenuItem(self, menu, itemText, itemDescription, itemHandler): + menuId = wxNewId() + menu.Append(menuId, itemText, itemDescription) + EVT_MENU(self, menuId, itemHandler) + return menuId + + def AddFileMenu(self, menu): + fileMenu = wxMenu() + self.AddMenuItem(fileMenu, '&New File\tCtrl-N', 'New File', self.OnNewFile) + self.AddMenuItem(fileMenu, '&Open File\tCtrl-O', 'Open File', self.OnOpenFile) + self.AddMenuItem(fileMenu, '&Save File\tCtrl-S', 'Save File', self.OnSaveFile) + self.AddMenuItem(fileMenu, 'Save File &As\tCtrl-A', 'Save File As',self.OnSaveFileAs) + self.AddMenuItem(fileMenu, 'E&xit\tAlt-X', 'Exit', self.OnFileExit) + menu.Append(fileMenu, 'File') + + def AddEditMenu(self, menu): + editMenu = wxMenu() + self.AddMenuItem(editMenu, 'Cut\tCtrl-X', 'Cut', self.edl.OnCutSelection) + self.AddMenuItem(editMenu, '&Copy\tCtrl-C', 'Copy', self.edl.OnCopySelection) + self.AddMenuItem(editMenu, 'Paste\tCtrl-V', 'Paste', self.edl.OnPaste) + self.AddMenuItem(editMenu, 'Edit preferences', 'Edit Preferences', self.OnEditPreferences) + menu.Append(editMenu, 'Edit') + + def AddHelpMenu(self, menu): + helpMenu = wxMenu() + self.AddMenuItem(helpMenu, 'About', 'About the program', self.OnHelpAbout) + menu.Append(helpMenu, 'Help') + +##---------------- Init Buttons + + + def NewButton(self, window, container, name, pos, size, handler): + buttonId = wxNewId() + if pos == None or size == None: + container.Add(wxButton(window, buttonId, name), 0, 0) + else: + container.Add(wxButton(window, buttonId, name, pos, size), 0, 0) + EVT_BUTTON(self, buttonId, handler) + return buttonId + + # override this to make more buttons + def AddButtons(self, window, container): + buttonPos = None + buttonSize = None + self.NewButton(window, container, "New", buttonPos, buttonSize, self.OnNewFile) + self.NewButton(window, container, "Open", buttonPos, buttonSize, self.OnOpenFile) + self.NewButton(window, container, "Save", buttonPos, buttonSize, self.OnSaveFile) + + +##-------------- Init Dialogs + + def MessageDialog(self, text, title): + messageDialog = wxMessageDialog(self, text, title, wxOK | wxICON_INFORMATION) + messageDialog.ShowModal() + messageDialog.Destroy() + + def OkCancelDialog(self, text, title): + dialog = wxMessageDialog(self, text, title, wxOK | wxCANCEL | wxICON_INFORMATION) + result = dialog.ShowModal() + dialog.Destroy() + if result == wxID_OK: + return TRUE + else: + return FALSE + + def SelectFileDialog(self, defaultDir=None, defaultFile=None, wildCard=None): + if defaultDir == None: + defaultDir = "." + if defaultFile == None: + defaultFile = "" + if wildCard == None: + wildCard = "*.*" + fileName = None + fileDialog = wxFileDialog(self, "Choose a file", defaultDir, defaultFile, wildCard, wxOPEN|wxMULTIPLE) + result = fileDialog.ShowModal() + if result == wxID_OK: + fileName = fileDialog.GetPath() + wxLogMessage('You selected: %s\n' % fileName) + fileDialog.Destroy() + return fileName + + def OpenFileError(self, fileName): + wxLogMessage('Open file error.') + self.MessageDialog("Error opening file '%s'!" % fileName, "Error") + + + def SaveFileError(self, fileName): + wxLogMessage('Save file error.') + self.MessageDialog("Error saving file '%s'!" % fileName, "Error") + +##---------------- Utility functions + + + def SetControlFuncs(self, action): + "for overriding editor's keys" + FrogEditor.SetControlFuncs(self.edl, action) + action['a'] = self.OnSaveFileAs + action['o'] = self.OnOpenFile + action['n'] = self.OnNewFile + action['s'] = self.OnSaveFile + + def SetAltFuncs(self, action): + FrogEditor.SetAltFuncs(self.edl, action) + action['x'] = self.OnFileExit + + def GetCurrentDir(self): + if self.fileName is not None: + return os.path.split(self.fileName)[0] + return "." + + def GetFileName(self): + if self.fileName is not None: + return os.path.split(self.fileName)[1] + return "" + + def NewFile(self): + self.edl.SetText([""]) + self.fileName = None + self.sb.setFileName("") + + def SaveFile(self, fileName): + try: + contents = string.join(self.edl.GetText(), '\n') + f = open(fileName, 'w') + f.write(contents) + f.close() + self.edl.UnTouchBuffer() + self.sb.setFileName(fileName) + return TRUE + except: + return FALSE + + def OpenFile(self, fileName): + try: + f = open(fileName, 'r') + contents = f.readlines() + f.close() + contents = [chomp(line) for line in contents] + if len(contents) == 0: + contents = [""] + self.edl.SetText(contents) + self.fileName = fileName + self.sb.setFileName(fileName) + return TRUE + except: + return FALSE + + + +##---------------- Event handlers + + + def OnCloseWindow(self, event): + self.edl.OnCloseWindow(event) + self.Destroy() + + def OnNewFile(self, event): + if self.edl.BufferWasTouched(): + if not self.OkCancelDialog("New file - abandon changes?", "New File"): + return + self.NewFile() + self.edl.SetFocus() + + def OnOpenFile(self, event): + if self.edl.BufferWasTouched(): + if not self.OkCancelDialog("Open file - abandon changes?", "Open File"): + return + fileName = self.SelectFileDialog(self.GetCurrentDir()) + if fileName is not None: + if self.OpenFile(fileName) is FALSE: + self.OpenFileError(fileName) + self.edl.SetFocus() + + def OnSaveFile(self, event): + if self.fileName is None: + return self.OnSaveFileAs(event) + wxLogMessage("Saving %s..." % self.fileName) + if self.SaveFile(self.fileName) is not TRUE: + self.SaveFileError(self.fileName) + self.edl.SetFocus() + + def OnSaveFileAs(self, event): + fileName = self.SelectFileDialog(self.GetCurrentDir(),self.GetFileName()) + if fileName is not None: + self.fileName = fileName + wxLogMessage("Saving %s..." % self.fileName) + if self.SaveFile(self.fileName) is not TRUE: + self.SaveFileError(self.fileName) + self.edl.SetFocus() + + def OnFileExit(self, event): + if self.edl.BufferWasTouched(): + if not self.OkCancelDialog("Exit program - abandon changes?", "Exit"): + return + self.OnCloseWindow(event) + + def OnEditPreferences(self, event): + self.MessageDialog("Edit preferences is not implemented yet.", "Not implemented.") + pass + + def OnHelpAbout(self, event): + self.MessageDialog(ABOUT_TEXT, "About FrogEdit") + pass + + def Show(self, show): + wxFrame.Show(self, show) + self.edl.SetFocus() + +##------------- Startup stuff + + def LoadInitialFile(self, fileName): + if fileName is not None: + if self.OpenFile(fileName) is FALSE: + self.OpenFileError(fileName) + + + + +##-------------- Application Launcher utility class + +class FrogEditLauncher: + + def MakeAppFrame(self): + return FrogEditFrame(None, -1, "FrogEdit", size=(640, 480), + style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE) + def GetArgvFilename(self): + if len(sys.argv) > 1: + return sys.argv[1] + else: + return None + + def Main(self): + win = self.MakeAppFrame() + app = wxPySimpleApp() + win.Show(true) + win.LoadInitialFile(self.GetArgvFilename()) + app.MainLoop() + + +##-------------- Main program + + +if __name__ == '__main__': + + launcher = FrogEditLauncher() + launcher.Main() +