blob: 0b2778f58396271413284da22dbda1e692877a7f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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.draw2d;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
/**
* A triangular graphical figure.
*/
public final class Triangle extends Shape implements Orientable {
/**
* The direction this triangle will face. Possible values are
* {@link PositionConstants#NORTH}, {@link PositionConstants#SOUTH},
* {@link PositionConstants#EAST} and {@link PositionConstants#WEST}.
*/
protected int direction = NORTH;
/**
* The orientation of this triangle. Possible values are
* {@link Orientable#VERTICAL} and {@link Orientable#HORIZONTAL}.
*/
protected int orientation = VERTICAL;
/** The points of the triangle. */
protected PointList triangle = new PointList(3);
/**
* @see Shape#fillShape(Graphics)
*/
protected void fillShape(Graphics g) {
g.fillPolygon(triangle);
}
/**
* @see Shape#outlineShape(Graphics)
*/
protected void outlineShape(Graphics g) {
g.drawPolygon(triangle);
}
/**
* @see Figure#primTranslate(int, int)
*/
public void primTranslate(int dx, int dy) {
super.primTranslate(dx, dy);
triangle.translate(dx, dy);
}
/**
* @see Orientable#setDirection(int)
*/
public void setDirection(int value) {
if ((value & (NORTH | SOUTH)) != 0)
orientation = VERTICAL;
else
orientation = HORIZONTAL;
direction = value;
revalidate();
repaint();
}
/**
* @see Orientable#setOrientation(int)
*/
public void setOrientation(int value) {
if (orientation == VERTICAL && value == HORIZONTAL) {
if (direction == NORTH)
setDirection(WEST);
else
setDirection(EAST);
}
if (orientation == HORIZONTAL && value == VERTICAL) {
if (direction == WEST)
setDirection(NORTH);
else
setDirection(SOUTH);
}
}
/**
* @see IFigure#validate()
*/
public void validate() {
super.validate();
Rectangle r = new Rectangle();
r.setBounds(getBounds());
r.crop(getInsets());
r.resize(-1, -1);
int size;
switch (direction & (NORTH | SOUTH)) {
case 0: // East or west.
size = Math.min(r.height / 2, r.width);
r.x += (r.width - size) / 2;
break;
default: // North or south
size = Math.min(r.height, r.width / 2);
r.y += (r.height - size) / 2;
break;
}
size = Math.max(size, 1); // Size cannot be negative
Point head, p2, p3;
switch (direction) {
case NORTH:
head = new Point(r.x + r.width / 2, r.y);
p2 = new Point(head.x - size, head.y + size);
p3 = new Point(head.x + size, head.y + size);
break;
case SOUTH:
head = new Point(r.x + r.width / 2, r.y + size);
p2 = new Point(head.x - size, head.y - size);
p3 = new Point(head.x + size, head.y - size);
break;
case WEST:
head = new Point(r.x, r.y + r.height / 2);
p2 = new Point(head.x + size, head.y - size);
p3 = new Point(head.x + size, head.y + size);
break;
default:
head = new Point(r.x + size, r.y + r.height / 2);
p2 = new Point(head.x - size, head.y - size);
p3 = new Point(head.x - size, head.y + size);
}
triangle.removeAllPoints();
triangle.addPoint(head);
triangle.addPoint(p2);
triangle.addPoint(p3);
}
}