blob: 9a1aa6bfca9fb7773bf05524baa76f2c4d1f5ede [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.sdk.operation.form;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.Signature;
import org.eclipse.scout.nls.sdk.model.INlsEntry;
import org.eclipse.scout.nls.sdk.model.util.Language;
import org.eclipse.scout.nls.sdk.model.workspace.NlsEntry;
import org.eclipse.scout.nls.sdk.model.workspace.project.INlsProject;
import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
import org.eclipse.scout.sdk.extensions.runtime.classes.RuntimeClasses;
import org.eclipse.scout.sdk.sourcebuilder.SortedMemberKeyFactory;
import org.eclipse.scout.sdk.sourcebuilder.annotation.AnnotationSourceBuilderFactory;
import org.eclipse.scout.sdk.sourcebuilder.method.IMethodBodySourceBuilder;
import org.eclipse.scout.sdk.sourcebuilder.method.IMethodSourceBuilder;
import org.eclipse.scout.sdk.sourcebuilder.method.MethodBodySourceBuilderFactory;
import org.eclipse.scout.sdk.sourcebuilder.method.MethodSourceBuilderFactory;
import org.eclipse.scout.sdk.sourcebuilder.type.ITypeSourceBuilder;
import org.eclipse.scout.sdk.sourcebuilder.type.TypeSourceBuilder;
import org.eclipse.scout.sdk.util.ScoutUtility;
import org.eclipse.scout.sdk.util.SdkProperties;
import org.eclipse.scout.sdk.util.signature.IImportValidator;
import org.eclipse.scout.sdk.util.signature.SignatureCache;
import org.eclipse.scout.sdk.util.type.TypeFilters;
import org.eclipse.scout.sdk.util.type.TypeUtility;
import org.eclipse.scout.sdk.util.typecache.ITypeHierarchy;
import org.eclipse.scout.sdk.workspace.type.ScoutTypeUtility;
import org.eclipse.scout.sdk.workspace.type.config.ConfigurationMethod;
import org.eclipse.scout.sdk.workspace.type.config.PropertyMethodSourceUtility;
/**
* <h3>{@link SearchFormFromTablePageHelper}</h3>
*
* @author Andreas Hoegger
* @since 3.9.0 21.05.2013
*/
public final class SearchFormFromTablePageHelper {
private static final String NLS_KEY_SEARCH_CRITERIA = "searchCriteria";
private SearchFormFromTablePageHelper() {
}
public static void fillSearchForm(ITypeSourceBuilder searchFormBuilder, String searchFormFqn, final IType formData, IType tablePage, IJavaProject searchFormProject, IProgressMonitor monitor) throws CoreException {
INlsProject nlsProvider = ScoutTypeUtility.findNlsProject(tablePage);
if (formData != null) {
// execResetSearchFilter method
IMethodSourceBuilder execResetSearchFilterBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(searchFormBuilder, "execResetSearchFilter");
execResetSearchFilterBuilder.setMethodBodySourceBuilder(new IMethodBodySourceBuilder() {
@Override
public void createSource(IMethodSourceBuilder methodBuilder, StringBuilder source, String lineDelimiter, IJavaProject ownerProject, IImportValidator validator) throws CoreException {
source.append("super.execResetSearchFilter(searchFilter);").append(lineDelimiter);
String simpleFormDataName = validator.getTypeName(SignatureCache.createTypeSignature(formData.getFullyQualifiedName()));
source.append(simpleFormDataName + " formData = new " + simpleFormDataName + "();").append(lineDelimiter);
source.append("exportFormData(formData);").append(lineDelimiter);
source.append("searchFilter.setFormData(formData);");
}
});
searchFormBuilder.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodExecKey(execResetSearchFilterBuilder), execResetSearchFilterBuilder);
}
// main box
ITypeSourceBuilder mainBoxBuilder = addFormField(SdkProperties.TYPE_NAME_MAIN_BOX, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IGroupBox, searchFormProject), SdkProperties.ORDER_ANNOTATION_VALUE_STEP, searchFormFqn, searchFormBuilder, searchFormBuilder);
String mainBoxFqn = searchFormFqn + "." + mainBoxBuilder.getElementName();
// tabbox
ITypeSourceBuilder tabBoxBuilder = addFormField("TabBox", RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.ITabBox, searchFormProject), SdkProperties.ORDER_ANNOTATION_VALUE_STEP, mainBoxFqn, mainBoxBuilder, searchFormBuilder);
String tabBoxFqn = mainBoxFqn + "." + tabBoxBuilder.getElementName();
// field box (group box)
ITypeSourceBuilder fieldBoxBuilder = addFormField("Field" + SdkProperties.SUFFIX_GROUP_BOX, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IGroupBox, searchFormProject), SdkProperties.ORDER_ANNOTATION_VALUE_STEP, tabBoxFqn, tabBoxBuilder, searchFormBuilder);
String fieldBoxFqn = tabBoxFqn + "." + fieldBoxBuilder.getElementName();
INlsEntry searchCriteriaEntry = null;
if (nlsProvider != null) {
searchCriteriaEntry = nlsProvider.getEntry(NLS_KEY_SEARCH_CRITERIA);
if (searchCriteriaEntry == null) {
NlsEntry entry = new NlsEntry(NLS_KEY_SEARCH_CRITERIA, nlsProvider);
entry.addTranslation(Language.LANGUAGE_DEFAULT, "Search Criteria");
nlsProvider.updateRow(entry, monitor);
searchCriteriaEntry = entry;
}
}
// getConfiguredLabel method
IMethodSourceBuilder getConfiguredLabelBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(fieldBoxBuilder, SdkProperties.METHOD_NAME_GET_CONFIGURED_LABEL);
if (searchCriteriaEntry == null) {
getConfiguredLabelBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createSimpleMethodBody("return \"Search Criteria\";"));
}
else {
getConfiguredLabelBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(searchCriteriaEntry));
}
fieldBoxBuilder.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredLabelBuilder), getConfiguredLabelBuilder);
// fields
double fieldOrder = SdkProperties.ORDER_ANNOTATION_VALUE_STEP;
ITypeHierarchy tablePageHierarchy = TypeUtility.getLocalTypeHierarchy(tablePage);
Set<IType> tables = TypeUtility.getInnerTypes(tablePage, TypeFilters.getSubtypeFilter(TypeUtility.getType(IRuntimeClasses.ITable), tablePageHierarchy));
if (tables.size() > 0) {
IType table = null;
for (IType tab : tables) {
if (TypeUtility.exists(tab)) {
table = tab;
break;
}
}
if (TypeUtility.exists(table)) {
Set<IType> columns = TypeUtility.getInnerTypes(table, TypeFilters.getSubtypeFilter(TypeUtility.getType(IRuntimeClasses.IColumn), tablePageHierarchy));
for (IType column : columns) {
ConfigurationMethod configurationMethod = ScoutTypeUtility.getConfigurationMethod(column, "getConfiguredDisplayable", tablePageHierarchy, ConfigurationMethod.PROPERTY_METHOD, "BOOLEAN");
String retVal = ScoutUtility.getMethodReturnValue(configurationMethod.peekMethod());
if ("true".equals(retVal)) {
addSearchField(column, tablePageHierarchy, fieldOrder, fieldBoxFqn, fieldBoxBuilder, searchFormBuilder, searchFormProject, nlsProvider);
fieldOrder += SdkProperties.ORDER_ANNOTATION_VALUE_STEP;
}
}
}
}
// end field box
// button reset
addFormField("Reset" + SdkProperties.SUFFIX_BUTTON, SignatureCache.createTypeSignature(IRuntimeClasses.AbstractResetButton), fieldOrder, mainBoxFqn, mainBoxBuilder, searchFormBuilder);
// button search
addFormField("Search" + SdkProperties.SUFFIX_BUTTON, SignatureCache.createTypeSignature(IRuntimeClasses.AbstractSearchButton), fieldOrder + SdkProperties.ORDER_ANNOTATION_VALUE_STEP, mainBoxFqn, mainBoxBuilder, searchFormBuilder);
}
private static ITypeSourceBuilder addFormField(String fieldName, String superTypeSignature, double orderNr, String fieldOwnerFqn, ITypeSourceBuilder fieldOwnerBuilder, ITypeSourceBuilder fieldGetterOwnerBuilder) throws CoreException {
return addFormField(fieldName, null, superTypeSignature, orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
}
private static ITypeSourceBuilder addFormField(String fieldName, INlsEntry nlsEntry, String superTypeSignature, double orderNr, String fieldOwnerFqn, ITypeSourceBuilder fieldOwnerBuilder, ITypeSourceBuilder fieldGetterOwnerBuilder) throws CoreException {
ITypeSourceBuilder fieldSourceBuilder = new TypeSourceBuilder(fieldName);
fieldSourceBuilder.setFlags(Flags.AccPublic);
fieldSourceBuilder.setSuperTypeSignature(superTypeSignature);
fieldSourceBuilder.addAnnotationSourceBuilder(AnnotationSourceBuilderFactory.createOrderAnnotation(orderNr));
// nls entry
if (nlsEntry != null) {
IMethodSourceBuilder getConfiguredLabelBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(fieldSourceBuilder, SdkProperties.METHOD_NAME_GET_CONFIGURED_LABEL);
getConfiguredLabelBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(nlsEntry));
fieldSourceBuilder.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredLabelBuilder), getConfiguredLabelBuilder);
}
fieldOwnerBuilder.addSortedTypeSourceBuilder(SortedMemberKeyFactory.createTypeFormFieldKey(fieldSourceBuilder, orderNr), fieldSourceBuilder);
// field getter
IMethodSourceBuilder fieldGetterBuilder = MethodSourceBuilderFactory.createFieldGetterSourceBuilder(SignatureCache.createTypeSignature(fieldOwnerFqn + "." + fieldName));
fieldGetterOwnerBuilder.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodFormFieldGetterKey(fieldGetterBuilder), fieldGetterBuilder);
return fieldSourceBuilder;
}
private static ITypeSourceBuilder addSearchField(IType column, ITypeHierarchy tablePageHierarchy, double orderNr, String fieldOwnerFqn, ITypeSourceBuilder fieldOwnerBuilder, ITypeSourceBuilder fieldGetterOwnerBuilder, IJavaProject searchFormProject, INlsProject nlsProject) throws CoreException {
// nls entry
INlsEntry nlsEntry = null;
IMethod nlsMethod = TypeUtility.getMethod(column, "getConfiguredHeaderText");
if (TypeUtility.exists(nlsMethod)) {
nlsEntry = ScoutUtility.getReturnNlsEntry(nlsMethod);
}
String fieldNamePlain = column.getElementName().replace(SdkProperties.SUFFIX_COLUMN, "");
if (tablePageHierarchy.isSubtype(TypeUtility.getType(IRuntimeClasses.IBigDecimalColumn), column)) {
return addFormField(fieldNamePlain + SdkProperties.SUFFIX_FORM_FIELD, nlsEntry, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IBigDecimalField, searchFormProject), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
}
else if (tablePageHierarchy.isSubtype(TypeUtility.getType(IRuntimeClasses.IBooleanColumn), column)) {
return addFormField(fieldNamePlain + SdkProperties.SUFFIX_FORM_FIELD, nlsEntry, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IBooleanField, searchFormProject), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
}
else if (tablePageHierarchy.isSubtype(TypeUtility.getType(IRuntimeClasses.IDateColumn), column)) {
ITypeSourceBuilder sequenceBoxBuilder = addFormField(fieldNamePlain + SdkProperties.SUFFIX_BOX, nlsEntry, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.ISequenceBox, searchFormProject), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
fillSequenceBox(sequenceBoxBuilder, fieldOwnerFqn + "." + sequenceBoxBuilder.getElementName(), RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IDateField, searchFormProject), fieldGetterOwnerBuilder, nlsProject);
return sequenceBoxBuilder;
}
else if (tablePageHierarchy.isSubtype(TypeUtility.getType(IRuntimeClasses.IDoubleColumn), column)) {
ITypeSourceBuilder sequenceBoxBuilder = addFormField(fieldNamePlain + SdkProperties.SUFFIX_BOX, nlsEntry, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.ISequenceBox, searchFormProject), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
fillSequenceBox(sequenceBoxBuilder, fieldOwnerFqn + "." + sequenceBoxBuilder.getElementName(), RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IDoubleField, searchFormProject), fieldGetterOwnerBuilder, nlsProject);
return sequenceBoxBuilder;
}
else if (tablePageHierarchy.isSubtype(TypeUtility.getType(IRuntimeClasses.IIntegerColumn), column)) {
ITypeSourceBuilder sequenceBoxBuilder = addFormField(fieldNamePlain + SdkProperties.SUFFIX_BOX, nlsEntry, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.ISequenceBox, searchFormProject), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
fillSequenceBox(sequenceBoxBuilder, fieldOwnerFqn + "." + sequenceBoxBuilder.getElementName(), RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IIntegerField, searchFormProject), fieldGetterOwnerBuilder, nlsProject);
return sequenceBoxBuilder;
}
else if (tablePageHierarchy.isSubtype(TypeUtility.getType(IRuntimeClasses.ILongColumn), column)) {
ITypeSourceBuilder sequenceBoxBuilder = addFormField(fieldNamePlain + SdkProperties.SUFFIX_BOX, nlsEntry, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.ISequenceBox, searchFormProject), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
fillSequenceBox(sequenceBoxBuilder, fieldOwnerFqn + "." + sequenceBoxBuilder.getElementName(), RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.ILongField, searchFormProject), fieldGetterOwnerBuilder, nlsProject);
return sequenceBoxBuilder;
}
else if (tablePageHierarchy.isSubtype(TypeUtility.getType(IRuntimeClasses.ISmartColumn), column)) {
IMethod codeTypeMethod = TypeUtility.getMethod(column, "getConfiguredCodeType");
if (TypeUtility.exists(codeTypeMethod)) {
final IType codeType = PropertyMethodSourceUtility.parseReturnParameterClass(PropertyMethodSourceUtility.getMethodReturnValue(codeTypeMethod), codeTypeMethod);
// listbox
ITypeSourceBuilder listBoxBuilder = addFormField(fieldNamePlain + SdkProperties.SUFFIX_FORM_FIELD, nlsEntry, SignatureCache.createTypeSignature(RuntimeClasses.getSuperTypeName(IRuntimeClasses.IListBox, searchFormProject) + Signature.C_GENERIC_START + Long.class.getName() + Signature.C_GENERIC_END), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
if (TypeUtility.exists(codeType)) {
// getConfiguredCodeType method
IMethodSourceBuilder getConfiguredCodeTypeBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(listBoxBuilder, "getConfiguredCodeType");
getConfiguredCodeTypeBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createReturnClassReferenceBody(SignatureCache.createTypeSignature(codeType.getFullyQualifiedName())));
listBoxBuilder.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredCodeTypeBuilder), getConfiguredCodeTypeBuilder);
}
}
else {
IMethod lookupCallMethod = TypeUtility.getMethod(column, "getConfiguredLookupCall");
if (TypeUtility.exists(lookupCallMethod)) {
final IType lookupCall = PropertyMethodSourceUtility.parseReturnParameterClass(PropertyMethodSourceUtility.getMethodReturnValue(lookupCallMethod), lookupCallMethod);
// smartfield
ITypeSourceBuilder smartFieldBuilder = addFormField(fieldNamePlain + SdkProperties.SUFFIX_FORM_FIELD, nlsEntry, SignatureCache.createTypeSignature(RuntimeClasses.getSuperTypeName(IRuntimeClasses.ISmartField, searchFormProject) + Signature.C_GENERIC_START + Long.class.getName() + Signature.C_GENERIC_END), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
if (TypeUtility.exists(lookupCall)) {
// getConfiguredLookupCall method
IMethodSourceBuilder getConfiguredCodeTypeBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(smartFieldBuilder, "getConfiguredLookupCall");
getConfiguredCodeTypeBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createReturnClassReferenceBody(SignatureCache.createTypeSignature(lookupCall.getFullyQualifiedName())));
smartFieldBuilder.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredCodeTypeBuilder), getConfiguredCodeTypeBuilder);
}
}
}
}
else if (tablePageHierarchy.isSubtype(TypeUtility.getType(IRuntimeClasses.IStringColumn), column)) {
return addFormField(fieldNamePlain + SdkProperties.SUFFIX_FORM_FIELD, nlsEntry, RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IStringField, searchFormProject), orderNr, fieldOwnerFqn, fieldOwnerBuilder, fieldGetterOwnerBuilder);
}
return null;
}
private static void fillSequenceBox(ITypeSourceBuilder sequenceBoxBuilder, String sequenceBoxFqn, String fromToSuperTypeSignature, ITypeSourceBuilder fieldGetterOwnerBuilder, INlsProject nlsProject) throws CoreException {
String parentName = sequenceBoxBuilder.getElementName();
int lastBoxIndex = parentName.lastIndexOf(SdkProperties.SUFFIX_BOX);
if (lastBoxIndex > 0) {
parentName = parentName.substring(0, lastBoxIndex);
}
// from
String fromFieldName = parentName + SdkProperties.SUFFIX_FROM;
ITypeSourceBuilder fromFieldBuilder = addFormField(fromFieldName, fromToSuperTypeSignature, SdkProperties.ORDER_ANNOTATION_VALUE_STEP, sequenceBoxFqn, sequenceBoxBuilder, fieldGetterOwnerBuilder);
// to
String toFieldName = parentName + SdkProperties.SUFFIX_TO;
ITypeSourceBuilder toFieldBuilder = addFormField(toFieldName, fromToSuperTypeSignature, 2 * SdkProperties.ORDER_ANNOTATION_VALUE_STEP, sequenceBoxFqn, sequenceBoxBuilder, fieldGetterOwnerBuilder);
// nls text methods
if (nlsProject != null) {
INlsEntry fromEntry = nlsProject.getEntry("from");
if (fromEntry != null) {
IMethodSourceBuilder getConfiguredLabelFromBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(fromFieldBuilder, SdkProperties.METHOD_NAME_GET_CONFIGURED_LABEL);
getConfiguredLabelFromBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(fromEntry));
fromFieldBuilder.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredLabelFromBuilder), getConfiguredLabelFromBuilder);
}
INlsEntry toEntry = nlsProject.getEntry("to");
if (toEntry != null) {
IMethodSourceBuilder getConfiguredLabelToBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(fromFieldBuilder, SdkProperties.METHOD_NAME_GET_CONFIGURED_LABEL);
getConfiguredLabelToBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(toEntry));
toFieldBuilder.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredLabelToBuilder), getConfiguredLabelToBuilder);
}
}
}
}