blob: 7d6d0b0c4716834a233d5d80b1a04c8cab214a75 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 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.graph;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
/**
* An obstacle representation for the ShortestPathRouting. This is a subclass of
* Rectangle.
*
* This class is for internal use only.
*
* @author Whitney Sorenson
* @since 3.0
*/
class Obstacle extends Rectangle {
boolean exclude;
Vertex topLeft, topRight, bottomLeft, bottomRight, center;
private ShortestPathRouter router;
/**
* Creates a new obstacle from the given rectangle bounds.
*
* @param rect
* the bounds
*/
Obstacle(Rectangle rect, ShortestPathRouter router) {
init(rect);
this.router = router;
}
/**
* Returns <code>true</code> if the given point is contained but not on the
* boundary of this obstacle.
*
* @param p
* a point
* @return <code>true</code> if properly contained
*/
public boolean containsProper(Point p) {
return p.x > this.x && p.x < this.x + this.width - 1 && p.y > this.y
&& p.y < this.y + this.height - 1;
}
public int getSpacing() {
return router.getSpacing();
}
private void growVertex(Vertex vertex) {
if (vertex.totalCount > 0)
vertex.grow();
}
/**
* Grows all vertices on this obstacle.
*/
void growVertices() {
growVertex(topLeft);
growVertex(topRight);
growVertex(bottomLeft);
growVertex(bottomRight);
}
/**
* Initializes this obstacle to the values of the given rectangle
*
* @param rect
* bounds of this obstacle
*/
void init(Rectangle rect) {
this.x = rect.x;
this.y = rect.y;
this.width = rect.width;
this.height = rect.height;
exclude = false;
topLeft = new Vertex(x, y, this);
topLeft.positionOnObstacle = PositionConstants.NORTH_WEST;
topRight = new Vertex(x + width - 1, y, this);
topRight.positionOnObstacle = PositionConstants.NORTH_EAST;
bottomLeft = new Vertex(x, y + height - 1, this);
bottomLeft.positionOnObstacle = PositionConstants.SOUTH_WEST;
bottomRight = new Vertex(x + width - 1, y + height - 1, this);
bottomRight.positionOnObstacle = PositionConstants.SOUTH_EAST;
center = new Vertex(getCenter(), this);
}
/**
* Requests a full reset on all four vertices of this obstacle.
*/
void reset() {
topLeft.fullReset();
bottomLeft.fullReset();
bottomRight.fullReset();
topRight.fullReset();
}
private void shrinkVertex(Vertex vertex) {
if (vertex.totalCount > 0)
vertex.shrink();
}
/**
* Shrinks all four vertices of this obstacle.
*/
void shrinkVertices() {
shrinkVertex(topLeft);
shrinkVertex(topRight);
shrinkVertex(bottomLeft);
shrinkVertex(bottomRight);
}
/**
* @see org.eclipse.draw2d.geometry.Rectangle#toString()
*/
public String toString() {
return "Obstacle(" + x + ", " + y + ", " + //$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
width + ", " + height + ")";//$NON-NLS-2$//$NON-NLS-1$
}
}