blob: dd643d8c26e4c899fe4e2e8fdfdcf2932b4a17de [file] [log] [blame]
package org.eclipse.gmf.codegen.util;
import java.util.List;
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
import org.eclipse.gmf.codegen.util.CodegenEmitters;
import org.eclipse.gmf.common.UnexpectedBehaviourException;
import org.eclipse.gmf.internal.common.codegen.JavaClassEmitter;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class CodegenEmittersWithXtend2 extends CodegenEmitters {
private final Injector myInjector;
private IExtensionTemplatesProvider myExtensionTemplateProvider = null;
public CodegenEmittersWithXtend2(GenEditorGenerator genModel) {
this(!genModel.isDynamicTemplates(), genModel.getTemplateDirectory(), genModel.getModelAccess() != null);
}
public CodegenEmittersWithXtend2(boolean useBaseTemplatesOnly, String templateDirectory, boolean includeDynamicModelTemplates) {
super(useBaseTemplatesOnly, templateDirectory, includeDynamicModelTemplates);
if (templateDirectory != null && !templateDirectory.isEmpty()) {
myExtensionTemplateProvider = new ExtensionTemplatesProviderImpl(templateDirectory,!useBaseTemplatesOnly);
}
myInjector = Guice.createInjector(new GMFGeneratorModule(myExtensionTemplateProvider));
}
//-----------------------------------------------------------------------------------------
/**
* FIXME: [MG] make separate xtend templates calling shared code, not vise versa
*/
@Override
public JavaClassEmitter getTextNonResizableEditPolicyEmitter() throws UnexpectedBehaviourException {
return getXtendEmitter("xpt::diagram::editpolicies::TextNonResizableEditPolicy", "TextNonResizableEditPolicy"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* FIXME: [MG] make separate xtend templates calling shared code, not vise versa
*/
@Override
public JavaClassEmitter getTextSelectionEditPolicyEmitter() throws UnexpectedBehaviourException {
return getXtendEmitter("xpt::diagram::editpolicies::TextSelectionEditPolicy", "TextSelectionEditPolicy"); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
public JavaClassEmitter getPropertySheetLabelProviderEmitter() throws UnexpectedBehaviourException {
return getXtendEmitter("xpt::propsheet::LabelProvider", "LabelProvider"); //$NON-NLS-1$
}
@Override
public JavaClassEmitter getPropertySectionEmitter() throws UnexpectedBehaviourException {
return getXtendEmitter("xpt::propsheet::PropertySection", "PropertySection"); //$NON-NLS-1$
}
@Override
public JavaClassEmitter getModelAccessFacilityEmitter() {
return getXtendEmitter("metamodel::Facility", "Main");
}
private JavaClassEmitter getXtendEmitter(String templateFqn, String mainMethod) {
String classFqn = templateFqn.replace("::", ".");
Class<?> clazz = null;
try {
clazz = Class.forName(classFqn);
} catch (ClassNotFoundException e) {
if (myExtensionTemplateProvider != null) {
List<Class<?>> customClasses = myExtensionTemplateProvider.getCustomTemplateClasses();
for (Class<?> _class : customClasses) {
String name = _class.getName();
if (name.equals(classFqn)) {
clazz = _class;
break;
}
}
}
if (clazz == null) {
throw new IllegalStateException("Can't load: " + classFqn, e);
}
}
return new Xtend2ClassEmitter(myInjector, clazz, mainMethod);
}
public void disposeEmitters() {
if (myExtensionTemplateProvider != null) {
myExtensionTemplateProvider.dispose();
}
}
@Override
protected JavaClassEmitter createJavaClassEmitter(String templateName, String mainMethod) {
return getXtendEmitter(templateName, mainMethod);
}
}