/******************************************************************************* * Copyright (c) 2005 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.common.ui.palette; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import org.eclipse.bpel.common.ui.CommonUIPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; import org.eclipse.gef.dnd.TemplateTransferDragSourceListener; import org.eclipse.gef.palette.PaletteContainer; import org.eclipse.gef.palette.PaletteRoot; import org.eclipse.gef.palette.ToolEntry; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.gef.ui.palette.PaletteViewerProvider; import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.part.IPageSite; /** * Graphical editor to be integrated with a GEFDetailsEditor. */ @SuppressWarnings("nls") public abstract class GraphicalEditorWithPalette extends GraphicalEditorWithFlyoutPalette { static final String EXTPT_PALETTE_ADDITIONS = "paletteAdditions"; static final String ELEMENT_ADDITIONS = "additions"; static final String ATT_PROVIDER = "provider"; static final String ATT_IMPORTANCE = "importance"; static final String ATT_CLASS = "class"; static final String ATT_DEFAULT = "default"; static final String ATT_CATEGORY = "category"; static final String ATT_CATEGORY_ID = "categoryId"; static final String ATT_CATEGORY_ORDER = "categoryOrder"; static final String ATT_TARGET_EDITOR = "targetEditor"; private PaletteRoot paletteRoot; /** * */ public GraphicalEditorWithPalette() { super(); } /** * @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose() */ @Override public void dispose() { super.dispose(); paletteRoot = null; } @Override protected CustomPalettePage createPalettePage() { return new CustomPalettePage(getPaletteViewerProvider()) { @Override public void init(IPageSite pageSite) { super.init(pageSite); IAction copy = getActionRegistry().getAction(ActionFactory.COPY.getId()); pageSite.getActionBars().setGlobalActionHandler( ActionFactory.COPY.getId(), copy); } }; } /** * Get the action registry. * * @see org.eclipse.gef.ui.parts.GraphicalEditor#getActionRegistry() */ @Override protected ActionRegistry getActionRegistry() { return super.getActionRegistry(); } @Override protected PaletteViewerProvider createPaletteViewerProvider() { return new PaletteViewerProvider(getEditDomain()) { @Override protected void configurePaletteViewer(PaletteViewer viewer) { super.configurePaletteViewer(viewer); // viewer.setCustomizer(new LogicPaletteCustomizer()); viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer)); } }; } /** * The implementation in new versions of GraphicalEditor assumes that 'this' will be * the top-level editor. For us, the assumption is most likely wrong--a DetailsEditor * is probably the top-level editor... */ @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { // Bugzilla 330526 getSite().getShell().getDisplay().asyncExec(new Runnable() { public void run() { updateActions(getSelectionActions()); } }); } @Override protected PaletteRoot getPaletteRoot() { if (paletteRoot == null) { paletteRoot = new PaletteRoot(); createPalette (); } return paletteRoot; } HashMap<String,IOrderedPaletteEntry> paletteContainers () { // Create extension items HashMap<String,IOrderedPaletteEntry> map = new HashMap<String,IOrderedPaletteEntry>(); for(Object next : paletteRoot.getChildren()) { if (next instanceof IOrderedPaletteEntry) { IOrderedPaletteEntry entry = (IOrderedPaletteEntry)next; map.put(entry.getCategoryId(), entry); } } return map; } protected String getPaletteAdditionsContributorId() { return getEditorSite().getId(); } protected void createPalette ( ) { // Get the id of this editor String id = getPaletteAdditionsContributorId(); ArrayList<IConfigurationElement> listOfAdditions = new ArrayList<IConfigurationElement>(); for( IConfigurationElement additions : getConfigurationElements(EXTPT_PALETTE_ADDITIONS) ) { if (additions.getName().equals(ELEMENT_ADDITIONS) == false || id.equals ( additions.getAttribute(ATT_TARGET_EDITOR)) == false ) { continue; } listOfAdditions.add( additions ); } // Sort the additions in order. Collections.sort(listOfAdditions, new Comparator<IConfigurationElement> () { int getInt ( String n ) { try { return Integer.parseInt(n); } catch (Throwable t) { return 10; } } public int compare(IConfigurationElement o1, IConfigurationElement o2) { return getInt ( o1.getAttribute(ATT_IMPORTANCE) ) - getInt ( o2.getAttribute(ATT_IMPORTANCE) ); } }); HashMap<String,IOrderedPaletteEntry> containerMap = null; // Process the palette additions. for(IConfigurationElement additions : listOfAdditions ) { String provider = additions.getAttribute(ATT_PROVIDER); if (provider != null) { try { IPaletteProvider entry = (IPaletteProvider) additions.createExecutableExtension(ATT_PROVIDER); entry.contributeItems( paletteRoot ); // Recompute the categories, added by this bulk-addition containerMap = null; } catch ( CoreException ce ) { CommonUIPlugin.getDefault().getLog().log(ce.getStatus()); } } if (containerMap == null) { containerMap = paletteContainers(); } // Now process individual additions. for (IConfigurationElement addition: additions.getChildren() ) { String def = addition.getAttribute(ATT_DEFAULT); String categoryName = addition.getAttribute(ATT_CATEGORY); String categoryId = addition.getAttribute(ATT_CATEGORY_ID); int categoryOrder = 100; try { categoryOrder = Math.abs( Integer.parseInt( addition.getAttribute(ATT_CATEGORY_ORDER) ) ); } catch (Throwable t) { categoryOrder = 100; } if (categoryId == null) { categoryId = "bpel.user"; } PaletteContainer container = null; PaletteCategory category = null; IOrderedPaletteEntry orderedContainer = containerMap.get(categoryId); if (orderedContainer == null) { container = category = new PaletteCategory(categoryName); //$NON-NLS-1$ category.setOrder ( categoryOrder ); category.setCategoryId ( categoryId ); containerMap.put(categoryId, category); paletteRoot.add(container); } else if (orderedContainer instanceof PaletteCategory) { container = category = (PaletteCategory) orderedContainer; } else if (orderedContainer instanceof PaletteContainer) { container = (PaletteContainer) orderedContainer; } try { ToolEntry entry = (ToolEntry)addition.createExecutableExtension(ATT_CLASS); // The container may be null. This is most likely due to some error in configruation. if (container != null) { container.add(entry); } if (def != null && def.equals("true") && category != null) { //$NON-NLS-1$ category.setDefaultTool(entry); } } catch (CoreException e) { CommonUIPlugin.getDefault().getLog().log(e.getStatus()); } } } // Now sort the palette categories within the list Collections.sort(paletteRoot.getChildren(), new Comparator () { public int compare(Object o1, Object o2) { try { IOrderedPaletteEntry e1 = (IOrderedPaletteEntry) o1; IOrderedPaletteEntry e2 = (IOrderedPaletteEntry) o2; return e1.getOrder() - e2.getOrder(); } catch (Throwable t) { return 0; } } }); } private IConfigurationElement[] getConfigurationElements(String extensionPointId) { IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(CommonUIPlugin.PLUGIN_ID, extensionPointId); if (extensionPoint == null) { return new IConfigurationElement[0]; } return extensionPoint.getConfigurationElements(); } }