branchPopup: implement toolbar-like option component

* IDEA-175651 Update expand icon in Branches popup: use smaller icon
 for restore default size action on toolbar;
* implement custom on hover policy;
* now vertical size of the popup title panel stay unchanged while icon
changes its visibility;
* IDEA-166377 add popup setting with control repositories synchronously
 toggle action;
This commit is contained in:
Nadya Zabrodina
2017-08-07 16:15:05 +03:00
parent 818ff28911
commit d448b64d65
2 changed files with 93 additions and 27 deletions
@@ -19,12 +19,12 @@ import com.intellij.dvcs.DvcsUtil;
import com.intellij.dvcs.repo.AbstractRepositoryManager;
import com.intellij.dvcs.repo.Repository;
import com.intellij.dvcs.ui.BranchActionGroupPopup;
import com.intellij.dvcs.ui.DvcsBundle;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationListener;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.openapi.util.Condition;
@@ -65,6 +65,9 @@ public abstract class DvcsBranchPopup<Repo extends Repository> {
myPopup = new BranchActionGroupPopup(title + myRepoTitleInfo, myProject, preselectActionCondition, createActions(), dimensionKey);
initBranchSyncPolicyIfNotInitialized();
warnThatBranchesDivergedIfNeeded();
if (myRepositoryManager.moreThanOneRoot()) {
myPopup.addSettingAction(new TrackReposSynchronouslyAction(myVcsSettings));
}
}
@NotNull
@@ -156,4 +159,23 @@ public abstract class DvcsBranchPopup<Repo extends Repository> {
public static final int MAX_NUM = 8;
public static final int DEFAULT_NUM = 5;
}
private static class TrackReposSynchronouslyAction extends ToggleAction implements DumbAware {
private final DvcsSyncSettings myVcsSettings;
public TrackReposSynchronouslyAction(@NotNull DvcsSyncSettings vcsSettings) {
super(DvcsBundle.message("sync.setting"), DvcsBundle.message("sync.setting.description", "repository"), null);
myVcsSettings = vcsSettings;
}
@Override
public boolean isSelected(AnActionEvent e) {
return myVcsSettings.getSyncSetting() == DvcsSyncSettings.Value.SYNC;
}
@Override
public void setSelected(AnActionEvent e, boolean state) {
myVcsSettings.setSyncSetting(state ? DvcsSyncSettings.Value.SYNC : DvcsSyncSettings.Value.DONT_SYNC);
}
}
}
@@ -19,6 +19,7 @@ import com.intellij.icons.AllIcons;
import com.intellij.ide.DataManager;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.impl.ActionManagerImpl;
import com.intellij.openapi.actionSystem.impl.SimpleDataContext;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
@@ -30,6 +31,7 @@ import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.WindowStateService;
import com.intellij.openapi.vcs.ui.FlatSpeedSearchPopup;
import com.intellij.ui.*;
import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.ui.components.panels.OpaquePanel;
import com.intellij.ui.popup.KeepingPopupOpenAction;
import com.intellij.ui.popup.PopupFactoryImpl;
@@ -47,15 +49,19 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import static com.intellij.icons.AllIcons.General.CollapseComponent;
import static com.intellij.icons.AllIcons.General.CollapseComponentHover;
import static com.intellij.util.ui.UIUtil.DEFAULT_HGAP;
import static com.intellij.util.ui.UIUtil.DEFAULT_VGAP;
public class BranchActionGroupPopup extends FlatSpeedSearchPopup {
private static final DataKey<ListPopupModel> POPUP_MODEL = DataKey.create("VcsPopupModel");
static final String BRANCH_POPUP = "BranchWidget";
private Project myProject;
private MyPopupListElementRenderer myListElementRenderer;
private boolean myShown;
@@ -64,6 +70,9 @@ public class BranchActionGroupPopup extends FlatSpeedSearchPopup {
private int myMeanRowHeight;
@Nullable private final String myKey;
@NotNull private Dimension myPrevSize = JBUI.emptySize();
private MyToolbarButton myRestoreSizeButton;
private MyToolbarButton mySettingsButton;
private final List<AnAction> mySettingsActions = ContainerUtil.newArrayList();
public BranchActionGroupPopup(@NotNull String title,
@NotNull Project project,
@@ -81,41 +90,46 @@ public class BranchActionGroupPopup extends FlatSpeedSearchPopup {
if (storedSize != null) {
//set forced size before component is shown
setSize(storedSize);
myUserSizeChanged = true;
}
createTitlePanelToolbar(myKey);
}
myMeanRowHeight = getList().getCellBounds(0, 0).height + UIUtil.getListCellVPadding() * 2;
}
void createTitlePanelToolbar(@NotNull String dimensionKey) {
AnAction restoreDefaultSizeAction =
new DumbAwareAction("Restore Size", "Restore default size for widget", AllIcons.Vcs.RestoreDefaultSize) {
@Override
public void actionPerformed(AnActionEvent e) {
WindowStateService.getInstance(myProject).putSizeFor(myProject, dimensionKey, null);
myInternalSizeChanged = true;
pack(true, true);
}
@Override
public void update(AnActionEvent e) {
e.getPresentation().setEnabledAndVisible(myUserSizeChanged ||
WindowStateService.getInstance(myProject).getSizeFor(myProject, dimensionKey) != null);
}
};
final ActionToolbar popupTitleToolbar = ActionManager.getInstance()
.createActionToolbar("BranchWidget", new DefaultActionGroup(restoreDefaultSizeAction), true);
final JComponent toolbarComponent = popupTitleToolbar.getComponent();
popupTitleToolbar.setReservePlaceAutoPopupIcon(false);
toolbarComponent.setBorder(JBUI.Borders.emptyRight(2));
toolbarComponent.setOpaque(false);
private void createTitlePanelToolbar(@NotNull String dimensionKey) {
JPanel panel = new NonOpaquePanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
myRestoreSizeButton = new MyToolbarButton("Restore Size", CollapseComponent, CollapseComponentHover, e -> {
WindowStateService.getInstance(myProject).putSizeFor(myProject, dimensionKey, null);
myInternalSizeChanged = true;
pack(true, true);
}) {
@Override
protected boolean isButtonEnabled() {
return myUserSizeChanged;
}
};
mySettingsButton = new MyToolbarButton("Settings", AllIcons.General.Gear, AllIcons.General.GearHover, e -> {
final ActionPopupMenu popupMenu =
((ActionManagerImpl)ActionManager.getInstance()).createActionPopupMenu(BRANCH_POPUP, new DefaultActionGroup(mySettingsActions));
popupMenu.getComponent().show(mySettingsButton, 0, mySettingsButton.getHeight());
}) {
@Override
protected boolean isButtonEnabled() {
return !mySettingsActions.isEmpty();
}
};
mySettingsButton.setBorder(JBUI.Borders.emptyLeft(4));
panel.add(myRestoreSizeButton);
panel.add(mySettingsButton);
getTitle().setButtonComponent(new ActiveComponent.Adapter() {
@Override
public JComponent getComponent() {
return toolbarComponent;
return panel;
}
}, null);
}, JBUI.Borders.emptyRight(2));
}
//for child popups only
@@ -170,6 +184,7 @@ public class BranchActionGroupPopup extends FlatSpeedSearchPopup {
//ugly properties to distinguish user size changed from pack method call after Restore Size action performed
myUserSizeChanged = !myInternalSizeChanged;
myInternalSizeChanged = false;
myRestoreSizeButton.update();
}
@NotNull
@@ -185,6 +200,11 @@ public class BranchActionGroupPopup extends FlatSpeedSearchPopup {
return result;
}
public void addSettingAction(@NotNull AnAction action) {
mySettingsActions.add(action);
mySettingsButton.update();
}
@NotNull
private static ActionGroup createBranchSpeedSearchActionGroup(@NotNull ActionGroup actionGroup) {
return new DefaultActionGroup(null, createSpeedSearchActions(actionGroup, true), false);
@@ -527,4 +547,28 @@ public class BranchActionGroupPopup extends FlatSpeedSearchPopup {
parentGroup.addAll(actionList);
}
}
private static abstract class MyToolbarButton extends JButton {
public MyToolbarButton(@NotNull String text, @NotNull Icon icon, @NotNull Icon rolloverIcon, @NotNull ActionListener buttonListener) {
super(icon);
setToolTipText(text);
setBorder(IdeBorderFactory.createEmptyBorder());
setBorderPainted(false);
setContentAreaFilled(false);
setOpaque(false);
setRolloverEnabled(true);
setRolloverIcon(rolloverIcon);
addActionListener(buttonListener);
update();
setUI(new BasicButtonUI());
}
public void update() {
boolean enabled = isButtonEnabled();
setEnabled(enabled);
setVisible(enabled);
}
protected abstract boolean isButtonEnabled();
}
}