org.eclipse.photran.internal.ui.actions.FortranEditorActionDelegate.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.photran.internal.ui.actions.FortranEditorActionDelegate.java

Source

/*******************************************************************************
 * Copyright (c) 2007 University of Illinois at Urbana-Champaign 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:
 *     UIUC - Initial API and implementation
 *******************************************************************************/
package org.eclipse.photran.internal.ui.actions;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.photran.internal.ui.editor.AbstractFortranEditor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.IProgressService;

/**
 * Base class (with utility methods) for Fortran editor actions
 * 
 * @author Jeff Overbey
 */
public abstract class FortranEditorActionDelegate extends Action
        implements IEditorActionDelegate, IWorkbenchWindowActionDelegate, IRunnableWithProgress {

    ///////////////////////////////////////////////////////////////////////////
    // Fields
    ///////////////////////////////////////////////////////////////////////////

    protected IWorkbenchWindow window = null;
    protected AbstractFortranEditor fEditor = null;

    ///////////////////////////////////////////////////////////////////////////
    // Constructors
    ///////////////////////////////////////////////////////////////////////////

    public FortranEditorActionDelegate() {
    }

    public FortranEditorActionDelegate(AbstractFortranEditor ed) {
        fEditor = ed;
    }

    ///////////////////////////////////////////////////////////////////////////
    // IActionDelegate Implementation
    ///////////////////////////////////////////////////////////////////////////

    public void run(IAction action) {
        if (this.window != null) {
            IEditorPart editor = this.window.getActivePage().getActiveEditor();
            fEditor = editor instanceof AbstractFortranEditor ? (AbstractFortranEditor) editor : null;
        }

        if (this.fEditor != null) {
            IProgressService context = PlatformUI.getWorkbench().getProgressService();
            ISchedulingRule lockEntireWorkspace = ResourcesPlugin.getWorkspace().getRoot();
            try {
                context.runInUI(context, this, lockEntireWorkspace);
            } catch (InvocationTargetException e) {
                e.printStackTrace();
                MessageDialog.openError(fEditor.getShell(), "Unhandled Exception", e.getMessage());
            } catch (InterruptedException e) {
                // Do nothing
            }
        }
    }

    public void selectionChanged(IAction action, ISelection selection) {
        ;
    }

    ///////////////////////////////////////////////////////////////////////////
    // IWorkbenchWindowActionDelegate Implementation
    ///////////////////////////////////////////////////////////////////////////

    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

    public void dispose() {
        ;
    }

    ///////////////////////////////////////////////////////////////////////////
    // IEditorActionDelegate Implementation
    ///////////////////////////////////////////////////////////////////////////

    public void setActiveEditor(IAction action, IEditorPart targetEditor) {
        fEditor = targetEditor instanceof AbstractFortranEditor ? (AbstractFortranEditor) targetEditor : null;
    }

    ///////////////////////////////////////////////////////////////////////////
    // Utility Methods for Subclasses
    ///////////////////////////////////////////////////////////////////////////

    protected AbstractFortranEditor getFortranEditor() {
        return fEditor;
    }

    protected Shell getShell() {
        return fEditor == null ? null : fEditor.getShell();
    }

    protected File createTempFile() throws IOException {
        File tempFile = File.createTempFile("photran-tmp", ".txt");
        tempFile.deleteOnExit();
        return tempFile;
    }

    protected PrintStream createPrintStream(File tempFile) throws FileNotFoundException {
        return new PrintStream(new BufferedOutputStream(new FileOutputStream(tempFile)));
    }

    public void openHtmlViewerOn(String title, String str) {
        try {
            File temp = createTempFile();
            PrintStream text = createPrintStream(temp);
            text.print(str);
            text.close();
            openHtmlViewerOn(title, temp);
        } catch (IOException e) {
            MessageDialog.openError(getFortranEditor().getShell(), "Error",
                    "Unable to create temporary file.\n\n" + e.getMessage());
        }
    }

    public void openHtmlViewerOn(final String title, final File file) {
        final class HtmlRunnable implements Runnable {
            public void run() {
                try {
                    // This is cheating, but it works
                    //new URLHyperlink(new Region(0, 0), filPath).open();

                    PlatformUI.getWorkbench().getBrowserSupport().createBrowser(0, null, title, null)
                            .openURL(file.toURL());
                } catch (final Throwable e) {
                    Display.getDefault().asyncExec(new Runnable() {
                        public void run() {
                            MessageDialog.openError(getFortranEditor().getShell(), "Error",
                                    "Unable to open Web browser.\n\n" + e.getMessage());
                        }
                    });
                }
            }
        }

        Display.getDefault().syncExec(new HtmlRunnable());
    }
}