diff --git a/src/java/com/samskivert/swing/Controller.java b/src/java/com/samskivert/swing/Controller.java
index de38282c..65430c2f 100644
--- a/src/java/com/samskivert/swing/Controller.java
+++ b/src/java/com/samskivert/swing/Controller.java
@@ -37,35 +37,32 @@ import com.samskivert.Log;
import com.samskivert.swing.event.CommandEvent;
/**
- * The controller class provides a basis for the separation of user
- * interface code into display code and control code. The display code
- * lives in a panel class (javax.swing.JPanel or something
- * conceptually similar) and the control code lives in an associated
- * controller class.
+ * The controller class provides a basis for the separation of user interface
+ * code into display code and control code. The display code lives in a panel
+ * class (javax.swing.JPanel or something conceptually similar)
+ * and the control code lives in an associated controller class.
*
*
The controller philosophy is thus: The panel class (and its UI - * components) convert basic user interface actions into higher level - * actions that more cleanly encapsulate the action desired by the user - * and they pass those actions on to their controller. The controller then - * performs abstract processing based on the users desires and the - * changing state of the application and calls back to the panel to affect - * changes to the display. + * components) convert basic user interface actions into higher level actions + * that more cleanly encapsulate the action desired by the user and they pass + * those actions on to their controller. The controller then performs abstract + * processing based on the users desires and the changing state of the + * application and calls back to the panel to affect changes to the display. * - *
Controllers also support the notion of scope. When a panel wishes - * to post an action, it doesn't do it directly to the controller. Instead - * it does it using a controller utility function called {@link - * #postAction}, which searches up the user interface hierarchy looking - * for a component that implements {@link - * com.samskivert.swing.ControllerProvider} which it will use to obtain - * the controller "in scope" for that component. That controller is - * requested to handle the action, but if it cannot handle the action, the - * next controller up the chain is located and requested to process the - * action. In this manner, a hierarchy of controllers (often just two: one - * application wide and one for whatever particular mode the application - * is in at the moment) can provide a set of services that are available - * to all user interface elements in the entire application and in a way - * that doesn't require tight connectedness between the UI elements and - * the controllers. + *
Controllers also support the notion of scope. When a panel wishes to + * post an action, it doesn't do it directly to the controller. Instead it does + * it using a controller utility function called {@link #postAction}, which + * searches up the user interface hierarchy looking for a component that + * implements {@link ControllerProvider} which it will use to obtain the + * controller "in scope" for that component. That controller is requested to + * handle the action, but if it cannot handle the action, the next controller + * up the chain is located and requested to process the action. + * + *
In this manner, a hierarchy of controllers (often just two: one + * application wide and one for whatever particular mode the application is in + * at the moment) can provide a set of services that are available to all user + * interface elements in the entire application and in a way that doesn't + * require tight connectedness between the UI elements and the controllers. */ public abstract class Controller implements ActionListener @@ -150,49 +147,48 @@ public abstract class Controller } /** - * Instructs this controller to process this action event. When an - * action is posted by a user interface element, it will be posted to - * the controller in closest scope for that element. If that - * controller handles the event, it should return true from this - * method to indicate that processing should stop. If it cannot handle - * the event, it can return false to indicate that the event should be - * propagated to the next controller up the chain. + * Instructs this controller to process this action event. When an action + * is posted by a user interface element, it will be posted to the + * controller in closest scope for that element. If that controller handles + * the event, it should return true from this method to indicate that + * processing should stop. If it cannot handle the event, it can return + * false to indicate that the event should be propagated to the next + * controller up the chain. * - *
This method will be called on the AWT thread, so the controller - * can safely manipulate user interface components while handling an - * action. However, this means that action handling cannot block and - * should not take an undue amount of time. If the controller needs to - * perform complicated, lengthy processing it should do so with a - * separate thread, for example via {@link - * com.samskivert.swing.util.TaskMaster}. + *
This method will be called on the AWT thread, so the controller can + * safely manipulate user interface components while handling an action. + * However, this means that action handling cannot block and should not + * take an undue amount of time. If the controller needs to perform + * complicated, lengthy processing it should do so with a separate thread, + * for example via {@link com.samskivert.swing.util.TaskMaster}. * *
The default implementation of this method will reflect on the * controller class, looking for a method that matches the name of the - * action event. For example, if the action was "Exit" a method named - * "handleExit" would be sought. A handler method must provide one of - * three signatures: one accepting no arguments, one including only a - * reference to the source object, or one including the source object - * and an extra argument (which can be used only if the action event - * is an instance of {@link CommandEvent}). For example: + * action event. For example, if the action was "exit" a method named + * "exit" would be sought. A handler method must provide one of three + * signatures: one accepting no arguments, one including only a reference + * to the source object, or one including the source object and an extra + * argument (which can be used only if the action event is an instance of + * {@link CommandEvent}). For example: * *
- * public void handleCancelClicked (Object source);
- * public void handleTextEntered (Object source, String text);
+ * public void cancelClicked (Object source);
+ * public void textEntered (Object source, String text);
*
*
- * The arguments to the method can be as specific or as generic as
- * desired and reflection will perform the appropriate conversions at
- * runtime. For example, a method could be declared like so:
+ * The arguments to the method can be as specific or as generic as desired
+ * and reflection will perform the appropriate conversions at runtime. For
+ * example, a method could be declared like so:
*
*
- * public void handleCancelClicked (JButton source);
+ * public void cancelClicked (JButton source);
*
*
- * One would have to ensure that the only action events generated with
- * the action command string "CancelClicked" were generated by
- * JButton instances if such a signature were used.
+ * One would have to ensure that the only action events generated with the
+ * action command string "cancelClicked" were generated by JButton
+ * instances if such a signature were used.
*
- * @param action The action to be processed.
+ * @param action the action to be processed.
*
* @return true if the action was processed, false if it should be
* propagated up to the next controller in scope.
@@ -217,12 +213,13 @@ public abstract class Controller
try {
// look for the appropriate method
- String targetName = "handle" + action;
Method[] methods = getClass().getMethods();
int mcount = methods.length;
for (int i = 0; i < mcount; i++) {
- if (methods[i].getName().equals(targetName)) {
+ if (methods[i].getName().equals(action) ||
+ // handle our old style of prepending "handle"
+ methods[i].getName().equals("handle" + action)) {
// see if we can generate the appropriate arguments
args = generateArguments(methods[i], source, arg);
// if we were able to, go ahead and use this method
@@ -243,7 +240,6 @@ public abstract class Controller
if (method != null) {
method.invoke(this, args);
return true;
-
} else {
return false;
}
@@ -319,13 +315,13 @@ public abstract class Controller
/**
* Posts the specified action to the nearest controller in scope. The
- * controller search begins with the source component of the action
- * and traverses up the component tree looking for a controller to
- * handle the action. The controller location and action event
- * processing is guaranteed to take place on the AWT thread regardless
- * of what thread calls postAction and that processing
- * will not occur immediately but is instead appended to the AWT event
- * dispatch queue for processing.
+ * controller search begins with the source component of the action and
+ * traverses up the component tree looking for a controller to handle the
+ * action. The controller location and action event processing is
+ * guaranteed to take place on the AWT thread regardless of what thread
+ * calls postAction and that processing will not occur
+ * immediately but is instead appended to the AWT event dispatch queue for
+ * processing.
*/
public static void postAction (ActionEvent action)
{