blob: 61798c83673b68a5c0534ee61539e4511f8a4c3f [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 java.util.List;
import javax.inject.Inject;
import org.eclipse.emf.common.util.EList;
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.eclipse.osbp.ecview.extension.api.ILayoutingStrategy;
import org.eclipse.osbp.ecview.extension.api.ILayoutingStrategyProvider;
import org.eclipse.osbp.ecview.extension.strategy.AbstractLayoutingStrategy;
import org.eclipse.osbp.utils.annotation.CommonUtils;
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 org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.common.types.JvmAnnotationReference;
import org.eclipse.xtext.common.types.JvmConstructor;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmField;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.JvmMember;
import org.eclipse.xtext.common.types.JvmOperation;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
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.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.osgi.service.component.annotations.Component;
@SuppressWarnings("all")
public class StrategyDSLLayoutingStrategyCreator {
@Inject
@Extension
private JvmTypesBuilder _jvmTypesBuilder;
@Inject
@Extension
private StrategyConstants _strategyConstants;
@Inject
@Extension
private CommonUtils _commonUtils;
private JvmAnnotationReferenceBuilder _annotationTypesBuilder;
private JvmTypeReferenceBuilder _typeReferenceBuilder;
public void createLayoutingStrategy(final StrategyPackage pckg, final LayoutingStrategy layoutingStrategy, final IJvmDeclaredTypeAcceptor acceptor, final JvmAnnotationReferenceBuilder annotationTypesBuilder, final JvmTypeReferenceBuilder typeReferenceBuilder) {
this.createLayoutingStrategy(pckg, layoutingStrategy, acceptor, annotationTypesBuilder, typeReferenceBuilder, false);
}
public void createLayoutingStrategy(final StrategyPackage pckg, final LayoutingStrategy layoutingStrategy, final IJvmDeclaredTypeAcceptor acceptor, final JvmAnnotationReferenceBuilder annotationTypesBuilder, final JvmTypeReferenceBuilder typeReferenceBuilder, final boolean osdefault) {
this._annotationTypesBuilder = annotationTypesBuilder;
this._typeReferenceBuilder = typeReferenceBuilder;
StringConcatenation _builder = new StringConcatenation();
String _name = pckg.getName();
_builder.append(_name);
_builder.append(".");
String _strategyClassName = this.getStrategyClassName(layoutingStrategy, osdefault);
_builder.append(_strategyClassName);
JvmGenericType clsStrategy = this._jvmTypesBuilder.toClass(layoutingStrategy, _builder.toString());
clsStrategy.getSuperTypes().add(this._typeReferenceBuilder.typeRef(AbstractLayoutingStrategy.class));
final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
this.toConstructor(it, layoutingStrategy);
this.toFields(it, layoutingStrategy);
this.toOperations(it, layoutingStrategy);
};
acceptor.<JvmGenericType>accept(clsStrategy, _function);
StringConcatenation _builder_1 = new StringConcatenation();
String _name_1 = pckg.getName();
_builder_1.append(_name_1);
_builder_1.append(".");
String _strategyProviderClassName = this.getStrategyProviderClassName(layoutingStrategy, osdefault);
_builder_1.append(_strategyProviderClassName);
JvmGenericType clsProvider = this._jvmTypesBuilder.toClass(layoutingStrategy, _builder_1.toString());
clsProvider.getSuperTypes().add(this._typeReferenceBuilder.typeRef(ILayoutingStrategyProvider.class));
final Procedure1<JvmGenericType> _function_1 = (JvmGenericType it) -> {
JvmAnnotationReference annotationRef = this._annotationTypesBuilder.annotationRef(Component.class);
this._commonUtils.addAnnAttr(annotationRef, layoutingStrategy, "immediate", Boolean.valueOf(true));
this._commonUtils.addAnnAttr(annotationRef, layoutingStrategy, "service",
this._typeReferenceBuilder.typeRef(ILayoutingStrategyProvider.class));
String layoutingId = this.getStrategyClassName(layoutingStrategy);
if (osdefault) {
layoutingId = "Default";
}
StringConcatenation _builder_2 = new StringConcatenation();
_builder_2.append("ecview.layouting.id=");
_builder_2.append(layoutingId);
String propContent = _builder_2.toString();
this._commonUtils.addAnnAttr(annotationRef, layoutingStrategy, "property", propContent);
EList<JvmAnnotationReference> _annotations = it.getAnnotations();
this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
this.toProviderFields(it, layoutingStrategy, osdefault);
this.toProviderOperations(it, layoutingStrategy, osdefault);
};
acceptor.<JvmGenericType>accept(clsProvider, _function_1);
}
/**
* <p>build the constructors to be used by an e4 application.</p>
*/
public void toConstructor(final JvmDeclaredType type, final LayoutingStrategy layoutingStrategy) {
EList<JvmMember> _members = type.getMembers();
final Procedure1<JvmConstructor> _function = (JvmConstructor it) -> {
final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
StringConcatenation _builder = new StringConcatenation();
_builder.append("super(null);");
it_1.append(_builder);
};
this._jvmTypesBuilder.setBody(it, _function_1);
};
JvmConstructor _constructor = this._jvmTypesBuilder.toConstructor(layoutingStrategy, _function);
this._jvmTypesBuilder.<JvmConstructor>operator_add(_members, _constructor);
}
/**
* <p>build the class variables.</p>
*/
public void toFields(final JvmGenericType type, final LayoutingStrategy layoutingStrategy) {
JvmField field = null;
StringConcatenation _builder = new StringConcatenation();
_builder.append("index");
field = this._jvmTypesBuilder.toField(layoutingStrategy, _builder.toString(), this._typeReferenceBuilder.typeRef(int.class));
field.setVisibility(JvmVisibility.PRIVATE);
EList<JvmMember> _members = type.getMembers();
this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
boolean _isForm = this.isForm(layoutingStrategy);
if (_isForm) {
final Procedure1<JvmField> _function = (JvmField it) -> {
final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("new ArrayList<>()");
it_1.append(_builder_1);
};
this._jvmTypesBuilder.setInitializer(it, _function_1);
};
field = this._jvmTypesBuilder.toField(layoutingStrategy, "formLayoutList", this._typeReferenceBuilder.typeRef(List.class, this._typeReferenceBuilder.typeRef(YFormLayout.class)), _function);
field.setVisibility(JvmVisibility.PRIVATE);
EList<JvmMember> _members_1 = type.getMembers();
this._jvmTypesBuilder.<JvmField>operator_add(_members_1, field);
}
}
public CharSequence getContentFormLayoutBody(final LayoutingStrategy layoutingStrategy) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("YHorizontalLayout layout = ExtensionModelFactory.eINSTANCE.createYHorizontalLayout();");
_builder.newLine();
String _basicFormLayoutBody = this.getBasicFormLayoutBody(layoutingStrategy);
_builder.append(_basicFormLayoutBody);
_builder.newLineIfNotEmpty();
_builder.append("for (YFormLayout formLayoutListItem : formLayoutList){");
_builder.newLine();
_builder.append("\t");
_builder.append("layout.addElement(formLayoutListItem);");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.append("return layout;");
_builder.newLine();
return _builder;
}
public String getBasicFormLayoutBody(final LayoutingStrategy layoutingStrategy) {
String _xblockexpression = null;
{
int formLayoutIdx = 1;
boolean _equals = layoutingStrategy.getLayout().getLiteral().equals(LayoutingEnum.FORM2.getLiteral());
if (_equals) {
formLayoutIdx = 2;
} else {
boolean _equals_1 = layoutingStrategy.getLayout().getLiteral().equals(LayoutingEnum.FORM3.getLiteral());
if (_equals_1) {
formLayoutIdx = 3;
}
}
StringConcatenation _builder = new StringConcatenation();
String body = _builder.toString();
for (int i = 0; (i < formLayoutIdx); i++) {
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append(body);
_builder_1.newLineIfNotEmpty();
_builder_1.append("formLayoutList.add(ExtensionModelFactory.eINSTANCE.createYFormLayout());");
body = _builder_1.toString();
}
_xblockexpression = body;
}
return _xblockexpression;
}
public void toOperations(final JvmGenericType type, final LayoutingStrategy layoutingStrategy) {
EList<JvmMember> _members = type.getMembers();
final Procedure1<JvmOperation> _function = (JvmOperation it) -> {
it.setVisibility(JvmVisibility.PROTECTED);
EList<JvmAnnotationReference> _annotations = it.getAnnotations();
JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
it_1.append(this.getContentLayoutBody(layoutingStrategy));
};
this._jvmTypesBuilder.setBody(it, _function_1);
};
JvmOperation _method = this._jvmTypesBuilder.toMethod(layoutingStrategy, "createContentLayout", this._typeReferenceBuilder.typeRef(YLayout.class), _function);
this._jvmTypesBuilder.<JvmOperation>operator_add(_members, _method);
EList<JvmMember> _members_1 = type.getMembers();
final Procedure1<JvmOperation> _function_1 = (JvmOperation it) -> {
EList<JvmFormalParameter> _parameters = it.getParameters();
JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(layoutingStrategy, "layout", this._typeReferenceBuilder.typeRef(YLayout.class));
this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
EList<JvmFormalParameter> _parameters_1 = it.getParameters();
JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(layoutingStrategy, "element", this._typeReferenceBuilder.typeRef(YEmbeddable.class));
this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
it.setVisibility(JvmVisibility.PROTECTED);
EList<JvmAnnotationReference> _annotations = it.getAnnotations();
JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_1) -> {
it_1.append(this.addElementBody(layoutingStrategy));
};
this._jvmTypesBuilder.setBody(it, _function_2);
};
JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(layoutingStrategy, "addElement", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_1);
this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, _method_1);
}
public CharSequence addElementBody(final LayoutingStrategy layoutingStrategy) {
CharSequence _xifexpression = null;
boolean _isForm = this.isForm(layoutingStrategy);
if (_isForm) {
CharSequence _xblockexpression = null;
{
final int modIdx = this.getModIdx(layoutingStrategy);
CharSequence _xifexpression_1 = null;
if ((modIdx > 0)) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("int idx = index % ");
_builder.append(modIdx);
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.append("if (idx == 0) formLayoutList.get(0).addElement(element); else formLayoutList.get(idx).addElement(element);");
_builder.newLine();
_builder.append("index++;");
_builder.newLine();
_builder.append("if (element instanceof YFocusable) {");
_builder.newLine();
_builder.append("\t");
_builder.append("((YFocusable) element).setLayoutIdx(index);");
_builder.newLine();
_builder.append("\t");
_builder.append("((YFocusable) element).setLayoutColumns(");
_builder.append(modIdx, "\t");
_builder.append(");");
_builder.newLineIfNotEmpty();
_builder.append("}");
_xifexpression_1 = _builder;
}
_xblockexpression = _xifexpression_1;
}
_xifexpression = _xblockexpression;
} else {
StringConcatenation _builder = new StringConcatenation();
_builder.append("\t");
_builder.append("layout.addElement(element);");
_builder.newLine();
_builder.append("\t\t\t \t");
_builder.append("index++;");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("if (element instanceof YFocusable) {");
_builder.newLine();
_builder.append("\t\t\t\t\t");
_builder.append("((YFocusable) element).setLayoutIdx(index);");
_builder.newLine();
_builder.append("\t\t\t\t\t");
_builder.append("((YFocusable) element).setLayoutColumns(1);");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("}");
_xifexpression = _builder;
}
return _xifexpression;
}
public String getContentLayoutBody(final LayoutingStrategy layoutingStrategy) {
boolean _isForm = this.isForm(layoutingStrategy);
if (_isForm) {
StringConcatenation _builder = new StringConcatenation();
CharSequence _contentFormLayoutBody = this.getContentFormLayoutBody(layoutingStrategy);
_builder.append(_contentFormLayoutBody);
return _builder.toString();
} else {
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("return ExtensionModelFactory.eINSTANCE.createY");
String _literal = layoutingStrategy.getLayout().getLiteral();
_builder_1.append(_literal);
_builder_1.append("Layout();");
return _builder_1.toString();
}
}
/**
* <p>build the class variables.</p>
*/
public void toProviderFields(final JvmGenericType type, final LayoutingStrategy layoutingStrategy, final boolean osdefault) {
JvmField field = null;
final Procedure1<JvmField> _function = (JvmField it) -> {
final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
StringConcatenation _builder = new StringConcatenation();
_builder.append("\"");
String _strategyClassName = this.getStrategyClassName(layoutingStrategy, osdefault);
_builder.append(_strategyClassName);
_builder.append("\"");
it_1.append(_builder);
};
this._jvmTypesBuilder.setInitializer(it, _function_1);
it.setFinal(true);
it.setStatic(true);
};
field = this._jvmTypesBuilder.toField(layoutingStrategy, "ID", this._typeReferenceBuilder.typeRef(String.class), _function);
EList<JvmMember> _members = type.getMembers();
this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
}
public void toProviderOperations(final JvmGenericType type, final LayoutingStrategy layoutingStrategy, final boolean osdefault) {
EList<JvmMember> _members = type.getMembers();
final Procedure1<JvmOperation> _function = (JvmOperation it) -> {
EList<JvmAnnotationReference> _annotations = it.getAnnotations();
JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
it.setVisibility(JvmVisibility.PUBLIC);
final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
StringConcatenation _builder = new StringConcatenation();
_builder.append("return new ");
String _strategyClassName = this.getStrategyClassName(layoutingStrategy, osdefault);
_builder.append(_strategyClassName);
_builder.append("();");
it_1.append(_builder);
};
this._jvmTypesBuilder.setBody(it, _function_1);
};
JvmOperation _method = this._jvmTypesBuilder.toMethod(layoutingStrategy, "getStrategy", this._typeReferenceBuilder.typeRef(ILayoutingStrategy.class), _function);
this._jvmTypesBuilder.<JvmOperation>operator_add(_members, _method);
}
public String getStrategyClassName(final LayoutingStrategy layoutingStrategy) {
return this.getStrategyClassName(layoutingStrategy, false);
}
public String getStrategyClassName(final LayoutingStrategy layoutingStrategy, final boolean osdefault) {
CharSequence layoutingStrategyClassName = this.getNotDefaultStrategyClassName(layoutingStrategy);
if (osdefault) {
layoutingStrategyClassName = this.getDefaultStrategyClassName(layoutingStrategy);
}
StringConcatenation _builder = new StringConcatenation();
_builder.append(layoutingStrategyClassName);
return _builder.toString();
}
public String getStrategyProviderClassName(final LayoutingStrategy layoutingStrategy) {
return this.getStrategyProviderClassName(layoutingStrategy, false);
}
public String getStrategyProviderClassName(final LayoutingStrategy layoutingStrategy, final boolean osdefault) {
CharSequence layoutingStrategyProviderClassName = this.getNotDefaultStrategyProviderClassName(layoutingStrategy);
if (osdefault) {
layoutingStrategyProviderClassName = this.getDefaultStrategyProviderClassName(layoutingStrategy);
}
StringConcatenation _builder = new StringConcatenation();
_builder.append(layoutingStrategyProviderClassName);
return _builder.toString();
}
public int getModIdx(final LayoutingStrategy layoutingStrategy) {
boolean _equals = layoutingStrategy.getLayout().getLiteral().equals(LayoutingEnum.FORM2.getLiteral());
if (_equals) {
return 2;
} else {
boolean _equals_1 = layoutingStrategy.getLayout().getLiteral().equals(LayoutingEnum.FORM3.getLiteral());
if (_equals_1) {
return 3;
}
}
return 0;
}
public boolean isForm(final LayoutingStrategy layoutingStrategy) {
return (layoutingStrategy.getLayout().getLiteral().equals(LayoutingEnum.FORM2.getLiteral()) || layoutingStrategy.getLayout().getLiteral().equals(LayoutingEnum.FORM3.getLiteral()));
}
public CharSequence getNotDefaultStrategyClassName(final LayoutingStrategy layoutingStrategy) {
StringConcatenation _builder = new StringConcatenation();
String _name = layoutingStrategy.getName();
_builder.append(_name);
_builder.append(this._strategyConstants.LAYOUTING_STRATEGY_PREFIX);
return _builder;
}
public CharSequence getDefaultStrategyClassName(final LayoutingStrategy layoutingStrategy) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("Default");
_builder.append(this._strategyConstants.LAYOUTING_STRATEGY_PREFIX);
return _builder;
}
public CharSequence getNotDefaultStrategyProviderClassName(final LayoutingStrategy layoutingStrategy) {
StringConcatenation _builder = new StringConcatenation();
String _name = layoutingStrategy.getName();
_builder.append(_name);
_builder.append(this._strategyConstants.LAYOUTING_STRATEGY_PROVIDER_PREFIX);
return _builder;
}
public CharSequence getDefaultStrategyProviderClassName(final LayoutingStrategy layoutingStrategy) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("Default");
_builder.append(this._strategyConstants.LAYOUTING_STRATEGY_PROVIDER_PREFIX);
return _builder;
}
}