001 /*
002 * Created on Sep 21, 2007
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 *
014 * Copyright @2007-2010 the original author or authors.
015 */
016 package org.fest.swing.core;
017
018 import static org.fest.swing.util.Arrays.copyOf;
019
020 import java.awt.Event;
021 import java.awt.event.KeyEvent;
022
023 import org.fest.swing.util.Platform;
024
025 /**
026 * Understands information about pressing a keyboard key.
027 * <p>
028 * Examples:
029 * </p>
030 * <p>
031 * Specify that 'CTRL' + 'C' should be pressed:
032 * <pre>
033 * // import static org.fest.swing.fixture.KeyPressInfo.*;
034 * KeyPressInfo i = key(VK_C).modifiers(CTRL_MASK);
035 * </pre>
036 * </p>
037 * <p>
038 * Specify that 'SHIFT' + 'R' should be pressed:
039 * <pre>
040 * // import static org.fest.swing.fixture.KeyPressInfo.*;
041 * KeyPressInfo i = key(VK_R).modifiers(SHIFT_MASK);
042 * </pre>
043 * </p>
044 * <p>
045 * For platform-safe mask pressing (e.g. 'Control' in Windows or 'Command' in MacOS) use
046 * <code>{@link Platform#controlOrCommandMask()}</code>.
047 * </p>
048 *
049 * @author Alex Ruiz
050 * @author Yvonne Wang
051 */
052 public final class KeyPressInfo {
053
054 private final int keyCode;
055 private int[] modifiers;
056
057 /**
058 * Specifies the code of the key to press, without any modifiers (e.g.
059 * <code>{@link KeyEvent#VK_C KeyEvent.VK_C}</code>.)
060 * @param keyCode the code of the key to press.
061 * @return the created <code>KeyPressInfo</code>.
062 */
063 public static KeyPressInfo keyCode(int keyCode) {
064 return new KeyPressInfo(keyCode, new int[0]);
065 }
066
067 private KeyPressInfo(int keyCode, int[] modifiers) {
068 this.keyCode = keyCode;
069 this.modifiers = modifiers;
070 }
071
072 /**
073 * Returns the code of the key to press.
074 * @return the code of the key to press.
075 */
076 public int keyCode() { return keyCode; }
077
078 /**
079 * Returns the modifiers to use when pressing <code>{@link #keyCode() the specified key}</code>.
080 * @return the modifiers to use.
081 */
082 public int[] modifiers() {
083 return copyOf(modifiers);
084 }
085
086 /**
087 * Specifies the modifiers to use when pressing <code>{@link #keyCode() the specified key}</code> (e.g.
088 * <code>{@link Event#CTRL_MASK Event.CTRL_MASK}</code>.)
089 * <p>
090 * For platform-safe mask pressing (e.g. 'Control' in Windows or 'Command' in MacOS) use
091 * <code>{@link Platform#controlOrCommandMask()}</code>.
092 * </p>
093 * @param newModifiers the new modifiers to use.
094 * @return this object.
095 * @throws NullPointerException if <code>newModifiers</code> is <code>null</code>.
096 */
097 public KeyPressInfo modifiers(int... newModifiers) {
098 if (newModifiers == null) throw new NullPointerException("The array of modifiers should not be null");
099 modifiers = copyOf(newModifiers);
100 return this;
101 }
102 }