org.eclipse.wb.internal.core.DesignerPlugin.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wb.internal.core.DesignerPlugin.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Google, Inc.
 * 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:
 *    Google, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.wb.internal.core;

import com.google.common.collect.Maps;
import com.google.common.io.CharStreams;
import com.google.common.io.Closeables;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import java.io.Closeable;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Map;

/**
 * The DesignerPlugin class is the "nexus" of the propertysheet. In WindowBuilder,
 * it's the plugin activator, and contains a number of important utility methods, such
 * as resource loading, logging, obtaining a display and shell, etc.
 * <p>
 * In the AOSP fork, most of the functionality has been ripped out, except for the
 * above mentioned pieces, and this class is no longer a plugin. Instead, it *delegates*
 * to the plugin which initializes it via the {@link #initialize} method for things
 * like logging. For things like image loading, it has its own local code such that
 * it can find its image resources locally instead of requiring the embedding plugin
 * to copy the images into its own jar.
 * <p>
 * "DesignerPlugin" is not a very good name for this class since it is not a plugin,
 * but it was left that way to avoid modifying all the various propertysheet classes;
 * we'd like to keep those as unmodified as possible to make absorbing future
 * WindowBuilder improvements as easy as possible.
 */
public class DesignerPlugin {
    private static AbstractUIPlugin sPlugin;
    private static String sPluginId;

    /**
     * Initialize the property sheet for use in the ADT plugin
     *
     * @param hostPlugin the plugin to embed the property sheet
     * @param pluginId the id of the plugin to use in status messages etc
     * @param isWindows whether we're running on Windows
     * @param isMac whether we're running on Mac
     * @param isLinux whether we're running on Linux
     */
    public static void initialize(AbstractUIPlugin hostPlugin, String pluginId, boolean isWindows, boolean isMac,
            boolean isLinux) {
        assert sPlugin == null; // Can only be used by one client in the same classloader
        sPlugin = hostPlugin;
        sPluginId = pluginId;
        EnvironmentUtils.IS_WINDOWS = isWindows;
        EnvironmentUtils.IS_MAC = isMac;
        EnvironmentUtils.IS_LINUX = isLinux;
    }

    /**
     * Dispose the propertysheet library: free up images from the cache, unregister the
     * plugin reference etc.
     */
    public static void dispose() {
        sPlugin = null;
        for (Image image : sImageCache.values()) {
            image.dispose();
        }
        sImageCache.clear();
        sDescriptorCache.clear();
    }

    /**
     * Reads the contents of an {@link InputStreamReader} using the default
     * platform encoding and return it as a String. This method will close the
     * input stream.
     *
     * @param inputStream the input stream to be read from
     * @param charset the charset to use
     * @return the String read from the stream, or null if there was an error
     */
    public static String readFile(InputStream inputStream, Charset charset) {
        if (inputStream == null) {
            return null;
        }
        Closeable closeMe = inputStream;
        try {
            final InputStreamReader isr = new InputStreamReader(inputStream, charset);
            closeMe = isr;
            try {
                return CharStreams.toString(isr);
            } catch (Exception ioe) {
                // pass -- ignore files we can't read
                return null;
            }
        } finally {
            Closeables.closeQuietly(closeMe);
        }
    }

    /**
     * @return the instance of {@link DesignerPlugin}
     */
    public static AbstractUIPlugin getDefault() {
        assert sPlugin != null;
        return sPlugin;
    }

    // //////////////////////////////////////////////////////////////////////////
    //
    // Display/Shell
    //
    // //////////////////////////////////////////////////////////////////////////
    /**
     * @return the {@link Display} instance, current (if in GUI thread) or
     *         default.
     */
    public static Display getStandardDisplay() {
        Display display = Display.getCurrent();
        if (display == null) {
            display = Display.getDefault();
        }
        return display;
    }

    /**
     * @return the active {@link IWorkbenchWindow}.
     */
    public static IWorkbenchWindow getActiveWorkbenchWindow() {
        return getDefault().getWorkbench().getActiveWorkbenchWindow();
    }

    /**
     * @return the {@link Shell} of active {@link IWorkbenchWindow}.
     */
    public static Shell getShell() {
        if (getActiveWorkbenchWindow() != null) {
            return getActiveWorkbenchWindow().getShell();
        }
        return null;
    }

    /**
     * Logs given {@link IStatus} into Eclipse .log.
     */
    public static void log(IStatus status) {
        getDefault().getLog().log(status);
    }

    /**
     * Logs {@link IStatus} with given message into Eclipse .log.
     */
    public static void log(String message) {
        log(new Status(IStatus.INFO, sPluginId, IStatus.INFO, message, null));
    }

    /**
     * Logs {@link IStatus} with given exception into Eclipse .log.
     */
    public static void log(Throwable e) {
        Status status = new Status(IStatus.ERROR, sPluginId, "", e);
        getDefault().getLog().log(status);
    }

    /**
     * Logs {@link IStatus} with given message and exception into Eclipse .log.
     */
    public static void log(String message, Throwable e) {
        log(createStatus(message, e));
    }

    /**
     * Creates {@link IStatus} for given message and exception.
     */
    public static Status createStatus(String message, Throwable e) {
        return new Status(IStatus.ERROR, "wb", IStatus.ERROR, message, e) {
            @Override
            public boolean isMultiStatus() {
                return true;
            }
        };
    }

    // //////////////////////////////////////////////////////////////////////////
    //
    // Resources
    //
    // //////////////////////////////////////////////////////////////////////////
    private static Map<String, ImageDescriptor> sDescriptorCache = Maps.newHashMap();
    private static Map<String, Image> sImageCache = Maps.newHashMap();

    public static Image getImage(String path) {
        Image image = sImageCache.get(path);
        if (image == null) {
            ImageDescriptor descriptor = getImageDescriptor(path);
            if (descriptor != null) {
                image = descriptor.createImage();
            }
            sImageCache.put(path, image);
        }
        return image;
    }

    public static ImageDescriptor getImageDescriptor(String path) {
        ImageDescriptor descriptor = sDescriptorCache.get(path);
        if (descriptor == null) {
            URL url = DesignerPlugin.class.getResource("icons/" + path); //$NON-NLS-1$
            if (url != null) {
                descriptor = ImageDescriptor.createFromURL(url);
                sDescriptorCache.put(path, descriptor);
            }
        }
        return descriptor;
    }
}