blob: b8f4dd612f9741856efb535769b8afd9c8751597 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2005, 2007 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.gmf.runtime.diagram.ui.editpolicies;
import java.util.Iterator;
import java.util.List;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Tool;
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.PaletteListener;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.SelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.gmf.runtime.common.ui.services.icon.IconService;
import org.eclipse.gmf.runtime.diagram.ui.internal.services.palette.PaletteToolEntry;
import org.eclipse.gmf.runtime.diagram.ui.tools.CreationTool;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.gef.ui.internal.palette.PaletteStack;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
/**
* This is the default popup bar editpolicy installed on diagrams. The popup bar
* is populated using the element types of the tools of the palette drawer of
* the last selected palette tool. If the diagram was just opened, the popup bar
* is populated using the element types of the tools of the palette drawer that
* is initially open. If there is no drawer initially open, then
* <code>fillWithDefaults()</code> is called to initially populate the popup
* bar.
*
* @author cmahoney
*/
public class DiagramPopupBarEditPolicy
extends PopupBarEditPolicy
implements PaletteListener {
/**
* Holds the last active palette tool.
*/
private ToolEntry theLastTool = null;
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.EditPolicy#activate()
*/
public void activate() {
super.activate();
addPaletteListener();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.EditPolicy#deactivate()
*/
public void deactivate() {
removePaletteListener();
super.deactivate();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.PopupBarEditPolicy#fillActionDescriptors()
*/
protected void fillPopupBarDescriptors() {
fillBasedOnLastActivePaletteTool();
if (getPopupBarDescriptors().isEmpty()) {
fillBasedOnOpenPaletteDrawer();
if (getPopupBarDescriptors().isEmpty()) {
fillWithDefaults();
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.palette.PaletteListener#activeToolChanged(org.eclipse.gef.ui.palette.PaletteViewer,
* org.eclipse.gef.palette.ToolEntry)
*/
public void activeToolChanged(PaletteViewer palette, ToolEntry tool) {
if (!(tool instanceof SelectionToolEntry)) {
theLastTool = tool;
}
}
/**
* Adds this edit policy as a palette listener.
*/
private void addPaletteListener() {
PaletteViewer paletteViewer = getHost().getViewer().getEditDomain()
.getPaletteViewer();
if (paletteViewer != null) {
paletteViewer.addPaletteListener(this);
}
}
/**
* Removes this edit policy as a palette listener.
*/
private void removePaletteListener() {
PaletteViewer paletteViewer = getHost().getViewer().getEditDomain()
.getPaletteViewer();
if (paletteViewer != null) {
paletteViewer.removePaletteListener(this);
}
theLastTool = null;
}
/**
* Adds popup bar descriptors for all the shape tools in the palette
* container of the last active palette tool. Subclasses may override if
* they wish to customize this behavior for their diagram.
*/
protected void fillBasedOnLastActivePaletteTool() {
if (theLastTool == null)
return;
// Find the palette group or drawer containing the last active tool.
PaletteContainer container = theLastTool.getParent();
if (container == null) {
return;
}
while (!(container instanceof PaletteDrawer)
&& !(container instanceof PaletteGroup)
&& !(container instanceof PaletteRoot)
&& container.getParent() != null) {
container = container.getParent();
}
// Make sure the palette container is still in the palette root and has
// not been removed. See bugzilla#176752.
PaletteRoot realPaletteRoot = getHost().getViewer().getEditDomain()
.getPaletteViewer().getPaletteRoot();
PaletteContainer paletteRoot = container;
boolean sameRoot = false;
while (paletteRoot != null) {
paletteRoot = paletteRoot.getParent();
if (paletteRoot == realPaletteRoot) {
sameRoot = true;
break;
}
}
if (sameRoot) {
fillWithPaletteToolsInContainer(container);
}
}
/**
* Adds popup bar descriptors for all the shape tools in the given palette
* container. Subclasses may override if they wish to customize this
* behavior for their diagram.
*
* @param palContainer
* the <code>PaletteContainer</code>
*/
protected void fillWithPaletteToolsInContainer(PaletteContainer palContainer) {
if (palContainer != null) {
List theEntries = palContainer.getChildren();
int isz = theEntries.size();
for (int i = 0; i < isz; i++) {
PaletteEntry theEntry = (PaletteEntry) theEntries.get(i);
if (theEntry != null) {
if (theEntry instanceof PaletteToolEntry) {
PaletteToolEntry theXtoolsEntry = (PaletteToolEntry) theEntry;
Tool tempTool = theXtoolsEntry.createTool();
if ((tempTool != null)
&& (tempTool instanceof CreationTool)) {
CreationTool theXtoolsTool = (CreationTool) tempTool;
IElementType theToolType = theXtoolsTool
.getElementType();
if ((theToolType != null)) {
Image image = IconService.getInstance().getIcon(theToolType);
// Workaround for mirroring and SWT.ICON issue
if (image != null && image.type == SWT.ICON && isMirrored()) {
image = convert(image);
}
addPopupBarDescriptor(theToolType, image);
}
}
} else if (theEntry instanceof PaletteStack) {
// add all the entries from a palette stack as well
PaletteStack theStack = (PaletteStack) theEntry;
fillWithPaletteToolsInContainer(theStack);
}
}
}
}
}
private boolean isMirrored() {
return ((getHost().getViewer().getControl().getStyle() & SWT.MIRRORED) != 0);
}
private Image convert( Image srcImage) {
int height = srcImage.getBounds().height;
int width = srcImage.getBounds().width;
ImageData srcImageData = srcImage.getImageData();
RGB backgroundRGB = ((GraphicalEditPart) getHost()).getFigure().getBackgroundColor().getRGB();
int backgroundColor = srcImageData.palette.getPixel(backgroundRGB);
// Set the transparent pixels to the background color
int count = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (((srcImageData.maskData[count>>3] >> (7-(count % 8))) & 1) == 0) {
srcImageData.setPixel(x, y, backgroundColor);
}
count++;
}
}
srcImageData.maskData = null;
Image convertedImage = ImageDescriptor.createFromImageData(srcImageData).createImage(srcImage.getDevice());
imagesToBeDisposed.add(convertedImage);
return convertedImage;
}
/**
* Adds popup bar descriptors for all the shape tools in the palette drawer
* that is initially open. Subclasses may override if they wish to customize
* this behavior for their diagram.
*/
protected void fillBasedOnOpenPaletteDrawer() {
PaletteViewer paletteViewer = getHost().getViewer().getEditDomain()
.getPaletteViewer();
if (paletteViewer != null) {
for (Iterator iter = paletteViewer.getPaletteRoot().getChildren()
.iterator(); iter.hasNext();) {
Object child = iter.next();
if (child instanceof PaletteDrawer) {
PaletteDrawer drawer = (PaletteDrawer) child;
if (drawer.isInitiallyOpen()) {
fillWithPaletteToolsInContainer(drawer);
break;
}
}
}
}
}
/**
* Subclasses can override to provide default tools if the popup bar cannot
* be populated based on the state of the palette.
*/
protected void fillWithDefaults() {
// by default, add no popup bar descriptors.
}
}