AnActionEvent#getProject() - shorthand for getData(PlatformDataKeys.PROJECT).
[idea/community.git] / platform / platform-api / src / com / intellij / openapi / actionSystem / AnActionEvent.java
1 /*
2  * Copyright 2000-2009 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.project.Project;
19 import com.intellij.openapi.util.text.StringUtil;
20 import org.jetbrains.annotations.NonNls;
21 import org.jetbrains.annotations.Nullable;
22 import org.jetbrains.annotations.NotNull;
23
24 import java.awt.event.InputEvent;
25 import java.util.HashMap;
26 import java.util.Map;
27
28 /**
29  * Container for the information necessary to execute or update an {@link AnAction}.
30  *
31  * @see AnAction#actionPerformed(AnActionEvent)
32  * @see AnAction#update(AnActionEvent)
33  */
34
35 public class AnActionEvent {
36   private final InputEvent myInputEvent;
37   private final ActionManager myActionManager;
38   @NotNull private final DataContext myDataContext;
39   @NotNull private final String myPlace;
40   @NotNull private final Presentation myPresentation;
41   private final int myModifiers;
42   private boolean myWorksInInjected;
43   @NonNls private static final String ourInjectedPrefix = "$injected$.";
44   private static final Map<String, String> ourInjectedIds = new HashMap<String, String>();
45
46   /**
47    * @throws IllegalArgumentException <code>dataContext</code> is <code>null</code> or
48    * <code>place</code> is <code>null</code> or <code>presentation</code> is <code>null</code>
49    */
50   public AnActionEvent(
51     InputEvent inputEvent,
52     @NotNull DataContext dataContext,
53     @NotNull @NonNls String place,
54     @NotNull Presentation presentation,
55     ActionManager actionManager,
56     int modifiers
57   ){
58     // TODO[vova,anton] make this constructor package local. No one is allowed to create AnActionEvents
59     myInputEvent = inputEvent;
60     myActionManager = actionManager;
61     myDataContext = dataContext;
62     myPlace = place;
63     myPresentation = presentation;
64     myModifiers = modifiers;
65   }
66
67   /**
68    * Returns the <code>InputEvent</code> which causes invocation of the action. It might be
69    * <code>KeyEvent</code>, <code>MouseEvent</code>.
70    * @return the <code>InputEvent</code> instance.
71    */
72   public InputEvent getInputEvent() {
73     return myInputEvent;
74   }
75
76   /**
77    * @return Project from the context of this event.
78    */
79   @Nullable
80   public Project getProject() {
81     return getData(PlatformDataKeys.PROJECT);
82   }
83
84   @NonNls
85   public static String injectedId(String dataId) {
86     synchronized(ourInjectedIds) {
87       String injected = ourInjectedIds.get(dataId);
88       if (injected == null) {
89         injected = ourInjectedPrefix + dataId;
90         ourInjectedIds.put(dataId, injected);
91       }
92       return injected;
93     }
94   }
95   
96   @NonNls
97   public static String uninjectedId(String dataId) {
98     return StringUtil.trimStart(dataId, ourInjectedPrefix);
99   }
100
101   /**
102    * Returns the context which allows to retrieve information about the state of IDEA related to
103    * the action invocation (active editor, selection and so on).
104    *
105    * @return the data context instance.
106    */
107   @NotNull
108   public DataContext getDataContext() {
109     if (!myWorksInInjected) {
110       return myDataContext;
111     }
112     return new DataContext() {
113       @Nullable
114       public Object getData(@NonNls String dataId) {
115         Object injected = myDataContext.getData(injectedId(dataId));
116         if (injected != null) return injected;
117         return myDataContext.getData(dataId);
118       }
119     };
120   }
121
122   @Nullable
123   public <T> T getData(@NotNull DataKey<T> key) {
124     return key.getData(getDataContext());
125   }
126
127   @NotNull
128   public <T> T getRequiredData(@NotNull DataKey<T> key) {
129     T data = getData(key);
130     assert data != null;
131     return data;
132   }
133
134   /**
135    * Returns the identifier of the place in the IDEA user interface from where the action is invoked
136    * or updated.
137    *
138    * @return the place identifier
139    * @see ActionPlaces
140    */
141   @NotNull
142   public String getPlace() {
143     return myPlace;
144   }
145
146   /**
147    * Returns the presentation which represents the action in the place from where it is invoked
148    * or updated.
149    *
150    * @return the presentation instance.
151    */
152   @NotNull
153   public Presentation getPresentation() {
154     return myPresentation;
155   }
156
157   /**
158    * Returns the modifier keys held down during this action event.
159    * @return the modifier keys.
160    */
161   public int getModifiers() {
162     return myModifiers;
163   }
164
165   public ActionManager getActionManager() {
166     return myActionManager;
167   }
168   public void setInjectedContext(boolean worksInInjected) {
169     myWorksInInjected = worksInInjected;
170   }
171
172   public boolean isInInjectedContext() {
173     return myWorksInInjected;
174   }
175
176   public void accept(AnActionEventVisitor visitor) {
177     visitor.visitEvent(this);
178   }
179 }