| package com.intellij.codeInspection.ui.actions; |
| |
| import com.intellij.CommonBundle; |
| import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; |
| import com.intellij.codeInsight.daemon.HighlightDisplayKey; |
| import com.intellij.codeInspection.InspectionsBundle; |
| import com.intellij.codeInspection.ModifiableModel; |
| import com.intellij.codeInspection.actions.RunInspectionIntention; |
| import com.intellij.codeInspection.ex.DisableInspectionToolAction; |
| import com.intellij.codeInspection.ex.InspectionProfileImpl; |
| import com.intellij.codeInspection.ex.InspectionToolWrapper; |
| import com.intellij.codeInspection.reference.RefElement; |
| import com.intellij.codeInspection.reference.RefEntity; |
| import com.intellij.codeInspection.ui.InspectionResultsView; |
| import com.intellij.codeInspection.ui.InspectionTree; |
| import com.intellij.icons.AllIcons; |
| import com.intellij.openapi.actionSystem.AnAction; |
| import com.intellij.openapi.actionSystem.AnActionEvent; |
| import com.intellij.openapi.actionSystem.DataContext; |
| import com.intellij.openapi.actionSystem.DefaultActionGroup; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.ui.Messages; |
| import com.intellij.openapi.ui.popup.JBPopupFactory; |
| import com.intellij.openapi.ui.popup.ListPopup; |
| import com.intellij.profile.codeInspection.InspectionProjectProfileManager; |
| import com.intellij.psi.PsiElement; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| /** |
| * User: anna |
| * Date: 11-Jan-2006 |
| */ |
| public class InspectionsOptionsToolbarAction extends AnAction { |
| private final InspectionResultsView myView; |
| |
| public InspectionsOptionsToolbarAction(final InspectionResultsView view) { |
| super(getToolOptions(null), getToolOptions(null), AllIcons.General.InspectionsOff); |
| myView = view; |
| } |
| |
| @Override |
| public void actionPerformed(AnActionEvent e) { |
| final DefaultActionGroup options = new DefaultActionGroup(); |
| final List<AnAction> actions = createActions(); |
| for (AnAction action : actions) { |
| options.add(action); |
| } |
| final DataContext dataContext = e.getDataContext(); |
| final ListPopup popup = JBPopupFactory.getInstance() |
| .createActionGroupPopup(getSelectedToolWrapper().getDisplayName(), options, dataContext, |
| JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false); |
| InspectionResultsView.showPopup(e, popup); |
| } |
| |
| @Nullable |
| private InspectionToolWrapper getSelectedToolWrapper() { |
| return myView.getTree().getSelectedToolWrapper(); |
| } |
| |
| @Override |
| public void update(AnActionEvent e) { |
| if (!myView.isSingleToolInSelection()) { |
| e.getPresentation().setEnabled(false); |
| return; |
| } |
| InspectionToolWrapper toolWrapper = getSelectedToolWrapper(); |
| assert toolWrapper != null; |
| final HighlightDisplayKey key = HighlightDisplayKey.find(toolWrapper.getShortName()); |
| if (key == null) { |
| e.getPresentation().setEnabled(false); |
| } |
| e.getPresentation().setEnabled(true); |
| final String text = getToolOptions(toolWrapper); |
| e.getPresentation().setText(text); |
| e.getPresentation().setDescription(text); |
| } |
| |
| @NotNull |
| private static String getToolOptions(@Nullable final InspectionToolWrapper toolWrapper) { |
| return InspectionsBundle.message("inspections.view.options.title", toolWrapper != null ? toolWrapper.getDisplayName() : ""); |
| } |
| |
| public List<AnAction> createActions() { |
| final List<AnAction> result = new ArrayList<AnAction>(); |
| final InspectionTree tree = myView.getTree(); |
| final InspectionToolWrapper toolWrapper = tree.getSelectedToolWrapper(); |
| if (toolWrapper == null) return result; |
| final HighlightDisplayKey key = HighlightDisplayKey.find(toolWrapper.getShortName()); |
| if (key == null) return result; |
| |
| result.add(new DisableInspectionAction(key)); |
| |
| result.add(new AnAction(InspectionsBundle.message("run.inspection.on.file.intention.text")) { |
| @Override |
| public void actionPerformed(final AnActionEvent e) { |
| final PsiElement psiElement = getPsiElement(tree); |
| assert psiElement != null; |
| new RunInspectionIntention(toolWrapper).invoke(myView.getProject(), null, psiElement.getContainingFile()); |
| } |
| |
| @Override |
| public void update(AnActionEvent e) { |
| e.getPresentation().setEnabled(getPsiElement(tree) != null); |
| } |
| |
| @Nullable |
| private PsiElement getPsiElement(InspectionTree tree) { |
| final RefEntity[] selectedElements = tree.getSelectedElements(); |
| |
| final PsiElement psiElement; |
| if (selectedElements.length > 0 && selectedElements[0] instanceof RefElement) { |
| psiElement = ((RefElement)selectedElements[0]).getElement(); |
| } |
| else { |
| psiElement = null; |
| } |
| return psiElement; |
| } |
| }); |
| |
| result.add(new SuppressActionWrapper(myView.getProject(), toolWrapper, tree.getSelectionPaths())); |
| |
| |
| return result; |
| } |
| |
| private class DisableInspectionAction extends AnAction { |
| private final HighlightDisplayKey myKey; |
| |
| public DisableInspectionAction(final HighlightDisplayKey key) { |
| super(DisableInspectionToolAction.NAME); |
| myKey = key; |
| } |
| |
| @Override |
| public void actionPerformed(final AnActionEvent e) { |
| try { |
| if (myView.isProfileDefined()) { |
| final ModifiableModel model = myView.getCurrentProfile().getModifiableModel(); |
| model.disableTool(myKey.toString(), myView.getProject()); |
| model.commit(); |
| myView.updateCurrentProfile(); |
| } else { |
| final RefEntity[] selectedElements = myView.getTree().getSelectedElements(); |
| final Set<PsiElement> files = new HashSet<PsiElement>(); |
| final Project project = myView.getProject(); |
| final InspectionProjectProfileManager profileManager = InspectionProjectProfileManager.getInstance(project); |
| for (RefEntity selectedElement : selectedElements) { |
| if (selectedElement instanceof RefElement) { |
| final PsiElement element = ((RefElement)selectedElement).getElement(); |
| files.add(element); |
| } |
| } |
| ModifiableModel model = ((InspectionProfileImpl)profileManager.getProjectProfileImpl()).getModifiableModel(); |
| for (PsiElement element : files) { |
| model.disableTool(myKey.toString(), element); |
| } |
| model.commit(); |
| DaemonCodeAnalyzer.getInstance(project).restart(); |
| } |
| } |
| catch (IOException e1) { |
| Messages.showErrorDialog(myView.getProject(), e1.getMessage(), CommonBundle.getErrorTitle()); |
| } |
| } |
| } |
| } |