blob: 4ddde1f68ef465ec1c56da0f61bfd9f77f9b9ae6 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2003 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.draw2d.ui.figures;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gmf.runtime.draw2d.ui.internal.l10n.Draw2dUIPluginImages;
import org.eclipse.gmf.runtime.draw2d.ui.mapmode.MapModeUtil;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Display;
/**
* @author choang
*
* Drop Shadow Helper Class to help draw shadow on borders
*/
public class RectangularDropShadow {
/**
*
*/
public RectangularDropShadow() {
super();
// TODO Auto-generated constructor stub
}
// Images for the border of the shadow border
private static ImageData alpha_ilb =
Draw2dUIPluginImages.DESC_LEFT_BOTTOM.getImageData();
private static ImageData alpha_irb =
Draw2dUIPluginImages.DESC_RIGHT_BOTTOM.getImageData();
private static ImageData alpha_ir =
Draw2dUIPluginImages.DESC_RIGHT.getImageData();
private static ImageData alpha_itr =
Draw2dUIPluginImages.DESC_TOP_RIGHT.getImageData();
private static ImageData alpha_ib =
Draw2dUIPluginImages.DESC_BOTTOM.getImageData();
/**
* Method for determining the width of the drop shadow border will take up on the shape.
* @return int the width of the drop shadow
*/
public int getShadowWidth() {
return alpha_ir.width;
}
/**
* Method for determining the height of the drop shadow border will take up on the shape.
* @return int the height of the drop shadow
*/
public int getShadowHeight() {
return alpha_ib.height;
}
/**
* draw a shadow around given rectangle @rect
* @param figure
* @param g
* @param rect the rectangle to draw the shadow around
*/
public void drawShadow(IFigure figure, Graphics g, Rectangle rect){
drawBottomLeftShadow(figure, g, rect);
// bottom
drawBottomShadow(figure, g, rect);
// bottom right
drawBottomRightShadow(figure, g, rect);
// right
drawRightShadow(figure, g, rect);
// top right
drawTopRightShadow(figure, g, rect);
}
/**
* @param figure
* @param g
* @param rBox
*/
protected void drawTopRightShadow(IFigure figure, Graphics g, Rectangle rBox) {
Dimension dim = new Dimension(alpha_itr.width, alpha_itr.height);
Image itr = createImageFromAlpha(figure, alpha_itr, dim);
Point pt = new Point(rBox.getRight().x - MapModeUtil.getMapMode(figure).DPtoLP(alpha_ir.width),
rBox.getTop().y );
g.drawImage(itr, pt);
itr.dispose();
}
/**
* @param figure
* @param g
* @param rBox
*/
protected void drawRightShadow(IFigure figure, Graphics g, Rectangle rBox) {
Dimension dim = getRightShadowDimension(figure, rBox);
Image ir = createImageFromAlpha(figure, alpha_ir, dim);
Point pt =
new Point(
rBox.getRight().x - MapModeUtil.getMapMode(figure).DPtoLP(alpha_ir.width),
rBox.getTop().y + MapModeUtil.getMapMode(figure).DPtoLP(alpha_itr.height)) ;
g.drawImage(ir, pt);
ir.dispose();
}
/**
* @param figure
* @param g
* @param rBox
*/
protected void drawBottomRightShadow(
IFigure figure,
Graphics g,
Rectangle rBox) {
Dimension dim;
dim = getBottomRightShadowDimension();
Image irb = createImageFromAlpha(figure, alpha_irb, dim);
Point pt =
new Point(
rBox.getRight().x - MapModeUtil.getMapMode(figure).DPtoLP(alpha_ir.width),
rBox.getBottom().y - MapModeUtil.getMapMode(figure).DPtoLP(alpha_ib.height) );
g.drawImage(irb, pt);
irb.dispose();
}
/**
* @param figure
* @param g
* @param rBox
*/
protected void drawBottomShadow(IFigure figure, Graphics g, Rectangle rBox) {
Dimension dim = getBottomShadowDimension(figure, rBox);
Image ib = createImageFromAlpha(figure, alpha_ib, dim);
Point pt =
new Point(
rBox.getLeft().x + MapModeUtil.getMapMode(figure).DPtoLP(alpha_ilb.width),
rBox.getBottom().y - MapModeUtil.getMapMode(figure).DPtoLP(alpha_ib.height) );
g.drawImage(ib, pt);
ib.dispose();
}
/**
* @param figure
* @param g
* @param rBox
*/
private void drawBottomLeftShadow(IFigure figure, Graphics g, Rectangle rBox) {
Dimension dim = getLeftShadowDimension();
Image ilb = createImageFromAlpha(figure, alpha_ilb, dim);
Point pt =
new Point(rBox.getLeft().x,
rBox.getBottom().y - MapModeUtil.getMapMode(figure).DPtoLP(alpha_ib.height) );
g.drawImage(ilb, pt);
ilb.dispose();
}
/**
* @param figure
* @param rBox
* @return the <code>Dimension</code> representing the right shadow
*/
protected Dimension getRightShadowDimension(IFigure figure, Rectangle rBox) {
int height = Math.max(MapModeUtil.getMapMode(figure).LPtoDP(rBox.height) - alpha_itr.height - alpha_irb.height,
1);
return new Dimension(alpha_ir.width, height);
}
/**
* @return the <code>Dimension</code> representing the bottom right shadow
*/
protected Dimension getBottomRightShadowDimension() {
return new Dimension(alpha_irb.width, alpha_irb.height);
}
/**
* @param rBox
* @return the <code>Dimension</code> representing the bottom shadow
*/
protected Dimension getBottomShadowDimension(IFigure figure, Rectangle rBox) {
int width = Math.max(MapModeUtil.getMapMode(figure).LPtoDP( rBox.width ) - alpha_ilb.width - alpha_irb.width,
1);
return new Dimension(width, alpha_ib.height);
}
/**
* @return the <code>Dimension</code> representing the left shadow
*/
protected Dimension getLeftShadowDimension() {
return new Dimension(alpha_ilb.width, alpha_ilb.height);
}
/**
* Utility function for the paint routine to create the image that will be displayed
* based on a transparency image.
*/
private Image createImageFromAlpha(
IFigure figure,
ImageData alphaData,
Dimension dim) {
Color foreColor = figure.getForegroundColor();
ImageData newAlpha = alphaData;
if (alphaData.width != dim.width || alphaData.height != dim.height) {
ImageData newAlphaData =
new ImageData(
((dim.width + 3) / 4) * 4,
dim.height,
alphaData.depth,
alphaData.palette);
Image imgNewAlpha = new Image(null, newAlphaData);
GC gc = new GC(imgNewAlpha);
Image imgAlpha = new Image(null, alphaData);
gc.drawImage(
imgAlpha,
0,
0,
alphaData.width,
alphaData.height,
0,
0,
newAlphaData.width,
newAlphaData.height);
int nDelta = newAlphaData.width - dim.width;
if (nDelta > 0) {
gc.setForeground(ColorConstants.black);
gc.setBackground(ColorConstants.black);
gc.fillRectangle(
newAlphaData.width - nDelta,
0,
nDelta,
newAlphaData.height);
}
newAlpha = imgNewAlpha.getImageData();
imgNewAlpha.dispose();
imgAlpha.dispose();
gc.dispose();
}
Image img =
new Image(Display.getDefault(), newAlpha.width, newAlpha.height);
GC gc = new GC(img);
gc.setForeground(foreColor);
gc.setBackground(foreColor);
gc.fillRectangle(0, 0, newAlpha.width, newAlpha.height);
gc.dispose();
ImageData filledData = img.getImageData();
img.dispose();
for (int i = 0; i < newAlpha.height; i++) {
filledData.setAlphas(
0,
i,
newAlpha.width,
newAlpha.data,
i * newAlpha.width);
}
return new Image(null, filledData);
}
}