blob: 9c6a6cab4867ee8898c7493a04ca4447aed68c5d [file] [log] [blame]
/*******************************************************************************
* 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;
}
}