junit 5: pass module root according to the directory selected (IDEA-253869)
[idea/community.git] / platform / platform-api / src / com / intellij / openapi / actionSystem / ActionStub.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.openapi.actionSystem;
3
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.openapi.extensions.PluginDescriptor;
6 import com.intellij.openapi.util.text.StringUtil;
7 import com.intellij.util.SmartList;
8 import org.jetbrains.annotations.ApiStatus;
9 import org.jetbrains.annotations.NotNull;
10 import org.jetbrains.annotations.Nullable;
11
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.function.Supplier;
15
16 /**
17  * The main (and single) purpose of this class is provide lazy initialization
18  * of the actions. ClassLoader eats a lot of time on startup to load the actions' classes.
19  *
20  * @author Vladimir Kondratyev
21  */
22 @SuppressWarnings("ComponentNotRegistered")
23 public final class ActionStub extends AnAction implements ActionStubBase {
24   private static final Logger LOG = Logger.getInstance(ActionStub.class);
25
26   private final String myClassName;
27   private final String myProjectType;
28   private final Supplier<Presentation> myTemplatePresentation;
29   private final String myId;
30   private final PluginDescriptor myPlugin;
31   private final String myIconPath;
32   private List<Supplier<String>> mySynonyms = Collections.emptyList();
33
34   public ActionStub(@NotNull String actionClass,
35                     @NotNull String id,
36                     @NotNull PluginDescriptor plugin,
37                     @Nullable String iconPath,
38                     @Nullable String projectType,
39                     @NotNull Supplier<Presentation> templatePresentation) {
40     myPlugin = plugin;
41     myClassName = actionClass;
42     myProjectType = projectType;
43     myTemplatePresentation = templatePresentation;
44     LOG.assertTrue(!id.isEmpty());
45     myId = id;
46     myIconPath = iconPath;
47   }
48
49   @Override
50   public void addSynonym(@NotNull Supplier<String> text) {
51     if (mySynonyms == Collections.<Supplier<String>>emptyList()) {
52       mySynonyms = new SmartList<>(text);
53     }
54     else {
55       mySynonyms.add(text);
56     }
57   }
58
59   @NotNull
60   @Override
61   public PluginDescriptor getPlugin() {
62     return myPlugin;
63   }
64
65   @NotNull
66   @Override
67   Presentation createTemplatePresentation() {
68     return myTemplatePresentation.get();
69   }
70
71   @NotNull
72   public String getClassName() {
73     return myClassName;
74   }
75
76   @Override
77   @NotNull
78   public String getId() {
79     return myId;
80   }
81
82   public ClassLoader getLoader() {
83     return myPlugin.getPluginClassLoader();
84   }
85
86   @Override
87   public String getIconPath() {
88     return myIconPath;
89   }
90
91   @Override
92   public void actionPerformed(@NotNull AnActionEvent e) {
93     throw new UnsupportedOperationException();
94   }
95
96   /**
97    * Copies template presentation and shortcuts set to {@code targetAction}.
98    */
99   @ApiStatus.Internal
100   public final void initAction(@NotNull AnAction targetAction) {
101     copyTemplatePresentation(this.getTemplatePresentation(), targetAction.getTemplatePresentation());
102     targetAction.setShortcutSet(getShortcutSet());
103     copyActionTextOverrides(targetAction);
104     for (Supplier<String> synonym : mySynonyms) {
105       targetAction.addSynonym(synonym);
106     }
107   }
108
109   public static void copyTemplatePresentation(Presentation sourcePresentation, Presentation targetPresentation) {
110     if (targetPresentation.getIcon() == null && sourcePresentation.getIcon() != null) {
111       targetPresentation.setIcon(sourcePresentation.getIcon());
112     }
113     if (StringUtil.isEmpty(targetPresentation.getText()) && sourcePresentation.getText() != null) {
114       targetPresentation.setTextWithMnemonic(sourcePresentation.getTextWithPossibleMnemonic());
115     }
116     if (targetPresentation.getDescription() == null && sourcePresentation.getDescription() != null) {
117       targetPresentation.setDescription(sourcePresentation.getDescription());
118     }
119   }
120
121   public String getProjectType() {
122     return myProjectType;
123   }
124 }