between actions and commands rather than the original hard-coded mapping. Associations specified in the actions.properties file under the "<actionID>.command" property. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268232 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,4 +1,10 @@ | |||
TODO List: | |||
* Implement some for of refid hyperlinking functionality. | |||
* Provide some sort of class path debugging support. | |||
* Eat own dog food more. | |||
* 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. | |||
@@ -24,6 +24,7 @@ | |||
<property name="ant.dist.dir" value="../../../dist/ant"/> | |||
<path id="classpath"> | |||
<pathelement location="${lib.dir}/ant.jar"/> | |||
</path> | |||
<property name="packages" value="org.apache.tools.ant.gui.*"/> | |||
<property name="manifest" value="etc/manifest"/> | |||
@@ -1,3 +1,50 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (C) 2000 The Apache Software Foundation. All rights reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without modifica- | |||
* tion, 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 acknowledgment: "This product includes software | |||
* developed by the Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowledgment may appear in the software itself, if | |||
* and wherever such third-party acknowledgments normally appear. | |||
* | |||
* 4. The names "Ant" 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 name, without prior written permission of the | |||
* Apache Software Foundation. | |||
* | |||
* 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 (INCLU- | |||
* DING, 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/>. | |||
* | |||
*/ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
@@ -54,6 +101,7 @@ | |||
package org.apache.tools.ant.gui; | |||
import org.apache.tools.ant.gui.event.*; | |||
import org.apache.tools.ant.gui.command.Command; | |||
import javax.swing.*; | |||
import java.util.*; | |||
@@ -106,9 +154,7 @@ public class ActionManager { | |||
// For each action we need to add the reverse event trigger | |||
// lookup. | |||
_mapper.addAction(action); | |||
} | |||
} | |||
/** | |||
@@ -212,6 +258,38 @@ public class ActionManager { | |||
return retval; | |||
} | |||
/** | |||
* Get the command assocaited with the Action with the given id. | |||
* | |||
* @param actionID Id of action to get command for. | |||
* @return Command associated with action, or null if none available. | |||
*/ | |||
public Command getActionCommand(String actionID, AppContext context) { | |||
Command retval = null; | |||
AntAction action = (AntAction) _actions.get(actionID); | |||
if(action != null) { | |||
Class clazz = action.getCommandClass(); | |||
if(clazz != null) { | |||
try { | |||
retval = (Command) clazz.newInstance(); | |||
retval.setContext(context); | |||
} | |||
catch(Exception ex) { | |||
// XXX log me. | |||
ex.printStackTrace(); | |||
} | |||
} | |||
} | |||
return retval; | |||
} | |||
/** | |||
* Add tool tip, Mnemonic, etc. | |||
* | |||
* @param button Button to work on. | |||
* @param action Associated action. | |||
*/ | |||
private void addNiceStuff(AbstractButton button, AntAction action) { | |||
// Set the action command so that it is consitent | |||
// no matter what language the display is in. | |||
@@ -76,6 +76,7 @@ public class AntAction extends AbstractAction { | |||
public static final String ENABLE_ON = "enableOn"; | |||
public static final String DISABLE_ON = "disableOn"; | |||
public static final String TOGGLE = "toggle"; | |||
public static final String COMMAND = "command"; | |||
/** Property resources. */ | |||
private ResourceBundle _resources = null; | |||
@@ -127,6 +128,19 @@ public class AntAction extends AbstractAction { | |||
_toggle = Boolean.valueOf(toggle).booleanValue(); | |||
} | |||
// See if there is a command associated with the action. | |||
String command = getString(COMMAND); | |||
if(command != null) { | |||
try { | |||
Class cmd = Class.forName(command); | |||
putValue(COMMAND, cmd); | |||
} | |||
catch(Exception ex) { | |||
// XXX log me. | |||
ex.printStackTrace(); | |||
} | |||
} | |||
// Add an icon if any (which means it'll show up on the tool bar). | |||
String iconName = getString("icon"); | |||
if(iconName != null) { | |||
@@ -290,6 +304,16 @@ public class AntAction extends AbstractAction { | |||
return _toggle; | |||
} | |||
/** | |||
* Get the assciated command class. | |||
* | |||
* @return Command class. | |||
*/ | |||
public Class getCommandClass() { | |||
return (Class) getValue(COMMAND); | |||
} | |||
/** | |||
* Pass the action on to the EventBus. | |||
* | |||
@@ -154,6 +154,16 @@ public class AppContext { | |||
_buildListeners.remove(l); | |||
} | |||
/** | |||
* Determine if the given BuildListener is registered. | |||
* | |||
* @param l Listener to test for. | |||
* @return True if listener has been added, false if unknown. | |||
*/ | |||
public boolean isRegisteredBuildListener(BuildListener l) { | |||
return _buildListeners.contains(l); | |||
} | |||
/** | |||
* Get the set of current build listeners. | |||
* | |||
@@ -114,44 +114,17 @@ class EventResponder { | |||
public boolean eventPosted(EventObject event) { | |||
String command = ((ActionEvent)event).getActionCommand(); | |||
// XXX turn this switch structure into a command | |||
// lookup using an initialized hash table. | |||
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(); | |||
} | |||
else if(command.equals(CloseCmd.ACTION_NAME)) { | |||
new CloseCmd(_context).execute(); | |||
} | |||
else if(command.equals(ExitCmd.ACTION_NAME)) { | |||
new ExitCmd(_context).execute(); | |||
} | |||
else if(command.equals(AboutCmd.ACTION_NAME)) { | |||
new AboutCmd(_context).execute(); | |||
} | |||
else if(command.equals(ChangeLookAndFeelCmd.ACTION_NAME)) { | |||
new ChangeLookAndFeelCmd(_context).execute(); | |||
} | |||
else if(command.equals(ChangeLookAndFeelCmd.ACTION_NAME)) { | |||
new ChangeLookAndFeelCmd(_context).execute(); | |||
} | |||
else if(command.equals(EmacsNotifyCmd.ACTION_NAME)) { | |||
AbstractButton source = (AbstractButton) event.getSource(); | |||
new EmacsNotifyCmd(_context, source.isSelected()).execute(); | |||
Command cmd = | |||
_context.getActions().getActionCommand(command, _context); | |||
if(cmd != null) { | |||
cmd.run(); | |||
return false; | |||
} | |||
else { | |||
// XXX log me. | |||
System.err.println("Unhandled action: " + command); | |||
return true; | |||
} | |||
return true; | |||
} | |||
} | |||
@@ -186,8 +159,8 @@ class EventResponder { | |||
public boolean eventPosted(EventObject event) { | |||
AntEvent e = (AntEvent) event; | |||
Command cmd = e.createDefaultCmd(); | |||
cmd.execute(); | |||
return true; | |||
cmd.run(); | |||
return cmd instanceof NoOpCmd; | |||
} | |||
} | |||
@@ -96,11 +96,13 @@ public class Main { | |||
f.setVisible(true); | |||
// XXX this will change once full command line argument parsing | |||
// is supported. | |||
if(args.length > 0) { | |||
new LoadFileCmd(context, new File(args[0])).execute(); | |||
LoadFileCmd load = new LoadFileCmd(); | |||
load.setFile(new File(args[0])); | |||
load.setContext(context); | |||
load.run(); | |||
} | |||
} | |||
catch(Exception ex) { | |||
@@ -64,25 +64,20 @@ import java.awt.event.WindowEvent; | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class AboutCmd implements Command { | |||
/** Name of the about command. */ | |||
public static final String ACTION_NAME = "about"; | |||
/** Application context. */ | |||
private AppContext _context = null; | |||
public class AboutCmd extends AbstractCommand { | |||
/** | |||
* Standard constructor. | |||
* | |||
* @param window | |||
*/ | |||
public AboutCmd(AppContext context) { | |||
_context = context; | |||
public AboutCmd() { | |||
} | |||
/** | |||
* Show the about box. | |||
* | |||
*/ | |||
public void execute() { | |||
new About(_context); | |||
public void run() { | |||
new About(getContext()); | |||
} | |||
} |
@@ -0,0 +1,99 @@ | |||
/* | |||
* 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; | |||
/** | |||
* Convenience base class for Command implementations. | |||
* | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public abstract class AbstractCommand implements Command { | |||
/** Application context. */ | |||
private AppContext _context = null; | |||
/** | |||
* Default ctor. | |||
* | |||
*/ | |||
protected AbstractCommand() { | |||
} | |||
/** | |||
* Set the application context. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public void setContext(AppContext context) { | |||
_context = context; | |||
} | |||
/** | |||
* Get the application context that was provided to setContext(); | |||
* | |||
* @return Application context. | |||
*/ | |||
protected AppContext getContext() { | |||
return _context; | |||
} | |||
/** | |||
* Run the command. From interface Runnable. | |||
* | |||
*/ | |||
public abstract void run(); | |||
} |
@@ -62,34 +62,28 @@ import org.apache.tools.ant.gui.event.ErrorEvent; | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class BuildCmd implements Command { | |||
/** Name of the action the command maps to. */ | |||
public static final String ACTION_NAME = "startBuild"; | |||
/** The application context */ | |||
private AppContext _context = null; | |||
public class BuildCmd extends AbstractCommand { | |||
/** | |||
* Standard ctor. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public BuildCmd(AppContext context) { | |||
_context = context; | |||
public BuildCmd() { | |||
} | |||
/** | |||
* Start the Ant build. | |||
* | |||
*/ | |||
public void execute() { | |||
ProjectProxy project = _context.getProject(); | |||
public void run() { | |||
ProjectProxy project = getContext().getProject(); | |||
if(project != null) { | |||
try { | |||
project.build(); | |||
} | |||
catch(Throwable ex) { | |||
_context.getEventBus().postEvent(new ErrorEvent(_context, ex)); | |||
getContext().getEventBus().postEvent( | |||
new ErrorEvent(getContext(), ex)); | |||
} | |||
} | |||
} | |||
@@ -60,28 +60,21 @@ import org.apache.tools.ant.gui.ChangeLookAndFeel; | |||
* | |||
* @version $Revision$ | |||
* @author Erik Meade | |||
* @author Simeon Fitch | |||
*/ | |||
public class ChangeLookAndFeelCmd implements Command { | |||
/** Name of the action the command maps to. */ | |||
public static final String ACTION_NAME = "changeLookAndFeel"; | |||
/** The application context */ | |||
private AppContext _context = null; | |||
public class ChangeLookAndFeelCmd extends AbstractCommand { | |||
/** | |||
* Standard ctor. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public ChangeLookAndFeelCmd(AppContext context) { | |||
_context = context; | |||
public ChangeLookAndFeelCmd() { | |||
} | |||
/** | |||
* Successfully do nothing. | |||
* | |||
*/ | |||
public void execute() { | |||
new ChangeLookAndFeel(_context); | |||
public void run() { | |||
new ChangeLookAndFeel(getContext()); | |||
} | |||
} |
@@ -62,28 +62,22 @@ import org.apache.tools.ant.gui.event.ProjectClosedEvent; | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class CloseCmd implements Command { | |||
/** Name of the exit command. */ | |||
public static final String ACTION_NAME = "close"; | |||
/** Application context. */ | |||
private AppContext _context = null; | |||
public class CloseCmd extends AbstractCommand { | |||
/** | |||
* Standard constructor. | |||
* | |||
* @param window | |||
*/ | |||
public CloseCmd(AppContext context) { | |||
_context = context; | |||
public CloseCmd() { | |||
} | |||
/** | |||
* Send a close event to the parent window. | |||
* | |||
*/ | |||
public void execute() { | |||
_context.setProject(null); | |||
_context.getEventBus().postEvent(new ProjectClosedEvent(_context)); | |||
public void run() { | |||
getContext().setProject(null); | |||
getContext().getEventBus().postEvent( | |||
new ProjectClosedEvent(getContext())); | |||
} | |||
} |
@@ -52,13 +52,28 @@ | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.gui.command; | |||
import org.apache.tools.ant.gui.AppContext; | |||
/** | |||
* Interface for commands. Details TBD | |||
* Interface for commands. Implementation needs to have a default ctor. | |||
* Details TBD | |||
* | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public interface Command { | |||
public void execute(); | |||
public interface Command extends Runnable { | |||
/** | |||
* Set the application context. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public void setContext(AppContext context); | |||
/** | |||
* Run the command. From interface Runnable. | |||
* | |||
*/ | |||
public void run(); | |||
} |
@@ -65,25 +65,28 @@ import java.awt.event.ActionEvent; | |||
* @version $Revision$ | |||
* @author Simeon H.K. Fitch | |||
*/ | |||
public class DisplayErrorCmd implements Command { | |||
/** The application context */ | |||
private AppContext _context = null; | |||
public class DisplayErrorCmd extends AbstractCommand { | |||
/** Text description of error. */ | |||
private String _message = null; | |||
/** Throwable associated with the error. */ | |||
private Throwable _ex = null; | |||
/** | |||
* Default ctor. | |||
* | |||
*/ | |||
public DisplayErrorCmd() { | |||
} | |||
/** | |||
* Standard constuctor. | |||
* | |||
* @param context Application context. | |||
* @param message Error message. | |||
* @param ex Throwable assocated with error. | |||
*/ | |||
public DisplayErrorCmd(AppContext context, String message, Throwable ex) { | |||
_context = context; | |||
_message = message; | |||
_ex = ex; | |||
public DisplayErrorCmd(String message, Throwable ex) { | |||
setMessage(message); | |||
setThrowable(_ex); | |||
} | |||
/** | |||
@@ -92,20 +95,38 @@ public class DisplayErrorCmd implements Command { | |||
* @param context Application context. | |||
* @param message Error message. | |||
*/ | |||
public DisplayErrorCmd(AppContext context, String message) { | |||
this(context, message, null); | |||
public DisplayErrorCmd(String message) { | |||
this(message, null); | |||
} | |||
/** | |||
* Set the error message. | |||
* | |||
* @param message Error message. | |||
*/ | |||
public void setMessage(String message) { | |||
_message = message; | |||
} | |||
/** | |||
* Set the throwable associated with the error. | |||
* | |||
* @param ex Throwable associated with the error. | |||
*/ | |||
public void setThrowable(Throwable ex) { | |||
_ex = ex; | |||
} | |||
/** | |||
* Display the error. | |||
* | |||
*/ | |||
public void execute() { | |||
// XXX change this so that exceptions can be optionally shown. | |||
String title = _context.getResources().getString(getClass(), "title"); | |||
public void run() { | |||
String title = getContext().getResources(). | |||
getString(getClass(), "title"); | |||
JOptionPane.showMessageDialog( | |||
_context.getParentFrame(), new MsgPanel(), | |||
getContext().getParentFrame(), new MsgPanel(), | |||
title, JOptionPane.ERROR_MESSAGE); | |||
} | |||
@@ -116,7 +137,7 @@ public class DisplayErrorCmd implements Command { | |||
add(new JLabel(_message)); | |||
if(_ex != null) { | |||
add(new JLabel(_ex.getMessage())); | |||
JButton b = new JButton(_context.getResources(). | |||
JButton b = new JButton(getContext().getResources(). | |||
getString(DisplayErrorCmd.class, | |||
"expand")); | |||
b.addActionListener(this); | |||
@@ -62,39 +62,28 @@ import org.apache.tools.ant.gui.ide.EmacsNotifier; | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class EmacsNotifyCmd implements Command { | |||
/** Action command. */ | |||
public static final String ACTION_NAME = "notifyEmacs"; | |||
public class EmacsNotifyCmd extends AbstractCommand { | |||
/** 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; | |||
public EmacsNotifyCmd() { | |||
} | |||
/** | |||
* Turn on or off the notifying of emacs. | |||
* | |||
*/ | |||
public void execute() { | |||
if(_notify) { | |||
_context.addBuildListener(_notifier); | |||
public void run() { | |||
if(getContext().isRegisteredBuildListener(_notifier)) { | |||
getContext().removeBuildListener(_notifier); | |||
} | |||
else { | |||
_context.removeBuildListener(_notifier); | |||
getContext().addBuildListener(_notifier); | |||
} | |||
} | |||
} |
@@ -65,28 +65,20 @@ import java.awt.event.WindowEvent; | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class ExitCmd implements Command { | |||
/** Name of the exit command. */ | |||
public static final String ACTION_NAME = "exit"; | |||
/** Window to send close event to. */ | |||
private Window _window = null; | |||
public class ExitCmd extends AbstractCommand { | |||
/** | |||
* Standard constructor. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public ExitCmd(AppContext context) { | |||
_window = context.getParentFrame(); | |||
public ExitCmd() { | |||
} | |||
/** | |||
* Send a close event to the parent window. | |||
* | |||
*/ | |||
public void execute() { | |||
public void run() { | |||
// Manually send a window close event to the window. | |||
WindowUtils.sendCloseEvent(_window); | |||
WindowUtils.sendCloseEvent(getContext().getParentFrame()); | |||
} | |||
} |
@@ -64,20 +64,23 @@ import java.io.IOException; | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class LoadFileCmd implements Command { | |||
/** The application context */ | |||
private AppContext _context = null; | |||
public class LoadFileCmd extends AbstractCommand { | |||
/** The file to load. */ | |||
private File _file = null; | |||
/** | |||
* Standard ctor. | |||
* | |||
* @param context Application context. | |||
* @param file The file to load. | |||
*/ | |||
public LoadFileCmd(AppContext context, File file) { | |||
_context = context; | |||
public LoadFileCmd() { | |||
} | |||
/** | |||
* Set the file to load. | |||
* | |||
* @param file File to load. | |||
*/ | |||
public void setFile(File file) { | |||
_file = file; | |||
} | |||
@@ -85,26 +88,26 @@ public class LoadFileCmd implements Command { | |||
* Open the file and load it. | |||
* | |||
*/ | |||
public void execute() { | |||
public void run() { | |||
if(!_file.exists()) { | |||
String message = _context.getResources().getMessage( | |||
String message = getContext().getResources().getMessage( | |||
getClass(), "noFile", new Object[] { _file.toString() }); | |||
_context.getEventBus(). | |||
postEvent(new ErrorEvent(_context, message)); | |||
getContext().getEventBus(). | |||
postEvent(new ErrorEvent(getContext(), message)); | |||
} | |||
else { | |||
try { | |||
ProjectProxy project = new ProjectProxy(_context, _file); | |||
_context.setProject(project); | |||
ProjectProxy project = new ProjectProxy(getContext(), _file); | |||
getContext().setProject(project); | |||
} | |||
catch(Exception ex) { | |||
String message = _context.getResources().getMessage( | |||
String message = getContext().getResources().getMessage( | |||
getClass(), "loadError", | |||
new Object[] { _file.toString() }); | |||
_context.getEventBus(). | |||
postEvent(new ErrorEvent(_context, message, ex)); | |||
getContext().getEventBus(). | |||
postEvent(new ErrorEvent(getContext(), message, ex)); | |||
} | |||
} | |||
} | |||
@@ -59,10 +59,10 @@ package org.apache.tools.ant.gui.command; | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class NoOpCmd implements Command { | |||
public class NoOpCmd extends AbstractCommand { | |||
/** | |||
* Successfully do nothing. | |||
* | |||
*/ | |||
public void execute() {} | |||
public void run() {} | |||
} |
@@ -67,23 +67,12 @@ import java.io.File; | |||
* @version $Revision$ | |||
* @author Simeon Fitch | |||
*/ | |||
public class OpenCmd implements Command { | |||
/** Name of the action the command maps to. */ | |||
public static final String ACTION_NAME = "open"; | |||
/** The application context */ | |||
private AppContext _context = null; | |||
/** Filter for showing only XML files. */ | |||
private FileFilter _filter = null; | |||
public class OpenCmd extends AbstractCommand { | |||
/** | |||
* Standard ctor. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public OpenCmd(AppContext context) { | |||
_context = context; | |||
_filter = new XMLFileFilter(_context.getResources()); | |||
public OpenCmd() { | |||
} | |||
/** | |||
@@ -92,14 +81,16 @@ public class OpenCmd implements Command { | |||
* operation be completed. | |||
* | |||
*/ | |||
public void execute() { | |||
public void run() { | |||
FileFilter filter = new XMLFileFilter(getContext().getResources()); | |||
JFileChooser chooser = new JFileChooser(); | |||
chooser.addChoosableFileFilter(_filter); | |||
int val = chooser.showOpenDialog(_context.getParentFrame()); | |||
chooser.addChoosableFileFilter(filter); | |||
int val = chooser.showOpenDialog(getContext().getParentFrame()); | |||
if(val == JFileChooser.APPROVE_OPTION) { | |||
File selected = chooser.getSelectedFile(); | |||
_context.getEventBus().postEvent( | |||
new OpenRequestEvent(_context, selected)); | |||
getContext().getEventBus().postEvent( | |||
new OpenRequestEvent(getContext(), selected)); | |||
} | |||
} | |||
} |
@@ -53,6 +53,15 @@ | |||
*/ | |||
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; | |||
/** | |||
@@ -61,16 +70,98 @@ import org.apache.tools.ant.gui.AppContext; | |||
* @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"; | |||
public class SaveAsCmd extends AbstractCommand { | |||
/** File to save to. */ | |||
private File _file = null; | |||
/** | |||
* Standard ctor. | |||
* | |||
* @param context Application context. | |||
*/ | |||
public SaveAsCmd(AppContext context) { | |||
super(context, null); | |||
public SaveAsCmd() { | |||
} | |||
/** | |||
* Set the file to save to. | |||
* | |||
* @param file File to save to. | |||
*/ | |||
public void setFile(File file) { | |||
_file = file; | |||
} | |||
/** | |||
* Save the project to the current file name. | |||
* | |||
*/ | |||
public void run() { | |||
FileFilter filter = new XMLFileFilter(getContext().getResources()); | |||
ProjectProxy project = getContext().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( | |||
getContext().getParentFrame()); | |||
if(val == JFileChooser.APPROVE_OPTION) { | |||
_file = chooser.getSelectedFile(); | |||
if(_file.exists()) { | |||
String title = getContext().getResources(). | |||
getString(SaveCmd.class, "title"); | |||
String message = getContext().getResources(). | |||
getMessage(SaveCmd.class, "overwrite", | |||
new Object[] {_file.toString()}); | |||
val = JOptionPane.showConfirmDialog( | |||
getContext().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 = getContext().getResources().getMessage( | |||
SaveCmd.class, "saveError", | |||
new Object[] { _file.toString() }); | |||
getContext().getEventBus(). | |||
postEvent(new ErrorEvent(getContext(), message)); | |||
} | |||
finally { | |||
if (out != null) { | |||
try { | |||
out.flush(); | |||
out.close(); | |||
} | |||
catch(IOException ex) { | |||
// Intentionally ignored. | |||
} | |||
} | |||
} | |||
} | |||
} | |||
else { | |||
// We shouldn't ever get here. | |||
String message = getContext().getResources().getString( | |||
SaveCmd.class, "noProject"); | |||
getContext().getEventBus(). | |||
postEvent(new ErrorEvent(getContext(), message)); | |||
} | |||
} | |||
} |
@@ -53,15 +53,6 @@ | |||
*/ | |||
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. | |||
@@ -69,106 +60,18 @@ import javax.swing.JOptionPane; | |||
* @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"; | |||
public class SaveCmd extends SaveAsCmd { | |||
/** 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; | |||
public SaveCmd() { | |||
} | |||
/** | |||
* 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. | |||
* Set the application context. | |||
* | |||
* @param context Application context. | |||
*/ | |||
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)); | |||
} | |||
public void setContext(AppContext context) { | |||
super.setContext(context); | |||
setFile(context.getProject().getFile()); | |||
} | |||
} |
@@ -81,7 +81,7 @@ public abstract class AntEvent extends EventObject { | |||
* | |||
* @return Application context. | |||
*/ | |||
protected AppContext getAppContext() { | |||
protected AppContext getContext() { | |||
return (AppContext) getSource(); | |||
} | |||
@@ -109,7 +109,9 @@ public class ErrorEvent extends AntEvent { | |||
* @return Command representing an appropriate response to this event. | |||
*/ | |||
public Command createDefaultCmd() { | |||
return new DisplayErrorCmd(getAppContext(), _message, _ex); | |||
Command retval = new DisplayErrorCmd(_message, _ex); | |||
retval.setContext(getContext()); | |||
return retval; | |||
} | |||
/** | |||
@@ -85,7 +85,10 @@ public class OpenRequestEvent extends AntEvent { | |||
* @return Load command. | |||
*/ | |||
public Command createDefaultCmd() { | |||
return new LoadFileCmd(getAppContext(), _file); | |||
LoadFileCmd load = new LoadFileCmd(); | |||
load.setFile(_file); | |||
load.setContext(getContext()); | |||
return load; | |||
} | |||
} | |||
@@ -14,12 +14,14 @@ open.parentMenuName=File | |||
open.icon=open.gif | |||
open.accelerator=control O | |||
open.enabled=true | |||
open.command=org.apache.tools.ant.gui.command.OpenCmd | |||
save.name=Save | |||
save.shortDescription=Save the current project | |||
save.parentMenuName=File | |||
save.icon=save.gif | |||
save.accelerator=control S | |||
save.command=org.apache.tools.ant.gui.command.SaveCmd | |||
save.enabled=false | |||
save.disableOn= \ | |||
org.apache.tools.ant.gui.event.ProjectClosedEvent, \ | |||
@@ -31,6 +33,7 @@ save.enableOn= \ | |||
saveas.name=Save As... | |||
saveas.shortDescription=Save to a specific file | |||
saveas.parentMenuName=File | |||
saveas.command=org.apache.tools.ant.gui.command.SaveAsCmd | |||
saveas.enabled=false | |||
saveas.disableOn= \ | |||
org.apache.tools.ant.gui.event.ProjectClosedEvent, \ | |||
@@ -42,6 +45,7 @@ saveas.enableOn= \ | |||
close.name=Close | |||
close.shortDescription=Close the current project | |||
close.parentMenuName=File | |||
close.command=org.apache.tools.ant.gui.command.CloseCmd | |||
close.enabled=false | |||
close.disableOn= \ | |||
org.apache.tools.ant.gui.event.ProjectClosedEvent, \ | |||
@@ -54,6 +58,7 @@ exit.name=Exit | |||
exit.shortDescription=Quit the application | |||
exit.parentMenuName=File | |||
exit.separator=true | |||
exit.command=org.apache.tools.ant.gui.command.ExitCmd | |||
exit.enabled=true | |||
about.name=About... | |||
@@ -61,6 +66,7 @@ about.shortDescription=About this application | |||
about.parentMenuName=Help | |||
about.separator=true; | |||
about.enabled=true | |||
about.command=org.apache.tools.ant.gui.command.AboutCmd | |||
startBuild.name=Start Build | |||
startBuild.shortDescription=Start build of selected target | |||
@@ -68,6 +74,7 @@ startBuild.parentMenuName=Build | |||
startBuild.icon=start.gif | |||
startBuild.separator=true | |||
startBuild.accelerator=control B | |||
startBuild.command=org.apache.tools.ant.gui.command.BuildCmd | |||
startBuild.enabled=false | |||
startBuild.enableOn=\ | |||
org.apache.tools.ant.gui.event.NewProjectEvent, \ | |||
@@ -90,6 +97,7 @@ stopBuild.disableOn=\ | |||
changeLookAndFeel.name=Look and Feel... | |||
changeLookAndFeel.shortDescription=Change the Look and Feel | |||
changeLookAndFeel.parentMenuName=Options | |||
changeLookAndFeel.command=org.apache.tools.ant.gui.command.ChangeLookAndFeelCmd | |||
changeLookAndFeel.enabled=true | |||
changeLookAndFeel.separator=true | |||
@@ -98,3 +106,4 @@ notifyEmacs.shortDescription=\ | |||
Send a notification event to Emacs on build errors. | |||
notifyEmacs.parentMenuName=Options | |||
notifyEmacs.toggle=true | |||
notifyEmacs.command=org.apache.tools.ant.gui.command.EmacsNotifyCmd |