From 27f6146bf9ad5da83e9d43fdc521cd63d8194d20 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 17 Aug 2011 18:38:56 +0200 Subject: [PATCH] aad JBPopup for ComboBox --- .../src/com/intellij/openapi/ui/ComboBox.java | 80 +++++++++++++++---- 1 file changed, 66 insertions(+), 14 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/ComboBox.java b/platform/platform-api/src/com/intellij/openapi/ui/ComboBox.java index 792523a4ae06..3216978cbc76 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/ComboBox.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/ComboBox.java @@ -15,10 +15,11 @@ */ package com.intellij.openapi.ui; -import com.intellij.openapi.Disposable; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.SystemInfo; +import com.intellij.ui.IdeBorderFactory; +import com.intellij.ui.components.JBList; import com.intellij.util.ui.MacUIUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; @@ -45,6 +46,8 @@ import java.util.List; */ public class ComboBox extends ComboBoxWithWidePopup implements AWTEventListener { private int myMinimumAndPreferredWidth; + private boolean mySwingPopup = true; + private JBPopup myJBPopup; public ComboBox() { this(-1); @@ -55,31 +58,65 @@ public class ComboBox extends ComboBoxWithWidePopup implements AWTEventListener } /** - * @param minimumAndPreferredWidth preferred width of the combobox. Value -1 means undefined. + * @param width preferred width of the combobox. Value -1 means undefined. */ - public ComboBox(final int minimumAndPreferredWidth) { - this(new DefaultComboBoxModel(), minimumAndPreferredWidth); + public ComboBox(final int width) { + this(new DefaultComboBoxModel(), width); UIUtil.installComboBoxCopyAction(this); } - public ComboBox(final ComboBoxModel model, final int minimumAndPreferredWidth) { + public ComboBox(final ComboBoxModel model, final int width) { super(model); - myMinimumAndPreferredWidth = minimumAndPreferredWidth; + myMinimumAndPreferredWidth = width; registerCancelOnEscape(); } @Override - public void setPopupVisible(boolean v) { - if (getModel().getSize() == 0 && v) return; - if (v && JBPopupFactory.getInstance().getChildFocusedPopup(this) != null) return; + public void setPopupVisible(boolean visible) { + if (!isSwingPopup()) { + if (visible && (myJBPopup == null || myJBPopup.isDisposed())) { + final JBList list = new JBList(getModel()); + myJBPopup = JBPopupFactory.getInstance() + .createListPopupBuilder(list) + .setItemChoosenCallback(new Runnable() { + @Override + public void run() { + final Object value = list.getSelectedValue(); + if (value != null) { + configureEditor(getEditor(), value); + } + } + }) + .setMinSize(new Dimension(getWidth(), -1)) + .setMovable(false) + .setResizable(false) + .createPopup(); + list.setBorder(IdeBorderFactory.createEmptyBorder(0)); + myJBPopup.showUnderneathOf(this); + list.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + myJBPopup.cancel(); + } + }); + } + return; + } + + if (getModel().getSize() == 0 && visible) return; + if (visible && JBPopupFactory.getInstance().getChildFocusedPopup(this) != null) return; final boolean wasShown = isPopupVisible(); - super.setPopupVisible(v); - if (!wasShown && v && isEditable() && !wasShown && !UIManager.getBoolean("ComboBox.isEnterSelectablePopup")) { + super.setPopupVisible(visible); + if (!wasShown + && visible + && isEditable() + && !UIManager.getBoolean("ComboBox.isEnterSelectablePopup")) { + final ComboBoxEditor editor = getEditor(); final Object item = editor.getItem(); final Object selectedItem = getSelectedItem(); - if (item == null || item != selectedItem) { + if (isSwingPopup() && (item == null || item != selectedItem)) { configureEditor(editor, selectedItem); } } @@ -106,13 +143,16 @@ public class ComboBox extends ComboBoxWithWidePopup implements AWTEventListener putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); } - Toolkit.getDefaultToolkit().addAWTEventListener(this, WindowEvent.WINDOW_EVENT_MASK); + Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.WINDOW_EVENT_MASK); } @Override public void removeNotify() { super.removeNotify(); Toolkit.getDefaultToolkit().removeAWTEventListener(this); + if (myJBPopup != null && myJBPopup.isVisible()) { + myJBPopup.cancel(); + } } @@ -127,13 +167,25 @@ public class ComboBox extends ComboBoxWithWidePopup implements AWTEventListener registerCancelOnEscape(); } + + public boolean isSwingPopup() { + return mySwingPopup; + } + + public void setSwingPopup(boolean swingPopup) { + mySwingPopup = swingPopup; + } + public void setMinimumAndPreferredWidth(final int minimumAndPreferredWidth) { myMinimumAndPreferredWidth = minimumAndPreferredWidth; } + @Nullable private static DialogWrapperDialog getParentDialog(Component c) { do { - if (c == null || c instanceof DialogWrapperDialog) return (DialogWrapperDialog)c; + if (c == null || c instanceof DialogWrapperDialog) { + return (DialogWrapperDialog)c; + } c = c.getParent(); } while (true);