/*
* generated by Xtext
*/
package at.bestsolution.efxclipse.tooling.fxgraph.ui.contentassist;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextHoverExtension;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.common.types.access.IJvmTypeProvider;
import org.eclipse.xtext.common.types.access.jdt.IJavaProjectProvider;
import org.eclipse.xtext.common.types.util.jdt.IJavaElementFinder;
import org.eclipse.xtext.common.types.xtext.ui.ITypesProposalProvider;
import org.eclipse.xtext.common.types.xtext.ui.ITypesProposalProvider.Filter;
import org.eclipse.xtext.common.types.xtext.ui.JdtHoverProvider.JavadocHoverWrapper;
import org.eclipse.xtext.common.types.xtext.ui.TypeMatchFilters;
import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher;
import org.eclipse.xtext.ui.editor.hover.IEObjectHover;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.BindValueProperty;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.Define;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.Element;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.FXGraphPackage;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.ListValueProperty;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.MapValueProperty;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.Model;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.Property;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.ReferenceValueProperty;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.StaticCallValueProperty;
import at.bestsolution.efxclipse.tooling.fxgraph.fXGraph.StaticValueProperty;
import at.bestsolution.efxclipse.tooling.model.FXPlugin;
import at.bestsolution.efxclipse.tooling.model.IFXClass;
import at.bestsolution.efxclipse.tooling.model.IFXCollectionProperty;
import at.bestsolution.efxclipse.tooling.model.IFXCtrlClass;
import at.bestsolution.efxclipse.tooling.model.IFXCtrlEventMethod;
import at.bestsolution.efxclipse.tooling.model.IFXEnumProperty;
import at.bestsolution.efxclipse.tooling.model.IFXEventHandlerProperty;
import at.bestsolution.efxclipse.tooling.model.IFXMapProperty;
import at.bestsolution.efxclipse.tooling.model.IFXObjectProperty;
import at.bestsolution.efxclipse.tooling.model.IFXPrimitiveProperty;
import at.bestsolution.efxclipse.tooling.model.IFXPrimitiveProperty.Type;
import at.bestsolution.efxclipse.tooling.model.IFXProperty;
import at.bestsolution.efxclipse.tooling.model.Util;
import at.bestsolution.efxclipse.tooling.ui.util.IconKeys;
import at.bestsolution.efxclipse.tooling.ui.util.RelativeFileLocator;
import com.google.inject.Inject;
/**
* see
* http://www.eclipse.org/Xtext/documentation/latest/xtext.html#contentAssist on
* how to customize content assistant
*/
@SuppressWarnings("restriction")
public class FXGraphProposalProvider extends AbstractFXGraphProposalProvider {
private static final Logger LOGGER = Logger.getLogger(FXGraphProposalProvider.class);
@Inject
private IJavaElementFinder javaElementFinder;
@Inject
private ITypesProposalProvider typeProposalProviders;
@Inject
private IJvmTypeProvider.Factory jdtTypeProvider;
@Inject
private IJavaProjectProvider projectProvider;
static class StaticPrefixMatcher extends PrefixMatcher {
private final PrefixMatcher original;
public StaticPrefixMatcher(PrefixMatcher original) {
this.original = original;
}
@Override
public boolean isCandidateMatchingPrefix(String name, String prefix) {
name = name.substring(name.indexOf("static")+"static".length()+1);
name = name.trim();
return original.isCandidateMatchingPrefix(name, prefix);
}
}
class FXClassFilter implements Filter {
private final IJavaProject jp;
public FXClassFilter(IJavaProject jp) {
this.jp = jp;
}
@Override
public int getSearchFor() {
return IJavaSearchConstants.TYPE;
}
@Override
public boolean accept(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) {
if (TypeMatchFilters.isInternalClass(simpleTypeName, enclosingTypeNames) || enclosingTypeNames.length > 0) {
return false;
}
String sPackname = new String(packageName);
if( sPackname.startsWith("com.sun") ) {
return false;
}
//TODO Should we resolve FX-Types through our model???
try {
IType t = jp.findType(new String(packageName)+"."+new String(simpleTypeName));
if( Flags.isAbstract(t.getFlags()) ) {
return false;
}
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
}
private int getPropertiesProposalsProposals() {
return getPriorityHelper().getDefaultPriority() + 1;
}
@Override
public void completeElement_DefaultChildren(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
try {
Element el = (Element) model;
// Happens when we are in the default section and user typed
// something
if ("void".equals(el.getType().getQualifiedName())) {
if (!(model.eContainer() instanceof Element)) {
return;
}
el = (Element) model.eContainer();
}
IJavaProject javaProject = projectProvider.getJavaProject(el.eResource().getResourceSet());
IType type = javaProject.findType(el.getType().getQualifiedName());
if (type != null) {
IFXClass fxClazz = FXPlugin.getClassmodel().findClass(javaProject, type);
if (fxClazz != null) {
IFXProperty prop = fxClazz.getDefaultProperty();
if (prop != null) {
System.err.println("The property: " + prop);
completeElement_DefaultChildrenProposals(prop, el, context, FXGraphPackage.Literals.ELEMENT__DEFAULT_CHILDREN, acceptor);
}
}
}
} catch (JavaModelException e) {
LOGGER.error("Failed to complete default children", e);
}
}
private void completeElement_DefaultChildrenProposals(IFXProperty prop, EObject model, ContentAssistContext context, EReference typeReference, ICompletionProposalAcceptor acceptor) {
if (prop instanceof IFXCollectionProperty) {
createCollectionClassProposals((IFXCollectionProperty) prop, model, context, typeReference, acceptor);
}
}
private void createCollectionClassProposals(IFXCollectionProperty prop, final EObject model, ContentAssistContext context, EReference typeReference, ICompletionProposalAcceptor acceptor) {
IType jdtSuperType = prop.getElementType();
if (jdtSuperType != null) {
JvmType superType = jdtTypeProvider.createTypeProvider(model.eResource().getResourceSet()).findTypeByName(jdtSuperType.getFullyQualifiedName());
Filter f = new FXClassFilter(projectProvider.getJavaProject(model.eResource().getResourceSet()));
typeProposalProviders.createSubTypeProposals(superType, this, context, typeReference, f, acceptor);
}
}
@Override
public void completeElement_Properties(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
try {
System.err.println("property proposal: " + model);
Element el = (Element) model;
// Happens when we are in the default section and user typed
// something
if ("void".equals(el.getType().getQualifiedName())) {
if (!(model.eContainer() instanceof Element)) {
return;
}
el = (Element) model.eContainer();
}
{
IJavaProject javaProject = projectProvider.getJavaProject(el.eResource().getResourceSet());
IType type = javaProject.findType(el.getType().getQualifiedName());
if (type != null) {
IFXClass fxClazz = FXPlugin.getClassmodel().findClass(javaProject, type);
if (fxClazz != null) {
Map<String, IFXProperty> map = fxClazz.getAllProperties();
for (IFXProperty p : map.values()) {
// The id-attribute is defined through the id keyword
if (!"id".equals(p.getName())) {
completeElement_PropertiesProposals(p, el, context, FXGraphPackage.Literals.ELEMENT__PROPERTIES, acceptor);
}
}
}
}
}
EObject o = el;
el = null;
while( o.eContainer() != null ) {
if( o.eContainer() instanceof Element ) {
el = (Element) o.eContainer();
break;
}
if( o.eContainer() instanceof MapValueProperty ) {
el = null;
break;
}
o = o.eContainer();
}
if( el instanceof Element) {
el = (Element) el;
IJavaProject javaProject = projectProvider.getJavaProject(el.eResource().getResourceSet());
IType type = javaProject.findType(el.getType().getQualifiedName());
if (type != null) {
IFXClass fxClazz = FXPlugin.getClassmodel().findClass(javaProject, type);
if (fxClazz != null) {
Map<String, IFXProperty> map = fxClazz.getAllStaticProperties();
for (IFXProperty p : map.values()) {
completeElement_PropertiesProposals(p, el, context, FXGraphPackage.Literals.ELEMENT__STATIC_PROPERTIES, acceptor);
}
}
}
}
} catch (JavaModelException e) {
LOGGER.error("Failed to complete properties", e);
}
}
private void completeElement_PropertiesProposals(IFXProperty prop, EObject model, ContentAssistContext context, EStructuralFeature typeReference, ICompletionProposalAcceptor acceptor) {
if (prop instanceof IFXCollectionProperty) {
createCollectionPropnameProposals((IFXCollectionProperty) prop, model, context, typeReference, acceptor);
} else if (prop instanceof IFXMapProperty) {
createMapPropnameProposals((IFXMapProperty) prop, model, context, typeReference, acceptor);
} else if (prop.isSetable()) {
if (prop instanceof IFXEnumProperty) {
createEnumPropnameProposals((IFXEnumProperty) prop, model, context, typeReference, acceptor);
} else if (prop instanceof IFXEventHandlerProperty) {
createEventHandlerPropnameProposals((IFXEventHandlerProperty) prop, model, context, typeReference, acceptor);
} else if (prop instanceof IFXObjectProperty) {
createObjectPropnameProposals((IFXObjectProperty) prop, model, context, typeReference, acceptor);
} else if (prop instanceof IFXPrimitiveProperty) {
createPrimitivePropnameProposals((IFXPrimitiveProperty) prop, model, context, typeReference, acceptor);
}
}
}
private void createCollectionPropnameProposals(IFXCollectionProperty prop, EObject model, ContentAssistContext context, EStructuralFeature typeReference, ICompletionProposalAcceptor acceptor) {
ICompletionProposal p;
if (prop.isSetable()) {
StyledString s = new StyledString(prop.getName() + " : " + prop.getCollectionAsString());
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
p = createCompletionProposal(prop.getName() + " : ", s, IconKeys.getIcon(IconKeys.LIST_KEY), getPropertiesProposalsProposals(), context.getPrefix(), context);
} else {
StyledString s = new StyledString(prop.getName() + " : [" + prop.getElementType().getElementName() + "]");
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
p = createCompletionProposal(prop.getName() + " : []", s, IconKeys.getIcon(IconKeys.LIST_KEY), getPropertiesProposalsProposals(), context.getPrefix(), context);
}
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
if (!prop.isSetable()) {
cp.setCursorPosition(cp.getCursorPosition() - 1);
}
}
acceptor.accept(p);
}
private void createMapPropnameProposals(IFXMapProperty prop, EObject model, ContentAssistContext context, EStructuralFeature typeReference, ICompletionProposalAcceptor acceptor) {
StyledString s = new StyledString(prop.getName() + " : {}");
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
ICompletionProposal p = createCompletionProposal(prop.getName() + " : ", s, IconKeys.getIcon(IconKeys.MAP_KEY), getPropertiesProposalsProposals(), context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
}
private void createEnumPropnameProposals(IFXEnumProperty prop, EObject model, ContentAssistContext context, EStructuralFeature typeReference, ICompletionProposalAcceptor acceptor) {
if( prop.isStatic() && typeReference.equals(FXGraphPackage.Literals.ELEMENT__STATIC_PROPERTIES) ) {
StyledString s = new StyledString();
s.append("(static) ", StyledString.COUNTER_STYLER);
s.append(prop.getFXClass().getSimpleName() + "." + prop.getName() + " : " + prop.getEnumTypeAsString(false));
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
context = context.copy().setMatcher(new StaticPrefixMatcher(context.getMatcher())).toContext();
ICompletionProposal p = createCompletionProposal("static " + prop.getName() + " : ", s, IconKeys.getIcon(IconKeys.FIELD_KEY), getPropertiesProposalsProposals()-10, context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
} else {
StyledString s = new StyledString(prop.getName() + " : " + prop.getEnumTypeAsString(false));
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
ICompletionProposal p = createCompletionProposal(prop.getName() + " : ", s, IconKeys.getIcon(IconKeys.FIELD_KEY), getPropertiesProposalsProposals(), context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
}
}
private void createEventHandlerPropnameProposals(IFXEventHandlerProperty prop, EObject model, ContentAssistContext context, EStructuralFeature typeReference, ICompletionProposalAcceptor acceptor) {
StyledString s = new StyledString(prop.getName() + " : " + prop.getEventTypeAsString(false));
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
ICompletionProposal p = createCompletionProposal(prop.getName() + " : ", s, IconKeys.getIcon(IconKeys.EVENT_KEY), getPropertiesProposalsProposals(), context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
}
private void createObjectPropnameProposals(IFXObjectProperty prop, EObject model, ContentAssistContext context, EStructuralFeature typeReference, ICompletionProposalAcceptor acceptor) {
if( prop.isStatic() && typeReference.equals(FXGraphPackage.Literals.ELEMENT__STATIC_PROPERTIES) ) {
StyledString s = new StyledString();
s.append("(static) ", StyledString.COUNTER_STYLER);
s.append(prop.getFXClass().getSimpleName() + "." + prop.getName() + " : " + prop.getElementTypeAsString(false));
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
context = context.copy().setMatcher(new StaticPrefixMatcher(context.getMatcher())).toContext();
ICompletionProposal p = createCompletionProposal("static " + prop.getName() + " : ", s, IconKeys.getIcon(IconKeys.FIELD_KEY), getPropertiesProposalsProposals()-10, context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
} else {
StyledString s = new StyledString(prop.getName() + " : " + prop.getElementTypeAsString(false));
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
ICompletionProposal p = createCompletionProposal(prop.getName() + " : ", s, IconKeys.getIcon(IconKeys.FIELD_KEY), getPropertiesProposalsProposals(), context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
}
}
private void createPrimitivePropnameProposals(IFXPrimitiveProperty prop, EObject model, ContentAssistContext context, EStructuralFeature typeReference, ICompletionProposalAcceptor acceptor) {
String typeName;
String proposalValue = prop.getName() + " : ";
switch (prop.getType()) {
case BOOLEAN:
typeName = "boolean";
break;
case BYTE:
typeName = "byte";
break;
case CHAR:
typeName = "char";
break;
case DOUBLE:
typeName = "double";
break;
case FLOAT:
typeName = "float";
break;
case INTEGER:
typeName = "integer";
break;
case LONG:
typeName = "long";
break;
case SHORT:
typeName = "short";
break;
default:
typeName = "String";
proposalValue += "\"\"";
break;
}
if( prop.isStatic() && typeReference.equals(FXGraphPackage.Literals.ELEMENT__STATIC_PROPERTIES) ) {
StyledString s = new StyledString();
s.append("(static) ", StyledString.COUNTER_STYLER);
s.append(prop.getFXClass().getSimpleName() + "." + prop.getName() + " : " + typeName);
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
proposalValue = "static " + proposalValue;
context = context.copy().setMatcher(new StaticPrefixMatcher(context.getMatcher())).toContext();
ICompletionProposal p = createCompletionProposal(proposalValue, s, IconKeys.getIcon(IconKeys.FIELD_KEY), getPropertiesProposalsProposals()-10, context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
} else {
StyledString s = new StyledString(prop.getName() + " : " + typeName);
s.append(" - " + prop.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
ICompletionProposal p = createCompletionProposal(proposalValue, s, IconKeys.getIcon(IconKeys.FIELD_KEY), getPropertiesProposalsProposals(), context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
if (prop.getType() == Type.STRING) {
cp.setCursorPosition(cp.getCursorPosition() - 1);
}
}
acceptor.accept(p);
}
}
@Override
public void completeProperty_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
Property prop;
if( model instanceof Property ) {
prop = (Property) model;
} else if( model instanceof Element ) {
prop = (Property) model.eContainer();
} else {
// Unknown structure
//TODO Needs logging
System.err.println("This is an unknown structure");
return;
}
if (prop.eContainer() instanceof Element) {
Element el = (Element) prop.eContainer();
try {
IJavaProject javaProject = projectProvider.getJavaProject(el.eResource().getResourceSet());
IType type = javaProject.findType(el.getType().getQualifiedName());
if (type != null) {
IFXClass fxClazz = FXPlugin.getClassmodel().findClass(javaProject, type);
IFXProperty fxProp = fxClazz.getProperty(prop.getName());
if (fxProp != null) {
completeProperty_ValueProposals(fxProp, model, context, FXGraphPackage.Literals.PROPERTY__VALUE, acceptor);
}
}
} catch (JavaModelException e) {
LOGGER.error("Failed to retrieve property value proposals", e);
}
} else if (prop.eContainer() instanceof MapValueProperty) {
// TODO Can we provide a proposal here?
}
}
private void completeProperty_ValueProposals(IFXProperty prop, EObject model, ContentAssistContext context, EReference typeReference, ICompletionProposalAcceptor acceptor) {
if (prop instanceof IFXPrimitiveProperty) {
createPrimitivePropvalueProposals((IFXPrimitiveProperty) prop, model, context, typeReference, acceptor);
} else if (prop instanceof IFXEnumProperty) {
createEnumPropvalueProposals((IFXEnumProperty) prop, model, context, typeReference, acceptor);
} else if (prop instanceof IFXCollectionProperty) {
} else if (prop instanceof IFXEventHandlerProperty) {
} else if (prop instanceof IFXMapProperty) {
} else if (prop instanceof IFXObjectProperty) {
createObjectPropvalueProposals((IFXObjectProperty) prop, model, context, typeReference, acceptor);
}
}
private void createPrimitivePropvalueProposals(IFXPrimitiveProperty prop, EObject model, ContentAssistContext context, EReference typeReference, ICompletionProposalAcceptor acceptor) {
switch (prop.getType()) {
case BOOLEAN: {
ICompletionProposal p = createCompletionProposal("true", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
p = createCompletionProposal("false", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
break;
}
case BYTE:
case CHAR:
case INTEGER:
case LONG:
case SHORT: {
ICompletionProposal p = createCompletionProposal("1", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
break;
}
case DOUBLE:
case FLOAT: {
ICompletionProposal p = createCompletionProposal("1.0", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
break;
}
case STRING: {
ICompletionProposal p = createCompletionProposal("\"<String>\"", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
break;
}
default:
break;
}
}
private void createEnumPropvalueProposals(IFXEnumProperty prop, EObject model, ContentAssistContext context, EReference typeReference, ICompletionProposalAcceptor acceptor) {
IType t = prop.getEnumType();
if (t != null) {
try {
for (IField f : t.getFields()) {
if (Flags.isEnum(f.getFlags())) {
ICompletionProposal p = createCompletionProposal("\"" + f.getElementName() + "\"", new StyledString(f.getElementName()).append(" - " + prop.getEnumTypeAsString(false), StyledString.QUALIFIER_STYLER), IconKeys.getIcon(IconKeys.ENUM_KEY), getPriorityHelper()
.getDefaultPriority(), "\"" + context.getPrefix(), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(f));
}
acceptor.accept(p);
}
}
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static boolean isIntegerType(String fqnType) {
if( "java.lang.Integer".equals(fqnType) ) {
return true;
} else if( "java.lang.Long".equals(fqnType) ) {
return true;
} else if( "java.lang.Short".equals(fqnType) ) {
return true;
} else if( "java.lang.Byte".equals(fqnType) ) {
return true;
}
return false;
}
private static boolean isDoubleType(String fqnType) {
if( "java.lang.Float".equals(fqnType) ) {
return true;
} else if( "java.lang.Double".equals(fqnType) ) {
return true;
}
return false;
}
private void createObjectPropvalueProposals(IFXObjectProperty prop, final EObject model, ContentAssistContext context, EReference typeReference, ICompletionProposalAcceptor acceptor) {
String type = prop.getElementTypeAsString(true);
if( "java.lang.Boolean".equals(type) ) {
ICompletionProposal p = createCompletionProposal("true", context);
if( p instanceof ConfigurableCompletionProposal ) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getValueOfMethod()));
}
acceptor.accept(p);
p = createCompletionProposal("false", context);
if( p instanceof ConfigurableCompletionProposal ) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getValueOfMethod()));
}
acceptor.accept(p);
} else if(isIntegerType(type)) {
ICompletionProposal p = createCompletionProposal("1", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
} else if(isDoubleType(type)) {
ICompletionProposal p = createCompletionProposal("1.0", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getJavaElement()));
}
acceptor.accept(p);
} else {
if (prop.hasValueOf()) {
ICompletionProposal p = createCompletionProposal("\"\"", new StyledString("\"<String>\""), null, getPriorityHelper().getDefaultPriority() + 1, context.getPrefix(), context);
if( p instanceof ConfigurableCompletionProposal ) {
ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) p;
cp.setAdditionalProposalInfo(model);
cp.setHover(new HoverImpl(prop.getValueOfMethod()));
}
acceptor.accept(p);
}
IType jdtSuperType = prop.getElementType();
if (jdtSuperType != null) {
final IJvmTypeProvider tProvider = jdtTypeProvider.createTypeProvider(model.eResource().getResourceSet());
JvmType superType = tProvider.findTypeByName(jdtSuperType.getFullyQualifiedName());
Filter f = new FXClassFilter(projectProvider.getJavaProject(model.eResource().getResourceSet()));
typeProposalProviders.createSubTypeProposals(superType, this, context, typeReference, f, acceptor);
}
}
}
public void completeJvmParameterizedTypeReference_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
// Do not generate type proposals which are in correct, we handle the
// types our own
}
@Override
public void completeResourceValueProperty_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
if( ! model.eResource().getContents().isEmpty() ) {
Model m = (Model) model.eResource().getContents().get(0);
if( m.getComponentDef() != null ) {
if( m.getComponentDef().getPreviewResourceBundle() != null ) {
File f = RelativeFileLocator.locateFile(model.eResource().getURI(), m.getComponentDef().getPreviewResourceBundle());
Properties p = null;
if (f != null) {
FileInputStream fi = null;
try {
fi = new FileInputStream(f);
p = new Properties();
p.load(fi);
} catch (FileNotFoundException e) {
LOGGER.warn("Unable to load resource bundle", e);
} catch (IOException e) {
LOGGER.warn("Unable to load resource bundle", e);
} finally {
if (fi != null) {
try {
fi.close();
} catch (IOException e) {
LOGGER.error("Unable to close resource filehandle", e);
}
}
}
}
if( p != null ) {
for (String k : p.stringPropertyNames()) {
StyledString s = new StyledString(k);
s.append(" - " + p.getProperty(k), StyledString.DECORATIONS_STYLER);
acceptor.accept(createCompletionProposal("\"" + k + "\"", s, IconKeys.getIcon(IconKeys.EXTERNALIZED_STRING_KEY), context));
}
}
}
}
}
}
@Override
public void completeBindValueProperty_ElementReference(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
TreeIterator<EObject> it = model.eResource().getAllContents();
while (it.hasNext()) {
EObject o = it.next();
if (o instanceof Element) {
Element e = (Element) o;
if (e.getName() != null && e.getName().trim().length() > 0) {
StyledString s = new StyledString(e.getName());
s.append(" - " + e.getType().getQualifiedName(), StyledString.DECORATIONS_STYLER);
acceptor.accept(createCompletionProposal(e.getName(), s, IconKeys.getIcon(IconKeys.CLASS_KEY), context));
}
}
}
}
@Override
public void completeBindValueProperty_Attribute(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
BindValueProperty b = (BindValueProperty) model;
if (b.getElementReference() != null && b.getElementReference().getType() != null) {
Property property = (Property) b.eContainer();
Element targetClass = (Element) property.eContainer();
Element element = b.getElementReference();
try {
IJavaProject javaProject = projectProvider.getJavaProject(element.eResource().getResourceSet());
IType sourceType = javaProject.findType(element.getType().getQualifiedName());
IType targetType = javaProject.findType(targetClass.getType().getQualifiedName());
IFXClass fxSourceClazz = FXPlugin.getClassmodel().findClass(javaProject, sourceType);
IFXClass fxTargetClass = FXPlugin.getClassmodel().findClass(javaProject, targetType);
IFXProperty targetProperty = fxTargetClass.getProperty(property.getName());
if( targetProperty instanceof IFXPrimitiveProperty ) {
IFXPrimitiveProperty pp = (IFXPrimitiveProperty) targetProperty;
for( IFXProperty sourceProp: fxSourceClazz.getAllProperties().values() ) {
if( sourceProp instanceof IFXEventHandlerProperty ) {
continue;
}
boolean select = false;
if( pp.getType() == Type.STRING ) {
select = true;
} else {
if( sourceProp instanceof IFXPrimitiveProperty ) {
IFXPrimitiveProperty sp = (IFXPrimitiveProperty) sourceProp;
if( pp.getType() == Type.BOOLEAN ) {
select = sp.getType() == Type.BOOLEAN;
} else if( sp.getType() != Type.STRING && sp.getType() != Type.BOOLEAN ) {
select = true;
}
}
}
if( select ) {
String typeName = "";
if( sourceProp instanceof IFXPrimitiveProperty ) {
IFXPrimitiveProperty sp = (IFXPrimitiveProperty) sourceProp;
if( sp.getType() == Type.STRING ) {
typeName = "String";
} else {
typeName = sp.getType().jvmType();
}
} else if (sourceProp instanceof IFXCollectionProperty ) {
typeName = ((IFXCollectionProperty)sourceProp).getCollectionAsString();
} else if( sourceProp instanceof IFXEnumProperty ) {
typeName = ((IFXEnumProperty)sourceProp).getEnumTypeAsString(false);
} else if( sourceProp instanceof IFXMapProperty ) {
typeName = "{}";
} else if( sourceProp instanceof IFXObjectProperty ) {
typeName = ((IFXObjectProperty)sourceProp).getElementTypeAsString(false);
}
StyledString s = new StyledString(sourceProp.getName() + " : " + typeName);
s.append(" - " + sourceProp.getFXClass().getSimpleName(), StyledString.QUALIFIER_STYLER);
ICompletionProposal cp = createCompletionProposal(sourceProp.getName(), s, IconKeys.getIcon(IconKeys.FIELD_KEY), getPropertiesProposalsProposals(), context.getPrefix(), context);
acceptor.accept(cp);
}
}
}
} catch (JavaModelException e1) {
LOGGER.error("Unable to extract java informations", e1);
}
}
}
@Override
public void completeElement_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
// System.err.println("Complete type");
// // TODO Auto-generated method stub
// super.completeElement_Type(model, assignment, context, acceptor);
// Element e = (Element) model;
// if( e.eContainer() instanceof ListValueProperty ) {
// System.err.println("Completing List Type");
// }
}
@Override
public void completeListValueProperty_Value(EObject m, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
ListValueProperty listProp = null;
if( m instanceof ListValueProperty ) {
listProp = (ListValueProperty) m;
} else if( m instanceof Element && m.eContainer() instanceof ListValueProperty ) {
// If at least one char is already typed
listProp = (ListValueProperty) m.eContainer();
}
if( listProp != null ) {
if( listProp.eContainer() instanceof Property ) {
Property property = (Property) listProp.eContainer();
if( property.eContainer() instanceof Element ) {
try {
Element element = (Element) property.eContainer();
IJavaProject javaProject = projectProvider.getJavaProject(element.eResource().getResourceSet());
IType ownerType = javaProject.findType(element.getType().getQualifiedName());
IFXClass fxOwnerClazz = FXPlugin.getClassmodel().findClass(javaProject, ownerType);
IFXProperty ownerProperty = fxOwnerClazz.getProperty(property.getName());
if (ownerProperty instanceof IFXCollectionProperty) {
IFXCollectionProperty cp = (IFXCollectionProperty) ownerProperty;
String type = cp.getElementType().getElementName();
if( "String".equals(type) ) {
ICompletionProposal p = createCompletionProposal("\"\"", new StyledString("\"<String>\""), IconKeys.getIcon(IconKeys.CLASS_KEY), context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal ccp = (ConfigurableCompletionProposal) p;
ccp.setAdditionalProposalInfo(listProp);
ccp.setHover(new HoverImpl(ownerProperty.getJavaElement()));
ccp.setCursorPosition(ccp.getCursorPosition() - 1);
}
acceptor.accept(p);
} else if( "Double".equals(type) ) {
ICompletionProposal p = createCompletionProposal("1.0", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal ccp = (ConfigurableCompletionProposal) p;
ccp.setAdditionalProposalInfo(listProp);
ccp.setHover(new HoverImpl(ownerProperty.getJavaElement()));
}
acceptor.accept(p);
} else if( "Integer".equals(type) ) {
ICompletionProposal p = createCompletionProposal("1", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal ccp = (ConfigurableCompletionProposal) p;
ccp.setAdditionalProposalInfo(listProp);
ccp.setHover(new HoverImpl(ownerProperty.getJavaElement()));
}
acceptor.accept(p);
} else if( "Boolean".equals(type) ) {
ICompletionProposal p = createCompletionProposal("true", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal ccp = (ConfigurableCompletionProposal) p;
ccp.setAdditionalProposalInfo(listProp);
ccp.setHover(new HoverImpl(ownerProperty.getJavaElement()));
}
acceptor.accept(p);
p = createCompletionProposal("false", context);
if (p instanceof ConfigurableCompletionProposal) {
ConfigurableCompletionProposal ccp = (ConfigurableCompletionProposal) p;
ccp.setAdditionalProposalInfo(listProp);
ccp.setHover(new HoverImpl(ownerProperty.getJavaElement()));
}
acceptor.accept(p);
} else {
createCollectionClassProposals(cp, listProp, context, FXGraphPackage.Literals.LIST_VALUE_PROPERTY__VALUE, acceptor);
}
}
} catch (JavaModelException e) {
LOGGER.error("Unable to autocomplete list value", e);
}
}
}
}
}
@Override
public void completeControllerHandledValueProperty_Methodname(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
if( ! model.eResource().getContents().isEmpty() ) {
Model m = (Model) model.eResource().getContents().get(0);
if( m.getComponentDef() != null ) {
if( m.getComponentDef().getController() != null ) {
if( model.eContainer() instanceof Property ) {
Property property = (Property) model.eContainer();
if( property.eContainer() instanceof Element ) {
try {
Element element = (Element) property.eContainer();
IJavaProject javaProject = projectProvider.getJavaProject(element.eResource().getResourceSet());
IType ownerType = javaProject.findType(element.getType().getQualifiedName());
IFXClass fxOwnerClazz = FXPlugin.getClassmodel().findClass(javaProject, ownerType);
IFXProperty ownerProperty = fxOwnerClazz.getProperty(property.getName());
if( ownerProperty instanceof IFXEventHandlerProperty ) {
IFXEventHandlerProperty p = (IFXEventHandlerProperty) ownerProperty;
IType ctrlType = javaProject.findType(m.getComponentDef().getController().getQualifiedName());
IFXCtrlClass ctrlClass = FXPlugin.getClassmodel().findCtrlClass(javaProject, ctrlType);
for( IFXCtrlEventMethod ctrlMethod : ctrlClass.getAllEventMethods().values() ) {
StyledString s = null;
if( ! ctrlMethod.hasArgument() ) {
s = new StyledString(ctrlMethod.getName()+"()");
} else {
if( Util.assignable(p.getEventType(), ctrlMethod.getArgumentType()) ) {
s = new StyledString(ctrlMethod.getName() + "("+p.getEventTypeAsString(false)+")");
}
}
if( s != null ) {
s.append(" - " + ctrlClass.getSimpleName(), StyledString.QUALIFIER_STYLER);
Image img = null;
switch (ctrlMethod.getVisibility()) {
case PUBLIC:
img = IconKeys.getIcon(IconKeys.METHOD_PUBLIC_KEY);
break;
case PACKAGE:
img = IconKeys.getIcon(IconKeys.METHOD_DEFAULT_KEY);
break;
case PROTECTED:
img = IconKeys.getIcon(IconKeys.METHOD_PROTECTED_KEY);
break;
default:
img = IconKeys.getIcon(IconKeys.METHOD_PRIVATE_KEY);
break;
}
ICompletionProposal cp = createCompletionProposal(ctrlMethod.getName(), s, img, context);
acceptor.accept(cp);
}
}
}
} catch(JavaModelException e) {
LOGGER.error("Unable to autocomplete list value", e);
}
}
}
}
}
}
}
@Override
public void completeDefine_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
typeProposalProviders.createTypeProposals(this, context, FXGraphPackage.Literals.DEFINE__ELEMENT, acceptor);
}
@Override
public void completeReferenceValueProperty_Reference(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
if( ! model.eResource().getContents().isEmpty() ) {
Model m = (Model) model.eResource().getContents().get(0);
if( m.getComponentDef() != null) {
for( Define d : m.getComponentDef().getDefines() ) {
Element element = d.getElement();
boolean includeType = false;
if( element == null ) {
element = d.getIncludeElement().getSource().getRootNode();
includeType = true;
}
IJavaProject javaProject = projectProvider.getJavaProject(element.eResource().getResourceSet());
try {
IType defType = javaProject.findType(element.getType().getQualifiedName());
ReferenceValueProperty rp = (ReferenceValueProperty) model;
IType targetType = null;
if( rp.eContainer() instanceof Property ) {
Property p = (Property) rp.eContainer();
if( p.eContainer() instanceof Element ) {
Element e = (Element) p.eContainer();
IType ownerType = javaProject.findType(e.getType().getQualifiedName());
IFXClass ownerClass = FXPlugin.getClassmodel().findClass(javaProject, ownerType);
IFXProperty ownerProp = ownerClass.getProperty(p.getName());
if( ownerProp instanceof IFXObjectProperty ) {
targetType = ((IFXObjectProperty) ownerProp).getElementType();
}
}
} else if( rp.eContainer() instanceof StaticCallValueProperty ) {
LOGGER.warn("Unable to extract type for " + rp.eContainer());
} else if( rp.eContainer() instanceof ListValueProperty ) {
ListValueProperty lvp = (ListValueProperty) rp.eContainer();
if( lvp.eContainer() instanceof Property ) {
Property p = (Property) lvp.eContainer();
if( p.eContainer() instanceof Element ) {
Element e = (Element) p.eContainer();
IType ownerType = javaProject.findType(e.getType().getQualifiedName());
IFXClass ownerClass = FXPlugin.getClassmodel().findClass(javaProject, ownerType);
IFXProperty ownerProp = ownerClass.getProperty(p.getName());
if( ownerProp instanceof IFXCollectionProperty ) {
targetType = ((IFXCollectionProperty) ownerProp).getElementType();
}
}
} else {
LOGGER.warn("Unable to extract type for " + rp.eContainer());
}
}
if( targetType != null ) {
if( Util.assignable(defType, targetType) ) {
StyledString s = new StyledString(includeType ? d.getIncludeElement().getName() : element.getName());
s.append(" - " + defType.getElementName(), StyledString.QUALIFIER_STYLER);
acceptor.accept(createCompletionProposal(includeType ? d.getIncludeElement().getName() : element.getName(), s, IconKeys.getIcon(IconKeys.CLASS_KEY), context));
}
}
} catch (JavaModelException e) {
LOGGER.error("Unable to extract define type", e);
}
}
}
}
}
@Override
public void completeLocationValueProperty_Value(EObject model, Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
IJavaProject javaProject = projectProvider.getJavaProject(model.eResource().getResourceSet());
try {
for( IPackageFragmentRoot r : javaProject.getPackageFragmentRoots() ) {
if( r.getCorrespondingResource() != null ) {
final int count = r.getCorrespondingResource().getProjectRelativePath().segmentCount();
r.getCorrespondingResource().accept(new IResourceVisitor() {
@Override
public boolean visit(IResource resource) throws CoreException {
if (resource.getType() == IResource.FOLDER || resource.getType() == IResource.PROJECT) {
return true;
} else if (resource.getType() == IResource.FILE && !resource.isLinked()) {
String extension = resource.getProjectRelativePath().getFileExtension();
if( extension.equals("png") || extension.equals("jpg") || extension.equals("gif") ) {
IPath p = resource.getProjectRelativePath().removeFirstSegments(count);
String prefix = "\"/" + (p.segmentCount() > 1 ? p.removeLastSegments(1).toString() : p.toString()) + "/" + context.getPrefix();
ICompletionProposal proposal = createCompletionProposal("\"/" + p.toString() +"\"", new StyledString("/" + p.toString()), null, getPriorityHelper().getDefaultPriority(), prefix, context);
acceptor.accept(proposal);
}
}
return false;
}
});
}
}
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void completeStaticCallValueProperty_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
//TODO Should we should all classes?
JvmType superType = jdtTypeProvider.createTypeProvider(model.eResource().getResourceSet()).findTypeByName("javafx.scene.Parent");
Filter f = new FXClassFilter(projectProvider.getJavaProject(model.eResource().getResourceSet()));
typeProposalProviders.createSubTypeProposals(superType, this, context, FXGraphPackage.Literals.STATIC_CALL_VALUE_PROPERTY__TYPE, f, acceptor);
}
@Override
public void completeStaticCallValueProperty_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
StaticCallValueProperty staticProperty = (StaticCallValueProperty) model;
try {
IJavaProject javaProject = projectProvider.getJavaProject(staticProperty.eResource().getResourceSet());
IType type = javaProject.findType(staticProperty.getType().getQualifiedName());
if (type != null) {
IFXClass fxClazz = FXPlugin.getClassmodel().findClass(javaProject, type);
if (fxClazz != null) {
Map<String, IFXProperty> map = fxClazz.getAllStaticProperties();
for (IFXProperty p : map.values()) {
completeElement_PropertiesProposals(p, model, context, FXGraphPackage.Literals.STATIC_CALL_VALUE_PROPERTY__NAME, acceptor);
}
}
}
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void completeStaticCallValueProperty_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
StaticCallValueProperty staticProperty = null;
if( model instanceof Element ) {
staticProperty = (StaticCallValueProperty) model.eContainer();
} else {
staticProperty = (StaticCallValueProperty) model;
}
try {
IJavaProject javaProject = projectProvider.getJavaProject(staticProperty.eResource().getResourceSet());
IType type = javaProject.findType(staticProperty.getType().getQualifiedName());
if (type != null) {
IFXClass fxClazz = FXPlugin.getClassmodel().findClass(javaProject, type);
if (fxClazz != null) {
IFXProperty fxProp = fxClazz.getStaticProperty(staticProperty.getName());
if (fxProp != null) {
completeProperty_ValueProposals(fxProp, model, context, FXGraphPackage.Literals.STATIC_CALL_VALUE_PROPERTY__VALUE, acceptor);
}
}
}
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void completeStaticValueProperty_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
EObject eo;
if( model instanceof StaticValueProperty ) {
eo = model.eContainer();
} else {
eo = model;
}
Element target = null;
while( eo.eContainer() != null ) {
if( eo.eContainer() instanceof Element ) {
target = (Element) eo.eContainer();
break;
}
eo = eo.eContainer();
}
if( target == null ) {
return;
}
try {
IJavaProject javaProject = projectProvider.getJavaProject(model.eResource().getResourceSet());
IType type = javaProject.findType(target.getType().getQualifiedName());
if (type != null) {
IFXClass fxClazz = FXPlugin.getClassmodel().findClass(javaProject, type);
if (fxClazz != null) {
Map<String, IFXProperty> map = fxClazz.getAllStaticProperties();
for (IFXProperty p : map.values()) {
completeElement_PropertiesProposals(p, model, context, FXGraphPackage.Literals.STATIC_VALUE_PROPERTY__NAME, acceptor);
}
}
}
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void completeStaticValueProperty_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
StaticValueProperty staticProperty = null;
if( model instanceof Element ) {
staticProperty = (StaticValueProperty) model.eContainer();
} else {
staticProperty = (StaticValueProperty) model;
}
EObject eo = staticProperty.eContainer();
Element target = null;
while( eo.eContainer() != null ) {
if( eo.eContainer() instanceof Element ) {
target = (Element) eo.eContainer();
break;
}
eo = eo.eContainer();
}
if( target == null ) {
return;
}
try {
IJavaProject javaProject = projectProvider.getJavaProject(staticProperty.eResource().getResourceSet());
IType type = javaProject.findType(target.getType().getQualifiedName());
if (type != null) {
IFXClass fxClazz = FXPlugin.getClassmodel().findClass(javaProject, type);
if (fxClazz != null) {
IFXProperty fxProp = fxClazz.getStaticProperty(staticProperty.getName());
System.err.println(fxProp);
if (fxProp != null) {
completeProperty_ValueProposals(fxProp, model, context, FXGraphPackage.Literals.STATIC_VALUE_PROPERTY__VALUE, acceptor);
}
}
}
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void completeComponentDefinition_RootNode(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
JvmType superType = jdtTypeProvider.createTypeProvider(model.eResource().getResourceSet()).findTypeByName("javafx.scene.Parent");
typeProposalProviders.createSubTypeProposals(superType, this, context, FXGraphPackage.Literals.COMPONENT_DEFINITION__ROOT_NODE, acceptor);
}
@Override
public void completeComponentDefinition_Controller(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
typeProposalProviders.createTypeProposals(this, context, FXGraphPackage.Literals.COMPONENT_DEFINITION__CONTROLLER, acceptor);
}
public static class HoverImpl implements IEObjectHover, ITextHoverExtension {
private JavadocHoverWrapper javadocHover = new JavadocHoverWrapper();
private IJavaElement javaElement;
public HoverImpl(IJavaElement javaElement) {
this.javaElement = javaElement;
}
@Override
public Object getHoverInfo(EObject eObject, ITextViewer textViewer, IRegion hoverRegion) {
javadocHover.setJavaElement(javaElement);
return javadocHover.getHoverInfo2(textViewer, hoverRegion);
}
@Override
public IInformationControlCreator getHoverControlCreator() {
return javadocHover.getHoverControlCreator();
}
}
}