[vcs-log] remember recent items for structure filter

This commit is contained in:
Julia Beliaeva
2018-07-04 19:54:16 +03:00
parent cb474f4df3
commit 11512e4e67
2 changed files with 23 additions and 35 deletions
@@ -35,11 +35,12 @@ import com.intellij.vcs.log.VcsLogDataPack;
import com.intellij.vcs.log.VcsLogRootFilter;
import com.intellij.vcs.log.VcsLogStructureFilter;
import com.intellij.vcs.log.data.VcsLogStructureFilterImpl;
import com.intellij.vcs.log.impl.MainVcsLogUiProperties;
import com.intellij.vcs.log.impl.VcsLogFileFilter;
import com.intellij.vcs.log.impl.VcsLogRootFilterImpl;
import com.intellij.vcs.log.util.VcsLogUtil;
import com.intellij.vcs.log.ui.VcsLogColorManager;
import com.intellij.vcs.log.ui.table.VcsLogGraphTable;
import com.intellij.vcs.log.util.VcsLogUtil;
import org.intellij.lang.annotations.JdkConstants;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -57,11 +58,14 @@ class StructureFilterPopupComponent extends FilterPopupComponent<VcsLogFileFilte
private static final FileByNameComparator FILE_BY_NAME_COMPARATOR = new FileByNameComparator();
private static final FilePathByPathComparator FILE_PATH_BY_PATH_COMPARATOR = new FilePathByPathComparator();
@NotNull private final MainVcsLogUiProperties myUiProperties;
@NotNull private final VcsLogColorManager myColorManager;
@NotNull private final FixedSizeQueue<VcsLogStructureFilter> myHistory = new FixedSizeQueue<>(5);
StructureFilterPopupComponent(@NotNull FilterModel<VcsLogFileFilter> filterModel, @NotNull VcsLogColorManager colorManager) {
StructureFilterPopupComponent(@NotNull MainVcsLogUiProperties uiProperties,
@NotNull FilterModel<VcsLogFileFilter> filterModel,
@NotNull VcsLogColorManager colorManager) {
super("Paths", filterModel);
myUiProperties = uiProperties;
myColorManager = colorManager;
}
@@ -175,7 +179,7 @@ class StructureFilterPopupComponent extends FilterPopupComponent<VcsLogFileFilte
}
}
List<AnAction> structureActions = new ArrayList<>();
for (VcsLogStructureFilter filter : myHistory) {
for (VcsLogStructureFilter filter : getRecentFilters()) {
structureActions.add(new SelectFromHistoryAction(filter));
}
@@ -189,6 +193,12 @@ class StructureFilterPopupComponent extends FilterPopupComponent<VcsLogFileFilte
new Separator("Recent"), new DefaultActionGroup(structureActions));
}
@NotNull
private List<VcsLogStructureFilter> getRecentFilters() {
List<List<String>> filterValues = myUiProperties.getRecentlyFilteredGroups(myName);
return ContainerUtil.map2List(filterValues, values -> VcsLogClassicFilterUi.FileFilterModel.createStructureFilter(values));
}
private Set<VirtualFile> getAllRoots() {
return myFilterModel.getDataPack().getLogProviders().keySet();
}
@@ -357,7 +367,7 @@ class StructureFilterPopupComponent extends FilterPopupComponent<VcsLogFileFilte
if (chooser.showAndGet()) {
VcsLogStructureFilterImpl structureFilter = new VcsLogStructureFilterImpl(new HashSet<VirtualFile>(chooser.getSelectedFiles()));
myFilterModel.setFilter(new VcsLogFileFilter(structureFilter, null));
myHistory.add(structureFilter);
myUiProperties.addRecentlyFilteredGroup(myName, VcsLogClassicFilterUi.FileFilterModel.getFilterValues(structureFilter));
}
}
@@ -402,26 +412,4 @@ class StructureFilterPopupComponent extends FilterPopupComponent<VcsLogFileFilte
}
}
}
private static class FixedSizeQueue<T> implements Iterable<T> {
@NotNull private final LinkedList<T> myQueue = new LinkedList<>();
private final int maxSize;
FixedSizeQueue(int maxSize) {
this.maxSize = maxSize;
}
@NotNull
@Override
public Iterator<T> iterator() {
return ContainerUtil.reverse(myQueue).iterator();
}
public void add(T t) {
myQueue.add(t);
if (myQueue.size() > maxSize) {
myQueue.poll();
}
}
}
}
@@ -125,7 +125,7 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
actionGroup.add(new FilterActionComponent(() -> new UserFilterPopupComponent(myUiProperties, myLogData, myUserFilterModel).initUi()));
actionGroup.add(new FilterActionComponent(() -> new DateFilterPopupComponent(myDateFilterModel).initUi()));
actionGroup.add(new FilterActionComponent(
() -> new StructureFilterPopupComponent(myStructureFilterModel, myUi.getColorManager()).initUi()));
() -> new StructureFilterPopupComponent(myUiProperties, myStructureFilterModel, myUi.getColorManager()).initUi()));
return actionGroup;
}
@@ -311,7 +311,7 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
}
}
private static class FileFilterModel extends FilterModel<VcsLogFileFilter> {
static class FileFilterModel extends FilterModel<VcsLogFileFilter> {
@NotNull private static final String ROOTS = "roots";
@NotNull private static final String STRUCTURE = "structure";
@NotNull private final Set<VirtualFile> myRoots;
@@ -338,7 +338,7 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
}
@NotNull
private static List<String> getFilterValues(@NotNull VcsLogStructureFilter filter) {
static List<String> getFilterValues(@NotNull VcsLogStructureFilter filter) {
return ContainerUtil.map(filter.getFiles(), FilePath::getPath);
}
@@ -347,6 +347,11 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
return ContainerUtil.map(filter.getRoots(), VirtualFile::getPath);
}
@NotNull
static VcsLogStructureFilter createStructureFilter(@NotNull List<String> values) {
return new VcsLogStructureFilterImpl(ContainerUtil.map(values, VcsUtil::getFilePath));
}
@Nullable
@Override
protected VcsLogFileFilter getLastFilter() {
@@ -382,11 +387,6 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
return new VcsLogRootFilterImpl(selectedRoots);
}
@NotNull
private static VcsLogStructureFilter createStructureFilter(@NotNull List<String> values) {
return new VcsLogStructureFilterImpl(ContainerUtil.map(values, VcsUtil::getFilePath));
}
@NotNull
@Override
protected VcsLogFileFilter createFilter(@NotNull List<String> values) {