/******************************************************************************* * 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); } }