package fr.lteconsulting.hexa.client.ui.chart.raphael;
/**
* Programmatic API to build SVG paths
*
* See http://www.w3.org/TR/SVG/paths.html#PathData
*/
public class PathBuilder
{
private StringBuffer s = new StringBuffer();
public PathBuilder()
{
}
/**
* append an SVG Path command to this instance
*/
public PathBuilder append( String cmd, double... coords )
{
s.append( cmd ).append( " " );
for( double a : coords )
{
s.append( a ).append( " " );
}
return this;
}
/**
* remove all commands from this instance
*/
public void clear()
{
s.delete( 0, s.length() );
}
/**
* generate the SVG Path string representation of this instance
*/
public String toString()
{
return s.toString();
}
/**
* moveto (absolute)
*
* Start a new sub-path at the given (x,y) coordinate. M (uppercase)
* indicates that absolute coordinates will follow; m (lowercase) indicates
* that relative coordinates will follow. If a relative moveto (m) appears
* as the first element of the path, then it is treated as a pair of
* absolute coordinates. If a moveto is followed by multiple pairs of
* coordinates, the subsequent pairs are treated as implicit lineto
* commands.
*
* @param coords
* (x y)+
*/
public PathBuilder M( double... coords )
{
return append( "M", coords );
}
/**
* moveto (relative)
*
* Start a new sub-path at the given (x,y) coordinate. M (uppercase)
* indicates that absolute coordinates will follow; m (lowercase) indicates
* that relative coordinates will follow. If a relative moveto (m) appears
* as the first element of the path, then it is treated as a pair of
* absolute coordinates. If a moveto is followed by multiple pairs of
* coordinates, the subsequent pairs are treated as implicit lineto
* commands.
*
* @param coords
* (x y)+
*/
public PathBuilder m( double... coords )
{
return append( "m", coords );
}
/**
* closepath
*
* Close the current subpath by drawing a straight line from the current
* point to current subpath's initial point.
*/
public PathBuilder Z()
{
return append( "Z" );
}
/**
* closepath
*
* Close the current subpath by drawing a straight line from the current
* point to current subpath's initial point.
*/
public PathBuilder z()
{
return append( "z" );
}
/**
* lineto (absolute)
*
* Draw a line from the current point to the given (x,y) coordinate which
* becomes the new current point. L (uppercase) indicates that absolute
* coordinates will follow; l (lowercase) indicates that relative
* coordinates will follow. A number of coordinates pairs may be specified
* to draw a polyline. At the end of the command, the new current point is
* set to the final set of coordinates provided.
*
* @param coords
* (x y)+
*/
public PathBuilder L( double... coords )
{
return append( "L", coords );
}
/**
* lineto (relative)
*
* Draw a line from the current point to the given (x,y) coordinate which
* becomes the new current point. L (uppercase) indicates that absolute
* coordinates will follow; l (lowercase) indicates that relative
* coordinates will follow. A number of coordinates pairs may be specified
* to draw a polyline. At the end of the command, the new current point is
* set to the final set of coordinates provided.
*
* @param coords
* (x y)+
*/
public PathBuilder l( double... coords )
{
return append( "l", coords );
}
/**
* horizontal lineto (absolute)
*
* Draws a horizontal line from the current point (cpx, cpy) to (x, cpy). H
* (uppercase) indicates that absolute coordinates will follow; h
* (lowercase) indicates that relative coordinates will follow. Multiple x
* values can be provided (although usually this doesn't make sense). At the
* end of the command, the new current point becomes (x, cpy) for the final
* value of x.
*
* @param coords
* x+
*/
public PathBuilder H( double... coords )
{
return append( "H", coords );
}
/**
* horizontal lineto (relative)
*
* Draws a horizontal line from the current point (cpx, cpy) to (x, cpy). H
* (uppercase) indicates that absolute coordinates will follow; h
* (lowercase) indicates that relative coordinates will follow. Multiple x
* values can be provided (although usually this doesn't make sense). At the
* end of the command, the new current point becomes (x, cpy) for the final
* value of x.
*
* @param coords
* x+
*/
public PathBuilder h( double... coords )
{
return append( "h", coords );
}
/**
* vertical lineto (absolute)
*
* Draws a vertical line from the current point (cpx, cpy) to (cpx, y). V
* (uppercase) indicates that absolute coordinates will follow; v
* (lowercase) indicates that relative coordinates will follow. Multiple y
* values can be provided (although usually this doesn't make sense). At the
* end of the command, the new current point becomes (cpx, y) for the final
* value of y.
*
* @param coords
* y+
*/
public PathBuilder V( double... coords )
{
return append( "V", coords );
}
/**
* vertical lineto (relative)
*
* Draws a vertical line from the current point (cpx, cpy) to (cpx, y). V
* (uppercase) indicates that absolute coordinates will follow; v
* (lowercase) indicates that relative coordinates will follow. Multiple y
* values can be provided (although usually this doesn't make sense). At the
* end of the command, the new current point becomes (cpx, y) for the final
* value of y.
*
* @param coords
* y+
*/
public PathBuilder v( double... coords )
{
return append( "v", coords );
}
/**
* cubic Bezier curveto (absolute)
*
* Draws a cubic Bezier curve from the current point to (x,y) using (x1,y1)
* as the control point at the beginning of the curve and (x2,y2) as the
* control point at the end of the curve. C (uppercase) indicates that
* absolute coordinates will follow; c (lowercase) indicates that relative
* coordinates will follow. Multiple sets of coordinates may be specified to
* draw a polybezier. At the end of the command, the new current point
* becomes the final (x,y) coordinate pair used in the polybezier.
*
* @param coords
* (x1 y1 x2 y2 x y)+
*/
public PathBuilder C( double... coords )
{
return append( "C", coords );
}
/**
* cubic Bezier curveto (relative)
*
* Draws a cubic Bezier curve from the current point to (x,y) using (x1,y1)
* as the control point at the beginning of the curve and (x2,y2) as the
* control point at the end of the curve. C (uppercase) indicates that
* absolute coordinates will follow; c (lowercase) indicates that relative
* coordinates will follow. Multiple sets of coordinates may be specified to
* draw a polybezier. At the end of the command, the new current point
* becomes the final (x,y) coordinate pair used in the polybezier.
*
* @param coords
* (x1 y1 x2 y2 x y)+
*/
public PathBuilder c( double... coords )
{
return append( "c", coords );
}
/**
* shorthand/smooth curveto (absolute)
*
* Draws a cubic Bezier curve from the current point to (x,y). The first
* control point is assumed to be the reflection of the second control point
* on the previous command relative to the current point. (If there is no
* previous command or if the previous command was not an C, c, S or s,
* assume the first control point is coincident with the current point.)
* (x2,y2) is the second control point (i.e., the control point at the end
* of the curve). S (uppercase) indicates that absolute coordinates will
* follow; s (lowercase) indicates that relative coordinates will follow.
* Multiple sets of coordinates may be specified to draw a polybezier. At
* the end of the command, the new current point becomes the final (x,y)
* coordinate pair used in the polybezier.
*
* @param coords
* (x2 y2 x y)+
*/
public PathBuilder S( double... coords )
{
return append( "S", coords );
}
/**
* shorthand/smooth curveto (relative)
*
* Draws a cubic Bezier curve from the current point to (x,y). The first
* control point is assumed to be the reflection of the second control point
* on the previous command relative to the current point. (If there is no
* previous command or if the previous command was not an C, c, S or s,
* assume the first control point is coincident with the current point.)
* (x2,y2) is the second control point (i.e., the control point at the end
* of the curve). S (uppercase) indicates that absolute coordinates will
* follow; s (lowercase) indicates that relative coordinates will follow.
* Multiple sets of coordinates may be specified to draw a polybezier. At
* the end of the command, the new current point becomes the final (x,y)
* coordinate pair used in the polybezier.
*
* @param coords
* (x2 y2 x y)+
*/
public PathBuilder s( double... coords )
{
return append( "s", coords );
}
/**
* quadratic Bezier curveto (absolute)
*
* Draws a quadratic Bezier curve from the current point to (x,y) using
* (x1,y1) as the control point. Q (uppercase) indicates that absolute
* coordinates will follow; q (lowercase) indicates that relative
* coordinates will follow. Multiple sets of coordinates may be specified to
* draw a polybezier. At the end of the command, the new current point
* becomes the final (x,y) coordinate pair used in the polybezier.
*
* @param coords
* (x1 y1 x y)+
*/
public PathBuilder Q( double... coords )
{
return append( "Q", coords );
}
/**
* quadratic Bezier curveto (relative)
*
* Draws a quadratic Bezier curve from the current point to (x,y) using
* (x1,y1) as the control point. Q (uppercase) indicates that absolute
* coordinates will follow; q (lowercase) indicates that relative
* coordinates will follow. Multiple sets of coordinates may be specified to
* draw a polybezier. At the end of the command, the new current point
* becomes the final (x,y) coordinate pair used in the polybezier.
*
* @param coords
* (x1 y1 x y)+
*/
public PathBuilder q( double... coords )
{
return append( "q", coords );
}
/**
* shorthand/smooth quadratic Bezier curveto (absolute)
*
* Draws a quadratic Bezier curve from the current point to (x,y). The
* control point is assumed to be the reflection of the control point on the
* previous command relative to the current point. (If there is no previous
* command or if the previous command was not a Q, q, T or t, assume the
* control point is coincident with the current point.) T (uppercase)
* indicates that absolute coordinates will follow; t (lowercase) indicates
* that relative coordinates will follow. At the end of the command, the new
* current point becomes the final (x,y) coordinate pair used in the
* polybezier.
*
* @param coords
* (x y)+
*/
public PathBuilder T( double... coords )
{
return append( "T", coords );
}
/**
* shorthand/smooth quadratic Bezier curveto (relative)
*
* Draws a quadratic Bezier curve from the current point to (x,y). The
* control point is assumed to be the reflection of the control point on the
* previous command relative to the current point. (If there is no previous
* command or if the previous command was not a Q, q, T or t, assume the
* control point is coincident with the current point.) T (uppercase)
* indicates that absolute coordinates will follow; t (lowercase) indicates
* that relative coordinates will follow. At the end of the command, the new
* current point becomes the final (x,y) coordinate pair used in the
* polybezier.
*
* @param coords
* (x y)+
*/
public PathBuilder t( double... coords )
{
return append( "t", coords );
}
/**
* elliptical arc (absolute)
*
* Draws an elliptical arc from the current point to (x, y). The size and
* orientation of the ellipse are defined by two radii (rx, ry) and an
* x-axis-rotation, which indicates how the ellipse as a whole is rotated
* relative to the current coordinate system. The center (cx, cy) of the
* ellipse is calculated automatically to satisfy the constraints imposed by
* the other parameters. large-arc-flag and sweep-flag contribute to the
* automatic calculations and help determine how the arc is drawn.
*
* @param coords
* (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
*/
public PathBuilder A( double... coords )
{
return append( "A", coords );
}
/**
* elliptical arc (relative)
*
* Draws an elliptical arc from the current point to (x, y). The size and
* orientation of the ellipse are defined by two radii (rx, ry) and an
* x-axis-rotation, which indicates how the ellipse as a whole is rotated
* relative to the current coordinate system. The center (cx, cy) of the
* ellipse is calculated automatically to satisfy the constraints imposed by
* the other parameters. large-arc-flag and sweep-flag contribute to the
* automatic calculations and help determine how the arc is drawn.
*
* @param coords
* (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
*/
public PathBuilder a( double... coords )
{
return append( "a", coords );
}
}