From c3e03fb7eac7e20dfba5c571ad9b15e20e5c3d83 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 5 Nov 2013 15:24:07 +0400 Subject: [PATCH] [log] implement CustomActionComponents to correctly add filters to the toolbar Otherwise components are aligned incorrectly with real actions on the toolbar. --- .../log/ui/filter/VcsLogClassicFilterUi.java | 64 +++++++++++++++---- .../vcs/log/ui/filter/VcsLogFilterUi.java | 7 +- .../intellij/vcs/log/ui/frame/MainFrame.java | 20 ++---- 3 files changed, 62 insertions(+), 29 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java index efc01b969aee..0531b137b708 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogClassicFilterUi.java @@ -15,6 +15,9 @@ */ package com.intellij.vcs.log.ui.filter; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.ex.CustomComponentAction; +import com.intellij.openapi.project.DumbAwareAction; import com.intellij.ui.SearchTextField; import com.intellij.ui.SearchTextFieldWithStoredHistory; import com.intellij.util.Function; @@ -35,17 +38,14 @@ import java.util.List; */ public class VcsLogClassicFilterUi implements VcsLogFilterUi { - @NotNull private final JComponent myRootPanel; @NotNull private final List myFilterPopupComponents; @NotNull private final SearchTextField myTextFilter; @NotNull private final VcsLogUI myUi; + @NotNull private final DefaultActionGroup myActionGroup; public VcsLogClassicFilterUi(@NotNull VcsLogUI ui) { myUi = ui; - JLabel filterCaption = new JLabel("Filter:"); - filterCaption.setForeground(UIUtil.isUnderDarcula() ? UIUtil.getLabelForeground() : UIUtil.getInactiveTextColor()); - myTextFilter = new SearchTextFieldWithStoredHistory("Vcs.Log.Text.Filter.History"); myTextFilter.getTextEditor().addActionListener(new ActionListener() { @Override @@ -54,6 +54,7 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { myTextFilter.addCurrentTextToHistory(); } }); + FilterPopupComponent branchFilter = new BranchFilterPopupComponent(this, ui); FilterPopupComponent userFilter = new UserFilterPopupComponent(this, ui.getLogDataHolder(), ui.getUiProperties()); @@ -61,17 +62,15 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { myFilterPopupComponents.add(branchFilter); myFilterPopupComponents.add(userFilter); - myRootPanel = new JPanel(); - myRootPanel.add(filterCaption); - myRootPanel.add(myTextFilter); - myRootPanel.add(branchFilter); - myRootPanel.add(userFilter); + myActionGroup = new DefaultActionGroup(); + myActionGroup.add(new TextFilterComponent(myTextFilter)); + myActionGroup.add(new FilterActionComponent(branchFilter)); + myActionGroup.add(new FilterActionComponent(userFilter)); } - @NotNull @Override - public JComponent getRootComponent() { - return myRootPanel; + public ActionGroup getFilterActionComponents() { + return myActionGroup; } @NotNull @@ -99,4 +98,45 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { myUi.applyFiltersAndUpdateUi(); } + + private static class TextFilterComponent extends DumbAwareAction implements CustomComponentAction { + + private final SearchTextField mySearchField; + + TextFilterComponent(SearchTextField searchField) { + mySearchField = searchField; + } + + @Override + public JComponent createCustomComponent(Presentation presentation) { + JPanel panel = new JPanel(); + JLabel filterCaption = new JLabel("Filter:"); + filterCaption.setForeground(UIUtil.isUnderDarcula() ? UIUtil.getLabelForeground() : UIUtil.getInactiveTextColor()); + panel.add(filterCaption); + panel.add(mySearchField); + return panel; + } + + @Override + public void actionPerformed(AnActionEvent e) { + } + } + + private static class FilterActionComponent extends DumbAwareAction implements CustomComponentAction { + private final FilterPopupComponent myComponent; + + public FilterActionComponent(FilterPopupComponent component) { + myComponent = component; + } + + @Override + public JComponent createCustomComponent(Presentation presentation) { + return myComponent; + } + + @Override + public void actionPerformed(AnActionEvent e) { + } + } + } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogFilterUi.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogFilterUi.java index 59ecb0841f2d..dec8917d8875 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogFilterUi.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogFilterUi.java @@ -1,9 +1,9 @@ package com.intellij.vcs.log.ui.filter; +import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.vcs.log.VcsLogFilter; import org.jetbrains.annotations.NotNull; -import javax.swing.*; import java.util.Collection; /** @@ -14,10 +14,9 @@ import java.util.Collection; public interface VcsLogFilterUi { /** - * Returns the component which will be added to the Log toolbar. + * Returns filter components which will be added to the Log toolbar. */ - @NotNull - JComponent getRootComponent(); + ActionGroup getFilterActionComponents(); /** * Returns the filters currently active, i.e. switched on by user. diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java index 2c835e62ee5d..e63a1dab3766 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java @@ -10,10 +10,7 @@ import com.intellij.openapi.vcs.VcsDataKeys; import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.committed.RepositoryChangesBrowser; import com.intellij.openapi.vcs.changes.ui.ChangesBrowser; -import com.intellij.ui.JBColor; import com.intellij.ui.ScrollPaneFactory; -import com.intellij.ui.SeparatorComponent; -import com.intellij.ui.SeparatorOrientation; import com.intellij.ui.components.JBLoadingPanel; import com.intellij.util.ArrayUtil; import com.intellij.vcs.log.VcsLog; @@ -81,7 +78,7 @@ public class MainFrame extends JPanel implements TypeSafeDataProvider { updateWhenDetailsAreLoaded(selectionChangeListener); // layout - JComponent toolbar = createToolbar(); + JComponent toolbar = createActionsToolbar(); myDetailsSplitter = new Splitter(true, 0.7f); myDetailsSplitter.setFirstComponent(ScrollPaneFactory.createScrollPane(myGraphTable)); @@ -102,14 +99,6 @@ public class MainFrame extends JPanel implements TypeSafeDataProvider { add(changesBrowserSplitter); } - private JComponent createToolbar() { - JComponent toolbar = Box.createHorizontalBox(); - toolbar.add(myFilterUi.getRootComponent()); - toolbar.add(new SeparatorComponent(JBColor.LIGHT_GRAY, SeparatorOrientation.VERTICAL)); - toolbar.add(createActionsToolbar()); - return toolbar; - } - private void updateWhenDetailsAreLoaded(final CommitSelectionListener selectionChangeListener) { myLogDataHolder.getMiniDetailsGetter().addDetailsLoadedListener(new Runnable() { @Override @@ -205,7 +194,12 @@ public class MainFrame extends JPanel implements TypeSafeDataProvider { DefaultActionGroup toolbarGroup = new DefaultActionGroup(hideBranchesAction, showBranchesAction, showFullPatchAction, refreshAction, showDetailsAction); toolbarGroup.add(ActionManager.getInstance().getAction(VcsLogUI.TOOLBAR_ACTION_GROUP)); - return ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, toolbarGroup, true).getComponent(); + + DefaultActionGroup mainGroup = new DefaultActionGroup(); + mainGroup.add(myFilterUi.getFilterActionComponents()); + mainGroup.addSeparator(); + mainGroup.add(toolbarGroup); + return ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, mainGroup, true).getComponent(); } public JComponent getMainComponent() {