From e973787f3e40216cf37bbb30f10161405287c0c5 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 8 Jul 2011 17:46:23 +0400 Subject: [PATCH] options tree: infinte selection jumping fixed --- .../util/treeView/AbstractTreeBuilder.java | 4 ++++ .../ide/util/treeView/AbstractTreeUi.java | 22 ++++++++++++++++--- .../options/newEditor/OptionsTree.java | 11 ++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java index d40b8486d465..2670b9390488 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java @@ -642,6 +642,10 @@ public class AbstractTreeBuilder implements Disposable { } } + public boolean isSelectionBeingAdjusted() { + return getUi().isSelectionBeingAdjusted(); + } + private void assertDisposed() { assert !isDisposed(); } diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index db729b89171d..06c2511b1a68 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -182,6 +182,8 @@ public class AbstractTreeUi { private boolean mySelectionIsAdjusted; private boolean myReleaseRequested; + private boolean mySelectionIsBeingAdjusted; + private final Set myRevalidatedObjects = new HashSet(); private final Set myUserRunnables = new HashSet(); @@ -3713,7 +3715,7 @@ public class AbstractTreeUi { } Set toSelect = new HashSet(); - myTree.clearSelection(); + clearSelection(); ContainerUtil.addAll(toSelect, elements); if (addToSelection) { toSelect.addAll(currentElements); @@ -3734,7 +3736,7 @@ public class AbstractTreeUi { if (wasRootNodeInitialized()) { final int[] originalRows = myTree.getSelectionRows(); if (!addToSelection) { - myTree.clearSelection(); + clearSelection(); } addNext(elementsToSelect, 0, new Runnable() { public void run() { @@ -3760,6 +3762,20 @@ public class AbstractTreeUi { }); } + private void clearSelection() { + mySelectionIsBeingAdjusted = true; + try { + myTree.clearSelection(); + } + finally { + mySelectionIsBeingAdjusted = false; + } + } + + public boolean isSelectionBeingAdjusted() { + return mySelectionIsBeingAdjusted; + } + private void restoreSelection(Set selection) { for (Object each : selection) { DefaultMutableTreeNode node = getNodeForElement(each, false); @@ -4564,7 +4580,7 @@ public class AbstractTreeUi { final UpdaterTreeState state = new UpdaterTreeState(this); myTree.collapsePath(new TreePath(myTree.getModel().getRoot())); - myTree.clearSelection(); + clearSelection(); getRootNode().removeAllChildren(); myRootNodeWasQueuedToInitialize = false; diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsTree.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsTree.java index 8b3091d573bd..9f7264661ee5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsTree.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsTree.java @@ -172,11 +172,20 @@ public class OptionsTree extends JPanel implements Disposable, OptionsEditorColl } } + private Configurable myQueuedConfigurable; + ActionCallback queueSelection(final Configurable configurable) { + if (myBuilder.isSelectionBeingAdjusted()) { + return new ActionCallback.Rejected(); + } + final ActionCallback callback = new ActionCallback(); + myQueuedConfigurable = configurable; final Update update = new Update(this) { public void run() { + if (configurable != myQueuedConfigurable) return; + if (configurable == null) { myTree.getSelectionModel().clearSelection(); myContext.fireSelected(null, OptionsTree.this); @@ -185,6 +194,8 @@ public class OptionsTree extends JPanel implements Disposable, OptionsEditorColl myBuilder.getReady(this).doWhenDone(new Runnable() { @Override public void run() { + if (configurable != myQueuedConfigurable) return; + final EditorNode editorNode = myConfigurable2Node.get(configurable); FilteringTreeStructure.Node editorUiNode = myBuilder.getVisibleNodeFor(editorNode); if (editorUiNode == null) return;