GitBranchPopup: show current branch in footers of each root sub-popups.

PopupFactoryImpl:
  * extract the popup created in static methods as new public class ActionGroupPopup, so that it could be overridden;
  * make ActionItem public to access getActions.
WizardPopup: make createPopup() non-static to override it.
This commit is contained in:
Kirill Likhodedov
2012-02-05 20:06:22 +04:00
parent a59f7bfc1e
commit 32b38b0e8a
3 changed files with 98 additions and 53 deletions
@@ -159,55 +159,81 @@ public class PopupFactoryImpl extends JBPopupFactory {
final Runnable disposeCallback,
final int maxRowCount,
final Condition<AnAction> 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<ActionItem> 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<AnAction> 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<AnAction> 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<ActionItem> 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;
@@ -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);
}
@@ -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);
}
}
}