git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268196 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,7 +1,34 @@ | |||
TODO List: | |||
* Dispatch tree node change events when the properties editor changes a | |||
node value. This will make sure that the node gets displayed correctly in | |||
the project navigator. | |||
* Implement a custom tree node renderer with better icons. | |||
* Implement a build progress reporter. | |||
* Add "syntax" colorization to the console window, with a preferences | |||
editor for setting up the styles. | |||
* Rework EventResponder to remove hard coded command translation. | |||
* Figure out an approach to gracefully stopping a running build. | |||
* Add error handler for SAX parser to better report loading errors. | |||
* Create an error dialog that is able to display a stack backtrace if | |||
desired. | |||
* Add support to ActionManager to handle toggle actions in tool bar. Also | |||
need a better way of detecting the selected state of the action button. | |||
* Project properties viewer, including the ability to view | |||
dependencies (local and cascading). | |||
* Acquire or implement a logging facility. | |||
(pending Ant 2.0) | |||
* Need Ant API access to: | |||
- Tasks within a Target | |||
- The topo sorted task list to get flattened dependencies | |||
@@ -12,10 +39,3 @@ TODO List: | |||
* Better define the data model architecture, and how it interfaces | |||
with the Ant data model. | |||
* Project properties viewer, including the ability to view | |||
dependencies (local and cascading). | |||
* Acquire or implement a logging facility. | |||
* Build launching capability. | |||
@@ -58,6 +58,7 @@ import javax.swing.*; | |||
import java.io.IOException; | |||
import java.util.*; | |||
import java.awt.BorderLayout; | |||
import java.awt.Dimension; | |||
import java.awt.event.ActionListener; | |||
import java.awt.event.ActionEvent; | |||
@@ -104,7 +105,7 @@ public class About extends JDialog { | |||
while(tok.hasMoreTokens()) { | |||
String name = tok.nextToken(); | |||
buf.append(name); | |||
buf.append("<P>\n"); | |||
buf.append("<br>\n"); | |||
} | |||
String message = context.getResources().getMessage( | |||
@@ -115,7 +116,14 @@ public class About extends JDialog { | |||
getClass(), "title"); | |||
setTitle(title); | |||
JLabel contents = new JLabel(message); | |||
JTextPane contents = new JTextPane(); | |||
contents.setContentType("text/html"); | |||
contents.setText(message); | |||
contents.setEditable(false); | |||
// XXX Still not sure why this is necessary. JTextPane doesn't | |||
// seem to report a "true" preferred size. | |||
contents.setPreferredSize( | |||
new Dimension(contents.getPreferredSize().width, 450)); | |||
getContentPane().add(BorderLayout.CENTER, contents); | |||
// Add the OK button. | |||
@@ -119,6 +119,12 @@ class EventResponder { | |||
if(command.equals(OpenCmd.ACTION_NAME)) { | |||
new OpenCmd(_context).execute(); | |||
} | |||
else if(command.equals(SaveCmd.ACTION_NAME)) { | |||
new SaveCmd(_context).execute(); | |||
} | |||
else if(command.equals(SaveAsCmd.ACTION_NAME)) { | |||
new SaveAsCmd(_context).execute(); | |||
} | |||
else if(command.equals(BuildCmd.ACTION_NAME)) { | |||
new BuildCmd(_context).execute(); | |||
} | |||
@@ -56,6 +56,7 @@ import org.apache.tools.ant.*; | |||
import org.apache.tools.ant.gui.event.*; | |||
import org.apache.tools.ant.gui.acs.*; | |||
import java.io.File; | |||
import java.io.Writer; | |||
import java.io.IOException; | |||
import javax.swing.tree.TreeModel; | |||
import javax.swing.text.Document; | |||
@@ -95,7 +96,6 @@ public class ProjectProxy { | |||
_file = file; | |||
_context = context; | |||
loadProject(); | |||
} | |||
/** | |||
@@ -108,6 +108,17 @@ public class ProjectProxy { | |||
_selections.addTreeSelectionListener(new SelectionForwarder()); | |||
} | |||
/** | |||
* Write the project in XML format to the given output. | |||
* | |||
* @param out Output to write to. | |||
*/ | |||
public void write(Writer out) throws IOException { | |||
if(_project == null) return; | |||
_project.write(out); | |||
} | |||
/** | |||
* Build the project with the current target (or the default target | |||
* if none is selected. Build occurs on a separate thread, so method | |||
@@ -144,6 +155,16 @@ public class ProjectProxy { | |||
return _file; | |||
} | |||
/** | |||
* Set the file that this is to be saved to. | |||
* | |||
* @param file File to save to. | |||
*/ | |||
public void setFile(File file) { | |||
_file = file; | |||
} | |||
/** | |||
* Get the TreeModel perspective on the data. | |||
* | |||
@@ -0,0 +1,100 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999, 2000 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", "Tomcat", 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/>. | |||
*/ | |||
package org.apache.tools.ant.gui.command; | |||
import org.apache.tools.ant.gui.AppContext; | |||
import org.apache.tools.ant.gui.ide.EmacsNotifier; | |||
/** | |||
* Toggle on or off the sending of error events to emacs so that | |||
* it can display the source of the error. | |||
* | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class EmacsNotifyCmd implements Command { | |||
/** Action command. */ | |||
public static final String ACTION_NAME = "notifyEmacs"; | |||
/** A global notifier can be used as it stores no state. */ | |||
private static EmacsNotifier _notifier = new EmacsNotifier(); | |||
/** Application context. */ | |||
private AppContext _context = null; | |||
/** State notification should be in. */ | |||
private boolean _notify = false; | |||
/** | |||
* Standard ctor. | |||
* | |||
* @param context Application context. | |||
* @param state True if notifying on, false for notifying off. | |||
*/ | |||
public EmacsNotifyCmd(AppContext context, boolean state) { | |||
_context = context; | |||
_notify = state; | |||
} | |||
/** | |||
* Turn on or off the notifying of emacs. | |||
* | |||
*/ | |||
public void execute() { | |||
if(_notify) { | |||
_context.addBuildListener(_notifier); | |||
} | |||
else { | |||
_context.removeBuildListener(_notifier); | |||
} | |||
} | |||
} |
@@ -73,7 +73,7 @@ public class OpenCmd implements Command { | |||
/** The application context */ | |||
private AppContext _context = null; | |||
/** Filter for showing only XML file.s */ | |||
/** Filter for showing only XML files. */ | |||
private FileFilter _filter = null; | |||
/** | |||
@@ -93,7 +93,6 @@ public class OpenCmd implements Command { | |||
* | |||
*/ | |||
public void execute() { | |||
// XXX need to set chooser text based on ResourceManager values. | |||
JFileChooser chooser = new JFileChooser(); | |||
chooser.addChoosableFileFilter(_filter); | |||
int val = chooser.showOpenDialog(_context.getParentFrame()); | |||
@@ -0,0 +1,76 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999, 2000 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", "Tomcat", 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/>. | |||
*/ | |||
package org.apache.tools.ant.gui.command; | |||
import org.apache.tools.ant.gui.AppContext; | |||
/** | |||
* Command for doing a "Save as" type of save. | |||
* | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class SaveAsCmd extends SaveCmd { | |||
/** Name of the action the command maps to. */ | |||
public static final String ACTION_NAME = "saveas"; | |||
/** | |||
* Standard ctor. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public SaveAsCmd(AppContext context) { | |||
super(context, null); | |||
} | |||
} |
@@ -0,0 +1,174 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999, 2000 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", "Tomcat", 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/>. | |||
*/ | |||
package org.apache.tools.ant.gui.command; | |||
import org.apache.tools.ant.gui.AppContext; | |||
import org.apache.tools.ant.gui.ProjectProxy; | |||
import org.apache.tools.ant.gui.event.ErrorEvent; | |||
import java.io.File; | |||
import java.io.FileWriter; | |||
import java.io.IOException; | |||
import org.apache.tools.ant.gui.XMLFileFilter; | |||
import javax.swing.JFileChooser; | |||
import javax.swing.filechooser.FileFilter; | |||
import javax.swing.JOptionPane; | |||
/** | |||
* Command to execute the saving of the current build file. | |||
* | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class SaveCmd implements Command { | |||
/** Name of the action the command maps to. */ | |||
public static final String ACTION_NAME = "save"; | |||
/** The application context */ | |||
private AppContext _context = null; | |||
/** Filter for showing only XML files. */ | |||
private FileFilter _filter = null; | |||
/** File to save to. */ | |||
private File _file = null; | |||
/** | |||
* Standard ctor with file. | |||
* | |||
* @param context Application context. | |||
* @param file File to save to, or null. | |||
*/ | |||
public SaveCmd(AppContext context, File file) { | |||
_context = context; | |||
_filter = new XMLFileFilter(_context.getResources()); | |||
_file = file; | |||
} | |||
/** | |||
* Standard ctor. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public SaveCmd(AppContext context) { | |||
this(context, context.getProject() == null ? null : | |||
context.getProject().getFile()); | |||
} | |||
/** | |||
* Save the project to the current file name. | |||
* | |||
*/ | |||
public void execute() { | |||
ProjectProxy project = _context.getProject(); | |||
if(project != null) { | |||
if(_file == null) { | |||
// XXX code here to select a file to save to. | |||
JFileChooser chooser = new JFileChooser(); | |||
chooser.addChoosableFileFilter(_filter); | |||
int val = chooser.showSaveDialog(_context.getParentFrame()); | |||
if(val == JFileChooser.APPROVE_OPTION) { | |||
_file = chooser.getSelectedFile(); | |||
if(_file.exists()) { | |||
String title = _context.getResources().getString( | |||
SaveCmd.class, "title"); | |||
String message = _context.getResources().getMessage( | |||
SaveCmd.class, "overwrite", | |||
new Object[] {_file.toString()}); | |||
val = JOptionPane.showConfirmDialog( | |||
_context.getParentFrame(), message, title, | |||
JOptionPane.YES_NO_OPTION); | |||
// If cancelled unset file. | |||
if(val != JOptionPane.YES_OPTION) { | |||
_file = null; | |||
} | |||
} | |||
} | |||
} | |||
if(_file != null) { | |||
project.setFile(_file); | |||
FileWriter out = null; | |||
try { | |||
out = new FileWriter(_file); | |||
project.write(out); | |||
} | |||
catch(IOException ex) { | |||
String message = _context.getResources().getMessage( | |||
SaveCmd.class, "saveError", | |||
new Object[] { _file.toString() }); | |||
_context.getEventBus(). | |||
postEvent(new ErrorEvent(_context, message)); | |||
} | |||
finally { | |||
if (out != null) { | |||
try { | |||
out.flush(); | |||
out.close(); | |||
} | |||
catch(IOException ex) { | |||
// Intentionally ignored. | |||
} | |||
} | |||
} | |||
} | |||
} | |||
else { | |||
// We shouldn't ever get here. | |||
String message = _context.getResources().getString( | |||
SaveCmd.class, "noProject"); | |||
_context.getEventBus(). | |||
postEvent(new ErrorEvent(_context, message)); | |||
} | |||
} | |||
} |
@@ -3,12 +3,12 @@ menus=File, Build, Options, Help | |||
# Declare the list of known actions. | |||
actions=\ | |||
open, save, close, exit, about, startBuild, stopBuild, \ | |||
open, save, saveas, close, exit, about, startBuild, stopBuild, \ | |||
notifyEmacs, changeLookAndFeel | |||
# Configure the decalred actions. | |||
open.name=Open | |||
open.name=Open... | |||
open.shortDescription=Open an existing project | |||
open.parentMenuName=File | |||
open.icon=open.gif | |||
@@ -21,6 +21,23 @@ save.parentMenuName=File | |||
save.icon=save.gif | |||
save.accelerator=control S | |||
save.enabled=false | |||
save.disableOn= \ | |||
org.apache.tools.ant.gui.event.ProjectClosedEvent, \ | |||
org.apache.tools.ant.gui.event.BuildStartedEvent | |||
save.enableOn= \ | |||
org.apache.tools.ant.gui.event.NewProjectEvent, \ | |||
org.apache.tools.ant.gui.event.BuildFinishedEvent | |||
saveas.name=Save As... | |||
saveas.shortDescription=Save to a specific file | |||
saveas.parentMenuName=File | |||
saveas.enabled=false | |||
saveas.disableOn= \ | |||
org.apache.tools.ant.gui.event.ProjectClosedEvent, \ | |||
org.apache.tools.ant.gui.event.BuildStartedEvent | |||
saveas.enableOn= \ | |||
org.apache.tools.ant.gui.event.NewProjectEvent, \ | |||
org.apache.tools.ant.gui.event.BuildFinishedEvent | |||
close.name=Close | |||
close.shortDescription=Close the current project | |||
@@ -39,13 +56,13 @@ exit.parentMenuName=File | |||
exit.separator=true | |||
exit.enabled=true | |||
about.name=About | |||
about.name=About... | |||
about.shortDescription=About this application | |||
about.parentMenuName=Help | |||
about.separator=true; | |||
about.enabled=true | |||
startBuild.name=Start | |||
startBuild.name=Start Build | |||
startBuild.shortDescription=Start build of selected target | |||
startBuild.parentMenuName=Build | |||
startBuild.icon=start.gif | |||
@@ -59,7 +76,7 @@ startBuild.disableOn=\ | |||
org.apache.tools.ant.gui.event.BuildStartedEvent, \ | |||
org.apache.tools.ant.gui.event.ProjectClosedEvent | |||
stopBuild.name=Stop | |||
stopBuild.name=Stop Build | |||
stopBuild.shortDescription=Stop the current build | |||
stopBuild.parentMenuName=Build | |||
stopBuild.icon=stop.gif | |||
@@ -36,12 +36,18 @@ org.apache.tools.ant.gui.command.LoadFileCmd.noFile=The file "{0}" was not found | |||
org.apache.tools.ant.gui.command.LoadFileCmd.loadError=The file "{0}" could not be loaded. | |||
org.apache.tools.ant.gui.command.DisplayErrorCmd.title=Error... | |||
org.apache.tools.ant.gui.command.SaveCmd.saveError=Could not save to "{0}". | |||
org.apache.tools.ant.gui.command.SaveCmd.noProject=No project to save. | |||
org.apache.tools.ant.gui.command.SaveCmd.title=Overwrite? | |||
org.apache.tools.ant.gui.command.SaveCmd.overwrite=Overwrite file "{0}"? | |||
org.apache.tools.ant.gui.About.title=About | |||
org.apache.tools.ant.gui.About.ok=OK | |||
org.apache.tools.ant.gui.About.message=\ | |||
<html><h1>Antidote</h1> \ | |||
<p>Copyright © 2000 The Apache Software Foundation.</p> \ | |||
<p>All rights reserved.</p> \ | |||
<p>Copyright © 2000 The Apache Software Foundation. <br>\ | |||
All rights reserved.</p><br> \ | |||
<p>Visit http://jakarta.apache.org/ant for more information.</p><br> \ | |||
<table> \ | |||
<tr><td align="right"><b>Version</b>:</td><td>{0}</td></tr> \ | |||
<tr><td align="right"><b>Date</b>:</td><td>{1}</td></tr> \ | |||
@@ -49,8 +55,8 @@ org.apache.tools.ant.gui.About.message=\ | |||
<td>{2}</td></tr> \ | |||
</table> \ | |||
<hr> \ | |||
<p>Icons Copyright © 1998 Dean S. Jones (deansjones@hotmail.com)</p> \ | |||
<p>http://jfa.javalobby.org/projects/icons</p> \ | |||
<p>Icons Copyright © 1998 Dean S. Jones (deansjones@hotmail.com)<br> \ | |||
http://jfa.javalobby.org/projects/icons</p> \ | |||
</html> | |||