/* * Copyright (c) 2006, 2007 Borland Software Corp. * * 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: * Dmitry Stadnik - initial API and implementation */ package org.eclipse.gmf.internal.bridge.wizards; import org.eclipse.core.resources.IFile; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.gmf.internal.bridge.resolver.StructureResolver; import org.eclipse.gmf.internal.bridge.ui.Plugin; import org.eclipse.gmf.internal.bridge.wizards.pages.simple.DefinitionPage; import org.eclipse.gmf.internal.bridge.wizards.pages.simple.DomainModelSelectionPage; import org.eclipse.gmf.internal.bridge.wizards.pages.simple.DomainModelSourceImpl; import org.eclipse.gmf.internal.bridge.wizards.pages.simple.StructureBuilder; import org.eclipse.gmf.internal.bridge.wizards.pages.simple.ToolDefBuilder; import org.eclipse.gmf.internal.common.URIUtil; import org.eclipse.gmf.internal.common.ui.ModelSelectionPage; import org.eclipse.gmf.internal.common.ui.ResourceLocationProvider; import org.eclipse.gmf.tooldef.ToolRegistry; import org.eclipse.gmf.tooldef.presentation.GMFToolModelWizard; /** * @author dstadnik */ public class GMFToolSimpleModelWizard extends GMFToolModelWizard { protected ModelSelectionPage toolingModelSelectionPage; protected DefinitionPage toolingDefinitionPage; protected WizardOperationMode mode = new WizardOperationMode("gmftool", WizardOperationMode.CREATE); //$NON-NLS-1$ public void setMode(String mode) { this.mode.setMode(mode); } /** * Returns true if wizard operates in reconcile mode. * Resource must be available if returns true. */ protected boolean isInReconcileMode() { return toolingModelSelectionPage != null && toolingModelSelectionPage.getResource() != null; } public boolean performFinish() { if (isInReconcileMode()) { reconcileModel(); try { WizardUtil.saveModel(getContainer(), toolingModelSelectionPage.getResource()); } catch (Exception exception) { Plugin.log(exception); return false; } IFile modelFile = getModelFile(); if (modelFile != null) { WizardUtil.openEditor(modelFile); } return true; } else { return super.performFinish(); } } protected EObject createInitialModel() { ToolDefBuilder builder = new ToolDefBuilder(null); return builder.process(toolingDefinitionPage.getModel()); } protected void reconcileModel() { ToolRegistry existingToolRegistry = null; for (EObject element : toolingModelSelectionPage.getResource().getContents()) { if (element instanceof ToolRegistry) { existingToolRegistry = (ToolRegistry) element; break; } } ToolDefBuilder builder = new ToolDefBuilder(existingToolRegistry); ToolRegistry toolRegistry = builder.process(toolingDefinitionPage.getModel()); if (toolRegistry != null && existingToolRegistry != toolRegistry) { toolingModelSelectionPage.getResource().getContents().add(toolRegistry); } } public void addPages() { ResourceLocationProvider rloc = new ResourceLocationProvider(selection); ResourceSet resourceSet = new ResourceSetImpl(); if (mode.detectReconcile(rloc)) { toolingModelSelectionPage = new ModelSelectionPage("ToolingModelSelectionPage", rloc, resourceSet, "gmftool"); //$NON-NLS-1$ //$NON-NLS-2$ toolingModelSelectionPage.setPageComplete(false); toolingModelSelectionPage.setModelRequired(true); toolingModelSelectionPage.setTitle(Messages.SimpleModelWizardToolModelSelectionPageTitle); toolingModelSelectionPage.setDescription(Messages.SimpleModelWizardToolModelSelectionPageDesc); addPage(toolingModelSelectionPage); } else { super.addPages(); if (selection != null && !selection.isEmpty()) { Object selected = selection.getFirstElement(); if (selected instanceof IFile) { newFileCreationPage.setFileName(WizardUtil.getDefaultFileName((IFile) selected, "gmftool")); //$NON-NLS-1$ } } } DomainModelSelectionPage domainModelSelectionPage = new DomainModelSelectionPage("DomainModelSelectionPage", rloc, resourceSet); //$NON-NLS-1$ domainModelSelectionPage.setTitle(Messages.SimpleModelWizardDomainModelSelectionPageTitle); domainModelSelectionPage.setDescription(Messages.SimpleModelWizardDomainModelSelectionPageDesc); addPage(domainModelSelectionPage); toolingDefinitionPage = new DefinitionPage("ToolingDefinitionPage", new StructureBuilder(new StructureResolver(), false), domainModelSelectionPage) { //$NON-NLS-1$ protected DomainModelSourceImpl createDomainModelSource(EPackage contents, EClass diagramElement) { if (isInReconcileMode()) { return new DomainModelSourceImpl(contents, diagramElement) { public boolean isDisabled(EObject domainElement) { return ToolDefBuilder.getCreationTool(toolingModelSelectionPage.getResource().getAllContents(), domainElement) != null; } }; } return super.createDomainModelSource(contents, diagramElement); } }; toolingDefinitionPage.setTitle(Messages.SimpleModelWizardToolDefinitionPageTitle); toolingDefinitionPage.setDescription(Messages.SimpleModelWizardToolDefinitionPageDesc); addPage(toolingDefinitionPage); } public IFile getModelFile() { if (isInReconcileMode()) { return URIUtil.getFile(toolingModelSelectionPage.getResource().getURI()); } return super.getModelFile(); } }