/*
* 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.gmfgraph.Canvas;
import org.eclipse.gmf.gmfgraph.presentation.GMFGraphModelWizard;
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.GraphDefBuilder;
import org.eclipse.gmf.internal.bridge.wizards.pages.simple.StructureBuilder;
import org.eclipse.gmf.internal.common.URIUtil;
import org.eclipse.gmf.internal.common.ui.ModelSelectionPage;
import org.eclipse.gmf.internal.common.ui.ResourceLocationProvider;
/**
* @author dstadnik
*/
public class GMFGraphSimpleModelWizard extends GMFGraphModelWizard {
protected ModelSelectionPage graphicalModelSelectionPage;
protected DefinitionPage graphicalDefinitionPage;
protected WizardOperationMode mode = new WizardOperationMode("gmfgraph", 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 graphicalModelSelectionPage != null && graphicalModelSelectionPage.getResource() != null;
}
public boolean performFinish() {
if (isInReconcileMode()) {
reconcileModel();
try {
WizardUtil.saveModel(getContainer(), graphicalModelSelectionPage.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() {
GraphDefBuilder builder = new GraphDefBuilder(null);
return builder.process(graphicalDefinitionPage.getModel());
}
protected void reconcileModel() {
Canvas existingCanvas = null;
for (EObject element : graphicalModelSelectionPage.getResource().getContents()) {
if (element instanceof Canvas) {
existingCanvas = (Canvas) element;
break;
}
}
GraphDefBuilder builder = new GraphDefBuilder(existingCanvas);
Canvas canvas = builder.process(graphicalDefinitionPage.getModel());
if (canvas != null && existingCanvas != canvas) {
graphicalModelSelectionPage.getResource().getContents().add(canvas);
}
}
public void addPages() {
ResourceLocationProvider rloc = new ResourceLocationProvider(selection);
ResourceSet resourceSet = new ResourceSetImpl();
if (mode.detectReconcile(rloc)) {
graphicalModelSelectionPage = new ModelSelectionPage("GraphicalModelSelectionPage", rloc, resourceSet, "gmfgraph"); //$NON-NLS-1$ //$NON-NLS-2$
graphicalModelSelectionPage.setPageComplete(false);
graphicalModelSelectionPage.setModelRequired(true);
graphicalModelSelectionPage.setTitle(Messages.SimpleModelWizardGraphModelSelectionPageTitle);
graphicalModelSelectionPage.setDescription(Messages.SimpleModelWizardGraphModelSelectionPageDesc);
addPage(graphicalModelSelectionPage);
} else {
super.addPages();
if (selection != null && !selection.isEmpty()) {
Object selected = selection.getFirstElement();
if (selected instanceof IFile) {
newFileCreationPage.setFileName(WizardUtil.getDefaultFileName((IFile) selected, "gmfgraph")); //$NON-NLS-1$
}
}
}
DomainModelSelectionPage domainModelSelectionPage = new DomainModelSelectionPage("DomainModelSelectionPage", rloc, resourceSet); //$NON-NLS-1$
domainModelSelectionPage.setTitle(Messages.SimpleModelWizardDomainModelSelectionPageTitle);
domainModelSelectionPage.setDescription(Messages.SimpleModelWizardDomainModelSelectionPageDesc);
addPage(domainModelSelectionPage);
graphicalDefinitionPage = new DefinitionPage("GraphicalDefinitionPage", new StructureBuilder(new StructureResolver(), true), domainModelSelectionPage) { //$NON-NLS-1$
protected DomainModelSourceImpl createDomainModelSource(EPackage contents, EClass diagramElement) {
if (isInReconcileMode()) {
return new DomainModelSourceImpl(contents, diagramElement) {
public boolean isDisabled(EObject domainElement) {
return GraphDefBuilder.getDiagramElement(graphicalModelSelectionPage.getResource().getAllContents(), domainElement) != null;
}
};
}
return super.createDomainModelSource(contents, diagramElement);
}
};
graphicalDefinitionPage.setTitle(Messages.SimpleModelWizardGraphDefinitionPageTitle);
graphicalDefinitionPage.setDescription(Messages.SimpleModelWizardGraphDefinitionPageDesc);
addPage(graphicalDefinitionPage);
}
public IFile getModelFile() {
if (isInReconcileMode()) {
return URIUtil.getFile(graphicalModelSelectionPage.getResource().getURI());
}
return super.getModelFile();
}
}