diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/StructureFilterPopupComponent.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/StructureFilterPopupComponent.java index 601038760071..2b849e1de8fe 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/StructureFilterPopupComponent.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/StructureFilterPopupComponent.java @@ -15,10 +15,8 @@ */ package com.intellij.vcs.log.ui.filter; -import com.intellij.openapi.actionSystem.ActionGroup; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.ex.CheckboxAction; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; @@ -79,7 +77,50 @@ class StructureFilterPopupComponent extends FilterPopupComponent roots = myFilterModel.getDataPack().getLogProviders().keySet(); + + List actions = new ArrayList(); + if (roots.size() <= 10) { + for (VirtualFile root : roots) { + actions.add(new SelectVisibleRootAction(root)); + } + } + return new DefaultActionGroup(createAllAction(), new Separator(), new DefaultActionGroup(actions), new Separator(), new SelectAction()); + } + + private boolean isVisible(@NotNull VirtualFile root) { + if (myFilterModel.getFilter() != null) { + return myFilterModel.getFilter().getRoots().contains(root); + } + else { + return true; + } + } + + private void setVisible(@NotNull VirtualFile root, boolean visible) { + Set roots = myFilterModel.getDataPack().getLogProviders().keySet(); + + Collection visibleRoots; + VcsLogStructureFilter previousFilter = myFilterModel.getFilter(); + if (previousFilter == null) { + if (visible) { + visibleRoots = roots; + } + else { + visibleRoots = ContainerUtil.subtract(roots, Collections.singleton(root)); + } + } + else { + if (visible) { + visibleRoots = ContainerUtil.union(new HashSet(myFilterModel.getFilter().getRoots()), Collections.singleton(root)); + } + else { + visibleRoots = ContainerUtil.subtract(myFilterModel.getFilter().getRoots(), Collections.singleton(root)); + } + } + myFilterModel.setFilter(VcsLogStructureFilterImpl.build(visibleRoots, myFilterModel.getDataPack())); + // todo if there are some non-roots in structure filter they will get lost } @NotNull @@ -100,6 +141,25 @@ class StructureFilterPopupComponent extends FilterPopupComponent