package com.wilutions.joa.ribbon;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import com.wilutions.com.Dispatch;
import com.wilutions.joa.IconManager;
import com.wilutions.mslib.office.IRibbonControl;
public class RibbonComboBox<T> extends RibbonControl {
public interface ChangeListener<T> {
void f(IRibbonControl control, T oldValue, T newValue);
}
public interface ExtractItemData<T> {
String getItemID(T item);
String getItemLabel(T item);
Dispatch getItemImage(IconManager iconManager, T item);
}
private List<T> items = new ArrayList<T>();
private int selectedIndex;
private ExtractItemData<T> extractItemData;
@RibbonControlAttribute("Ribbon_onChange")
private ChangeListener<T> onChange;
public RibbonComboBox() {
this(null);
}
public RibbonComboBox(ExtractItemData<T> extractItemData) {
super("comboBox");
if (extractItemData == null) {
extractItemData = new ExtractItemDefault<T>();
}
this.extractItemData = extractItemData;
}
public String getText() {
return getItemLabel(selectedIndex);
}
public String getItemLabel(int idx) {
String ret = "";
if (idx < items.size()) {
T item = items.get(idx);
ret = extractItemData.getItemLabel(item);
}
return ret;
}
public String getItemID(int idx) {
String ret = "";
if (idx < items.size()) {
T item = items.get(idx);
ret = extractItemData.getItemID(item);
}
return ret;
}
public Dispatch getItemImage(IconManager iconManager, int idx) {
Dispatch ret = null;
if (idx < items.size()) {
T item = items.get(idx);
ret = extractItemData.getItemImage(iconManager, item);
}
return ret;
}
public void setOnChange(ChangeListener<T> onChange) {
this.onChange = onChange;
}
public ChangeListener<T> getOnChange() {
return onChange;
}
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
}
public int getSelectedIndex() {
return selectedIndex;
}
public void setSelectedIndex(int selectedIndex) {
this.selectedIndex = selectedIndex;
}
public int findItemIndex(String text) {
int ret = 0;
for (int i = 0; i < items.size(); i++) {
if (items.get(i).toString().equals(text)) {
ret = i;
break;
}
}
return ret;
}
private static class ExtractItemDefault<T> implements ExtractItemData<T> {
public String getItemLabel(T item) {
String ret = null;
Class<?> clazz = item.getClass();
try {
Field field = clazz.getDeclaredField("label");
field.setAccessible(true);
Object value = field.get(item);
if (value != null) {
ret = value.toString();
}
}
catch (Exception e) {
}
return ret;
}
public Dispatch getItemImage(IconManager iconManager, T item) {
Dispatch ret = null;
Class<?> clazz = item.getClass();
try {
Field field = clazz.getDeclaredField("image");
field.setAccessible(true);
Object value = field.get(item);
if (value != null) {
ret = iconManager.get(value.toString());
}
}
catch (Exception e) {
}
return ret;
}
@Override
public String getItemID(T item) {
String ret = null;
Class<?> clazz = item.getClass();
try {
Field field = clazz.getDeclaredField("id");
field.setAccessible(true);
Object value = field.get(item);
if (value != null) {
ret = value.toString();
}
}
catch (Exception e) {
}
return ret;
}
}
}