mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-07 22:09:38 +07:00
provide tooltip for "run" guter icon
This commit is contained in:
@@ -17,27 +17,41 @@ package com.intellij.execution.application;
|
||||
|
||||
import com.intellij.execution.lineMarker.ExecutorAction;
|
||||
import com.intellij.execution.lineMarker.RunLineMarkerContributor;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiIdentifier;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.util.PsiMethodUtil;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* @author Dmitry Avdeev
|
||||
*/
|
||||
public class ApplicationRunLineMarkerProvider extends RunLineMarkerContributor {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Info getInfo(PsiElement e) {
|
||||
public Info getInfo(final PsiElement e) {
|
||||
if (isIdentifier(e)) {
|
||||
PsiElement element = e.getParent();
|
||||
if (element instanceof PsiClass && PsiMethodUtil.findMainInClass((PsiClass)element) != null)
|
||||
return new Info(ApplicationConfigurationType.getInstance().getIcon(), null, ExecutorAction.getActions(0));
|
||||
if (element instanceof PsiMethod && "main".equals(((PsiMethod)element).getName()) && PsiMethodUtil.isMainMethod((PsiMethod)element))
|
||||
return new Info(ApplicationConfigurationType.getInstance().getIcon(), null, ExecutorAction.getActions(0));
|
||||
if (element instanceof PsiClass && PsiMethodUtil.findMainInClass((PsiClass)element) != null ||
|
||||
element instanceof PsiMethod && "main".equals(((PsiMethod)element).getName()) && PsiMethodUtil.isMainMethod((PsiMethod)element)) {
|
||||
final AnAction[] actions = ExecutorAction.getActions(0);
|
||||
return new Info(ApplicationConfigurationType.getInstance().getIcon(), new Function<PsiElement, String>() {
|
||||
@Override
|
||||
public String fun(final PsiElement element) {
|
||||
return StringUtil.join(ContainerUtil.mapNotNull(actions, new Function<AnAction, String>() {
|
||||
@Override
|
||||
public String fun(AnAction action) {
|
||||
return getText(action, element);
|
||||
}
|
||||
}), "\n");
|
||||
}
|
||||
}, actions);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -15,35 +15,52 @@
|
||||
*/
|
||||
package com.intellij.execution.lineMarker;
|
||||
|
||||
import com.intellij.ide.DataManager;
|
||||
import com.intellij.lang.LanguageExtension;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.*;
|
||||
import com.intellij.openapi.actionSystem.impl.SimpleDataContext;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.util.Function;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public abstract class RunLineMarkerContributor {
|
||||
|
||||
final static LanguageExtension<RunLineMarkerContributor> EXTENSION = new LanguageExtension<RunLineMarkerContributor>("com.intellij.runLineMarkerContributor");
|
||||
static final LanguageExtension<RunLineMarkerContributor> EXTENSION = new LanguageExtension<RunLineMarkerContributor>("com.intellij.runLineMarkerContributor");
|
||||
|
||||
public static class Info {
|
||||
|
||||
public final Icon icon;
|
||||
public final AnAction[] actions;
|
||||
public final Function<PsiElement, String> tooltipProvider;
|
||||
|
||||
public Info(Icon icon, @Nullable Function<PsiElement, String> tooltipProvider, AnAction... actions) {
|
||||
public Info(Icon icon, @Nullable Function<PsiElement, String> tooltipProvider, @NotNull AnAction... actions) {
|
||||
this.icon = icon;
|
||||
this.actions = actions;
|
||||
this.tooltipProvider = tooltipProvider;
|
||||
}
|
||||
|
||||
public Info(AnAction action) {
|
||||
this(action.getTemplatePresentation().getIcon(), null, action);
|
||||
public Info(@NotNull final AnAction action) {
|
||||
this(action.getTemplatePresentation().getIcon(), new Function<PsiElement, String>() {
|
||||
@Override
|
||||
public String fun(PsiElement element) {
|
||||
return getText(action, element);
|
||||
}
|
||||
}, action);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public abstract Info getInfo(PsiElement element);
|
||||
|
||||
@Nullable("null means disabled")
|
||||
protected static String getText(@NotNull AnAction action, @NotNull PsiElement element) {
|
||||
DataContext parent = DataManager.getInstance().getDataContext();
|
||||
DataContext dataContext = SimpleDataContext.getSimpleContext(CommonDataKeys.PSI_ELEMENT.getName(), element, parent);
|
||||
AnActionEvent event = AnActionEvent.createFromAnAction(action, null, ActionPlaces.STATUS_BAR_PLACE, dataContext);
|
||||
action.update(event);
|
||||
Presentation presentation = event.getPresentation();
|
||||
return presentation.isEnabled() && presentation.isVisible() ? presentation.getText() : null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,10 +24,12 @@ import com.intellij.openapi.actionSystem.DefaultActionGroup;
|
||||
import com.intellij.openapi.actionSystem.Separator;
|
||||
import com.intellij.openapi.editor.markup.GutterIconRenderer;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.util.Function;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@@ -42,6 +44,7 @@ public class RunLineMarkerProvider implements LineMarkerProvider {
|
||||
List<RunLineMarkerContributor> contributors = RunLineMarkerContributor.EXTENSION.allForLanguage(element.getLanguage());
|
||||
DefaultActionGroup actionGroup = null;
|
||||
Icon icon = null;
|
||||
final List<RunLineMarkerContributor.Info> infos = new ArrayList<RunLineMarkerContributor.Info>();
|
||||
for (RunLineMarkerContributor contributor : contributors) {
|
||||
RunLineMarkerContributor.Info info = contributor.getInfo(element);
|
||||
if (info == null) {
|
||||
@@ -53,6 +56,7 @@ public class RunLineMarkerProvider implements LineMarkerProvider {
|
||||
if (actionGroup == null) {
|
||||
actionGroup = new DefaultActionGroup();
|
||||
}
|
||||
infos.add(info);
|
||||
for (AnAction action : info.actions) {
|
||||
actionGroup.add(new LineMarkerActionWrapper(element, action));
|
||||
}
|
||||
@@ -61,7 +65,24 @@ public class RunLineMarkerProvider implements LineMarkerProvider {
|
||||
if (icon == null) return null;
|
||||
|
||||
final DefaultActionGroup finalActionGroup = actionGroup;
|
||||
return new LineMarkerInfo<PsiElement>(element, element.getTextOffset(), icon, Pass.UPDATE_ALL, null, null,
|
||||
Function<PsiElement, String> tooltipProvider = new Function<PsiElement, String>() {
|
||||
@Override
|
||||
public String fun(PsiElement element) {
|
||||
final StringBuilder tooltip = new StringBuilder();
|
||||
for (RunLineMarkerContributor.Info info : infos) {
|
||||
if (info.tooltipProvider != null) {
|
||||
if (tooltip.length() != 0) {
|
||||
tooltip.append("\n");
|
||||
}
|
||||
tooltip.append(info.tooltipProvider.fun(element));
|
||||
}
|
||||
}
|
||||
|
||||
return tooltip.length() == 0 ? null : tooltip.toString();
|
||||
}
|
||||
};
|
||||
return new LineMarkerInfo<PsiElement>(element, element.getTextOffset(), icon, Pass.UPDATE_ALL,
|
||||
tooltipProvider, null,
|
||||
GutterIconRenderer.Alignment.CENTER) {
|
||||
@Nullable
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user