package at.bestsolution.efxclipse.tooling.model.internal;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import at.bestsolution.efxclipse.tooling.model.IFXEventHandlerProperty;
import at.bestsolution.efxclipse.tooling.model.internal.utils.Util;
public class FXEventHandlerProperty extends FXProperty implements IFXEventHandlerProperty {
private IType eventType;
public FXEventHandlerProperty(FXClass fxClass, String name, IJavaElement javaElement, boolean isStatic) {
super(fxClass, name, javaElement, isStatic);
}
public static boolean isEventHandler(IJavaProject jp, String erasedFQNType) throws JavaModelException {
String checkType = erasedFQNType;
do {
if ("javafx.event.EventHandler".equals(checkType)) {
return true;
}
IType t = jp.findType(checkType);
checkType = t.getSuperclassName();
if (checkType != null) {
checkType = Util.getFQNType(t, checkType);
}
} while (checkType != null);
return false;
}
public IType getEventType() {
if( eventType == null ) {
try {
IMethod m = (IMethod) getJavaElement();
String signature;
if( isSetable() ) {
signature = m.getParameterTypes()[0];
} else {
signature = m.getReturnType();
}
String genericType = Signature.toString(signature);
String eType = genericType.substring(genericType.indexOf('<')+1, genericType.indexOf('>'));
// FIXME Is there a better way?
if( eType.contains("super") ) {
eType = eType.substring(eType.indexOf("super")+"super".length()).trim();
} else if( eType.contains("extends") ) {
eType = eType.substring(eType.indexOf("extends")+"extends".length()).trim();
}
IType t = (IType) m.getParent();
String fqnType = Util.getFQNType(t,eType);
eventType = getFXClass().getJavaProject().findType(fqnType);
} catch(JavaModelException e) {
// TODO Auto-generated method stub
e.printStackTrace();
}
}
return eventType;
}
@Override
public String getEventTypeAsString(boolean fqn) {
IType t = getEventType();
if( t == null) {
return "?";
}
return fqn ? t.getFullyQualifiedName() : t.getElementName();
}
@Override
public String toString() {
return "FXEventHandlerProperty("+getName()+")";
}
}