From 3b4c053a3af182130aa51a22573bd1bde1cbad8a Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 10 Jul 2009 16:10:03 +0400 Subject: [PATCH] TreeUi: memory leaks fixed when TreeStructure produces new objects --- .../intellij/ide/util/treeView/AbstractTreeUi.java | 38 +++++++++++++--------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index d995a09d4e..6c927c367b 100644 --- a/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -1313,7 +1313,7 @@ class AbstractTreeUi { updateNodeImageAndPosition(childNode); } if (!oldElement.equals(newElement) | forceRemapping) { - removeMapping(oldElement, childNode); + removeMapping(oldElement, childNode, newElement); if (newElement != null) { createMapping(newElement, childNode); } @@ -1722,7 +1722,7 @@ class AbstractTreeUi { NodeDescriptor descriptor = (NodeDescriptor)node.getUserObject(); if (descriptor == null) return; final Object element = getElementFromDescriptor(descriptor); - removeMapping(element, node); + removeMapping(element, node, null); node.setUserObject(null); node.removeAllChildren(); } @@ -2193,24 +2193,30 @@ class AbstractTreeUi { } } - private void removeMapping(Object element, DefaultMutableTreeNode node) { + private void removeMapping(Object element, DefaultMutableTreeNode node, @Nullable Object elementToPutNodeActionsFor) { final Object value = myElementToNodeMap.get(element); - if (value == null) { - return; - } - if (value instanceof DefaultMutableTreeNode) { - if (value.equals(node)) { - myElementToNodeMap.remove(element); - } - } - else { - List nodes = (List)value; - final boolean reallyRemoved = nodes.remove(node); - if (reallyRemoved) { - if (nodes.isEmpty()) { + if (value != null) { + if (value instanceof DefaultMutableTreeNode) { + if (value.equals(node)) { myElementToNodeMap.remove(element); } } + else { + List nodes = (List)value; + final boolean reallyRemoved = nodes.remove(node); + if (reallyRemoved) { + if (nodes.isEmpty()) { + myElementToNodeMap.remove(element); + } + } + } + } + + final List actions = myNodeActions.get(element); + myNodeActions.remove(element); + + if (elementToPutNodeActionsFor != null) { + myNodeActions.put(elementToPutNodeActionsFor, actions); } } -- 2.11.4.GIT