switcher - auto selection + fixes
[idea/community.git] / platform / platform-api / src / com / intellij / ui / switcher / SwitchAction.java
1 /*
2  * Copyright 2000-2010 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.ui.switcher;
17
18 import com.intellij.openapi.actionSystem.AnAction;
19 import com.intellij.openapi.actionSystem.AnActionEvent;
20 import com.intellij.openapi.actionSystem.PlatformDataKeys;
21 import com.intellij.openapi.project.DumbAware;
22 import com.intellij.openapi.project.Project;
23
24 import java.awt.event.KeyEvent;
25
26 public abstract class SwitchAction extends AnAction implements DumbAware {
27
28   protected SwitchAction() {
29     setEnabledInModalContext(true);
30   }
31
32   @Override
33   public void update(AnActionEvent e) {
34     SwitchingSession session = getSession(e);
35     e.getPresentation().setEnabled((session != null && !session.isFinished()) || getProvider(e) != null);
36   }
37
38   @Override
39   public void actionPerformed(AnActionEvent e) {
40     SwitchingSession session = getSession(e);
41     if (session == null || session.isFinished()) {
42       SwitchProvider provider = getProvider(e);
43       session = new SwitchingSession(getManager(e), provider, (KeyEvent)e.getInputEvent(), null);
44       initSession(e, session);
45     }
46
47     move(session);
48   }
49
50   private SwitchProvider getProvider(AnActionEvent e) {
51     return e.getData(SwitchProvider.KEY);
52   }
53
54   private SwitchingSession getSession(AnActionEvent e) {
55     return getManager(e).getSession();
56   }
57
58   private SwitchManager getManager(AnActionEvent e) {
59     Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
60     return SwitchManager.getInstance(project);
61   }
62
63   private void initSession(AnActionEvent e, SwitchingSession session) {
64     getManager(e).initSession(session);    
65   }
66
67   protected abstract void move(SwitchingSession session);
68
69   public static class Up extends SwitchAction {
70     @Override
71     protected void move(SwitchingSession session) {
72       session.up();
73     }
74   }
75
76   public static class Down extends SwitchAction {
77     @Override
78     protected void move(SwitchingSession session) {
79       session.down();
80     }
81   }
82
83   public static class Left extends SwitchAction {
84     @Override
85     protected void move(SwitchingSession session) {
86       session.left();
87     }
88   }
89
90   public static class Right extends SwitchAction {
91     @Override
92     protected void move(SwitchingSession session) {
93       session.right();
94     }
95   }
96
97 }