diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNewLayout.java b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNewLayout.java index b31785ed8f66..035fc02da90b 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNewLayout.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNewLayout.java @@ -411,7 +411,7 @@ public class PluginManagerConfigurableNewLayout @Override protected SearchResultPanel createSearchPanel(@NotNull Consumer selectionListener, @NotNull PluginSearchTextField searchTextField) { - SearchPopupController trendingController = new SearchPopupController(searchTextField, false) { + SearchUpDownPopupController marketplaceController = new SearchUpDownPopupController(searchTextField) { @NotNull @Override protected List getAttributes() { @@ -591,8 +591,11 @@ public class PluginManagerConfigurableNewLayout } }; + MultiSelectionEventHandler eventHandler = new MultiSelectionEventHandler(); + marketplaceController.setEventHandler(eventHandler); + PluginsGroupComponentWithProgress panel = - new PluginsGroupComponentWithProgress(new PluginListLayout(), new MultiSelectionEventHandler(), myNameListener, + new PluginsGroupComponentWithProgress(new PluginListLayout(), eventHandler, myNameListener, PluginManagerConfigurableNewLayout.this.mySearchListener, descriptor -> new NewListPluginComponent(myPluginModel, descriptor, true)); @@ -600,7 +603,7 @@ public class PluginManagerConfigurableNewLayout PluginManagerConfigurableNew.registerCopyProvider(panel); myMarketplaceSearchPanel = - new SearchResultPanel(trendingController, panel, 0, 0) { + new SearchResultPanel(marketplaceController, panel, 0, 0) { @Override protected void handleQuery(@NotNull String query, @NotNull PluginsGroup result) { try { @@ -843,7 +846,7 @@ public class PluginManagerConfigurableNewLayout @Override protected SearchResultPanel createSearchPanel(@NotNull Consumer selectionListener, @NotNull PluginSearchTextField searchTextField) { - SearchPopupController installedController = new SearchPopupController(searchTextField, false) { + SearchUpDownPopupController installedController = new SearchUpDownPopupController(searchTextField) { @NotNull @Override protected List getAttributes() { @@ -872,7 +875,10 @@ public class PluginManagerConfigurableNewLayout } }; - PluginsGroupComponent panel = new PluginsGroupComponent(new PluginListLayout(), new MultiSelectionEventHandler(), myNameListener, + MultiSelectionEventHandler eventHandler = new MultiSelectionEventHandler(); + installedController.setEventHandler(eventHandler); + + PluginsGroupComponent panel = new PluginsGroupComponent(new PluginListLayout(), eventHandler, myNameListener, PluginManagerConfigurableNewLayout.this.mySearchListener, descriptor -> new NewListPluginComponent(myPluginModel, descriptor, false)); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/CellPluginComponent.java b/platform/platform-impl/src/com/intellij/ide/plugins/newui/CellPluginComponent.java index 580a373b21a2..c4758346a5fa 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/newui/CellPluginComponent.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/CellPluginComponent.java @@ -34,6 +34,8 @@ public abstract class CellPluginComponent extends JPanel { public static final Color GRAY_COLOR = JBColor.namedColor("Label.infoForeground", new JBColor(Gray._120, Gray._135)); private static final Color HOVER_COLOR = JBColor.namedColor("Plugins.lightSelectionBackground", new JBColor(0xF5F9FF, 0x36393B)); + public static boolean HANDLE_FOCUS_ON_SELECTION = true; + public final IdeaPluginDescriptor myPlugin; protected LinkLabel myIconLabel; @@ -127,7 +129,7 @@ public abstract class CellPluginComponent extends JPanel { if (scrollAndFocus) { scrollToVisible(); - if (getParent() != null && type == EventHandler.SelectionType.SELECTION) { + if (getParent() != null && type == EventHandler.SelectionType.SELECTION && HANDLE_FOCUS_ON_SELECTION) { IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> IdeFocusManager.getGlobalInstance().requestFocus(this, true)); } } diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/EventHandler.java b/platform/platform-impl/src/com/intellij/ide/plugins/newui/EventHandler.java index fdae1baff0a7..c2decd3c592c 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/newui/EventHandler.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/EventHandler.java @@ -75,6 +75,9 @@ public abstract class EventHandler { public void setSelectionListener(@Nullable Consumer listener) { } + public void handleUpDown(@NotNull KeyEvent event) { + } + public enum SelectionType { SELECTION, HOVER, NONE } diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/MultiSelectionEventHandler.java b/platform/platform-impl/src/com/intellij/ide/plugins/newui/MultiSelectionEventHandler.java index c2105e44b711..d1985e910ce1 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/newui/MultiSelectionEventHandler.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/MultiSelectionEventHandler.java @@ -196,6 +196,24 @@ public class MultiSelectionEventHandler extends EventHandler { }; } + @Override + public void handleUpDown(@NotNull KeyEvent event) { + if (myComponents.isEmpty()) { + return; + } + + try { + //noinspection AssignmentToStaticFieldFromInstanceMethod + CellPluginComponent.HANDLE_FOCUS_ON_SELECTION = false; + + myKeyListener.keyPressed(event); + } + finally { + //noinspection AssignmentToStaticFieldFromInstanceMethod + CellPluginComponent.HANDLE_FOCUS_ON_SELECTION = true; + } + } + @Override public void connect(@NotNull PluginsGroupComponent container) { myContainer = container; diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchPopupController.java b/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchPopupController.java index 6f163a547c2c..c83387184e3d 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchPopupController.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchPopupController.java @@ -21,7 +21,7 @@ import java.util.List; * @author Alexander Lobas */ public abstract class SearchPopupController { - private final PluginSearchTextField myTextField; + protected final PluginSearchTextField myTextField; private final boolean myHandleSpace; protected SearchPopup myPopup; private final JBPopupListener mySearchPopupListener = new JBPopupAdapter() { diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchUpDownPopupController.java b/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchUpDownPopupController.java new file mode 100644 index 000000000000..10423d535aa1 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchUpDownPopupController.java @@ -0,0 +1,32 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.ide.plugins.newui; + +import org.jetbrains.annotations.NotNull; + +import java.awt.event.KeyEvent; + +/** + * @author Alexander Lobas + */ +public abstract class SearchUpDownPopupController extends SearchPopupController { + private EventHandler myEventHandler; + + public SearchUpDownPopupController(@NotNull PluginSearchTextField searchTextField) { + super(searchTextField, false); + } + + public void setEventHandler(@NotNull EventHandler eventHandler) { + myEventHandler = eventHandler; + } + + @Override + public boolean handleUpDown(@NotNull KeyEvent event) { + if (myPopup != null && myPopup.list != null) { + return super.handleUpDown(event); + } + if (!myTextField.getText().isEmpty() && myEventHandler != null) { + myEventHandler.handleUpDown(event); + } + return false; + } +} \ No newline at end of file