[log] implement CustomActionComponents to correctly add filters to the toolbar

Otherwise components are aligned incorrectly with real actions on the
toolbar.
This commit is contained in:
Kirill Likhodedov
2013-11-05 15:24:40 +04:00
parent 989e597f3d
commit c3e03fb7ea
3 changed files with 62 additions and 29 deletions
@@ -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<FilterPopupComponent> 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) {
}
}
}
@@ -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.
@@ -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() {