blob: 45613a470b52735c4fe03323f701a4892ff3412d [file] [log] [blame]
/*******************************************************************************
* 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();
}
}