From 519d53a6583935ef8262caef5cd56b2b8c75f656 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Thu, 22 Jan 2015 21:16:57 +0300 Subject: [PATCH] [log] Fix collapse all/expand all Now CollapsedGraph can reset node visibility to matched commits. --- .../collapsing/CollapsedActionManager.java | 19 +++-- .../log/graph/collapsing/CollapsedGraph.java | 79 +++++++++++-------- .../collapsing/GraphNodesVisibility.java | 6 +- 3 files changed, 63 insertions(+), 41 deletions(-) diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedActionManager.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedActionManager.java index d3317b3bdfad..4e5940cbca3a 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedActionManager.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedActionManager.java @@ -32,6 +32,7 @@ import com.intellij.vcs.log.graph.impl.facade.LinearGraphController.LinearGraphA import com.intellij.vcs.log.graph.impl.visible.LinearFragmentGenerator; import com.intellij.vcs.log.graph.impl.visible.LinearFragmentGenerator.GraphFragment; import com.intellij.vcs.log.graph.utils.LinearGraphUtils; +import com.intellij.vcs.log.graph.utils.UnsignedBitSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -79,8 +80,9 @@ class CollapsedActionManager { ) { myCollapsedGraph = collapsedGraph; myGraphAction = graphAction; - myDelegatedFragmentGenerators = new FragmentGenerators(collapsedGraph.getDelegatedGraph(), permanentGraphInfo); - myCompiledFragmentGenerators = new FragmentGenerators(collapsedGraph.getCompiledGraph(), permanentGraphInfo); + myDelegatedFragmentGenerators = + new FragmentGenerators(collapsedGraph.getDelegatedGraph(), permanentGraphInfo, collapsedGraph.getMatchedNodeId()); + myCompiledFragmentGenerators = new FragmentGenerators(collapsedGraph.getCompiledGraph(), permanentGraphInfo, collapsedGraph.getMatchedNodeId()); } @NotNull @@ -132,8 +134,15 @@ class CollapsedActionManager { @NotNull private final FragmentGenerator fragmentGenerator; @NotNull private final LinearFragmentGenerator linearFragmentGenerator; - private FragmentGenerators(@NotNull LinearGraph linearGraph, @NotNull PermanentGraphInfo permanentGraphInfo) { - fragmentGenerator = new FragmentGenerator(LinearGraphUtils.asLiteLinearGraph(linearGraph), Condition.FALSE); + private FragmentGenerators(@NotNull final LinearGraph linearGraph, + @NotNull PermanentGraphInfo permanentGraphInfo, + @NotNull final UnsignedBitSet matchedNodeId) { + fragmentGenerator = new FragmentGenerator(LinearGraphUtils.asLiteLinearGraph(linearGraph), new Condition() { + @Override + public boolean value(Integer nodeIndex) { + return matchedNodeId.get(linearGraph.getNodeId(nodeIndex)); + } + }); Set branchNodeIndexes = LinearGraphUtils.convertIdsToNodeIndexes(linearGraph, permanentGraphInfo.getBranchNodeIds()); linearFragmentGenerator = new LinearFragmentGenerator(LinearGraphUtils.asLiteLinearGraph(linearGraph), branchNodeIndexes); @@ -243,6 +252,7 @@ class CollapsedActionManager { for (int nodeIndex = 0; nodeIndex < delegateGraph.nodesCount(); nodeIndex++) modification.showNode(nodeIndex); modification.removeAdditionalEdges(); + modification.resetNodesVisibility(); modification.apply(); return new LinearGraphAnswer(SOME_CHANGES, null, null, null); } @@ -263,7 +273,6 @@ class CollapsedActionManager { LinearGraph delegateGraph = context.getDelegatedGraph(); - for (int nodeIndex = 0; nodeIndex < delegateGraph.nodesCount(); nodeIndex++) { if (!context.myCollapsedGraph.isNodeVisible(nodeIndex)) continue; diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedGraph.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedGraph.java index a429b6cc13a1..d8af3c43428f 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedGraph.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedGraph.java @@ -30,32 +30,30 @@ import java.util.List; public class CollapsedGraph { - // initVisibility == null means, what all nodes is Visible - public static CollapsedGraph newInstance(@NotNull LinearGraph delegateGraph, @NotNull UnsignedBitSet initVisibility) { - UnsignedBitSet visibleNodesId = initVisibility.clone(); // todo mm? - return new CollapsedGraph(delegateGraph, visibleNodesId, new EdgeStorage()); + public static CollapsedGraph newInstance(@NotNull LinearGraph delegateGraph, @NotNull UnsignedBitSet matchedNodeId) { + return new CollapsedGraph(delegateGraph, matchedNodeId, matchedNodeId.clone(), new EdgeStorage()); } public static CollapsedGraph updateInstance(@NotNull CollapsedGraph prevCollapsedGraph, @NotNull LinearGraph newDelegateGraph) { UnsignedBitSet visibleNodesId = prevCollapsedGraph.myDelegateNodesVisibility.getNodeVisibilityById(); - return new CollapsedGraph(newDelegateGraph, visibleNodesId, prevCollapsedGraph.myEdgeStorage); + return new CollapsedGraph(newDelegateGraph, prevCollapsedGraph.myMatchedNodeId, visibleNodesId, prevCollapsedGraph.myEdgeStorage); } - @NotNull - private final LinearGraph myDelegatedGraph; - @NotNull - private final GraphNodesVisibility myDelegateNodesVisibility; - @NotNull - private final UpdatableIntToIntMap myNodesMap; - @NotNull - private final EdgeStorage myEdgeStorage; - @NotNull - private final CompiledGraph myCompiledGraph; + @NotNull private final LinearGraph myDelegatedGraph; + @NotNull private final UnsignedBitSet myMatchedNodeId; + @NotNull private final GraphNodesVisibility myDelegateNodesVisibility; + @NotNull private final UpdatableIntToIntMap myNodesMap; + @NotNull private final EdgeStorage myEdgeStorage; + @NotNull private final CompiledGraph myCompiledGraph; @Nullable private Modification myCurrentModification = null; - private CollapsedGraph(@NotNull LinearGraph delegatedGraph, @NotNull UnsignedBitSet visibleNodesId, @NotNull EdgeStorage edgeStorage) { + private CollapsedGraph(@NotNull LinearGraph delegatedGraph, + @NotNull UnsignedBitSet matchedNodeId, + @NotNull UnsignedBitSet visibleNodesId, + @NotNull EdgeStorage edgeStorage) { myDelegatedGraph = delegatedGraph; + myMatchedNodeId = matchedNodeId; myDelegateNodesVisibility = new GraphNodesVisibility(delegatedGraph, visibleNodesId); myNodesMap = ListIntToIntMap.newInstance(myDelegateNodesVisibility.asFlags()); myEdgeStorage = edgeStorage; @@ -89,10 +87,14 @@ public class CollapsedGraph { return myNodesMap.getLongIndex(compiledNodeIndex); } + @NotNull + public UnsignedBitSet getMatchedNodeId() { + return myMatchedNodeId; + } + // all nodeIndexes means node indexes in delegated graph public class Modification { - @NotNull - private final EdgeStorageAdapter myEdgeStorageAdapter; + @NotNull private final EdgeStorageAdapter myEdgeStorageAdapter; private boolean done = false; private int minAffectedNodeIndex = Integer.MAX_VALUE; @@ -113,6 +115,11 @@ public class CollapsedGraph { maxAffectedNodeIndex = Math.max(maxAffectedNodeIndex, nodeIndex); } + private void touchAll() { + minAffectedNodeIndex = 0; + maxAffectedNodeIndex = getDelegatedGraph().nodesCount() - 1; + } + private void touchEdge(@NotNull GraphEdge edge) { assert !done; if (edge.getUpNodeIndex() != null) touchIndex(edge.getUpNodeIndex()); @@ -150,9 +157,13 @@ public class CollapsedGraph { } public void removeAdditionalEdges() { - minAffectedNodeIndex = 0; - maxAffectedNodeIndex = getDelegatedGraph().nodesCount() - 1; myEdgeStorage.removeAll(); + touchAll(); + } + + public void resetNodesVisibility() { + myDelegateNodesVisibility.setNodeVisibilityById(myMatchedNodeId.clone()); + touchAll(); } } @@ -161,8 +172,7 @@ public class CollapsedGraph { } private class CompiledGraph implements LinearGraph { - @NotNull - private final EdgeStorageAdapter myEdgeStorageAdapter; + @NotNull private final EdgeStorageAdapter myEdgeStorageAdapter; private CompiledGraph() { myEdgeStorageAdapter = new EdgeStorageAdapter(myEdgeStorage, this); @@ -181,19 +191,18 @@ public class CollapsedGraph { @Nullable private Integer compiledNodeIndex(@Nullable Integer delegateNodeIndex) { - if (delegateNodeIndex == null) - return null; + if (delegateNodeIndex == null) return null; if (myDelegateNodesVisibility.isVisible(delegateNodeIndex)) { return myNodesMap.getShortIndex(delegateNodeIndex); - } else + } + else { return -1; + } } private boolean isVisibleEdge(@Nullable Integer compiledUpNode, @Nullable Integer compiledDownNode) { - if (compiledUpNode != null && compiledUpNode == -1) - return false; - if (compiledDownNode != null && compiledDownNode == -1) - return false; + if (compiledUpNode != null && compiledUpNode == -1) return false; + if (compiledDownNode != null && compiledDownNode == -1) return false; return true; } @@ -208,8 +217,7 @@ public class CollapsedGraph { for (GraphEdge delegateEdge : myDelegatedGraph.getAdjacentEdges(delegateIndex, filter)) { Integer compiledUpIndex = compiledNodeIndex(delegateEdge.getUpNodeIndex()); Integer compiledDownIndex = compiledNodeIndex(delegateEdge.getDownNodeIndex()); - if (isVisibleEdge(compiledUpIndex, compiledDownIndex)) - result.add(createEdge(delegateEdge, compiledUpIndex, compiledDownIndex)); + if (isVisibleEdge(compiledUpIndex, compiledDownIndex)) result.add(createEdge(delegateEdge, compiledUpIndex, compiledDownIndex)); } result.addAll(myEdgeStorageAdapter.getAdditionalEdges(nodeIndex, filter)); @@ -238,12 +246,13 @@ public class CollapsedGraph { public Integer getNodeIndex(int nodeId) { assertNotUnderModification(); Integer delegateIndex = myDelegatedGraph.getNodeIndex(nodeId); - if (delegateIndex == null) - return null; - if (myDelegateNodesVisibility.isVisible(delegateIndex)) + if (delegateIndex == null) return null; + if (myDelegateNodesVisibility.isVisible(delegateIndex)) { return myNodesMap.getShortIndex(delegateIndex); - else + } + else { return null; + } } } } diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/GraphNodesVisibility.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/GraphNodesVisibility.java index 329e105f1632..6a4bf09b903e 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/GraphNodesVisibility.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/GraphNodesVisibility.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.NotNull; class GraphNodesVisibility { @NotNull private final LinearGraph myLinearGraph; - @NotNull private final UnsignedBitSet myNodeVisibilityById; + @NotNull private UnsignedBitSet myNodeVisibilityById; GraphNodesVisibility(@NotNull LinearGraph linearGraph, @NotNull UnsignedBitSet nodeVisibilityById) { myLinearGraph = linearGraph; @@ -34,6 +34,10 @@ class GraphNodesVisibility { return myNodeVisibilityById; } + void setNodeVisibilityById(@NotNull UnsignedBitSet nodeVisibilityById) { + myNodeVisibilityById = nodeVisibilityById; + } + boolean isVisible(int nodeIndex) { return myNodeVisibilityById.get(nodeId(nodeIndex)); }