blob: 9ae3af2040d1f84540526e0d5e0e6d2cacba57d3 [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.ecview.dsl.scope;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlot;
import org.eclipse.osbp.ecview.dsl.extensions.BindableTypeProvider;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
import org.eclipse.osbp.ecview.semantic.uimodel.UiNestedProperty;
import org.eclipse.osbp.ecview.semantic.uimodel.UiPathSegment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindable;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTable;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef;
import org.eclipse.osbp.ecview.semantic.uimodel.UiView;
import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProperty;
import org.eclipse.osbp.ecview.semantic.uimodel.impl.UiPathSegmentImpl;
import org.eclipse.osbp.ecview.semantic.uisemantics.UxEndpointDef;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.JvmUnknownTypeReference;
import org.eclipse.xtext.common.types.util.TypeReferences;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.xbase.scoping.batch.XbaseBatchScopeProvider;
import com.google.inject.Inject;
@SuppressWarnings("restriction")
public class ScopeProvider extends XbaseBatchScopeProvider {
@Inject
private TypeReferences types;
@Inject
private BindableTypeProvider typeProvider;
@Inject
private ResourceDescriptionsProvider provider;
@Inject
private IQualifiedNameProvider nameProvider;
@Inject
private IQualifiedNameConverter nameConverter;
@Override
public IScope getScope(EObject context, EReference reference) {
if (reference == UiModelPackage.Literals.UI_TYPED_BINDABLE_DEF__METHOD) {
if (context.eContainer() instanceof UiVisibilityProperty) {
return new BindingEndpointDefVisibilityMethodScope(
provider.getResourceDescriptions(context.eResource()),
(UiTypedBindableDef) context);
} else {
return new BindingEndpointDefBindMethodScope(
provider.getResourceDescriptions(context.eResource()),
(UiTypedBindableDef) context);
}
} else if (reference == UiModelPackage.Literals.UI_EXPOSED_ACTION__ACTION_REFERENCE) {
return new ViewActionReferenceScope(
provider.getResourceDescriptions(context.eResource()),
context, nameConverter);
} else if (reference == UiModelPackage.Literals.UI_TYPED_BINDABLE_DEF__RAW_BINDABLE) {
return new BindingEndpointDefRawBindableScope(context, nameProvider);
} else if (reference == UiModelPackage.Literals.UI_NESTED_PROPERTY__GETTER) {
if (context instanceof UiNestedProperty) {
return createJvmOperationScope((UiNestedProperty) context);
} else {
return createJvmOperationScope(context);
}
} else if (reference == UiModelPackage.Literals.UI_RAW_BINDABLE_PATH_SEGMENT__RAW_BINDABLE) {
return new RawBindablePathRawBindableScope(context, nameProvider);
} else if (reference == UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE__RAW_BINDABLE) {
return new TypedBindableRawTypeScope(context);
} else if (reference == UiModelPackage.Literals.UI_BINDING_ENDPOINT_ASSIGNMENT__PATH) {
return createBindingEndpointDefPathScope(context);
} else if (reference == UiModelPackage.Literals.UI_PATH_SEGMENT__GETTER) {
return createPathSegmentJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_COLUMN__PROPERTY) {
if (context instanceof UiNestedProperty) {
return createJvmOperationScope((UiNestedProperty) context);
} else {
return createJvmOperationScope(context);
}
} else if (reference == UiModelPackage.Literals.UI_COMBO_BOX__ITEM_CAPTION_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_COMBO_BOX__ITEM_IMAGE_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_SUGGEST_TEXT_FIELD__ITEM_CAPTION_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_SUGGEST_TEXT_FIELD__ITEM_FILTER_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_SUGGEST_TEXT_FIELD__ITEM_UUID_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_TABLE__ITEM_IMAGE_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_LIST__ITEM_IMAGE_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_SEARCH_FIELD__PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_OPTIONS_GROUP__ITEM_CAPTION_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_OPTIONS_GROUP__ITEM_IMAGE_PROPERTY) {
return createJvmOperationScope(context);
} else if (reference == UiModelPackage.Literals.UI_BEAN_REFERENCE_FIELD__REFERENCE_SOURCE_FIELD) {
UiBeanReferenceField field = (UiBeanReferenceField) context;
return createJvmFieldScope(field.getReferenceSourceJvmType());
} else if (reference == UiModelPackage.Literals.UI_BINDING_ENDPOINT_ASSIGNMENT__TYPED_BINDABLE_ALIAS) {
return new TypedBindableScope(context);
}
return super.getScope(getView(context), reference);
}
private UiView getView(EObject eObject) {
if (eObject == null) {
return null;
}
if (eObject instanceof UiView) {
return (UiView) eObject;
}
return getView(eObject.eContainer());
}
/**
* Creates a scope that returns the jvm fields available for the current
* state.
*
* @param context
* @return
*/
private IScope createPathSegmentJvmOperationScope(EObject context) {
UiPathSegmentImpl segment = (UiPathSegmentImpl) context;
if (segment.eContainer() instanceof UiBindingEndpointAssignment) {
UiBindingEndpointAssignment parent = (UiBindingEndpointAssignment) segment
.eContainer();
JvmTypeReference expectedType = typeProvider
.getTypeReference(parent);
if (expectedType == null) {
return IScope.NULLSCOPE;
} else {
return new BindingPathScope(expectedType.getType());
}
// }
} else if (segment.eContainer() instanceof UiNestedProperty) {
UiNestedProperty parent = (UiNestedProperty) segment.eContainer();
JvmTypeReference expectedType = typeProvider
.getTypeReference(parent);
if (expectedType == null) {
return IScope.NULLSCOPE;
} else {
return new BindingPathScope(expectedType.getType());
}
// }
} else {
UiPathSegment parent = (UiPathSegment) segment.eContainer();
if (parent.getGetter().getReturnType() == null) {
return IScope.NULLSCOPE;
}
return new BindingPathScope(parent.getGetter().getReturnType()
.getType());
}
}
/**
* Creates a scope that returns the jvm operation available for the current
* state.
*
* @param context
* @return
*/
@SuppressWarnings("unused")
private IScope createUiColumnJvmOperationScope(EObject context) {
UiTable table = (UiTable) context.eContainer().eContainer();
JvmTypeReference expectedType = typeProvider.getTypeReference(table,
true);
if (expectedType == null) {
return IScope.NULLSCOPE;
} else {
return new BindingPathScope(expectedType.getType());
}
}
/**
* Creates a scope that returns the jvm operation available for the current
* state.
*
* @param context
* @return
*/
private IScope createJvmOperationScope(EObject context) {
JvmTypeReference expectedType = findExpectedType(context);
if (expectedType == null
|| expectedType instanceof JvmUnknownTypeReference) {
return IScope.NULLSCOPE;
} else {
return new BindingPathScope(expectedType.getType());
}
}
/**
* Creates a scope that returns the jvm operation available for the current
* state.
*
* @param context
* @return
*/
private IScope createJvmOperationScope(UiNestedProperty context) {
JvmTypeReference expectedType = findExpectedType(context.eContainer());
if (expectedType == null
|| expectedType instanceof JvmUnknownTypeReference) {
return IScope.NULLSCOPE;
} else {
return new BindingPathScope(expectedType.getType());
}
}
/**
* Creates a scope that returns the jvm fields available for the current
* state.
*
* @param context
* @return
*/
private IScope createJvmFieldScope(JvmTypeReference expectedType) {
if (expectedType == null
|| expectedType instanceof JvmUnknownTypeReference) {
return IScope.NULLSCOPE;
} else {
return new JvmFieldScope(expectedType.getType());
}
}
protected JvmTypeReference findExpectedType(EObject context) {
JvmTypeReference expectedType = typeProvider.getTypeReference(context,
true);
return expectedType;
}
/**
* Creates a scope returning the available jvm fields for the current state.
*
* @param context
* @return
*/
private IScope createBindingEndpointDefPathScope(EObject context) {
UiBindingEndpointAssignment parent = (UiBindingEndpointAssignment) context;
UiTypedBindableDef typedBindableDef = (UiTypedBindableDef) parent
.getTypedBindableDef();
UxEndpointDef uxEndpointDef = (UxEndpointDef) typedBindableDef
.getMethod();
UiRawBindable bindable = typedBindableDef.getRawBindablePath()
.getRawBindableOfLastSegment();
JvmTypeReference expectedType = uxEndpointDef.getJvmType();
if (expectedType.getQualifiedName().equals(Void.class.getName())) {
if (bindable instanceof YBeanSlot) {
YBeanSlot slot = (YBeanSlot) bindable;
return new BindingPathScope(types.findDeclaredType(
slot.getValueType(), context));
}
} else {
return new BindingPathScope(expectedType.getType());
}
return IScope.NULLSCOPE;
}
}