package org.netbeans.gradle.project.properties.ui;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import javax.swing.JComboBox;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.project.NbStrings;
public final class EnumCombo<EnumType extends Enum<EnumType>> {
private static final Collator STR_CMP = Collator.getInstance();
private final Class<EnumType> enumType;
private final EnumType defaultValue;
private final JComboBox<Item<EnumType>> combo;
public EnumCombo(
Class<EnumType> enumType,
EnumType defaultValue,
JComboBox<Item<EnumType>> combo) {
ExceptionHelper.checkNotNullArgument(enumType, "enumType");
ExceptionHelper.checkNotNullArgument(combo, "combo");
this.enumType = enumType;
this.defaultValue = defaultValue;
this.combo = combo;
fillCombo();
}
public void setSelectedValue(EnumType value) {
combo.setSelectedItem(new Item<>(value));
}
public EnumType getSelectedValue() {
Item<?> selected = (Item<?>)combo.getSelectedItem();
return selected != null
? enumType.cast(selected.getValue())
: defaultValue;
}
private void fillCombo() {
EnumType[] values = enumType.getEnumConstants();
List<Item<EnumType>> entries = new ArrayList<>(values.length);
for (EnumType value: values) {
entries.add(new Item<>(value));
}
Collections.sort(entries, new Comparator<Item<EnumType>>() {
@Override
public int compare(Item<EnumType> a, Item<EnumType> b) {
return STR_CMP.compare(a.toString(), b.toString());
}
});
combo.removeAllItems();
for (Item<EnumType> entry: entries) {
combo.addItem(entry);
}
}
public static final class Item<EnumType extends Enum<EnumType>> {
private final EnumType value;
private final String displayName;
public Item(EnumType value) {
this.value = value;
this.displayName = NbStrings.getEnumDisplayValue(value);
}
public EnumType getValue() {
return value;
}
@Override
public int hashCode() {
return 445 + Objects.hashCode(value);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final Item<?> other = (Item<?>)obj;
return this.value == other.value;
}
@Override
public String toString() {
return displayName;
}
}
}