| /******************************************************************************* |
| * 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; |
| } |
| } |