001    /*
002     * Created on Mar 26, 2008
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 @2008-2010 the original author or authors.
015     */
016    package org.fest.swing.keystroke;
017    
018    import static org.fest.util.Objects.HASH_CODE_PRIME;
019    
020    import javax.swing.KeyStroke;
021    
022    /**
023     * Understands a mapping between a character and a <code>{@link KeyStroke}</code>.
024     *
025     * @author Yvonne Wang
026     */
027    public class KeyStrokeMapping {
028    
029      private final char character;
030      private final KeyStroke keyStroke;
031    
032      /**
033       * Creates a new </code>{@link KeyStrokeMapping}</code>.
034       * @param character the character corresponding to the intended <code>KeyStroke</code>.
035       * @param keyCode the numeric key code for the intended <code>KeyStroke</code>.
036       * @param modifiers the set of modifiers for the intended <code>KeyStroke</code>.
037       * @return the created <code>KeyStrokeMapping</code>.
038       */
039      public static KeyStrokeMapping mapping(char character, int keyCode, int modifiers) {
040        return new KeyStrokeMapping(character, keyCode, modifiers);
041      }
042    
043      /**
044       * Creates a new </code>{@link KeyStrokeMapping}</code>.
045       * @param character the character corresponding to the intended <code>KeyStroke</code>.
046       * @param keyCode the numeric key code for the intended <code>KeyStroke</code>.
047       * @param modifiers the set of modifiers for the intended <code>KeyStroke</code>.
048       */
049      public KeyStrokeMapping(char character, int keyCode, int modifiers) {
050        this(character, KeyStroke.getKeyStroke(keyCode, modifiers));
051      }
052    
053      /**
054       * Creates a new </code>{@link KeyStrokeMapping}</code>.
055       * @param character the character corresponding to the given <code>KeyStroke</code>.
056       * @param keyStroke the <code>KeyStroke</code> corresponding to the given character.
057       */
058      public KeyStrokeMapping(char character, KeyStroke keyStroke) {
059        this.character = character;
060        this.keyStroke = keyStroke;
061      }
062    
063      /**
064       * Returns the character corresponding to this mapping's <code>{@link #keyStroke()}</code>.
065       * @return the character corresponding to this mapping's <code>KeyStroke</code>.
066       */
067      public char character() {
068        return character;
069      }
070    
071      /**
072       * Returns the <code>{@link KeyStroke}</code> corresponding to this mapping's <code>{@link #character()}</code>.
073       * @return the <code>KeyStroke</code> corresponding to this mapping's character.
074       */
075      public KeyStroke keyStroke() {
076        return keyStroke;
077      }
078    
079      /** @see Object#equals(Object) */
080      @Override public boolean equals(Object o) {
081        if (this == o) return true;
082        if (o == null) return false;
083        if (!(o instanceof KeyStrokeMapping)) return false;
084        KeyStrokeMapping other = (KeyStrokeMapping) o;
085        if (character != other.character) return false;
086        if (keyStroke == null) return other.keyStroke == null;
087        if (other.keyStroke == null) return false;
088        if (keyStroke.getKeyCode() != other.keyStroke.getKeyCode()) return false;
089        return keyStroke.getModifiers() == other.keyStroke.getModifiers();
090      }
091    
092      /** @see Object#hashCode() */
093      @Override public int hashCode() {
094        int prime = HASH_CODE_PRIME;
095        int result = 1;
096        result = prime * result + character;
097        if (keyStroke == null) return result;
098        result = prime * result + keyStroke.getKeyCode();
099        result = prime * result + keyStroke.getModifiers();
100        return result;
101      }
102    
103      /** @see Object#toString() */
104      @Override public String toString() {
105        StringBuilder b = new StringBuilder();
106        b.append(getClass().getSimpleName()).append("[");
107        b.append("character='").append(character).append("',");
108        b.append("keyStroke=").append(keyStroke).append("]");
109        return b.toString();
110      }
111    }