]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/samples/wxProject/wxProject.py
Added some simple sample apps
[wxWidgets.git] / wxPython / samples / wxProject / wxProject.py
diff --git a/wxPython/samples/wxProject/wxProject.py b/wxPython/samples/wxProject/wxProject.py
new file mode 100644 (file)
index 0000000..03b6df1
--- /dev/null
@@ -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()
+