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 | |||||