package org.limewire.ui.swing.components;
import java.awt.Color;
import java.awt.Component;
import java.awt.Insets;
import java.awt.event.ActionListener;
import javax.swing.ComboBoxEditor;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup;
import net.miginfocom.swing.MigLayout;
import org.jdesktop.application.Resource;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.painter.CompoundPainter;
import org.jdesktop.swingx.painter.RectanglePainter;
import org.limewire.ui.swing.painter.BorderPainter;
import org.limewire.ui.swing.painter.BorderPainter.AccentType;
import org.limewire.ui.swing.util.GuiUtils;
/**
* Custom painted JComboBox inside JXPanel. Provides access to ComboPopup, and text field.
*/
public class LimeEditableComboBox extends JXPanel{
@Resource private int arcWidth;
@Resource private int arcHeight;
@Resource private Color borderColour;
@Resource private Color bevelLeft;
@Resource private Color bevelTop1;
@Resource private Color bevelTop2;
@Resource private Color bevelRight;
@Resource private Color bevelBottom;
private JTextField inputField;
private JComboBox comboBox;
private LimeEditableComboBoxUI comboUI;
public LimeEditableComboBox(){
GuiUtils.assignResources(this);
initializeComboBox();
initializePainter();
setOpaque(false);
setLayout(new MigLayout("fill, ins 0 0 0 0 , gap 0! 0!, novisualpadding"));
add(comboBox, "gapleft 6, gapright 6, aligny 50%, growx");
}
public BasicComboPopup getPopup(){
return comboUI.getPopup();
}
public JTextField getTextField(){
return inputField;
}
public JComboBox getComboBox(){
return comboBox;
}
private void initializeComboBox() {
comboBox = new JComboBox();
initializeInputField();
comboUI = new LimeEditableComboBoxUI();
comboBox.setUI(comboUI);
comboBox.setEditor(new ShareComboBoxEditor());
comboBox.setEditable(true);
comboBox.setOpaque(false);
comboBox.setBorder(new EmptyBorder(0, 0, 0, 0));
}
//must be called after friendCombo is initialized
private void initializeInputField() {
inputField = new JTextField(12);
inputField.setBorder(new EmptyBorder(0, 0, 0, 0));
inputField.setOpaque(false);
}
private void initializePainter(){
CompoundPainter<JXPanel> compoundPainter = new CompoundPainter<JXPanel>();
RectanglePainter<JXPanel> painter = new RectanglePainter<JXPanel>();
painter.setRounded(true);
painter.setFillPaint(Color.WHITE);
painter.setRoundWidth(this.arcWidth);
painter.setRoundHeight(this.arcHeight);
painter.setInsets(new Insets(2, 2, 2, 2));
painter.setBorderPaint(null);
painter.setFillVertical(true);
painter.setFillHorizontal(true);
painter.setAntialiasing(true);
painter.setCacheable(true);
compoundPainter.setPainters(painter, new BorderPainter<JXPanel>(this.arcWidth, this.arcHeight,
borderColour, this.bevelLeft, this.bevelTop1, this.bevelTop2,
this.bevelRight, this.bevelBottom, AccentType.SHADOW));
compoundPainter.setCacheable(true);
setBackgroundPainter(compoundPainter);
}
private class ShareComboBoxEditor implements ComboBoxEditor{
@Override
public Component getEditorComponent() {
return inputField;
}
@Override
public void addActionListener(ActionListener l) {
//Do nothing
}
@Override
public Object getItem() {
//Do nothing
return null;
}
@Override
public void removeActionListener(ActionListener l) {
//Do nothing
}
@Override
public void selectAll() {
//Do nothing
}
@Override
public void setItem(Object anObject) {
//Do nothing
}
}
private static class LimeEditableComboBoxUI extends BasicComboBoxUI {
@Resource private Icon arrowIcon;
@Resource private Icon rolloverArrowIcon;
@Resource private Icon downArrowIcon;
@Resource private Color selectedBackground;
private final Color selectedForeground = UIManager.getColor("MenuItem.selectionForeground");
public LimeEditableComboBoxUI(){
GuiUtils.assignResources(this);
}
public BasicComboPopup getPopup(){
return (BasicComboPopup)popup;
}
@Override
protected ComboPopup createPopup() {
BasicComboPopup comboPopup = new BasicComboPopup(comboBox);
comboPopup.getList().setSelectionBackground(selectedBackground);
comboPopup.getList().setSelectionForeground(selectedForeground);
return comboPopup;
}
@Override
protected JButton createArrowButton() {
JButton button = new IconButton(arrowIcon, rolloverArrowIcon, downArrowIcon);
button.setName("ComboBox.arrowButton");
return button;
}
}
}