private void renderNode(Node node) {
    UsageNodePresentation presentation = node.getCachedPresentation();
    if (presentation == null) {
      // either:
      //   1. the node was never updated yet
      //   2. the usage has dropped the cached presentation by itself
      //      (i.e., it was stored by a soft reference and was gc-ed).
      //  In either case, `myView.updateLater()` will eventually re-update the visible nodes.
      append(UsageViewBundle.message("loading"), SimpleTextAttributes.GRAY_ATTRIBUTES, true);

      // Since the "loading..." text is not reflected in the node's cached state,
      // we must force the node to recalculate its bounds on the next view update
      node.forceUpdate();
      myView.updateLater();
      return;
    }
    setIcon(presentation.getIcon());
    TextChunk[] text = presentation.getText();
    for (int i = 0; i < text.length; i++) {
      TextChunk textChunk = text[i];
      SimpleTextAttributes simples = textChunk.getSimpleAttributesIgnoreBackground();
      append(textChunk.getText() + (i == 0 ? " " : ""), patchAttrs(node, simples), true);
    }
  }
private void renderNode(Node node)