/******************************************************************************* * Copyright (c) 2007, 2013 David Green 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: * David Green - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.wikitext.ui.commands; import java.util.Iterator; 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.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor; import org.eclipse.mylyn.wikitext.parser.markup.MarkupLanguage; import org.eclipse.mylyn.wikitext.ui.WikiText; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.HandlerUtil; /** * An abstract base class for handlers that use the workbench selection to operate on resources * * @author David Green */ public abstract class AbstractMarkupResourceHandler extends AbstractHandler { protected MarkupLanguage markupLanguage; private IStructuredSelection selection; @SuppressWarnings("unchecked") public Object execute(ExecutionEvent event) throws ExecutionException { ISelection currentSelection = selection; if (currentSelection == null) { try { currentSelection = computeSelection(event); } catch (Exception e) { // ignore } } if (currentSelection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) currentSelection; Iterator<Object> it = structuredSelection.iterator(); while (it.hasNext()) { Object o = it.next(); IFile file = null; if (o instanceof IAdaptable) { file = ((IAdaptable) o).getAdapter(IFile.class); } if (file != null) { String name = file.getName(); int idxOfDot = name.lastIndexOf('.'); if (idxOfDot != -1) { name = name.substring(0, idxOfDot); } // use a temporary so that the setting does not stick even if the handler is reused. MarkupLanguage prev = markupLanguage; try { if (markupLanguage == null) { markupLanguage = MarkupEditor.loadMarkupLanguagePreference(file); if (markupLanguage == null) { markupLanguage = WikiText.getMarkupLanguageForFilename(file.getName()); } if (markupLanguage == null) { MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.AbstractMarkupResourceHandler_unexpectedError, NLS.bind(Messages.AbstractMarkupResourceHandler_markupLanguageMappingFailed, new Object[] { file.getName() })); return null; } } handleFile(event, file, name); } finally { markupLanguage = prev; } } } } return null; } /** * Classes that need access to the {@code event} should override this method. The default implementation simply * calls {@link #handleFile(IFile, String)} * * @since 1.9 * @see #handleFile(IFile, String) */ protected void handleFile(ExecutionEvent event, IFile file, String name) throws ExecutionException { handleFile(file, name); } /** * @param event * @since 1.1 */ protected ISelection computeSelection(ExecutionEvent event) { ISelection selection = HandlerUtil.getActiveMenuSelection(event); if (!(selection instanceof IStructuredSelection)) { selection = HandlerUtil.getActiveMenuEditorInput(event); } if (!(selection instanceof IStructuredSelection)) { selection = HandlerUtil.getCurrentSelection(event); } if (!(selection instanceof IStructuredSelection)) { selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection(); } return selection; } /** * Perform the command's function on the given file. * * @param file * the input file to process * @param name * the name of the output file without file extension * @see #handleFile(ExecutionEvent, IFile, String) */ protected abstract void handleFile(IFile file, String name) throws ExecutionException; /** * @since 3.0 */ public MarkupLanguage getMarkupLanguage() { return markupLanguage; } /** * @since 3.0 */ public void setMarkupLanguage(MarkupLanguage markupLanguage) { this.markupLanguage = markupLanguage; } /** * @since 1.1 */ public IStructuredSelection getSelection() { return selection; } /** * @since 1.1 */ public void setSelection(IStructuredSelection selection) { this.selection = selection; } }