1 /*
   2  * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package java.awt.event;
  27 
  28 import java.awt.AWTEvent;
  29 import java.lang.annotation.Native;
  30 
  31 /**
  32  * A semantic event which indicates that a component-defined action occurred.
  33  * This high-level event is generated by a component (such as a
  34  * {@code Button}) when
  35  * the component-specific action occurs (such as being pressed).
  36  * The event is passed to every {@code ActionListener} object
  37  * that registered to receive such events using the component's
  38  * {@code addActionListener} method.
  39  * <p>
  40  * <b>Note:</b> To invoke an {@code ActionEvent} on a
  41  * {@code Button} using the keyboard, use the Space bar.
  42  * <P>
  43  * The object that implements the {@code ActionListener} interface
  44  * gets this {@code ActionEvent} when the event occurs. The listener
  45  * is therefore spared the details of processing individual mouse movements
  46  * and mouse clicks, and can instead process a "meaningful" (semantic)
  47  * event like "button pressed".
  48  * <p>
  49  * An unspecified behavior will be caused if the {@code id} parameter
  50  * of any particular {@code ActionEvent} instance is not
  51  * in the range from {@code ACTION_FIRST} to {@code ACTION_LAST}.
  52  *
  53  * @see ActionListener
  54  * @see <a href="http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html">Tutorial: How to Write an Action Listener</a>
  55  *
  56  * @author Carl Quinn
  57  * @since 1.1
  58  */
  59 public class ActionEvent extends AWTEvent {
  60 
  61     /**
  62      * The shift modifier. An indicator that the shift key was held
  63      * down during the event.
  64      */
  65     public static final int SHIFT_MASK = 1 << 0;
  66 
  67     /**
  68      * The control modifier. An indicator that the control key was held
  69      * down during the event.
  70      */
  71     public static final int CTRL_MASK = 1 << 1;
  72 
  73     /**
  74      * The meta modifier. An indicator that the meta key was held
  75      * down during the event.
  76      */
  77     public static final int META_MASK = 1 << 2;
  78 
  79     /**
  80      * The alt modifier. An indicator that the alt key was held
  81      * down during the event.
  82      */
  83     public static final int ALT_MASK = 1 << 3;
  84 
  85 
  86     /**
  87      * The first number in the range of ids used for action events.
  88      */
  89     public static final int ACTION_FIRST                = 1001;
  90 
  91     /**
  92      * The last number in the range of ids used for action events.
  93      */
  94     public static final int ACTION_LAST                 = 1001;
  95 
  96     /**
  97      * This event id indicates that a meaningful action occurred.
  98      */
  99     @Native public static final int ACTION_PERFORMED    = ACTION_FIRST; //Event.ACTION_EVENT
 100 
 101     /**
 102      * The nonlocalized string that gives more details
 103      * of what actually caused the event.
 104      * This information is very specific to the component
 105      * that fired it.
 106 
 107      * @serial
 108      * @see #getActionCommand
 109      */
 110     String actionCommand;
 111 
 112     /**
 113      * Timestamp of when this event occurred. Because an ActionEvent is a high-
 114      * level, semantic event, the timestamp is typically the same as an
 115      * underlying InputEvent.
 116      *
 117      * @serial
 118      * @see #getWhen
 119      */
 120     long when;
 121 
 122     /**
 123      * This represents the key modifier that was selected,
 124      * and is used to determine the state of the selected key.
 125      * If no modifier has been selected it will default to
 126      * zero.
 127      *
 128      * @serial
 129      * @see #getModifiers
 130      */
 131     int modifiers;
 132 
 133     /*
 134      * JDK 1.1 serialVersionUID
 135      */
 136     private static final long serialVersionUID = -7671078796273832149L;
 137 
 138     /**
 139      * Constructs an {@code ActionEvent} object.
 140      * <p>
 141      * This method throws an
 142      * {@code IllegalArgumentException} if {@code source}
 143      * is {@code null}.
 144      * A {@code null command} string is legal,
 145      * but not recommended.
 146      *
 147      * @param source  The object that originated the event
 148      * @param id      An integer that identifies the event.
 149      *                     For information on allowable values, see
 150      *                     the class description for {@link ActionEvent}
 151      * @param command A string that may specify a command (possibly one
 152      *                of several) associated with the event
 153      * @throws IllegalArgumentException if {@code source} is null
 154      * @see #getSource()
 155      * @see #getID()
 156      * @see #getActionCommand()
 157      */
 158     public ActionEvent(Object source, int id, String command) {
 159         this(source, id, command, 0);
 160     }
 161 
 162     /**
 163      * Constructs an {@code ActionEvent} object with modifier keys.
 164      * <p>
 165      * This method throws an
 166      * {@code IllegalArgumentException} if {@code source}
 167      * is {@code null}.
 168      * A {@code null command} string is legal,
 169      * but not recommended.
 170      *
 171      * @param source  The object that originated the event
 172      * @param id      An integer that identifies the event.
 173      *                     For information on allowable values, see
 174      *                     the class description for {@link ActionEvent}
 175      * @param command A string that may specify a command (possibly one
 176      *                of several) associated with the event
 177      * @param modifiers The modifier keys down during event
 178      *                  (shift, ctrl, alt, meta).
 179      *                  Passing negative parameter is not recommended.
 180      *                  Zero value means that no modifiers were passed
 181      * @throws IllegalArgumentException if {@code source} is null
 182      * @see #getSource()
 183      * @see #getID()
 184      * @see #getActionCommand()
 185      * @see #getModifiers()
 186      */
 187     public ActionEvent(Object source, int id, String command, int modifiers) {
 188         this(source, id, command, 0, modifiers);
 189     }
 190 
 191     /**
 192      * Constructs an {@code ActionEvent} object with the specified
 193      * modifier keys and timestamp.
 194      * <p>
 195      * This method throws an
 196      * {@code IllegalArgumentException} if {@code source}
 197      * is {@code null}.
 198      * A {@code null command} string is legal,
 199      * but not recommended.
 200      *
 201      * @param source    The object that originated the event
 202      * @param id      An integer that identifies the event.
 203      *                     For information on allowable values, see
 204      *                     the class description for {@link ActionEvent}
 205      * @param command A string that may specify a command (possibly one
 206      *                of several) associated with the event
 207      * @param modifiers The modifier keys down during event
 208      *                  (shift, ctrl, alt, meta).
 209      *                  Passing negative parameter is not recommended.
 210      *                  Zero value means that no modifiers were passed
 211      * @param when   A long that gives the time the event occurred.
 212      *               Passing negative or zero value
 213      *               is not recommended
 214      * @throws IllegalArgumentException if {@code source} is null
 215      * @see #getSource()
 216      * @see #getID()
 217      * @see #getActionCommand()
 218      * @see #getModifiers()
 219      * @see #getWhen()
 220      *
 221      * @since 1.4
 222      */
 223     public ActionEvent(Object source, int id, String command, long when,
 224                        int modifiers) {
 225         super(source, id);
 226         this.actionCommand = command;
 227         this.when = when;
 228         this.modifiers = modifiers;
 229     }
 230 
 231     /**
 232      * Returns the command string associated with this action.
 233      * This string allows a "modal" component to specify one of several
 234      * commands, depending on its state. For example, a single button might
 235      * toggle between "show details" and "hide details". The source object
 236      * and the event would be the same in each case, but the command string
 237      * would identify the intended action.
 238      * <p>
 239      * Note that if a {@code null} command string was passed
 240      * to the constructor for this {@code ActionEvent}, this
 241      * this method returns {@code null}.
 242      *
 243      * @return the string identifying the command for this event
 244      */
 245     public String getActionCommand() {
 246         return actionCommand;
 247     }
 248 
 249     /**
 250      * Returns the timestamp of when this event occurred. Because an
 251      * ActionEvent is a high-level, semantic event, the timestamp is typically
 252      * the same as an underlying InputEvent.
 253      *
 254      * @return this event's timestamp
 255      * @since 1.4
 256      */
 257     public long getWhen() {
 258         return when;
 259     }
 260 
 261     /**
 262      * Returns the modifier keys held down during this action event.
 263      *
 264      * @return the bitwise-or of the modifier constants
 265      */
 266     public int getModifiers() {
 267         return modifiers;
 268     }
 269 
 270     /**
 271      * Returns a parameter string identifying this action event.
 272      * This method is useful for event-logging and for debugging.
 273      *
 274      * @return a string identifying the event and its associated command
 275      */
 276     @SuppressWarnings("deprecation")
 277     public String paramString() {
 278         String typeStr;
 279         switch(id) {
 280           case ACTION_PERFORMED:
 281               typeStr = "ACTION_PERFORMED";
 282               break;
 283           default:
 284               typeStr = "unknown type";
 285         }
 286         return typeStr + ",cmd="+actionCommand+",when="+when+",modifiers="+
 287             KeyEvent.getKeyModifiersText(modifiers);
 288     }
 289 }