/* * Copyright (c) 2006, 2008 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: * Alexander Fedorov (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.bridge.transform; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.importer.ui.EMFModelWizard; import org.eclipse.emf.importer.ui.GenModelReloadActionDelegate; import org.eclipse.gmf.internal.common.ui.ResourceLocationProvider; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.PlatformUI; class GenModelConfigurationPage extends ModelConfigurationPage { private static final String FILE_EXT_ECORE = "ecore"; //$NON-NLS-1$ private Button createWizardBtn; private Button createDefaultBtn; private Button refreshStaleBtn; GenModelConfigurationPage(String pageId, ResourceLocationProvider rlp, ResourceSet resourceSet) { super(pageId, rlp, resourceSet); setTitle(Messages.TransformToGenModelWizard_title_genmodel); setDescription(Messages.TransformToGenModelWizard_descr_genmodel); setModelFileExtension("genmodel"); //$NON-NLS-1$ } @Override protected void createAdditionalControls(Composite parent) { Composite createComposite = new Composite(parent, SWT.NONE); createComposite.setLayout(new GridLayout(2, true)); createComposite.setLayoutData(createGridData()); createWizardBtn = new Button(createComposite, SWT.PUSH); createWizardBtn.setText(Messages.GenModelConfigurationPage_btn_new_wizard); setButtonLayoutData(createWizardBtn); createDefaultBtn = new Button(createComposite, SWT.PUSH); createDefaultBtn.setText(Messages.GenModelConfigurationPage_btn_create_default); setButtonLayoutData(createDefaultBtn); refreshStaleBtn = new Button(createComposite, SWT.PUSH); refreshStaleBtn.setText(Messages.GenModelConfigurationPage_btn_refresh_stale); setButtonLayoutData(refreshStaleBtn); SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleSelection(e.widget); } }; createWizardBtn.addSelectionListener(selectionAdapter); createDefaultBtn.addSelectionListener(selectionAdapter); refreshStaleBtn.addSelectionListener(selectionAdapter); } private GridData createGridData() { GridData gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; return gd; } void handleSelection(Widget w) { if (createDefaultBtn.equals(w)){ createDefault(); } else if (createWizardBtn.equals(w)) { launchWizard(); } else if (refreshStaleBtn.equals(w)) { refreshGenmodel(); } } @Override protected void initControls() { super.initControls(); if (getURI() == null) { findGenmodel(); } else { updateControls(); } } void findGenmodel() { try { GenModel genModel = getOperation().findGenmodel(); if (genModel != null) { Resource r = genModel.eResource(); URI genURI = r.getURI(); setURI(genURI); updateURI(); } else { setPageComplete(true); updateControls(); } } catch (CoreException e) { setErrorMessage(e.getMessage()); updateControls(); } } /* (non-Javadoc) * @see org.eclipse.gmf.internal.common.ui.ModelSelectionPage#resourceChanged() */ @Override protected void resourceChanged() { super.resourceChanged(); updateControls(); setPageComplete(getResource() != null); } private void updateControls() { GenModelDetector gmd = getOperation().getGenModelDetector(); if (gmd!= null) { createDefaultBtn.setEnabled(gmd.canCreateDefault()); } IStatus stale = getOperation().getStaleGenmodelStatus(); if (stale != null && !stale.isOK()) { setStatusMessage(stale); refreshStaleBtn.setEnabled((getURI() != null)); } else { refreshStaleBtn.setEnabled(false); } } @Override protected Resource doLoadResource(IProgressMonitor monitor) throws CoreException { GenModel genModel = getOperation().loadGenModel(getURI(), monitor); if (genModel == null) { return null; } return genModel.eResource(); } private void createDefault() { try { ITransformToGenModelOperation to = getOperation(); GenModelDetector gmd = to.getGenModelDetector(); TransformToGenModelWizard wizard = (TransformToGenModelWizard) getWizard(); IFile mapFile = wizard.getMapFile(); String pluginID = mapFile.getProject().getName(); URI genURI = gmd.createDefault(pluginID, mapFile); setURI(genURI); updateURI(); } catch (CoreException e) { setErrorMessage(e.getMessage()); } } private void launchWizard() { TransformToGenModelWizard wizard = (TransformToGenModelWizard) getWizard(); IFile mapFile = wizard.getMapFile(); IFile genmodel = createWithWizard(getShell(), mapFile); if (genmodel != null) { setURI(URI.createPlatformResourceURI(genmodel.getFullPath().toString(), true)); updateURI(); } } private static IFile createWithWizard(Shell shell, IFile patternResource) { final IFile[] result = new IFile[1]; EMFModelWizard wizard = new EMFModelWizard() { @Override public boolean performFinish() { result[0] = ResourcesPlugin.getWorkspace().getRoot().getFile(genModelContainerPath.append(genModelFileName)); return super.performFinish(); } }; wizard.init(PlatformUI.getWorkbench(), createSelectionForEMFWizard(patternResource)); if (Window.OK == new WizardDialog(shell, wizard).open()) { assert result[0] != null; return result[0]; } return null; } private static StructuredSelection createSelectionForEMFWizard(IFile patternResource) { final IContainer parent = patternResource.getParent(); IFile neighbour = parent.getFile(new Path(patternResource.getName()).removeFileExtension().addFileExtension(FILE_EXT_ECORE)); if (neighbour.exists()) { return new StructuredSelection(neighbour); } else { return new StructuredSelection(patternResource); } } private void refreshGenmodel() { IPath p = new Path(getURI().path()).removeFirstSegments(1); IFile genModelFile = ResourcesPlugin.getWorkspace().getRoot().getFile(p); GenModelReloadActionDelegate action = new GenModelReloadActionDelegate(); IAction uiAction = new Action() { //empty }; action.selectionChanged(uiAction, new StructuredSelection(genModelFile)); action.run(uiAction); updateURI(); } private ITransformToGenModelOperation getOperation() { TransformToGenModelWizard wizard = (TransformToGenModelWizard) getWizard(); return wizard.getTransformOperation(); } }