provide tooltip for "run" guter icon

This commit is contained in:
Alexey Kudravtsev
2015-11-16 19:11:50 +03:00
parent 4f4ba9986a
commit 8a67ff12ee
3 changed files with 66 additions and 14 deletions

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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