wxProject.py :  » GUI » wxPython » wxPython-src-2.8.11.0 » wxPython » samples » wxProject » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » GUI » wxPython 
wxPython » wxPython src 2.8.11.0 » wxPython » samples » wxProject » wxProject.py
#!/usr/bin/env python

"""
This sample comes from an IBM developerWorks article at
http://www-106.ibm.com/developerworks/library/l-wxpy/index.html

This small program was adapted to demonstrate the current guide lines
on http://wiki.wxpython.org/index.cgi/wxPython_20Style_20Guide.
Changes are noted in readme.txt.
"""

import sys, os
import wx


# 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 MsgDlg(window, string, caption='wxProject', style=wx.YES_NO|wx.CANCEL):
    """Common MessageDialog."""
    dlg = wx.MessageDialog(window, string, caption, style)
    result = dlg.ShowModal()
    dlg.Destroy()
    return result


class main_window(wx.Frame):
    """wxProject MainFrame."""
    def __init__(self, parent, title):
        """Create the wxProject MainFrame."""
        wx.Frame.__init__(self, parent, title=title, size=(500, 500),
                          style=wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE)


        # Set up menu bar for the program.
        self.mainmenu = wx.MenuBar()                  # Create menu bar.

        # Make the 'Project' menu.
        menu = wx.Menu()

        item = menu.Append(wx.ID_OPEN, '&Open', 'Open project')  # Append a new menu
        self.Bind(wx.EVT_MENU, self.OnProjectOpen, item)  # Create and assign a menu event.

        item = menu.Append(wx.ID_NEW, '&New', 'New project')
        self.Bind(wx.EVT_MENU, self.OnProjectNew, item)

        item = menu.Append(wx.ID_EXIT, 'E&xit', 'Exit program')
        self.Bind(wx.EVT_MENU, self.OnProjectExit, item)

        self.mainmenu.Append(menu, '&Project')  # Add the project menu to the menu bar.

        # Make the 'File' menu.
        menu = wx.Menu()

        item = menu.Append(wx.ID_ANY, '&Add', 'Add file to project')
        self.Bind(wx.EVT_MENU, self.OnFileAdd, item)

        item = menu.Append(wx.ID_ANY, '&Remove', 'Remove file from project')
        self.Bind(wx.EVT_MENU, self.OnFileRemove, item)

        item = menu.Append(wx.ID_ANY, '&Open', 'Open file for editing')
        self.Bind(wx.EVT_MENU, self.OnFileOpen, item)

        item = menu.Append(wx.ID_ANY, '&Save', 'Save file')
        self.Bind(wx.EVT_MENU, self.OnFileSave, item)

        self.mainmenu.Append(menu, '&File') # Add the file menu to the menu bar.

        # Attach the menu bar to the window.
        self.SetMenuBar(self.mainmenu)

        # Create the splitter window.
        splitter = wx.SplitterWindow(self, style=wx.NO_3D|wx.SP_3D)
        splitter.SetMinimumPaneSize(1)

        # Create the tree on the left.
        self.tree = wx.TreeCtrl(splitter, style=wx.TR_DEFAULT_STYLE)
        self.tree.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTreeLabelEdit)
        self.tree.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTreeLabelEditEnd)
        self.tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTreeItemActivated)

        # Create the editor on the right.
        self.editor = wx.TextCtrl(splitter, style=wx.TE_MULTILINE)
        self.editor.Enable(0)

        # Install the tree and the editor.
        splitter.SplitVertically(self.tree, self.editor)
        splitter.SetSashPosition(180, True)

        # Some global state variables.
        self.projectdirty = False
        self.root = None
        self.close = False

        self.Bind(wx.EVT_CLOSE, self.OnProjectExit)

        self.Show(True)

    # ----------------------------------------------------------------------------------------
    # Some nice little handlers.
    # ----------------------------------------------------------------------------------------

    def project_open(self, project_file):
        """Open and process a wxProject file."""
        try:
            input = open(project_file, 'r')
            self.tree.DeleteAllItems()

            self.project_file = project_file
            name = input.readline().replace ('\n', '')
            self.SetTitle(name)

            # create the file elements in the tree control.
            self.root = self.tree.AddRoot(name)
            self.activeitem = self.root
            for line in input.readlines():
                self.tree.AppendItem(self.root, line.replace ('\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):
        """Save a wxProject file."""
        try:
            output = open(self.project_file, 'w+')
            output.write(self.tree.GetItemText(self.root) + '\n')
            count = self.tree.GetChildrenCount(self.root)  # collect all file (tree) items.
            iter = 0
            child = ''
            for i in range(count):
               if i == 0:
                  child, cookie = self.tree.GetFirstChild(self.root)
               else:
                  child, cookie = self.tree.GetNextChild(self.root, cookie)
               output.write(self.tree.GetItemText(child) + '\n')
            output.close()
            self.projectdirty = False
        except IOError:
            MsgDlg(self, 'There was an error saving the new project file.', 'Error!', wx.OK)

    def CheckProjectDirty(self):
        """Were the current project changed? If so, save it before."""
        open_it = True
        if self.projectdirty:
            # save the current project file first.
            result = MsgDlg(self, 'The project has been changed.  Save?')
            if result == wx.ID_YES:
                self.project_save()
            if result == wx.ID_CANCEL:
                open_it = False
        return open_it

    def CheckTreeRootItem(self):
        """Is there any root item?"""
        if not self.root:
            MsgDlg(self, 'Please create or open a project before.', 'Error!', wx.OK)
            return False
        return True

    # ----------------------------------------------------------------------------------------
    # Event handlers from here on out.
    # ----------------------------------------------------------------------------------------

    def OnProjectOpen(self, event):
        """Open a wxProject file."""
        open_it = self.CheckProjectDirty()
        if open_it:
            dlg = wx.FileDialog(self, 'Choose a project to open', '.', '', '*.wxp', wx.OPEN)
            if dlg.ShowModal() == wx.ID_OK:
                self.project_open(dlg.GetPath())
            dlg.Destroy()

    def OnProjectNew(self, event):
        """Create a new wxProject."""
        open_it = self.CheckProjectDirty()
        if open_it:
            dlg = wx.TextEntryDialog(self, 'Name for new project:', 'New Project',
                                     'New project', wx.OK|wx.CANCEL)
            if dlg.ShowModal() == wx.ID_OK:
                newproj = dlg.GetValue()
                dlg.Destroy()
                dlg = wx.FileDialog(self, 'Place to store new project.', '.', '', '*.wxp', wx.SAVE)
                if dlg.ShowModal() == wx.ID_OK:
                    try:
                        # save the project file.
                        proj = open(dlg.GetPath(), 'w')
                        proj.write(newproj + '\n')
                        proj.close()
                        self.project_open(dlg.GetPath())
                    except IOError:
                        MsgDlg(self, 'There was an error saving the new project file.', 'Error!', wx.OK)
            dlg.Destroy()

    def SaveCurrentFile(self):
        """Check and save current file."""
        go_ahead = True
        if self.root:
            if self.activeitem != self.root:
                if self.editor.IsModified():  # Save modified file before
                    result = MsgDlg(self, 'The edited file has changed.  Save it?')
                    if result == wx.ID_YES:
                        self.editor.SaveFile(self.tree.GetItemText(self.activeitem))
                    if result == wx.ID_CANCEL:
                        go_ahead = False
                if go_ahead:
                    self.tree.SetItemBold(self.activeitem, 0)
        return go_ahead

    def OnProjectExit(self, event):
        """Quit the program."""
        if not self.close:
            self.close = True
            if not self.SaveCurrentFile():
                self.close = False
            if self.projectdirty and self.close:
                result = MsgDlg(self, 'The project has been changed.  Save?')
                if result == wx.ID_YES:
                    self.project_save()
                if result == wx.ID_CANCEL:
                    self.close = False
            if self.close:
                self.Close()
        else:
            event.Skip()

    def OnFileAdd(self, event):
        """Adds a file to the current project."""
        if not self.CheckTreeRootItem():
            return

        dlg = wx.FileDialog(self, 'Choose a file to add.', '.', '', '*.*', wx.OPEN)
        if dlg.ShowModal() == wx.ID_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):
        """Removes a file to the current project."""
        if not self.CheckTreeRootItem():
            return
        item = self.tree.GetSelection()
        if item != self.root:
            self.tree.Delete(item)
            self.project_save()

    def OnFileOpen(self, event):
        """Opens current selected file."""
        if self.root:
            item = self.tree.GetSelection()
            if item != self.root:
                self.OnTreeItemActivated(None, item)
                return
        MsgDlg(self, 'There is no file to load.', 'Error!', wx.OK)

    def OnFileSave(self, event):
        """Saves current selected file."""
        if self.root:
            if self.activeitem != self.root:
                self.editor.SaveFile(self.tree.GetItemText(self.activeitem))
                return
        MsgDlg(self, 'There is no file to save.', 'Error!', wx.OK)


    def OnTreeLabelEdit(self, event):
        """Edit tree label (only root label can be edited)."""
        item = event.GetItem()
        if item != self.root:
            event.Veto()

    def OnTreeLabelEditEnd(self, event):
        """End editing the tree label."""
        self.projectdirty = True


    def OnTreeItemActivated(self, event, item=None):
        """Tree item was activated: try to open this file."""
        go_ahead = self.SaveCurrentFile()

        if go_ahead:
            if event:
                item = event.GetItem()
            self.activeitem = item
            if item != self.root:
                # load the current selected file
                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(wx.App):
    """wxProject Application."""
    def OnInit(self):
        """Create the wxProject Application."""
        frame = main_window(None, 'wxProject - ' + projfile)
        if projfile != 'Unnamed':
            frame.project_open(projfile)
        return True


if __name__ == '__main__':
    app = App(0)
    app.MainLoop()
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.