package com.onaro.util.jfc.enumeration;
import java.awt.Dimension;
import java.util.EnumSet;
import java.util.Vector;
import javax.swing.JComboBox;
/**
* Combobox component for enum values.
*
* - Simple use: create using {@link #EnumComboBox(E[], E)}, check what is the selected value using {@link #getSelectedEnum()}
*
- Advanced use: create using {@link #EnumComboBox(K[], K, EnumSelectionListener, com.onaro.util.jfc.enumeration.EnumDecorationRepository)},
* Passing a listener for selection and decoration factory to control the presentation of the values using cell renderer
*
*/
public class EnumComboBox> extends JComboBox {
private static final long serialVersionUID = 1L;
EnumSelectionListener listener;
public EnumComboBox(E[] values, final E initialSelection) {
this(values,initialSelection,null,null);
}
public EnumComboBox(E[] values, final E initialSelection, EnumSelectionListener listener, final EnumDecorationRepository decorationRepository) {
super(values);
init(initialSelection, listener, decorationRepository);
}
public EnumComboBox(Class clazz, final E initialSelection) {
this(EnumSet.allOf(clazz), initialSelection, null, null);
}
public EnumComboBox(Class clazz, final E initialSelection, EnumSelectionListener listener, final EnumDecorationRepository decorationRepository) {
this(EnumSet.allOf(clazz), initialSelection, listener, decorationRepository);
}
public EnumComboBox(EnumSet enumSet, final E initialSelection, EnumSelectionListener listener, final EnumDecorationRepository decorationRepository) {
super(new Vector(enumSet));
init(initialSelection, listener, decorationRepository);
}
private void init(final E initialSelection, EnumSelectionListener listener, final EnumDecorationRepository decorationRepository) {
setDecorationRepository(decorationRepository);
if(initialSelection != null){
setSelectedItem(initialSelection);
}
//the listener is set after the default is selected to avoid from firing event at initialization
this.listener = listener;
}
@SuppressWarnings("unchecked")
private void setDecorationRepository(EnumDecorationRepository decorationRepository) {
if (decorationRepository != null) {
setRenderer(new EnumListCellRenderer(decorationRepository, getRenderer()));
}
}
protected void selectedItemChanged() {
fireEnumSelectionEvent(false);
super.selectedItemChanged();
fireEnumSelectionEvent(true);
}
@SuppressWarnings("unchecked")
private void fireEnumSelectionEvent(boolean selected) {
if (listener != null) {
//since the values in the combobox are thee enumration values, it's OK to cast them
listener.selectionChanged(new EnumSelectionEvent(this,(E) selectedItemReminder,selected,false));
}
}
public void setListener(EnumSelectionListener listener) {
this.listener = listener;
}
@SuppressWarnings("unchecked")
public E getSelectedEnum() {
return (E) super.getSelectedItem();
}
/**
* Fixes the toolbar's problem in which the combo-box consume all the
* space available in the toolbar by limiting its size.
*
* @return the maximum allowed size for this combo-box
*/
public Dimension getMaximumSize() {
return getPreferredSize();
}
}