/*
* 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;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.ContentHandler;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.gmf.gmfgraph.Canvas;
import org.eclipse.gmf.internal.bridge.ui.Plugin;
import org.eclipse.gmf.internal.bridge.wizards.pages.EntriesPage;
import org.eclipse.gmf.internal.bridge.wizards.pages.Messages;
import org.eclipse.gmf.internal.bridge.wizards.pages.NewMapFileCreationPage;
import org.eclipse.gmf.internal.bridge.wizards.pages.WizardInput;
import org.eclipse.gmf.internal.common.ui.ResourceLocationProvider;
import org.eclipse.gmf.mappings.CanvasMapping;
import org.eclipse.gmf.mappings.presentation.MapRefModelPages;
import org.eclipse.gmf.tooldef.GMFToolFactory;
import org.eclipse.gmf.tooldef.Palette;
import org.eclipse.gmf.tooldef.ToolRegistry;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
/**
* @author artem
*/
public class GMFMapGuideModelWizard extends Wizard implements INewWizard {
protected IStructuredSelection mySelection;
protected final WizardInput myHolder;
protected final MapRefModelPages refPages;
private IWorkbench myWorkbench;
private ToolRegistry myRegistry;
public GMFMapGuideModelWizard() {
setNeedsProgressMonitor(true);
setWindowTitle(Messages.wizardTitle);
myHolder = new WizardInput() {
public EPackage getDomainModel() {
return refPages.getDomainModel();
}
public Canvas getCanvasDef() {
return refPages.getCanvas();
}
public ToolRegistry getToolDef() {
if (isNewBlankToolDef()) {
return myRegistry;
}
Palette palette = refPages.getPalette();
if (palette == null) {
return null;
}
return (ToolRegistry) palette.eContainer();
}
public boolean isNewBlankToolDef() {
return refPages.shouldCreateNewToolingModel(false);
}
};
refPages = new MapRefModelPages(true, myHolder.getResourceSet()) {
/*
* graph page is the last since tooling should be selected
* prior to canvas update; see WizardInput.feedDefaultMapping()
*/
public void addPages(Wizard wizard, ISelection selection) {
ResourceLocationProvider rloc = new ResourceLocationProvider(selection);
addDomainPage(wizard, rloc);
addToolPage(wizard, rloc);
addGraphPage(wizard, rloc);
}
};
}
public void addPages() {
addNewFilePage();
refPages.addPages(this, mySelection);
refPages.getDomainModelSelectionPage().setModelRequired(true);
refPages.getGraphModelSelectionPage().setModelRequired(true);
refPages.getToolModelSelectionPage().setModelRequired(true);
refPages.getDomainModelExt().addObserver(new Observer() {
public void update(Observable o, Object arg) {
CanvasMapping cm = myHolder.getMapping().getDiagram();
cm.setDomainModel((EPackage) arg);
}
});
refPages.getDomainElementExt().addObserver(new Observer() {
public void update(Observable o, Object arg) {
CanvasMapping cm = myHolder.getMapping().getDiagram();
cm.setDomainMetaElement((EClass) arg);
}
});
refPages.getCanvasExt().addObserver(new Observer() {
public void update(Observable o, Object arg) {
CanvasMapping cm = myHolder.getMapping().getDiagram();
cm.setDiagramCanvas((Canvas) arg);
myHolder.feedDefaultMapping();
}
});
refPages.allowNewToolingModel();
refPages.getCreateNewToolingModelExt().addObserver(new Observer() {
public void update(Observable o, Object arg) {
if (((Boolean) arg).booleanValue()) {
createBlankToolDef();
}
}
});
addDoMapPage();
}
public URI createBlankToolDef() {
checkUnload(myRegistry);
myRegistry = null;
IPath toolDefFile = myHolder.getMappingFile().getFullPath().removeFileExtension().addFileExtension(WizardInput.TOOLDEF_FILE_EXT);
String baseName = myHolder.getMappingFile().getFullPath().removeFileExtension().lastSegment();
int i = 1;
final IWorkspace wr = myHolder.getMappingFile().getProject().getWorkspace();
while (wr.getRoot().findMember(toolDefFile) != null) {
toolDefFile = toolDefFile.removeLastSegments(1).append(baseName + i).addFileExtension(WizardInput.TOOLDEF_FILE_EXT);
i++;
}
URI toolDefURI = URI.createPlatformResourceURI(toolDefFile.toString(), true);
myRegistry = GMFToolFactory.eINSTANCE.createToolRegistry();
myRegistry.setPalette(GMFToolFactory.eINSTANCE.createPalette());
myHolder.getResourceSet().createResource(toolDefURI, ContentHandler.UNSPECIFIED_CONTENT_TYPE).getContents().add(myRegistry);
return toolDefURI;
}
private void checkUnload(EObject eobj) {
if (eobj == null) {
return;
}
if (eobj.eResource().getResourceSet() == myHolder.getResourceSet() && eobj.eResource().isLoaded()) {
eobj.eResource().unload();
}
}
protected void addNewFilePage() {
addPage(new NewMapFileCreationPage(mySelection, myHolder));
}
protected void addDoMapPage() {
addPage(new EntriesPage(myHolder));
}
public void init(IWorkbench workbench, IStructuredSelection selection) {
myWorkbench = workbench;
mySelection = selection;
}
public boolean performFinish() {
WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
protected void execute(IProgressMonitor progressMonitor) {
try {
Map<String, Object> options = new HashMap<String, Object>();
options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
if (myHolder.isNewBlankToolDef()) {
myHolder.getToolDef().eResource().save(options);
}
myHolder.getMapping().eResource().save(options);
} catch (Exception ex) {
Plugin.log(ex);
} finally {
progressMonitor.done();
}
}
};
try {
getContainer().run(false, false, operation);
WizardUtil.selectReveal(myWorkbench, new StructuredSelection(getModelFile()));
WizardUtil.openInEditor(myWorkbench, getModelFile());
} catch (InvocationTargetException ex) {
return false;
} catch (InterruptedException ex) {
return false;
} catch (PartInitException ex) {
Plugin.log(ex);
}
return true;
}
public IFile getModelFile() {
return myHolder.getMappingFile();
}
public WizardInput getWizardInput() {
return myHolder;
}
}