/*******************************************************************************
* Copyright (c) 2012 VMware, Inc.
* 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:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.config.graph.parts;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteGroup;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.PaletteSeparator;
import org.eclipse.gef.palette.SelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.swt.graphics.Image;
import org.springframework.ide.eclipse.config.core.extensions.PageAdaptersExtensionPointConstants;
import org.springframework.ide.eclipse.config.graph.AbstractConfigGraphicalEditor;
import org.springframework.ide.eclipse.config.graph.ConfigGraphPlugin;
import org.springframework.ide.eclipse.config.graph.model.AbstractConfigGraphDiagram;
import org.springsource.ide.eclipse.commons.core.StatusHandler;
/**
* @author Leo Dos Santos
* @author Christian Dupuis
*/
public abstract class AbstractConfigPaletteFactory {
private class AdapterComparator implements Comparator<PaletteDrawer> {
public int compare(PaletteDrawer o1, PaletteDrawer o2) {
return o1.getLabel().compareTo(o2.getLabel());
}
}
// TODO: move to ConfigCoreUtils??
public static Image createScaledImage(Image image, double scale) {
int width = image.getBounds().width;
int height = image.getBounds().height;
return new Image(image.getDevice(), image.getImageData()
.scaledTo((int) (width * scale), (int) (height * scale)));
}
private final AbstractConfigGraphicalEditor editor;
private PaletteRoot root;
private List<PaletteDrawer> adapterDrawers;
public AbstractConfigPaletteFactory(AbstractConfigGraphicalEditor editor) {
this.editor = editor;
createPaletteRoot();
}
private List<PaletteDrawer> createAdapterDrawers() {
adapterDrawers = new ArrayList<PaletteDrawer>();
for (IConfigurationElement config : editor.getAdapterDefinitions()) {
String uri = config.getAttribute(PageAdaptersExtensionPointConstants.ATTR_NAMESPACE_URI);
if (editor.getEditor().containsNamespaceUri(uri)) {
try {
Object obj = config
.createExecutableExtension(PageAdaptersExtensionPointConstants.ATTR_PALETTE_FACTORY);
String label = config.getAttribute(PageAdaptersExtensionPointConstants.ATTR_LABEL);
if (obj instanceof IPaletteFactory) {
IPaletteFactory factory = (IPaletteFactory) obj;
PaletteDrawer drawer = factory.createPaletteDrawer(getDiagram(), uri);
if (drawer != null) {
drawer.setLabel(label);
drawer.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
adapterDrawers.add(drawer);
}
}
}
catch (CoreException e) {
StatusHandler.log(new Status(IStatus.ERROR, ConfigGraphPlugin.PLUGIN_ID,
Messages.AbstractConfigPaletteFactory_ERROR_CREATING_PALETTE, e));
}
}
}
Collections.sort(adapterDrawers, new AdapterComparator());
return adapterDrawers;
}
protected List<PaletteEntry> createCategories() {
List<PaletteEntry> categories = new ArrayList<PaletteEntry>();
categories.add(createControlGroup());
categories.addAll(createComponentDrawers());
categories.addAll(createAdapterDrawers());
return categories;
}
protected abstract List<PaletteDrawer> createComponentDrawers();
protected abstract List<PaletteEntry> createConnectionTools();
protected PaletteContainer createControlGroup() {
PaletteGroup group = new PaletteGroup(Messages.AbstractConfigPaletteFactory_CONTROL_GROUP_TITLE);
List<PaletteEntry> entries = new ArrayList<PaletteEntry>();
ToolEntry tool = new SelectionToolEntry();
entries.add(tool);
root.setDefaultEntry(tool);
// tool = new MarqueeToolEntry();
// entries.add(tool);
List<PaletteEntry> connections = createConnectionTools();
if (connections != null && connections.size() > 0) {
PaletteSeparator sep = new PaletteSeparator();
sep.setUserModificationPermission(PaletteEntry.PERMISSION_NO_MODIFICATION);
entries.add(sep);
entries.addAll(connections);
}
group.addAll(entries);
return group;
}
private void createPaletteRoot() {
root = new PaletteRoot();
root.addAll(createCategories());
}
public AbstractConfigGraphDiagram getDiagram() {
return editor.getDiagram();
}
public PaletteRoot getPaletteRoot() {
return root;
}
public void updatePalette() {
for (PaletteDrawer drawer : adapterDrawers) {
root.remove(drawer);
}
root.addAll(createAdapterDrawers());
}
}