X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/56bd6aaca9d758663e202816e1861ee8674526e7..c12bc4de5887421242de7f619b3c5e265bf631ac:/wxPython/samples/wxProject/wxProject.py?ds=sidebyside diff --git a/wxPython/samples/wxProject/wxProject.py b/wxPython/samples/wxProject/wxProject.py new file mode 100644 index 0000000000..03b6df1075 --- /dev/null +++ b/wxPython/samples/wxProject/wxProject.py @@ -0,0 +1,286 @@ +#!/bin/python +import sys, os +from wxPython.wx import * +from string import * + +# Process the command line. Not much to do; +# just get the name of the project file if it's given. Simple. +projfile = 'Unnamed' +if len(sys.argv) > 1: + projfile = sys.argv[1] + + +def MsgBox (window, string): + dlg=wxMessageDialog(window, string, 'wxProject', wxOK) + dlg.ShowModal() + dlg.Destroy() + +class main_window(wxFrame): + def __init__(self, parent, id, title): + wxFrame.__init__(self, parent, -1, title, size = (500, 500), + style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE) + + + # ------------------------------------------------------------------------------------ + # Set up menu bar for the program. + # ------------------------------------------------------------------------------------ + self.mainmenu = wxMenuBar() # Create menu bar. + mainwindow = self + + menu=wxMenu() # Make a menu (will be the Project menu) + + exitID=wxNewId() # Make a new ID for a menu entry. + menu.Append(exitID, '&Open', 'Open project') # Name the ID by adding it to the menu. + EVT_MENU(self, exitID, self.OnProjectOpen) # Create and assign a menu event. + exitID=wxNewId() + menu.Append(exitID, '&New', 'New project') + EVT_MENU(self, exitID, self.OnProjectNew) + exitID=wxNewId() + menu.Append(exitID, 'E&xit', 'Exit program') + EVT_MENU(self, exitID, self.OnProjectExit) + + self.mainmenu.Append (menu, '&Project') # Add the project menu to the menu bar. + + + menu=wxMenu() # Make a menu (will be the File menu) + + exitID=wxNewId() + menu.Append(exitID, '&Add', 'Add file to project') + EVT_MENU(self, exitID, self.OnFileAdd) + exitID=wxNewId() + menu.Append(exitID, '&Remove', 'Remove file from project') + EVT_MENU(self, exitID, self.OnFileRemove) + exitID=wxNewId() + menu.Append(exitID, '&Open', 'Open file for editing') + EVT_MENU(self, exitID, self.OnFileOpen) + exitID=wxNewId() + menu.Append(exitID, '&Save', 'Save file') + EVT_MENU(self, exitID, self.OnFileSave) + + self.mainmenu.Append (menu, '&File') # Add the file menu to the menu bar. + + self.SetMenuBar (self.mainmenu) # Attach the menu bar to the window. + + + # ------------------------------------------------------------------------------------ + # Create the splitter window. + # ------------------------------------------------------------------------------------ + splitter = wxSplitterWindow (self, -1, style=wxNO_3D|wxSP_3D) + splitter.SetMinimumPaneSize (1) + + # ------------------------------------------------------------------------------------ + # Create the tree on the left. + # ------------------------------------------------------------------------------------ + tID = wxNewId() + self.tree = wxTreeCtrl (splitter, tID, style=wxTR_HAS_BUTTONS | + wxTR_EDIT_LABELS | + wxTR_HAS_VARIABLE_ROW_HEIGHT) + EVT_TREE_BEGIN_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEdit) + EVT_TREE_END_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEditEnd) + EVT_TREE_ITEM_ACTIVATED(self.tree, tID, self.OnTreeItemActivated) + + # ------------------------------------------------------------------------------------ + # Create the editor on the right. + # ------------------------------------------------------------------------------------ + self.editor = wxTextCtrl(splitter, -1, style=wxTE_MULTILINE) + self.editor.Enable (0) + + # ------------------------------------------------------------------------------------ + # Install the tree and the editor. + # ------------------------------------------------------------------------------------ + splitter.SplitVertically (self.tree, self.editor) + splitter.SetSashPosition (180, true) + + self.Show(true) + + # Some global state variables. + self.projectdirty = false + + # ---------------------------------------------------------------------------------------- + # Some nice little handlers. + # ---------------------------------------------------------------------------------------- + + + def project_open(self, project_file): + try: + input = open (project_file, 'r') + + self.tree.DeleteAllItems() + + self.project_file = project_file + name = replace (input.readline(), "\n", "") + self.SetTitle (name) + self.root = self.tree.AddRoot(name) + self.activeitem = self.root + for line in input.readlines(): + self.tree.AppendItem (self.root, replace(line, "\n", "")) + input.close + self.tree.Expand (self.root) + + self.editor.Clear() + self.editor.Enable (false) + + self.projectdirty = false + except IOError: + pass + + def project_save(self): + try: + output = open (self.project_file, 'w+') + output.write (self.tree.GetItemText (self.root) + "\n") + + count = self.tree.GetChildrenCount (self.root) + iter = 0 + child = '' + for i in range(count): + if i == 0: + (child,iter) = self.tree.GetFirstChild(self.root,iter) + else: + (child,iter) = self.tree.GetNextChild(self.root,iter) + output.write (self.tree.GetItemText(child) + "\n") + output.close() + self.projectdirty = false + except IOError: + dlg_m = wxMessageDialog (self, 'There was an error saving the project file.', + 'Error!', wxOK) + dlg_m.ShowModal() + dlg_m.Destroy() + + # ---------------------------------------------------------------------------------------- + # Event handlers from here on out. + # ---------------------------------------------------------------------------------------- + + def OnProjectOpen(self, event): + open_it = true + if self.projectdirty: + dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject', + wxYES_NO | wxCANCEL) + result = dlg.ShowModal() + if result == wxID_YES: + self.project_save() + if result == wxID_CANCEL: + open_it = false + dlg.Destroy() + if open_it: + dlg = wxFileDialog(self, "Choose a project to open", ".", "", "*.wxp", wxOPEN) + if dlg.ShowModal() == wxID_OK: + self.project_open(dlg.GetPath()) + dlg.Destroy() + + def OnProjectNew(self, event): + open_it = true + if self.projectdirty: + dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject', + wxYES_NO | wxCANCEL) + result = dlg.ShowModal() + if result == wxID_YES: + self.project_save() + if result == wxID_CANCEL: + open_it = false + dlg.Destroy() + + if open_it: + dlg = wxTextEntryDialog (self, "Name for new project:", "New Project", + "New project", wxOK | wxCANCEL) + if dlg.ShowModal() == wxID_OK: + newproj = dlg.GetValue() + dlg.Destroy() + dlg = wxFileDialog (self, "Place to store new project", ".", "", "*.wxp", + wxSAVE) + if dlg.ShowModal() == wxID_OK: + try: + proj = open (dlg.GetPath(), 'w') + proj.write (newproj + "\n") + proj.close() + self.project_open (dlg.GetPath()) + except IOError: + dlg_m = wxMessageDialog (self, + 'There was an error saving the new project file.', + 'Error!', wxOK) + dlg_m.ShowModal() + dlg_m.Destroy() + dlg.Destroy() + + def OnProjectExit(self, event): + close = true + if self.projectdirty: + dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject', + wxYES_NO | wxCANCEL) + result = dlg.ShowModal() + if result == wxID_YES: + self.project_save() + if result == wxID_CANCEL: + close = false + dlg.Destroy() + if close: + self.Close() + + def OnFileAdd(self, event): + dlg = wxFileDialog (self, "Choose a file to add", ".", "", "*.*", wxOPEN) + if dlg.ShowModal() == wxID_OK: + path = os.path.split(dlg.GetPath()) + self.tree.AppendItem (self.root, path[1]) + self.tree.Expand (self.root) + self.project_save() + + def OnFileRemove(self, event): + item = self.tree.GetSelection() + if item != self.root: + self.tree.Delete (item) + self.project_save() + + def OnFileOpen(self, event): + item = self.tree.GetSelection() + + def OnFileSave(self, event): + if self.activeitem != self.root: + self.editor.SaveFile (self.tree.GetItemText (self.activeitem)) + + + def OnTreeLabelEdit(self, event): + item=event.GetItem() + if item != self.root: + event.Veto() + + def OnTreeLabelEditEnd(self, event): + self.projectdirty = true + + def OnTreeItemActivated(self, event): + go_ahead = true + if self.activeitem != self.root: + if self.editor.IsModified(): + dlg=wxMessageDialog(self, 'The edited file has changed. Save it?', + 'wxProject', wxYES_NO | wxCANCEL) + result = dlg.ShowModal() + if result == wxID_YES: + self.editor.SaveFile (self.tree.GetItemText (self.activeitem)) + if result == wxID_CANCEL: + go_ahead = false + dlg.Destroy() + if go_ahead: + self.tree.SetItemBold (self.activeitem, 0) + + if go_ahead: + item=event.GetItem() + self.activeitem = item + if item != self.root: + self.tree.SetItemBold (item, 1) + self.editor.Enable (1) + self.editor.LoadFile (self.tree.GetItemText(item)) + self.editor.SetInsertionPoint (0) + self.editor.SetFocus() + else: + self.editor.Clear() + self.editor.Enable (0) + +class App(wxApp): + def OnInit(self): + frame = main_window(None, -1, "wxProject - " + projfile) + self.SetTopWindow(frame) + if (projfile != 'Unnamed'): + frame.project_open (projfile) + return true + +app = App(0) +app.MainLoop() +