blob: 879ce9bdddd3ba00eeb3731d98a6ec11aa7acf57 [file] [log] [blame]
/**
*
* 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»'''
}