/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cids.custom.switchon;
import org.openide.util.WeakListeners;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
/**
* DOCUMENT ME!
*
* @author martin.scholl@cismet.de
* @version $Revision$, $Date$
*/
public final class LocalisedEnumComboBox<T extends LocalisedEnum<T>> extends JComboBox {
//~ Instance fields --------------------------------------------------------
private final transient Class<T> lEnum;
private final transient Available<T> available;
private final transient ListCellRenderer listR;
private final transient ActionListener actionL;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new LocalisedEnumComboBox object.
*
* @param lEnum DOCUMENT ME!
*/
public LocalisedEnumComboBox(final Class<T> lEnum) {
this(lEnum, new Available.PositiveAvailable());
}
/**
* Creates a new LocalisedEnumComboBox object.
*
* @param lEnum DOCUMENT ME!
* @param available DOCUMENT ME!
*
* @throws IllegalStateException DOCUMENT ME!
*/
public LocalisedEnumComboBox(final Class<T> lEnum, final Available<T> available) {
this.lEnum = lEnum;
this.available = available;
final T[] values;
try {
values = (T[])lEnum.getMethod("values", (Class[])null).invoke(null, (Object[])null); // NOI18N
} catch (final Exception ex) {
throw new IllegalStateException("localisedEnum class must implement static method: T[] values()", ex); // NOI18N
}
Arrays.sort(values);
boolean foundAvailable = false;
for (final T value : values) {
addItem(value);
if (!foundAvailable && available.isAvailable(value)) {
setSelectedItem(value);
foundAvailable = true;
}
}
listR = new ResolutionRenderer();
actionL = new LocalisedEnumActionListener();
setRenderer(listR);
addActionListener(WeakListeners.create(ActionListener.class, actionL, this));
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private final class LocalisedEnumActionListener implements ActionListener {
//~ Instance fields ----------------------------------------------------
private transient T currentItem;
//~ Constructors -------------------------------------------------------
/**
* Creates a new ResolutionActionListener object.
*/
public LocalisedEnumActionListener() {
currentItem = (T)getSelectedItem();
}
//~ Methods ------------------------------------------------------------
@Override
public void actionPerformed(final ActionEvent e) {
final T selected = (T)getSelectedItem();
if (available.isAvailable(selected)) {
currentItem = selected;
} else {
setSelectedItem(currentItem);
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private final class ResolutionRenderer extends DefaultListCellRenderer {
//~ Methods ------------------------------------------------------------
@Override
public Component getListCellRendererComponent(final JList list,
final Object value,
final int index,
final boolean isSelected,
final boolean cellHasFocus) {
final Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if ((value != null) && (lEnum.isAssignableFrom(value.getClass())) && (c instanceof JLabel)) {
final T lEnumValue = (T)value;
final JLabel label = (JLabel)c;
label.setText(lEnumValue.getLocalisedName());
label.setEnabled(available.isAvailable(lEnumValue));
}
return c;
}
}
}