diff --git a/src/antidote/TODO b/src/antidote/TODO index beec3ee52..52165c104 100644 --- a/src/antidote/TODO +++ b/src/antidote/TODO @@ -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. - diff --git a/src/antidote/org/apache/tools/ant/gui/About.java b/src/antidote/org/apache/tools/ant/gui/About.java index ddb8b0984..3b63bbf52 100644 --- a/src/antidote/org/apache/tools/ant/gui/About.java +++ b/src/antidote/org/apache/tools/ant/gui/About.java @@ -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("

\n"); + buf.append("
\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. diff --git a/src/antidote/org/apache/tools/ant/gui/EventResponder.java b/src/antidote/org/apache/tools/ant/gui/EventResponder.java index 82d6206be..b9102f61f 100644 --- a/src/antidote/org/apache/tools/ant/gui/EventResponder.java +++ b/src/antidote/org/apache/tools/ant/gui/EventResponder.java @@ -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(); } diff --git a/src/antidote/org/apache/tools/ant/gui/ProjectProxy.java b/src/antidote/org/apache/tools/ant/gui/ProjectProxy.java index d58d40af2..0435f15c7 100644 --- a/src/antidote/org/apache/tools/ant/gui/ProjectProxy.java +++ b/src/antidote/org/apache/tools/ant/gui/ProjectProxy.java @@ -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. * diff --git a/src/antidote/org/apache/tools/ant/gui/command/EmacsNotifyCmd.java b/src/antidote/org/apache/tools/ant/gui/command/EmacsNotifyCmd.java new file mode 100644 index 000000000..9b532581c --- /dev/null +++ b/src/antidote/org/apache/tools/ant/gui/command/EmacsNotifyCmd.java @@ -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 + * . + */ +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); + } + + } +} diff --git a/src/antidote/org/apache/tools/ant/gui/command/OpenCmd.java b/src/antidote/org/apache/tools/ant/gui/command/OpenCmd.java index a06f9f379..40a6da6b7 100644 --- a/src/antidote/org/apache/tools/ant/gui/command/OpenCmd.java +++ b/src/antidote/org/apache/tools/ant/gui/command/OpenCmd.java @@ -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()); diff --git a/src/antidote/org/apache/tools/ant/gui/command/SaveAsCmd.java b/src/antidote/org/apache/tools/ant/gui/command/SaveAsCmd.java new file mode 100644 index 000000000..85f95a47c --- /dev/null +++ b/src/antidote/org/apache/tools/ant/gui/command/SaveAsCmd.java @@ -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 + * . + */ +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); + } +} diff --git a/src/antidote/org/apache/tools/ant/gui/command/SaveCmd.java b/src/antidote/org/apache/tools/ant/gui/command/SaveCmd.java new file mode 100644 index 000000000..bd476a498 --- /dev/null +++ b/src/antidote/org/apache/tools/ant/gui/command/SaveCmd.java @@ -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 + * . + */ +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)); + + } + } +} diff --git a/src/antidote/org/apache/tools/ant/gui/resources/action.properties b/src/antidote/org/apache/tools/ant/gui/resources/action.properties index 8577988fa..97b85446d 100644 --- a/src/antidote/org/apache/tools/ant/gui/resources/action.properties +++ b/src/antidote/org/apache/tools/ant/gui/resources/action.properties @@ -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 diff --git a/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties b/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties index c36e3060e..4d08defc8 100644 --- a/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties +++ b/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties @@ -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=\

Antidote

\ -

Copyright © 2000 The Apache Software Foundation.

\ -

All rights reserved.

\ +

Copyright © 2000 The Apache Software Foundation.
\ + All rights reserved.


\ +

Visit http://jakarta.apache.org/ant for more information.


\ \ \ \ @@ -49,8 +55,8 @@ org.apache.tools.ant.gui.About.message=\ \
Version:{0}
Date:{1}
{2}
\
\ -

Icons Copyright © 1998 Dean S. Jones (deansjones@hotmail.com)

\ -

http://jfa.javalobby.org/projects/icons

\ +

Icons Copyright © 1998 Dean S. Jones (deansjones@hotmail.com)
\ + http://jfa.javalobby.org/projects/icons

\