| /* |
| * Copyright (c) 2006 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: |
| * Dmitry Stadnik (Borland) - initial API and implementation |
| */ |
| package org.eclipse.gmf.examples.taipan.presentation; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.MissingResourceException; |
| import java.util.StringTokenizer; |
| |
| import org.eclipse.emf.common.util.URI; |
| |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EClassifier; |
| |
| 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.runtime.IProgressMonitor; |
| |
| import org.eclipse.jface.dialogs.MessageDialog; |
| |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| |
| import org.eclipse.jface.wizard.Wizard; |
| import org.eclipse.jface.wizard.WizardPage; |
| |
| import org.eclipse.swt.SWT; |
| |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.ModifyEvent; |
| |
| 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.gmf.examples.taipan.TaiPanFactory; |
| import org.eclipse.gmf.examples.taipan.TaiPanPackage; |
| import org.eclipse.gmf.examples.taipan.provider.TaiPanEditPlugin; |
| |
| import java.io.File; |
| |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Text; |
| |
| /** |
| * This is a simple wizard for creating a new model file. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public class TaiPanModelWizard extends Wizard implements INewWizard { |
| |
| /** |
| * This caches an instance of the model package. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected TaiPanPackage taiPanPackage = TaiPanPackage.eINSTANCE; |
| |
| /** |
| * This caches an instance of the model factory. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected TaiPanFactory taiPanFactory = taiPanPackage.getTaiPanFactory(); |
| |
| /** |
| * This is the initial object creation page. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected TaiPanModelWizardInitialObjectCreationPage 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 initialObjectNames; |
| |
| /** |
| * This just records the information. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void init(IWorkbench workbench, IStructuredSelection selection) { |
| this.workbench = workbench; |
| this.selection = selection; |
| setWindowTitle(TaiPanEditorPlugin.INSTANCE.getString("_UI_Wizard_label")); //$NON-NLS-1$ |
| setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(TaiPanEditorPlugin.INSTANCE.getImage("full/wizban/NewTaiPan"))); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Returns the names of the types that can be created as the root object. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected Collection getInitialObjectNames() { |
| if (initialObjectNames == null) { |
| initialObjectNames = new ArrayList(); |
| for (Iterator classifiers = taiPanPackage.getEClassifiers().iterator(); classifiers.hasNext();) { |
| EClassifier eClassifier = (EClassifier) classifiers.next(); |
| if (eClassifier instanceof EClass) { |
| EClass eClass = (EClass) eClassifier; |
| if (!eClass.isAbstract()) { |
| initialObjectNames.add(eClass.getName()); |
| } |
| } |
| } |
| Collections.sort(initialObjectNames, java.text.Collator.getInstance()); |
| } |
| return initialObjectNames; |
| } |
| |
| /** |
| * Create a new model. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected EObject createInitialModel() { |
| EClass eClass = (EClass) taiPanPackage.getEClassifier(initialObjectCreationPage.getInitialObjectName()); |
| EObject rootObject = taiPanFactory.create(eClass); |
| return rootObject; |
| } |
| |
| /** |
| * Do the work after everything is specified. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public boolean performFinish() { |
| try { |
| // Get the URI of the model file. |
| // |
| final URI fileURI = getModelURI(); |
| if (new File(fileURI.toFileString()).exists()) { |
| if (!MessageDialog.openQuestion(getShell(), TaiPanEditorPlugin.INSTANCE.getString("_UI_Question_title"), //$NON-NLS-1$ |
| TaiPanEditorPlugin.INSTANCE.getString("_WARN_FileConflict", new String[] { fileURI.toFileString() }))) //$NON-NLS-1$ |
| { |
| initialObjectCreationPage.selectFileField(); |
| return false; |
| } |
| } |
| |
| // Do the work within an operation. |
| // |
| IRunnableWithProgress operation = new IRunnableWithProgress() { |
| |
| public void run(IProgressMonitor progressMonitor) { |
| try { |
| // Create a resource set |
| // |
| ResourceSet resourceSet = new ResourceSetImpl(); |
| |
| // 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 options = new HashMap(); |
| options.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding()); |
| resource.save(options); |
| } catch (Exception exception) { |
| TaiPanEditorPlugin.INSTANCE.log(exception); |
| } finally { |
| progressMonitor.done(); |
| } |
| } |
| }; |
| |
| getContainer().run(false, false, operation); |
| |
| return TaiPanEditorAdvisor.openEditor(workbench, fileURI); |
| } catch (Exception exception) { |
| TaiPanEditorPlugin.INSTANCE.log(exception); |
| return false; |
| } |
| } |
| |
| /** |
| * This is the page where the type of object to create is selected. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public class TaiPanModelWizardInitialObjectCreationPage extends WizardPage { |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected Text fileField; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected Combo initialObjectField; |
| |
| /** |
| * @generated |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| */ |
| protected List encodings; |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected Combo encodingField; |
| |
| /** |
| * Pass in the selection. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public TaiPanModelWizardInitialObjectCreationPage(String pageId) { |
| super(pageId); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @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 resourceURILabel = new Label(composite, SWT.LEFT); |
| { |
| resourceURILabel.setText(TaiPanEditorPlugin.INSTANCE.getString("_UI_File_label")); //$NON-NLS-1$ |
| |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| resourceURILabel.setLayoutData(data); |
| } |
| |
| Composite fileComposite = new Composite(composite, SWT.NONE); |
| { |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.END; |
| fileComposite.setLayoutData(data); |
| |
| GridLayout layout = new GridLayout(); |
| data.horizontalAlignment = GridData.FILL; |
| layout.marginHeight = 0; |
| layout.marginWidth = 0; |
| layout.numColumns = 2; |
| fileComposite.setLayout(layout); |
| } |
| |
| fileField = new Text(fileComposite, SWT.BORDER); |
| { |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| data.grabExcessHorizontalSpace = true; |
| data.horizontalSpan = 1; |
| fileField.setLayoutData(data); |
| } |
| |
| fileField.addModifyListener(validator); |
| |
| Button resourceURIBrowseFileSystemButton = new Button(fileComposite, SWT.PUSH); |
| resourceURIBrowseFileSystemButton.setText(TaiPanEditorPlugin.INSTANCE.getString("_UI_Browse_label")); //$NON-NLS-1$ |
| |
| resourceURIBrowseFileSystemButton.addSelectionListener(new SelectionAdapter() { |
| |
| public void widgetSelected(SelectionEvent event) { |
| String fileExtension = TaiPanEditorPlugin.INSTANCE.getString("_UI_TaiPanEditorFilenameExtension"); //$NON-NLS-1$ |
| String filePath = TaiPanEditorAdvisor.openFilePathDialog(getShell(), "*." + fileExtension, SWT.OPEN); //$NON-NLS-1$ |
| if (filePath != null) { |
| if (!filePath.endsWith("." + fileExtension)) //$NON-NLS-1$ |
| { |
| filePath = filePath + "." + fileExtension; //$NON-NLS-1$ |
| } |
| fileField.setText(filePath); |
| } |
| } |
| }); |
| Label containerLabel = new Label(composite, SWT.LEFT); |
| { |
| containerLabel.setText(TaiPanEditorPlugin.INSTANCE.getString("_UI_ModelObject")); //$NON-NLS-1$ |
| |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| containerLabel.setLayoutData(data); |
| } |
| |
| initialObjectField = new Combo(composite, SWT.BORDER); |
| { |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| data.grabExcessHorizontalSpace = true; |
| initialObjectField.setLayoutData(data); |
| } |
| |
| for (Iterator i = getInitialObjectNames().iterator(); i.hasNext();) { |
| initialObjectField.add(getLabel((String) i.next())); |
| } |
| |
| if (initialObjectField.getItemCount() == 1) { |
| initialObjectField.select(0); |
| } |
| initialObjectField.addModifyListener(validator); |
| |
| Label encodingLabel = new Label(composite, SWT.LEFT); |
| { |
| encodingLabel.setText(TaiPanEditorPlugin.INSTANCE.getString("_UI_XMLEncoding")); //$NON-NLS-1$ |
| |
| 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 (Iterator i = getEncodings().iterator(); i.hasNext();) { |
| encodingField.add((String) i.next()); |
| } |
| |
| 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 --> |
| * @generated |
| */ |
| protected boolean validatePage() { |
| URI fileURI = getFileURI(); |
| if (fileURI == null || fileURI.isEmpty()) { |
| setErrorMessage(null); |
| return false; |
| } |
| |
| String requiredExt = TaiPanEditorPlugin.INSTANCE.getString("_UI_TaiPanEditorFilenameExtension"); //$NON-NLS-1$ |
| String enteredExt = fileURI.fileExtension(); |
| if (enteredExt == null || !enteredExt.equals(requiredExt)) { |
| setErrorMessage(TaiPanEditorPlugin.INSTANCE.getString("_WARN_FilenameExtension", new Object[] { requiredExt })); //$NON-NLS-1$ |
| return false; |
| } |
| |
| setErrorMessage(null); |
| return getInitialObjectName() != null && getEncodings().contains(encodingField.getText()); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void setVisible(boolean visible) { |
| super.setVisible(visible); |
| if (visible) { |
| initialObjectField.clearSelection(); |
| encodingField.clearSelection(); |
| fileField.setFocus(); |
| } |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public String getInitialObjectName() { |
| String label = initialObjectField.getText(); |
| |
| for (Iterator i = getInitialObjectNames().iterator(); i.hasNext();) { |
| String name = (String) i.next(); |
| if (getLabel(name).equals(label)) { |
| return name; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public String getEncoding() { |
| return encodingField.getText(); |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public URI getFileURI() { |
| try { |
| return URI.createFileURI(fileField.getText()); |
| } catch (Exception exception) { |
| } |
| return null; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void selectFileField() { |
| initialObjectField.clearSelection(); |
| encodingField.clearSelection(); |
| fileField.selectAll(); |
| fileField.setFocus(); |
| } |
| |
| /** |
| * Returns the label for the specified type name. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected String getLabel(String typeName) { |
| try { |
| return TaiPanEditPlugin.INSTANCE.getString("_UI_" + typeName + "_type"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } catch (MissingResourceException mre) { |
| TaiPanEditorPlugin.INSTANCE.log(mre); |
| } |
| return typeName; |
| } |
| |
| /** |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| protected Collection getEncodings() { |
| if (encodings == null) { |
| encodings = new ArrayList(); |
| for (StringTokenizer stringTokenizer = new StringTokenizer(TaiPanEditorPlugin.INSTANCE.getString("_UI_XMLEncodingChoices")); stringTokenizer.hasMoreTokens();) //$NON-NLS-1$ |
| { |
| encodings.add(stringTokenizer.nextToken()); |
| } |
| } |
| return encodings; |
| } |
| } |
| |
| /** |
| * The framework calls this to create the contents of the wizard. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public void addPages() { |
| initialObjectCreationPage = new TaiPanModelWizardInitialObjectCreationPage("Whatever2"); //$NON-NLS-1$ |
| initialObjectCreationPage.setTitle(TaiPanEditorPlugin.INSTANCE.getString("_UI_TaiPanModelWizard_label")); //$NON-NLS-1$ |
| initialObjectCreationPage.setDescription(TaiPanEditorPlugin.INSTANCE.getString("_UI_Wizard_initial_object_description")); //$NON-NLS-1$ |
| addPage(initialObjectCreationPage); |
| } |
| |
| /** |
| * Get the URI from the page. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public URI getModelURI() { |
| return initialObjectCreationPage.getFileURI(); |
| } |
| |
| } |