actions. As specific events are fired in the GUI the enabled state is updated for specific actions. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268185 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,3 +1,28 @@ | |||
| 2000-11-14 Simeon H.K. Fitch <simeon@fitch.net> | |||
| * org/apache/tools/ant/gui/Antidote.java: Added top area widget, | |||
| which is *not* managed inside a split pane. | |||
| * org/apache/tools/ant/gui/ProjectNavigator.java: Added minimum | |||
| size to keep resizing of parent from hiding widget. | |||
| * org/apache/tools/ant/gui/ActionManager.java: Large functionality | |||
| addtion for allowing action enabled/disabled state to be defined | |||
| in the configuration file. The triggering of state changes is | |||
| based on the firing of specific events. | |||
| * org/apache/tools/ant/gui/AntAction.java: Broke out from inner | |||
| class of ActionManager to its own self (I'm my own man!). | |||
| * org/apache/tools/ant/gui/command/CloseCmd.java: Added firing of | |||
| ProjectClosedEvent so state updates could occur. | |||
| * org/apache/tools/ant/gui/resources/action.properties: Added | |||
| enabledOn and disabledOn event specifications. | |||
| * org/apache/tools/ant/gui/Console.java: Improved reporting level | |||
| handling (some events weren't getting reported). | |||
| 2000-11-10 Simeon H.K. Fitch <simeon@fitch.net> | |||
| * org/apache/tools/ant/gui/PropertyEditor.java: Added new | |||
| @@ -55,10 +55,7 @@ package org.apache.tools.ant.gui; | |||
| import org.apache.tools.ant.gui.event.*; | |||
| import javax.swing.*; | |||
| import java.awt.event.ActionEvent; | |||
| import java.awt.event.ActionListener; | |||
| import java.util.*; | |||
| import java.net.URL; | |||
| /** | |||
| * Manager of antidote actions. Receives its configuration from the action | |||
| @@ -80,6 +77,10 @@ public class ActionManager { | |||
| /** Event bus. */ | |||
| private EventBus _bus = null; | |||
| /** Class for storing the event type to action type | |||
| * mapping for setting enabled state. */ | |||
| private EventToActionMapper _mapper = null; | |||
| /** | |||
| * Standard ctor. | |||
| @@ -88,6 +89,9 @@ public class ActionManager { | |||
| */ | |||
| public ActionManager(EventBus bus) { | |||
| _bus = bus; | |||
| bus.addMember(EventBus.RESPONDING, new Enabler()); | |||
| _mapper = new EventToActionMapper(); | |||
| // Configure the set of actions. | |||
| String toTok = _resources.getString("actions"); | |||
| @@ -95,8 +99,16 @@ public class ActionManager { | |||
| _actionIDs = new String[tok.countTokens()]; | |||
| for(int i = 0; i < _actionIDs.length; i++) { | |||
| _actionIDs[i] = tok.nextToken(); | |||
| _actions.put(_actionIDs[i], new AntAction(_actionIDs[i])); | |||
| AntAction action = new AntAction(_resources, _bus, _actionIDs[i]); | |||
| _actions.put(_actionIDs[i], action); | |||
| // For each action we need to add the reverse event trigger | |||
| // lookup. | |||
| _mapper.addAction(action); | |||
| } | |||
| } | |||
| /** | |||
| @@ -204,137 +216,44 @@ public class ActionManager { | |||
| } | |||
| } | |||
| /** | |||
| * Convenience method for looking put a resource with the name | |||
| * "id.key". Will return null if the resource doesn't exist. | |||
| * | |||
| * @param id Action id. | |||
| * @param key Key name for the action. | |||
| * @return String resource for composite key, or null if not found. | |||
| */ | |||
| private String getString(String id, String key) { | |||
| String retval = null; | |||
| try { | |||
| retval = _resources.getString(id + "." + key); | |||
| } | |||
| catch(MissingResourceException ex) { | |||
| // Its ok to be missing a resource name... | |||
| // Too bad the API throws an exception in this case. | |||
| } | |||
| return retval; | |||
| } | |||
| /** Class representing an action in the Antidote application. */ | |||
| private class AntAction extends AbstractAction { | |||
| /** Property name for the parent menu item. */ | |||
| public static final String PARENT_MENU_NAME = "parentMenuName"; | |||
| public static final String SEPARATOR = "separator"; | |||
| public static final String ACCELERATOR = "accelerator"; | |||
| /** Unique id. */ | |||
| private String _id = null; | |||
| /** Class for updating the enabled status of icons based | |||
| * on the events seen. */ | |||
| private class Enabler implements BusMember { | |||
| private final Filter _filter = new Filter(); | |||
| /** | |||
| * Standard ctor. | |||
| * Get the filter to that is used to determine if an event should | |||
| * to to the member. | |||
| * | |||
| * @param id Unique id for the action | |||
| * @return Filter to use. | |||
| */ | |||
| public AntAction(String id) { | |||
| _id = id; | |||
| putValue(NAME, getString(id, "name")); | |||
| putValue(SHORT_DESCRIPTION, getString(id, "shortDescription")); | |||
| putValue(PARENT_MENU_NAME, getString(id, PARENT_MENU_NAME)); | |||
| putValue(SEPARATOR, getString(id, SEPARATOR)); | |||
| String accelerator = getString(id, ACCELERATOR); | |||
| if(accelerator != null) { | |||
| putValue(ACCELERATOR, KeyStroke.getKeyStroke(accelerator)); | |||
| } | |||
| String iconName = getString(id, "icon"); | |||
| if(iconName != null) { | |||
| try { | |||
| URL imageLoc = | |||
| AntAction.class.getResource("resources/" + iconName); | |||
| if(imageLoc != null) { | |||
| putValue(SMALL_ICON, new ImageIcon(imageLoc)); | |||
| } | |||
| } | |||
| catch(Exception ex) { | |||
| // XXX log me. | |||
| ex.printStackTrace(); | |||
| } | |||
| } | |||
| public BusFilter getBusFilter() { | |||
| return _filter; | |||
| } | |||
| /** | |||
| * Unique id for the action. | |||
| * Receives all events. | |||
| * | |||
| * @return Action id. | |||
| * @param event Event to post. | |||
| */ | |||
| public String getID() { | |||
| return _id; | |||
| } | |||
| /** | |||
| * Get the name of the menu in the menu bar that this action shoul | |||
| * appear under. | |||
| * | |||
| * @return Menu to appear under, or null if not a menu action. | |||
| */ | |||
| public String getParentMenuName() { | |||
| return (String) getValue(PARENT_MENU_NAME); | |||
| } | |||
| /** | |||
| * Get the localized name for the action. | |||
| * | |||
| * @return Name | |||
| */ | |||
| public String getName() { | |||
| return (String) getValue(NAME); | |||
| } | |||
| /** | |||
| * Get the short description. Used in tool tips. | |||
| * | |||
| * @return Short description. | |||
| */ | |||
| public String getShortDescription() { | |||
| return (String) getValue(SHORT_DESCRIPTION); | |||
| } | |||
| /** | |||
| * Determine if a separator should appear before the action. | |||
| * | |||
| * @return True if add separator, false otherwise. | |||
| */ | |||
| public boolean isPreceededBySeparator() { | |||
| return Boolean.valueOf( | |||
| String.valueOf(getValue(SEPARATOR))).booleanValue(); | |||
| public void eventPosted(EventObject event) { | |||
| _mapper.applyEvent(event); | |||
| } | |||
| } | |||
| /** Class providing filtering for project events. */ | |||
| private static class Filter implements BusFilter { | |||
| /** | |||
| * Get the icon. | |||
| * Determines if the given event should be accepted. | |||
| * | |||
| * @return Icon for action, or null if none. | |||
| * @param event Event to test. | |||
| * @return True if event should be given to BusMember, false otherwise. | |||
| */ | |||
| public Icon getIcon() { | |||
| return (Icon) getValue(SMALL_ICON); | |||
| public boolean accept(EventObject event) { | |||
| return true; | |||
| } | |||
| } | |||
| public KeyStroke getAccelerator() { | |||
| return (KeyStroke) getValue(ACCELERATOR); | |||
| } | |||
| /** | |||
| * Pass the action on to the EventBus. | |||
| * | |||
| * @param e Event to forward. | |||
| */ | |||
| public void actionPerformed(ActionEvent e) { | |||
| _bus.postEvent(e); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,284 @@ | |||
| /* | |||
| * 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; | |||
| import javax.swing.*; | |||
| import java.net.URL; | |||
| import java.awt.event.ActionEvent; | |||
| import java.awt.event.ActionListener; | |||
| import java.util.*; | |||
| import org.apache.tools.ant.gui.event.EventBus; | |||
| /** | |||
| * Class representing an action in the Antidote application. | |||
| * | |||
| * @version $Revision$ | |||
| * @author Simeon Fitch | |||
| */ | |||
| public class AntAction extends AbstractAction { | |||
| /** Property name for the parent menu item. */ | |||
| public static final String PARENT_MENU_NAME = "parentMenuName"; | |||
| public static final String SEPARATOR = "separator"; | |||
| public static final String ACCELERATOR = "accelerator"; | |||
| public static final String ENABLED = "enabled"; | |||
| public static final String ENABLE_ON = "enableOn"; | |||
| public static final String DISABLE_ON = "disableOn"; | |||
| /** Property resources. */ | |||
| private ResourceBundle _resources = null; | |||
| /** Event bus. */ | |||
| private EventBus _bus = null; | |||
| /** Unique id. */ | |||
| private String _id = null; | |||
| /** Events that the action should cause transition to the | |||
| * enabled(true) state. */ | |||
| private Class[] _enableOn = null; | |||
| /** Events that the action should cause transition to the | |||
| * enabled(false) state. */ | |||
| private Class[] _disableOn = null; | |||
| /** | |||
| * Standard ctor. | |||
| * | |||
| * @param id Unique id for the action | |||
| */ | |||
| public AntAction(ResourceBundle resources, EventBus bus, String id) { | |||
| _resources = resources; | |||
| _bus = bus; | |||
| _id = id; | |||
| putValue(NAME, getString("name")); | |||
| putValue(SHORT_DESCRIPTION, getString("shortDescription")); | |||
| putValue(PARENT_MENU_NAME, getString(PARENT_MENU_NAME)); | |||
| putValue(SEPARATOR, getString(SEPARATOR)); | |||
| // Set the default enabled state. | |||
| String enabled = getString(ENABLED); | |||
| if(enabled != null) { | |||
| setEnabled(Boolean.valueOf(enabled).booleanValue()); | |||
| } | |||
| // Set an accellerator if any. | |||
| String accelerator = getString(ACCELERATOR); | |||
| if(accelerator != null) { | |||
| putValue(ACCELERATOR, KeyStroke.getKeyStroke(accelerator)); | |||
| } | |||
| // Add an icon if any (which means it'll show up on the tool bar). | |||
| String iconName = getString("icon"); | |||
| if(iconName != null) { | |||
| try { | |||
| URL imageLoc = | |||
| AntAction.class.getResource("resources/" + iconName); | |||
| if(imageLoc != null) { | |||
| putValue(SMALL_ICON, new ImageIcon(imageLoc)); | |||
| } | |||
| } | |||
| catch(Exception ex) { | |||
| // XXX log me. | |||
| ex.printStackTrace(); | |||
| } | |||
| } | |||
| _enableOn = resolveClasses(getString(ENABLE_ON)); | |||
| _disableOn = resolveClasses(getString(DISABLE_ON)); | |||
| } | |||
| /** | |||
| * Convenience method for looking put a resource with the name | |||
| * "id.key". Will return null if the resource doesn't exist. | |||
| * | |||
| * @param key Key name for the action. | |||
| * @return String resource for composite key, or null if not found. | |||
| */ | |||
| private String getString(String key) { | |||
| String retval = null; | |||
| try { | |||
| retval = _resources.getString(_id + "." + key); | |||
| } | |||
| catch(MissingResourceException ex) { | |||
| // Its ok to be missing a resource name... | |||
| // Too bad the API throws an exception in this case. | |||
| } | |||
| return retval; | |||
| } | |||
| /** | |||
| * Parse out the list of classes from the given string and | |||
| * resolve them into classes. | |||
| * | |||
| * @param classNames Comma delimited list of class names. | |||
| */ | |||
| private Class[] resolveClasses(String classNames) { | |||
| if(classNames == null) return null; | |||
| StringTokenizer tok = new StringTokenizer(classNames, ", "); | |||
| Vector vals = new Vector(); | |||
| while(tok.hasMoreTokens()) { | |||
| String name = tok.nextToken(); | |||
| try { | |||
| vals.addElement(Class.forName(name)); | |||
| } | |||
| catch(ClassNotFoundException ex) { | |||
| //XXX log me. | |||
| System.err.println( | |||
| "Warning: the event class " + name + | |||
| " was not found. Please check config file."); | |||
| } | |||
| } | |||
| Class[] retval = new Class[vals.size()]; | |||
| vals.copyInto(retval); | |||
| return retval; | |||
| } | |||
| /** | |||
| * Unique id for the action. | |||
| * | |||
| * @return Action id. | |||
| */ | |||
| public String getID() { | |||
| return _id; | |||
| } | |||
| /** | |||
| * Get the name of the menu in the menu bar that this action shoul | |||
| * appear under. | |||
| * | |||
| * @return Menu to appear under, or null if not a menu action. | |||
| */ | |||
| public String getParentMenuName() { | |||
| return (String) getValue(PARENT_MENU_NAME); | |||
| } | |||
| /** | |||
| * Get the localized name for the action. | |||
| * | |||
| * @return Name | |||
| */ | |||
| public String getName() { | |||
| return (String) getValue(NAME); | |||
| } | |||
| /** | |||
| * Get the short description. Used in tool tips. | |||
| * | |||
| * @return Short description. | |||
| */ | |||
| public String getShortDescription() { | |||
| return (String) getValue(SHORT_DESCRIPTION); | |||
| } | |||
| /** | |||
| * Determine if a separator should appear before the action. | |||
| * | |||
| * @return True if add separator, false otherwise. | |||
| */ | |||
| public boolean isPreceededBySeparator() { | |||
| return Boolean.valueOf( | |||
| String.valueOf(getValue(SEPARATOR))).booleanValue(); | |||
| } | |||
| /** | |||
| * Get the icon. | |||
| * | |||
| * @return Icon for action, or null if none. | |||
| */ | |||
| public Icon getIcon() { | |||
| return (Icon) getValue(SMALL_ICON); | |||
| } | |||
| /** | |||
| * Get the accelerator keystroke. | |||
| * | |||
| * @return Accelerator | |||
| */ | |||
| public KeyStroke getAccelerator() { | |||
| return (KeyStroke) getValue(ACCELERATOR); | |||
| } | |||
| /** | |||
| * Get the event types which should cause this to go to the | |||
| * enabled state. | |||
| * | |||
| */ | |||
| public Class[] getEnableOnEvents() { | |||
| return _enableOn; | |||
| } | |||
| /** | |||
| * Get the event types which should cause this to go to | |||
| * this disabled state. | |||
| * | |||
| */ | |||
| public Class[] getDisableOnEvents() { | |||
| return _disableOn; | |||
| } | |||
| /** | |||
| * Pass the action on to the EventBus. | |||
| * | |||
| * @param e Event to forward. | |||
| */ | |||
| public void actionPerformed(ActionEvent e) { | |||
| _bus.postEvent(e); | |||
| } | |||
| } | |||
| @@ -76,6 +76,9 @@ public class BuildEventForwarder implements BuildListener { | |||
| */ | |||
| public void buildStarted(BuildEvent event){ | |||
| postEvent(event, BuildEventType.BUILD_STARTED); | |||
| // We doubly post this event. | |||
| _context.getEventBus().postEvent( | |||
| new BuildStartedEvent(_context, event)); | |||
| } | |||
| /** | |||
| @@ -86,6 +89,9 @@ public class BuildEventForwarder implements BuildListener { | |||
| */ | |||
| public void buildFinished(BuildEvent event) { | |||
| postEvent(event, BuildEventType.BUILD_FINISHED); | |||
| // We doubly post this event. | |||
| _context.getEventBus().postEvent( | |||
| new BuildFinishedEvent(_context, event)); | |||
| } | |||
| /** | |||
| @@ -148,6 +148,8 @@ public class Console extends AntEditor { | |||
| switch(buildEvent.getType().getValue()) { | |||
| case BuildEventType.BUILD_STARTED_VAL: | |||
| clearDisplay(); | |||
| case BuildEventType.BUILD_FINISHED_VAL: | |||
| text = buildEvent.getType().toString(); | |||
| break; | |||
| case BuildEventType.TARGET_STARTED_VAL: | |||
| text = buildEvent.getEvent().getTarget().getName() + ":"; | |||
| @@ -157,13 +159,16 @@ public class Console extends AntEditor { | |||
| case BuildEventType.TASK_FINISHED_VAL: | |||
| break; | |||
| case BuildEventType.MESSAGE_LOGGED_VAL: | |||
| text = buildEvent.toString(); | |||
| // Filter out events that are below our | |||
| // selected filterint level. | |||
| LogLevelEnum level = | |||
| (LogLevelEnum) _logLevel.getSelectedItem(); | |||
| if(buildEvent.getEvent().getPriority() <= level.getValue()) { | |||
| text = buildEvent.toString(); | |||
| } | |||
| break; | |||
| } | |||
| // Filter out events that are below our selected filterint level. | |||
| LogLevelEnum level = (LogLevelEnum) _logLevel.getSelectedItem(); | |||
| if(buildEvent.getEvent().getPriority() > level.getValue()) return; | |||
| if(text != null) { | |||
| try { | |||
| @@ -0,0 +1,147 @@ | |||
| /* | |||
| * 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; | |||
| import java.util.*; | |||
| /** | |||
| * The purpose of this class is to manage the | |||
| * mappings between event type and action enabled state. | |||
| * | |||
| * @version $Revision$ | |||
| * @author Simeon Fitch | |||
| */ | |||
| class EventToActionMapper { | |||
| /** Lookup for enable(true) events. Key is event type, value is | |||
| * a list of actions that are changed by the event. */ | |||
| private Map _enableOn = new HashMap(); | |||
| /** Lookup for enable(false) events. Key is event type, value is | |||
| * a list of actions that are changed by the event. */ | |||
| private Map _disableOn = new HashMap(); | |||
| public EventToActionMapper() { | |||
| } | |||
| /** | |||
| * Add an action. | |||
| * | |||
| * @param action Action to add. | |||
| */ | |||
| public void addAction(AntAction action) { | |||
| putAction(action, action.getEnableOnEvents(), _enableOn); | |||
| putAction(action, action.getDisableOnEvents(), _disableOn); | |||
| } | |||
| /** | |||
| * For the given action store it in the event type mapping | |||
| * for each of the given types. | |||
| * | |||
| * @param action Action to store. | |||
| * @param clazzes Array of types to store it under. | |||
| * @param storage The place to store the association. | |||
| */ | |||
| private void putAction(AntAction action, Class[] clazzes, Map storage) { | |||
| if(clazzes == null) return; | |||
| for(int i = 0; i < clazzes.length; i++) { | |||
| List values = (List) storage.get(clazzes[i]); | |||
| if(values == null) { | |||
| values = new ArrayList(1); | |||
| storage.put(clazzes[i], values); | |||
| } | |||
| values.add(action); | |||
| } | |||
| } | |||
| /** | |||
| * For the given event change the state of any actions that | |||
| * have been registered as needing a transition as a result of | |||
| * the event. | |||
| * | |||
| * @param event The event to apply. | |||
| */ | |||
| public void applyEvent(EventObject event) { | |||
| if(event == null) return; | |||
| List vals = null; | |||
| vals = (List) _enableOn.get(event.getClass()); | |||
| changeState(vals, true); | |||
| vals = (List) _disableOn.get(event.getClass()); | |||
| changeState(vals, false); | |||
| } | |||
| /** | |||
| * Set the enabled state of the given actions. | |||
| * | |||
| * @param actions List of AntActions to set state for. | |||
| * @param state The state to set them to. | |||
| */ | |||
| private void changeState(List actions, boolean state) { | |||
| if(actions == null) return; | |||
| for(int i = 0, len = actions.size(); i < len; i++) { | |||
| AntAction action = (AntAction) actions.get(i); | |||
| action.setEnabled(state); | |||
| } | |||
| } | |||
| } | |||
| @@ -53,6 +53,7 @@ | |||
| */ | |||
| package org.apache.tools.ant.gui.command; | |||
| import org.apache.tools.ant.gui.AppContext; | |||
| import org.apache.tools.ant.gui.event.ProjectClosedEvent; | |||
| /** | |||
| @@ -83,5 +84,6 @@ public class CloseCmd implements Command { | |||
| */ | |||
| public void execute() { | |||
| _context.setProject(null); | |||
| _context.getEventBus().postEvent(new ProjectClosedEvent(_context)); | |||
| } | |||
| } | |||
| @@ -0,0 +1,101 @@ | |||
| /* | |||
| * 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.event; | |||
| import org.apache.tools.ant.BuildEvent; | |||
| import org.apache.tools.ant.gui.AppContext; | |||
| import org.apache.tools.ant.gui.command.NoOpCmd; | |||
| import org.apache.tools.ant.gui.command.Command; | |||
| /** | |||
| * Build finished. This event is a duplication of the information posted as | |||
| * an AntBuildEvent when a build finishes. | |||
| * | |||
| * @version $Revision$ | |||
| * @author Simeon Fitch | |||
| */ | |||
| public class BuildFinishedEvent extends AntEvent { | |||
| /** The originating event from Ant. */ | |||
| private BuildEvent _orig = null; | |||
| /** | |||
| * Standard ctor. | |||
| * | |||
| * @param context The application context. | |||
| * @param orig The originating event. | |||
| */ | |||
| public BuildFinishedEvent(AppContext context, BuildEvent orig) { | |||
| super(context); | |||
| _orig = orig; | |||
| } | |||
| /** | |||
| * Get the originating event. | |||
| * | |||
| * @return Originating event. | |||
| */ | |||
| public BuildEvent getBuildEvent() { | |||
| return _orig; | |||
| } | |||
| /** | |||
| * Create the appropriate response command to this event. | |||
| * | |||
| * @return Command representing an appropriate response to this event. | |||
| */ | |||
| public Command createDefaultCmd() { | |||
| return new NoOpCmd(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,101 @@ | |||
| /* | |||
| * 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.event; | |||
| import org.apache.tools.ant.BuildEvent; | |||
| import org.apache.tools.ant.gui.AppContext; | |||
| import org.apache.tools.ant.gui.command.NoOpCmd; | |||
| import org.apache.tools.ant.gui.command.Command; | |||
| /** | |||
| * Build started. This event is a duplication of the information posted as | |||
| * an AntBuildEvent when a build starts. | |||
| * | |||
| * @version $Revision$ | |||
| * @author Simeon Fitch | |||
| */ | |||
| public class BuildStartedEvent extends AntEvent { | |||
| /** The originating event from Ant. */ | |||
| private BuildEvent _orig = null; | |||
| /** | |||
| * Standard ctor. | |||
| * | |||
| * @param context The application context. | |||
| * @param orig The originating event. | |||
| */ | |||
| public BuildStartedEvent(AppContext context, BuildEvent orig) { | |||
| super(context); | |||
| _orig = orig; | |||
| } | |||
| /** | |||
| * Get the originating event. | |||
| * | |||
| * @return Originating event. | |||
| */ | |||
| public BuildEvent getBuildEvent() { | |||
| return _orig; | |||
| } | |||
| /** | |||
| * Create the appropriate response command to this event. | |||
| * | |||
| * @return Command representing an appropriate response to this event. | |||
| */ | |||
| public Command createDefaultCmd() { | |||
| return new NoOpCmd(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,86 @@ | |||
| /* | |||
| * 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.event; | |||
| import org.apache.tools.ant.gui.AppContext; | |||
| import org.apache.tools.ant.gui.command.NoOpCmd; | |||
| import org.apache.tools.ant.gui.command.Command; | |||
| /** | |||
| * Provides notification that the project was closed. | |||
| * | |||
| * @version $Revision$ | |||
| * @author Simeon Fitch | |||
| */ | |||
| public class ProjectClosedEvent extends AntEvent { | |||
| /** | |||
| * Standard ctor. | |||
| * | |||
| * @param context The application context. | |||
| */ | |||
| public ProjectClosedEvent(AppContext context) { | |||
| super(context); | |||
| } | |||
| /** | |||
| * Create the appropriate response command to this event. | |||
| * | |||
| * @return Command representing an appropriate response to this event. | |||
| */ | |||
| public Command createDefaultCmd() { | |||
| return new NoOpCmd(); | |||
| } | |||
| } | |||
| @@ -1,38 +1,48 @@ | |||
| # Define the primary menubar items. | |||
| menus=File, Build, Options, Help | |||
| actions=open, close, exit, about, startBuild, changeLookAndFeel | |||
| # Declare the list of known actions. | |||
| actions=\ | |||
| open, save, close, exit, about, startBuild, stopBuild, changeLookAndFeel | |||
| new.name=New | |||
| new.shortDescription=Create a new project | |||
| new.parentMenuName=File | |||
| new.icon=new.gif | |||
| new.accelerator=control N | |||
| # Configure the decalred actions. | |||
| open.name=Open | |||
| open.shortDescription=Open an existing project | |||
| open.parentMenuName=File | |||
| open.icon=open.gif | |||
| open.accelerator=control O | |||
| open.enabled=true | |||
| save.name=Save | |||
| save.shortDescription=Save the current project | |||
| save.parentMenuName=File | |||
| save.icon=save.gif | |||
| save.accelerator=control S | |||
| save.enabled=false | |||
| close.name=Close | |||
| close.shortDescription=Close the current project | |||
| close.parentMenuName=File | |||
| close.enabled=false | |||
| close.disableOn= \ | |||
| org.apache.tools.ant.gui.event.ProjectClosedEvent, \ | |||
| org.apache.tools.ant.gui.event.BuildStartedEvent | |||
| close.enableOn= \ | |||
| org.apache.tools.ant.gui.event.NewProjectEvent, \ | |||
| org.apache.tools.ant.gui.event.BuildFinishedEvent | |||
| exit.name=Exit | |||
| exit.shortDescription=Quit the application | |||
| exit.parentMenuName=File | |||
| exit.separator=true | |||
| exit.enabled=true | |||
| about.name=About | |||
| about.shortDescription=About this application | |||
| about.parentMenuName=Help | |||
| about.separator=true; | |||
| about.enabled=true | |||
| startBuild.name=Start | |||
| startBuild.shortDescription=Start build of selected target | |||
| @@ -40,13 +50,28 @@ startBuild.parentMenuName=Build | |||
| startBuild.icon=start.gif | |||
| startBuild.separator=true | |||
| startBuild.accelerator=control B | |||
| startBuild.enabled=false | |||
| startBuild.enableOn=\ | |||
| org.apache.tools.ant.gui.event.NewProjectEvent, \ | |||
| org.apache.tools.ant.gui.event.BuildFinishedEvent | |||
| startBuild.disableOn=\ | |||
| org.apache.tools.ant.gui.event.BuildStartedEvent, \ | |||
| org.apache.tools.ant.gui.event.ProjectClosedEvent | |||
| stopBuild.name=Stop | |||
| stopBuild.shortDescription=Stop the current build | |||
| stopBuild.parentMenuName=Build | |||
| stopBuild.icon=stop.gif | |||
| stopBuild.accelerator=control K | |||
| stopBuild.enabled=false | |||
| stopBuild.enableOn=\ | |||
| org.apache.tools.ant.gui.event.BuildStartedEvent | |||
| stopBuild.disableOn=\ | |||
| org.apache.tools.ant.gui.event.BuildFinishedEvent | |||
| changeLookAndFeel.name=Look and Feel... | |||
| changeLookAndFeel.shortDescription=Change the Look and Feel | |||
| changeLookAndFeel.parentMenuName=Options | |||
| changeLookAndFeel.enabled=true | |||