/******************************************************************************* * Copyright (c) 2006, 2017 IBM Corporation 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: * IBM Corporation - original Action implementation and API * Red Hat - migration to Handler implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.systemtap.ui.ide; import java.io.File; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; /** * A handler used for opening SystemTap scripts from the filesystem. * @since 3.0 */ public class OpenFileHandler extends AbstractHandler { private boolean successful; private boolean cancelled; private IWorkbenchWindow window = null; public OpenFileHandler() { } /** * Opens the provided file's editor input, if it is a valid Systemtap file. * @param file The file to open. */ public void executeOnFile(File file) { if (window == null) { window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); } if (file != null && file.exists() && file.getName().endsWith(".stp")) { //$NON-NLS-1$ runActions(file); } } /** * Queries the user for the SystemTap file to open. * @param event If execution is handled by a plugin extension, this will contain * an event containing all the information about the current state of the application. * To execute this code elsewhere, it is sufficient to pass <code>null</code> here. * */ @Override public Object execute(ExecutionEvent event) { if (window == null) { window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); } File file = queryFile(); if (file != null) { runActions(file); } return null; } private void runActions(File file) { successful = false; IFileStore fileStore = EFS.getLocalFileSystem().getStore(file.toURI()); IWorkbenchPage page = window.getActivePage(); try { IDE.openEditorOnFileStore(page, fileStore); successful = true; } catch (PartInitException e) { ErrorDialog.openError(window.getShell(), Localization.getString("OpenFileHandler.Problem"), //$NON-NLS-1$ Localization.getString("OpenFileHandler.ProblemMessage"), //$NON-NLS-1$ new Status(IStatus.ERROR, IDEPlugin.PLUGIN_ID, e.getMessage(), e)); } } /** * @return The style to use for the FileDialog when querying for a file. * @since 2.2 */ protected int dialogStyle() { return SWT.OPEN; } /** * @return The name to give to the FileDialog when querying for a file. * @since 2.2 */ protected String dialogName() { return Localization.getString("OpenFileHandler.OpenFile"); //$NON-NLS-1$ } /** * Request the name and location of the file to the user. * @return the File object associated to the selected file. */ protected File queryFile() { FileDialog dialog = new FileDialog(window.getShell(), dialogStyle()); dialog.setFilterExtensions(new String[]{"*.stp"}); //$NON-NLS-1$ dialog.setText(dialogName()); String path = dialog.open(); if (path != null && path.length() > 0) { cancelled = false; return new File(path); } cancelled = true; return null; } /** * @return <code>true</code> if the last file query was cancelled, * or <code>false</code> if a file was selected. * @since 2.2 */ public boolean wasCancelled() { return cancelled; } public boolean isSuccessful() { return successful; } }