| /** |
| * |
| * Copyright (c) 2011, 2016 - 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: |
| * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation |
| * |
| * |
| * This copyright notice shows up in the generated Java code |
| * |
| */ |
| |
| package org.eclipse.osbp.xtext.strategy.jvmmodel |
| |
| import org.eclipse.osbp.ecview.^extension.api.ILayoutingStrategy |
| import org.eclipse.osbp.ecview.^extension.api.ILayoutingStrategyProvider |
| import org.eclipse.osbp.ecview.^extension.model.YLayoutingInfo |
| import org.eclipse.osbp.ecview.^extension.strategy.AbstractLayoutingStrategy |
| import org.eclipse.osbp.utils.annotation.CommonUtils |
| import org.eclipse.osbp.utils.constants.GeneratorConstants |
| import org.eclipse.osbp.xtext.strategy.LayoutingEnum |
| import org.eclipse.osbp.xtext.strategy.LayoutingStrategy |
| import org.eclipse.osbp.xtext.strategy.StrategyPackage |
| import org.eclipse.osbp.xtext.strategy.constants.StrategyConstants |
| import java.util.List |
| import javax.inject.Inject |
| import org.eclipse.xtext.common.types.JvmDeclaredType |
| import org.eclipse.xtext.common.types.JvmField |
| import org.eclipse.xtext.common.types.JvmGenericType |
| import org.eclipse.xtext.common.types.JvmVisibility |
| import org.eclipse.xtext.common.types.util.TypeReferences |
| import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor |
| import org.eclipse.xtext.xbase.jvmmodel.JvmAnnotationReferenceBuilder |
| import org.eclipse.xtext.xbase.jvmmodel.JvmTypeReferenceBuilder |
| import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder |
| import org.eclipse.osbp.ecview.core.common.model.core.YEmbeddable |
| import org.eclipse.osbp.ecview.core.common.model.core.YLayout |
| import org.eclipse.osbp.ecview.core.^extension.model.^extension.YFormLayout |
| import org.osgi.service.component.annotations.Component |
| |
| class StrategyDSLLayoutingStrategyCreator { |
| @Inject extension JvmTypesBuilder |
| @Inject extension StrategyConstants |
| @Inject extension CommonUtils |
| // @Inject |
| // private TypeReferences references; |
| |
| private JvmAnnotationReferenceBuilder _annotationTypesBuilder; |
| private JvmTypeReferenceBuilder _typeReferenceBuilder; |
| |
| def void createLayoutingStrategy(StrategyPackage pckg, LayoutingStrategy layoutingStrategy, |
| IJvmDeclaredTypeAcceptor acceptor, JvmAnnotationReferenceBuilder annotationTypesBuilder, |
| JvmTypeReferenceBuilder typeReferenceBuilder) { |
| pckg.createLayoutingStrategy(layoutingStrategy, acceptor, annotationTypesBuilder, typeReferenceBuilder, false) |
| } |
| |
| def void createLayoutingStrategy(StrategyPackage pckg, LayoutingStrategy layoutingStrategy, |
| IJvmDeclaredTypeAcceptor acceptor, JvmAnnotationReferenceBuilder annotationTypesBuilder, |
| JvmTypeReferenceBuilder typeReferenceBuilder, boolean osdefault) { |
| _annotationTypesBuilder = annotationTypesBuilder |
| _typeReferenceBuilder = typeReferenceBuilder |
| |
| // creation of the AbstractLayoutingStrategy implementation |
| var clsStrategy = layoutingStrategy.toClass( |
| '''«pckg.name».«layoutingStrategy.getStrategyClassName(osdefault)»''') |
| clsStrategy.getSuperTypes().add(_typeReferenceBuilder.typeRef(typeof(AbstractLayoutingStrategy))) |
| acceptor.accept(clsStrategy, |
| [ |
| documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION |
| it.toConstructor(layoutingStrategy) |
| it.toFields(layoutingStrategy) |
| it.toOperations(layoutingStrategy) |
| ]) |
| |
| // creation of the ILayoutingStrategyProvider implementation |
| var clsProvider = layoutingStrategy.toClass( |
| '''«pckg.name».«layoutingStrategy.getStrategyProviderClassName(osdefault)»''') |
| clsProvider.getSuperTypes().add(_typeReferenceBuilder.typeRef(typeof(ILayoutingStrategyProvider))) |
| acceptor.accept(clsProvider, |
| [ |
| documentation = GeneratorConstants.GENERATED_CLASSES_DOCUMENTATION |
| var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Component)) |
| annotationRef.addAnnAttr(layoutingStrategy, "immediate", true) |
| annotationRef.addAnnAttr(layoutingStrategy, "service", |
| _typeReferenceBuilder.typeRef(ILayoutingStrategyProvider)) |
| var layoutingId = layoutingStrategy.strategyClassName |
| if (osdefault) { |
| layoutingId = "Default" |
| } |
| var propContent = '''ecview.layouting.id=«layoutingId»''' |
| annotationRef.addAnnAttr(layoutingStrategy, "property", propContent) |
| annotations += annotationRef |
| it.toProviderFields(layoutingStrategy, osdefault) |
| it.toProviderOperations(layoutingStrategy, osdefault) |
| ]) |
| } |
| |
| // Strategy Methods |
| /** |
| * <p>build the constructors to be used by an e4 application.</p> |
| * |
| */ |
| def void toConstructor(JvmDeclaredType type, LayoutingStrategy layoutingStrategy) { |
| type.members += layoutingStrategy.toConstructor( |
| [ |
| body = [ |
| append( |
| ''' |
| super(null);''')] |
| ]) |
| } |
| |
| /** |
| * <p>build the class variables.</p> |
| * |
| */ |
| def void toFields(JvmGenericType type, LayoutingStrategy layoutingStrategy) { |
| var JvmField field = null |
| if (layoutingStrategy.isForm){ |
| // for (var i=0; i < 2 ; i++){ |
| // create index |
| field = layoutingStrategy.toField('''index''', _typeReferenceBuilder.typeRef(int)) |
| field.visibility = JvmVisibility.PRIVATE |
| type.members += field |
| // } |
| // create FormLayoutList |
| field = layoutingStrategy.toField("formLayoutList", _typeReferenceBuilder.typeRef(List,_typeReferenceBuilder.typeRef(YFormLayout)))[setInitializer([append('''new ArrayList<>()''')])] |
| field.visibility = JvmVisibility.PRIVATE |
| type.members += field |
| } |
| } |
| |
| def getContentFormLayoutBody(LayoutingStrategy layoutingStrategy)''' |
| YHorizontalLayout layout = ExtensionModelFactory.eINSTANCE.createYHorizontalLayout(); |
| «layoutingStrategy.basicFormLayoutBody» |
| for (YFormLayout formLayoutListItem : formLayoutList){ |
| layout.addElement(formLayoutListItem); |
| } |
| return layout; |
| ''' |
| |
| def String getBasicFormLayoutBody(LayoutingStrategy layoutingStrategy){ |
| var formLayoutIdx = 1 |
| if (layoutingStrategy.layout.literal.equals(LayoutingEnum.FORM2.literal)){ |
| formLayoutIdx = 2 |
| } else if (layoutingStrategy.layout.literal.equals(LayoutingEnum.FORM3.literal)){ |
| formLayoutIdx = 3 |
| } |
| |
| var body = '''''' |
| for (var i=0; i < formLayoutIdx ; i++){ |
| body = ''' |
| «body» |
| formLayoutList.add(ExtensionModelFactory.eINSTANCE.createYFormLayout());''' |
| } |
| body |
| } |
| |
| def void toOperations(JvmGenericType type, LayoutingStrategy layoutingStrategy) { |
| |
| // // create layout |
| // type.members += layoutingStrategy.toMethod("layout", _typeReferenceBuilder.typeRef(Void::TYPE), |
| // [ |
| // annotations += _annotationTypesBuilder.annotationRef(typeof(Override)) |
| // parameters += |
| // layoutingStrategy.toParameter("layoutingInfo", _typeReferenceBuilder.typeRef(YLayoutingInfo)) |
| // visibility = JvmVisibility.PUBLIC |
| // body = [append(layoutingStrategy.layoutBody)] |
| // ]) |
| |
| // create createContentLayout |
| type.members += layoutingStrategy.toMethod("createContentLayout", _typeReferenceBuilder.typeRef(YLayout), |
| [ |
| visibility = JvmVisibility.PROTECTED |
| annotations += _annotationTypesBuilder.annotationRef(Override) |
| body = [append(layoutingStrategy.contentLayoutBody)] |
| ]) |
| |
| // create addElement |
| type.members += layoutingStrategy.toMethod("addElement", _typeReferenceBuilder.typeRef(Void::TYPE), |
| [ |
| parameters += layoutingStrategy.toParameter("layout", _typeReferenceBuilder.typeRef(YLayout)) |
| parameters += layoutingStrategy.toParameter("element", _typeReferenceBuilder.typeRef(YEmbeddable)) |
| visibility = JvmVisibility.PROTECTED |
| annotations+= _annotationTypesBuilder.annotationRef(Override) |
| body = [ |
| append(layoutingStrategy.addElementBody)] |
| ]) |
| } |
| |
| def CharSequence addElementBody(LayoutingStrategy layoutingStrategy){ |
| if (layoutingStrategy.isForm) { |
| val modIdx = layoutingStrategy.modIdx |
| if (modIdx > 0){ |
| ''' |
| int idx = index % «modIdx»; |
| if (idx == 0) formLayoutList.get(0).addElement(element); else formLayoutList.get(idx).addElement(element); |
| index++;''' |
| } |
| } else { |
| '''layout.addElement(element);''' |
| } |
| } |
| |
| // def String getLayoutBody(LayoutingStrategy layoutingStrategy) { |
| // var body = ''' |
| // YStrategyLayout yLayout = layoutingInfo.getLayout(); |
| // layoutingInfo.getActiveSuspectInfos().clear(); |
| // ''' |
| // if (layoutingStrategy.isForm) { |
| // body = '''«body»«layoutingStrategy.formLayoutBody»''' |
| // } else { |
| // body = '''«body»«layoutingStrategy.simpleLayoutBody»''' |
| // } |
| // return body |
| // } |
| |
| def String getContentLayoutBody(LayoutingStrategy layoutingStrategy) { |
| if (layoutingStrategy.isForm) { |
| return '''«layoutingStrategy.contentFormLayoutBody»''' |
| } else { |
| return '''return ExtensionModelFactory.eINSTANCE.createY«layoutingStrategy.layout.literal»Layout();''' |
| } |
| } |
| |
| // def getSimpleLayoutBody(LayoutingStrategy layoutingStrategy) '''«layoutingStrategy. |
| // getBasicLayoutBody(layoutingStrategy.layout.literal, "content.addElement(yEmbeddable)")»''' |
| // |
| // def String getFormLayoutBody(LayoutingStrategy layoutingStrategy) ''' |
| // «layoutingStrategy.basicFormLayoutBody» |
| // «layoutingStrategy.getBasicLayoutBody(LayoutingEnum.HORIZONTAL.literal, "addElement(yEmbeddable)")»''' |
| // |
| // def String getBasicLayoutBody(LayoutingStrategy layoutingStrategy, String layoutName, String addElement) ''' |
| // Y«layoutName»Layout content = (Y«layoutName»Layout) createContentLayout(); |
| // for (YSuspect suspect : new ArrayList<YSuspect>(yLayout.getSuspects())) { |
| // YSuspectInfo suspectInfo = layoutingInfo.createSuspectInfo(suspect); |
| // // add the suspectInfo as active suspect |
| // layoutingInfo.getActiveSuspectInfos().add(suspectInfo); |
| // |
| // YEmbeddable yEmbeddable = prepareElementForSuspect(suspectInfo); |
| // |
| // «addElement»; |
| // } |
| // |
| // layoutingInfo.setContent(content); |
| // ''' |
| |
| // Provider Methods |
| /** |
| * <p>build the class variables.</p> |
| * |
| */ |
| def void toProviderFields(JvmGenericType type, LayoutingStrategy layoutingStrategy, boolean osdefault) { |
| var JvmField field = null |
| |
| // create logger |
| field = layoutingStrategy.toField("ID", _typeReferenceBuilder.typeRef(String))[ |
| setInitializer([append('''"«layoutingStrategy.getStrategyClassName(osdefault)»"''')]) final = true static = true] |
| type.members += field |
| } |
| |
| def void toProviderOperations(JvmGenericType type, LayoutingStrategy layoutingStrategy, boolean osdefault) { |
| |
| // create focus |
| type.members += layoutingStrategy.toMethod("getStrategy", _typeReferenceBuilder.typeRef(ILayoutingStrategy), |
| [ |
| annotations += _annotationTypesBuilder.annotationRef(typeof(Override)) |
| visibility = JvmVisibility.PUBLIC |
| body = [append('''return new «layoutingStrategy.getStrategyClassName(osdefault)»();''')] |
| ]) |
| } |
| |
| // Helper Methods |
| // Helper Methods |
| def String getStrategyClassName(LayoutingStrategy layoutingStrategy) { |
| layoutingStrategy.getStrategyClassName(false) |
| } |
| |
| def String getStrategyClassName(LayoutingStrategy layoutingStrategy, boolean osdefault) { |
| var layoutingStrategyClassName = layoutingStrategy.notDefaultStrategyClassName |
| if (osdefault) { |
| layoutingStrategyClassName = layoutingStrategy.defaultStrategyClassName |
| } |
| return '''«layoutingStrategyClassName»''' |
| } |
| |
| def String getStrategyProviderClassName(LayoutingStrategy layoutingStrategy) { |
| layoutingStrategy.getStrategyProviderClassName(false) |
| } |
| |
| def String getStrategyProviderClassName(LayoutingStrategy layoutingStrategy, boolean osdefault) { |
| var layoutingStrategyProviderClassName = layoutingStrategy.notDefaultStrategyProviderClassName |
| if (osdefault) { |
| layoutingStrategyProviderClassName = layoutingStrategy.defaultStrategyProviderClassName |
| } |
| return '''«layoutingStrategyProviderClassName»''' |
| } |
| |
| def int getModIdx(LayoutingStrategy layoutingStrategy){ |
| if (layoutingStrategy.layout.literal.equals(LayoutingEnum.FORM2.literal)) { |
| return 2 |
| } else if (layoutingStrategy.layout.literal.equals(LayoutingEnum.FORM3.literal)) { |
| return 3 |
| } |
| return 0 |
| } |
| |
| def boolean isForm(LayoutingStrategy layoutingStrategy){ |
| return ((layoutingStrategy.layout.literal.equals(LayoutingEnum.FORM2.literal)) || (layoutingStrategy.layout.literal.equals(LayoutingEnum.FORM3.literal))) |
| } |
| |
| def getNotDefaultStrategyClassName(LayoutingStrategy layoutingStrategy) '''«layoutingStrategy.name»«LAYOUTING_STRATEGY_PREFIX»''' |
| |
| def getDefaultStrategyClassName(LayoutingStrategy layoutingStrategy) '''Default«LAYOUTING_STRATEGY_PREFIX»''' |
| |
| def getNotDefaultStrategyProviderClassName(LayoutingStrategy layoutingStrategy) '''«layoutingStrategy.name»«LAYOUTING_STRATEGY_PROVIDER_PREFIX»''' |
| |
| def getDefaultStrategyProviderClassName(LayoutingStrategy layoutingStrategy) '''Default«LAYOUTING_STRATEGY_PROVIDER_PREFIX»''' |
| } |