/** * <copyright> * </copyright> * * $Id$ */ package com.openMap1.mapper.presentation; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.eclipse.ui.dialogs.WizardNewFileCreationPage; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.ISetSelectionTarget; import com.openMap1.mapper.GlobalMappingParameters; import com.openMap1.mapper.MappedStructure; import com.openMap1.mapper.MapperFactory; import com.openMap1.mapper.MapperPackage; import org.eclipse.core.runtime.Path; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; /** * This is a simple wizard for creating a new mapping set * <!-- begin-user-doc --> * <!-- end-user-doc --> */ public class MappingSetWizard extends Wizard implements INewWizard { /** * This caches an instance of the model package. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ protected MapperPackage mapperPackage = MapperPackage.eINSTANCE; /** * This caches an instance of the model factory. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ protected MapperFactory mapperFactory = mapperPackage.getMapperFactory(); /** * This is the file creation page. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ protected MappingSetWizardNewFileCreationPage newFileCreationPage; public MappingSetWizardNewFileCreationPage newFileCreationPage() {return newFileCreationPage;} /** * Remember the selection during initialization for populating the default container. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ protected IStructuredSelection selection; /** * Remember the workbench during initialization. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ protected IWorkbench workbench; /** * This just records the information. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ public void init(IWorkbench workbench, IStructuredSelection selection) { this.workbench = workbench; this.selection = selection; setWindowTitle(MapperEditorPlugin.INSTANCE.getString("_UI_Wizard_label")); setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(MapperEditorPlugin.INSTANCE.getImage("full/wizban/NewMapper"))); } /** * Create a new model. * <!-- begin-user-doc --> * While the EMF generated wizard has a page to select the top object class * of the model, the only possible top object node is "Mapped Structure"; * so the page is not shown. * Make the top MappedStructure object and add a GlobalMappingParameters object to it. * <!-- end-user-doc --> * */ protected EObject createInitialModel() { EClass eTopClass = (EClass)mapperPackage.getEClassifier("MappedStructure"); EObject rootObject = mapperFactory.create(eTopClass); EClass eGlobalClass = (EClass)mapperPackage.getEClassifier("GlobalMappingParameters"); EObject globalObject = mapperFactory.create(eGlobalClass); ((MappedStructure)rootObject).setMappingParameters((GlobalMappingParameters)globalObject); return rootObject; } /** * Do the work after everything is specified. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ @Override public boolean performFinish() { try { // Remember the file. // final IFile modelFile = getModelFile(); // Do the work within an operation. // WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { @Override protected void execute(IProgressMonitor progressMonitor) { try { // Create a resource set // ResourceSet resourceSet = new ResourceSetImpl(); // Get the URI of the model file. // URI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true); // Create a resource for this file. // Resource resource = resourceSet.createResource(fileURI); // Add the initial model object to the contents. // EObject rootObject = createInitialModel(); if (rootObject != null) { resource.getContents().add(rootObject); } // Save the contents of the resource to the file system. // Map<Object, Object> options = new HashMap<Object, Object>(); options.put(XMLResource.OPTION_ENCODING, "UTF-8"); resource.save(options); } catch (Exception exception) { MapperEditorPlugin.INSTANCE.log(exception); } finally { progressMonitor.done(); } } }; getContainer().run(false, false, operation); // Select the new file resource in the current view. // IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow(); IWorkbenchPage page = workbenchWindow.getActivePage(); final IWorkbenchPart activePart = page.getActivePart(); if (activePart instanceof ISetSelectionTarget) { final ISelection targetSelection = new StructuredSelection(modelFile); getShell().getDisplay().asyncExec (new Runnable() { public void run() { ((ISetSelectionTarget)activePart).selectReveal(targetSelection); } }); } // Open an editor on the new file. // try { page.openEditor (new FileEditorInput(modelFile), workbench.getEditorRegistry().getDefaultEditor(modelFile.getFullPath().toString()).getId()); } catch (PartInitException exception) { MessageDialog.openError(workbenchWindow.getShell(), MapperEditorPlugin.INSTANCE.getString("_UI_OpenEditorError_label"), exception.getMessage()); return false; } return true; } catch (Exception exception) { MapperEditorPlugin.INSTANCE.log(exception); return false; } } /** * This is the one page of the wizard. * <!-- begin-user-doc --> * RW - have added the facility to supply a file name for testing purposes, * rather than enter it interactively * <!-- end-user-doc --> * */ public class MappingSetWizardNewFileCreationPage extends WizardNewFileCreationPage { private boolean fileNameHasBeenSuppliedForTesting; private String fileNameSuppliedForTesting = ""; /** * Pass in the selection. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ public MappingSetWizardNewFileCreationPage(String pageId, IStructuredSelection selection) { super(pageId, selection); fileNameHasBeenSuppliedForTesting = false; } public void supplyFileNameForTesting(String fileName) { fileNameHasBeenSuppliedForTesting = true; fileNameSuppliedForTesting = fileName; } /** * override the normal file name (as entered by the user) * only if another file name has been supplied for testing * (in which case the wizard was never shown) */ public String getFileName() { if (!fileNameHasBeenSuppliedForTesting) return super.getFileName(); else return fileNameSuppliedForTesting; } /** * The framework calls this to see if the file is correct. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ @Override protected boolean validatePage() { if (super.validatePage()) { // Make sure the file ends in ".mapper". // String requiredExt = MapperEditorPlugin.INSTANCE.getString("_UI_MapperEditorFilenameExtension"); String enteredExt = new Path(getFileName()).getFileExtension(); if (enteredExt == null || !enteredExt.equals(requiredExt)) { setErrorMessage(MapperEditorPlugin.INSTANCE.getString("_WARN_FilenameExtension", new Object [] { requiredExt })); return false; } else { return true; } } else { return false; } } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ public IFile getModelFile() { return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName())); } } /** * The framework calls this to create the contents of the wizard. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ @Override public void addPages() { // Create a page, set the title, and the initial model file name. // newFileCreationPage = new MappingSetWizardNewFileCreationPage("Whatever", selection); newFileCreationPage.setTitle(MapperEditorPlugin.INSTANCE.getString("_UI_MappingSetWizard_label")); newFileCreationPage.setDescription(MapperEditorPlugin.INSTANCE.getString("_UI_MappingSetWizard_description")); newFileCreationPage.setFileName(MapperEditorPlugin.INSTANCE.getString("_UI_MapperEditorFilenameDefaultBase") + "." + MapperEditorPlugin.INSTANCE.getString("_UI_MapperEditorFilenameExtension")); addPage(newFileCreationPage); // Try and get the resource selection to determine a current directory for the file dialog. // if (selection != null && !selection.isEmpty()) { // Get the resource... // Object selectedElement = selection.iterator().next(); if (selectedElement instanceof IResource) { // Get the resource parent, if its a file. // IResource selectedResource = (IResource)selectedElement; if (selectedResource.getType() == IResource.FILE) { selectedResource = selectedResource.getParent(); } // This gives us a directory... // if (selectedResource instanceof IFolder || selectedResource instanceof IProject) { // Set this for the container. // newFileCreationPage.setContainerFullPath(selectedResource.getFullPath()); // Make up a unique new name here. // String defaultModelBaseFilename = MapperEditorPlugin.INSTANCE.getString("_UI_MapperEditorFilenameDefaultBase"); String defaultModelFilenameExtension = MapperEditorPlugin.INSTANCE.getString("_UI_MapperEditorFilenameExtension"); String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension; for (int i = 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i) { modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension; } newFileCreationPage.setFileName(modelFilename); } } } } /** * Get the file from the page. * <!-- begin-user-doc --> * <!-- end-user-doc --> * */ public IFile getModelFile() { return newFileCreationPage.getModelFile(); } }