Subversion Repositories svnkaklik

Rev

Blame | Last modification | View Log | Download

/*
    AVRcamVIEW: A PC application to test out the functionallity of the
     AVRcam real-time image processing engine.
    Copyright (C) 2004    Brent A. Taylor

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General Public License for more details.

    You should have received a copy of the GNU General Public
    License along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

   For more information on the AVRcamVIEW, please contact:

   taylorba@comcast.net

   or go to www.jrobot.net for more details regarding the system.
*/

package avr.swing;

import java.awt.event.*;
import java.lang.reflect.*;
import javax.swing.*;

/**
 * Utility class for defining Actions that can be attached as an ActionListener.
 * It also provides many convience methods for setting the Icon, Keystroke,
 * and Mnemonic.
 */
public class ProxyAction extends AbstractAction {

   /**
    * The object to which the action is to be invoked upon.
    */
   private Object target;

   /**
    * The method of the target to call when the action is invoked.
    */
   private Method method;

   /**
    * Create a Proxy Action.
    * @param target The object to which the action is to be invoked upon.
    * @param methodName The method to call.
    * @param icon The icon to display on the control this action is attached to.
    * in the object "target".
    */
   public ProxyAction(Object target,
                      String methodName,
                      Icon icon) {
      this(target, methodName, null, icon);
   }

   /**
    * Create a Proxy Action.
    * @param target The object to which the action is to be invoked upon.
    * @param methodName The method to call.
    * @param name The text string to display on the control this action is
    * attached to.
    * in the object "target".
    */
   public ProxyAction(Object target,
                      String methodName,
                      String name) {
      this(target, methodName, name, null);
   }

   /**
    * Create a Proxy Action.
    * @param target The object to which the action is to be invoked upon.
    * @param methodName The method to call.
    * @param name The text string to display on the control this action is
    * attached to.
    * @param key The mnemonic key used to invoke this action. (Alt + key)
    * in the object "target".
    */
   public ProxyAction(Object target,
                      String methodName,
                      String name,
                      int key) {
      this(target, methodName, name, key, null);
   }

   /**
    * Create a Proxy Action.
    * @param target The object to which the action is to be invoked upon.
    * @param methodName The method to call.
    * @param name The text string to display on the control this action is
    * attached to.
    * @param icon The icon to display on the control this action is attached to.
    * in the object "target".
    */
   public ProxyAction(Object target,
                      String methodName,
                      String name,
                      Icon icon) {
      this(target, methodName, false, name, -1, icon);
   }

   /**
    * Create a Proxy Action.
    * @param target The object to which the action is to be invoked upon.
    * @param methodName The method to call.
    * @param name The text string to display on the control this action is
    * attached to.
    * @param key The mnemonic key used to invoke this action. (Alt + key)
    * @param icon The icon to display on the control this action is attached to.
    * in the object "target".
    */
   public ProxyAction(Object target,
                      String methodName,
                      String name,
                      int key,
                      Icon icon) {
      this(target, methodName, false, name, key, icon);
   }

   /**
    * Create a Proxy Action.
    * @param target The object to which the action is to be invoked upon.
    * @param methodName The method to call.
    * @param passEvent True if the ActionEvent is to be passed to the method
    * defined by "methodName"
    * @param name The text string to display on the control this action is
    * attached to.
    */
   public ProxyAction(Object target,
                      String methodName,
                      boolean passEvent,
                      String name) {
      this(target, methodName, passEvent, name, -1, null);
   }

   /**
    * Create a Proxy Action.
    * @param target The object to which the action is to be invoked upon.
    * @param methodName The method to call.
    * @param passEvent True if the ActionEvent is to be passed to the method
    * defined by "methodName"
    * @param name The text string to display on the control this action is
    * attached to.
    * @param key The mnemonic key used to invoke this action. (Alt + key)
    * in the object "target".
    */
   public ProxyAction(Object target,
                      String methodName,
                      boolean passEvent,
                      String name,
                      int key) {
      this(target, methodName, passEvent, name, key, null);
   }

   /**
    * Create a Proxy Action.
    * @param target The object to which the action is to be invoked upon.
    * @param methodName The method to call.
    * @param passEvent True if the ActionEvent is to be passed to the method
    * defined by "methodName"
    * @param name The text string to display on the control this action is
    * attached to.
    * @param key The mnemonic key used to invoke this action. (Alt + key)
    * @param icon The icon to display on the control this action is attached to.
    * in the object "target".
    */
   public ProxyAction(Object target,
                      String methodName,
                      boolean passEvent,
                      String name,
                      int key,
                      Icon icon) {
      super(name);
//      this(target,
//           target.getClass().getMethod(methodName,
//                                       (passEvent) ? new Class[] { ActionEvent.class }
//                                                   : null),
//           name,
//           key,
//           icon);

      Method method = null;

      try {
         method = target.getClass().getMethod(methodName,
                                              (passEvent) ? new Class[] {ActionEvent.class}
                                              : null);
      } catch(NoSuchMethodException ex) {
         throw new NoSuchMethodError(ex.getMessage());
      }

      if(method.getParameterTypes().length > 1) {
         throw new IllegalArgumentException(
            "Method can have only one ActionEvent argument.");

      } else if(method.getParameterTypes().length == 1) {
         if(!method.getParameterTypes()[0].getName().equals(
               ActionEvent.class.getName())) {

            throw new IllegalArgumentException(
               method.getParameterTypes()[0].getName() + " != " +
               ActionEvent.class.getName() +
               " Parameter must be an ActionEvent.");
         }
      }

      this.target = target;
      this.method = method;

      if(key != -1) {
         setMnemonic(key);
      }

      if(icon != null) {
         setIcon(icon);
      }

   }

   /**
    * Set the mnemonic key to be the given key.
    * @param key The key identifier used to set the Mnemonic to
    * @see KeyEvent
    */
   public void setMnemonic(int key) {
      putValue(MNEMONIC_KEY, new Integer(key));
   }

   /**
    * Set the Shortcut KeyStroke to attach to this action.
    * @param keyCode The key identifier to use.
    * @param modifiers Any modifiers that need to be used along with the key.
    * @see KeyStroke
    * @see KeyEvent
    */
   public void setKeyStroke(int keyCode, int modifiers) {
      setKeyStroke(KeyStroke.getKeyStroke(keyCode, modifiers));
   }

   /**
    * Set the Shortcut KeyStroke to attach to this action.
    * @param keystroke The KeyStroke to use
    */
   public void setKeyStroke(KeyStroke keystroke) {
      putValue(ACCELERATOR_KEY, keystroke);
   }

   /**
    * Set the Icon of this Action
    * @param icon The icon to use.
    */
   public void setIcon(Icon icon) {
      putValue(SMALL_ICON, icon);

   }

   /**
    * Sets the Tool Tip Text for this Action
    *
    * @param text String
    */
   public void setToolTipText(String text) {
      putValue(SHORT_DESCRIPTION, text);
   }

   /**
    * This method is called when an Action Event occurs on the control this
    * action is attached to.
    * @param ae The ActionEvent created.
    */
   public void actionPerformed(ActionEvent ae) {

      try {
         if(method.getParameterTypes().length == 0) {
            // invoke the given method on the given target with no parameters
            method.invoke(target, null);
         } else {
            // invoke the given method on the given target with the ActionEvent
            // as a parameter
            method.invoke(target, new Object[] {ae});
         }
      } catch(Exception e) {
         // should never happen
         e.printStackTrace(System.err);
      }

   }

}