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