diff options
Diffstat (limited to 'propertysheet/src/org/eclipse/wb/internal/core/DesignerPlugin.java')
-rw-r--r-- | propertysheet/src/org/eclipse/wb/internal/core/DesignerPlugin.java | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/propertysheet/src/org/eclipse/wb/internal/core/DesignerPlugin.java b/propertysheet/src/org/eclipse/wb/internal/core/DesignerPlugin.java new file mode 100644 index 0000000..564a068 --- /dev/null +++ b/propertysheet/src/org/eclipse/wb/internal/core/DesignerPlugin.java @@ -0,0 +1,229 @@ +/******************************************************************************* + * 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) { + return 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; + } +} |