ff6ffc93c57453481ed4e8717cdeb9f9a151ed76
[idea/community.git] / platform / editor-ui-api / src / com / intellij / openapi / actionSystem / KeyboardShortcut.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.actionSystem;
17
18 import com.intellij.openapi.util.Comparing;
19 import org.jetbrains.annotations.NonNls;
20 import org.jetbrains.annotations.NotNull;
21 import org.jetbrains.annotations.Nullable;
22
23 import javax.swing.*;
24
25 /**
26  * A keyboard shortcut, which can consist of one or two individual key strokes.
27  */
28 public final class KeyboardShortcut extends Shortcut {
29   private final KeyStroke myFirstKeyStroke;
30   private final KeyStroke mySecondKeyStroke;
31
32   /**
33    * @throws IllegalArgumentException if <code>firstKeyStroke</code> is <code>null</code>
34    */
35   public KeyboardShortcut(@NotNull KeyStroke firstKeyStroke, @Nullable KeyStroke secondKeyStroke) {
36     myFirstKeyStroke = firstKeyStroke;
37     mySecondKeyStroke = secondKeyStroke;
38   }
39
40   @NotNull
41   public KeyStroke getFirstKeyStroke() {
42     return myFirstKeyStroke;
43   }
44
45   @Nullable
46   public KeyStroke getSecondKeyStroke() {
47     return mySecondKeyStroke;
48   }
49
50   public int hashCode() {
51     int hashCode = myFirstKeyStroke.hashCode();
52     if (mySecondKeyStroke != null) {
53       hashCode += mySecondKeyStroke.hashCode();
54     }
55     return hashCode;
56   }
57
58   public boolean equals(Object obj) {
59     if (!(obj instanceof KeyboardShortcut)) {
60       return false;
61     }
62     KeyboardShortcut second = (KeyboardShortcut)obj;
63     return Comparing.equal(myFirstKeyStroke, second.myFirstKeyStroke) && Comparing.equal(mySecondKeyStroke, second.mySecondKeyStroke);
64   }
65
66   @Override
67   public boolean isKeyboard() {
68     return true;
69   }
70
71   @Override
72   public boolean startsWith(final Shortcut sc) {
73     if (sc instanceof KeyboardShortcut) {
74       final KeyboardShortcut other = (KeyboardShortcut)sc;
75       return myFirstKeyStroke.equals(other.myFirstKeyStroke) && (other.mySecondKeyStroke == null || other.mySecondKeyStroke.equals(mySecondKeyStroke));
76     }
77     else {
78       return false;
79     }
80   }
81
82   public static KeyboardShortcut fromString(@NonNls String s) {
83     final KeyStroke keyStroke = KeyStroke.getKeyStroke(s);
84     assert keyStroke != null : "Can't create key stroke for " + s;
85     return new KeyboardShortcut(keyStroke, null);
86   }
87
88   @Override
89   public String toString() {
90     return mySecondKeyStroke == null ? "[" + myFirstKeyStroke + "]" : "[" + myFirstKeyStroke + "]+[" + mySecondKeyStroke + "]";
91   }
92 }