3 from wxPython.wx import *
6 # Process the command line. Not much to do;
7 # just get the name of the project file if it's given. Simple.
10 projfile = sys.argv[1]
13 def MsgBox (window, string):
14 dlg=wxMessageDialog(window, string, 'wxProject', wxOK)
18 class main_window(wxFrame):
19 def __init__(self, parent, id, title):
20 wxFrame.__init__(self, parent, -1, title, size = (500, 500),
21 style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
24 # ------------------------------------------------------------------------------------
25 # Set up menu bar for the program.
26 # ------------------------------------------------------------------------------------
27 self.mainmenu = wxMenuBar() # Create menu bar.
30 menu=wxMenu() # Make a menu (will be the Project menu)
32 exitID=wxNewId() # Make a new ID for a menu entry.
33 menu.Append(exitID, '&Open', 'Open project') # Name the ID by adding it to the menu.
34 EVT_MENU(self, exitID, self.OnProjectOpen) # Create and assign a menu event.
36 menu.Append(exitID, '&New', 'New project')
37 EVT_MENU(self, exitID, self.OnProjectNew)
39 menu.Append(exitID, 'E&xit', 'Exit program')
40 EVT_MENU(self, exitID, self.OnProjectExit)
42 self.mainmenu.Append (menu, '&Project') # Add the project menu to the menu bar.
45 menu=wxMenu() # Make a menu (will be the File menu)
48 menu.Append(exitID, '&Add', 'Add file to project')
49 EVT_MENU(self, exitID, self.OnFileAdd)
51 menu.Append(exitID, '&Remove', 'Remove file from project')
52 EVT_MENU(self, exitID, self.OnFileRemove)
54 menu.Append(exitID, '&Open', 'Open file for editing')
55 EVT_MENU(self, exitID, self.OnFileOpen)
57 menu.Append(exitID, '&Save', 'Save file')
58 EVT_MENU(self, exitID, self.OnFileSave)
60 self.mainmenu.Append (menu, '&File') # Add the file menu to the menu bar.
62 self.SetMenuBar (self.mainmenu) # Attach the menu bar to the window.
65 # ------------------------------------------------------------------------------------
66 # Create the splitter window.
67 # ------------------------------------------------------------------------------------
68 splitter = wxSplitterWindow (self, -1, style=wxNO_3D|wxSP_3D)
69 splitter.SetMinimumPaneSize (1)
71 # ------------------------------------------------------------------------------------
72 # Create the tree on the left.
73 # ------------------------------------------------------------------------------------
75 self.tree = wxTreeCtrl (splitter, tID, style=wxTR_HAS_BUTTONS |
77 wxTR_HAS_VARIABLE_ROW_HEIGHT)
78 EVT_TREE_BEGIN_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEdit)
79 EVT_TREE_END_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEditEnd)
80 EVT_TREE_ITEM_ACTIVATED(self.tree, tID, self.OnTreeItemActivated)
82 # ------------------------------------------------------------------------------------
83 # Create the editor on the right.
84 # ------------------------------------------------------------------------------------
85 self.editor = wxTextCtrl(splitter, -1, style=wxTE_MULTILINE)
86 self.editor.Enable (0)
88 # ------------------------------------------------------------------------------------
89 # Install the tree and the editor.
90 # ------------------------------------------------------------------------------------
91 splitter.SplitVertically (self.tree, self.editor)
92 splitter.SetSashPosition (180, True)
96 # Some global state variables.
97 self.projectdirty = False
99 # ----------------------------------------------------------------------------------------
100 # Some nice little handlers.
101 # ----------------------------------------------------------------------------------------
104 def project_open(self, project_file):
106 input = open (project_file, 'r')
108 self.tree.DeleteAllItems()
110 self.project_file = project_file
111 name = replace (input.readline(), "\n", "")
113 self.root = self.tree.AddRoot(name)
114 self.activeitem = self.root
115 for line in input.readlines():
116 self.tree.AppendItem (self.root, replace(line, "\n", ""))
118 self.tree.Expand (self.root)
121 self.editor.Enable (False)
123 self.projectdirty = False
127 def project_save(self):
129 output = open (self.project_file, 'w+')
130 output.write (self.tree.GetItemText (self.root) + "\n")
132 count = self.tree.GetChildrenCount (self.root)
135 for i in range(count):
137 (child,iter) = self.tree.GetFirstChild(self.root,iter)
139 (child,iter) = self.tree.GetNextChild(self.root,iter)
140 output.write (self.tree.GetItemText(child) + "\n")
142 self.projectdirty = False
144 dlg_m = wxMessageDialog (self, 'There was an error saving the project file.',
149 # ----------------------------------------------------------------------------------------
150 # Event handlers from here on out.
151 # ----------------------------------------------------------------------------------------
153 def OnProjectOpen(self, event):
155 if self.projectdirty:
156 dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
158 result = dlg.ShowModal()
159 if result == wxID_YES:
161 if result == wxID_CANCEL:
165 dlg = wxFileDialog(self, "Choose a project to open", ".", "", "*.wxp", wxOPEN)
166 if dlg.ShowModal() == wxID_OK:
167 self.project_open(dlg.GetPath())
170 def OnProjectNew(self, event):
172 if self.projectdirty:
173 dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
175 result = dlg.ShowModal()
176 if result == wxID_YES:
178 if result == wxID_CANCEL:
183 dlg = wxTextEntryDialog (self, "Name for new project:", "New Project",
184 "New project", wxOK | wxCANCEL)
185 if dlg.ShowModal() == wxID_OK:
186 newproj = dlg.GetValue()
188 dlg = wxFileDialog (self, "Place to store new project", ".", "", "*.wxp",
190 if dlg.ShowModal() == wxID_OK:
192 proj = open (dlg.GetPath(), 'w')
193 proj.write (newproj + "\n")
195 self.project_open (dlg.GetPath())
197 dlg_m = wxMessageDialog (self,
198 'There was an error saving the new project file.',
204 def OnProjectExit(self, event):
206 if self.projectdirty:
207 dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
209 result = dlg.ShowModal()
210 if result == wxID_YES:
212 if result == wxID_CANCEL:
218 def OnFileAdd(self, event):
219 dlg = wxFileDialog (self, "Choose a file to add", ".", "", "*.*", wxOPEN)
220 if dlg.ShowModal() == wxID_OK:
221 path = os.path.split(dlg.GetPath())
222 self.tree.AppendItem (self.root, path[1])
223 self.tree.Expand (self.root)
226 def OnFileRemove(self, event):
227 item = self.tree.GetSelection()
228 if item != self.root:
229 self.tree.Delete (item)
232 def OnFileOpen(self, event):
233 item = self.tree.GetSelection()
235 def OnFileSave(self, event):
236 if self.activeitem != self.root:
237 self.editor.SaveFile (self.tree.GetItemText (self.activeitem))
240 def OnTreeLabelEdit(self, event):
242 if item != self.root:
245 def OnTreeLabelEditEnd(self, event):
246 self.projectdirty = True
248 def OnTreeItemActivated(self, event):
250 if self.activeitem != self.root:
251 if self.editor.IsModified():
252 dlg=wxMessageDialog(self, 'The edited file has changed. Save it?',
253 'wxProject', wxYES_NO | wxCANCEL)
254 result = dlg.ShowModal()
255 if result == wxID_YES:
256 self.editor.SaveFile (self.tree.GetItemText (self.activeitem))
257 if result == wxID_CANCEL:
261 self.tree.SetItemBold (self.activeitem, 0)
265 self.activeitem = item
266 if item != self.root:
267 self.tree.SetItemBold (item, 1)
268 self.editor.Enable (1)
269 self.editor.LoadFile (self.tree.GetItemText(item))
270 self.editor.SetInsertionPoint (0)
271 self.editor.SetFocus()
274 self.editor.Enable (0)
278 frame = main_window(None, -1, "wxProject - " + projfile)
279 self.SetTopWindow(frame)
280 if (projfile != 'Unnamed'):
281 frame.project_open (projfile)