summaryrefslogtreecommitdiff
path: root/propertysheet/src/org/eclipse/wb/internal/core/DesignerPlugin.java
diff options
context:
space:
mode:
Diffstat (limited to 'propertysheet/src/org/eclipse/wb/internal/core/DesignerPlugin.java')
-rw-r--r--propertysheet/src/org/eclipse/wb/internal/core/DesignerPlugin.java229
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;
+ }
+}