2001-03-10 00:07:25 -05:00
|
|
|
#!/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)
|
2003-03-25 01:35:27 -05:00
|
|
|
splitter.SetSashPosition (180, True)
|
2001-03-10 00:07:25 -05:00
|
|
|
|
2003-03-25 01:35:27 -05:00
|
|
|
self.Show(True)
|
2001-03-10 00:07:25 -05:00
|
|
|
|
|
|
|
# Some global state variables.
|
2003-03-25 01:35:27 -05:00
|
|
|
self.projectdirty = False
|
2001-03-10 00:07:25 -05:00
|
|
|
|
|
|
|
# ----------------------------------------------------------------------------------------
|
|
|
|
# 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()
|
2003-03-25 01:35:27 -05:00
|
|
|
self.editor.Enable (False)
|
2001-03-10 00:07:25 -05:00
|
|
|
|
2003-03-25 01:35:27 -05:00
|
|
|
self.projectdirty = False
|
2001-03-10 00:07:25 -05:00
|
|
|
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()
|
2003-03-25 01:35:27 -05:00
|
|
|
self.projectdirty = False
|
2001-03-10 00:07:25 -05:00
|
|
|
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):
|
2003-03-25 01:35:27 -05:00
|
|
|
open_it = True
|
2001-03-10 00:07:25 -05:00
|
|
|
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:
|
2003-03-25 01:35:27 -05:00
|
|
|
open_it = False
|
2001-03-10 00:07:25 -05:00
|
|
|
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):
|
2003-03-25 01:35:27 -05:00
|
|
|
open_it = True
|
2001-03-10 00:07:25 -05:00
|
|
|
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:
|
2003-03-25 01:35:27 -05:00
|
|
|
open_it = False
|
2001-03-10 00:07:25 -05:00
|
|
|
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):
|
2003-03-25 01:35:27 -05:00
|
|
|
close = True
|
2001-03-10 00:07:25 -05:00
|
|
|
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:
|
2003-03-25 01:35:27 -05:00
|
|
|
close = False
|
2001-03-10 00:07:25 -05:00
|
|
|
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):
|
2003-03-25 01:35:27 -05:00
|
|
|
self.projectdirty = True
|
2001-03-10 00:07:25 -05:00
|
|
|
|
|
|
|
def OnTreeItemActivated(self, event):
|
2003-03-25 01:35:27 -05:00
|
|
|
go_ahead = True
|
2001-03-10 00:07:25 -05:00
|
|
|
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:
|
2003-03-25 01:35:27 -05:00
|
|
|
go_ahead = False
|
2001-03-10 00:07:25 -05:00
|
|
|
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)
|
2003-03-25 01:35:27 -05:00
|
|
|
return True
|
2001-03-10 00:07:25 -05:00
|
|
|
|
|
|
|
app = App(0)
|
|
|
|
app.MainLoop()
|
|
|
|
|