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 8cf0e62f85f9..2057539a4037 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/PopupFactoryImpl.java @@ -159,55 +159,81 @@ public class PopupFactoryImpl extends JBPopupFactory { final Runnable disposeCallback, final int maxRowCount, final Condition preselectActionCondition, @Nullable final String actionPlace) { - final Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(dataContext); - - final ActionStepBuilder builder = new ActionStepBuilder(dataContext, showNumbers, useAlphaAsNumbers, showDisabledActions, honorActionMnemonics); - if (actionPlace != null) { - builder.setActionPlace(actionPlace); - } - builder.buildGroup(actionGroup); - final List items = builder.getItems(); - - int defaultOptionIndex = 0; - if (preselectActionCondition != null) { - for (int i = 0; i < items.size(); i++) { - final AnAction action = items.get(i).getAction(); - if (preselectActionCondition.value(action)) { - defaultOptionIndex = i; - break; - } - } - } - - ListPopupStep step = new ActionPopupStep(items, title, component, showNumbers || honorActionMnemonics && itemsHaveMnemonics(items), - defaultOptionIndex, - false, showDisabledActions); - - final ListPopupImpl popup = new ListPopupImpl(step, maxRowCount) { - public void dispose() { - if (disposeCallback != null) { - disposeCallback.run(); - } - ActionMenu.showDescriptionInStatusBar(true, component, null); - super.dispose(); - } - }; - popup.addListSelectionListener(new ListSelectionListener(){ - public void valueChanged(ListSelectionEvent e) { - final JList list = (JList)e.getSource(); - final ActionItem actionItem = (ActionItem)list.getSelectedValue(); - if (actionItem == null) return; - AnAction action = actionItem.getAction(); - Presentation presentation = new Presentation(); - presentation.setDescription(action.getTemplatePresentation().getDescription()); - final String actualActionPlace = actionPlace == null ? ActionPlaces.UNKNOWN : actionPlace; - action.update(new AnActionEvent(null, DataManager.getInstance().getDataContext(component), actualActionPlace, presentation, - ActionManager.getInstance(), 0)); - ActionMenu.showDescriptionInStatusBar(true, component, presentation.getDescription()); - } - }); - return popup; + return new ActionGroupPopup(title, actionGroup, dataContext, showNumbers, useAlphaAsNumbers, showDisabledActions, honorActionMnemonics, + disposeCallback, maxRowCount, preselectActionCondition, actionPlace); } + + public static class ActionGroupPopup extends ListPopupImpl { + + private final Runnable myDisposeCallback; + private final Component myComponent; + + public ActionGroupPopup(final String title, final ActionGroup actionGroup, @NotNull DataContext dataContext, + boolean showNumbers, boolean useAlphaAsNumbers, boolean showDisabledActions, boolean honorActionMnemonics, + final Runnable disposeCallback, final int maxRowCount, final Condition preselectActionCondition, + @Nullable final String actionPlace) { + super(createStep(title, actionGroup, dataContext, showNumbers, useAlphaAsNumbers, showDisabledActions, honorActionMnemonics, + preselectActionCondition, actionPlace), + maxRowCount); + myDisposeCallback = disposeCallback; + myComponent = PlatformDataKeys.CONTEXT_COMPONENT.getData(dataContext); + + addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + final JList list = (JList)e.getSource(); + final ActionItem actionItem = (ActionItem)list.getSelectedValue(); + if (actionItem == null) return; + AnAction action = actionItem.getAction(); + Presentation presentation = new Presentation(); + presentation.setDescription(action.getTemplatePresentation().getDescription()); + final String actualActionPlace = actionPlace == null ? ActionPlaces.UNKNOWN : actionPlace; + action.update(new AnActionEvent(null, DataManager.getInstance().getDataContext(myComponent), actualActionPlace, presentation, + ActionManager.getInstance(), 0)); + ActionMenu.showDescriptionInStatusBar(true, myComponent, presentation.getDescription()); + } + }); + } + + private static ListPopupStep createStep(String title, ActionGroup actionGroup, @NotNull DataContext dataContext, + boolean showNumbers, boolean useAlphaAsNumbers, boolean showDisabledActions, + boolean honorActionMnemonics, + Condition preselectActionCondition, @Nullable String actionPlace) { + final Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(dataContext); + + final ActionStepBuilder builder = + new ActionStepBuilder(dataContext, showNumbers, useAlphaAsNumbers, showDisabledActions, honorActionMnemonics); + if (actionPlace != null) { + builder.setActionPlace(actionPlace); + } + builder.buildGroup(actionGroup); + final List items = builder.getItems(); + + int defaultOptionIndex = 0; + if (preselectActionCondition != null) { + for (int i = 0; i < items.size(); i++) { + final AnAction action = items.get(i).getAction(); + if (preselectActionCondition.value(action)) { + defaultOptionIndex = i; + break; + } + } + } + + return new ActionPopupStep(items, title, component, showNumbers || honorActionMnemonics && itemsHaveMnemonics(items), + defaultOptionIndex, + false, showDisabledActions); + } + + @Override + public void dispose() { + if (myDisposeCallback != null) { + myDisposeCallback.run(); + } + ActionMenu.showDescriptionInStatusBar(true, myComponent, null); + super.dispose(); + } + } + public ListPopup createActionGroupPopup(final String title, final ActionGroup actionGroup, @NotNull DataContext dataContext, @@ -410,7 +436,7 @@ public class PopupFactoryImpl extends JBPopupFactory { return AbstractPopup.getCenterOf(container, content); } - private static class ActionItem { + public static class ActionItem { private final AnAction myAction; private final String myText; private final boolean myIsEnabled; diff --git a/platform/platform-impl/src/com/intellij/ui/popup/WizardPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/WizardPopup.java index 2e31bc563db3..cd844ed4cd80 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/WizardPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/WizardPopup.java @@ -362,7 +362,7 @@ public abstract class WizardPopup extends AbstractPopup implements ActionListene return new Rectangle(getContent().getLocationOnScreen(), getContent().getSize()); } - protected static WizardPopup createPopup(WizardPopup parent, PopupStep step, Object parentValue) { + protected WizardPopup createPopup(WizardPopup parent, PopupStep step, Object parentValue) { if (step instanceof ListPopupStep) { return new ListPopupImpl(parent, (ListPopupStep)step, parentValue); } diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java index f28fb4f950ce..715e459f40ac 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java @@ -25,9 +25,11 @@ import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.impl.SimpleDataContext; import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; +import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.util.IconLoader; +import com.intellij.ui.popup.PopupFactoryImpl; +import com.intellij.ui.popup.WizardPopup; import com.intellij.ui.popup.list.ListPopupImpl; import git4idea.GitVcs; import git4idea.config.GitVcsSettings; @@ -86,10 +88,22 @@ class GitBranchPopup { String title = createPopupTitle(currentRepository); - myPopup = (ListPopupImpl) JBPopupFactory.getInstance().createActionGroupPopup( + myPopup = new PopupFactoryImpl.ActionGroupPopup( title, createActions(), SimpleDataContext.getProjectContext(project), - JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, true); + false, false, false, true, null, -1, null, null) { + @Override + protected WizardPopup createPopup(WizardPopup parent, PopupStep step, Object parentValue) { + WizardPopup popup = super.createPopup(parent, step, parentValue); + if (parentValue instanceof PopupFactoryImpl.ActionItem) { + AnAction action = ((PopupFactoryImpl.ActionItem)parentValue).getAction(); + if (action instanceof RootAction) { + popup.setAdText(((RootAction)action).getCaption()); + } + } + return popup; + } + }; initBranchSyncPolicyIfNotInitialized(); setCurrentBranchInfo(); @@ -243,6 +257,11 @@ class GitBranchPopup { return group.getChildren(e); } + @NotNull + public String getCaption() { + return "Current branch in " + GitUIUtil.getShortRepositoryName(myRepository) + ": " + + GitBranchUiUtil.getDisplayableBranchText(myRepository); + } } }