/* * Copyright (c) 2005, 2010 Borland Software Corporation 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 * * Contributors: * Artem Tikhomirov (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.codegen.lite; import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.emf.codegen.util.CodeGenUtil; import org.eclipse.emf.common.util.EList; import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage; import org.eclipse.gmf.codegen.gmfgen.GenApplication; import org.eclipse.gmf.codegen.gmfgen.GenChildLabelNode; import org.eclipse.gmf.codegen.gmfgen.GenChildSideAffixedNode; import org.eclipse.gmf.codegen.gmfgen.GenCommonBase; import org.eclipse.gmf.codegen.gmfgen.GenCompartment; import org.eclipse.gmf.codegen.gmfgen.GenContainerBase; import org.eclipse.gmf.codegen.gmfgen.GenCustomPropertyTab; import org.eclipse.gmf.codegen.gmfgen.GenDiagram; import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator; import org.eclipse.gmf.codegen.gmfgen.GenExpressionInterpreter; import org.eclipse.gmf.codegen.gmfgen.GenExpressionProviderBase; import org.eclipse.gmf.codegen.gmfgen.GenExpressionProviderContainer; import org.eclipse.gmf.codegen.gmfgen.GenLanguage; import org.eclipse.gmf.codegen.gmfgen.GenLink; import org.eclipse.gmf.codegen.gmfgen.GenLinkLabel; import org.eclipse.gmf.codegen.gmfgen.GenNavigatorChildReference; import org.eclipse.gmf.codegen.gmfgen.GenNode; import org.eclipse.gmf.codegen.gmfgen.GenNodeLabel; import org.eclipse.gmf.codegen.gmfgen.GenPreferencePage; import org.eclipse.gmf.codegen.gmfgen.GenPropertyTab; import org.eclipse.gmf.codegen.gmfgen.GenStandardPreferencePage; import org.eclipse.gmf.codegen.gmfgen.OpenDiagramBehaviour; import org.eclipse.gmf.common.UnexpectedBehaviourException; import org.eclipse.gmf.common.codegen.ImportAssistant; import org.eclipse.gmf.internal.common.codegen.GeneratorBase; import org.eclipse.gmf.internal.common.codegen.TextEmitter; import org.eclipse.gmf.internal.common.codegen.TextMerger; /** * Invokes templates to populate diagram editor project. * TODO reuse fullRT.Generator as much as possible * @author artem */ public class Generator extends GeneratorBase implements Runnable { private final GenEditorGenerator myEditorGen; private final GenDiagram myDiagram; private final CodegenEmitters myEmitters; public Generator(GenEditorGenerator genModel) { this(genModel, Activator.getInstance().getEmitters(genModel)); } public Generator(GenEditorGenerator genModel, CodegenEmitters emitters) { assert genModel != null && emitters != null; myDiagram = genModel.getDiagram(); myEditorGen = genModel; myEmitters = emitters; } @Override protected TextMerger createMergeService() { return myEmitters.createMergeService(); } protected void customRun() throws InterruptedException, UnexpectedBehaviourException { final Path pluginDirectory = new Path(myEditorGen.getPluginDirectory()); final Path examplaryLocation = new Path(myEditorGen.getDomainGenModel().getModelDirectory()); initializeEditorProject(pluginDirectory, guessNewProjectLocation(examplaryLocation, pluginDirectory.segment(0)), Collections.<IProject>emptyList()); doGenerateFile(myEmitters.getManifestGenerator(), new Path("META-INF/MANIFEST.MF"), new Object[] { myEditorGen.getPlugin() }); doGenerateFile(myEmitters.getBuildPropertiesGenerator(), new Path("build.properties"), new Object[] { myEditorGen.getPlugin() }); doGenerateFile(myEmitters.getPluginXML(), new Path("plugin.xml"), new Object[] { myEditorGen.getPlugin() }); doGenerateFile(myEmitters.getPluginPropertiesGenerator(), new Path("plugin.properties"), new Object[] { myEditorGen.getPlugin() }); internalGenerateJavaClass(myEmitters.getCreationWizardGenerator(), myDiagram.getCreationWizardQualifiedClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getCreationWizardPageGenerator(), myDiagram.getCreationWizardPageQualifiedClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getPluginGenerator(), myEditorGen.getPlugin().getActivatorQualifiedClassName(), myEditorGen.getPlugin()); internalGenerateJavaClass(myEmitters.getInitDiagramFileActionGenerator(), myDiagram.getInitDiagramFileActionQualifiedClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getModelElementSelectionPageEmitter(), myEmitters.getModelElementSelectionPageQualifiedNameEmitter(), myDiagram); internalGenerateJavaClass(myEmitters.getNewDiagramFileWizardGenerator(), myDiagram.getNewDiagramFileWizardQualifiedClassName(), myDiagram); if (myEditorGen.getApplication() != null) { internalGenerateJavaClass(myEmitters.getURISelectorPageGenerator(), myEmitters.getURISelectorPageQualifiedClassNameGenerator(), myDiagram); } if (myDiagram.generateCreateShortcutAction()) { internalGenerateJavaClass(myEmitters.getCreateShortcutActionEmitter(), myDiagram.getCreateShortcutActionQualifiedClassName(), myDiagram); if (myEditorGen.getApplication() != null) { internalGenerateJavaClass(myEmitters.getShortcutCreationWizardEmitter(), myEmitters.getShortcutCreationWizardQualifiedClassNameEmitter(), myDiagram); } else { internalGenerateJavaClass(myEmitters.getElementChooserEmitter(), myDiagram.getElementChooserQualifiedClassName(), myDiagram); } } if (myDiagram.generateShortcutIcon()) { internalGenerateJavaClass(myEmitters.getShortcutProviderEmitter(), myEmitters.getShortcutProviderQualifiedClassNameEmitter(), myDiagram); internalGenerateJavaClass(myEmitters.getCreateShortcutNodeCommandEmitter(), myEmitters.getCreateShortcutNodeCommandQualifiedClassNameEmitter(), myDiagram); internalGenerateJavaClass(myEmitters.getCreateShortcutEdgeCommandEmitter(), myEmitters.getCreateShortcutEdgeCommandQualifiedClassNameEmitter(), myDiagram); generateShortcutIcon(); if (myEditorGen.getApplication() == null) { internalGenerateJavaClass(myEmitters.getShortcutPropertyTesterEmitter(), myDiagram.getShortcutPropertyTesterQualifiedClassName(), myDiagram); } } internalGenerateJavaClass(myEmitters.getLoadResourceActionGenerator(), myDiagram.getLoadResourceActionQualifiedClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getElementTypesGenerator(), myDiagram.getElementTypesQualifiedClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getActionBarContributorGenerator(), myEditorGen.getEditor().getActionBarContributorQualifiedClassName(), myEditorGen.getEditor()); internalGenerateJavaClass(myEmitters.getDiagramEditorUtilGenerator(), myDiagram.getDiagramEditorUtilQualifiedClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getEditorGenerator(), myEditorGen.getEditor().getQualifiedClassName(), myEditorGen.getEditor()); if (myEditorGen.getEditor().isEclipseEditor()) { internalGenerateJavaClass(myEmitters.getMatchingStrategyEmitter(), myDiagram.getMatchingStrategyQualifiedClassName(), myDiagram); } if (myEditorGen.getApplication() == null && !myEditorGen.getEditor().isEclipseEditor()) { internalGenerateJavaClass(myEmitters.getOpenDiagramInViewActionGenerator(), myEmitters.getOpenDiagramInViewActionQualifiedClassNameGenerator(), myEditorGen.getEditor()); } if (myDiagram.getPalette() != null) { internalGenerateJavaClass(myEmitters.getPaletteFactoryGenerator(), myDiagram.getPalette().getFactoryQualifiedClassName(), myDiagram.getPalette()); } internalGenerateJavaClass(myEmitters.getEditPartFactoryGenerator(), myDiagram.getEditPartFactoryQualifiedClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getDiagramEditPartGenerator(), myDiagram.getEditPartQualifiedClassName(), myDiagram); HashSet<OpenDiagramBehaviour> openDiagramBehaviors = new HashSet<OpenDiagramBehaviour>(); generateBehaviors(myDiagram, openDiagramBehaviors); generateLayoutEditPolicy(myDiagram); if (myDiagram.isValidationEnabled() || myEditorGen.hasAudits()) { generateValidationProvider(); if (myDiagram.getEditorGen().getApplication() == null) { //Strictly non-RCP stuff generateMarkerNavigationProvider(); } } if (myDiagram.getEditorGen().getMetrics() != null) { generateMetricProvider(); } for (GenNode next : (List<? extends GenNode>) myDiagram.getAllNodes()) { if (!(next instanceof GenChildLabelNode)) { internalGenerateJavaClass(myEmitters.getNodeEditPartGenerator(), next.getEditPartQualifiedClassName(), next); generateGraphicalEditPolicy(next); for (GenNodeLabel label : next.getLabels()) { internalGenerateJavaClass(myEmitters.getNodeLabelEditPartGenerator(), label.getEditPartQualifiedClassName(), label); internalGenerateJavaClass(myEmitters.getViewFactoryGenerator(), label.getNotationViewFactoryQualifiedClassName(), label); } } else { internalGenerateJavaClass(myEmitters.getChildNodeEditPartGenerator(), next.getEditPartQualifiedClassName(), next); } internalGenerateJavaClass(myEmitters.getViewFactoryGenerator(), next.getNotationViewFactoryQualifiedClassName(), next); generateBehaviors(next, openDiagramBehaviors); generateCommands(next); generateComponentEditPolicy(next); boolean shouldGenerateLayoutEditPolicy = false; boolean shouldGenerateSideAffixedLayoutEditPolicy = false; for (GenNode nextChild : next.getChildNodes()) { if (nextChild instanceof GenChildSideAffixedNode) { shouldGenerateSideAffixedLayoutEditPolicy = true; } else { shouldGenerateLayoutEditPolicy = true; } } if (shouldGenerateLayoutEditPolicy) { generateLayoutEditPolicy(next); } if (shouldGenerateSideAffixedLayoutEditPolicy) { generateSideAffixedLayoutEditPolicy(next); } } for (GenLink next : (List<? extends GenLink>) myDiagram.getLinks()) { internalGenerateJavaClass(myEmitters.getLinkEditPartGenerator(), next.getEditPartQualifiedClassName(), next); generateGraphicalEditPolicy(next); if (next.getLabels().size() > 0) { generateConnectionEndpointEditPolicy(next); } for (GenLinkLabel label : (List<? extends GenLinkLabel>) next.getLabels()) { internalGenerateJavaClass(myEmitters.getLinkLabelEditPartGenerator(), label.getEditPartQualifiedClassName(), label); internalGenerateJavaClass(myEmitters.getViewFactoryGenerator(), label.getNotationViewFactoryQualifiedClassName(), label); } internalGenerateJavaClass(myEmitters.getViewFactoryGenerator(), next.getNotationViewFactoryQualifiedClassName(), next); generateBehaviors(next, openDiagramBehaviors); generateCommands(next); generateComponentEditPolicy(next); } for (GenCompartment next : myDiagram.getCompartments()) { internalGenerateJavaClass(myEmitters.getCompartmentEditPartGenerator(), next.getEditPartQualifiedClassName(), next); internalGenerateJavaClass(myEmitters.getViewFactoryGenerator(), next.getNotationViewFactoryQualifiedClassName(), next); generateLayoutEditPolicy(next); } internalGenerateJavaClass(myEmitters.getViewFactoryGenerator(), myDiagram.getNotationViewFactoryQualifiedClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getDomainElementInitializerGenerator(), myEmitters.getDomainElementInitializerQualifiedNameGenerator(), myDiagram); internalGenerateJavaClass(myEmitters.getVisualIDRegistryGenerator(), myDiagram.getVisualIDRegistryQualifiedClassName(), myDiagram); if(myDiagram.getEditorGen().getExpressionProviders() != null) { generateExpressionProviders(); } if (isPathInsideGenerationTarget(myDiagram.getCreationWizardIconPathX())) { // at the moment this may produce path that reference generated icon file, thus // skip generation if the path is relative generateDiagramIcon(myDiagram.getCreationWizardIconPathX()); } if (isPathInsideGenerationTarget(myEditorGen.getEditor().getIconPathX())) { // at the moment this may produce path that reference generated icon file, thus // skip generation if the path is relative generateDiagramIcon(myEditorGen.getEditor().getIconPathX()); } generateWizardBanner(); if (myEditorGen.getApplication() == null && myEditorGen.getNavigator() != null) { generateNavigatorContentProvider(); generateNavigatorLabelProvider(); generateNavigatorLinkHelper(); generateNavigatorSorter(); generateNavigatorActionProvider(); generateAbstractNavigatorItem(); generateNavigatorGroup(); generateNavigatorItem(); generateNavigatorGroupIcons(); if (myEditorGen.getDomainGenModel() != null && myEditorGen.getNavigator().isGenerateDomainModelNavigator()) { generateDomainNavigatorContentProvider(); generateDomainNavigatorLabelProvider(); generateDomainNavigatorItem(); generateURIEditorInputTester(); } } if (myEditorGen.getPropertySheet() != null) { generatePropertySheetSections(); } generateApplication(); generatePreferences(); generateExternalizationSupport(); } private static boolean isPathInsideGenerationTarget(String path) { assert path != null; Path p = new Path(path); return !p.isAbsolute() && !p.segment(0).equals(".."); //$NON-NLS-1$ } private void generateExpressionProviders() throws UnexpectedBehaviourException, InterruptedException { GenExpressionProviderContainer providerContainer = myEditorGen.getExpressionProviders(); internalGenerateJavaClass( myEmitters.getAbstractExpressionEmitter(), providerContainer.getExpressionsPackageName(), providerContainer.getAbstractExpressionClassName(), myDiagram ); for (GenExpressionProviderBase nextProvider : (List<? extends GenExpressionProviderBase>) providerContainer.getProviders()) { if(nextProvider instanceof GenExpressionInterpreter) { TextEmitter providerEmitter = null; if(GenLanguage.OCL_LITERAL.equals(nextProvider.getLanguage())) { providerEmitter = myEmitters.getOCLExpressionFactoryEmitter(); } else if(GenLanguage.REGEXP_LITERAL.equals(nextProvider.getLanguage()) || GenLanguage.NREGEXP_LITERAL.equals(nextProvider.getLanguage())) { providerEmitter = myEmitters.getRegexpExpressionFactoryEmitter(); } GenExpressionInterpreter interpreter = (GenExpressionInterpreter)nextProvider; if(providerEmitter != null) { internalGenerateJavaClass( providerEmitter, providerContainer.getExpressionsPackageName(), interpreter.getClassName(), interpreter); } } } } private void generateShortcutIcon() throws UnexpectedBehaviourException, InterruptedException { doGenerateBinaryFile(myEmitters.getShortcutImageEmitter(), new Path("icons/shortcut.gif"), null); //$NON-NLS-1$ } private void generateDiagramIcon(String path) throws UnexpectedBehaviourException, InterruptedException { // use genModel.prefix if available to match colors of model icons and diagram icons // @see GenPackageImpl#generateEditor - it passes prefix to ModelGIFEmitter Object[] args = new Object[] {myDiagram.getDomainDiagramElement() == null ? myEditorGen.getDiagramFileExtension() : myDiagram.getDomainDiagramElement().getGenPackage().getPrefix() }; doGenerateBinaryFile(myEmitters.getDiagramIconEmitter(), new Path(path), args); } private void generateWizardBanner() throws UnexpectedBehaviourException, InterruptedException { // @see GenPackageImpl#generateEditor - it passes prefix to ModelWizardGIFEmitter try { Object[] args = new Object[] {myEmitters.getWizardBannerStemEmitter().generate(new NullProgressMonitor(), new Object[] {myDiagram}) }; String path = myEmitters.getWizardBannerLocationEmitter().generate(new NullProgressMonitor(), new Object[] {myDiagram}); doGenerateBinaryFile(myEmitters.getWizardBannerImageEmitter(), new Path(path), args); } catch (InvocationTargetException e) { handleException(e); } } private void generateBehaviors(GenCommonBase element, HashSet<OpenDiagramBehaviour> generatedBehaviors) throws UnexpectedBehaviourException, InterruptedException { for (OpenDiagramBehaviour behaviour : element.getBehaviour(OpenDiagramBehaviour.class)) { if (!generatedBehaviors.contains(behaviour)) { generatedBehaviors.add(behaviour); generateOpenDiagramEditPolicy(behaviour); } } } private void generateValidationProvider() throws UnexpectedBehaviourException, InterruptedException { internalGenerateJavaClass( myEmitters.getValidationProviderGenerator(), myDiagram.getProvidersPackageName(), myDiagram.getValidationProviderClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getValidateActionGenerator(), myEmitters.getValidateActionQualifiedNameGenerator(), myDiagram); } private void generateMarkerNavigationProvider() throws UnexpectedBehaviourException, InterruptedException { internalGenerateJavaClass( myEmitters.getMarkerNavigationProviderEmitter(), myDiagram.getProvidersPackageName(), myDiagram.getMarkerNavigationProviderClassName(), myDiagram); } private void generateMetricProvider() throws UnexpectedBehaviourException, InterruptedException { internalGenerateJavaClass( myEmitters.getMetricProviderEmitter(), myDiagram.getProvidersPackageName(), myDiagram.getMetricProviderClassName(), myDiagram); internalGenerateJavaClass(myEmitters.getMetricsActionEmitter(), myEmitters.getMetricsActionQualifiedNameEmitter(), myDiagram); } private void generateOpenDiagramEditPolicy(OpenDiagramBehaviour behaviour) throws UnexpectedBehaviourException, InterruptedException { internalGenerateJavaClass(myEmitters.getOpenDiagramEditPolicyEmitter(), behaviour.getEditPolicyQualifiedClassName(), behaviour); } private void generateCommands(GenNode genNode) throws UnexpectedBehaviourException, InterruptedException { if (!genNode.getDomainMetaClass().isAbstract()) { internalGenerateJavaClass(myEmitters.getCreateNodeCommandEmitter(), myEmitters.getCreateNodeCommandQualifiedClassNameEmitter(), genNode); } internalGenerateJavaClass(myEmitters.getAddNodeCommandEmitter(), myEmitters.getAddNodeCommandQualifiedClassNameEmitter(), genNode); internalGenerateJavaClass(myEmitters.getCloneNodeCommandEmitter(), myEmitters.getCloneNodeCommandQualifiedClassNameEmitter(), genNode); } private void generateCommands(GenLink genLink) throws UnexpectedBehaviourException, InterruptedException { if (!genLink.isViewDirectionAlignedWithModel()) { return; } internalGenerateJavaClass(myEmitters.getCreateLinkStartCommandEmitter(), myEmitters.getCreateLinkStartCommandQualifiedClassNameEmitter(), genLink); internalGenerateJavaClass(myEmitters.getCreateLinkCompleteCommandEmitter(), myEmitters.getCreateLinkCompleteCommandQualifiedClassNameEmitter(), genLink); internalGenerateJavaClass(myEmitters.getReconnectLinkSourceCommandEmitter(), myEmitters.getReconnectLinkSourceCommandQualifiedClassNameEmitter(), genLink); internalGenerateJavaClass(myEmitters.getReconnectLinkTargetCommandEmitter(), myEmitters.getReconnectLinkTargetCommandQualifiedClassNameEmitter(), genLink); } private void generateLayoutEditPolicy(GenContainerBase containerBase) throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass(myEmitters.getLayoutEditPolicyEmitter(), myEmitters.getLayoutEditPolicyQualifiedClassNameEmitter(), containerBase); } private void generateSideAffixedLayoutEditPolicy(GenNode node) throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass(myEmitters.getSideAffixedLayoutEditPolicyEmitter(), myEmitters.getSideAffixedLayoutEditPolicyQualifiedClassNameEmitter(), node); } private void generateGraphicalEditPolicy(GenNode genNode) throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass(myEmitters.getGraphicalEditPolicyEmitter(), genNode.getGraphicalNodeEditPolicyQualifiedClassName(), genNode); } private void generateGraphicalEditPolicy(GenLink genLink) throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass(myEmitters.getGraphicalEditPolicyEmitter(), myEmitters.getGraphicalEditPolicyQualifiedClassNameEmitter(), genLink); } private void generateComponentEditPolicy(GenCommonBase genElement) throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass(myEmitters.getComponentEditPolicyEmitter(), myEmitters.getComponentEditPolicyQualifiedClassNameEmitter(), genElement); } private void generateConnectionEndpointEditPolicy(GenLink genLink) throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass(myEmitters.getConnectionEndpointEditPolicyEmitter(), myEmitters.getConnectionEndpointEditPolicyQualifiedClassNameEmitter(), genLink); } private void generateNavigatorContentProvider() throws InterruptedException { internalGenerateJavaClass( myEmitters.getNavigatorContentProviderEmitter(), myEditorGen.getNavigator().getPackageName(), myEditorGen.getNavigator().getContentProviderClassName(), myEditorGen.getNavigator() ); } private void generateDomainNavigatorContentProvider() throws InterruptedException { doGenerateJavaClass(myEmitters.getDomainNavigatorContentProviderEmitter(), myEditorGen.getNavigator().getDomainContentProviderQualifiedClassName(), myEditorGen.getNavigator()); } private void generateDomainNavigatorLabelProvider() throws InterruptedException { doGenerateJavaClass(myEmitters.getDomainNavigatorLabelProviderEmitter(), myEditorGen.getNavigator().getDomainLabelProviderQualifiedClassName(), myEditorGen.getNavigator()); } private void generateDomainNavigatorItem() throws InterruptedException { doGenerateJavaClass(myEmitters.getDomainNavigatorItemEmitter(), myEditorGen.getNavigator().getDomainNavigatorItemQualifiedClassName(), myEditorGen.getNavigator()); } private void generateURIEditorInputTester() throws InterruptedException { doGenerateJavaClass(myEmitters.getURIEditorInputTesterEmitter(), myEditorGen.getNavigator().getUriInputTesterQualifiedClassName(), myEditorGen.getNavigator()); } private void generateNavigatorLabelProvider() throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass( myEmitters.getNavigatorLabelProviderEmitter(), myEditorGen.getNavigator().getPackageName(), myEditorGen.getNavigator().getLabelProviderClassName(), myEditorGen.getNavigator() ); } private void generateNavigatorLinkHelper() throws InterruptedException { if (!myEditorGen.getEditor().isEclipseEditor()) { return; } internalGenerateJavaClass( myEmitters.getNavigatorLinkHelperEmitter(), myEditorGen.getNavigator().getPackageName(), myEditorGen.getNavigator().getLinkHelperClassName(), myEditorGen.getNavigator() ); } private void generateNavigatorSorter() throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass( myEmitters.getNavigatorSorterEmitter(), myEditorGen.getNavigator().getPackageName(), myEditorGen.getNavigator().getSorterClassName(), myEditorGen.getNavigator() ); } private void generateNavigatorActionProvider() throws InterruptedException, UnexpectedBehaviourException { internalGenerateJavaClass( myEmitters.getNavigatorActionProviderEmitter(), myEditorGen.getNavigator().getPackageName(), myEditorGen.getNavigator().getActionProviderClassName(), myEditorGen.getNavigator() ); } private void generateAbstractNavigatorItem() throws InterruptedException, UnexpectedBehaviourException { doGenerateJavaClass( myEmitters.getAbstractNavigatorItemEmitter(), myEditorGen.getNavigator().getPackageName(), myEditorGen.getNavigator().getAbstractNavigatorItemClassName(), myEditorGen.getNavigator() ); } private void generateNavigatorGroup() throws InterruptedException { internalGenerateJavaClass( myEmitters.getNavigatorGroupEmitter(), myEditorGen.getNavigator().getPackageName(), myEditorGen.getNavigator().getNavigatorGroupClassName(), myEditorGen.getNavigator() ); } private void generateNavigatorItem() throws InterruptedException { internalGenerateJavaClass( myEmitters.getNavigatorItemEmitter(), myEditorGen.getNavigator().getPackageName(), myEditorGen.getNavigator().getNavigatorItemClassName(), myEditorGen.getNavigator() ); } private void generateNavigatorGroupIcons() throws InterruptedException, UnexpectedBehaviourException { Set<String> groupIcons = new HashSet<String>(); for (GenNavigatorChildReference nextReference : (List<? extends GenNavigatorChildReference>) myEditorGen.getNavigator().getChildReferences()) { if (nextReference.getGroupIcon() != null && nextReference.getGroupIcon().length() > 0) { groupIcons.add(nextReference.getGroupIcon()); } } for (String iconPath : groupIcons) { generateGroupIcon(new Path(iconPath)); } } private void generateGroupIcon(Path groupIconPath) throws InterruptedException, UnexpectedBehaviourException { doGenerateBinaryFile(myEmitters.getGroupIconEmitter(), groupIconPath, null); } protected void generatePropertySheetSections() throws UnexpectedBehaviourException, InterruptedException { if (myEditorGen.getPropertySheet().isNeedsCaption()) { doGenerateJavaClass( myEmitters.getPropertySheetLabelProviderEmitter(), myEditorGen.getPropertySheet().getLabelProviderQualifiedClassName(), myEditorGen.getPropertySheet()); } for (GenPropertyTab tab : (List<? extends GenPropertyTab>) myEditorGen.getPropertySheet().getTabs()) { if (tab instanceof GenCustomPropertyTab) { doGenerateJavaClass( myEmitters.getPropertySectionEmitter(), ((GenCustomPropertyTab) tab).getQualifiedClassName(), tab); } } } private void generateApplication() throws UnexpectedBehaviourException, InterruptedException { GenApplication application = myEditorGen.getApplication(); if (application != null) { doGenerateJavaClass(myEmitters.getApplicationEmitter(), application.getQualifiedClassName(), application); doGenerateJavaClass(myEmitters.getActionBarAdvisorEmitter(), application.getActionBarAdvisorQualifiedClassName(), application); doGenerateJavaClass(myEmitters.getPerspectiveEmitter(), application.getPerspectiveQualifiedClassName(), application); doGenerateJavaClass(myEmitters.getWorkbenchAdvisorEmitter(), application.getWorkbenchAdvisorQualifiedClassName(), application); doGenerateJavaClass(myEmitters.getWorkbenchWindowAdvisorEmitter(), application.getWorkbenchWindowAdvisorQualifiedClassName(), application); } } private void generatePreferences() throws UnexpectedBehaviourException, InterruptedException { generatePreferences(myDiagram.getPreferencePages()); } private void generatePreferences(EList<GenPreferencePage> pages) throws UnexpectedBehaviourException, InterruptedException { for (GenPreferencePage preferencePage : pages) { if (preferencePage instanceof GenStandardPreferencePage) { generatePreferencePage((GenStandardPreferencePage) preferencePage); } generatePreferences(preferencePage.getChildren()); } } private void generatePreferencePage(GenStandardPreferencePage preferencePage) throws UnexpectedBehaviourException, InterruptedException { switch (preferencePage.getKind()) { case APPEARANCE_LITERAL: internalGenerateJavaClass(myEmitters.getAppearancePreferencePageEmitter(), myEmitters.getAppearancePreferencePageQualifiedClassNameEmitter(), myDiagram); break; case GENERAL_LITERAL: internalGenerateJavaClass(myEmitters.getGeneralPreferencePageEmitter(), myEmitters.getGeneralPreferencePageQualifiedClassNameEmitter(), myDiagram); break; //TODO support more standard preference pages. } } private void generateExternalizationSupport() throws UnexpectedBehaviourException, InterruptedException { String packageName = myEditorGen.getEditor().getPackageName(); String messagesClassName = "Messages"; doGenerateJavaClass(myEmitters.getExternalizeEmitter(), packageName, messagesClassName, new Object[] { myEditorGen }); doGenerateFile(myEmitters.getMessagesEmitter(), new Path(messagesClassName.toLowerCase()+".properties"), new Object[] { myEditorGen }); } private void internalGenerateJavaClass(TextEmitter emitter, String qualifiedClassName, Object argument) throws InterruptedException { internalGenerateJavaClass(emitter, CodeGenUtil.getPackageName(qualifiedClassName), CodeGenUtil.getSimpleClassName(qualifiedClassName), argument); } private void internalGenerateJavaClass(TextEmitter emitter, TextEmitter qualifiedClassNameEmitter, Object argument) throws InterruptedException { String qualifiedClassName = null; try { qualifiedClassName = qualifiedClassNameEmitter.generate(new NullProgressMonitor(), new Object[] {argument}); } catch (InvocationTargetException e) { handleException(e); } catch (UnexpectedBehaviourException e) { handleException(e); } internalGenerateJavaClass(emitter, qualifiedClassName, argument); } /** * Passes initialized ImportManager as second template argument */ private void internalGenerateJavaClass(TextEmitter emitter, String packageName, String className, Object argument) throws InterruptedException { ImportAssistant importUtil = createImportAssistant(packageName, className); doGenerateJavaClass(emitter, packageName, className, argument, importUtil); } protected void setupProgressMonitor() { Counter c = new Counter(); c.registerFactor(GMFGenPackage.eINSTANCE.getGenNode(), 2); c.registerFactor(GMFGenPackage.eINSTANCE.getGenCompartment(), 2); c.registerFactor(GMFGenPackage.eINSTANCE.getGenLink(), 2); c.registerFactor(GMFGenPackage.eINSTANCE.getGenNodeLabel(), 2); c.registerFactor(GMFGenPackage.eINSTANCE.getGenLinkLabel(), 2); int total = c.getTotal(myDiagram); total++; // init total += 4; // text files total += 15; // out-of-cycle doGenerateJava... <- genDiagram + genEditor setupProgressMonitor(null, total); } }