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> | 2000-11-10 Simeon H.K. Fitch <simeon@fitch.net> | ||||
| * org/apache/tools/ant/gui/PropertyEditor.java: Added new | * 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 org.apache.tools.ant.gui.event.*; | ||||
| import javax.swing.*; | import javax.swing.*; | ||||
| import java.awt.event.ActionEvent; | |||||
| import java.awt.event.ActionListener; | |||||
| import java.util.*; | import java.util.*; | ||||
| import java.net.URL; | |||||
| /** | /** | ||||
| * Manager of antidote actions. Receives its configuration from the action | * Manager of antidote actions. Receives its configuration from the action | ||||
| @@ -80,6 +77,10 @@ public class ActionManager { | |||||
| /** Event bus. */ | /** Event bus. */ | ||||
| private EventBus _bus = null; | private EventBus _bus = null; | ||||
| /** Class for storing the event type to action type | |||||
| * mapping for setting enabled state. */ | |||||
| private EventToActionMapper _mapper = null; | |||||
| /** | /** | ||||
| * Standard ctor. | * Standard ctor. | ||||
| @@ -88,6 +89,9 @@ public class ActionManager { | |||||
| */ | */ | ||||
| public ActionManager(EventBus bus) { | public ActionManager(EventBus bus) { | ||||
| _bus = bus; | _bus = bus; | ||||
| bus.addMember(EventBus.RESPONDING, new Enabler()); | |||||
| _mapper = new EventToActionMapper(); | |||||
| // Configure the set of actions. | // Configure the set of actions. | ||||
| String toTok = _resources.getString("actions"); | String toTok = _resources.getString("actions"); | ||||
| @@ -95,8 +99,16 @@ public class ActionManager { | |||||
| _actionIDs = new String[tok.countTokens()]; | _actionIDs = new String[tok.countTokens()]; | ||||
| for(int i = 0; i < _actionIDs.length; i++) { | for(int i = 0; i < _actionIDs.length; i++) { | ||||
| _actionIDs[i] = tok.nextToken(); | _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){ | public void buildStarted(BuildEvent event){ | ||||
| postEvent(event, BuildEventType.BUILD_STARTED); | 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) { | public void buildFinished(BuildEvent event) { | ||||
| postEvent(event, BuildEventType.BUILD_FINISHED); | 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()) { | switch(buildEvent.getType().getValue()) { | ||||
| case BuildEventType.BUILD_STARTED_VAL: | case BuildEventType.BUILD_STARTED_VAL: | ||||
| clearDisplay(); | clearDisplay(); | ||||
| case BuildEventType.BUILD_FINISHED_VAL: | |||||
| text = buildEvent.getType().toString(); | |||||
| break; | break; | ||||
| case BuildEventType.TARGET_STARTED_VAL: | case BuildEventType.TARGET_STARTED_VAL: | ||||
| text = buildEvent.getEvent().getTarget().getName() + ":"; | text = buildEvent.getEvent().getTarget().getName() + ":"; | ||||
| @@ -157,13 +159,16 @@ public class Console extends AntEditor { | |||||
| case BuildEventType.TASK_FINISHED_VAL: | case BuildEventType.TASK_FINISHED_VAL: | ||||
| break; | break; | ||||
| case BuildEventType.MESSAGE_LOGGED_VAL: | 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; | 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) { | if(text != null) { | ||||
| try { | 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; | package org.apache.tools.ant.gui.command; | ||||
| import org.apache.tools.ant.gui.AppContext; | 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() { | public void execute() { | ||||
| _context.setProject(null); | _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 | 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.name=Open | ||||
| open.shortDescription=Open an existing project | open.shortDescription=Open an existing project | ||||
| open.parentMenuName=File | open.parentMenuName=File | ||||
| open.icon=open.gif | open.icon=open.gif | ||||
| open.accelerator=control O | open.accelerator=control O | ||||
| open.enabled=true | |||||
| save.name=Save | save.name=Save | ||||
| save.shortDescription=Save the current project | save.shortDescription=Save the current project | ||||
| save.parentMenuName=File | save.parentMenuName=File | ||||
| save.icon=save.gif | save.icon=save.gif | ||||
| save.accelerator=control S | save.accelerator=control S | ||||
| save.enabled=false | |||||
| close.name=Close | close.name=Close | ||||
| close.shortDescription=Close the current project | close.shortDescription=Close the current project | ||||
| close.parentMenuName=File | 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.name=Exit | ||||
| exit.shortDescription=Quit the application | exit.shortDescription=Quit the application | ||||
| exit.parentMenuName=File | exit.parentMenuName=File | ||||
| exit.separator=true | exit.separator=true | ||||
| exit.enabled=true | |||||
| about.name=About | about.name=About | ||||
| about.shortDescription=About this application | about.shortDescription=About this application | ||||
| about.parentMenuName=Help | about.parentMenuName=Help | ||||
| about.separator=true; | about.separator=true; | ||||
| about.enabled=true | |||||
| startBuild.name=Start | startBuild.name=Start | ||||
| startBuild.shortDescription=Start build of selected target | startBuild.shortDescription=Start build of selected target | ||||
| @@ -40,13 +50,28 @@ startBuild.parentMenuName=Build | |||||
| startBuild.icon=start.gif | startBuild.icon=start.gif | ||||
| startBuild.separator=true | startBuild.separator=true | ||||
| startBuild.accelerator=control B | 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.name=Stop | ||||
| stopBuild.shortDescription=Stop the current build | stopBuild.shortDescription=Stop the current build | ||||
| stopBuild.parentMenuName=Build | stopBuild.parentMenuName=Build | ||||
| stopBuild.icon=stop.gif | stopBuild.icon=stop.gif | ||||
| stopBuild.accelerator=control K | 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.name=Look and Feel... | ||||
| changeLookAndFeel.shortDescription=Change the Look and Feel | changeLookAndFeel.shortDescription=Change the Look and Feel | ||||
| changeLookAndFeel.parentMenuName=Options | changeLookAndFeel.parentMenuName=Options | ||||
| changeLookAndFeel.enabled=true | |||||