blob: d38ae8680cddddc88a80bf7fe1e5193e1554e003 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.bpel.common.ui.ColorUtils;
import org.eclipse.bpel.model.util.BPELConstants;
import org.eclipse.bpel.ui.expressions.Functions;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.ISaveContext;
import org.eclipse.core.resources.ISaveParticipant;
import org.eclipse.core.resources.ISavedState;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
public class BPELUIPlugin extends AbstractUIPlugin {
public static final String PLUGIN_ID = "org.eclipse.bpel.ui"; //$NON-NLS-1$
/** */
static public BPELUIPlugin INSTANCE;
private ColorRegistry colorRegistry;
protected boolean imagesAndColorsInitialized;
// takes care of changes to the BPEL file
private BPELResourceChangeListener resourceChangeListener;
private ISaveParticipant saveParticipant;
// The templates that are provided for new file creation
private Templates mTemplates;
/**
* Constructor.
*/
public BPELUIPlugin() {
super();
}
/**
* @param path
* @return return the plugin URI
*/
public URI getURI ( String path ) {
return URI.createPlatformPluginURI(getID() + path, false);
}
/**
* Creates an image without storing it in the image registry.
* @param relativeLocation the relative location of the icon in this plug-in, e.g. "icons/test.gif"
* @return the created image, or null if it could not be created (a log entry is created then)
*/
public static Image createImage( String relativeLocation ) {
Image result = null;
try {
ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, relativeLocation );
result = desc.createImage();
} catch( Exception e ) {
log( e, IStatus.WARNING );
}
return result;
}
/**
* @return
*/
public String getDefaultPage() {
return getPreferenceStore().getString(IBPELUIConstants.DEFAULT_EDITOR_PAGE);
}
/**
* setDefaultPage
* Set the default page to open when the editor starts.
* @param page
*/
public void setDefaultPage(String page) {
getPreferenceStore().setValue(IBPELUIConstants.DEFAULT_EDITOR_PAGE, page);
}
/**2
* Creates an image descriptor and places it in the image registry.
*/
private void createImageDescriptor(String id, URL baseURL) {
URL url = null;
try {
url = new URL(baseURL, IBPELUIConstants.ICON_PATH + id);
} catch (MalformedURLException e) {
BPELUIPlugin.log(e);
}
ImageDescriptor desc = ImageDescriptor.createFromURL(url);
getImageRegistry().put(id, desc);
}
/**
* Returns the image descriptor for the given image ID.
* Returns null if there is no such image.
*/
public ImageDescriptor getImageDescriptor(String id) {
return getImageRegistry().getDescriptor(id);
}
public Image getImage(String id) {
return getImageRegistry().get(id);
}
public String getID () {
return getBundle().getSymbolicName();
}
private void initializeColors() {
this.colorRegistry = new ColorRegistry();
RGB color_240_240_240 = ColorUtils.getRelativeRGB(240, 240, 240);
RGB color_255_255_255 = ColorUtils.getRelativeRGB(255, 255, 255);
this.colorRegistry.put(IBPELUIConstants.COLOR_FLOW_BORDER, ColorUtils.getRelativeRGB(112, 152, 224));
this.colorRegistry.put(IBPELUIConstants.COLOR_GRADIENT_FROM, color_255_255_255);
this.colorRegistry.put(IBPELUIConstants.COLOR_GRADIENT_TO, color_240_240_240);
if (ColorUtils.isInvertedColorScheme()) {
this.colorRegistry.put(IBPELUIConstants.COLOR_ACTIVITY_BORDER, ColorUtils.getRelativeRGB(25, 25, 25));
this.colorRegistry.put(IBPELUIConstants.COLOR_COMPOSITE_ACTIVITY_BORDER, ColorUtils.getRelativeRGB(25, 25, 25));
this.colorRegistry.put(IBPELUIConstants.COLOR_SCOPE_BORDER, ColorUtils.getRelativeRGB(25, 25, 25));
this.colorRegistry.put(IBPELUIConstants.COLOR_IMPLICIT_LINK, ColorUtils.getRelativeRGB(25, 25, 25));
} else {
this.colorRegistry.put(IBPELUIConstants.COLOR_ACTIVITY_BORDER, ColorUtils.getRelativeRGB(176, 176, 176));
this.colorRegistry.put(IBPELUIConstants.COLOR_COMPOSITE_ACTIVITY_BORDER, ColorUtils.getRelativeRGB(205, 205, 205));
this.colorRegistry.put(IBPELUIConstants.COLOR_SCOPE_BORDER, ColorUtils.getRelativeRGB(205, 205, 205));
this.colorRegistry.put(IBPELUIConstants.COLOR_IMPLICIT_LINK, ColorUtils.getRelativeRGB(200, 200, 200));
}
this.colorRegistry.put(IBPELUIConstants.COLOR_HILIGHT_NODE, ColorUtils.getRelativeRGB(255, 255, 0));
this.colorRegistry.put(IBPELUIConstants.COLOR_VARIABLE_BACKGROUND, ColorUtils.getRelativeRGB(255, 255, 255));
this.colorRegistry.put(IBPELUIConstants.COLOR_VARIABLE_SEPARATOR, ColorUtils.getRelativeRGB(230, 230, 230));
this.colorRegistry.put(IBPELUIConstants.COLOR_VARIABLE_REFERENCE, ColorUtils.getRelativeRGB(99, 151, 245));
this.colorRegistry.put(IBPELUIConstants.COLOR_LINK_ONE, ColorUtils.getRelativeRGB(238, 197, 253));
this.colorRegistry.put(IBPELUIConstants.COLOR_LINK_TWO, ColorUtils.getRelativeRGB(73, 0, 107));
this.colorRegistry.put(IBPELUIConstants.COLOR_LINK_THREE, ColorUtils.getRelativeRGB(222, 144, 254));
this.colorRegistry.put(IBPELUIConstants.COLOR_WHITE, ColorUtils.getRelativeRGB(255, 255, 255));
this.colorRegistry.put(IBPELUIConstants.COLOR_BLACK, ColorUtils.getRelativeRGB(0,0,0));
this.colorRegistry.put(IBPELUIConstants.COLOR_RED, ColorUtils.getRelativeRGB(255,0,0));
this.colorRegistry.put(IBPELUIConstants.COLOR_DARK_RED, ColorUtils.getRelativeRGB(0x80, 0, 0));
this.colorRegistry.put(IBPELUIConstants.COLOR_GREEN, ColorUtils.getRelativeRGB( 0, 255, 0));
this.colorRegistry.put(IBPELUIConstants.COLOR_DARK_GREEN, ColorUtils.getRelativeRGB(0, 0x80, 0));
this.colorRegistry.put(IBPELUIConstants.COLOR_YELLOW, ColorUtils.getRelativeRGB(255, 255, 0));
this.colorRegistry.put(IBPELUIConstants.COLOR_DARK_YELLOW, ColorUtils.getRelativeRGB(0x80, 0x80, 0));
this.colorRegistry.put(IBPELUIConstants.COLOR_BLUE, ColorUtils.getRelativeRGB( 0, 0 ,255));
this.colorRegistry.put(IBPELUIConstants.COLOR_DARK_BLUE, ColorUtils.getRelativeRGB(0, 0, 0x80));
this.colorRegistry.put(IBPELUIConstants.COLOR_MAGENTA, ColorUtils.getRelativeRGB( 255, 0, 255));
this.colorRegistry.put(IBPELUIConstants.COLOR_DARK_MAGENTA, ColorUtils.getRelativeRGB( 0x80, 0, 0x80));
this.colorRegistry.put(IBPELUIConstants.COLOR_CYAN, ColorUtils.getRelativeRGB( 0, 255, 255));
this.colorRegistry.put(IBPELUIConstants.COLOR_DARK_CYAN, ColorUtils.getRelativeRGB( 0, 0x80, 0x80));
this.colorRegistry.put(IBPELUIConstants.COLOR_GRAY, ColorUtils.getRelativeRGB( 0xC0, 0xC0, 0xC0));
this.colorRegistry.put(IBPELUIConstants.COLOR_DARK_GRAY, ColorUtils.getRelativeRGB(0x80, 0x80, 0x80));
this.colorRegistry.put(IBPELUIConstants.COLOR_HANDLER_LINK_FH, ColorUtils.getRelativeRGB(222,145,29));
this.colorRegistry.put(IBPELUIConstants.COLOR_HANDLER_LINK_CH, ColorUtils.getRelativeRGB(124,151,203));
this.colorRegistry.put(IBPELUIConstants.COLOR_HANDLER_LINK_EH, ColorUtils.getRelativeRGB(179,179,179));
this.colorRegistry.put(IBPELUIConstants.COLOR_HANDLER_LINK_TH, ColorUtils.getRelativeRGB(255,0,0));
}
/**
* TODO: registry should be moved to editors and removed from plug-in
*/
public ColorRegistry getColorRegistry() {
if (this.colorRegistry == null) {
initialize();
}
return this.colorRegistry;
}
@Override
public ImageRegistry getImageRegistry() {
ImageRegistry result = super.getImageRegistry();
initialize();
return result;
}
/**
* Initializes the table of images used in this plugin.
*/
private void initializeImages() {
URL baseURL = getBundle().getEntry("/"); //$NON-NLS-1$
// A little reflection magic ... so that we don't
// have to add the createImageDescriptor every time
// we add it to the IBPELUIConstants ..
Field fields[] = IBPELUIConstants.class.getFields();
for( Field f : fields ) {
if (f.getType() != String.class) {
continue;
}
String name = f.getName();
if (name.startsWith("ICON_") || name.startsWith("CURSOR_")) { //$NON-NLS-1$ //$NON-NLS-2$
try {
String value = (String) f.get(null);
createImageDescriptor(value, baseURL);
} catch (Exception e) {
log(e);
}
}
}
}
/**
* @see org.eclipse.core.runtime.Plugin#start(BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
INSTANCE = this;
initializePreferences();
initializeResourceChangeListener();
initFunctions ();
}
protected void initializePreferences() {
IPreferenceStore store = getPreferenceStore();
store.setDefault(IBPELUIConstants.PREF_SHOW_FREEFORM_FLOW, true);
store.setDefault(IBPELUIConstants.PREF_WARN_LINKS, true);
store.setDefault(IBPELUIConstants.PREF_AUTO_FLOW_LAYOUT, false);
store.setDefault(IBPELUIConstants.PREF_USE_ANIMATION, true);
store.setDefault(IBPELUIConstants.PREF_CREATE_SPEC_COMPLIANT_PROCESS, false);
}
/**
* Installs the IResourceChangeListener for the BPEL Plugin. Also
* checks if there were any changes to BPEL files while the plug-in
* was not active.
*/
private void initializeResourceChangeListener() throws CoreException {
this.resourceChangeListener = new BPELResourceChangeListener();
// Add the save participant in a separate thread
// to make sure that it doesn't block the UI thread and potentially cause
// deadlocks with the code that caused our plugin to be started.
Thread initSaveParticipantThread = new Thread(new Runnable() {
@Override
public void run() {
try {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
workspace.addResourceChangeListener(BPELUIPlugin.this.resourceChangeListener, IResourceChangeEvent.POST_BUILD);
ISavedState savedState = workspace.addSaveParticipant(BPELUIPlugin.this, getSaveParticipant());
if (savedState != null) {
savedState.processResourceChangeEvents(BPELUIPlugin.this.resourceChangeListener);
}
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
});
initSaveParticipantThread.setName("BPELUIPlugin init"); //$NON-NLS-1$
initSaveParticipantThread.start();
}
public boolean activateZoomSupport() {
return false;
}
public Templates getTemplates ()
{
if (this.mTemplates == null) {
this.mTemplates = new Templates ();
this.mTemplates.initializeFrom( getBundle() );
}
return this.mTemplates;
}
protected void initialize() {
if (!this.imagesAndColorsInitialized) {
this.imagesAndColorsInitialized = true;
initializeImages();
initializeColors();
}
}
@SuppressWarnings("nls")
void initFunctions () {
Job job = new Job ("Reading XPath Function Registry ...") {
@Override
protected IStatus run(IProgressMonitor monitor) {
long start = System.currentTimeMillis();
IStatus status;
try {
Functions.getInstance( BPELConstants.XMLNS_XPATH_EXPRESSION_LANGUAGE );
status = new Status(IStatus.OK, PLUGIN_ID, 0, "Done",null); //$NON-NLS-1$
} catch (Throwable t ) {
log(t);
status = new Status(IStatus.ERROR,PLUGIN_ID,0,t.getLocalizedMessage(),t);
}
long end = System.currentTimeMillis();
System.out.println("InitFunctions took: " + (end - start) + "ms");
monitor.done();
done(Job.ASYNC_FINISH);
return status;
}
};
job.setPriority(Job.SHORT);
job.schedule();
}
/**
* @see org.eclipse.core.runtime.Plugin#stop(BundleContext)
*/
@Override
public void stop(BundleContext context) throws Exception {
super.stop(context);
IWorkspace workspace = ResourcesPlugin.getWorkspace();
if (workspace != null) {
workspace.removeResourceChangeListener(this.resourceChangeListener);
}
}
/**
* We are only interested in the resource delta while the plugin was
* not active and don't really care about the plug-in save lifecycle.
*/
private ISaveParticipant getSaveParticipant() {
if (this.saveParticipant == null) {
this.saveParticipant = new ISaveParticipant() {
@Override
public void doneSaving(ISaveContext context) {
}
@Override
public void prepareToSave(ISaveContext context) throws CoreException {
}
@Override
public void rollback(ISaveContext context) {
}
@Override
public void saving(ISaveContext context) throws CoreException {
context.needDelta();
}
};
}
return this.saveParticipant;
}
/**
* Returns the resource change listener.
*/
public BPELResourceChangeListener getResourceChangeListener() {
return this.resourceChangeListener;
}
/**
* Return the dialog settings for a given object. The object may be a string
* or any other java object. In that case, the object's class name will be used
* to retrieve that section name.
*
* @param object
* @return the dialog settings for that object
*
*/
public IDialogSettings getDialogSettingsFor ( Object object )
{
String name = object.getClass().getName();
if (object instanceof String) {
name = (String) object;
}
IDialogSettings main = getDialogSettings();
IDialogSettings settings = main.getSection( name );
if (settings == null) {
settings = main.addNewSection(name);
}
return settings;
}
/**
* Utility methods for logging exceptions.
*/
public static void log(Throwable e, int severity) {
IStatus status = null;
if (e instanceof CoreException) {
status = ((CoreException)e).getStatus();
} else {
String m = e.getMessage();
status = new Status(severity, PLUGIN_ID, 0, m==null? "<no message>" : m, e); //$NON-NLS-1$
}
System.out.println(e.getClass().getName()+": "+status); //$NON-NLS-1$
INSTANCE.getLog().log(status);
}
/**
* Utility methods for logging exceptions.
*/
public static void log( Throwable e, String message, int severity ) {
IStatus status = new Status( severity, PLUGIN_ID, message, e );
INSTANCE.getLog().log( status );
}
/**
* @param throwable
*/
public static void log(Throwable throwable) {
log(throwable, IStatus.ERROR); }
}