You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@gump.apache.org by aj...@apache.org on 2004/03/15 17:10:23 UTC
cvs commit: gump/python/gump/gui __init__.py view.py
ajack 2004/03/15 08:10:23
Modified: python/gump/gui __init__.py view.py
Log:
Should never have been binary
Revision Changes Path
1.2 +63 -63 gump/python/gump/gui/__init__.py
Index: __init__.py
===================================================================
RCS file: /home/cvs/gump/python/gump/gui/__init__.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- __init__.py 17 Nov 2003 22:10:56 -0000 1.1
+++ __init__.py 15 Mar 2004 16:10:23 -0000 1.2
@@ -1,63 +1,63 @@
-#!/usr/bin/env python
-
-# $Header$
-# $Revision$
-# $Date$
-#
-# ====================================================================
-#
-# The Apache Software License, Version 1.1
-#
-# Copyright (c) 2003 The Apache Software Foundation. All rights
-# reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in
-# the documentation and/or other materials provided with the
-# distribution.
-#
-# 3. The end-user documentation included with the redistribution, if
-# any, must include the following acknowlegement:
-# "This product includes software developed by the
-# Apache Software Foundation (http://www.apache.org/)."
-# Alternately, this acknowlegement may appear in the software itself,
-# if and wherever such third-party acknowlegements normally appear.
-#
-# 4. The names "The Jakarta Project", "Alexandria", and "Apache Software
-# Foundation" must not be used to endorse or promote products derived
-# from this software without prior written permission. For written
-# permission, please contact apache@apache.org.
-#
-# 5. Products derived from this software may not be called "Apache"
-# nor may "Apache" appear in their names without prior written
-# permission of the Apache Group.
-#
-# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
-# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
-# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-# ====================================================================
-#
-# This software consists of voluntary contributions made by many
-# individuals on behalf of the Apache Software Foundation. For more
-# information on the Apache Software Foundation, please see
-# <http://www.apache.org/>.
-
-
-# tell Python what modules make up the gump.gui package
-__all__ = ["view"]
+#!/usr/bin/env python
+
+# $Header$
+# $Revision$
+# $Date$
+#
+# ====================================================================
+#
+# The Apache Software License, Version 1.1
+#
+# Copyright (c) 2003 The Apache Software Foundation. All rights
+# reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. The end-user documentation included with the redistribution, if
+# any, must include the following acknowlegement:
+# "This product includes software developed by the
+# Apache Software Foundation (http://www.apache.org/)."
+# Alternately, this acknowlegement may appear in the software itself,
+# if and wherever such third-party acknowlegements normally appear.
+#
+# 4. The names "The Jakarta Project", "Alexandria", and "Apache Software
+# Foundation" must not be used to endorse or promote products derived
+# from this software without prior written permission. For written
+# permission, please contact apache@apache.org.
+#
+# 5. Products derived from this software may not be called "Apache"
+# nor may "Apache" appear in their names without prior written
+# permission of the Apache Group.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+# ====================================================================
+#
+# This software consists of voluntary contributions made by many
+# individuals on behalf of the Apache Software Foundation. For more
+# information on the Apache Software Foundation, please see
+# <http://www.apache.org/>.
+
+
+# tell Python what modules make up the gump.gui package
+__all__ = ["view"]
1.7 +699 -699 gump/python/gump/gui/view.py
Index: view.py
===================================================================
RCS file: /home/cvs/gump/python/gump/gui/view.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- view.py 9 Mar 2004 19:57:07 -0000 1.6
+++ view.py 15 Mar 2004 16:10:23 -0000 1.7
@@ -1,699 +1,699 @@
-#!/usr/bin/env python
-
-# $Header$
-# $Revision$
-# $Date$
-#
-# ====================================================================
-#
-# The Apache Software License, Version 1.1
-#
-# Copyright (c) 2003 The Apache Software Foundation. All rights
-# reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in
-# the documentation and/or other materials provided with the
-# distribution.
-#
-# 3. The end-user documentation included with the redistribution, if
-# any, must include the following acknowlegement:
-# "This product includes software developed by the
-# Apache Software Foundation (http://www.apache.org/)."
-# Alternately, this acknowlegement may appear in the software itself,
-# if and wherever such third-party acknowlegements normally appear.
-#
-# 4. The names "The Jakarta Project", "Alexandria", and "Apache Software
-# Foundation" must not be used to endorse or promote products derived
-# from this software without prior written permission. For written
-# permission, please contact apache@apache.org.
-#
-# 5. Products derived from this software may not be called "Apache"
-# nor may "Apache" appear in their names without prior written
-# permission of the Apache Group.
-#
-# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
-# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
-# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-# ====================================================================
-#
-# This software consists of voluntary contributions made by many
-# individuals on behalf of the Apache Software Foundation. For more
-# information on the Apache Software Foundation, please see
-# <http://www.apache.org/>.
-
-"""
- Graphic GUI to navigate a Gump workspace
-"""
-
-import os
-import popen2
-import thread
-import sys
-import logging, logging.config
-
-from xml.sax import parse
-from xml.sax.handler import ContentHandler
-
-# http://wxpython.org/
-from wxPython.wx import *
-
-from gump import log
-from gump.config import dir, default
-from gump.utils.xmlutils import xmlize
-from gump.utils.commandLine import handleArgv
-from gump.model.module import Module
-from gump.model.project import Project
-from gump.model.workspace import Workspace
-from gump.model.loader import WorkspaceLoader
-from gump.engine import GumpEngine
-from gump.gumprun import GumpSet
-
-###############################################################################
-# Initialize
-###############################################################################
-
-###############################################################################
-# Main App
-###############################################################################
-
-class gumpview(wxApp):
-
- # model
- mySubs=None
- items=None
- build_sequence=None
- history=[]
-
- # item IDs:
- menu_BACK=10001
- menu_UPDATE=10002
- menu_GEN=10003
- menu_RUN=10004
- menu_CONSOLE=10005
- menu_HELP=10006
-
- # view
- frame=None
- tree=None
- list=None
- data=None
- logsplitter=None
- logview=None
- mainsplit=None
-
- # action views
- toolbar=None
- runbutton=None
-
- # tree index
- mItem={}
- pItem={}
-
- def OnInit(self):
-
- # The main frame
- self.frame = wxFrame(NULL, -1, "Gump Workspace Viewer")
-
- # Create our toolbar
- self.frame.toolbar = self.frame.CreateToolBar(wxTB_HORIZONTAL |
- wxNO_BORDER | wxTB_FLAT )
-
- self.frame.toolbar.AddSimpleTool(self.menu_BACK,
- wxBitmap("gump/gui/images/back.bmp",
- wxBITMAP_TYPE_BMP),
- "Back")
-
- self.frame.toolbar.AddSeparator()
-
- self.frame.toolbar.AddSimpleTool(self.menu_UPDATE,
- wxBitmap("gump/gui/images/update.bmp",
- wxBITMAP_TYPE_BMP),
- "Update from VCS")
-
- self.frame.toolbar.AddSimpleTool(self.menu_GEN,
- wxBitmap("gump/gui/images/gen.bmp",
- wxBITMAP_TYPE_BMP),
- "Generate XML merged descriptor")
-
- self.frame.toolbar.AddSimpleTool(self.menu_RUN,
- wxBitmap("gump/gui/images/run.bmp",
- wxBITMAP_TYPE_BMP),
- "Run")
-
- self.frame.toolbar.AddSeparator()
-
-
- self.frame.toolbar.AddCheckTool(self.menu_CONSOLE,
- wxBitmap("gump/gui/images/console.bmp",
- wxBITMAP_TYPE_BMP),
- shortHelp="Toggle this")
-
- self.frame.toolbar.AddSimpleTool(self.menu_HELP,
- wxBitmap("gump/gui/images/help.bmp",
- wxBITMAP_TYPE_BMP),
- "Help")
-
- self.frame.toolbar.Realize()
-
- # layout
- self.logsplitter = wxSplitterWindow(self.frame,-1,style=wxSP_NOBORDER )
- self.mainsplit = wxSplitterWindow(self.logsplitter,-1,style=wxSP_NOBORDER)
- split2 = wxSplitterWindow(self.mainsplit,-1,style=wxSP_NOBORDER)
- notebook = wxNotebook(split2, -1, style=wxCLIP_CHILDREN )
-
- #notebook images
- notebookil = wxImageList(16, 16)
- idx_referenced = notebookil.Add(wxImage("gump/gui/images/referenced.bmp").ConvertToBitmap())
- idx_dependencies = notebookil.Add(wxImage("gump/gui/images/dependencies.bmp").ConvertToBitmap())
- idx_prereqs = notebookil.Add(wxImage("gump/gui/images/prereqs.bmp").ConvertToBitmap())
- idx_classpath = notebookil.Add(wxImage("gump/gui/images/classpath.bmp").ConvertToBitmap())
- idx_property = notebookil.Add(wxImage("gump/gui/images/property.bmp").ConvertToBitmap())
- idx_exports = notebookil.Add(wxImage("gump/gui/images/exports.bmp").ConvertToBitmap())
- notebook.AssignImageList(notebookil)
- #self.SetImageList(self.il, wxIMAGE_LIST_SMALL)
-
- # panes
- self.list=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
- self.dependencies=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
- self.prereqs=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
- self.classpath=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
- self.property=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
- self.exports=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
-
- self.data=wxTextCtrl(split2,-1,style=wxTE_MULTILINE)
-
- self.logview=GumpLogView(self.logsplitter)
-
- self.tree=wxTreeCtrl(self.mainsplit,-1)
-
- # attach the panes to the frame
- self.logsplitter.SplitHorizontally(self.mainsplit, self.logview)
- self.mainsplit.SplitVertically(self.tree, split2)
- notebook.AddPage(self.list, 'referenced')
- notebook.SetPageImage(0, idx_referenced)
- notebook.AddPage(self.dependencies, 'dependencies')
- notebook.SetPageImage(1, idx_dependencies)
- notebook.AddPage(self.prereqs, 'prereqs')
- notebook.SetPageImage(2, idx_prereqs)
- notebook.AddPage(self.classpath, 'classpath')
- notebook.SetPageImage(3, idx_classpath)
- notebook.AddPage(self.property, 'property')
- notebook.SetPageImage(4, idx_property)
- notebook.AddPage(self.exports, 'exports')
- notebook.SetPageImage(5, idx_exports)
-
- split2.SplitHorizontally(notebook, self.data)
- self.SetTopWindow(self.frame)
- self.logsplitter.Unsplit(self.logview)
- self.frame.Show(true)
-
- # resize
- self.logsplitter.SetMinimumPaneSize(20)
- self.mainsplit.SetMinimumPaneSize(20)
- split2.SetMinimumPaneSize(20)
- self.logsplitter.SetSashPosition(350,true)
- self.mainsplit.SetSashPosition(250,true)
- split2.SetSashPosition(130)
-
- # wire up the events
- EVT_TREE_SEL_CHANGED(self, self.tree.GetId(), self.selectTree)
-
- EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.selectProject)
- EVT_LIST_ITEM_SELECTED(self, self.dependencies.GetId(), self.selectProject)
- EVT_LIST_ITEM_SELECTED(self, self.prereqs.GetId(), self.selectProject)
-
- EVT_KEY_UP(self, self.OnKeyUp)
-
- EVT_MENU(self, self.menu_BACK, self.backAction)
- EVT_MENU(self, self.menu_UPDATE, self.updateAction )
- EVT_MENU(self, self.menu_GEN, self.genAction )
- EVT_MENU(self, self.menu_RUN, self.runAction )
- EVT_TOOL(self, self.menu_CONSOLE, self.consoleAction)
- # EVT_TOOL(self, 50, self.OnToolClick)
- EVT_MENU(self, self.menu_HELP, self.helpAction)
-
- return true
-
- # list all modules and their projects
- def load(self,files):
-
- #tree images
- treeil = wxImageList(16, 16)
- idx_workspace = treeil.Add(wxImage("gump/gui/images/workspace.bmp").ConvertToBitmap())
- idx_module = treeil.Add(wxImage("gump/gui/images/module.bmp").ConvertToBitmap())
- idx_module_ex = treeil.Add(wxImage("gump/gui/images/module_ex.bmp").ConvertToBitmap())
- idx_project = treeil.Add(wxImage("gump/gui/images/project.bmp").ConvertToBitmap())
- idx_project_ex = treeil.Add(wxImage("gump/gui/images/project_ex.bmp").ConvertToBitmap())
- self.tree.AssignImageList(treeil)
-
- root = self.tree.AddRoot(files[0])
- self.tree.SetItemImage(root, idx_workspace, wx.wxTreeItemIcon_Normal)
- self.tree.SetItemImage(root, idx_workspace, wx.wxTreeItemIcon_Expanded)
- self.tree.SetItemImage(root, idx_workspace, wx.wxTreeItemIcon_SelectedExpanded)
-
- # Load (and complete) the workspace
- self.workspace = (WorkspaceLoader()).load(files[0])
-
- # Build the view tree of modules/projects
- for module in self.workspace.getSortedModules():
- name=module.getName()
- parent=self.mItem[name]=self.tree.AppendItem(root,name)
- self.tree.SetPyData(parent,module)
- self.tree.SetItemImage(parent, idx_module , wx.wxTreeItemIcon_Normal)
- self.tree.SetItemImage(parent, idx_module_ex , wx.wxTreeItemIcon_Expanded)
- self.tree.SetItemImage(parent, idx_module_ex , wx.wxTreeItemIcon_Selected)
- self.tree.SetItemImage(parent, idx_module_ex, wx.wxTreeItemIcon_SelectedExpanded)
- for project in module.getSortedProjects():
- proj=self.pItem[project.getName()]=self.tree.AppendItem(parent,project.getName())
- self.tree.SetPyData(self.pItem[project.name],project)
- self.tree.SetItemImage(proj, idx_project , wx.wxTreeItemIcon_Normal)
- self.tree.SetItemImage(proj, idx_project_ex , wx.wxTreeItemIcon_Selected)
-
- self.tree.Expand(root)
-
- def OnKeyUp(self,event):
- if event.GetKeyCode()==WXK_BACK:
- self.backAction(event)
-
- if event.GetKeyCode()==WXK_F5:
- self.runAction(event)
-
-
- # back action
- def backAction(self,event):
- if len(self.history)>1:
- self.history.pop()
- self.showProject(self.history[-1])
-
- # updates CVS
- def updateAction(self,event):
- print "INUPDATE "
- if self.history[-1]:
- project=self.history[-1].name
- else:
- project='all'
-
- print "INUPDATE " + project
- updateThread(self.workspace,project).Start()
-
- # run the selected project xml gen
- def genAction(self,event):
- genThread(self.workspace).Start()
-
- # run the selected project
- def runAction(self,event):
- if not self.history: return
- project=self.history[-1]
- if not project.ant: return
-
- compileThread(project,self).Start()
-
- # help action
- def helpAction(self,event):
- self.msgbox("TODO")
-
- # help action
- def consoleAction(self,event):
- if self.logsplitter.IsSplit():
- self.logsplitter.Unsplit(self.logview)
- else:
- self.logsplitter.SplitHorizontally(self.mainsplit, self.logview)
- self.logview.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
- self.logview.Show()
-
- # select a single feed and display titles from each item
- def selectTree(self, event):
- project=self.tree.GetPyData(event.GetItem())
- if project and isinstance(project,Project):
- if not self.history or self.history[-1]<>project:
- self.showProject(project)
- self.history.append(project)
-
- def showProject(self,project):
- if self.history: self.history[-1]['xmldata']=self.data.GetValue()
- self.frame.SetTitle(project.name)
-
- # gather a list of projects which reference this project
- self.items=[]
- for dependency in project.getDirectDependees():
- self.items.append(dependency.getOwnerProject().getName())
-
- # display the list, sorted by name
- self.list.DeleteAllItems()
- if not self.list.GetColumn(0):
- self.list.InsertColumn(0, 'Cross Reference')
- self.items.sort()
- for i in range(0,len(self.items)):
- row=self.list.InsertStringItem(i,self.items[i])
- self.list.SetItemData(row,i)
-
- self.list.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
-
- # display the project definition
- self.data.Clear()
- #if project.xmldata:
- # self.data.AppendText(project.xmldata)
- #else:
- # self.data.AppendText(xmlize('project',project))
- # self.data.ShowPosition(0)
-
- self.data.AppendText(project.getXMLData())
- self.data.ShowPosition(0)
-
- # gather a list of project dependencies unrolled to build
- run=GumpSet(self.workspace,project.getName())
- self.build_sequence = run.getProjectSequence()
-
- # display the project dependencies
- self.dependencies.DeleteAllItems()
- if not self.dependencies.GetColumn(0):
- self.dependencies.InsertColumn(0, 'Build sequence')
-
- i=0
- for build in self.build_sequence:
- row=self.dependencies.InsertStringItem(i,build.getName())
- self.dependencies.SetItemData(row,i)
- for jar in build.getJars():
- if jar.path and not os.path.exists(jar.getPath()):
- self.dependencies.SetItemBackgroundColour(row,wxRED)
- i+=1
-
- self.dependencies.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
-
- # display the prereqs
- self.prereqs.DeleteAllItems()
- if not self.prereqs.GetColumn(0):
- self.prereqs.InsertColumn(0, 'Prerequisites')
-
- i=0
- for dependency in project.getDirectDependencies():
- prereq=dependency.getProject()
- #if prereq.ant or prereq.script: continue
- row=self.prereqs.InsertStringItem(i,prereq.getName())
- for jar in prereq.getJars():
- if not os.path.exists(jar.getPath()):
- self.prereqs.SetItemBackgroundColour(row,wxRED)
- i+=1
-
- self.prereqs.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
-
- # display the classpath
- self.classpath.DeleteAllItems()
- if not self.classpath.GetColumn(0):
- self.classpath.InsertColumn(0, 'Path')
-
- (classpath, bootclasspath)=project.getClasspathLists()
- for i in range(0,len(classpath)):
- self.classpath.InsertStringItem(i,classpath[i])
-
- self.classpath.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
-
- # display the properties
- self.property.DeleteAllItems()
- if not self.property.GetColumn(0):
- self.property.InsertColumn(0, 'Name')
- self.property.InsertColumn(1, 'Value')
-
- i=0
- if project.ant:
- for property in self.workspace.property+project.ant.property:
- self.property.InsertStringItem(i,property.name or '')
- self.property.SetStringItem(i,1,property.value or '')
- i=i+1
-
- self.property.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
- self.property.SetColumnWidth(1,wxLIST_AUTOSIZE_USEHEADER)
-
- # display what jars this project produces
- self.exports.DeleteAllItems()
- if not self.exports.GetColumn(0):
- self.exports.InsertColumn(0, 'Exports')
-
- for i in range(0,len(project.jar)):
- jar=project.jar[i].path
- if jar:
- row=self.exports.InsertStringItem(i,jar)
- if not os.path.exists(jar):
- self.exports.SetItemBackgroundColour(row,wxRED)
- else:
- self.msgbox('Invalid element: ' + xmlize('jar',project.jar[i]))
-
- self.exports.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
-
- # show the xml description for a single item
- def selectProject(self, event):
- projname=event.GetEventObject().GetItem(event.GetIndex(),0).GetText()
- project=self.workspace.getProject(projname)
- self.showProject(project)
- self.history.append(project)
-
- # expand the associated module and select the project
- self.tree.Expand(self.mItem[project.module])
- self.tree.SelectItem(self.pItem[project.name])
-
- # make sure that the tree items don't outlive the view
- def unload(self):
- self.mItem.clear()
- self.pItem.clear()
-
- # display a modal dialog box
- def msgbox(self,message,title="Warning"):
- log.error(title + ": "+message)
- if not self.logview.IsShown():
- dlg=wxMessageDialog(None, message, title, wx.wxOK)
- dlg.ShowModal()
- dlg.Destroy()
-
-class ViewHandler(logging.Handler):
-
- view = None
-
- """
- A handler class which logs in this view .
- """
- def __init__(self, logview):
- """
- Initializes the handler
- """
- logging.Handler.__init__(self)
- self.view = logview
-
- def emit(self, record):
- """
- Emit a record.
- """
-
- msg = "%s\n" % self.format(record)
- self.view.add(msg, record)
-
-class GumpSplashScreen(wxSplashScreen):
- def __init__(self):
- bmp = wxImage("gump/gui/images/gump.bmp").ConvertToBitmap()
- wxSplashScreen.__init__(self, bmp,
- wxSPLASH_CENTRE_ON_SCREEN|wxSPLASH_TIMEOUT,
- 4000, None, -1,
- style = wxSIMPLE_BORDER|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP)
- wxYield()
-
-class GumpLogView(wxListCtrl):
-
- def __init__(self, parent):
- wxListCtrl.__init__(self, parent, -1,
- style=wxLC_REPORT|wxLC_VIRTUAL|wxLC_HRULES|wxLC_VRULES)
- self.log = []
- self.logmsg = []
-
- self.il = wxImageList(16, 16)
- self.idx_critical = self.il.Add(wxImage("gump/gui/images/fatal.bmp").ConvertToBitmap())
- self.idx_error = self.il.Add(wxImage("gump/gui/images/error.bmp").ConvertToBitmap())
- self.idx_warning = self.il.Add(wxImage("gump/gui/images/warning.bmp").ConvertToBitmap())
- self.idx_info = self.il.Add(wxImage("gump/gui/images/info.bmp").ConvertToBitmap())
- self.idx_debug = self.il.Add(wxImage("gump/gui/images/debug.bmp").ConvertToBitmap())
- self.SetImageList(self.il, wxIMAGE_LIST_SMALL)
-
- self.attr_critical = wxListItemAttr()
- self.attr_critical.SetBackgroundColour("dark red")
- self.attr_error = wxListItemAttr()
- self.attr_error.SetBackgroundColour("red")
- self.attr_warning = wxListItemAttr()
- self.attr_warning.SetBackgroundColour("yellow")
- self.attr_info = wxListItemAttr()
- self.attr_info.SetBackgroundColour("white")
- self.attr_debug = wxListItemAttr()
- self.attr_debug.SetBackgroundColour("light blue")
-
- self.InsertColumn(0, "Message")
-
- self.SetItemCount(0)
-
- EVT_LIST_ITEM_ACTIVATED(self, self.GetId(), self.OnItemActivated)
-
- def add(self, message, record):
- self.log.insert(0,record)
- self.logmsg.insert(0,message)
- self.SetItemCount(len(self.log))
-
- def OnItemActivated(self, event):
- txt = self.logmsg[event.m_itemIndex]
- title = self.log[event.m_itemIndex].levelname
- dlg=wxMessageDialog(None, txt, title, wx.wxOK)
- dlg.ShowModal()
- dlg.Destroy()
-
- def getColumnText(self, index, col):
- item = self.GetItem(index, col)
- return item.GetText()
-
- #---------------------------------------------------
- # These methods are callbacks for implementing the
- # "virtualness" of the list... It
- # determines the text, attributes and/or image based
- # on values from the data source
-
- #record.name
- #record.msg
- #record.args
- #record.levelname
- #record.levelno
- #record.pathname
- #record.filename
- #record.module
- #record.exc_info
- #record.lineno
- #record.created
- #record.msecs
- #record.relativeCreated
- #record.thread
-
-
- def OnGetItemText(self, item, col):
- return self.logmsg[item].strip()
-
- def OnGetItemImage(self, item):
- currentLogLevel = self.log[item].levelno
- if currentLogLevel == logging.CRITICAL:
- return self.idx_critical
- elif currentLogLevel == logging.ERROR:
- return self.idx_error
- elif currentLogLevel == logging.WARN:
- return self.idx_warning
- if currentLogLevel == logging.INFO:
- return self.idx_info
- elif currentLogLevel == logging.DEBUG:
- return self.idx_debug
- else:
- return None
-
- def OnGetItemAttr(self, item):
- currentLogLevel = self.log[item].levelno
- if currentLogLevel == logging.CRITICAL:
- return self.attr_critical
- elif currentLogLevel == logging.ERROR:
- return self.attr_error
- elif currentLogLevel == logging.WARN:
- return self.attr_warning
- if currentLogLevel == logging.INFO:
- return self.attr_info
- elif currentLogLevel == logging.DEBUG:
- return self.attr_debug
- else:
- return None
-
-class genThread:
- def __init__(self,workspace):
- self.workspace=workspace
- def Start(self):
- self.running = 1
- thread.start_new_thread(self.Run,())
- def Stop(self):
- self.running = 0
- def Run(self):
- f=open( default.merge, 'w')
- try:
- xmlize('workspace',self.workspace,f)
- finally:
- # Since we may exit via an exception, close fp explicitly.
- f.close()
-
-class updateThread:
- def __init__(self,workspace,project):
- self.workspace=workspace
- self.project=project
- def Start(self):
- self.running = 1
- thread.start_new_thread(self.Run,())
- def Stop(self):
- self.running = 0
- def Run(self):
- update(self.workspace,self.project)
-
-class compileThread:
- def __init__(self,project,view):
- self.project=project
- self.view=view
- def Start(self):
- self.running = 1
- thread.start_new_thread(self.Run,())
- def Stop(self):
- self.running = 0
- def Run(self):
- module=Module.list[self.project.module]
-
- os.chdir(os.path.join(module.srcdir,self.project.ant.basedir or ''))
- os.environ['CLASSPATH']=os.pathsep.join(default.classpath+self.project.classpath())
- cmd="java org.apache.tools.ant.Main"
- for property in self.view.workspace.property+self.project.ant.property:
- cmd+=" -D"+property.name+"="+property.value
- if self.project.ant.buildfile: cmd+=" -f "+self.project.ant.buildfile
- if self.project.ant.target: cmd+=" "+self.project.ant.target
-
- (stdout,stdin)=popen2.popen2(cmd + ' 2>&1')
- stdin.close()
- self.view.data.Clear()
- while self.running:
- line = stdout.readline()
- if not line: break
- self.view.data.AppendText(line)
- self.view.showProject(self.project)
-
-if __name__ == '__main__':
-
- # init logging and add specific Gui handler
- logging.config.fileConfig("gump/logconf.ini")
-
- # load app
- app = gumpview(0)
- GumpSplashScreen().Show()
-
- #add app-specific log handler
- logger = logging.getLogger("")
- logger.setLevel(logging.DEBUG)
- lh = ViewHandler(app.logview)
- logger.addHandler(lh)
-
- # loadspecified or default workspace
- (args,options) = handleArgv(sys.argv,0)
- app.load([args[0]])
-
- # start app
- app.MainLoop()
-
- # dipose app
- app.unload()
+#!/usr/bin/env python
+
+# $Header$
+# $Revision$
+# $Date$
+#
+# ====================================================================
+#
+# The Apache Software License, Version 1.1
+#
+# Copyright (c) 2003 The Apache Software Foundation. All rights
+# reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. The end-user documentation included with the redistribution, if
+# any, must include the following acknowlegement:
+# "This product includes software developed by the
+# Apache Software Foundation (http://www.apache.org/)."
+# Alternately, this acknowlegement may appear in the software itself,
+# if and wherever such third-party acknowlegements normally appear.
+#
+# 4. The names "The Jakarta Project", "Alexandria", and "Apache Software
+# Foundation" must not be used to endorse or promote products derived
+# from this software without prior written permission. For written
+# permission, please contact apache@apache.org.
+#
+# 5. Products derived from this software may not be called "Apache"
+# nor may "Apache" appear in their names without prior written
+# permission of the Apache Group.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+# ====================================================================
+#
+# This software consists of voluntary contributions made by many
+# individuals on behalf of the Apache Software Foundation. For more
+# information on the Apache Software Foundation, please see
+# <http://www.apache.org/>.
+
+"""
+ Graphic GUI to navigate a Gump workspace
+"""
+
+import os
+import popen2
+import thread
+import sys
+import logging, logging.config
+
+from xml.sax import parse
+from xml.sax.handler import ContentHandler
+
+# http://wxpython.org/
+from wxPython.wx import *
+
+from gump import log
+from gump.config import dir, default
+from gump.utils.xmlutils import xmlize
+from gump.utils.commandLine import handleArgv
+from gump.model.module import Module
+from gump.model.project import Project
+from gump.model.workspace import Workspace
+from gump.model.loader import WorkspaceLoader
+from gump.engine import GumpEngine
+from gump.gumprun import GumpSet
+
+###############################################################################
+# Initialize
+###############################################################################
+
+###############################################################################
+# Main App
+###############################################################################
+
+class gumpview(wxApp):
+
+ # model
+ mySubs=None
+ items=None
+ build_sequence=None
+ history=[]
+
+ # item IDs:
+ menu_BACK=10001
+ menu_UPDATE=10002
+ menu_GEN=10003
+ menu_RUN=10004
+ menu_CONSOLE=10005
+ menu_HELP=10006
+
+ # view
+ frame=None
+ tree=None
+ list=None
+ data=None
+ logsplitter=None
+ logview=None
+ mainsplit=None
+
+ # action views
+ toolbar=None
+ runbutton=None
+
+ # tree index
+ mItem={}
+ pItem={}
+
+ def OnInit(self):
+
+ # The main frame
+ self.frame = wxFrame(NULL, -1, "Gump Workspace Viewer")
+
+ # Create our toolbar
+ self.frame.toolbar = self.frame.CreateToolBar(wxTB_HORIZONTAL |
+ wxNO_BORDER | wxTB_FLAT )
+
+ self.frame.toolbar.AddSimpleTool(self.menu_BACK,
+ wxBitmap("gump/gui/images/back.bmp",
+ wxBITMAP_TYPE_BMP),
+ "Back")
+
+ self.frame.toolbar.AddSeparator()
+
+ self.frame.toolbar.AddSimpleTool(self.menu_UPDATE,
+ wxBitmap("gump/gui/images/update.bmp",
+ wxBITMAP_TYPE_BMP),
+ "Update from VCS")
+
+ self.frame.toolbar.AddSimpleTool(self.menu_GEN,
+ wxBitmap("gump/gui/images/gen.bmp",
+ wxBITMAP_TYPE_BMP),
+ "Generate XML merged descriptor")
+
+ self.frame.toolbar.AddSimpleTool(self.menu_RUN,
+ wxBitmap("gump/gui/images/run.bmp",
+ wxBITMAP_TYPE_BMP),
+ "Run")
+
+ self.frame.toolbar.AddSeparator()
+
+
+ self.frame.toolbar.AddCheckTool(self.menu_CONSOLE,
+ wxBitmap("gump/gui/images/console.bmp",
+ wxBITMAP_TYPE_BMP),
+ shortHelp="Toggle this")
+
+ self.frame.toolbar.AddSimpleTool(self.menu_HELP,
+ wxBitmap("gump/gui/images/help.bmp",
+ wxBITMAP_TYPE_BMP),
+ "Help")
+
+ self.frame.toolbar.Realize()
+
+ # layout
+ self.logsplitter = wxSplitterWindow(self.frame,-1,style=wxSP_NOBORDER )
+ self.mainsplit = wxSplitterWindow(self.logsplitter,-1,style=wxSP_NOBORDER)
+ split2 = wxSplitterWindow(self.mainsplit,-1,style=wxSP_NOBORDER)
+ notebook = wxNotebook(split2, -1, style=wxCLIP_CHILDREN )
+
+ #notebook images
+ notebookil = wxImageList(16, 16)
+ idx_referenced = notebookil.Add(wxImage("gump/gui/images/referenced.bmp").ConvertToBitmap())
+ idx_dependencies = notebookil.Add(wxImage("gump/gui/images/dependencies.bmp").ConvertToBitmap())
+ idx_prereqs = notebookil.Add(wxImage("gump/gui/images/prereqs.bmp").ConvertToBitmap())
+ idx_classpath = notebookil.Add(wxImage("gump/gui/images/classpath.bmp").ConvertToBitmap())
+ idx_property = notebookil.Add(wxImage("gump/gui/images/property.bmp").ConvertToBitmap())
+ idx_exports = notebookil.Add(wxImage("gump/gui/images/exports.bmp").ConvertToBitmap())
+ notebook.AssignImageList(notebookil)
+ #self.SetImageList(self.il, wxIMAGE_LIST_SMALL)
+
+ # panes
+ self.list=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
+ self.dependencies=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
+ self.prereqs=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
+ self.classpath=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
+ self.property=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
+ self.exports=wxListCtrl(notebook,-1,style=wxLC_REPORT|wxNO_BORDER )
+
+ self.data=wxTextCtrl(split2,-1,style=wxTE_MULTILINE)
+
+ self.logview=GumpLogView(self.logsplitter)
+
+ self.tree=wxTreeCtrl(self.mainsplit,-1)
+
+ # attach the panes to the frame
+ self.logsplitter.SplitHorizontally(self.mainsplit, self.logview)
+ self.mainsplit.SplitVertically(self.tree, split2)
+ notebook.AddPage(self.list, 'referenced')
+ notebook.SetPageImage(0, idx_referenced)
+ notebook.AddPage(self.dependencies, 'dependencies')
+ notebook.SetPageImage(1, idx_dependencies)
+ notebook.AddPage(self.prereqs, 'prereqs')
+ notebook.SetPageImage(2, idx_prereqs)
+ notebook.AddPage(self.classpath, 'classpath')
+ notebook.SetPageImage(3, idx_classpath)
+ notebook.AddPage(self.property, 'property')
+ notebook.SetPageImage(4, idx_property)
+ notebook.AddPage(self.exports, 'exports')
+ notebook.SetPageImage(5, idx_exports)
+
+ split2.SplitHorizontally(notebook, self.data)
+ self.SetTopWindow(self.frame)
+ self.logsplitter.Unsplit(self.logview)
+ self.frame.Show(true)
+
+ # resize
+ self.logsplitter.SetMinimumPaneSize(20)
+ self.mainsplit.SetMinimumPaneSize(20)
+ split2.SetMinimumPaneSize(20)
+ self.logsplitter.SetSashPosition(350,true)
+ self.mainsplit.SetSashPosition(250,true)
+ split2.SetSashPosition(130)
+
+ # wire up the events
+ EVT_TREE_SEL_CHANGED(self, self.tree.GetId(), self.selectTree)
+
+ EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.selectProject)
+ EVT_LIST_ITEM_SELECTED(self, self.dependencies.GetId(), self.selectProject)
+ EVT_LIST_ITEM_SELECTED(self, self.prereqs.GetId(), self.selectProject)
+
+ EVT_KEY_UP(self, self.OnKeyUp)
+
+ EVT_MENU(self, self.menu_BACK, self.backAction)
+ EVT_MENU(self, self.menu_UPDATE, self.updateAction )
+ EVT_MENU(self, self.menu_GEN, self.genAction )
+ EVT_MENU(self, self.menu_RUN, self.runAction )
+ EVT_TOOL(self, self.menu_CONSOLE, self.consoleAction)
+ # EVT_TOOL(self, 50, self.OnToolClick)
+ EVT_MENU(self, self.menu_HELP, self.helpAction)
+
+ return true
+
+ # list all modules and their projects
+ def load(self,files):
+
+ #tree images
+ treeil = wxImageList(16, 16)
+ idx_workspace = treeil.Add(wxImage("gump/gui/images/workspace.bmp").ConvertToBitmap())
+ idx_module = treeil.Add(wxImage("gump/gui/images/module.bmp").ConvertToBitmap())
+ idx_module_ex = treeil.Add(wxImage("gump/gui/images/module_ex.bmp").ConvertToBitmap())
+ idx_project = treeil.Add(wxImage("gump/gui/images/project.bmp").ConvertToBitmap())
+ idx_project_ex = treeil.Add(wxImage("gump/gui/images/project_ex.bmp").ConvertToBitmap())
+ self.tree.AssignImageList(treeil)
+
+ root = self.tree.AddRoot(files[0])
+ self.tree.SetItemImage(root, idx_workspace, wx.wxTreeItemIcon_Normal)
+ self.tree.SetItemImage(root, idx_workspace, wx.wxTreeItemIcon_Expanded)
+ self.tree.SetItemImage(root, idx_workspace, wx.wxTreeItemIcon_SelectedExpanded)
+
+ # Load (and complete) the workspace
+ self.workspace = (WorkspaceLoader()).load(files[0])
+
+ # Build the view tree of modules/projects
+ for module in self.workspace.getSortedModules():
+ name=module.getName()
+ parent=self.mItem[name]=self.tree.AppendItem(root,name)
+ self.tree.SetPyData(parent,module)
+ self.tree.SetItemImage(parent, idx_module , wx.wxTreeItemIcon_Normal)
+ self.tree.SetItemImage(parent, idx_module_ex , wx.wxTreeItemIcon_Expanded)
+ self.tree.SetItemImage(parent, idx_module_ex , wx.wxTreeItemIcon_Selected)
+ self.tree.SetItemImage(parent, idx_module_ex, wx.wxTreeItemIcon_SelectedExpanded)
+ for project in module.getSortedProjects():
+ proj=self.pItem[project.getName()]=self.tree.AppendItem(parent,project.getName())
+ self.tree.SetPyData(self.pItem[project.name],project)
+ self.tree.SetItemImage(proj, idx_project , wx.wxTreeItemIcon_Normal)
+ self.tree.SetItemImage(proj, idx_project_ex , wx.wxTreeItemIcon_Selected)
+
+ self.tree.Expand(root)
+
+ def OnKeyUp(self,event):
+ if event.GetKeyCode()==WXK_BACK:
+ self.backAction(event)
+
+ if event.GetKeyCode()==WXK_F5:
+ self.runAction(event)
+
+
+ # back action
+ def backAction(self,event):
+ if len(self.history)>1:
+ self.history.pop()
+ self.showProject(self.history[-1])
+
+ # updates CVS
+ def updateAction(self,event):
+ print "INUPDATE "
+ if self.history[-1]:
+ project=self.history[-1].name
+ else:
+ project='all'
+
+ print "INUPDATE " + project
+ updateThread(self.workspace,project).Start()
+
+ # run the selected project xml gen
+ def genAction(self,event):
+ genThread(self.workspace).Start()
+
+ # run the selected project
+ def runAction(self,event):
+ if not self.history: return
+ project=self.history[-1]
+ if not project.ant: return
+
+ compileThread(project,self).Start()
+
+ # help action
+ def helpAction(self,event):
+ self.msgbox("TODO")
+
+ # help action
+ def consoleAction(self,event):
+ if self.logsplitter.IsSplit():
+ self.logsplitter.Unsplit(self.logview)
+ else:
+ self.logsplitter.SplitHorizontally(self.mainsplit, self.logview)
+ self.logview.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
+ self.logview.Show()
+
+ # select a single feed and display titles from each item
+ def selectTree(self, event):
+ project=self.tree.GetPyData(event.GetItem())
+ if project and isinstance(project,Project):
+ if not self.history or self.history[-1]<>project:
+ self.showProject(project)
+ self.history.append(project)
+
+ def showProject(self,project):
+ if self.history: self.history[-1]['xmldata']=self.data.GetValue()
+ self.frame.SetTitle(project.name)
+
+ # gather a list of projects which reference this project
+ self.items=[]
+ for dependency in project.getDirectDependees():
+ self.items.append(dependency.getOwnerProject().getName())
+
+ # display the list, sorted by name
+ self.list.DeleteAllItems()
+ if not self.list.GetColumn(0):
+ self.list.InsertColumn(0, 'Cross Reference')
+ self.items.sort()
+ for i in range(0,len(self.items)):
+ row=self.list.InsertStringItem(i,self.items[i])
+ self.list.SetItemData(row,i)
+
+ self.list.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
+
+ # display the project definition
+ self.data.Clear()
+ #if project.xmldata:
+ # self.data.AppendText(project.xmldata)
+ #else:
+ # self.data.AppendText(xmlize('project',project))
+ # self.data.ShowPosition(0)
+
+ self.data.AppendText(project.getXMLData())
+ self.data.ShowPosition(0)
+
+ # gather a list of project dependencies unrolled to build
+ run=GumpSet(self.workspace,project.getName())
+ self.build_sequence = run.getProjectSequence()
+
+ # display the project dependencies
+ self.dependencies.DeleteAllItems()
+ if not self.dependencies.GetColumn(0):
+ self.dependencies.InsertColumn(0, 'Build sequence')
+
+ i=0
+ for build in self.build_sequence:
+ row=self.dependencies.InsertStringItem(i,build.getName())
+ self.dependencies.SetItemData(row,i)
+ for jar in build.getJars():
+ if jar.path and not os.path.exists(jar.getPath()):
+ self.dependencies.SetItemBackgroundColour(row,wxRED)
+ i+=1
+
+ self.dependencies.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
+
+ # display the prereqs
+ self.prereqs.DeleteAllItems()
+ if not self.prereqs.GetColumn(0):
+ self.prereqs.InsertColumn(0, 'Prerequisites')
+
+ i=0
+ for dependency in project.getDirectDependencies():
+ prereq=dependency.getProject()
+ #if prereq.ant or prereq.script: continue
+ row=self.prereqs.InsertStringItem(i,prereq.getName())
+ for jar in prereq.getJars():
+ if not os.path.exists(jar.getPath()):
+ self.prereqs.SetItemBackgroundColour(row,wxRED)
+ i+=1
+
+ self.prereqs.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
+
+ # display the classpath
+ self.classpath.DeleteAllItems()
+ if not self.classpath.GetColumn(0):
+ self.classpath.InsertColumn(0, 'Path')
+
+ (classpath, bootclasspath)=project.getClasspathLists()
+ for i in range(0,len(classpath)):
+ self.classpath.InsertStringItem(i,classpath[i])
+
+ self.classpath.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
+
+ # display the properties
+ self.property.DeleteAllItems()
+ if not self.property.GetColumn(0):
+ self.property.InsertColumn(0, 'Name')
+ self.property.InsertColumn(1, 'Value')
+
+ i=0
+ if project.ant:
+ for property in self.workspace.property+project.ant.property:
+ self.property.InsertStringItem(i,property.name or '')
+ self.property.SetStringItem(i,1,property.value or '')
+ i=i+1
+
+ self.property.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
+ self.property.SetColumnWidth(1,wxLIST_AUTOSIZE_USEHEADER)
+
+ # display what jars this project produces
+ self.exports.DeleteAllItems()
+ if not self.exports.GetColumn(0):
+ self.exports.InsertColumn(0, 'Exports')
+
+ for i in range(0,len(project.jar)):
+ jar=project.jar[i].path
+ if jar:
+ row=self.exports.InsertStringItem(i,jar)
+ if not os.path.exists(jar):
+ self.exports.SetItemBackgroundColour(row,wxRED)
+ else:
+ self.msgbox('Invalid element: ' + xmlize('jar',project.jar[i]))
+
+ self.exports.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER)
+
+ # show the xml description for a single item
+ def selectProject(self, event):
+ projname=event.GetEventObject().GetItem(event.GetIndex(),0).GetText()
+ project=self.workspace.getProject(projname)
+ self.showProject(project)
+ self.history.append(project)
+
+ # expand the associated module and select the project
+ self.tree.Expand(self.mItem[project.module])
+ self.tree.SelectItem(self.pItem[project.name])
+
+ # make sure that the tree items don't outlive the view
+ def unload(self):
+ self.mItem.clear()
+ self.pItem.clear()
+
+ # display a modal dialog box
+ def msgbox(self,message,title="Warning"):
+ log.error(title + ": "+message)
+ if not self.logview.IsShown():
+ dlg=wxMessageDialog(None, message, title, wx.wxOK)
+ dlg.ShowModal()
+ dlg.Destroy()
+
+class ViewHandler(logging.Handler):
+
+ view = None
+
+ """
+ A handler class which logs in this view .
+ """
+ def __init__(self, logview):
+ """
+ Initializes the handler
+ """
+ logging.Handler.__init__(self)
+ self.view = logview
+
+ def emit(self, record):
+ """
+ Emit a record.
+ """
+
+ msg = "%s\n" % self.format(record)
+ self.view.add(msg, record)
+
+class GumpSplashScreen(wxSplashScreen):
+ def __init__(self):
+ bmp = wxImage("gump/gui/images/gump.bmp").ConvertToBitmap()
+ wxSplashScreen.__init__(self, bmp,
+ wxSPLASH_CENTRE_ON_SCREEN|wxSPLASH_TIMEOUT,
+ 4000, None, -1,
+ style = wxSIMPLE_BORDER|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP)
+ wxYield()
+
+class GumpLogView(wxListCtrl):
+
+ def __init__(self, parent):
+ wxListCtrl.__init__(self, parent, -1,
+ style=wxLC_REPORT|wxLC_VIRTUAL|wxLC_HRULES|wxLC_VRULES)
+ self.log = []
+ self.logmsg = []
+
+ self.il = wxImageList(16, 16)
+ self.idx_critical = self.il.Add(wxImage("gump/gui/images/fatal.bmp").ConvertToBitmap())
+ self.idx_error = self.il.Add(wxImage("gump/gui/images/error.bmp").ConvertToBitmap())
+ self.idx_warning = self.il.Add(wxImage("gump/gui/images/warning.bmp").ConvertToBitmap())
+ self.idx_info = self.il.Add(wxImage("gump/gui/images/info.bmp").ConvertToBitmap())
+ self.idx_debug = self.il.Add(wxImage("gump/gui/images/debug.bmp").ConvertToBitmap())
+ self.SetImageList(self.il, wxIMAGE_LIST_SMALL)
+
+ self.attr_critical = wxListItemAttr()
+ self.attr_critical.SetBackgroundColour("dark red")
+ self.attr_error = wxListItemAttr()
+ self.attr_error.SetBackgroundColour("red")
+ self.attr_warning = wxListItemAttr()
+ self.attr_warning.SetBackgroundColour("yellow")
+ self.attr_info = wxListItemAttr()
+ self.attr_info.SetBackgroundColour("white")
+ self.attr_debug = wxListItemAttr()
+ self.attr_debug.SetBackgroundColour("light blue")
+
+ self.InsertColumn(0, "Message")
+
+ self.SetItemCount(0)
+
+ EVT_LIST_ITEM_ACTIVATED(self, self.GetId(), self.OnItemActivated)
+
+ def add(self, message, record):
+ self.log.insert(0,record)
+ self.logmsg.insert(0,message)
+ self.SetItemCount(len(self.log))
+
+ def OnItemActivated(self, event):
+ txt = self.logmsg[event.m_itemIndex]
+ title = self.log[event.m_itemIndex].levelname
+ dlg=wxMessageDialog(None, txt, title, wx.wxOK)
+ dlg.ShowModal()
+ dlg.Destroy()
+
+ def getColumnText(self, index, col):
+ item = self.GetItem(index, col)
+ return item.GetText()
+
+ #---------------------------------------------------
+ # These methods are callbacks for implementing the
+ # "virtualness" of the list... It
+ # determines the text, attributes and/or image based
+ # on values from the data source
+
+ #record.name
+ #record.msg
+ #record.args
+ #record.levelname
+ #record.levelno
+ #record.pathname
+ #record.filename
+ #record.module
+ #record.exc_info
+ #record.lineno
+ #record.created
+ #record.msecs
+ #record.relativeCreated
+ #record.thread
+
+
+ def OnGetItemText(self, item, col):
+ return self.logmsg[item].strip()
+
+ def OnGetItemImage(self, item):
+ currentLogLevel = self.log[item].levelno
+ if currentLogLevel == logging.CRITICAL:
+ return self.idx_critical
+ elif currentLogLevel == logging.ERROR:
+ return self.idx_error
+ elif currentLogLevel == logging.WARN:
+ return self.idx_warning
+ if currentLogLevel == logging.INFO:
+ return self.idx_info
+ elif currentLogLevel == logging.DEBUG:
+ return self.idx_debug
+ else:
+ return None
+
+ def OnGetItemAttr(self, item):
+ currentLogLevel = self.log[item].levelno
+ if currentLogLevel == logging.CRITICAL:
+ return self.attr_critical
+ elif currentLogLevel == logging.ERROR:
+ return self.attr_error
+ elif currentLogLevel == logging.WARN:
+ return self.attr_warning
+ if currentLogLevel == logging.INFO:
+ return self.attr_info
+ elif currentLogLevel == logging.DEBUG:
+ return self.attr_debug
+ else:
+ return None
+
+class genThread:
+ def __init__(self,workspace):
+ self.workspace=workspace
+ def Start(self):
+ self.running = 1
+ thread.start_new_thread(self.Run,())
+ def Stop(self):
+ self.running = 0
+ def Run(self):
+ f=open( default.merge, 'w')
+ try:
+ xmlize('workspace',self.workspace,f)
+ finally:
+ # Since we may exit via an exception, close fp explicitly.
+ f.close()
+
+class updateThread:
+ def __init__(self,workspace,project):
+ self.workspace=workspace
+ self.project=project
+ def Start(self):
+ self.running = 1
+ thread.start_new_thread(self.Run,())
+ def Stop(self):
+ self.running = 0
+ def Run(self):
+ update(self.workspace,self.project)
+
+class compileThread:
+ def __init__(self,project,view):
+ self.project=project
+ self.view=view
+ def Start(self):
+ self.running = 1
+ thread.start_new_thread(self.Run,())
+ def Stop(self):
+ self.running = 0
+ def Run(self):
+ module=Module.list[self.project.module]
+
+ os.chdir(os.path.join(module.srcdir,self.project.ant.basedir or ''))
+ os.environ['CLASSPATH']=os.pathsep.join(default.classpath+self.project.classpath())
+ cmd="java org.apache.tools.ant.Main"
+ for property in self.view.workspace.property+self.project.ant.property:
+ cmd+=" -D"+property.name+"="+property.value
+ if self.project.ant.buildfile: cmd+=" -f "+self.project.ant.buildfile
+ if self.project.ant.target: cmd+=" "+self.project.ant.target
+
+ (stdout,stdin)=popen2.popen2(cmd + ' 2>&1')
+ stdin.close()
+ self.view.data.Clear()
+ while self.running:
+ line = stdout.readline()
+ if not line: break
+ self.view.data.AppendText(line)
+ self.view.showProject(self.project)
+
+if __name__ == '__main__':
+
+ # init logging and add specific Gui handler
+ logging.config.fileConfig("gump/logconf.ini")
+
+ # load app
+ app = gumpview(0)
+ GumpSplashScreen().Show()
+
+ #add app-specific log handler
+ logger = logging.getLogger("")
+ logger.setLevel(logging.DEBUG)
+ lh = ViewHandler(app.logview)
+ logger.addHandler(lh)
+
+ # loadspecified or default workspace
+ (args,options) = handleArgv(sys.argv,0)
+ app.load([args[0]])
+
+ # start app
+ app.MainLoop()
+
+ # dipose app
+ app.unload()
---------------------------------------------------------------------
To unsubscribe, e-mail: general-unsubscribe@gump.apache.org
For additional commands, e-mail: general-help@gump.apache.org