From b1deee469d918c04d319f0a3af8624b98bcc6155 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 12 Jul 2024 17:47:41 +0400 Subject: [PATCH] IJPL-158093 NPE when clicking Choose direction in the editor GitOrigin-RevId: 6d6cc1d9bb6e0b87d4675adefaaba6889c58df0f --- platform/ide-core/api-dump-unreviewed.txt | 1 + .../openapi/actionSystem/ActionPlaces.java | 3 ++- .../actionSystem/impl/ActionMenuItem.kt | 24 ++++++++++--------- .../impl/BidiContentNotificationProvider.java | 20 ++++++++-------- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/platform/ide-core/api-dump-unreviewed.txt b/platform/ide-core/api-dump-unreviewed.txt index e517d168c346..2c029553d118 100644 --- a/platform/ide-core/api-dump-unreviewed.txt +++ b/platform/ide-core/api-dump-unreviewed.txt @@ -964,6 +964,7 @@ a:com.intellij.openapi.actionSystem.ActionPlaces - sf:EDITOR_HINT:java.lang.String - sf:EDITOR_INLAY:java.lang.String - sf:EDITOR_INSPECTIONS_TOOLBAR:java.lang.String +- sf:EDITOR_NOTIFICATION_POPUP:java.lang.String - sf:EDITOR_POPUP:java.lang.String - sf:EDITOR_TAB:java.lang.String - sf:EDITOR_TAB_POPUP:java.lang.String diff --git a/platform/ide-core/src/com/intellij/openapi/actionSystem/ActionPlaces.java b/platform/ide-core/src/com/intellij/openapi/actionSystem/ActionPlaces.java index 11d7d57b955a..de20811d6251 100644 --- a/platform/ide-core/src/com/intellij/openapi/actionSystem/ActionPlaces.java +++ b/platform/ide-core/src/com/intellij/openapi/actionSystem/ActionPlaces.java @@ -41,6 +41,7 @@ public abstract class ActionPlaces { public static final String EDITOR_GUTTER = "ICON_NAVIGATION"; public static final String EDITOR_GUTTER_POPUP = "ICON_NAVIGATION_SECONDARY_BUTTON"; public static final String EDITOR_ANNOTATIONS_AREA_POPUP = "EditorAnnotationsAreaPopup"; + public static final String EDITOR_NOTIFICATION_POPUP = "EDITOR_NOTIFICATION_POPUP"; public static final String EDITOR_INLAY = "EditorInlay"; public static final String RIGHT_EDITOR_GUTTER_POPUP = "RightEditorGutterPopup"; public static final String COMMANDER_POPUP = "CommanderPopup"; @@ -251,7 +252,7 @@ public abstract class ActionPlaces { CHANGES_VIEW_POPUP, DATABASE_VIEW_POPUP, REMOTE_HOST_VIEW_POPUP, REMOTE_HOST_DIALOG_POPUP, TFS_TREE_POPUP, ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION, PHING_EXPLORER_POPUP, NAVIGATION_BAR_POPUP, JS_BUILD_TOOL_POPUP, V8_CPU_PROFILING_POPUP, V8_HEAP_PROFILING_POPUP, V8_HEAP_PROFILING_POPUP, RUN_DASHBOARD_POPUP, SERVICES_POPUP, EDITOR_GUTTER_POPUP, - EDITOR_ANNOTATIONS_AREA_POPUP, + EDITOR_ANNOTATIONS_AREA_POPUP, EDITOR_NOTIFICATION_POPUP, RUN_ANYTHING_POPUP, RUN_TOOLBAR_LEFT_SIDE, VCS_LOG_TABLE_PLACE, VCS_HISTORY_PLACE, VCS_LOG_TOOLBAR_POPUP_PLACE, VCS_LOG_BRANCHES_PLACE, VCS_TOOLBAR_WIDGET, PROJECT_WIDGET_POPUP, diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.kt b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.kt index 5946d6d3a4fc..530d3b880a51 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.kt +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionMenuItem.kt @@ -196,7 +196,10 @@ class ActionMenuItem internal constructor(action: AnAction, if (ActionPlaces.MAIN_MENU == place && SystemInfo.isMacSystemMenu) { state = isToggled screenMenuItemPeer?.setState(isToggled) - setIcon(wrapNullIcon(icon)!!) + } + val adjustedIcon = adjustIcon(presentation.icon) + if (adjustedIcon != null) { + setIcon(adjustedIcon) } else if (isToggled) { setToggledIcon() @@ -220,21 +223,20 @@ class ActionMenuItem internal constructor(action: AnAction, if (selected == null) { selected = icon } - setIcon(wrapNullIcon(if (presentation.isEnabled) icon else disabled)) - setSelectedIcon(wrapNullIcon(selected)) - setDisabledIcon(wrapNullIcon(disabled)) + setIcon(adjustIcon(if (presentation.isEnabled) icon else disabled)) + setSelectedIcon(adjustIcon(selected)) + setDisabledIcon(adjustIcon(disabled)) } } - private fun wrapNullIcon(icon: Icon?): Icon? { + private fun adjustIcon(icon: Icon?): Icon? { val isMainMenu = ActionPlaces.MAIN_MENU == place - if (isMainMenu && isShowNoIcons(actionRef.getAction())) { - return null + return when { + isMainMenu && isShowNoIcons(actionRef.getAction()) -> null + !isAligned || !isAlignedInGroup -> return icon + isMainMenu && icon == null && SystemInfo.isMacSystemMenu -> EMPTY_MENU_ACTION_ICON + else -> icon } - if (!isAligned || !isAlignedInGroup) { - return icon - } - return if (icon == null && SystemInfo.isMacSystemMenu && ActionPlaces.MAIN_MENU == place) EMPTY_MENU_ACTION_ICON else icon } override fun setIcon(icon: Icon?) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/BidiContentNotificationProvider.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/BidiContentNotificationProvider.java index d4a9dc430ced..af635ebbc2d2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/BidiContentNotificationProvider.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/BidiContentNotificationProvider.java @@ -59,18 +59,18 @@ final class BidiContentNotificationProvider implements EditorNotificationProvide }; } - private static void showChooserPopup(Editor editor) { + private static void showChooserPopup(@NotNull Editor editor) { ActionManager actionManager = ActionManager.getInstance(); AnAction group = actionManager.getAction(IdeActions.GROUP_EDITOR_BIDI_TEXT_DIRECTION); - if (group instanceof ActionGroup) { - JPopupMenu popupMenu = actionManager.createActionPopupMenu(ActionPlaces.MAIN_MENU, (ActionGroup)group).getComponent(); - AWTEvent event = IdeEventQueue.getInstance().getTrueCurrentEvent(); - if (event instanceof MouseEvent && ((MouseEvent)event).getComponent().isShowing()) { - JBPopupMenu.showByEvent((MouseEvent)event, popupMenu); - } - else { - JBPopupMenu.showByEditor(editor, popupMenu); - } + if (!(group instanceof ActionGroup)) return; + JPopupMenu popupMenu = actionManager.createActionPopupMenu( + ActionPlaces.EDITOR_NOTIFICATION_POPUP, (ActionGroup)group).getComponent(); + AWTEvent event = IdeEventQueue.getInstance().getTrueCurrentEvent(); + if (event instanceof MouseEvent && ((MouseEvent)event).getComponent().isShowing()) { + JBPopupMenu.showByEvent((MouseEvent)event, popupMenu); + } + else { + JBPopupMenu.showByEditor(editor, popupMenu); } } }