diff --git a/platform/platform-api/src/com/intellij/openapi/ui/popup/ListPopupStepEx.java b/platform/platform-api/src/com/intellij/openapi/ui/popup/ListPopupStepEx.java new file mode 100644 index 000000000000..f3ea978b87e5 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/ui/popup/ListPopupStepEx.java @@ -0,0 +1,9 @@ +package com.intellij.openapi.ui.popup; + +import org.intellij.lang.annotations.MagicConstant; + +import java.awt.event.InputEvent; + +public interface ListPopupStepEx extends ListPopupStep { + PopupStep onChosen(T selectedValue, boolean finalChoice, @MagicConstant(flagsFromClass = InputEvent.class) int eventModifiers); +} \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/openapi/ui/popup/util/BaseStep.java b/platform/platform-api/src/com/intellij/openapi/ui/popup/util/BaseStep.java index b2028f05b6b9..8c80e9828889 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/popup/util/BaseStep.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/popup/util/BaseStep.java @@ -21,33 +21,39 @@ import com.intellij.openapi.ui.popup.SpeedSearchFilter; import com.intellij.util.ui.UIUtil; public abstract class BaseStep implements PopupStep, SpeedSearchFilter, MnemonicNavigationFilter { - private Runnable myFinalRunnable; + @Override public boolean isSpeedSearchEnabled() { return false; } + @Override public boolean isAutoSelectionEnabled() { return true; } + @Override public SpeedSearchFilter getSpeedSearchFilter() { return this; } + @Override public boolean canBeHidden(T value) { return true; } + @Override public String getIndexedString(T value) { return getTextFor(value); } + @Override public boolean isMnemonicsNavigationEnabled() { return false; } + @Override public int getMnemonicPos(T value) { final String text = getTextFor(value); int i = text.indexOf("&"); @@ -57,10 +63,12 @@ public abstract class BaseStep implements PopupStep, SpeedSearchFilter, return i; } + @Override public MnemonicNavigationFilter getMnemonicNavigationFilter() { return this; } + @Override public Runnable getFinalRunnable() { return myFinalRunnable; } @@ -69,4 +77,4 @@ public abstract class BaseStep implements PopupStep, SpeedSearchFilter, myFinalRunnable = runnable; return FINAL_CHOICE; } -} +} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java b/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java index 493c21273ae5..7a19b238770d 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java @@ -621,7 +621,7 @@ public class PopupFactoryImpl extends JBPopupFactory { public boolean isEnabled() { return myIsEnabled; } } - private static class ActionPopupStep implements ListPopupStep, MnemonicNavigationFilter, SpeedSearchFilter { + private static class ActionPopupStep implements ListPopupStepEx, MnemonicNavigationFilter, SpeedSearchFilter { private final List myItems; private final String myTitle; private final Component myContext; @@ -711,6 +711,11 @@ public class PopupFactoryImpl extends JBPopupFactory { @Override public PopupStep onChosen(final ActionItem actionChoice, final boolean finalChoice) { + return onChosen(actionChoice, finalChoice, 0); + } + + @Override + public PopupStep onChosen(ActionItem actionChoice, boolean finalChoice, final int eventModifiers) { if (!actionChoice.isEnabled()) return FINAL_CHOICE; final AnAction action = actionChoice.getAction(); DataManager mgr = DataManager.getInstance(); @@ -725,7 +730,7 @@ public class PopupFactoryImpl extends JBPopupFactory { myFinalRunnable = new Runnable() { @Override public void run() { - action.actionPerformed(new AnActionEvent(null, dataContext, ActionPlaces.UNKNOWN, action.getTemplatePresentation().clone(), ActionManager.getInstance(), 0)); + action.actionPerformed(new AnActionEvent(null, dataContext, ActionPlaces.UNKNOWN, action.getTemplatePresentation().clone(), ActionManager.getInstance(), eventModifiers)); } }; return FINAL_CHOICE; diff --git a/platform/platform-impl/src/com/intellij/ui/popup/list/ListPopupImpl.java b/platform/platform-impl/src/com/intellij/ui/popup/list/ListPopupImpl.java index a37e7990ec36..15e804495c84 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/list/ListPopupImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/list/ListPopupImpl.java @@ -19,10 +19,7 @@ import com.intellij.icons.AllIcons; import com.intellij.ide.IdeEventQueue; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.ui.popup.ListPopup; -import com.intellij.openapi.ui.popup.ListPopupStep; -import com.intellij.openapi.ui.popup.MultiSelectionListPopupStep; -import com.intellij.openapi.ui.popup.PopupStep; +import com.intellij.openapi.ui.popup.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.statistics.StatisticsInfo; @@ -34,6 +31,7 @@ import com.intellij.ui.popup.ClosableByLeftArrow; import com.intellij.ui.popup.WizardPopup; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.EmptyBorder; @@ -327,7 +325,7 @@ public class ListPopupImpl extends WizardPopup implements ListPopup { _handleSelect(handleFinalChoices, e); } - private boolean _handleSelect(final boolean handleFinalChoices, InputEvent e) { + private boolean _handleSelect(final boolean handleFinalChoices, @Nullable InputEvent e) { if (myList.getSelectedIndex() == -1) return false; if (getSpeedSearch().isHoldingFilter() && myList.getModel().getSize() == 0) return false; @@ -356,9 +354,16 @@ public class ListPopupImpl extends WizardPopup implements ListPopup { valuesSelected(selectedValues); - final PopupStep nextStep = listStep instanceof MultiSelectionListPopupStep - ? ((MultiSelectionListPopupStep)listStep).onChosen(Arrays.asList(selectedValues), handleFinalChoices) - : listStep.onChosen(selectedValues[0], handleFinalChoices); + final PopupStep nextStep; + if (listStep instanceof MultiSelectionListPopupStep) { + nextStep = ((MultiSelectionListPopupStep)listStep).onChosen(Arrays.asList(selectedValues), handleFinalChoices); + } + else if (e != null && listStep instanceof ListPopupStepEx) { + nextStep = ((ListPopupStepEx)listStep).onChosen(selectedValues[0], handleFinalChoices, e.getModifiers()); + } + else { + nextStep = listStep.onChosen(selectedValues[0], handleFinalChoices); + } return handleNextStep(nextStep, selectedValues.length == 1 ? selectedValues[0] : null, e); }