diff --git a/plugins/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF b/plugins/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF index c55856c41..76fb8f231 100644 --- a/plugins/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF @@ -44,6 +44,7 @@ Export-Package: org.eclipse.xtext.xtext.generator, org.eclipse.xtext.xtext.generator.scoping, org.eclipse.xtext.xtext.generator.types, org.eclipse.xtext.xtext.generator.ui.contentAssist, + org.eclipse.xtext.xtext.generator.ui.labeling, org.eclipse.xtext.xtext.generator.ui.outline, org.eclipse.xtext.xtext.generator.ui.quickfix, org.eclipse.xtext.xtext.generator.util, diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend new file mode 100644 index 000000000..4859ab7b6 --- /dev/null +++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend @@ -0,0 +1,228 @@ +/******************************************************************************* + * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. + * 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 + *******************************************************************************/ +package org.eclipse.xtext.xtext.generator.ui.labeling + +import com.google.inject.Inject +import org.eclipse.xtend.lib.annotations.Accessors +import org.eclipse.xtext.Grammar +import org.eclipse.xtext.xtext.generator.AbstractGeneratorFragment2 +import org.eclipse.xtext.xtext.generator.CodeConfig +import org.eclipse.xtext.xtext.generator.XtextGeneratorNaming +import org.eclipse.xtext.xtext.generator.model.FileAccessFactory +import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess +import org.eclipse.xtext.xtext.generator.model.TypeReference +import org.eclipse.xtext.xtext.generator.xbase.XbaseUsageDetector + +import static extension org.eclipse.xtext.GrammarUtil.* + +/** + * Contributes the Labeling provider stub, either in Xtend or Java language. + * + * @author Christian Schneider - Initial contribution and API + */ +class LabelProviderFragment2 extends AbstractGeneratorFragment2 { + + private static val XBASE_LABEL_PROVIDER = + "org.eclipse.xtext.xbase.ui.labeling.XbaseLabelProvider" + + private static val XBASE_DESCRIPTION_LABEL_PROVIDER = + "org.eclipse.xtext.xbase.ui.labeling.XbaseDescriptionLabelProvider" + + @Inject + extension XtextGeneratorNaming + + @Inject + extension XbaseUsageDetector + + @Inject + extension CodeConfig + + @Inject + FileAccessFactory fileAccessFactory + + @Accessors + private boolean generateStub = true; + + def protected TypeReference getEObjectLabelProviderClass(Grammar g) { + return new TypeReference( + g.eclipsePluginBasePackage + ".labeling." + g.simpleName + "LabelProvider" + ) + } + + def protected TypeReference getEObjectLabelProviderSuperClass(Grammar g) { + if (g.inheritsXbase) + new TypeReference(XBASE_LABEL_PROVIDER) + else defaultEObjectLabelProviderSuperClass + } + + /** + * Extra getter facilitates customization by overriding. + */ + def protected TypeReference getDefaultEObjectLabelProviderSuperClass() { + new TypeReference("org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider") + } + + + def protected TypeReference getDescriptionLabelProviderClass(Grammar g) { + return new TypeReference( + g.eclipsePluginBasePackage + ".labeling." + g.simpleName + "DescriptionLabelProvider" + ) + } + + def protected TypeReference getDescriptionLabelProviderSuperClass(Grammar g) { + if (g.inheritsXbase) + new TypeReference(XBASE_DESCRIPTION_LABEL_PROVIDER) + else defaultDescriptionLabelProviderSuperClass + } + + /** + * Extra getter facilitates customization by overriding. + */ + def protected TypeReference getDefaultDescriptionLabelProviderSuperClass() { + new TypeReference("org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider") + } + + + override generate() { + if (generateStub || grammar.inheritsXbase) { + + if (projectConfig.eclipsePluginManifest != null) { + projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui" + } + + val labelProviderClass = + if (generateStub) grammar.EObjectLabelProviderClass + else new TypeReference(XBASE_LABEL_PROVIDER) + + val descriptionLabelProviderClass = + if (generateStub) grammar.descriptionLabelProviderClass + else new TypeReference(XBASE_DESCRIPTION_LABEL_PROVIDER) + + val iLabelProviderClass = new TypeReference("org.eclipse.jface.viewers.ILabelProvider") + val rsdLabelProviderClass = + new TypeReference("org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider") + + new GuiceModuleAccess.BindingFactory() + .addTypeToType(iLabelProviderClass, labelProviderClass) + .addConfiguredBinding("ResourceUIServiceLabelProvider", ''' + binder.bind(«iLabelProviderClass».class).annotatedWith(« + rsdLabelProviderClass».class).to(«descriptionLabelProviderClass».class); + ''').contributeTo(language.eclipsePluginGenModule) + } + + if (generateStub && projectConfig.eclipsePluginSrc !== null) { + if (preferXtendStubs) { + generateXtendEObjectLabelProvider + generateXtendDescriptionLabelProvider + } else { + generateJavaEObjectLabelProvider + generateJavaDescriptionLabelProvider + } + } + } + + def protected generateXtendEObjectLabelProvider() { + fileAccessFactory.createXtendFile(grammar.EObjectLabelProviderClass, ''' + /** + * Provides labels for EObjects. + * + * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider + */ + class «grammar.EObjectLabelProviderClass.simpleName» extends «grammar.EObjectLabelProviderSuperClass» { + + @«Inject» + new(«new TypeReference("org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider")» delegate) { + super(delegate); + } + + // Labels and icons can be computed like this: + + // def text(Greeting ele) { + // 'A greeting to ' + ele.name + // } + // + // def image(Greeting ele) { + // 'Greeting.gif' + // } + } + ''').writeTo(projectConfig.eclipsePluginSrc) + } + + def protected generateXtendDescriptionLabelProvider() { + fileAccessFactory.createXtendFile(grammar.descriptionLabelProviderClass, ''' + /** + * Provides labels for IEObjectDescriptions and IResourceDescriptions. + * + * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider + */ + class «grammar.descriptionLabelProviderClass.simpleName» extends «grammar.descriptionLabelProviderSuperClass» { + + // Labels and icons can be computed like this: + + // override text(IEObjectDescription ele) { + // ele.name.toString + // } + // + // override image(IEObjectDescription ele) { + // ele.EClass.name + '.gif' + // } + } + ''').writeTo(projectConfig.eclipsePluginSrc) + } + + def protected generateJavaEObjectLabelProvider() { + fileAccessFactory.createJavaFile(grammar.EObjectLabelProviderClass, ''' + /** + * Provides labels for EObjects. + * + * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider + */ + public class «grammar.EObjectLabelProviderClass.simpleName» extends «grammar.EObjectLabelProviderSuperClass» { + + @«Inject» + public «grammar.EObjectLabelProviderClass.simpleName»(« + new TypeReference("org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider") + » delegate) { + super(delegate); + } + + // Labels and icons can be computed like this: + + // String text(Greeting ele) { + // return "A greeting to " + ele.getName(); + // } + // + // String image(Greeting ele) { + // return "Greeting.gif"; + // } + } + ''').writeTo(projectConfig.eclipsePluginSrc) + } + + def protected generateJavaDescriptionLabelProvider() { + fileAccessFactory.createJavaFile(grammar.descriptionLabelProviderClass, ''' + /** + * Provides labels for IEObjectDescriptions and IResourceDescriptions. + * + * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider + */ + public class «grammar.descriptionLabelProviderClass.simpleName» extends «grammar.descriptionLabelProviderSuperClass» { + + // Labels and icons can be computed like this: + + // String text(IEObjectDescription ele) { + // return ele.getName().toString(); + // } + // + // String image(IEObjectDescription ele) { + // return ele.getEClass().getName() + ".gif"; + // } + } + ''').writeTo(projectConfig.eclipsePluginSrc) + } +} \ No newline at end of file diff --git a/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend b/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend index 9526e3e53..6b1b42a44 100644 --- a/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend +++ b/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend @@ -285,10 +285,9 @@ class RuntimeProjectDescriptor extends TestedProjectDescriptor { «IF config.uiProject.enabled» fragment = builder.BuilderIntegrationFragment2 auto-inject {} + // labeling API - fragment = adapter.FragmentAdapter { - fragment = labeling.LabelProviderFragment auto-inject {} - } + fragment = ui.labeling.LabelProviderFragment2 auto-inject {} // outline API fragment = ui.outline.OutlineTreeProviderFragment2 auto-inject {} diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 index a922a342c..bd6be0ffa 100644 --- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 +++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 @@ -85,10 +85,9 @@ Workflow { fragment = junit.Junit4Fragment2 auto-inject {} fragment = builder.BuilderIntegrationFragment2 auto-inject {} + // labeling API - fragment = adapter.FragmentAdapter { - fragment = labeling.LabelProviderFragment auto-inject {} - } + fragment = ui.labeling.LabelProviderFragment2 auto-inject {} // outline API fragment = ui.outline.OutlineTreeProviderFragment2 auto-inject {} diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 index fb6f4afc7..eb978681e 100644 --- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 +++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 @@ -91,10 +91,9 @@ Workflow { fragment = junit.Junit4Fragment2 auto-inject {} fragment = builder.BuilderIntegrationFragment2 auto-inject {} + // labeling API - fragment = adapter.FragmentAdapter { - fragment = labeling.LabelProviderFragment auto-inject {} - } + fragment = ui.labeling.LabelProviderFragment2 auto-inject {} // outline API fragment = ui.outline.OutlineTreeProviderFragment2 auto-inject {} diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 index 212b55fe4..c5ddb4385 100644 --- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 +++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 @@ -88,10 +88,9 @@ Workflow { fragment = junit.Junit4Fragment2 auto-inject {} fragment = builder.BuilderIntegrationFragment2 auto-inject {} + // labeling API - fragment = adapter.FragmentAdapter { - fragment = labeling.LabelProviderFragment auto-inject {} - } + fragment = ui.labeling.LabelProviderFragment2 auto-inject {} // outline API fragment = ui.outline.OutlineTreeProviderFragment2 auto-inject {}