blob: 20dac731a361da9c12740d28b2f409b7114bc17a [file] [log] [blame]
/*******************************************************************************
* 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.editparts.borders;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.Platform;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ImageFigure;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.swt.graphics.Image;
public class LeafBorder extends GradientBorder {
// The horizontal margin between the border and the image/text
private static final int leftMargin = 6;
private static final int rightMargin = 13;
// The vertical margin between the border and the image/text
private static final int topMargin = 4;
private static final int bottomMargin = 3;
// The width of the border and the drawer border.
private static final int borderWidth = 1;
private static final int yHandlerIconOffset = 5;
private int faultImageWidth, faultImageHeight;
private int compensationImageWidth, compensationImageHeight;
private int eventImageWidth, eventImageHeight;
private Image compensationImage;
private Image faultImage;
private Image eventImage;
private boolean showFault;
private boolean showCompensation;
private boolean showEvent;
private Rectangle rectFault;
private Rectangle rectCompensation;
private Rectangle rectEvent;
private Rectangle bounds;
// Parent figure used for absolute bounds conversion
private IFigure parentFigure;
private Rectangle rectBounds;
private IFigure faultImageFigure;
private IFigure compensationImageFigure;
private IFigure eventImageFigure;
public LeafBorder(IFigure parentFigure) {
super(false, IBPELUIConstants.ARC_WIDTH);
this.parentFigure = parentFigure;
// Initialize images for fault, compensation and event handler decorations
this.faultImage = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_FAULT_INDICATOR);
org.eclipse.swt.graphics.Rectangle r = faultImage.getBounds();
this.faultImageWidth = r.width;
this.faultImageHeight = r.height;
this.compensationImage = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_COMPENSATION_INDICATOR);
r = compensationImage.getBounds();
this.compensationImageWidth = r.width;
this.compensationImageHeight = r.height;
this.eventImage = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_EVENT_INDICATOR);
r = eventImage.getBounds();
this.eventImageWidth = r.width;
this.eventImageHeight = r.height;
faultImageFigure = new ImageFigure(faultImage);
faultImageFigure.setParent(parentFigure);
compensationImageFigure = new ImageFigure(compensationImage);
compensationImageFigure.setParent(parentFigure);
eventImageFigure = new ImageFigure(eventImage);
eventImageFigure.setParent(parentFigure);
}
@Override
public void paint(IFigure figure, Graphics graphics, Insets insets) {
this.bounds = figure.getBounds();
ColorRegistry registry = BPELUIPlugin.INSTANCE.getColorRegistry();
graphics.setForegroundColor(registry.get(IBPELUIConstants.COLOR_ACTIVITY_BORDER));
int arcSize = IBPELUIConstants.ARC_WIDTH;
// Remember the clipping rectangle
Rectangle oldClip = new Rectangle();
oldClip = graphics.getClip(oldClip);
IMarker topMarker = getTopMarker();
IMarker bottomMarker = getBottomMarker();
if (topMarker != null || bottomMarker != null) {
// Draw the drawers
Rectangle clippingRect;
if (bottomMarker == null) {
clippingRect = new Rectangle(bounds.x, bounds.y, DRAWER_WIDTH, DRAWER_HALF_HEIGHT + 1);
} else if (topMarker == null) {
clippingRect = new Rectangle(bounds.x, bounds.y + DRAWER_HALF_HEIGHT, DRAWER_WIDTH, DRAWER_HALF_HEIGHT + 1);
} else {
clippingRect = new Rectangle(bounds.x, bounds.y, DRAWER_WIDTH, DRAWER_HEIGHT + 1);
}
graphics.setClip(clippingRect);
// -1 due to GEF
graphics.drawRoundRectangle(new Rectangle(bounds.x + DRAWER_INSET, bounds.y, DRAWER_WIDTH * 2, DRAWER_HEIGHT - 1), IBPELUIConstants.ARC_WIDTH, IBPELUIConstants.ARC_WIDTH);
graphics.setClip(oldClip);
if (bottomMarker == null || topMarker == null) {
graphics.drawLine(bounds.x + DRAWER_INSET, bounds.y + DRAWER_HALF_HEIGHT, bounds.x + DRAWER_WIDTH, bounds.y + DRAWER_HALF_HEIGHT);
}
}
// Draw the actual breakpoints
Image topImage = getTopImage();
if (topImage != null) {
int x = bounds.x + DRAWER_INSET;
int y = bounds.y + DRAWER_INSET;
graphics.drawImage(topImage, x, y);
}
Image bottomImage = getBottomImage();
if (bottomImage != null) {
int x = bounds.x + DRAWER_INSET;
int y = bounds.y + DRAWER_INSET + DRAWER_HALF_HEIGHT;
graphics.drawImage(bottomImage, x, y);
}
// Determine whether or not square corners are needed on the left edge.
boolean needSquareCorners = (topImage != null) || (bottomImage != null);
// Calculate the bounding rectangle for the round rectangle
this.rectBounds = new Rectangle();
rectBounds.x = bounds.x + DRAWER_WIDTH;
rectBounds.y = bounds.y;
rectBounds.width = bounds.width - DRAWER_WIDTH * 2;
// -1 due to GEF
rectBounds.height = bounds.height - 1;
if (needSquareCorners) {
Rectangle clippingRect = new Rectangle(rectBounds.x + rectBounds.width / 2, rectBounds.y, rectBounds.width / 2 + 2, rectBounds.height + 1);
graphics.setClip(clippingRect);
graphics.drawRoundRectangle(rectBounds, arcSize, arcSize);
clippingRect = new Rectangle(rectBounds.x, rectBounds.y, rectBounds.width / 2 + 1, rectBounds.height + 1);
graphics.setClip(clippingRect);
graphics.drawRectangle(rectBounds);
graphics.setClip(oldClip);
} else {
graphics.drawRoundRectangle(rectBounds, arcSize, arcSize);
}
computeHandlerIconPositions(ModelHelper.isHorizontalLayout(getEditPart().getModel()));
// Draw the fault image in the upper right hand corner of the round rectangle
if (showFault) {
graphics.setClip(faultImageFigure.getBounds().getCopy());
faultImageFigure.paint(graphics);
graphics.setClip(oldClip);
}
// Draw the compensation image in the upper right hand corner of the round rectangle
if (showCompensation) {
graphics.setClip(compensationImageFigure.getBounds().getCopy());
compensationImageFigure.paint(graphics);
graphics.setClip(oldClip);
}
if (showEvent) {
graphics.setClip(eventImageFigure.getBounds().getCopy());
eventImageFigure.paint(graphics);
graphics.setClip(oldClip);
}
}
@Override
public Insets getInsets(IFigure figure) {
return new Insets(borderWidth + topMargin, borderWidth + leftMargin + DRAWER_WIDTH, borderWidth + bottomMargin, borderWidth + rightMargin + DRAWER_WIDTH);
}
public void setFaultImage(Image faultImage) {
this.faultImage = faultImage;
org.eclipse.swt.graphics.Rectangle r = faultImage.getBounds();
this.faultImageWidth = r.width;
this.faultImageHeight = r.height;
}
public boolean isPointInFaultImage(int x, int y) {
if (showFault) {
Point p = new Point(x, y);
parentFigure.translateToRelative(p);
return rectFault.contains(p);
}
return false;
}
public void setShowFault(boolean showFault) {
this.showFault = showFault;
}
public void setCompensationImage(Image compensationImage) {
this.compensationImage = compensationImage;
org.eclipse.swt.graphics.Rectangle r = compensationImage.getBounds();
this.compensationImageWidth = r.width;
this.compensationImageHeight = r.height;
}
public boolean isPointInCompensationImage(int x, int y) {
if (showCompensation) {
Point p = new Point(x, y);
parentFigure.translateToRelative(p);
return rectCompensation.contains(p);
}
return false;
}
public void setShowCompensation(boolean showCompensation) {
this.showCompensation = showCompensation;
}
public void setEventImage(Image eventImage) {
this.eventImage = eventImage;
org.eclipse.swt.graphics.Rectangle r = eventImage.getBounds();
this.eventImageWidth = r.width;
this.eventImageHeight = r.height;
}
public boolean isPointInEventImage(int x, int y) {
if (showEvent) {
Point p = new Point(x, y);
parentFigure.translateToRelative(p);
return rectEvent.contains(p);
}
return false;
}
public void setShowEvent(boolean showEvent) {
this.showEvent = showEvent;
}
@Override
protected Rectangle getGradientRect() {
Rectangle bounds = parentFigure.getBounds();
this.rectBounds = new Rectangle();
rectBounds.x = bounds.x + DRAWER_WIDTH;
rectBounds.y = bounds.y;
rectBounds.width = bounds.width - DRAWER_WIDTH * 2;
rectBounds.height = bounds.height;
if (Platform.getWS().equals(Platform.WS_GTK)) {
rectBounds.height = rectBounds.height - 1;
}
return rectBounds;
}
@Override
public boolean isPointInTopDrawer(int x, int y) {
if (getTopMarker() == null) return false;
if (bounds == null) return false;
Point p = new Point(x, y);
parentFigure.translateToRelative(p);
Image image = getTopImage();
org.eclipse.swt.graphics.Rectangle imageSize = image.getBounds();
int imageX = bounds.x + DRAWER_INSET;
int imageY = bounds.y + DRAWER_INSET + 2;
Rectangle imageBounds = new Rectangle(imageX, imageY, imageSize.width, imageSize.height);
return imageBounds.contains(p);
}
@Override
public boolean isPointInBottomDrawer(int x, int y) {
if (getBottomMarker() == null) return false;
if (bounds == null) return false;
Point p = new Point(x, y);
parentFigure.translateToRelative(p);
Image image = getBottomImage();
org.eclipse.swt.graphics.Rectangle imageSize = image.getBounds();
int imageX = bounds.x + DRAWER_INSET;
int imageY = bounds.y + DRAWER_INSET + 2 + DRAWER_HALF_HEIGHT;
Rectangle imageBounds = new Rectangle(imageX, imageY, imageSize.width, imageSize.height);
return imageBounds.contains(p);
}
private void computeHandlerIconPositions(boolean horizontal){
if(horizontal){
// Draw the fault image in the upper right hand corner of the round rectangle
if (showFault) {
int x = bounds.x + bounds.width - faultImageWidth - DRAWER_WIDTH+1;
if(showCompensation)
x -= compensationImageWidth;
if(showEvent)
x -= eventImageWidth;
this.rectFault = new Rectangle(x, getGradientRect().y+getGradientRect().height-faultImageHeight+yHandlerIconOffset, faultImageWidth, faultImageHeight);
}
// Draw the compensation image in the upper right hand corner of the round rectangle
if (showCompensation) {
int x = bounds.x + bounds.width - compensationImageWidth - DRAWER_WIDTH+1;
if(showEvent)
x -= eventImageWidth;
this.rectCompensation = new Rectangle(x, getGradientRect().y+getGradientRect().height-compensationImageHeight+yHandlerIconOffset, compensationImageWidth, compensationImageHeight);
}
if (showEvent) {
int x = bounds.x + bounds.width - eventImageWidth - DRAWER_WIDTH+1;
this.rectEvent = new Rectangle(x, getGradientRect().y+getGradientRect().height-eventImageHeight+yHandlerIconOffset, eventImageWidth, eventImageHeight);
}
}else{
// Draw the fault image in the upper right hand corner of the round rectangle
if (showFault) {
this.rectFault = new Rectangle(bounds.x + bounds.width - faultImageWidth - DRAWER_WIDTH+1, bounds.y, faultImageWidth, faultImageHeight);
}
// Draw the compensation image in the upper right hand corner of the round rectangle
if (showCompensation) {
int compensationImageOffset = bounds.y;
if (showFault) {
compensationImageOffset += faultImageHeight;
}
this.rectCompensation = new Rectangle(bounds.x + bounds.width - compensationImageWidth - DRAWER_WIDTH+1, compensationImageOffset, compensationImageWidth, compensationImageHeight);
}
if (showEvent) {
int eventImageOffset = bounds.y;
if (showFault) {
eventImageOffset += faultImageHeight;
}
if (showCompensation) {
eventImageOffset += compensationImageHeight;
}
this.rectEvent = new Rectangle(bounds.x + bounds.width - eventImageWidth - DRAWER_WIDTH+1, eventImageOffset, eventImageWidth, eventImageHeight);
}
}
// Apply the bounds to the figures
if(showFault)
faultImageFigure.setBounds(rectFault);
if(showCompensation)
compensationImageFigure.setBounds(rectCompensation);
if(showEvent)
eventImageFigure.setBounds(rectEvent);
}
public IFigure getFaultImageFigure() {
return faultImageFigure;
}
public IFigure getCompensationImageFigure() {
return compensationImageFigure;
}
public IFigure getEventImageFigure() {
return eventImageFigure;
}
}