protected final boolean apply(@NotNull PresentationData presentation, @Nullable PresentationData before) {
    setIcon(presentation.getIcon(false));
    // If the node has both plain and colored text, the plain one takes priority for myName because it's also supposed to be plain,
    // and it can be used, e.g. for sorting, while the colored version may contain information not needed for sorting such as inplace comments.
    myName = presentation.getPresentableText();
    if (myName == null) {
      myName = getColoredTextAsPlainText(presentation);
    }
    myColor = presentation.getForcedTextForeground();
    boolean updated = !presentation.equals(before);

    var updatedPresentation = myUpdatedPresentation;
    if (updatedPresentation == null) {
      updatedPresentation = createPresentation();
    } else {
      updatedPresentation = updatedPresentation.clone();
    }

    updatedPresentation.copyFrom(presentation);

    final var templatePresentation = myTemplatePresentation;
    if (templatePresentation != null) {
      updatedPresentation.applyFrom(templatePresentation);
    }

    updated |= updatedPresentation.isChanged();
    updatedPresentation.setChanged(false);

    myUpdatedPresentation = updatedPresentation;
    return updated;
  }
protected final boolean apply(@NotNull PresentationData presentation, @Nullable PresentationData before)