package at.bestsolution.efxclipse.tooling.model.internal; import static at.bestsolution.efxclipse.tooling.model.internal.utils.Util.getFQNType; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.eclipse.jdt.core.IAnnotation; 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 org.osgi.service.log.LogService; import at.bestsolution.efxclipse.tooling.model.FXPlugin; import at.bestsolution.efxclipse.tooling.model.IFXCtrlClass; import at.bestsolution.efxclipse.tooling.model.IFXCtrlEventMethod; import at.bestsolution.efxclipse.tooling.model.IFXCtrlField; import at.bestsolution.efxclipse.tooling.model.internal.utils.Util; public class FXCtrlClass implements IFXCtrlClass { private IJavaProject javaProject; private IType type; private Map<String,IFXCtrlEventMethod> eventMethods; private Map<String,IFXCtrlField> fields; private IFXCtrlClass superClass; public FXCtrlClass(IJavaProject jp, IType type) { this.javaProject = jp; this.type = type; try { String s = type.getSuperclassName(); if( s != null ) { s = getFQNType(type,s); superClass = FXPlugin.getClassmodel().findCtrlClass(jp, jp.findType(s)); } } catch (JavaModelException e) { FXPlugin.getLogger().log(LogService.LOG_ERROR, "Unable to retrieve superclass name of '"+type.getFullyQualifiedName()+"'", e ); } } IJavaProject getJavaProject() { return javaProject; } @Override public String getSimpleName() { return type.getElementName(); } public String getFQN() { return type.getFullyQualifiedName(); } @Override public Map<String,IFXCtrlEventMethod> getAllEventMethods() { Map<String, IFXCtrlEventMethod> rv = new HashMap<String, IFXCtrlEventMethod>(); if( superClass != null ) { rv.putAll(superClass.getAllEventMethods()); } rv.putAll(getLocalEventMethods()); return Collections.unmodifiableMap(rv); } private Map<String,IFXCtrlEventMethod> getLocalEventMethods() { if( eventMethods == null ) { eventMethods = new HashMap<String, IFXCtrlEventMethod>(); try { for( IMethod m : type.getMethods() ) { boolean annotated = false; for (IAnnotation a : m.getAnnotations()) { if (a.getElementName().endsWith("FXML")) { annotated = true; } } if( annotated ) { String[] types = m.getParameterTypes(); if( types.length <= 1 ) { if( types.length == 1 ) { String erasedFQNType = Util.getFQNType((IType)m.getParent(), Signature.getTypeErasure(Signature.toString(types[0]))); if( FXCtrlEventMethod.isEventMethod(javaProject, erasedFQNType) ) { eventMethods.put(m.getElementName(), new FXCtrlEventMethod(this,m, erasedFQNType)); } } else { // Only if there's not already a method with the same id if( ! eventMethods.containsKey(m.getElementName()) ) { eventMethods.put(m.getElementName(), new FXCtrlEventMethod(this,m,null)); } } } } } } catch (JavaModelException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return eventMethods; } @Override public Map<String,IFXCtrlField> getFields() { // TODO Auto-generated method stub return null; } }