public void nodeLoaded(@NotNull final RestorableStateNode node, final String name) {
   XDebuggerTreeState.NodeInfo parentInfo = myNode2ParentState.remove(node);
   if (parentInfo != null) {
     doRestoreNode(node, parentInfo.removeChild(node.getName()));
   }
   disposeIfFinished();
 }
 private void restoreNode(
     final XDebuggerTreeNode treeNode, final XDebuggerTreeState.NodeInfo parentInfo) {
   if (treeNode instanceof RestorableStateNode) {
     RestorableStateNode node = (RestorableStateNode) treeNode;
     if (node.isComputed()) {
       doRestoreNode(node, parentInfo.removeChild(node.getName()));
     } else {
       myNode2ParentState.put(node, parentInfo);
     }
   }
 }
  private void doRestoreNode(
      final RestorableStateNode treeNode, final XDebuggerTreeState.NodeInfo nodeInfo) {
    if (nodeInfo != null) {
      if (!checkExtendedModified(treeNode)
          && !(Comparing.equal(nodeInfo.getValue(), treeNode.getRawValue()))) {
        treeNode.markChanged();
      }
      if (!myStopRestoringSelection && nodeInfo.isSelected()) {
        try {
          myInsideRestoring = true;
          myTree.addSelectionPath(treeNode.getPath());
        } finally {
          myInsideRestoring = false;
        }
      }

      restoreChildren((XDebuggerTreeNode) treeNode, nodeInfo);
    } else if (!checkExtendedModified(treeNode)) {
      treeNode.markChanged();
    }
  }
 private void restoreChildren(
     final XDebuggerTreeNode treeNode, final XDebuggerTreeState.NodeInfo nodeInfo) {
   if (nodeInfo.isExpanded()) {
     myTree.expandPath(treeNode.getPath());
     List<? extends XDebuggerTreeNode> children = treeNode.getLoadedChildren();
     if (children != null) {
       for (XDebuggerTreeNode child : children) {
         restoreNode(child, nodeInfo);
       }
     }
     myNode2State.put(treeNode, nodeInfo);
   }
 }