/************************************************************************** * ERA - Eclipse Requirements Analysis * ============================================== * Copyright (C) 2009-2013 by Georg Blaschke, Christoph P. Neumann * and Bernd Haberstumpf (http://era.origo.ethz.ch) ************************************************************************** * Licensed under the Eclipse Public License - v 1.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.eclipse.org/org/documents/epl-v10.html * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ************************************************************************** */ package era.foss.objecteditor.wizard; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.MissingResourceException; import java.util.StringTokenizer; 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.core.runtime.Path; import org.eclipse.emf.common.CommonPlugin; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; 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.xmi.XMLResource; import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry; import org.eclipse.jface.dialogs.MessageDialog; 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.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; 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 era.foss.erf.ERF; import era.foss.erf.ErfFactory; import era.foss.erf.ErfPackage; import era.foss.erf.provider.ErfEditPlugin; import era.foss.objecteditor.ErfObjectsEditorPlugin; /** * This is a simple wizard for creating a new model file. <!-- begin-user-doc --> <!-- end-user-doc --> * * @not generated */ public class ErfModelWizard extends Wizard implements INewWizard { /** * The supported extensions for created files. <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ public static final List<String> FILE_EXTENSIONS = Collections.unmodifiableList( Arrays.asList( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_ErfEditorFilenameExtensions" ) .split( "\\s*,\\s*" ) ) ); /** * A formatted list of supported file extensions, suitable for display. <!-- begin-user-doc --> <!-- end-user-doc * --> * * @generated */ public static final String FORMATTED_FILE_EXTENSIONS = ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_ErfEditorFilenameExtensions" ) .replaceAll( "\\s*,\\s*", ", " ); /** * This caches an instance of the model package. <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ protected ErfPackage erfPackage = ErfPackage.eINSTANCE; /** * This caches an instance of the model factory. <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ protected ErfFactory erfFactory = erfPackage.getErfFactory(); /** * This is the file creation page. <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ protected ErfModelWizardNewFileCreationPage newFileCreationPage; /** * This is the initial object creation page. <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ protected ErfModelWizardInitialObjectCreationPage initialObjectCreationPage; /** * Remember the selection during initialization for populating the default container. <!-- begin-user-doc --> <!-- * end-user-doc --> * * @generated */ protected IStructuredSelection selection; /** * Remember the workbench during initialization. <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ protected IWorkbench workbench; /** * Caches the names of the types that can be created as the root object. <!-- begin-user-doc --> <!-- end-user-doc * --> * * @generated */ protected List<String> initialObjectNames; /** * This just records the information. <!-- begin-user-doc --> <!-- end-user-doc --> * * @param workbench the workbench * @param selection the selection * @generated */ public void init( IWorkbench workbench, IStructuredSelection selection ) { this.workbench = workbench; this.selection = selection; setWindowTitle( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_Wizard_label" ) ); setDefaultPageImageDescriptor( ExtendedImageRegistry.INSTANCE.getImageDescriptor( ErfObjectsEditorPlugin.INSTANCE.getImage( "full/wizban/NewEraFile" ) ) ); } /** * Returns the names of the types that can be created as the root object. <!-- begin-user-doc --> <!-- end-user-doc * --> * * @return the initial object names * @generated */ protected Collection<String> getInitialObjectNames() { if( initialObjectNames == null ) { initialObjectNames = new ArrayList<String>(); for( EClassifier eClassifier : erfPackage.getEClassifiers() ) { if( eClassifier instanceof EClass ) { EClass eClass = (EClass)eClassifier; if( !eClass.isAbstract() ) { initialObjectNames.add( eClass.getName() ); } } } Collections.sort( initialObjectNames, CommonPlugin.INSTANCE.getComparator() ); } return initialObjectNames; } /** * Create a new model. <!-- begin-user-doc --> <!-- end-user-doc --> * * @return the e object * @not generated */ protected EObject createInitialModel() { ERF erfModel = erfFactory.createERF(); // The core content has to be created in any case erfModel.setCoreContent( erfFactory.createContent() ); // create a specification erfModel.getCoreContent().getSpecifications().add( erfFactory.createSpecification() ); // create element for era tool extension erfModel.getToolExtensions().add( erfFactory.createEraToolExtension() ); return erfModel; } /** * Do the work after everything is specified. <!-- begin-user-doc --> <!-- end-user-doc --> * * @return true, if successful * @generated */ @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, initialObjectCreationPage.getEncoding() ); resource.save( options ); } catch( Exception exception ) { ErfObjectsEditorPlugin.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(), ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_OpenEditorError_label" ), exception.getMessage() ); return false; } return true; } catch( Exception exception ) { ErfObjectsEditorPlugin.INSTANCE.log( exception ); return false; } } /** * This is the one page of the wizard. <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ public class ErfModelWizardNewFileCreationPage extends WizardNewFileCreationPage { /** * Pass in the selection. <!-- begin-user-doc --> <!-- end-user-doc --> * * @param pageId the page id * @param selection the selection * @generated */ public ErfModelWizardNewFileCreationPage( String pageId, IStructuredSelection selection ) { super( pageId, selection ); } /** * The framework calls this to see if the file is correct. <!-- begin-user-doc --> <!-- end-user-doc --> * * @return true, if successful * @generated */ @Override protected boolean validatePage() { if( super.validatePage() ) { String extension = new Path( getFileName() ).getFileExtension(); if( extension == null || !FILE_EXTENSIONS.contains( extension ) ) { String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension"; setErrorMessage( ErfObjectsEditorPlugin.INSTANCE.getString( key, new Object[]{FORMATTED_FILE_EXTENSIONS} ) ); return false; } return true; } return false; } /** * <!-- begin-user-doc --> <!-- end-user-doc -->. * * @return the model file * @generated */ public IFile getModelFile() { return ResourcesPlugin.getWorkspace().getRoot().getFile( getContainerFullPath().append( getFileName() ) ); } } /** * This is the page where the type of object to create is selected. <!-- begin-user-doc --> <!-- end-user-doc --> * * @not generated */ public class ErfModelWizardInitialObjectCreationPage extends WizardPage { /** <!-- begin-user-doc --> <!-- end-user-doc -->. @generated */ protected Combo initialObjectField; /** The encodings. @generated <!-- begin-user-doc --> <!-- end-user-doc --> */ protected List<String> encodings; /** <!-- begin-user-doc --> <!-- end-user-doc -->. @generated */ protected Combo encodingField; /** * Pass in the selection. <!-- begin-user-doc --> <!-- end-user-doc --> * * @param pageId the page id * @generated */ public ErfModelWizardInitialObjectCreationPage( String pageId ) { super( pageId ); } /** * <!-- begin-user-doc --> <!-- end-user-doc -->. * * @param parent the parent * @not generated */ public void createControl( Composite parent ) { Composite composite = new Composite( parent, SWT.NONE ); { GridLayout layout = new GridLayout(); layout.numColumns = 1; layout.verticalSpacing = 12; composite.setLayout( layout ); GridData data = new GridData(); data.verticalAlignment = GridData.FILL; data.grabExcessVerticalSpace = true; data.horizontalAlignment = GridData.FILL; composite.setLayoutData( data ); } Label encodingLabel = new Label( composite, SWT.LEFT ); { encodingLabel.setText( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_XMLEncoding" ) ); GridData data = new GridData(); data.horizontalAlignment = GridData.FILL; encodingLabel.setLayoutData( data ); } encodingField = new Combo( composite, SWT.BORDER ); { GridData data = new GridData(); data.horizontalAlignment = GridData.FILL; data.grabExcessHorizontalSpace = true; encodingField.setLayoutData( data ); } for( String encoding : getEncodings() ) { encodingField.add( encoding ); } encodingField.select( 0 ); encodingField.addModifyListener( validator ); setPageComplete( validatePage() ); setControl( composite ); } /** <!-- begin-user-doc --> <!-- end-user-doc -->. @generated */ protected ModifyListener validator = new ModifyListener() { public void modifyText( ModifyEvent e ) { setPageComplete( validatePage() ); } }; /** * <!-- begin-user-doc --> <!-- end-user-doc -->. * * @return true, if successful * @not generated */ protected boolean validatePage() { return getEncodings().contains( encodingField.getText() ); } /** * <!-- begin-user-doc --> <!-- end-user-doc -->. * * @param visible the new visible * @not generated */ @Override public void setVisible( boolean visible ) { } /** * <!-- begin-user-doc --> <!-- end-user-doc -->. * * @return the initial object name * @not generated */ public String getInitialObjectName() { return "ERF"; } /** * <!-- begin-user-doc --> <!-- end-user-doc -->. * * @return the encoding * @generated */ public String getEncoding() { return encodingField.getText(); } /** * Returns the label for the specified type name. <!-- begin-user-doc --> <!-- end-user-doc --> * * @param typeName the type name * @return the label * @generated */ protected String getLabel( String typeName ) { try { return ErfEditPlugin.INSTANCE.getString( "_UI_" + typeName + "_type" ); } catch( MissingResourceException mre ) { ErfObjectsEditorPlugin.INSTANCE.log( mre ); } return typeName; } /** * <!-- begin-user-doc --> <!-- end-user-doc -->. * * @return the encodings * @generated */ protected Collection<String> getEncodings() { if( encodings == null ) { encodings = new ArrayList<String>(); for( StringTokenizer stringTokenizer = new StringTokenizer( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_XMLEncodingChoices" ) ); stringTokenizer.hasMoreTokens(); ) { encodings.add( stringTokenizer.nextToken() ); } } return encodings; } } /** * The framework calls this to create the contents of the wizard. <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public void addPages() { // Create a page, set the title, and the initial model file name. // newFileCreationPage = new ErfModelWizardNewFileCreationPage( "Whatever", selection ); newFileCreationPage.setTitle( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_ErfModelWizard_label" ) ); newFileCreationPage.setDescription( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_ErfModelWizard_description" ) ); newFileCreationPage.setFileName( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_ErfEditorFilenameDefaultBase" ) + "." + FILE_EXTENSIONS.get( 0 ) ); 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 = ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_ErfEditorFilenameDefaultBase" ); String defaultModelFilenameExtension = FILE_EXTENSIONS.get( 0 ); String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension; for( int i = 1; ((IContainer)selectedResource).findMember( modelFilename ) != null; ++i ) { modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension; } newFileCreationPage.setFileName( modelFilename ); } } } initialObjectCreationPage = new ErfModelWizardInitialObjectCreationPage( "Whatever2" ); initialObjectCreationPage.setTitle( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_ErfModelWizard_label" ) ); initialObjectCreationPage.setDescription( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_Wizard_initial_object_description" ) ); addPage( initialObjectCreationPage ); } /** * Get the file from the page. <!-- begin-user-doc --> <!-- end-user-doc --> * * @return the model file * @generated */ public IFile getModelFile() { return newFileCreationPage.getModelFile(); } }