void (final @NotNull Notification notification, final @NotNull ProjectSystemId externalSystemId, final @NotNull NotificationData notificationData) { final VirtualFile virtualFile = notificationData.getFilePath() != null ? ExternalSystemUtil.findLocalFileByPath(notificationData.getFilePath()) : null; final String groupName = virtualFile != null ? virtualFile.getPresentableUrl() : notificationData.getTitle(); myMessageCounter .increment(groupName, notificationData.getNotificationSource(), notificationData.getNotificationCategory(), externalSystemId); int line = notificationData.getLine() - 1; int column = notificationData.getColumn() - 1; if (virtualFile == null) line = column = -1; final int guiLine = line < 0 ? -1 : line + 1; final int guiColumn = column < 0 ? 0 : column + 1; if (isDisposedOrNotOpen()) return; assert myProject != null; Project project = myProject; final Navigatable navigatable = notificationData.getNavigatable() != null ? notificationData.getNavigatable() : virtualFile != null ? new OpenFileDescriptor(project, virtualFile, line, column) : NonNavigatable.INSTANCE; final ErrorTreeElementKind kind = ErrorTreeElementKind.convertMessageFromCompilerErrorType(notificationData.getNotificationCategory().getMessageCategory()); final String[] message = notificationData.getMessage().split("\n"); final String exportPrefix = NewErrorTreeViewPanel.createExportPrefix(guiLine); final String rendererPrefix = NewErrorTreeViewPanel.createRendererPrefix(guiLine, guiColumn); UIUtil.invokeLaterIfNeeded(() -> { boolean activate = notificationData.getNotificationCategory() == NotificationCategory.ERROR || notificationData.getNotificationCategory() == NotificationCategory.WARNING; final NewErrorTreeViewPanel errorTreeView = prepareMessagesView(externalSystemId, notificationData.getNotificationSource(), activate); final GroupingElement groupingElement = errorTreeView.getErrorViewStructure().getGroupingElement(groupName, null, virtualFile); final NavigatableMessageElement navigatableMessageElement; // Note: Given that screen readers don't currently support hyperlinks and // that having a cell editor for a panel in a tree view node makes // the user-interaction confusing for keyboard only users, // don't create a editable element if screen reader is active. if (notificationData.hasLinks() && !ScreenReader.isActive()) { navigatableMessageElement = new EditableNotificationMessageElement( notification, kind, groupingElement, message, navigatable, exportPrefix, rendererPrefix); } else { navigatableMessageElement = new NotificationMessageElement( kind, groupingElement, message, navigatable, exportPrefix, rendererPrefix); } errorTreeView.getErrorViewStructure().addNavigatableMessage(groupName, navigatableMessageElement); errorTreeView.updateTree(); }); }