Mercurial > projects > dwt-addons
diff dwtx/draw2d/graph/Obstacle.d @ 98:95307ad235d9
Added Draw2d code, still work in progress
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sun, 03 Aug 2008 00:52:14 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwtx/draw2d/graph/Obstacle.d Sun Aug 03 00:52:14 2008 +0200 @@ -0,0 +1,137 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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 + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module dwtx.draw2d.graph.Obstacle; + +import dwt.dwthelper.utils; +import tango.text.convert.Format; + +import dwtx.draw2d.PositionConstants; +import dwtx.draw2d.geometry.Point; +import dwtx.draw2d.geometry.Rectangle; +import dwtx.draw2d.graph.Vertex; +import dwtx.draw2d.graph.ShortestPathRouter; + +/** + * 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 + : Rectangle +{ + +bool exclude; +Vertex topLeft, topRight, bottomLeft, bottomRight, center; +private ShortestPathRouter router; + +/** + * Creates a new obstacle from the given rectangle bounds. + * @param rect the bounds + */ +this(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 bool 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 dwtx.draw2d.geometry.Rectangle#toString() + */ +public String toString() { + return Format("Obstacle({}, {}, {}, {})", x, y, //$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$ + width, height );//$NON-NLS-2$//$NON-NLS-1$ +} + +}