| /***************************************************************************** |
| * Copyright (c) 2016 CEA LIST and others. |
| * |
| * 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: |
| * CEA LIST - Initial API and implementation |
| * |
| *****************************************************************************/ |
| |
| package org.eclipse.papyrus.interoperability.common.handler; |
| |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.Set; |
| import java.util.concurrent.atomic.AtomicBoolean; |
| |
| import org.eclipse.core.commands.AbstractHandler; |
| import org.eclipse.core.commands.ExecutionEvent; |
| import org.eclipse.core.commands.ExecutionException; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.papyrus.infra.properties.ui.creation.PropertyEditorFactory; |
| import org.eclipse.papyrus.interoperability.common.Activator; |
| import org.eclipse.papyrus.interoperability.common.MigrationParameters.MigrationParametersFactory; |
| import org.eclipse.papyrus.interoperability.common.MigrationParameters.ThreadConfig; |
| import org.eclipse.papyrus.interoperability.common.transformation.IImportTransformationLauncher; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.handlers.HandlerUtil; |
| |
| /** |
| * @author VL222926 |
| * Abstract handler for Migration action |
| */ |
| public abstract class AbstractMigrationHandler extends AbstractHandler { |
| |
| /** |
| * the extensions of the files to import |
| */ |
| private Set<String> extensionOfFilesToImport; |
| |
| /** |
| * |
| * Constructor. |
| * |
| * @param acceptedFileExtension |
| * the extension of the files to import |
| */ |
| protected AbstractMigrationHandler(final Set<String> acceptedFileExtension) { |
| this.extensionOfFilesToImport = acceptedFileExtension; |
| } |
| |
| /** |
| * |
| * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) |
| * |
| * @param event |
| * @return |
| * @throws ExecutionException |
| */ |
| @Override |
| public Object execute(ExecutionEvent event) throws ExecutionException { |
| ISelection selection = HandlerUtil.getCurrentSelection(event); |
| if (selection == null || selection.isEmpty()) { |
| return null; |
| } |
| |
| Set<IFile> filesToImport = new HashSet<IFile>(); |
| |
| if (selection instanceof IStructuredSelection) { |
| IStructuredSelection structuredSelection = (IStructuredSelection) selection; |
| Iterator<?> selectionIterator = structuredSelection.iterator(); |
| while (selectionIterator.hasNext()) { |
| Object selectedElement = selectionIterator.next(); |
| if (selectedElement instanceof IAdaptable) { |
| IFile selectedFile = (IFile) ((IAdaptable) selectedElement).getAdapter(IFile.class); |
| if (selectedFile == null) { |
| continue; |
| } |
| |
| String fileExtension = selectedFile.getFileExtension(); |
| if (extensionOfFilesToImport.contains(fileExtension)) { |
| filesToImport.add(selectedFile); |
| } |
| } |
| } |
| } |
| |
| if (filesToImport.isEmpty()) { |
| StringBuilder builder = new StringBuilder(); |
| Iterator<String> iter = extensionOfFilesToImport.iterator(); |
| while (iter.hasNext()) { |
| builder.append("*."); |
| builder.append(iter.next()); |
| if (iter.hasNext()) { |
| builder.append(", "); |
| } |
| } |
| Activator.log.warn(NLS.bind("The selection doesn't contain any file with one of these extensions: {0}", builder.toString())); |
| } else { |
| importFiles(filesToImport, event); |
| } |
| |
| return null; |
| } |
| |
| |
| public void importFiles(Set<IFile> selectedFiles, ExecutionEvent event) { |
| ThreadConfig config = getTransformationParameters(event); |
| |
| if (config == null) { |
| return; |
| } |
| |
| |
| // The Event's control is (or may be) a Context Menu, which will be disposed soon: retrieve its own parent instead (The main Window), if it has one. |
| Control baseControl = HandlerUtil.getActiveShell(event); |
| if (baseControl != null && !baseControl.isDisposed() && baseControl.getParent() != null) { |
| baseControl = baseControl.getParent(); |
| } |
| |
| // On some platforms, it seems that the ActiveShell (Context Menu) may already be disposed (Bug 455011). Use the Active Workbench Window directly |
| if (baseControl == null || baseControl.isDisposed()) { |
| baseControl = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); |
| } |
| |
| runTransformation(config, baseControl, selectedFiles); |
| |
| } |
| |
| protected void runTransformation(final ThreadConfig config, final Control baseControl, final Set<IFile> selectedFiles) { |
| List<URI> urisToImport = new LinkedList<URI>(); |
| |
| for (IFile selectedFile : selectedFiles) { |
| URI uri = URI.createPlatformResourceURI(selectedFile.getFullPath().toString(), true); |
| urisToImport.add(uri); |
| } |
| runTransformation(config, baseControl, urisToImport); |
| } |
| |
| protected void runTransformation(final ThreadConfig config, final Control baseControl, final List<URI> urisToImport) { |
| IImportTransformationLauncher launcher = createImportTransformationLauncher(config, baseControl); |
| launcher.run(urisToImport); |
| } |
| |
| |
| /** |
| * |
| * @param config |
| * the configuration used to launch the import |
| * @param baseControl |
| * |
| * @return |
| * the launcher of the import transformation |
| */ |
| protected abstract IImportTransformationLauncher createImportTransformationLauncher(final ThreadConfig config, final Control baseControl); |
| |
| public ThreadConfig getTransformationParameters(ExecutionEvent event) { |
| ThreadConfig config = createConfigParameters(); |
| |
| Shell activeShell = HandlerUtil.getActiveShell(event); |
| |
| final AtomicBoolean okPressed = new AtomicBoolean(true); |
| PropertyEditorFactory factory = new PropertyEditorFactory() { |
| @Override |
| public String getEditionDialogTitle(Object objectToEdit) { |
| return "Transformation parameters"; |
| } |
| |
| @Override |
| protected void handleEditCancelled(Control widget, Object source) { |
| okPressed.set(false); |
| super.handleEditCancelled(widget, source); |
| } |
| }; |
| |
| Object result = factory.edit(activeShell, config); |
| |
| if (!okPressed.get()) { |
| return null; |
| } |
| |
| // Result can be null, the source config, or a new config |
| if (result instanceof ThreadConfig) { |
| config = (ThreadConfig) result; |
| } |
| |
| return config; |
| } |
| |
| /** |
| * |
| * @return |
| * This method return a new instance of the configuration to use for the migration |
| */ |
| protected ThreadConfig createConfigParameters() { |
| return MigrationParametersFactory.eINSTANCE.createThreadConfig(); |
| } |
| |
| |
| } |