/* * Copyright (c) 2006, 2009 Borland Software Corporation * * 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.bridge.wizards.pages; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.ContentHandler; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; import org.eclipse.gmf.gmfgraph.Canvas; import org.eclipse.gmf.gmfgraph.provider.GMFGraphItemProviderAdapterFactory; import org.eclipse.gmf.mappings.CanvasMapping; import org.eclipse.gmf.mappings.GMFMapFactory; import org.eclipse.gmf.mappings.LinkMapping; import org.eclipse.gmf.mappings.Mapping; import org.eclipse.gmf.mappings.NodeReference; import org.eclipse.gmf.mappings.provider.GMFMapItemProviderAdapterFactory; import org.eclipse.gmf.tooldef.ToolRegistry; import org.eclipse.gmf.tooldef.provider.GMFToolItemProviderAdapterFactory; /** * @author artem */ public abstract class WizardInput { public static final String TOOLDEF_FILE_EXT = "gmftool"; //$NON-NLS-1$ public static final String GRAPHDEF_FILE_EXT = "gmfgraph"; //$NON-NLS-1$ public static final String ECORE_FILE_EXT = "ecore"; //$NON-NLS-1$ private Mapping mapInstance; private EditingDomain myEditingDomain; private AdapterFactory myAdapterFactory; private IFile myResultFile; private MapDefFeeder myFeeder; public AdapterFactory getAdapterFactory() { if (myAdapterFactory == null) { List<AdapterFactory> factories = new ArrayList<AdapterFactory>(); factories.add(new ResourceItemProviderAdapterFactory()); factories.add(new GMFMapItemProviderAdapterFactory()); factories.add(new GMFGraphItemProviderAdapterFactory()); factories.add(new GMFToolItemProviderAdapterFactory()); factories.add(new ReflectiveItemProviderAdapterFactory()); myAdapterFactory = new ComposedAdapterFactory(factories); } return myAdapterFactory; } public EditingDomain getEditingDomain() { if (myEditingDomain == null) { myEditingDomain = new AdapterFactoryEditingDomain(getAdapterFactory(), new BasicCommandStack()); } return myEditingDomain; } public ResourceSet getResourceSet() { return getEditingDomain().getResourceSet(); } public abstract EPackage getDomainModel(); public abstract Canvas getCanvasDef(); public abstract ToolRegistry getToolDef(); public abstract boolean isNewBlankToolDef(); public void setMappingFile(IFile resultFile) { // if (myResultFile != null && resultFile != myResultFile) { // // perhaps, no reason to allow even 'touch'? // throw new IllegalStateException("Did't expect file to be chosen more than once"); // } myResultFile = resultFile; } public IFile getMappingFile() { return myResultFile; } public Mapping getMapping() { if (mapInstance == null) { mapInstance = GMFMapFactory.eINSTANCE.createMapping(); URI res = URI.createPlatformResourceURI(getMappingFile().getFullPath().toString(), true); getResourceSet().createResource(res, ContentHandler.UNSPECIFIED_CONTENT_TYPE).getContents().add(mapInstance); CanvasMapping cm = GMFMapFactory.eINSTANCE.createCanvasMapping(); mapInstance.setDiagram(cm); } return mapInstance; } public void selectCanvasElement(EClass eClass) { assert eClass.getEPackage() == getDomainModel(); CanvasMapping cm = getMapping().getDiagram(); cm.setDiagramCanvas(getCanvasDef()); cm.setDomainMetaElement(eClass); cm.setDomainModel(eClass.getEPackage()); } public void feedDefaultMapping() { myFeeder = new MapDefFeeder(this, createToolDefSupplier()); myFeeder.feedDefaultMapping(); } private ToolDefSupplier createToolDefSupplier() { if (isNewBlankToolDef()) { return new CreateToolDef(getToolDef()); } else { return new ToolDefLookup(getToolDef()); } } public NodeReference[] nodeCandidates() { return myFeeder.getInitialNodes(); } public LinkMapping[] linkCandidates() { return myFeeder.getInitialLinks(); } }