[vcs-log] allow to open new log tab with specific filters set

This commit is contained in:
Julia Beliaeva
2019-02-05 22:24:12 +03:00
parent a6b46e9f39
commit b50bb2102f
8 changed files with 92 additions and 69 deletions
@@ -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);
}
@@ -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<? extends VcsLogUiImpl> getMainLogUiFactory(@NotNull String logId) {
return new MainVcsLogUiFactory(logId);
public VcsLogUiFactory<? extends VcsLogUiImpl> 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<VcsLogUiImpl> {
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);
}
}
}
@@ -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<String> 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<? extends VcsLogUiImpl> factory = new PersistentVcsLogUiFactory(manager.getMainLogUiFactory(tabId));
VcsLogManager.VcsLogUiFactory<? extends VcsLogUiImpl> 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));
@@ -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());
}
@@ -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<Filter extends VcsLogFilter> {
@NotNull private final String myName;
@NotNull private final VcsLogFilterCollection.FilterKey<? extends Filter> myFilterKey;
@NotNull protected final MainVcsLogUiProperties myUiProperties;
@NotNull private final Computable<? extends VcsLogDataPack> myDataPackProvider;
@NotNull private final Collection<Runnable> mySetFilterListeners = ContainerUtil.newArrayList();
@Nullable private Filter myFilter;
FilterModel(@NotNull String name, @NotNull Computable<? extends VcsLogDataPack> provider, @NotNull MainVcsLogUiProperties uiProperties) {
myName = name;
FilterModel(@NotNull VcsLogFilterCollection.FilterKey<? extends Filter> filterKey,
@NotNull Computable<? extends VcsLogDataPack> 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<Filter extends VcsLogFilter> {
}
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<Filter extends VcsLogFilter> {
@Nullable
protected Filter getLastFilter() {
List<String> values = myUiProperties.getFilterValues(myName);
List<String> values = myUiProperties.getFilterValues(myFilterKey.getName());
if (values != null) {
return createFilter(values);
}
@@ -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<VcsLogDataPack> 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<VirtualFile> myVisibleRoots;
BranchFilterModel(@NotNull Computable<? extends VcsLogDataPack> provider, @NotNull MainVcsLogUiProperties properties) {
super("branch", provider, properties);
BranchFilterModel(@NotNull Computable<? extends VcsLogDataPack> provider, @NotNull MainVcsLogUiProperties properties,
@Nullable VcsLogFilterCollection filters) {
super(VcsLogFilterCollection.BRANCH_FILTER, provider, properties, filters);
}
public void onStructureFilterChanged(@NotNull Set<VirtualFile> roots, @Nullable VcsLogFileFilter filter) {
@@ -230,8 +232,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
private static class TextFilterModel extends FilterModel<VcsLogTextFilter> {
@Nullable private String myText;
TextFilterModel(NotNullComputable<? extends VcsLogDataPack> dataPackProvider, @NotNull MainVcsLogUiProperties properties) {
super("text", dataPackProvider, properties);
TextFilterModel(@NotNull NotNullComputable<? extends VcsLogDataPack> 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<VirtualFile> myRoots;
FileFilterModel(NotNullComputable<VcsLogDataPack> dataPackGetter,
FileFilterModel(@NotNull NotNullComputable<VcsLogDataPack> dataPackGetter,
@NotNull Set<VirtualFile> 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<VcsLogDateFilter> {
DateFilterModel(NotNullComputable<? extends VcsLogDataPack> dataPackGetter, MainVcsLogUiProperties uiProperties) {
super("date", dataPackGetter, uiProperties);
DateFilterModel(@NotNull NotNullComputable<? extends VcsLogDataPack> 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<VcsLogUserFilter> {
UserFilterModel(NotNullComputable<? extends VcsLogDataPack> dataPackGetter, MainVcsLogUiProperties uiProperties) {
super("user", dataPackGetter, uiProperties);
UserFilterModel(@NotNull NotNullComputable<? extends VcsLogDataPack> dataPackGetter, @NotNull MainVcsLogUiProperties uiProperties,
@Nullable VcsLogFilterCollection filters) {
super(VcsLogFilterCollection.USER_FILTER, dataPackGetter, uiProperties, filters);
}
@NotNull
@@ -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);
@@ -9,6 +9,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class VcsLogFileFilter implements VcsLogFilter {
public static final VcsLogFilterCollection.FilterKey<VcsLogFileFilter> 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