dispose temporary smart pointers created in tree UI

This commit is contained in:
peter
2015-11-17 10:41:58 +01:00
parent 7a92b8d135
commit 95bd36ecc3
3 changed files with 36 additions and 22 deletions
@@ -71,7 +71,20 @@ public class PsiTreeAnchorizer extends TreeAnchorizer {
return super.retrieveElement(pointer);
}
@Override
public void freeAnchor(final Object element) {
if (element instanceof SmartPointerWrapper) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
public void run() {
SmartPsiElementPointer pointer = ((SmartPointerWrapper)element).myPointer;
SmartPointerManager.getInstance(pointer.getProject()).removePointer(pointer);
}
});
}
}
private static class SmartPointerWrapper {
private final SmartPsiElementPointer myPointer;
@@ -4120,20 +4120,23 @@ public class AbstractTreeUi {
}
private int getRowIfUnderSelection(@NotNull Object element) {
int preselectedRow = -1;
final Set<Object> selection = getSelectedElements();
if (selection.contains(element)) {
final TreePath[] paths = getTree().getSelectionPaths();
for (TreePath each : paths) {
if (element.equals(getElementFor(each.getLastPathComponent()))) {
preselectedRow = getTree().getRowForPath(each);
break;
return getTree().getRowForPath(each);
}
}
return -1;
}
else if (myElementToNodeMap.get(TreeAnchorizer.getService().createAnchor(element)) instanceof List) {
Object anchor = TreeAnchorizer.getService().createAnchor(element);
Object o = myElementToNodeMap.get(anchor);
TreeAnchorizer.getService().freeAnchor(element);
if (o instanceof List) {
final TreePath[] paths = getTree().getSelectionPaths();
if (paths != null && paths.length > 0) {
Set<DefaultMutableTreeNode> selectedNodes = new HashSet<DefaultMutableTreeNode>();
@@ -4144,25 +4147,19 @@ public class AbstractTreeUi {
}
final List nodes = (List)myElementToNodeMap.get(TreeAnchorizer.getService().createAnchor(element));
for (Object each : nodes) {
DefaultMutableTreeNode eachNode = (DefaultMutableTreeNode)each;
//noinspection unchecked
for (DefaultMutableTreeNode eachNode : (List<DefaultMutableTreeNode>)o) {
while (eachNode != null) {
if (selectedNodes.contains(eachNode)) {
preselectedRow = getTree().getRowForPath(getPathFor(eachNode));
break;
return getTree().getRowForPath(getPathFor(eachNode));
}
eachNode = (DefaultMutableTreeNode)eachNode.getParent();
}
if (preselectedRow >= 0) break;
}
}
}
return preselectedRow;
return -1;
}
public void expandAllWithoutRecursion(@Nullable final Runnable onDone) {
@@ -4636,6 +4633,7 @@ public class AbstractTreeUi {
}
remapNodeActions(element, elementToPutNodeActionsFor);
TreeAnchorizer.getService().freeAnchor(element);
}
private void remapNodeActions(Object element, Object elementToPutNodeActionsFor) {
@@ -4672,23 +4670,25 @@ public class AbstractTreeUi {
protected Object findNodeByElement(Object element) {
element = TreeAnchorizer.getService().createAnchor(element);
if (myElementToNodeMap.containsKey(element)) {
return myElementToNodeMap.get(element);
}
try {
if (myElementToNodeMap.containsKey(element)) {
return myElementToNodeMap.get(element);
}
TREE_NODE_WRAPPER.setValue(element);
return myElementToNodeMap.get(TREE_NODE_WRAPPER);
}
finally {
TREE_NODE_WRAPPER.setValue(null);
TreeAnchorizer.getService().freeAnchor(element);
}
}
@Nullable
private DefaultMutableTreeNode findNodeForChildElement(@NotNull DefaultMutableTreeNode parentNode, Object element) {
element = TreeAnchorizer.getService().createAnchor(element);
final Object value = myElementToNodeMap.get(element);
Object anchor = TreeAnchorizer.getService().createAnchor(element);
final Object value = myElementToNodeMap.get(anchor);
TreeAnchorizer.getService().freeAnchor(anchor);
if (value == null) {
return null;
}
@@ -45,4 +45,5 @@ public class TreeAnchorizer {
return anchor;
}
public void freeAnchor(Object element) { }
}