blob: d70b04a2b8dfa0175eb68f5117596814ae81ea96 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 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:
* Alexander Shatalin (Borland) - initial API and implementation
*******************************************************************************/
package org.eclipse.draw2d;
import java.util.Iterator;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
/**
* Base superclass for all polylines/polygons
*
* @since 3.5
*/
public abstract class AbstractPointListShape extends Shape {
PointList points = new PointList();
/**
* @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
*/
public boolean containsPoint(int x, int y) {
if (!super.containsPoint(x, y)) {
return false;
}
return shapeContainsPoint(x, y) || childrenContainsPoint(x, y);
}
/**
* Returns <code>true</code> if the point <code>(x, y)</code> is contained
* within one of the child figures.
*
* @param x
* The X coordinate
* @param y
* The Y coordinate
* @return <code>true</code> if the point (x,y) is contained in one of the
* child figures
*/
protected boolean childrenContainsPoint(int x, int y) {
for (Iterator it = getChildren().iterator(); it.hasNext();) {
IFigure nextChild = (IFigure) it.next();
if (nextChild.containsPoint(x, y)) {
return true;
}
}
return false;
}
/**
* Returns <code>true</code> if the point <code>(x, y)</code> is contained
* within this figure.
*
* @param x
* The X coordinate
* @param y
* The Y coordinate
* @return <code>true</code> if the point (x,y) is contained in this figure
*/
abstract protected boolean shapeContainsPoint(int x, int y);
/**
* Adds the passed point to this figure.
*
* @param pt
* the Point to be added to this figure
*/
public void addPoint(Point pt) {
points.addPoint(pt);
repaint();
}
/**
* @return the first point in this figure
*/
public Point getStart() {
return points.getFirstPoint();
}
/**
* Returns the last point in this Figure.
*
* @return the last point
*/
public Point getEnd() {
return points.getLastPoint();
}
/**
* Returns the points in this figure <B>by reference</B>. If the returned
* list is modified, this figure must be informed by calling
* {@link #setPoints(PointList)}. Failure to do so will result in layout and
* paint problems.
*
* @return this Polyline's points
*/
public PointList getPoints() {
return points;
}
/**
* Inserts a given point at a specified index in this figure.
*
* @param pt
* the point to be added
* @param index
* the position in this figure where the point is to be added
*/
public void insertPoint(Point pt, int index) {
points.insertPoint(pt, index);
repaint();
}
/**
* Erases this figure and removes all of its {@link Point Points}.
*/
public void removeAllPoints() {
erase();
points.removeAllPoints();
}
/**
* Removes a point from this figure.
*
* @param index
* the position of the point to be removed
*/
public void removePoint(int index) {
erase();
points.removePoint(index);
repaint();
}
/**
* Sets the start point of this figure
*
* @param start
* the point that will become the first point in this figure
*/
public void setStart(Point start) {
if (points.size() == 0) {
addPoint(start);
} else {
setPoint(start, 0);
}
}
/**
* Sets the end point of this figure
*
* @param end
* the point that will become the last point in this figure
*/
public void setEnd(Point end) {
if (points.size() < 2) {
addPoint(end);
} else {
setPoint(end, points.size() - 1);
}
}
/**
* Sets the points at both extremes of this figure
*
* @param start
* the point to become the first point in this figure
* @param end
* the point to become the last point in this figure
*/
public void setEndpoints(Point start, Point end) {
setStart(start);
setEnd(end);
}
/**
* Sets the point at <code>index</code> to the Point <code>pt</code>. If
* you're going to set multiple Points, use {@link #setPoints(PointList)}.
*
* @param pt
* the point
* @param index
* the index
*/
public void setPoint(Point pt, int index) {
erase();
points.setPoint(pt, index);
repaint();
}
/**
* Sets the list of points to be used by this figure. Removes any previously
* existing points. This figure will hold onto the given list by reference.
*
* @param points
* new set of points
*/
public void setPoints(PointList points) {
erase();
this.points = points;
repaint();
}
}