From cb474f4df388b31ba96b107d08f1a123601c5c93 Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Sun, 1 Jul 2018 22:14:55 +0300 Subject: [PATCH] [vcs-log] keep recent filters in a map by filter name --- .../vcs/log/impl/MainVcsLogUiProperties.java | 10 +-- .../log/impl/VcsLogProjectTabsProperties.java | 67 ++++++++++--------- .../ui/filter/BranchFilterPopupComponent.java | 15 +---- .../MultipleValueFilterPopupComponent.java | 8 ++- .../ui/filter/UserFilterPopupComponent.java | 17 +---- .../log/ui/filter/VcsLogPopupComponent.java | 2 +- .../log/GitExternalLogTabsProperties.java | 38 ++++------- 7 files changed, 64 insertions(+), 93 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/MainVcsLogUiProperties.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/MainVcsLogUiProperties.java index ff26fa03376e..4580d55125ff 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/MainVcsLogUiProperties.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/MainVcsLogUiProperties.java @@ -20,6 +20,7 @@ import com.intellij.vcs.log.graph.PermanentGraph; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -33,15 +34,10 @@ public interface MainVcsLogUiProperties extends VcsLogUiProperties { VcsLogUiProperty TEXT_FILTER_REGEX = new VcsLogUiProperty<>("TextFilter.Regex"); VcsLogUiProperty SHOW_CHANGES_FROM_PARENTS = new VcsLogUiProperty<>("Changes.ShowChangesFromParents"); - void addRecentlyFilteredUserGroup(@NotNull List usersInGroup); - - void addRecentlyFilteredBranchGroup(@NotNull List valuesInGroup); + void addRecentlyFilteredGroup(@NotNull String filterName, @NotNull Collection values); @NotNull - List> getRecentlyFilteredUserGroups(); - - @NotNull - List> getRecentlyFilteredBranchGroups(); + List> getRecentlyFilteredGroups(@NotNull String filterName); void saveFilterValues(@NotNull String filterName, @Nullable List values); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogProjectTabsProperties.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogProjectTabsProperties.java index 9cbac3007c41..1521d3abcdc6 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogProjectTabsProperties.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogProjectTabsProperties.java @@ -14,6 +14,8 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import static com.intellij.util.containers.ContainerUtil.*; +import static com.intellij.vcs.log.ui.filter.BranchFilterPopupComponent.BRANCH_FILTER_NAME; +import static com.intellij.vcs.log.ui.filter.UserFilterPopupComponent.USER_FILER_NAME; import static java.util.Comparator.comparingInt; @State(name = "Vcs.Log.Tabs.Properties", storages = {@Storage(file = StoragePathMacros.WORKSPACE_FILE)}) @@ -42,10 +44,9 @@ public class VcsLogProjectTabsProperties implements PersistentStateComponent(); - myState.RECENTLY_FILTERED_USER_GROUPS = new ArrayDeque<>(); + myState.RECENT_FILTERS = newHashMap(); Multiset branchFrequencies = HashMultiset.create(); Multiset userFrequencies = HashMultiset.create(); @@ -61,8 +62,8 @@ public class VcsLogProjectTabsProperties implements PersistentStateComponent sortedBranches = sorted(branchFrequencies.elementSet(), comparingInt(value -> -branchFrequencies.count(value))); List sortedUsers = sorted(userFrequencies.elementSet(), comparingInt(value -> -userFrequencies.count(value))); - myState.RECENTLY_FILTERED_BRANCH_GROUPS.addAll(getFirstItems(sortedBranches, RECENTLY_FILTERED_VALUES_LIMIT)); - myState.RECENTLY_FILTERED_USER_GROUPS.addAll(getFirstItems(sortedUsers, RECENTLY_FILTERED_VALUES_LIMIT)); + myState.RECENT_FILTERS.put(BRANCH_FILTER_NAME, newArrayList(getFirstItems(sortedBranches, RECENTLY_FILTERED_VALUES_LIMIT))); + myState.RECENT_FILTERS.put(USER_FILER_NAME, newArrayList(getFirstItems(sortedUsers, RECENTLY_FILTERED_VALUES_LIMIT))); } } @@ -97,28 +98,37 @@ public class VcsLogProjectTabsProperties implements PersistentStateComponent valuesInGroup, @NotNull Deque stateField) { - RecentGroup group = new RecentGroup(); - group.FILTER_VALUES = valuesInGroup; - if (stateField.contains(group)) { + public static void addRecentGroup(@NotNull Map> stateField, + @NotNull String filterName, + @NotNull Collection values) { + List recentGroups = stateField.get(filterName); + if (recentGroups == null) { + recentGroups = newArrayList(); + stateField.put(filterName, recentGroups); + } + RecentGroup group = new RecentGroup(values); + if (recentGroups.contains(group)) { return; } - stateField.addFirst(group); - while (stateField.size() > RECENTLY_FILTERED_VALUES_LIMIT) { - stateField.removeLast(); + recentGroups.add(0, group); + while (recentGroups.size() > RECENTLY_FILTERED_VALUES_LIMIT) { + recentGroups.remove(recentGroups.size() - 1); } } @NotNull - public static List> getRecentGroup(@NotNull Deque stateField) { - return map2List(stateField, group -> group.FILTER_VALUES); + public static List> getRecentGroup(@NotNull Map> stateField, @NotNull String filterName) { + List values = stateField.get(filterName); + if (values == null) { + return emptyList(); + } + return map2List(values, group -> group.FILTER_VALUES); } public static class State { public Map TAB_STATES = newTreeMap(); public LinkedHashSet OPEN_TABS = newLinkedHashSet(); - public Deque RECENTLY_FILTERED_USER_GROUPS = new ArrayDeque<>(); - public Deque RECENTLY_FILTERED_BRANCH_GROUPS = new ArrayDeque<>(); + public Map> RECENT_FILTERS = newHashMap(); } public static class RecentGroup { @@ -128,8 +138,12 @@ public class VcsLogProjectTabsProperties implements PersistentStateComponent values) { + FILTER_VALUES.addAll(values); + } + public RecentGroup(@NotNull VcsLogUiPropertiesImpl.UserGroup oldGroup) { - FILTER_VALUES.addAll(oldGroup.users); + this(oldGroup.users); } @Override @@ -171,25 +185,14 @@ public class VcsLogProjectTabsProperties implements PersistentStateComponent usersInGroup) { - addRecentGroup(usersInGroup, myState.RECENTLY_FILTERED_USER_GROUPS); + public void addRecentlyFilteredGroup(@NotNull String filterName, @NotNull Collection values) { + addRecentGroup(myState.RECENT_FILTERS, filterName, values); } - @Override - public void addRecentlyFilteredBranchGroup(@NotNull List valuesInGroup) { - addRecentGroup(valuesInGroup, myState.RECENTLY_FILTERED_BRANCH_GROUPS); - } - - @Override @NotNull - public List> getRecentlyFilteredUserGroups() { - return getRecentGroup(myState.RECENTLY_FILTERED_USER_GROUPS); - } - @Override - @NotNull - public List> getRecentlyFilteredBranchGroups() { - return getRecentGroup(myState.RECENTLY_FILTERED_BRANCH_GROUPS); + public List> getRecentlyFilteredGroups(@NotNull String filterName) { + return getRecentGroup(myState.RECENT_FILTERS, filterName); } } } \ No newline at end of file diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/BranchFilterPopupComponent.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/BranchFilterPopupComponent.java index 49f97f8c9668..8e5244bc392c 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/BranchFilterPopupComponent.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/BranchFilterPopupComponent.java @@ -38,16 +38,16 @@ import org.jetbrains.annotations.Nullable; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; -import java.util.ArrayList; import java.util.Collection; import java.util.List; public class BranchFilterPopupComponent extends MultipleValueFilterPopupComponent { + public static final String BRANCH_FILTER_NAME = "Branch"; private final VcsLogClassicFilterUi.BranchFilterModel myBranchFilterModel; public BranchFilterPopupComponent(@NotNull MainVcsLogUiProperties uiProperties, @NotNull VcsLogClassicFilterUi.BranchFilterModel filterModel) { - super("Branch", uiProperties, filterModel); + super(BRANCH_FILTER_NAME, uiProperties, filterModel); myBranchFilterModel = filterModel; } @@ -86,17 +86,6 @@ public class BranchFilterPopupComponent extends MultipleValueFilterPopupComponen return actionGroup; } - @NotNull - @Override - protected List> getRecentValuesFromSettings() { - return myUiProperties.getRecentlyFilteredBranchGroups(); - } - - @Override - protected void rememberValuesInSettings(@NotNull Collection values) { - myUiProperties.addRecentlyFilteredBranchGroup(new ArrayList<>(values)); - } - @NotNull @Override protected List getAllValues() { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/MultipleValueFilterPopupComponent.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/MultipleValueFilterPopupComponent.java index 4f3ef7e86416..a72e48d8875f 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/MultipleValueFilterPopupComponent.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/MultipleValueFilterPopupComponent.java @@ -48,9 +48,13 @@ abstract class MultipleValueFilterPopupComponent ex } @NotNull - protected abstract List> getRecentValuesFromSettings(); + protected List> getRecentValuesFromSettings() { + return myUiProperties.getRecentlyFilteredGroups(myName); + } - protected abstract void rememberValuesInSettings(@NotNull Collection values); + protected void rememberValuesInSettings(@NotNull Collection values) { + myUiProperties.addRecentlyFilteredGroup(myName, values); + } @NotNull protected abstract List getAllValues(); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/UserFilterPopupComponent.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/UserFilterPopupComponent.java index 177a11f58556..77bbb5afe9e2 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/UserFilterPopupComponent.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/UserFilterPopupComponent.java @@ -31,21 +31,21 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.TreeSet; /** * Show a popup to select a user or enter the user name. */ -class UserFilterPopupComponent extends MultipleValueFilterPopupComponent { +public class UserFilterPopupComponent extends MultipleValueFilterPopupComponent { + public static final String USER_FILER_NAME = "User"; @NotNull private final VcsLogData myLogData; @NotNull private final List myAllUsers; UserFilterPopupComponent(@NotNull MainVcsLogUiProperties uiProperties, @NotNull VcsLogData logData, @NotNull FilterModel filterModel) { - super("User", uiProperties, filterModel); + super(USER_FILER_NAME, uiProperties, filterModel); myLogData = logData; myAllUsers = collectUsers(logData); } @@ -85,17 +85,6 @@ class UserFilterPopupComponent extends MultipleValueFilterPopupComponent> getRecentValuesFromSettings() { - return myUiProperties.getRecentlyFilteredUserGroups(); - } - - @Override - protected void rememberValuesInSettings(@NotNull Collection values) { - myUiProperties.addRecentlyFilteredUserGroup(new ArrayList<>(values)); - } - @NotNull @Override protected List getAllValues() { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogPopupComponent.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogPopupComponent.java index 75b4164ed897..e9dab6126669 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogPopupComponent.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogPopupComponent.java @@ -34,7 +34,7 @@ public abstract class VcsLogPopupComponent extends JPanel { private static final int GAP_BEFORE_ARROW = 3; private static final int BORDER_SIZE = 2; - @NotNull private final String myName; + @NotNull protected final String myName; @NotNull private JLabel myNameLabel; @NotNull private JLabel myValueLabel; diff --git a/plugins/git4idea/src/git4idea/log/GitExternalLogTabsProperties.java b/plugins/git4idea/src/git4idea/log/GitExternalLogTabsProperties.java index 8ebf5850ea9f..f28a3cf264a7 100644 --- a/plugins/git4idea/src/git4idea/log/GitExternalLogTabsProperties.java +++ b/plugins/git4idea/src/git4idea/log/GitExternalLogTabsProperties.java @@ -8,14 +8,17 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xmlb.annotations.XCollection; import com.intellij.util.xmlb.annotations.XMap; import com.intellij.vcs.log.impl.*; +import com.intellij.vcs.log.impl.VcsLogProjectTabsProperties.RecentGroup; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayDeque; -import java.util.Deque; +import java.util.Collection; import java.util.List; import java.util.Map; +import static com.intellij.vcs.log.ui.filter.BranchFilterPopupComponent.BRANCH_FILTER_NAME; +import static com.intellij.vcs.log.ui.filter.UserFilterPopupComponent.USER_FILER_NAME; + @State( name = "Git.Log.External.Tabs.Properties", storages = { @@ -66,10 +69,10 @@ public class GitExternalLogTabsProperties implements PersistentStateComponent recentBranches = ContainerUtil.map2List(oldState.RECENTLY_FILTERED_BRANCH_GROUPS, RecentGroup::new); + List recentUsers = ContainerUtil.map2List(oldState.RECENTLY_FILTERED_USER_GROUPS, RecentGroup::new); + newState.RECENT_FILTERS.put(BRANCH_FILTER_NAME, recentBranches); + newState.RECENT_FILTERS.put(USER_FILER_NAME, recentUsers); newState.HIGHLIGHTERS.putAll(oldState.HIGHLIGHTERS); newState.FILTERS.putAll(oldState.FILTERS); newState.COLUMN_WIDTH.putAll(oldState.COLUMN_WIDTH); @@ -90,9 +93,7 @@ public class GitExternalLogTabsProperties implements PersistentStateComponent RECENT_USER_FILTERS = new ArrayDeque<>(); - @XCollection - public Deque RECENT_BRANCH_FILTERS = new ArrayDeque<>(); + public Map> RECENT_FILTERS = ContainerUtil.newHashMap(); } private class MyVcsLogUiProperties extends VcsLogUiPropertiesImpl { @@ -115,25 +116,14 @@ public class GitExternalLogTabsProperties implements PersistentStateComponent usersInGroup) { - VcsLogProjectTabsProperties.addRecentGroup(usersInGroup, getState().RECENT_USER_FILTERS); - } - - @Override - public void addRecentlyFilteredBranchGroup(@NotNull List valuesInGroup) { - VcsLogProjectTabsProperties.addRecentGroup(valuesInGroup, getState().RECENT_BRANCH_FILTERS); + public void addRecentlyFilteredGroup(@NotNull String filterName, @NotNull Collection values) { + VcsLogProjectTabsProperties.addRecentGroup(getState().RECENT_FILTERS, filterName, values); } @NotNull @Override - public List> getRecentlyFilteredUserGroups() { - return VcsLogProjectTabsProperties.getRecentGroup(getState().RECENT_USER_FILTERS); - } - - @NotNull - @Override - public List> getRecentlyFilteredBranchGroups() { - return VcsLogProjectTabsProperties.getRecentGroup(getState().RECENT_BRANCH_FILTERS); + public List> getRecentlyFilteredGroups(@NotNull String filterName) { + return VcsLogProjectTabsProperties.getRecentGroup(getState().RECENT_FILTERS, filterName); } } }