blob: 6c5cc3a4f9e6e082471b528c258da09ef8d9e888 [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 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.JavaModelException;
import org.eclipse.scout.commons.holders.StringHolder;
import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
import org.eclipse.scout.sdk.extensions.runtime.classes.RuntimeClasses;
import org.eclipse.scout.sdk.operation.jdt.JavaElementDeleteOperation;
import org.eclipse.scout.sdk.operation.jdt.method.MethodNewOperation;
import org.eclipse.scout.sdk.operation.jdt.packageFragment.ExportPolicy;
import org.eclipse.scout.sdk.operation.jdt.type.PrimaryTypeNewOperation;
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.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.TypeUtility;
import org.eclipse.scout.sdk.util.typecache.IWorkingCopyManager;
import org.eclipse.scout.sdk.workspace.IScoutBundle;
public class SearchFormNewOperation extends FormNewOperation {
private IScoutBundle m_searchFormDataLocationBundle;
private String m_searchFormDataPackageName;
private boolean m_createSearchHandler;
private IType m_tablePage;
// created types
private IType m_createdFormDataType;
/**
* @param typeName
* @param packageName
* @param clientProject
* @throws JavaModelException
*/
public SearchFormNewOperation(String typeName, String packageName, IJavaProject clientProject) throws JavaModelException {
super(typeName, packageName, clientProject);
}
@Override
public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException {
// create empty form data
if (getSearchFormDataLocationBundle() != null) {
String formDataTypeName = getElementName() + "Data";
PrimaryTypeNewOperation formDataTypeNewOp = new PrimaryTypeNewOperation(formDataTypeName, getSearchFormDataPackageName(), ScoutUtility.getJavaProject(getSearchFormDataLocationBundle()));
formDataTypeNewOp.addMethodSourceBuilder(MethodSourceBuilderFactory.createConstructorSourceBuilder(formDataTypeName));
formDataTypeNewOp.setFlags(Flags.AccPublic);
formDataTypeNewOp.setPackageExportPolicy(ExportPolicy.ADD_PACKAGE);
formDataTypeNewOp.setSuperTypeSignature(SignatureCache.createTypeSignature(IRuntimeClasses.AbstractFormData));
formDataTypeNewOp.validate();
formDataTypeNewOp.run(monitor, workingCopyManager);
m_createdFormDataType = formDataTypeNewOp.getCreatedType();
setFormDataSignature(SignatureCache.createTypeSignature(m_createdFormDataType.getFullyQualifiedName()));
}
final StringHolder handlerFqnHolder = new StringHolder();
if (isCreateSearchHandler()) {
ITypeSourceBuilder newHandlerBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_SEARCH_HANDLER);
newHandlerBuilder.setFlags(Flags.AccPublic);
newHandlerBuilder.setSuperTypeSignature(RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IFormHandler, getJavaProject()));
addSortedTypeSourceBuilder(SortedMemberKeyFactory.createTypeFormHandlerKey(newHandlerBuilder), newHandlerBuilder);
handlerFqnHolder.setValue(getPackageName() + "." + getElementName() + "." + newHandlerBuilder.getElementName());
}
// start method
IMethodSourceBuilder startHandlerMethodBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(getSourceBuilder(), "startSearch");
if (handlerFqnHolder.getValue() != null) {
startHandlerMethodBuilder.setMethodBodySourceBuilder(new IMethodBodySourceBuilder() {
@Override
public void createSource(IMethodSourceBuilder methodBuilder, StringBuilder source, String lineDelimiter, IJavaProject ownerProject, IImportValidator validator) throws CoreException {
source.append("startInternal(new ").append(validator.getTypeName(SignatureCache.createTypeSignature(handlerFqnHolder.getValue()))).append("());");
}
});
}
addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodStartFormKey(startHandlerMethodBuilder), startHandlerMethodBuilder);
super.run(monitor, workingCopyManager);
}
@Override
protected void createMainBox(ITypeSourceBuilder formBuilder, IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException {
if (getTablePage() != null) {
// fill search form from table page
fillFromTablePage(getSourceBuilder(), getPackageName() + "." + getElementName(), getTablePage(), m_createdFormDataType, getJavaProject(), monitor, workingCopyManager);
}
else {
// main box
ITypeSourceBuilder mainBoxBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_MAIN_BOX);
mainBoxBuilder.addAnnotationSourceBuilder(AnnotationSourceBuilderFactory.createOrderAnnotation(SdkProperties.ORDER_ANNOTATION_VALUE_STEP));
mainBoxBuilder.setFlags(Flags.AccPublic);
mainBoxBuilder.setSuperTypeSignature(RuntimeClasses.getSuperTypeSignature(IRuntimeClasses.IGroupBox, getJavaProject()));
formBuilder.addSortedTypeSourceBuilder(SortedMemberKeyFactory.createTypeFormFieldKey(mainBoxBuilder, SdkProperties.ORDER_ANNOTATION_VALUE_STEP), mainBoxBuilder);
}
}
/**
* @param sourceBuilder
* @param tablePage
* @param monitor
* @param workingCopyManager
* @throws CoreException
*/
private void fillFromTablePage(ITypeSourceBuilder searchFormBuilder, final String searchFormFqn, IType tablePage, IType formDataType, IJavaProject searchFormProject, IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException {
SearchFormFromTablePageHelper.fillSearchForm(searchFormBuilder, searchFormFqn, formDataType, getTablePage(), searchFormProject, monitor);
IMethod getConfiguredSearchFormMethod = TypeUtility.getMethod(getTablePage(), "getConfiguredSearchForm");
if (TypeUtility.exists(getConfiguredSearchFormMethod)) {
JavaElementDeleteOperation delOp = new JavaElementDeleteOperation();
delOp.addMember(getConfiguredSearchFormMethod);
delOp.validate();
delOp.run(monitor, workingCopyManager);
workingCopyManager.reconcile(getConfiguredSearchFormMethod.getCompilationUnit(), monitor);
}
MethodNewOperation getConfiguredSearchFormOp = new MethodNewOperation(MethodSourceBuilderFactory.createOverrideMethodSourceBuilder("getConfiguredSearchForm", getTablePage()), getTablePage(), true);
getConfiguredSearchFormOp.setMethodBodySourceBuilder(new IMethodBodySourceBuilder() {
@Override
public void createSource(IMethodSourceBuilder methodBuilder, StringBuilder source, String lineDelimiter, IJavaProject ownerProject, IImportValidator validator) throws CoreException {
String simpleRef = validator.getTypeName(SignatureCache.createTypeSignature(searchFormFqn));
source.append("return ").append(simpleRef).append(".class;");
}
});
getConfiguredSearchFormOp.validate();
getConfiguredSearchFormOp.run(monitor, workingCopyManager);
}
@Override
public String getOperationName() {
return "New Search Form...";
}
public IType getCreatedFormDataType() {
return m_createdFormDataType;
}
public IScoutBundle getSearchFormDataLocationBundle() {
return m_searchFormDataLocationBundle;
}
public void setSearchFormDataLocationBundle(IScoutBundle searchFormDataLocationBundle) {
m_searchFormDataLocationBundle = searchFormDataLocationBundle;
}
public boolean isCreateSearchHandler() {
return m_createSearchHandler;
}
public void setCreateSearchHandler(boolean createSearchHandler) {
m_createSearchHandler = createSearchHandler;
}
public void setTablePage(IType tablePage) {
m_tablePage = tablePage;
}
public IType getTablePage() {
return m_tablePage;
}
public String getSearchFormDataPackageName() {
return m_searchFormDataPackageName;
}
public void setSearchFormDataPackageName(String searchFormDataPackageName) {
m_searchFormDataPackageName = searchFormDataPackageName;
}
}