package org.goko.common.elements.combo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Composite;
import org.goko.common.elements.combo.v2.GkComboContentProvider;
public class GkCombo3<T> extends ComboViewer {
public GkCombo3(Composite parent, int style, String labelField) {
super(parent, style);
setContentProvider(new GkComboContentProvider());
setLabelProvider(new GkIntrospectionLabelProvider<T>(labelField));
}
public List<T> getValues(){
return (List<T>) getInput();
}
public final void setInput(List<T> values) {
super.setInput(values);
}
public void setSelectedValue(T value){
setSelection(new StructuredSelection(value));
}
public T getSelectedValue(){
IStructuredSelection selection = (IStructuredSelection) super.getSelection();
return (T) selection.getFirstElement();
}
}
class GkIntrospectionLabelProvider<T> extends LabelProvider {
private String labelMethod;
public GkIntrospectionLabelProvider(String labelMethod) {
this.labelMethod = labelMethod;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
String label = StringUtils.EMPTY;
try {
Method method = element.getClass().getMethod(labelMethod);
label = String.valueOf( method.invoke(element) );
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return label;
}
}