From b50bb2102f40b68631c3b19c62db2dd8d22c6e44 Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Wed, 19 Dec 2018 18:33:48 +0300 Subject: [PATCH] [vcs-log] allow to open new log tab with specific filters set --- .../VcsLogFileHistoryProviderImpl.java | 5 +- .../intellij/vcs/log/impl/VcsLogManager.java | 29 ++++++----- .../vcs/log/impl/VcsLogTabsManager.java | 17 ++++--- .../com/intellij/vcs/log/ui/VcsLogUiImpl.java | 8 +-- .../vcs/log/ui/filter/FilterModel.java | 39 +++++++-------- .../log/ui/filter/VcsLogClassicFilterUi.java | 49 ++++++++++++------- .../intellij/vcs/log/ui/frame/MainFrame.java | 11 ++--- .../log/visible/filters/VcsLogFileFilter.java | 3 +- 8 files changed, 92 insertions(+), 69 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/VcsLogFileHistoryProviderImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/VcsLogFileHistoryProviderImpl.java index 7e368f4ddbe9..2bb7dd792094 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/VcsLogFileHistoryProviderImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/VcsLogFileHistoryProviderImpl.java @@ -92,11 +92,8 @@ public class VcsLogFileHistoryProviderImpl implements VcsLogFileHistoryProvider }); boolean firstTime = ui == null; if (firstTime) { - ui = VcsProjectLog.getInstance(project).getTabsManager().openAnotherLogTab(logManager, true); VcsLogFilterCollection filters = createFilters(path, hash, root); - for (VcsLogFilter f : filters.getFilters()) { - ui.getFilterUi().setFilter(f); - } + ui = VcsProjectLog.getInstance(project).getTabsManager().openAnotherLogTab(logManager, filters); } consumer.accept(ui, firstTime); } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java index ce4115669321..2295ffe236b1 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java @@ -14,16 +14,19 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; +import com.intellij.vcs.log.VcsLogFilterCollection; import com.intellij.vcs.log.VcsLogProvider; import com.intellij.vcs.log.VcsLogRefresher; import com.intellij.vcs.log.data.VcsLogData; import com.intellij.vcs.log.data.VcsLogStorage; import com.intellij.vcs.log.data.index.VcsLogModifiableIndex; +import com.intellij.vcs.log.graph.PermanentGraph; import com.intellij.vcs.log.ui.AbstractVcsLogUi; import com.intellij.vcs.log.ui.VcsLogColorManagerImpl; import com.intellij.vcs.log.ui.VcsLogUiImpl; import com.intellij.vcs.log.visible.VcsLogFiltererImpl; import com.intellij.vcs.log.visible.VisiblePackRefresherImpl; +import com.intellij.vcs.log.visible.filters.VcsLogFilterObject; import org.jetbrains.annotations.CalledInAny; import org.jetbrains.annotations.CalledInAwt; import org.jetbrains.annotations.NotNull; @@ -100,12 +103,12 @@ public class VcsLogManager implements Disposable { @NotNull public VcsLogUiImpl createLogUi(@NotNull String logId, boolean isToolWindowTab) { - return createLogUi(getMainLogUiFactory(logId), isToolWindowTab); + return createLogUi(getMainLogUiFactory(logId, null), isToolWindowTab); } @NotNull - public VcsLogUiFactory getMainLogUiFactory(@NotNull String logId) { - return new MainVcsLogUiFactory(logId); + public VcsLogUiFactory getMainLogUiFactory(@NotNull String logId, @Nullable VcsLogFilterCollection filters) { + return new MainVcsLogUiFactory(logId, filters); } @NotNull @@ -225,22 +228,26 @@ public class VcsLogManager implements Disposable { } private class MainVcsLogUiFactory implements VcsLogUiFactory { - private final String myLogId; + @NotNull private final String myLogId; + @Nullable private final VcsLogFilterCollection myFilters; - MainVcsLogUiFactory(@NotNull String logId) { + MainVcsLogUiFactory(@NotNull String logId, @Nullable VcsLogFilterCollection filters) { myLogId = logId; + myFilters = filters; } @Override public VcsLogUiImpl createLogUi(@NotNull Project project, @NotNull VcsLogData logData) { MainVcsLogUiProperties properties = myUiProperties.createProperties(myLogId); - VisiblePackRefresherImpl refresher = - new VisiblePackRefresherImpl(project, logData, properties.get(MainVcsLogUiProperties.BEK_SORT_TYPE), - new VcsLogFiltererImpl(logData.getLogProviders(), logData.getStorage(), - logData.getTopCommitsCache(), - logData.getCommitDetailsGetter(), logData.getIndex()), myLogId); - return new VcsLogUiImpl(myLogId, logData, myColorManager, properties, refresher); + VcsLogFiltererImpl vcsLogFilterer = new VcsLogFiltererImpl(logData.getLogProviders(), logData.getStorage(), + logData.getTopCommitsCache(), + logData.getCommitDetailsGetter(), logData.getIndex()); + PermanentGraph.SortType initialSortType = properties.get(MainVcsLogUiProperties.BEK_SORT_TYPE); + VcsLogFilterCollection initialFilters = myFilters == null ? VcsLogFilterObject.collection() : myFilters; + VisiblePackRefresherImpl refresher = new VisiblePackRefresherImpl(project, logData, initialFilters, initialSortType, + vcsLogFilterer, myLogId); + return new VcsLogUiImpl(myLogId, logData, myColorManager, properties, refresher, myFilters); } } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsManager.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsManager.java index 4db17adc5e1d..1aa1fde92d6f 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsManager.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsManager.java @@ -12,6 +12,7 @@ import com.intellij.vcs.log.ui.VcsLogUiImpl; import com.intellij.vcs.log.visible.filters.VcsLogFiltersKt; import org.jetbrains.annotations.CalledInAwt; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -45,7 +46,7 @@ public class VcsLogTabsManager { private void createLogTabs(@NotNull VcsLogManager manager) { List tabIds = myUiProperties.getTabs(); for (String tabId : tabIds) { - openLogTab(manager, tabId, false, false); + openLogTab(manager, tabId, false, null); } } @@ -56,19 +57,21 @@ public class VcsLogTabsManager { } public void openAnotherLogTab(@NotNull VcsLogManager manager) { - openAnotherLogTab(manager, false); + openAnotherLogTab(manager, null); } @NotNull - public VcsLogUiImpl openAnotherLogTab(@NotNull VcsLogManager manager, boolean resetFilters) { - return openLogTab(manager, VcsLogContentUtil.generateTabId(myProject), true, resetFilters); + public VcsLogUiImpl openAnotherLogTab(@NotNull VcsLogManager manager, @Nullable VcsLogFilterCollection filters) { + return openLogTab(manager, VcsLogContentUtil.generateTabId(myProject), true, filters); } @NotNull - private VcsLogUiImpl openLogTab(@NotNull VcsLogManager manager, @NotNull String tabId, boolean focus, boolean resetFilters) { - if (resetFilters) myUiProperties.resetState(tabId); + private VcsLogUiImpl openLogTab(@NotNull VcsLogManager manager, @NotNull String tabId, boolean focus, + @Nullable VcsLogFilterCollection filters) { + if (filters != null) myUiProperties.resetState(tabId); - VcsLogManager.VcsLogUiFactory factory = new PersistentVcsLogUiFactory(manager.getMainLogUiFactory(tabId)); + VcsLogManager.VcsLogUiFactory factory = + new PersistentVcsLogUiFactory(manager.getMainLogUiFactory(tabId, filters)); VcsLogUiImpl ui = VcsLogContentUtil.openLogTab(myProject, manager, VcsLogContentProvider.TAB_NAME, tabId, factory, focus); updateTabName(ui); ui.addFilterListener(() -> updateTabName(ui)); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUiImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUiImpl.java index 9856bcc28f2d..c11105605401 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUiImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUiImpl.java @@ -25,6 +25,7 @@ import com.intellij.vcs.log.ui.table.GraphTableModel; import com.intellij.vcs.log.ui.table.VcsLogGraphTable; import com.intellij.vcs.log.util.VcsLogUiUtil; import com.intellij.vcs.log.visible.VisiblePackRefresher; +import com.intellij.vcs.log.visible.filters.VcsLogFilterObject; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -47,10 +48,11 @@ public class VcsLogUiImpl extends AbstractVcsLogUi { @NotNull VcsLogData logData, @NotNull VcsLogColorManager manager, @NotNull MainVcsLogUiProperties uiProperties, - @NotNull VisiblePackRefresher refresher) { + @NotNull VisiblePackRefresher refresher, + @Nullable VcsLogFilterCollection filters) { super(id, logData, manager, refresher); myUiProperties = uiProperties; - myMainFrame = new MainFrame(logData, this, uiProperties, myLog, myVisiblePack); + myMainFrame = new MainFrame(logData, this, uiProperties, myLog, myVisiblePack, filters); for (VcsLogHighlighterFactory factory : LOG_HIGHLIGHTER_FACTORY_EP.getExtensions(myProject)) { getTable().addHighlighter(factory.createHighlighter(logData, this)); @@ -130,7 +132,7 @@ public class VcsLogUiImpl extends AbstractVcsLogUi { runnables.add(new NamedRunnable("View in New Tab") { @Override public void run() { - VcsLogUiImpl ui = projectLog.getTabsManager().openAnotherLogTab(logManager, true); + VcsLogUiImpl ui = projectLog.getTabsManager().openAnotherLogTab(logManager, VcsLogFilterObject.collection()); ui.invokeOnChange(() -> ui.jumpTo(commitId, rowGetter, SettableFuture.create()), pack -> pack.getFilters().isEmpty()); } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/FilterModel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/FilterModel.java index 250da443c09c..e8a832f2e833 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/FilterModel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/FilterModel.java @@ -1,24 +1,11 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.vcs.log.ui.filter; import com.intellij.openapi.util.Computable; import com.intellij.util.containers.ContainerUtil; import com.intellij.vcs.log.VcsLogDataPack; import com.intellij.vcs.log.VcsLogFilter; +import com.intellij.vcs.log.VcsLogFilterCollection; import com.intellij.vcs.log.impl.MainVcsLogUiProperties; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,17 +14,29 @@ import java.util.Collection; import java.util.List; abstract class FilterModel { - @NotNull private final String myName; + @NotNull private final VcsLogFilterCollection.FilterKey myFilterKey; @NotNull protected final MainVcsLogUiProperties myUiProperties; @NotNull private final Computable myDataPackProvider; @NotNull private final Collection mySetFilterListeners = ContainerUtil.newArrayList(); @Nullable private Filter myFilter; - FilterModel(@NotNull String name, @NotNull Computable provider, @NotNull MainVcsLogUiProperties uiProperties) { - myName = name; + FilterModel(@NotNull VcsLogFilterCollection.FilterKey filterKey, + @NotNull Computable provider, + @NotNull MainVcsLogUiProperties uiProperties, + @Nullable VcsLogFilterCollection filters) { + myFilterKey = filterKey; myUiProperties = uiProperties; myDataPackProvider = provider; + + if (filters != null) { + saveFilter(getFilterFromCollection(filters)); + } + } + + @Nullable + protected Filter getFilterFromCollection(@NotNull VcsLogFilterCollection filters) { + return filters.get(myFilterKey); } void setFilter(@Nullable Filter filter) { @@ -49,7 +48,7 @@ abstract class FilterModel { } protected void saveFilter(@Nullable Filter filter) { - myUiProperties.saveFilterValues(myName, filter == null ? null : getFilterValues(filter)); + myUiProperties.saveFilterValues(myFilterKey.getName(), filter == null ? null : getFilterValues(filter)); } @Nullable @@ -68,7 +67,7 @@ abstract class FilterModel { @Nullable protected Filter getLastFilter() { - List values = myUiProperties.getFilterValues(myName); + List values = myUiProperties.getFilterValues(myFilterKey.getName()); if (values != null) { return createFilter(values); } 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 62259e5dd078..25f0c9564b08 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 @@ -61,18 +61,19 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { public VcsLogClassicFilterUi(@NotNull VcsLogUiImpl ui, @NotNull VcsLogData logData, @NotNull MainVcsLogUiProperties uiProperties, - @NotNull VcsLogDataPack initialDataPack) { + @NotNull VcsLogDataPack initialDataPack, + @Nullable VcsLogFilterCollection filters) { myUi = ui; myLogData = logData; myUiProperties = uiProperties; myDataPack = initialDataPack; NotNullComputable dataPackGetter = () -> myDataPack; - myBranchFilterModel = new BranchFilterModel(dataPackGetter, myUiProperties); - myUserFilterModel = new UserFilterModel(dataPackGetter, myUiProperties); - myDateFilterModel = new DateFilterModel(dataPackGetter, myUiProperties); - myStructureFilterModel = new FileFilterModel(dataPackGetter, myLogData.getLogProviders().keySet(), myUiProperties); - myTextFilterModel = new TextFilterModel(dataPackGetter, myUiProperties); + myBranchFilterModel = new BranchFilterModel(dataPackGetter, myUiProperties, filters); + myUserFilterModel = new UserFilterModel(dataPackGetter, myUiProperties, filters); + myDateFilterModel = new DateFilterModel(dataPackGetter, myUiProperties, filters); + myStructureFilterModel = new FileFilterModel(dataPackGetter, myLogData.getLogProviders().keySet(), myUiProperties, filters); + myTextFilterModel = new TextFilterModel(dataPackGetter, myUiProperties, filters); updateUiOnFilterChange(); myUi.applyFiltersAndUpdateUi(getFilters()); @@ -195,8 +196,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { @Nullable private Collection myVisibleRoots; - BranchFilterModel(@NotNull Computable provider, @NotNull MainVcsLogUiProperties properties) { - super("branch", provider, properties); + BranchFilterModel(@NotNull Computable provider, @NotNull MainVcsLogUiProperties properties, + @Nullable VcsLogFilterCollection filters) { + super(VcsLogFilterCollection.BRANCH_FILTER, provider, properties, filters); } public void onStructureFilterChanged(@NotNull Set roots, @Nullable VcsLogFileFilter filter) { @@ -230,8 +232,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { private static class TextFilterModel extends FilterModel { @Nullable private String myText; - TextFilterModel(NotNullComputable dataPackProvider, @NotNull MainVcsLogUiProperties properties) { - super("text", dataPackProvider, properties); + TextFilterModel(@NotNull NotNullComputable dataPackProvider, @NotNull MainVcsLogUiProperties properties, + @Nullable VcsLogFilterCollection filters) { + super(VcsLogFilterCollection.TEXT_FILTER, dataPackProvider, properties, filters); } @NotNull @@ -284,13 +287,23 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { @NotNull private static final String FILE = "file:"; @NotNull private final Set myRoots; - FileFilterModel(NotNullComputable dataPackGetter, + FileFilterModel(@NotNull NotNullComputable dataPackGetter, @NotNull Set roots, - MainVcsLogUiProperties uiProperties) { - super("file", dataPackGetter, uiProperties); + @NotNull MainVcsLogUiProperties uiProperties, + @Nullable VcsLogFilterCollection filters) { + super(VcsLogFileFilter.FILE_FILTER, dataPackGetter, uiProperties, filters); myRoots = roots; } + @Nullable + @Override + protected VcsLogFileFilter getFilterFromCollection(@NotNull VcsLogFilterCollection filters) { + VcsLogRootFilter rootFilter = filters.get(VcsLogFilterCollection.ROOT_FILTER); + VcsLogStructureFilter structureFilter = filters.get(VcsLogFilterCollection.STRUCTURE_FILTER); + if (rootFilter == null && structureFilter == null) return null; + return new VcsLogFileFilter(structureFilter, rootFilter); + } + @Override protected void saveFilter(@Nullable VcsLogFileFilter filter) { if (filter == null) { @@ -377,8 +390,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { } private static class DateFilterModel extends FilterModel { - DateFilterModel(NotNullComputable dataPackGetter, MainVcsLogUiProperties uiProperties) { - super("date", dataPackGetter, uiProperties); + DateFilterModel(@NotNull NotNullComputable dataPackGetter, @NotNull MainVcsLogUiProperties uiProperties, + @Nullable VcsLogFilterCollection filters) { + super(VcsLogFilterCollection.DATE_FILTER, dataPackGetter, uiProperties, filters); } @Nullable @@ -411,8 +425,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi { } private class UserFilterModel extends FilterModel { - UserFilterModel(NotNullComputable dataPackGetter, MainVcsLogUiProperties uiProperties) { - super("user", dataPackGetter, uiProperties); + UserFilterModel(@NotNull NotNullComputable dataPackGetter, @NotNull MainVcsLogUiProperties uiProperties, + @Nullable VcsLogFilterCollection filters) { + super(VcsLogFilterCollection.USER_FILTER, dataPackGetter, uiProperties, filters); } @NotNull 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 193358d8fdc9..29178c9888d6 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 @@ -1,3 +1,4 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.vcs.log.ui.frame; import com.google.common.primitives.Ints; @@ -23,10 +24,7 @@ import com.intellij.util.ui.JBUI; import com.intellij.util.ui.StatusText; import com.intellij.util.ui.table.ComponentsListFocusTraversalPolicy; import com.intellij.vcs.CommittedChangeListForRevision; -import com.intellij.vcs.log.CommitId; -import com.intellij.vcs.log.VcsFullCommitDetails; -import com.intellij.vcs.log.VcsLog; -import com.intellij.vcs.log.VcsLogFilterUi; +import com.intellij.vcs.log.*; import com.intellij.vcs.log.data.VcsLogData; import com.intellij.vcs.log.impl.CommonUiProperties; import com.intellij.vcs.log.impl.MainVcsLogUiProperties; @@ -85,14 +83,15 @@ public class MainFrame extends JPanel implements DataProvider, Disposable { @NotNull VcsLogUiImpl ui, @NotNull MainVcsLogUiProperties uiProperties, @NotNull VcsLog log, - @NotNull VisiblePack initialDataPack) { + @NotNull VisiblePack initialDataPack, + @Nullable VcsLogFilterCollection filters) { // collect info myLogData = logData; myUi = ui; myLog = log; myUiProperties = uiProperties; - myFilterUi = new VcsLogClassicFilterUi(ui, logData, myUiProperties, initialDataPack); + myFilterUi = new VcsLogClassicFilterUi(ui, logData, myUiProperties, initialDataPack, filters); // initialize components myGraphTable = new MyVcsLogGraphTable(ui, logData, initialDataPack); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/filters/VcsLogFileFilter.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/filters/VcsLogFileFilter.java index e40821fb75eb..7767297781b9 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/filters/VcsLogFileFilter.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/filters/VcsLogFileFilter.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class VcsLogFileFilter implements VcsLogFilter { + public static final VcsLogFilterCollection.FilterKey FILE_FILTER = VcsLogFilterCollection.FilterKey.create("file"); @Nullable private final VcsLogStructureFilter myStructureFilter; @Nullable private final VcsLogRootFilter myRootFilter; @@ -30,7 +31,7 @@ public class VcsLogFileFilter implements VcsLogFilter { @NotNull @Override public VcsLogFilterCollection.FilterKey getKey() { - return VcsLogFilterCollection.FilterKey.create("file"); + return FILE_FILTER; } @NotNull