diff --git a/pom.xml b/pom.xml
index b03353925..75b4789b6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,7 +36,7 @@
net.sourceforge.plantuml
plantuml
- 6242-SNAPSHOT
+ 7232-SNAPSHOT
jar
PlantUML
diff --git a/src/net/sourceforge/plantuml/ISkinParam.java b/src/net/sourceforge/plantuml/ISkinParam.java
index b0e4b6f36..6f870b1ea 100644
--- a/src/net/sourceforge/plantuml/ISkinParam.java
+++ b/src/net/sourceforge/plantuml/ISkinParam.java
@@ -71,5 +71,7 @@ public interface ISkinParam {
public GraphvizLayoutStrategy getStrategy();
public boolean isSvek();
+
+ public boolean shadowing();
}
\ No newline at end of file
diff --git a/src/net/sourceforge/plantuml/MathUtils.java b/src/net/sourceforge/plantuml/MathUtils.java
index 8bbc8077a..fb21bd013 100644
--- a/src/net/sourceforge/plantuml/MathUtils.java
+++ b/src/net/sourceforge/plantuml/MathUtils.java
@@ -43,4 +43,17 @@ public class MathUtils {
return Math.max(Math.max(a, b), c);
}
+ public static double limitation(double v, double min, double max) {
+ if (min >= max) {
+ throw new IllegalArgumentException();
+ }
+ if (v < min) {
+ return min;
+ }
+ if (v > max) {
+ return max;
+ }
+ return v;
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/OptionFlags.java b/src/net/sourceforge/plantuml/OptionFlags.java
index 739db4470..294218eed 100644
--- a/src/net/sourceforge/plantuml/OptionFlags.java
+++ b/src/net/sourceforge/plantuml/OptionFlags.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7135 $
+ * Revision $Revision: 7231 $
*
*/
package net.sourceforge.plantuml;
diff --git a/src/net/sourceforge/plantuml/SkinParam.java b/src/net/sourceforge/plantuml/SkinParam.java
index 804b3edb5..08be6e591 100644
--- a/src/net/sourceforge/plantuml/SkinParam.java
+++ b/src/net/sourceforge/plantuml/SkinParam.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7180 $
+ * Revision $Revision: 7230 $
*
*/
package net.sourceforge.plantuml;
@@ -351,4 +351,12 @@ public class SkinParam implements ISkinParam {
return "true".equalsIgnoreCase(value);
}
+ public boolean shadowing() {
+ final String value = getValue("shadowing");
+ if ("false".equalsIgnoreCase(value)) {
+ return false;
+ }
+ return true;
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/SkinParamBackcolored.java b/src/net/sourceforge/plantuml/SkinParamBackcolored.java
index 41b0aba9c..4503676e7 100644
--- a/src/net/sourceforge/plantuml/SkinParamBackcolored.java
+++ b/src/net/sourceforge/plantuml/SkinParamBackcolored.java
@@ -123,4 +123,8 @@ public class SkinParamBackcolored implements ISkinParam {
return skinParam.isSvek();
}
+ public boolean shadowing() {
+ return skinParam.shadowing();
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/SkinParamBackcoloredReference.java b/src/net/sourceforge/plantuml/SkinParamBackcoloredReference.java
index 6830e6d0d..54c510bf3 100644
--- a/src/net/sourceforge/plantuml/SkinParamBackcoloredReference.java
+++ b/src/net/sourceforge/plantuml/SkinParamBackcoloredReference.java
@@ -119,4 +119,8 @@ public class SkinParamBackcoloredReference implements ISkinParam {
return skinParam.isSvek();
}
+ public boolean shadowing() {
+ return skinParam.shadowing();
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/cucadiagram/Link.java b/src/net/sourceforge/plantuml/cucadiagram/Link.java
index 6de36e27e..90ee242cf 100644
--- a/src/net/sourceforge/plantuml/cucadiagram/Link.java
+++ b/src/net/sourceforge/plantuml/cucadiagram/Link.java
@@ -28,13 +28,14 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 6939 $
+ * Revision $Revision: 7221 $
*
*/
package net.sourceforge.plantuml.cucadiagram;
import java.awt.geom.Dimension2D;
import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import net.sourceforge.plantuml.StringUtils;
@@ -120,25 +121,25 @@ public class Link implements Imaged {
// final int x = cl1.getXposition();
// cl2.setXposition(x-1);
// }
- final Link result = new Link(cl2, cl1, type.getInv(), label, length, qualifier2, qualifier1, labeldistance,
- labelangle, specificColor);
+ final Link result = new Link(cl2, cl1, getType().getInv(), label, length, qualifier2, qualifier1,
+ labeldistance, labelangle, specificColor);
result.inverted = true;
return result;
}
public Link getDashed() {
- return new Link(cl1, cl2, type.getDashed(), label, length, qualifier1, qualifier2, labeldistance, labelangle,
- specificColor);
+ return new Link(cl1, cl2, getType().getDashed(), label, length, qualifier1, qualifier2, labeldistance,
+ labelangle, specificColor);
}
public Link getDotted() {
- return new Link(cl1, cl2, type.getDotted(), label, length, qualifier1, qualifier2, labeldistance, labelangle,
- specificColor);
+ return new Link(cl1, cl2, getType().getDotted(), label, length, qualifier1, qualifier2, labeldistance,
+ labelangle, specificColor);
}
public Link getBold() {
- return new Link(cl1, cl2, type.getBold(), label, length, qualifier1, qualifier2, labeldistance, labelangle,
- specificColor);
+ return new Link(cl1, cl2, getType().getBold(), label, length, qualifier1, qualifier2, labeldistance,
+ labelangle, specificColor);
}
public String getLabeldistance() {
@@ -180,7 +181,7 @@ public class Link implements Imaged {
if (this.cl1 == ent1 && this.cl2 == ent2) {
return this;
}
- return new Link(ent1, ent2, type, label, length, qualifier1, qualifier2, labeldistance, labelangle);
+ return new Link(ent1, ent2, getType(), label, length, qualifier1, qualifier2, labeldistance, labelangle);
}
public boolean isBetween(IEntity cl1, IEntity cl2) {
@@ -207,6 +208,9 @@ public class Link implements Imaged {
}
public LinkType getType() {
+ if (opale) {
+ return new LinkType(LinkDecor.NONE, LinkDecor.NONE);
+ }
return type;
}
@@ -319,13 +323,13 @@ public class Link implements Imaged {
public double getMarginDecors1(StringBounder stringBounder, UFont fontQualif) {
final double q = getQualifierMargin(stringBounder, fontQualif, qualifier1);
- final LinkDecor decor = type.getDecor1();
+ final LinkDecor decor = getType().getDecor1();
return decor.getSize() + q;
}
public double getMarginDecors2(StringBounder stringBounder, UFont fontQualif) {
final double q = getQualifierMargin(stringBounder, fontQualif, qualifier2);
- final LinkDecor decor = type.getDecor2();
+ final LinkDecor decor = getType().getDecor2();
return decor.getSize() + q;
}
@@ -354,4 +358,24 @@ public class Link implements Imaged {
public final void setConstraint(boolean constraint) {
this.constraint = constraint;
}
+
+ private boolean opale;
+
+ public void setOpale(boolean opale) {
+ this.opale = opale;
+ }
+
+ static public boolean onlyOneLink(IEntity ent, Collection links) {
+ int nb = 0;
+ for (Link link : links) {
+ if (link.contains(ent)) {
+ nb++;
+ }
+ if (nb > 1) {
+ return false;
+ }
+ }
+ return nb == 1;
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/cucadiagram/LinkType.java b/src/net/sourceforge/plantuml/cucadiagram/LinkType.java
index 93a58d33b..75e94a39e 100644
--- a/src/net/sourceforge/plantuml/cucadiagram/LinkType.java
+++ b/src/net/sourceforge/plantuml/cucadiagram/LinkType.java
@@ -164,15 +164,15 @@ public class LinkType {
sb.append(",arrowsize=1.5");
}
- if (style == LinkStyle.DASHED) {
- sb.append(",style=dashed");
- }
- if (style == LinkStyle.DOTTED) {
- sb.append(",style=dotted,");
- }
- if (style == LinkStyle.BOLD) {
- sb.append(",style=bold,");
- }
+// if (style == LinkStyle.DASHED) {
+// sb.append(",style=dashed");
+// }
+// if (style == LinkStyle.DOTTED) {
+// sb.append(",style=dotted,");
+// }
+// if (style == LinkStyle.BOLD) {
+// sb.append(",style=bold,");
+// }
return sb.toString();
}
diff --git a/src/net/sourceforge/plantuml/eps/EpsGraphics.java b/src/net/sourceforge/plantuml/eps/EpsGraphics.java
index 22749490a..e90dac133 100644
--- a/src/net/sourceforge/plantuml/eps/EpsGraphics.java
+++ b/src/net/sourceforge/plantuml/eps/EpsGraphics.java
@@ -41,7 +41,11 @@ import java.util.Locale;
import java.util.StringTokenizer;
import net.sourceforge.plantuml.ugraphic.ColorMapper;
+import net.sourceforge.plantuml.ugraphic.ShadowManager;
import net.sourceforge.plantuml.ugraphic.UGradient;
+import net.sourceforge.plantuml.ugraphic.UPath;
+import net.sourceforge.plantuml.ugraphic.USegment;
+import net.sourceforge.plantuml.ugraphic.USegmentType;
public class EpsGraphics {
@@ -249,6 +253,57 @@ public class EpsGraphics {
}
}
+ public void epsPath(double x, double y, UPath path) {
+ checkCloseDone();
+ if (fillcolor != null) {
+ appendColor(fillcolor);
+ append("newpath", true);
+ for (USegment seg : path) {
+ final USegmentType type = seg.getSegmentType();
+ final double coord[] = seg.getCoord();
+ if (type == USegmentType.SEG_MOVETO) {
+ movetoNoMacro(coord[0] + x, coord[1] + y);
+ } else if (type == USegmentType.SEG_LINETO) {
+ linetoNoMacro(coord[0] + x, coord[1] + y);
+ } else if (type == USegmentType.SEG_QUADTO) {
+ throw new UnsupportedOperationException();
+ } else if (type == USegmentType.SEG_CUBICTO) {
+ curvetoNoMacro(coord[0] + x, coord[1] + y, coord[2] + x, coord[3] + y, coord[4] + x, coord[5] + y);
+ } else if (type == USegmentType.SEG_CLOSE) {
+ // Nothing
+ } else {
+ System.err.println("unknown " + seg);
+ }
+ }
+ append("closepath eofill", true);
+ }
+
+ if (color != null) {
+ append(strokeWidth + " setlinewidth", true);
+ appendColor(color);
+ append("newpath", true);
+ for (USegment seg : path) {
+ final USegmentType type = seg.getSegmentType();
+ final double coord[] = seg.getCoord();
+ if (type == USegmentType.SEG_MOVETO) {
+ movetoNoMacro(coord[0] + x, coord[1] + y);
+ } else if (type == USegmentType.SEG_LINETO) {
+ linetoNoMacro(coord[0] + x, coord[1] + y);
+ } else if (type == USegmentType.SEG_QUADTO) {
+ throw new UnsupportedOperationException();
+ } else if (type == USegmentType.SEG_CUBICTO) {
+ curvetoNoMacro(coord[0] + x, coord[1] + y, coord[2] + x, coord[3] + y, coord[4] + x, coord[5] + y);
+ } else if (type == USegmentType.SEG_CLOSE) {
+ // Nothing
+ } else {
+ System.err.println("unknown " + seg);
+ }
+ }
+ append("closepath stroke", true);
+ }
+
+ }
+
public void epsPolygon(double... points) {
checkCloseDone();
double lastX = 0;
@@ -455,11 +510,11 @@ public class EpsGraphics {
body.append(s + "\n");
}
- // final public void linetoNoMacro(double x1, double y1) {
- // append(format(x1) + " " + format(y1) + " lineto", true);
- // ensureVisible(x1, y1);
- // }
- //
+ final public void linetoNoMacro(double x1, double y1) {
+ append(format(x1) + " " + format(y1) + " lineto", true);
+ ensureVisible(x1, y1);
+ }
+
final public void movetoNoMacro(double x1, double y1) {
append(format(x1) + " " + format(y1) + " moveto", true);
ensureVisible(x1, y1);
@@ -622,4 +677,36 @@ public class EpsGraphics {
this.urlArea = new UrlArea(url);
}
+ // Shadow
+ final private ShadowManager shadowManager = new ShadowManager(50, 200);
+
+ public void epsRectangleShadow(double x, double y, double width, double height, double rx, double ry,
+ double deltaShadow) {
+ setStrokeColor(null);
+ for (double i = 0; i <= deltaShadow; i += 0.5) {
+ setFillColor(shadowManager.getColor(i, deltaShadow));
+ final double diff = i;
+ epsRectangle(x + deltaShadow + diff, y + deltaShadow + diff, width - 2 * diff, height - 2 * diff, rx + 1,
+ ry + 1);
+ }
+ }
+
+ public void epsPolygonShadow(double deltaShadow, double... points) {
+ setStrokeColor(null);
+ for (double i = 0; i <= deltaShadow; i += 0.5) {
+ setFillColor(shadowManager.getColor(i, deltaShadow));
+ final double diff = i;
+ epsPolygon(shadowManager.getShadowDeltaPoints(deltaShadow, diff, points));
+ }
+ }
+
+ public void epsEllipseShadow(double x, double y, double xRadius, double yRadius, double deltaShadow) {
+ setStrokeColor(null);
+ for (double i = 0; i <= deltaShadow; i += 0.5) {
+ setFillColor(shadowManager.getColor(i, deltaShadow));
+ final double diff = i;
+ epsEllipse(x + deltaShadow, y + deltaShadow, xRadius - diff, yRadius - diff);
+ }
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea2.java b/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea2.java
index 1a4c901c4..4673c7033 100644
--- a/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea2.java
+++ b/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea2.java
@@ -75,6 +75,9 @@ public class MethodsOrFieldsArea2 implements TextBlock {
}
private boolean hasSmallIcon() {
+ if (skinParam.classAttributeIconSize() == 0) {
+ return false;
+ }
for (Member m : members) {
if (m.getVisibilityModifier() != null) {
return true;
@@ -87,7 +90,7 @@ public class MethodsOrFieldsArea2 implements TextBlock {
double x = 0;
double y = 0;
for (Member m : members) {
- final String s = m.getDisplayWithoutVisibilityChar();
+ final String s = getDisplay(m);
final TextBlock bloc = createTextBlock(s);
final Dimension2D dim = bloc.calculateDimension(stringBounder);
y += dim.getHeight();
@@ -114,7 +117,7 @@ public class MethodsOrFieldsArea2 implements TextBlock {
group = new UGroup(new PlacementStrategyVisibility(ug.getStringBounder(), skinParam
.getCircledCharacterRadius() + 3));
for (Member att : members) {
- final String s = att.getDisplayWithoutVisibilityChar();
+ final String s = getDisplay(att);
final TextBlock bloc = createTextBlock(s);
final VisibilityModifier modifier = att.getVisibilityModifier();
group.add(getUBlock(modifier));
@@ -123,7 +126,7 @@ public class MethodsOrFieldsArea2 implements TextBlock {
} else {
group = new UGroup(new PlacementStrategyY1Y2Left(ug.getStringBounder()));
for (Member att : members) {
- final String s = att.getDisplayWithoutVisibilityChar();
+ final String s = getDisplay(att);
final TextBlock bloc = createTextBlock(s);
group.add(bloc);
}
@@ -132,6 +135,11 @@ public class MethodsOrFieldsArea2 implements TextBlock {
}
+ private String getDisplay(Member att) {
+ final boolean withVisibilityChar = skinParam.classAttributeIconSize() == 0;
+ return att.getDisplay(withVisibilityChar);
+ }
+
private TextBlock getUBlock(final VisibilityModifier modifier) {
if (modifier == null) {
return new TextBlock() {
@@ -152,7 +160,7 @@ public class MethodsOrFieldsArea2 implements TextBlock {
.getBackground());
final HtmlColor fore = rose.getHtmlColor(skinParam, modifier.getForeground());
- final TextBlock uBlock = modifier.getUBlock(skinParam.getCircledCharacterRadius(), fore, back);
+ final TextBlock uBlock = modifier.getUBlock(skinParam.classAttributeIconSize(), fore, back);
return uBlock;
}
diff --git a/src/net/sourceforge/plantuml/graph2/GeomUtils.java b/src/net/sourceforge/plantuml/graph2/GeomUtils.java
index 8e0611e7d..efd8e6255 100644
--- a/src/net/sourceforge/plantuml/graph2/GeomUtils.java
+++ b/src/net/sourceforge/plantuml/graph2/GeomUtils.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 3833 $
+ * Revision $Revision: 7205 $
*
*/
package net.sourceforge.plantuml.graph2;
@@ -140,7 +140,16 @@ public class GeomUtils {
final int x = (int) pt.getX() - 1;
final int y = (int) pt.getY() - 1;
g2d.fillOval(x, y, 3, 3);
-
+ }
+
+ public static double getOrthoDistance(Line2D.Double seg, Point2D pt) {
+ if (isHorizontal(seg)) {
+ return Math.abs(seg.getP1().getY() - pt.getY());
+ }
+ if (isVertical(seg)) {
+ return Math.abs(seg.getP1().getX() - pt.getX());
+ }
+ throw new IllegalArgumentException();
}
}
diff --git a/src/net/sourceforge/plantuml/posimo/Block.java b/src/net/sourceforge/plantuml/posimo/Block.java
index 063453195..74879cd51 100644
--- a/src/net/sourceforge/plantuml/posimo/Block.java
+++ b/src/net/sourceforge/plantuml/posimo/Block.java
@@ -95,5 +95,10 @@ public class Block implements Clusterable {
public final void setY(double y) {
this.y = y;
}
+
+ public void moveSvek(double deltaX, double deltaY) {
+ throw new UnsupportedOperationException();
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/posimo/Cluster.java b/src/net/sourceforge/plantuml/posimo/Cluster.java
index 4bca72fa7..8dc4cfd52 100644
--- a/src/net/sourceforge/plantuml/posimo/Cluster.java
+++ b/src/net/sourceforge/plantuml/posimo/Cluster.java
@@ -151,5 +151,9 @@ public class Cluster implements Clusterable {
return titleHeight;
}
+ public void moveSvek(double deltaX, double deltaY) {
+ throw new UnsupportedOperationException();
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/posimo/DotPath.java b/src/net/sourceforge/plantuml/posimo/DotPath.java
index 8c7c01601..2ca27cb31 100644
--- a/src/net/sourceforge/plantuml/posimo/DotPath.java
+++ b/src/net/sourceforge/plantuml/posimo/DotPath.java
@@ -53,7 +53,7 @@ import net.sourceforge.plantuml.ugraphic.UPath;
import net.sourceforge.plantuml.ugraphic.USegmentType;
import net.sourceforge.plantuml.ugraphic.UShape;
-public class DotPath implements UShape {
+public class DotPath implements UShape, Moveable {
static class TriPoints {
public TriPoints(String p1, String p2, String p, double deltaY) {
@@ -84,11 +84,72 @@ public class DotPath implements UShape {
private final List beziers = new ArrayList();
+ public DotPath() {
+ this(new ArrayList());
+ }
+
+ public DotPath(DotPath other) {
+ this(new ArrayList());
+ for (CubicCurve2D.Double c : other.beziers) {
+ this.beziers.add(new CubicCurve2D.Double(c.x1, c.y1, c.ctrlx1, c.ctrly1, c.ctrlx2, c.ctrly2, c.x2, c.y2));
+ }
+ }
+
+ private DotPath(List beziers) {
+ this.beziers.addAll(beziers);
+ }
+
+ public DotPath(String init, double deltaY) {
+ if (init.startsWith("M") == false) {
+ throw new IllegalArgumentException();
+ }
+ final int posC = init.indexOf("C");
+ if (posC == -1) {
+ throw new IllegalArgumentException();
+ }
+ final StringTokenizer st = new StringTokenizer(init.substring(1, posC), ",");
+ final double startX = Double.parseDouble(st.nextToken());
+ final double startY = Double.parseDouble(st.nextToken()) + deltaY;
+
+ final StringTokenizer st2 = new StringTokenizer(init.substring(posC + 1), " ");
+ final List triPoints = new ArrayList();
+ while (st2.hasMoreTokens()) {
+ final String p1 = st2.nextToken();
+ final String p2 = st2.nextToken();
+ final String p = st2.nextToken();
+ triPoints.add(new TriPoints(p1, p2, p, deltaY));
+ }
+ double x = startX;
+ double y = startY;
+ for (TriPoints p : triPoints) {
+ final CubicCurve2D.Double bezier = new CubicCurve2D.Double(x, y, p.x1, p.y1, p.x2, p.y2, p.x, p.y);
+ beziers.add(bezier);
+ x = p.x;
+ y = p.y;
+ }
+ // this.print = triPoints.toString();
+ }
+
// private final String print;
public Point2D getStartPoint() {
return beziers.get(0).getP1();
}
+
+ public void forceStartPoint(double x, double y) {
+ beziers.get(0).x1 = x;
+ beziers.get(0).y1 = y;
+ }
+
+ public Point2D getEndPoint() {
+ return beziers.get(beziers.size() - 1).getP2();
+ }
+
+ public void forceEndPoint(double x, double y) {
+ beziers.get(beziers.size() - 1).x2 = x;
+ beziers.get(beziers.size() - 1).y2 = y;
+ }
+
public MinMax getMinMax() {
final MinMax result = new MinMax();
@@ -125,14 +186,6 @@ public class DotPath implements UShape {
}
- public DotPath() {
- this(new ArrayList());
- }
-
- public Point2D getEndPoint() {
- return beziers.get(beziers.size() - 1).getP2();
- }
-
public Line2D getEndTangeante() {
final CubicCurve2D.Double last = beziers.get(beziers.size() - 1);
double dx = last.x2 - last.ctrlx2;
@@ -191,47 +244,6 @@ public class DotPath implements UShape {
return new DotPath(copy);
}
- private DotPath(List beziers) {
- this.beziers.addAll(beziers);
- // this.print = super.toString();
- }
-
- // @Override
- // public String toString() {
- // return print;
- // }
-
- public DotPath(String init, double deltaY) {
- if (init.startsWith("M") == false) {
- throw new IllegalArgumentException();
- }
- final int posC = init.indexOf("C");
- if (posC == -1) {
- throw new IllegalArgumentException();
- }
- final StringTokenizer st = new StringTokenizer(init.substring(1, posC), ",");
- final double startX = Double.parseDouble(st.nextToken());
- final double startY = Double.parseDouble(st.nextToken()) + deltaY;
-
- final StringTokenizer st2 = new StringTokenizer(init.substring(posC + 1), " ");
- final List triPoints = new ArrayList();
- while (st2.hasMoreTokens()) {
- final String p1 = st2.nextToken();
- final String p2 = st2.nextToken();
- final String p = st2.nextToken();
- triPoints.add(new TriPoints(p1, p2, p, deltaY));
- }
- double x = startX;
- double y = startY;
- for (TriPoints p : triPoints) {
- final CubicCurve2D.Double bezier = new CubicCurve2D.Double(x, y, p.x1, p.y1, p.x2, p.y2, p.x, p.y);
- beziers.add(bezier);
- x = p.x;
- y = p.y;
- }
- // this.print = triPoints.toString();
- }
-
public Map somePoints() {
final Map result = new HashMap();
for (CubicCurve2D.Double bez : beziers) {
@@ -429,4 +441,17 @@ public class DotPath implements UShape {
}
+ public void moveSvek(double deltaX, double deltaY) {
+ for (int i = 0; i < beziers.size(); i++) {
+ final CubicCurve2D.Double c = beziers.get(i);
+ beziers.set(i, new CubicCurve2D.Double(c.x1 + deltaX, c.y1 + deltaY, c.ctrlx1 + deltaX, c.ctrly1 + deltaY,
+ c.ctrlx2 + deltaX, c.ctrly2 + deltaY, c.x2 + deltaX, c.y2 + deltaY));
+ }
+
+ }
+
+ public final List getBeziers() {
+ return Collections.unmodifiableList(beziers);
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/posimo/Label.java b/src/net/sourceforge/plantuml/posimo/Label.java
index 2a0f7b76d..8823ae9eb 100644
--- a/src/net/sourceforge/plantuml/posimo/Label.java
+++ b/src/net/sourceforge/plantuml/posimo/Label.java
@@ -81,5 +81,10 @@ public class Label implements Positionable {
public final void setY(double y) {
this.y = y;
}
+
+ public void moveSvek(double deltaX, double deltaY) {
+ throw new UnsupportedOperationException();
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/posimo/MargedBlock.java b/src/net/sourceforge/plantuml/posimo/MargedBlock.java
index d1700b0b4..c49596c65 100644
--- a/src/net/sourceforge/plantuml/posimo/MargedBlock.java
+++ b/src/net/sourceforge/plantuml/posimo/MargedBlock.java
@@ -51,8 +51,7 @@ public class MargedBlock {
this.imageBlock = imageBlock;
this.marginDecorator = marginDecorator;
this.imageDimension = imageBlock.getDimension(stringBounder);
- this.block = new Block(uid++, imageDimension.getWidth() + 2
- * marginDecorator, imageDimension.getHeight() + 2
+ this.block = new Block(uid++, imageDimension.getWidth() + 2 * marginDecorator, imageDimension.getHeight() + 2
* marginDecorator, parent);
}
@@ -63,7 +62,7 @@ public class MargedBlock {
public double getMarginDecorator() {
return marginDecorator;
}
-
+
public IEntityImageBlock getImageBlock() {
return imageBlock;
}
@@ -77,9 +76,11 @@ public class MargedBlock {
public Point2D getPosition() {
Point2D pos = block.getPosition();
- return new Point2D.Double(pos.getX() + marginDecorator, pos
- .getY()
- + marginDecorator);
+ return new Point2D.Double(pos.getX() + marginDecorator, pos.getY() + marginDecorator);
+ }
+
+ public void moveSvek(double deltaX, double deltaY) {
+ throw new UnsupportedOperationException();
}
};
}
diff --git a/src/net/sourceforge/plantuml/posimo/Moveable.java b/src/net/sourceforge/plantuml/posimo/Moveable.java
new file mode 100644
index 000000000..410cd6cde
--- /dev/null
+++ b/src/net/sourceforge/plantuml/posimo/Moveable.java
@@ -0,0 +1,40 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009, Arnaud Roques
+ *
+ * Project Info: http://plantuml.sourceforge.net
+ *
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
+ * in the United States and other countries.]
+ *
+ * Original Author: Arnaud Roques
+ *
+ * Revision $Revision: 4236 $
+ *
+ */
+package net.sourceforge.plantuml.posimo;
+
+public interface Moveable {
+
+ void moveSvek(double deltaX, double deltaY);
+
+}
diff --git a/src/net/sourceforge/plantuml/posimo/Positionable.java b/src/net/sourceforge/plantuml/posimo/Positionable.java
index e4c31bff4..774805320 100644
--- a/src/net/sourceforge/plantuml/posimo/Positionable.java
+++ b/src/net/sourceforge/plantuml/posimo/Positionable.java
@@ -36,7 +36,7 @@ package net.sourceforge.plantuml.posimo;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
-public interface Positionable {
+public interface Positionable extends Moveable {
public Dimension2D getSize();
diff --git a/src/net/sourceforge/plantuml/posimo/PositionableImpl.java b/src/net/sourceforge/plantuml/posimo/PositionableImpl.java
index 0a5d290e4..36ea59c14 100644
--- a/src/net/sourceforge/plantuml/posimo/PositionableImpl.java
+++ b/src/net/sourceforge/plantuml/posimo/PositionableImpl.java
@@ -59,4 +59,8 @@ public class PositionableImpl implements Positionable {
return dim;
}
+ public void moveSvek(double deltaX, double deltaY) {
+ this.pos.setLocation(pos.getX() + deltaX, pos.getY() + deltaY);
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/posimo/PositionableUtils.java b/src/net/sourceforge/plantuml/posimo/PositionableUtils.java
index be9bf5a33..8e8195c0b 100644
--- a/src/net/sourceforge/plantuml/posimo/PositionableUtils.java
+++ b/src/net/sourceforge/plantuml/posimo/PositionableUtils.java
@@ -109,6 +109,10 @@ public class PositionableUtils {
public Dimension2D getSize() {
return Dimension2DDouble.delta(pos.getSize(), 2 * widthMargin, 2 * heightMargin);
}
+
+ public void moveSvek(double deltaX, double deltaY) {
+ pos.moveSvek(deltaX, deltaY);
+ }
};
}
diff --git a/src/net/sourceforge/plantuml/postit/PostIt.java b/src/net/sourceforge/plantuml/postit/PostIt.java
index adf62b756..a07948007 100644
--- a/src/net/sourceforge/plantuml/postit/PostIt.java
+++ b/src/net/sourceforge/plantuml/postit/PostIt.java
@@ -106,8 +106,8 @@ public class PostIt {
final SkinParam param = new SkinParam(null);
final UFont fontNote = param.getFont(FontParam.NOTE, null);
- final ComponentRoseNote note = new ComponentRoseNote(noteBackgroundColor, borderColor, HtmlColor.BLACK, fontNote,
- text);
+ final ComponentRoseNote note = new ComponentRoseNote(noteBackgroundColor, borderColor, HtmlColor.BLACK,
+ fontNote, text, 0, 0);
return note;
}
}
diff --git a/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagram.java b/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagram.java
index c62071dec..d1ae790f5 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagram.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagram.java
@@ -100,7 +100,8 @@ public class SequenceDiagram extends UmlDiagram {
throw new IllegalArgumentException();
}
if (display == null) {
- display = Arrays.asList(code);
+ // display = Arrays.asList(code);
+ display = StringUtils.getWithNewlines(code);
}
final Participant result = new Participant(type, code, display);
participants.put(code, result);
diff --git a/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagramFactory.java b/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagramFactory.java
index 843a130b3..ae5b24411 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagramFactory.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/SequenceDiagramFactory.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 6494 $
+ * Revision $Revision: 7229 $
*
*/
package net.sourceforge.plantuml.sequencediagram;
@@ -60,6 +60,7 @@ import net.sourceforge.plantuml.sequencediagram.command.CommandNoteSequence;
import net.sourceforge.plantuml.sequencediagram.command.CommandParticipantA;
import net.sourceforge.plantuml.sequencediagram.command.CommandParticipantA2;
import net.sourceforge.plantuml.sequencediagram.command.CommandParticipantA3;
+import net.sourceforge.plantuml.sequencediagram.command.CommandParticipantA4;
import net.sourceforge.plantuml.sequencediagram.command.CommandReferenceMultilinesOverSeveral;
import net.sourceforge.plantuml.sequencediagram.command.CommandReferenceOverSeveral;
import net.sourceforge.plantuml.sequencediagram.command.CommandSkin;
@@ -78,6 +79,7 @@ public class SequenceDiagramFactory extends AbstractUmlSystemCommandFactory {
addCommand(new CommandParticipantA(system));
addCommand(new CommandParticipantA2(system));
addCommand(new CommandParticipantA3(system));
+ addCommand(new CommandParticipantA4(system));
addCommand(new CommandArrow(system));
addCommand(new CommandExoArrowLeft(system));
addCommand(new CommandExoArrowRight(system));
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandActivate.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandActivate.java
index 48e9b7881..6d4b7eb03 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandActivate.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandActivate.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 5884 $
+ * Revision $Revision: 7225 $
*
*/
package net.sourceforge.plantuml.sequencediagram.command;
@@ -46,7 +46,7 @@ import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
public class CommandActivate extends SingleLineCommand {
public CommandActivate(SequenceDiagram sequenceDiagram) {
- super(sequenceDiagram, "(?i)^(activate|deactivate|destroy|create)\\s+([\\p{L}0-9_.]+|\"[^\"]+\")\\s*(#\\w+)?$");
+ super(sequenceDiagram, "(?i)^(activate|deactivate|destroy|create)\\s+([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*(#\\w+)?$");
}
@Override
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandActivate2.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandActivate2.java
index 23a6bac36..5cc323367 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandActivate2.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandActivate2.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 4762 $
+ * Revision $Revision: 7225 $
*
*/
package net.sourceforge.plantuml.sequencediagram.command;
@@ -45,7 +45,7 @@ import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
public class CommandActivate2 extends SingleLineCommand {
public CommandActivate2(SequenceDiagram sequenceDiagram) {
- super(sequenceDiagram, "(?i)^([\\p{L}0-9_.]+)\\s*(\\+\\+|--)\\s*(#\\w+)?$");
+ super(sequenceDiagram, "(?i)^([\\p{L}0-9_.@]+)\\s*(\\+\\+|--)\\s*(#\\w+)?$");
}
@Override
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java
index 19ef68ed2..da2e8bb0d 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java
@@ -62,18 +62,18 @@ public class CommandArrow extends SingleLineCommand2 {
return new RegexConcat(
new RegexLeaf("^"), //
new RegexOr("PART1", //
- new RegexLeaf("PART1CODE", "([\\p{L}0-9_.]+)"), //
+ new RegexLeaf("PART1CODE", "([\\p{L}0-9_.@]+)"), //
new RegexLeaf("PART1LONG", "\"([^\"]+)\""), //
- new RegexLeaf("PART1LONGCODE", "\"([^\"]+)\"\\s*as\\s+([\\p{L}0-9_.]+)"), //
- new RegexLeaf("PART1CODELONG", "([\\p{L}0-9_.]+)\\s+as\\s*\"([^\"]+)\"")),
+ new RegexLeaf("PART1LONGCODE", "\"([^\"]+)\"\\s*as\\s+([\\p{L}0-9_.@]+)"), //
+ new RegexLeaf("PART1CODELONG", "([\\p{L}0-9_.@]+)\\s+as\\s*\"([^\"]+)\"")),
new RegexLeaf("\\s*"), //
new RegexLeaf("ARROW", "(\\$?([=-]+(>>?|//?|\\\\\\\\?)|(<|//?|\\\\\\\\?)[=-]+)\\$?)"), //
new RegexLeaf("\\s*"), //
new RegexOr("PART2", //
- new RegexLeaf("PART2CODE", "([\\p{L}0-9_.]+)"), //
+ new RegexLeaf("PART2CODE", "([\\p{L}0-9_.@]+)"), //
new RegexLeaf("PART2LONG", "\"([^\"]+)\""), //
- new RegexLeaf("PART2LONGCODE", "\"([^\"]+)\"\\s*as\\s+([\\p{L}0-9_.]+)"), //
- new RegexLeaf("PART2CODELONG", "([\\p{L}0-9_.]+)\\s+as\\s*\"([^\"]+)\"")),
+ new RegexLeaf("PART2LONGCODE", "\"([^\"]+)\"\\s*as\\s+([\\p{L}0-9_.@]+)"), //
+ new RegexLeaf("PART2CODELONG", "([\\p{L}0-9_.@]+)\\s+as\\s*\"([^\"]+)\"")),
new RegexLeaf("\\s*"), //
new RegexLeaf("MESSAGE", "(?::\\s*(.*))?$"));
}
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowLeft.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowLeft.java
index 36a841e14..e4a1265a2 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowLeft.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowLeft.java
@@ -41,7 +41,7 @@ public class CommandExoArrowLeft extends CommandExoArrowAny {
public CommandExoArrowLeft(SequenceDiagram sequenceDiagram) {
super(
sequenceDiagram,
- "(?i)^(\\[?[=-]+(?:>>?|//?|\\\\\\\\?)|\\[?(?:<|//?|\\\\\\\\?)[=-]+)\\s*([\\p{L}0-9_.]+|\"[^\"]+\")\\s*(?::\\s*(.*))?$",
+ "(?i)^(\\[?[=-]+(?:>>?|//?|\\\\\\\\?)|\\[?(?:<|//?|\\\\\\\\?)[=-]+)\\s*([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*(?::\\s*(.*))?$",
0, 1);
}
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowRight.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowRight.java
index 0a2e2f718..bc12b4007 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowRight.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowRight.java
@@ -40,7 +40,7 @@ public class CommandExoArrowRight extends CommandExoArrowAny {
public CommandExoArrowRight(SequenceDiagram sequenceDiagram) {
super(sequenceDiagram,
- "(?i)^([\\p{L}0-9_.]+|\"[^\"]+\")\\s*([=-]+(?:>>?|//?|\\\\\\\\?)\\]?|(?:<|//?|\\\\\\\\?)[=-]+\\]?)\\s*(?::\\s*(.*))?$", 1, 0);
+ "(?i)^([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*([=-]+(?:>>?|//?|\\\\\\\\?)\\]?|(?:<|//?|\\\\\\\\?)[=-]+\\]?)\\s*(?::\\s*(.*))?$", 1, 0);
}
@Override
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandMultilinesNote.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandMultilinesNote.java
index b6313b29b..2a0ee9bc1 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandMultilinesNote.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandMultilinesNote.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7113 $
+ * Revision $Revision: 7225 $
*
*/
package net.sourceforge.plantuml.sequencediagram.command;
@@ -48,7 +48,7 @@ import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
public class CommandMultilinesNote extends CommandMultilines {
public CommandMultilinesNote(final SequenceDiagram sequenceDiagram) {
- super(sequenceDiagram, "(?i)^(note|hnote|rnote)\\s+(right|left|over)\\s+(?:of\\s+)?([\\p{L}0-9_.]+|\"[^\"]+\")\\s*(#\\w+)?$", "(?i)^end ?(note|hnote|rnote)$");
+ super(sequenceDiagram, "(?i)^(note|hnote|rnote)\\s+(right|left|over)\\s+(?:of\\s+)?([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*(#\\w+)?$", "(?i)^end ?(note|hnote|rnote)$");
}
public CommandExecutionResult execute(List lines) {
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandMultilinesNoteOverSeveral.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandMultilinesNoteOverSeveral.java
index 72b25dd12..873569aa7 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandMultilinesNoteOverSeveral.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandMultilinesNoteOverSeveral.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7113 $
+ * Revision $Revision: 7225 $
*
*/
package net.sourceforge.plantuml.sequencediagram.command;
@@ -47,7 +47,7 @@ import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
public class CommandMultilinesNoteOverSeveral extends CommandMultilines {
public CommandMultilinesNoteOverSeveral(final SequenceDiagram sequenceDiagram) {
- super(sequenceDiagram, "(?i)^(note|hnote|rnote)\\s+over\\s+([\\p{L}0-9_.]+|\"[^\"]+\")\\s*\\,\\s*([\\p{L}0-9_.]+|\"[^\"]+\")\\s*(#\\w+)?$", "(?i)^end ?(note|hnote|rnote)$");
+ super(sequenceDiagram, "(?i)^(note|hnote|rnote)\\s+over\\s+([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*\\,\\s*([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*(#\\w+)?$", "(?i)^end ?(note|hnote|rnote)$");
}
public CommandExecutionResult execute(List lines) {
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandNoteOverSeveral.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandNoteOverSeveral.java
index 014cef9ab..d295f4c8c 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandNoteOverSeveral.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandNoteOverSeveral.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7113 $
+ * Revision $Revision: 7225 $
*
*/
package net.sourceforge.plantuml.sequencediagram.command;
@@ -49,7 +49,7 @@ public class CommandNoteOverSeveral extends SingleLineCommand {
public CommandNoteOverSeveral(SequenceDiagram sequenceDiagram) {
super(
sequenceDiagram,
- "(?i)^(note|hnote|rnote)\\s+over\\s+([\\p{L}0-9_.]+|\"[^\"]+\")\\s*\\,\\s*([\\p{L}0-9_.]+|\"[^\"]+\")\\s*(#\\w+)?\\s*:\\s*(.*)$");
+ "(?i)^(note|hnote|rnote)\\s+over\\s+([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*\\,\\s*([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*(#\\w+)?\\s*:\\s*(.*)$");
}
@Override
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandNoteSequence.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandNoteSequence.java
index 29a17d045..c7fcf0fae 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandNoteSequence.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandNoteSequence.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7113 $
+ * Revision $Revision: 7225 $
*
*/
package net.sourceforge.plantuml.sequencediagram.command;
@@ -49,7 +49,7 @@ public class CommandNoteSequence extends SingleLineCommand {
public CommandNoteSequence(SequenceDiagram sequenceDiagram) {
super(sequenceDiagram,
- "(?i)^(note|hnote|rnote)\\s+(right|left|over)\\s+(?:of\\s+)?([\\p{L}0-9_.]+|\"[^\"]+\")\\s*(#\\w+)?\\s*:\\s*(.*)$");
+ "(?i)^(note|hnote|rnote)\\s+(right|left|over)\\s+(?:of\\s+)?([\\p{L}0-9_.@]+|\"[^\"]+\")\\s*(#\\w+)?\\s*:\\s*(.*)$");
}
@Override
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipant.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipant.java
index fc93f7e37..5739dd627 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipant.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipant.java
@@ -48,14 +48,12 @@ import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.ParticipantType;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
-
public abstract class CommandParticipant extends SingleLineCommand2 {
public CommandParticipant(SequenceDiagram sequenceDiagram, RegexConcat pattern) {
super(sequenceDiagram, pattern);
}
-
@Override
final protected CommandExecutionResult executeArg(Map arg2) {
final String code = arg2.get("CODE").get(0);
@@ -65,7 +63,7 @@ public abstract class CommandParticipant extends SingleLineCommand2 strings = null;
- if (arg2.get("FULL").get(0) != null) {
+ if (arg2.get("FULL") != null && arg2.get("FULL").get(0) != null) {
strings = StringUtils.getWithNewlines(arg2.get("FULL").get(0));
}
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA.java
index 3bef5689b..5d5cb911e 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA.java
@@ -48,7 +48,7 @@ public class CommandParticipantA extends CommandParticipant {
new RegexLeaf("TYPE", "(participant|actor)"), //
new RegexLeaf("\\s+"), //
new RegexLeaf("FULL", "(?:\"([^\"]+)\"\\s+as\\s+)?"), //
- new RegexLeaf("CODE", "([\\p{L}0-9_.]+)"), //
+ new RegexLeaf("CODE", "([\\p{L}0-9_.@]+)"), //
new RegexLeaf("STEREO", "(?:\\s*(\\<\\<.*\\>\\>))?"), //
new RegexLeaf("\\s*"), //
new RegexLeaf("COLOR", "(#\\w+)?"), //
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA2.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA2.java
index 9e21aeb05..9becc5ee5 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA2.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA2.java
@@ -47,7 +47,7 @@ public class CommandParticipantA2 extends CommandParticipant {
return new RegexConcat(new RegexLeaf("^"), //
new RegexLeaf("TYPE", "(participant|actor)"), //
new RegexLeaf("\\s+"), //
- new RegexLeaf("CODE", "([\\p{L}0-9_.]+)"), //
+ new RegexLeaf("CODE", "([\\p{L}0-9_.@]+)"), //
new RegexLeaf("\\s+as\\s+"), //
new RegexLeaf("FULL", "\"([^\"]+)\""), //
new RegexLeaf("STEREO", "(?:\\s*(\\<\\<.*\\>\\>))?"), //
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA3.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA3.java
index b277416f7..737cc9ba2 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA3.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA3.java
@@ -47,8 +47,8 @@ public class CommandParticipantA3 extends CommandParticipant {
return new RegexConcat(new RegexLeaf("^"), //
new RegexLeaf("TYPE", "(participant|actor)"), //
new RegexLeaf("\\s+"), //
- new RegexLeaf("FULL", "([\\p{L}0-9_.]+)\\s+as\\s+"), //
- new RegexLeaf("CODE", "([\\p{L}0-9_.]+)"), //
+ new RegexLeaf("FULL", "([\\p{L}0-9_.@]+)\\s+as\\s+"), //
+ new RegexLeaf("CODE", "([\\p{L}0-9_.@]+)"), //
new RegexLeaf("STEREO", "(?:\\s*(\\<\\<.*\\>\\>))?"), //
new RegexLeaf("\\s*"), //
new RegexLeaf("COLOR", "(#\\w+)?"), //
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA4.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA4.java
new file mode 100644
index 000000000..7efb235f9
--- /dev/null
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandParticipantA4.java
@@ -0,0 +1,58 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009, Arnaud Roques
+ *
+ * Project Info: http://plantuml.sourceforge.net
+ *
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
+ * in the United States and other countries.]
+ *
+ * Original Author: Arnaud Roques
+ *
+ * Revision $Revision: 6109 $
+ *
+ */
+package net.sourceforge.plantuml.sequencediagram.command;
+
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
+
+public class CommandParticipantA4 extends CommandParticipant {
+
+ public CommandParticipantA4(SequenceDiagram sequenceDiagram) {
+ super(sequenceDiagram, getRegexConcat());
+ }
+
+ static RegexConcat getRegexConcat() {
+ return new RegexConcat(new RegexLeaf("^"), //
+ new RegexLeaf("TYPE", "(participant|actor)"), //
+ new RegexLeaf("\\s+"), //
+ new RegexLeaf("CODE", "\"([^\"]+)\""), //
+ new RegexLeaf("\\s*"), //
+ new RegexLeaf("STEREO", "(?:\\s*(\\<\\<.*\\>\\>))?"), //
+ new RegexLeaf("\\s*"), //
+ new RegexLeaf("COLOR", "(#\\w+)?"), //
+ new RegexLeaf("$"));
+ }
+
+}
diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandReferenceMultilinesOverSeveral.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandReferenceMultilinesOverSeveral.java
index 02cc3f282..cf87c30d4 100644
--- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandReferenceMultilinesOverSeveral.java
+++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandReferenceMultilinesOverSeveral.java
@@ -51,7 +51,7 @@ public class CommandReferenceMultilinesOverSeveral extends CommandMultilines {
public CommandUrl(SequenceDiagram diagram) {
super(diagram,
- "(?i)^url\\s*(?:of|for)?\\s+([\\p{L}0-9_.]+|\"[^\"]+\")\\s+(?:is)?\\s*\\[\\[([^|]*)(?:\\|([^|]*))?\\]\\]$");
+ "(?i)^url\\s*(?:of|for)?\\s+([\\p{L}0-9_.@]+|\"[^\"]+\")\\s+(?:is)?\\s*\\[\\[([^|]*)(?:\\|([^|]*))?\\]\\]$");
}
@Override
diff --git a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseNote.java b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseNote.java
index 7553c7a66..19e45cee8 100644
--- a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseNote.java
+++ b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseNote.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7171 $
+ * Revision $Revision: 7203 $
*
*/
package net.sourceforge.plantuml.skin.rose;
@@ -50,12 +50,16 @@ final public class ComponentRoseNote extends AbstractTextualComponent {
private final int cornersize = 10;
private final HtmlColor back;
private final HtmlColor foregroundColor;
+ private final double paddingX;
+ private final double paddingY;
public ComponentRoseNote(HtmlColor back, HtmlColor foregroundColor, HtmlColor fontColor, UFont font,
- List extends CharSequence> strings) {
+ List extends CharSequence> strings, double paddingX, double paddingY) {
super(strings, fontColor, font, HorizontalAlignement.LEFT, 6, 15, 5);
this.back = back;
this.foregroundColor = foregroundColor;
+ this.paddingX = paddingX;
+ this.paddingY = paddingY;
}
@Override
@@ -71,12 +75,12 @@ final public class ComponentRoseNote extends AbstractTextualComponent {
@Override
public double getPaddingX() {
- return 5;
+ return paddingX;
}
@Override
public double getPaddingY() {
- return 5;
+ return paddingY;
}
@Override
diff --git a/src/net/sourceforge/plantuml/skin/rose/Rose.java b/src/net/sourceforge/plantuml/skin/rose/Rose.java
index de3645719..ba39859a2 100644
--- a/src/net/sourceforge/plantuml/skin/rose/Rose.java
+++ b/src/net/sourceforge/plantuml/skin/rose/Rose.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7112 $
+ * Revision $Revision: 7203 $
*
*/
package net.sourceforge.plantuml.skin.rose;
@@ -51,6 +51,14 @@ import net.sourceforge.plantuml.ugraphic.UFont;
public class Rose implements Skin {
private final Map defaultsColor = new EnumMap(ColorParam.class);
+
+ private double paddingX = 5;
+ private double paddingY = 5;
+
+ public void setPaddingNote(double paddingX, double paddingY) {
+ this.paddingX = paddingX;
+ this.paddingY = paddingY;
+ }
public Rose() {
defaultsColor.put(ColorParam.background, HtmlColor.getColorIfValid("white"));
@@ -208,7 +216,7 @@ public class Rose implements Skin {
final HtmlColor borderColor = getHtmlColor(param, ColorParam.noteBorder);
final UFont fontNote = param.getFont(FontParam.NOTE, null);
return new ComponentRoseNote(noteBackgroundColor, borderColor, getFontColor(param, FontParam.NOTE),
- fontNote, stringsToDisplay);
+ fontNote, stringsToDisplay, paddingX, paddingY);
}
if (type == ComponentType.NOTE_HEXAGONAL) {
final HtmlColor noteBackgroundColor = getHtmlColor(param, ColorParam.noteBackground);
diff --git a/src/net/sourceforge/plantuml/svek/Cluster.java b/src/net/sourceforge/plantuml/svek/Cluster.java
index 23727cd58..22032b015 100644
--- a/src/net/sourceforge/plantuml/svek/Cluster.java
+++ b/src/net/sourceforge/plantuml/svek/Cluster.java
@@ -49,17 +49,23 @@ import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.UmlDiagramType;
+import net.sourceforge.plantuml.cucadiagram.EntityType;
import net.sourceforge.plantuml.cucadiagram.Group;
+import net.sourceforge.plantuml.cucadiagram.IEntity;
import net.sourceforge.plantuml.cucadiagram.dot.DotData;
import net.sourceforge.plantuml.graphic.HtmlColor;
+import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
+import net.sourceforge.plantuml.posimo.Moveable;
import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.ULine;
+import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.URectangle;
import net.sourceforge.plantuml.ugraphic.UShape;
import net.sourceforge.plantuml.ugraphic.UStroke;
-public class Cluster {
+public class Cluster implements Moveable {
private final Cluster parent;
private final Group group;
@@ -69,6 +75,28 @@ public class Cluster {
private final int color;
private final int colorTitle;
+ private int titleWidth;
+ private int titleHeight;
+ private TextBlock title;
+
+ private double xTitle;
+ private double yTitle;
+
+ private double minX;
+ private double minY;
+ private double maxX;
+ private double maxY;
+
+ public void moveSvek(double deltaX, double deltaY) {
+ this.xTitle += deltaX;
+ this.minX += deltaX;
+ this.maxX += deltaX;
+ this.yTitle += deltaY;
+ this.minY += deltaY;
+ this.maxY += deltaY;
+
+ }
+
public Cluster(ColorSequence colorSequence) {
this(null, null, false, colorSequence);
}
@@ -140,10 +168,6 @@ public class Cluster {
return Collections.unmodifiableList(children);
}
- private int titleWidth;
- private int titleHeight;
- private TextBlock title;
-
public Cluster createChild(Group g, int titleWidth, int titleHeight, TextBlock title, boolean special,
ColorSequence colorSequence) {
final Cluster child = new Cluster(this, g, special, colorSequence);
@@ -166,9 +190,6 @@ public class Cluster {
return titleHeight;
}
- private double xTitle;
- private double yTitle;
-
public void setTitlePosition(double x, double y) {
this.xTitle = x;
this.yTitle = y;
@@ -180,19 +201,81 @@ public class Cluster {
drawUState(ug, x, y, borderColor, dotData);
return;
}
- final UShape rect = new URectangle(maxX - minX, maxY - minY);
+ if (title != null) {
+ drawWithTitle(ug, x, y, borderColor, dotData);
+ return;
+ }
+ final URectangle rect = new URectangle(maxX - minX, maxY - minY);
+ if (dotData.getSkinParam().shadowing()) {
+ rect.setDeltaShadow(3.0);
+ }
HtmlColor stateBack = getBackColor();
if (stateBack == null) {
stateBack = dotData.getSkinParam().getHtmlColor(ColorParam.packageBackground, group.getStereotype());
}
+ if (stateBack == null) {
+ stateBack = dotData.getSkinParam().getHtmlColor(ColorParam.background, group.getStereotype());
+ }
ug.getParam().setBackcolor(stateBack);
ug.getParam().setColor(borderColor);
ug.getParam().setStroke(new UStroke(2));
ug.draw(x + minX, y + minY, rect);
ug.getParam().setStroke(new UStroke());
- if (title != null) {
- title.drawU(ug, x + xTitle, y + yTitle);
+ }
+
+ private UPolygon getSpecificFrontier(StringBounder stringBounder) {
+ final double width = maxX - minX;
+ final double height = maxY - minY;
+ final Dimension2D dimTitle = title.calculateDimension(stringBounder);
+ final double wtitle = dimTitle.getWidth() + marginTitleX1 + marginTitleX2;
+ final double htitle = dimTitle.getHeight() + marginTitleY1 + marginTitleY2;
+ final UPolygon shape = new UPolygon();
+ shape.addPoint(0, 0);
+ shape.addPoint(wtitle, 0);
+ shape.addPoint(wtitle + marginTitleX3, htitle);
+ shape.addPoint(width, htitle);
+ shape.addPoint(width, height);
+ shape.addPoint(0, height);
+ shape.addPoint(0, 0);
+ return shape;
+ }
+
+ // private UPolygon specificFrontier;
+ //
+ // public final UPolygon getSpecificFrontier() {
+ // return specificFrontier;
+ // }
+ //
+ private void drawWithTitle(UGraphic ug, double x, double y, HtmlColor borderColor, DotData dotData) {
+
+ // y += marginTitleY0;
+
+ final Dimension2D dimTitle = title.calculateDimension(ug.getStringBounder());
+ final double wtitle = dimTitle.getWidth() + marginTitleX1 + marginTitleX2;
+ final double htitle = dimTitle.getHeight() + marginTitleY1 + marginTitleY2;
+ final UPolygon shape = getSpecificFrontier(ug.getStringBounder());
+ if (dotData.getSkinParam().shadowing()) {
+ shape.setDeltaShadow(3.0);
}
+
+ HtmlColor stateBack = getBackColor();
+ if (stateBack == null) {
+ stateBack = dotData.getSkinParam().getHtmlColor(ColorParam.packageBackground, group.getStereotype());
+ }
+ if (stateBack == null) {
+ stateBack = dotData.getSkinParam().getHtmlColor(ColorParam.background, group.getStereotype());
+ }
+ if (stateBack == null) {
+ stateBack = HtmlColor.WHITE;
+ }
+ ug.getParam().setBackcolor(stateBack);
+ ug.getParam().setColor(borderColor);
+ ug.getParam().setStroke(new UStroke(2));
+ ug.draw(x + minX, y + minY, shape);
+ // specificFrontier = shape.translate(x + minX, y + minY);
+ ug.draw(x + minX, y + minY + htitle, new ULine(wtitle + marginTitleX3, 0));
+ ug.getParam().setStroke(new UStroke());
+ title.drawU(ug, x + minX + marginTitleX1, y + minY + marginTitleY1);
}
private HtmlColor getColor(DotData dotData, ColorParam colorParam, String stereo) {
@@ -216,11 +299,6 @@ public class Cluster {
}
- private double minX;
- private double minY;
- private double maxX;
- private double maxY;
-
public void setPosition(double minX, double minY, double maxX, double maxY) {
this.minX = minX;
this.maxX = maxX;
@@ -291,16 +369,29 @@ public class Cluster {
return "za" + getUid2();
}
+ private int marginTitleX1 = 3;
+ private int marginTitleX2 = 3;
+ private int marginTitleX3 = 7;
+ private int marginTitleY0 = 10;
+ private int marginTitleY1 = 3;
+ private int marginTitleY2 = 3;
+
+ private final boolean protection0 = true;
+ private final boolean protection1 = true;
+
private void printInternal(StringBuilder sb, Collection lines) {
if (isSpecial()) {
subgraphCluster(sb, "a");
}
+ if (protection0) {
+ subgraphCluster(sb, "p0");
+ }
sb.append("subgraph " + getClusterId() + " {");
sb.append("style=solid;");
sb.append("color=\"" + StringUtils.getAsHtml(color) + "\";");
- final int titleWidth = getTitleWidth();
- final int titleHeight = getTitleHeight();
+ final int titleWidth = getTitleWidth() + marginTitleX1 + marginTitleX2 + marginTitleX3;
+ final int titleHeight = getTitleHeight() + marginTitleY0 + marginTitleY1 + marginTitleY2;
if (titleHeight > 0 && titleWidth > 0) {
sb.append("label=<");
Line.appendTable(sb, titleWidth, titleHeight, colorTitle);
@@ -318,7 +409,13 @@ public class Cluster {
// sb.append("}");
subgraphCluster(sb, "i");
}
+ if (protection1) {
+ subgraphCluster(sb, "p1");
+ }
printCluster(sb, lines);
+ if (protection1) {
+ sb.append("}");
+ }
if (isSpecial()) {
sb.append("}");
// subgraphCluster(sb, "zb");
@@ -331,6 +428,9 @@ public class Cluster {
// sb.append("}");
}
sb.append("}");
+ if (protection0) {
+ sb.append("}");
+ }
if (this.isSpecial()) {
// a
sb.append("}");
@@ -359,7 +459,24 @@ public class Cluster {
}
private final HtmlColor getBackColor() {
- return group.getBackColor();
+ if (group == null) {
+ return null;
+ }
+ final HtmlColor result = group.getBackColor();
+ if (result != null) {
+ return result;
+ }
+ if (parent == null) {
+ return null;
+ }
+ return parent.getBackColor();
+ }
+
+ public boolean isClusterOf(IEntity ent) {
+ if (ent.getType() != EntityType.GROUP) {
+ return false;
+ }
+ return group.getEntityCluster() == ent;
}
}
diff --git a/src/net/sourceforge/plantuml/svek/CucaDiagramFileMakerSvek2.java b/src/net/sourceforge/plantuml/svek/CucaDiagramFileMakerSvek2.java
index 449b3b896..bb8a54b28 100644
--- a/src/net/sourceforge/plantuml/svek/CucaDiagramFileMakerSvek2.java
+++ b/src/net/sourceforge/plantuml/svek/CucaDiagramFileMakerSvek2.java
@@ -88,65 +88,6 @@ public final class CucaDiagramFileMakerSvek2 {
return getData().getSkinParam().getFont(fontParam, null);
}
- private IEntityImage createEntityImageBlock(DotData dotData, IEntity ent) {
- if (ent.getType() == EntityType.CLASS || ent.getType() == EntityType.ABSTRACT_CLASS
- || ent.getType() == EntityType.INTERFACE || ent.getType() == EntityType.ENUM) {
- return new EntityImageClass(ent, dotData.getSkinParam(), dotData);
- }
- if (ent.getType() == EntityType.NOTE) {
- return new EntityImageNote(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.ACTIVITY) {
- return new EntityImageActivity(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.STATE) {
- return new EntityImageState(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.CIRCLE_START) {
- return new EntityImageCircleStart(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.CIRCLE_END) {
- return new EntityImageCircleEnd(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.USECASE) {
- return new EntityImageUseCase(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.BRANCH) {
- return new EntityImageBranch(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.LOLLIPOP) {
- return new EntityImageLollipopInterface(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.ACTOR) {
- return new EntityImageActor(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.COMPONENT) {
- return new EntityImageComponent(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.OBJECT) {
- return new EntityImageObject(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.SYNCHRO_BAR) {
- return new EntityImageSynchroBar(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.CIRCLE_INTERFACE) {
- return new EntityImageCircleInterface(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.POINT_FOR_ASSOCIATION) {
- return new EntityImageAssociationPoint(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.GROUP) {
- return new EntityImageGroup(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.EMPTY_PACKAGE) {
- return new EntityImageEmptyPackage(ent, dotData.getSkinParam());
- }
- if (ent.getType() == EntityType.ASSOCIATION) {
- return new EntityImageAssociation(ent, dotData.getSkinParam());
- }
- throw new UnsupportedOperationException(ent.getType().toString());
- }
-
private DotStringFactory dotStringFactory;
private Map shapeMap;
@@ -181,7 +122,7 @@ public final class CucaDiagramFileMakerSvek2 {
printGroups(null);
printEntities(getUnpackagedEntities());
- final Map lineMap = new HashMap();
+ // final Map lineMap = new HashMap();
for (Link link : dotData.getLinks()) {
final String shapeUid1 = getShapeUid(link.getEntity1());
@@ -200,8 +141,18 @@ public final class CucaDiagramFileMakerSvek2 {
final Line line = new Line(shapeUid1, shapeUid2, link, colorSequence, ltail, lhead, dotData.getSkinParam(),
stringBounder, labelFont);
+ // lineMap.put(link, line);
dotStringFactory.addLine(line);
- lineMap.put(link, line);
+
+ if (link.getEntity1().getType() == EntityType.NOTE && onlyOneLink(link.getEntity1())) {
+ final Shape shape = shapeMap.get(link.getEntity1());
+ ((EntityImageNote) shape.getImage()).setOpaleLine(line, shape);
+ line.setOpale(true);
+ } else if (link.getEntity2().getType() == EntityType.NOTE && onlyOneLink(link.getEntity2())) {
+ final Shape shape = shapeMap.get(link.getEntity2());
+ ((EntityImageNote) shape.getImage()).setOpaleLine(line, shape);
+ line.setOpale(true);
+ }
}
if (dotStringFactory.illegalDotExe()) {
@@ -215,10 +166,16 @@ public final class CucaDiagramFileMakerSvek2 {
} else {
border = getColor(ColorParam.packageBorder, null);
}
- return new SvekResult(dim, dotData, dotStringFactory, border);
+ final SvekResult result = new SvekResult(dim, dotData, dotStringFactory, border);
+ result.moveSvek(6, 0);
+ return result;
}
+ private boolean onlyOneLink(IEntity ent) {
+ return Link.onlyOneLink(ent, dotData.getLinks());
+ }
+
protected final HtmlColor getColor(ColorParam colorParam, String stereo) {
return new Rose().getHtmlColor(dotData.getSkinParam(), colorParam, stereo);
}
@@ -266,18 +223,11 @@ public final class CucaDiagramFileMakerSvek2 {
}
private void printEntity(IEntity ent) {
-
- final IEntityImage image;
- if (ent.getSvekImage() == null) {
- image = createEntityImageBlock(dotData, ent);
- } else {
- image = ent.getSvekImage();
- }
+ final IEntityImage image = Shape.printEntity(ent, dotData);
final Dimension2D dim = image.getDimension(stringBounder);
- final Shape shape = new Shape(image.getShapeType(), dim.getWidth(), dim.getHeight(), colorSequence,
- ent.isTop(), image.getShield());
+ final Shape shape = new Shape(image, image.getShapeType(), dim.getWidth(), dim.getHeight(), colorSequence, ent
+ .isTop(), image.getShield());
dotStringFactory.addShape(shape);
- shape.setImage(image);
shapeMap.put(ent, shape);
}
diff --git a/src/net/sourceforge/plantuml/svek/DotStringFactory.java b/src/net/sourceforge/plantuml/svek/DotStringFactory.java
index 68f6c78a9..9c2784f0d 100644
--- a/src/net/sourceforge/plantuml/svek/DotStringFactory.java
+++ b/src/net/sourceforge/plantuml/svek/DotStringFactory.java
@@ -48,7 +48,6 @@ import java.util.regex.Pattern;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.Log;
-import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.UmlDiagramType;
import net.sourceforge.plantuml.cucadiagram.Group;
@@ -56,8 +55,9 @@ import net.sourceforge.plantuml.cucadiagram.dot.Graphviz;
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
+import net.sourceforge.plantuml.posimo.Moveable;
-public class DotStringFactory {
+public class DotStringFactory implements Moveable {
private final List allShapes = new ArrayList();
private final List allCluster = new ArrayList();
@@ -66,7 +66,9 @@ public class DotStringFactory {
private final ColorSequence colorSequence;
private final Cluster root;
- private final List lines = new ArrayList();
+ private final List lines0 = new ArrayList();
+ private final List lines1 = new ArrayList();
+ private final List allLines = new ArrayList();
private Cluster current;
private final UmlDiagramType type;
@@ -100,7 +102,7 @@ public class DotStringFactory {
private double getHorizontalDzeta() {
double max = 0;
- for (Line l : lines) {
+ for (Line l : allLines) {
final double c = l.getHorizontalDzeta(stringBounder);
if (c > max) {
max = c;
@@ -111,7 +113,7 @@ public class DotStringFactory {
private double getVerticalDzeta() {
double max = 0;
- for (Line l : lines) {
+ for (Line l : allLines) {
final double c = l.getVerticalDzeta(stringBounder);
if (c > max) {
max = c;
@@ -155,11 +157,14 @@ public class DotStringFactory {
sb.append("compound=true;");
SvekUtils.println(sb);
+ for (Line line : lines0) {
+ line.appendLine(sb);
+ }
root.fillRankMin(rankMin);
- root.printCluster(sb, lines);
+ root.printCluster(sb, allLines);
printMinRanking(sb);
- for (Line line : lines) {
+ for (Line line : lines1) {
line.appendLine(sb);
}
SvekUtils.println(sb);
@@ -193,10 +198,10 @@ public class DotStringFactory {
final byte[] result = baos.toByteArray();
final String s = new String(result, "UTF-8");
- if (OptionFlags.getInstance().isKeepTmpFiles()) {
- Log.info("Creating temporary file svek.svg");
- SvekUtils.traceSvgString(s);
- }
+ // if (OptionFlags.getInstance().isKeepTmpFiles()) {
+ Log.info("Creating temporary file svek.svg");
+ SvekUtils.traceSvgString(s);
+ // }
return s;
}
@@ -283,11 +288,11 @@ public class DotStringFactory {
}
- for (Line line : lines) {
+ for (Line line : allLines) {
line.solveLine(svg, fullHeight);
}
- for (Line line : lines) {
+ for (Line line : allLines) {
line.manageCollision(allShapes);
}
@@ -295,7 +300,20 @@ public class DotStringFactory {
}
public void addLine(Line line) {
- lines.add(line);
+ allLines.add(line);
+ if (first(line)) {
+ lines0.add(line);
+ } else {
+ lines1.add(line);
+ }
+ }
+
+ private static boolean first(Line line) {
+ final int length = line.getLength();
+ if (length==1) {
+ return true;
+ }
+ return false;
}
public final List getShapes() {
@@ -303,7 +321,7 @@ public class DotStringFactory {
}
public List getLines() {
- return Collections.unmodifiableList(lines);
+ return Collections.unmodifiableList(allLines);
}
public void openCluster(Group g, int titleWidth, int titleHeight, TextBlock title, boolean isSpecialGroup) {
@@ -322,4 +340,17 @@ public class DotStringFactory {
return Collections.unmodifiableList(allCluster);
}
+ public void moveSvek(double deltaX, double deltaY) {
+ for (Shape sh : allShapes) {
+ sh.moveSvek(deltaX, deltaY);
+ }
+ for (Line line : allLines) {
+ line.moveSvek(deltaX, deltaY);
+ }
+ for (Cluster cl : allCluster) {
+ cl.moveSvek(deltaX, deltaY);
+ }
+
+ }
+
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageActivity.java b/src/net/sourceforge/plantuml/svek/EntityImageActivity.java
index 791a10e0d..a29d48d99 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageActivity.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageActivity.java
@@ -79,7 +79,9 @@ public class EntityImageActivity extends AbstractEntityImage {
final double widthTotal = dimTotal.getWidth();
final double heightTotal = dimTotal.getHeight();
final Shadowable rect = new URectangle(widthTotal, heightTotal, CORNER, CORNER);
- rect.setDeltaShadow(4);
+ if (getSkinParam().shadowing()) {
+ rect.setDeltaShadow(4);
+ }
ug.getParam().setStroke(new UStroke(1.5));
ug.getParam().setColor(getColor(ColorParam.activityBorder, getStereo()));
@@ -101,7 +103,7 @@ public class EntityImageActivity extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.ROUND_RECTANGLE;
}
-
+
public int getShield() {
return 0;
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageAssociation.java b/src/net/sourceforge/plantuml/svek/EntityImageAssociation.java
index aa5de424b..95b175fe8 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageAssociation.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageAssociation.java
@@ -65,7 +65,9 @@ public class EntityImageAssociation extends AbstractEntityImage {
// final double heightTotal = dimTotal.getHeight();
final UPolygon diams = new UPolygon();
- diams.setDeltaShadow(5);
+ if (getSkinParam().shadowing()) {
+ diams.setDeltaShadow(5);
+ }
diams.addPoint(SIZE, 0);
diams.addPoint(SIZE * 2, SIZE);
diams.addPoint(SIZE, SIZE * 2);
@@ -82,7 +84,7 @@ public class EntityImageAssociation extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.DIAMOND;
}
-
+
public int getShield() {
return 0;
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageBranch.java b/src/net/sourceforge/plantuml/svek/EntityImageBranch.java
index 709f546ff..74f562a18 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageBranch.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageBranch.java
@@ -65,7 +65,9 @@ public class EntityImageBranch extends AbstractEntityImage {
// final double heightTotal = dimTotal.getHeight();
final UPolygon diams = new UPolygon();
- diams.setDeltaShadow(5);
+ if (getSkinParam().shadowing()) {
+ diams.setDeltaShadow(5);
+ }
diams.addPoint(SIZE, 0);
diams.addPoint(SIZE * 2, SIZE);
diams.addPoint(SIZE, SIZE * 2);
@@ -82,7 +84,7 @@ public class EntityImageBranch extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.DIAMOND;
}
-
+
public int getShield() {
return 0;
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageCircleEnd.java b/src/net/sourceforge/plantuml/svek/EntityImageCircleEnd.java
index 7f540a6de..cd3d237e9 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageCircleEnd.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageCircleEnd.java
@@ -60,7 +60,9 @@ public class EntityImageCircleEnd extends AbstractEntityImage {
public void drawU(UGraphic ug, double xTheoricalPosition, double yTheoricalPosition) {
final UEllipse circle = new UEllipse(SIZE, SIZE);
- circle.setDeltaShadow(3);
+ if (getSkinParam().shadowing()) {
+ circle.setDeltaShadow(3);
+ }
ug.getParam().setStroke(new UStroke());
ug.getParam().setBackcolor(null);
ug.getParam().setColor(getColor(ColorParam.activityEnd, getStereo()));
@@ -78,10 +80,9 @@ public class EntityImageCircleEnd extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.CIRCLE;
}
-
+
public int getShield() {
return 0;
}
-
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageCircleStart.java b/src/net/sourceforge/plantuml/svek/EntityImageCircleStart.java
index 1a96e3157..abe3d7e62 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageCircleStart.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageCircleStart.java
@@ -58,7 +58,9 @@ public class EntityImageCircleStart extends AbstractEntityImage {
public void drawU(UGraphic ug, double xTheoricalPosition, double yTheoricalPosition) {
final UEllipse circle = new UEllipse(SIZE, SIZE);
- circle.setDeltaShadow(3);
+ if (getSkinParam().shadowing()) {
+ circle.setDeltaShadow(3);
+ }
ug.getParam().setColor(null);
ug.getParam().setBackcolor(getColor(ColorParam.activityStart, getStereo()));
ug.draw(xTheoricalPosition, yTheoricalPosition, circle);
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageClass.java b/src/net/sourceforge/plantuml/svek/EntityImageClass.java
index 7f984bd66..8690ae517 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageClass.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageClass.java
@@ -219,7 +219,9 @@ public class EntityImageClass extends AbstractEntityImage {
final double heightTotal = dimTotal.getHeight();
// final URectangle rect = new URectangle(widthTotal, heightTotal);
final Shadowable rect = new URectangle(widthTotal, heightTotal);
- rect.setDeltaShadow(4);
+ if (getSkinParam().shadowing()) {
+ rect.setDeltaShadow(4);
+ }
ug.getParam().setColor(getColor(ColorParam.classBorder, getStereo()));
ug.getParam().setBackcolor(getColor(ColorParam.classBackground, getStereo()));
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageEmptyPackage.java b/src/net/sourceforge/plantuml/svek/EntityImageEmptyPackage.java
index f3490e876..5654fb8e7 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageEmptyPackage.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageEmptyPackage.java
@@ -77,7 +77,9 @@ public class EntityImageEmptyPackage extends AbstractEntityImage {
final double widthTotal = dimTotal.getWidth();
final double heightTotal = dimTotal.getHeight();
final Shadowable form = new URectangle(widthTotal, heightTotal);
- form.setDeltaShadow(4);
+ if (getSkinParam().shadowing()) {
+ form.setDeltaShadow(4);
+ }
final UShape small = new URectangle(15, 5);
@@ -97,7 +99,7 @@ public class EntityImageEmptyPackage extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.RECTANGLE;
}
-
+
public int getShield() {
return 0;
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageLollipopInterface.java b/src/net/sourceforge/plantuml/svek/EntityImageLollipopInterface.java
index ebe810f41..fb67c3818 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageLollipopInterface.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageLollipopInterface.java
@@ -60,9 +60,8 @@ public class EntityImageLollipopInterface extends AbstractEntityImage {
public EntityImageLollipopInterface(IEntity entity, ISkinParam skinParam) {
super(entity, skinParam);
final Stereotype stereotype = entity.getStereotype();
- this.desc = TextBlockUtils.create(entity.getDisplay2(), new FontConfiguration(
- getFont(FontParam.CLASS, stereotype), getFontColor(FontParam.CLASS, stereotype)),
- HorizontalAlignement.CENTER);
+ this.desc = TextBlockUtils.create(entity.getDisplay2(), new FontConfiguration(getFont(FontParam.CLASS,
+ stereotype), getFontColor(FontParam.CLASS, stereotype)), HorizontalAlignement.CENTER);
}
@@ -73,7 +72,9 @@ public class EntityImageLollipopInterface extends AbstractEntityImage {
public void drawU(UGraphic ug, double xTheoricalPosition, double yTheoricalPosition) {
final UEllipse circle = new UEllipse(SIZE, SIZE);
- circle.setDeltaShadow(4);
+ if (getSkinParam().shadowing()) {
+ circle.setDeltaShadow(4);
+ }
ug.getParam().setStroke(new UStroke(1.5));
ug.getParam().setColor(getColor(ColorParam.classBorder, getStereo()));
ug.getParam().setBackcolor(getColor(ColorParam.classBackground, getStereo()));
@@ -92,10 +93,9 @@ public class EntityImageLollipopInterface extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.CIRCLE_IN_RECT;
}
-
+
public int getShield() {
return 0;
}
-
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageNote.java b/src/net/sourceforge/plantuml/svek/EntityImageNote.java
index 276f98378..84e1dcf3e 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageNote.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageNote.java
@@ -33,32 +33,69 @@
*/
package net.sourceforge.plantuml.svek;
+import java.awt.geom.CubicCurve2D;
import java.awt.geom.Dimension2D;
+import java.awt.geom.Line2D;
+import java.awt.geom.Point2D;
+import java.util.List;
import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.Direction;
+import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.MathUtils;
import net.sourceforge.plantuml.SkinParamBackcolored;
import net.sourceforge.plantuml.cucadiagram.IEntity;
import net.sourceforge.plantuml.cucadiagram.Stereotype;
+import net.sourceforge.plantuml.graph2.GeomUtils;
+import net.sourceforge.plantuml.graphic.FontConfiguration;
+import net.sourceforge.plantuml.graphic.HorizontalAlignement;
import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.StringBounder;
-import net.sourceforge.plantuml.skin.Component;
-import net.sourceforge.plantuml.skin.ComponentType;
-import net.sourceforge.plantuml.skin.SimpleContext2D;
+import net.sourceforge.plantuml.graphic.TextBlock;
+import net.sourceforge.plantuml.graphic.TextBlockEmpty;
+import net.sourceforge.plantuml.graphic.TextBlockUtils;
+import net.sourceforge.plantuml.posimo.DotPath;
import net.sourceforge.plantuml.skin.rose.Rose;
+import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.ULine;
+import net.sourceforge.plantuml.ugraphic.UPath;
+import net.sourceforge.plantuml.ugraphic.UPolygon;
+import net.sourceforge.plantuml.ugraphic.UShape;
public class EntityImageNote extends AbstractEntityImage {
- private final Component comp;
+ private final int cornersize = 10;
+ private final HtmlColor noteBackgroundColor;
+ private final HtmlColor borderColor;
+ private final int marginX1 = 6;
+ private final int marginX2 = 15;
+ private final int marginY = 5;
+ private final boolean withShadow;
+
+ private final TextBlock textBlock;
public EntityImageNote(IEntity entity, ISkinParam skinParam) {
super(entity, getSkin(skinParam, entity));
- final Rose skin = new Rose();
+ this.withShadow = skinParam.shadowing();
+ final List extends CharSequence> strings = entity.getDisplay2();
- comp = skin.createComponent(ComponentType.NOTE, getSkinParam(), entity.getDisplay2());
+ final Rose rose = new Rose();
+
+ noteBackgroundColor = rose.getHtmlColor(skinParam, ColorParam.noteBackground);
+ borderColor = rose.getHtmlColor(skinParam, ColorParam.noteBorder);
+ final HtmlColor fontColor = rose.getFontColor(skinParam, FontParam.NOTE);
+ final UFont fontNote = skinParam.getFont(FontParam.NOTE, null);
+
+ if (strings.size() == 1 && strings.get(0).length() == 0) {
+ textBlock = new TextBlockEmpty();
+ } else {
+ textBlock = TextBlockUtils.create(strings, new FontConfiguration(fontNote, fontColor),
+ HorizontalAlignement.LEFT);
+ }
}
@@ -81,10 +118,49 @@ public class EntityImageNote extends AbstractEntityImage {
return rose.getHtmlColor(skinParam, colorParam, s);
}
+ final public double getPreferredWidth(StringBounder stringBounder) {
+ final double result = getTextWidth(stringBounder);
+ return result;
+ }
+
+ final public double getPreferredHeight(StringBounder stringBounder) {
+ return getTextHeight(stringBounder);
+ }
+
+ // For cache
+ private Dimension2D size;
+
+ private Dimension2D getSize(StringBounder stringBounder, final TextBlock textBlock) {
+ if (size == null) {
+ size = textBlock.calculateDimension(stringBounder);
+ }
+ return size;
+ }
+
+ final protected double getTextHeight(StringBounder stringBounder) {
+ final TextBlock textBlock = getTextBlock();
+ final Dimension2D size = getSize(stringBounder, textBlock);
+ return size.getHeight() + 2 * marginY;
+ }
+
+ final protected TextBlock getTextBlock() {
+ return textBlock;
+ }
+
+ final protected double getPureTextWidth(StringBounder stringBounder) {
+ final TextBlock textBlock = getTextBlock();
+ final Dimension2D size = getSize(stringBounder, textBlock);
+ return size.getWidth();
+ }
+
+ final public double getTextWidth(StringBounder stringBounder) {
+ return getPureTextWidth(stringBounder) + marginX1 + marginX2;
+ }
+
@Override
public Dimension2D getDimension(StringBounder stringBounder) {
- final double height = comp.getPreferredHeight(stringBounder);
- final double width = comp.getPreferredWidth(stringBounder);
+ final double height = getPreferredHeight(stringBounder);
+ final double width = getPreferredWidth(stringBounder);
return new Dimension2DDouble(width, height);
}
@@ -92,18 +168,243 @@ public class EntityImageNote extends AbstractEntityImage {
final double dx = ug.getTranslateX();
final double dy = ug.getTranslateY();
ug.translate(xTheoricalPosition, yTheoricalPosition);
- comp.drawU(ug, getDimension(ug.getStringBounder()), new SimpleContext2D(false, true));
+ if (opaleLine == null || opaleLine.isOpale() == false) {
+ drawNormal(ug, xTheoricalPosition, yTheoricalPosition);
+ } else {
+ final StringBounder stringBounder = ug.getStringBounder();
+ DotPath path = opaleLine.getDotPath();
+ path.moveSvek(-shape.getMinX(), -shape.getMinY());
+ Point2D p1 = path.getStartPoint();
+ Point2D p2 = path.getEndPoint();
+ final double textWidth = getTextWidth(stringBounder);
+ final double textHeight = getTextHeight(stringBounder);
+ final Point2D center = new Point2D.Double(textWidth / 2, textHeight / 2);
+ if (p1.distance(center) > p2.distance(center)) {
+ path = path.reverse();
+ p1 = path.getStartPoint();
+ p2 = path.getEndPoint();
+ }
+ final Direction strategy = getOpaleStrategy(textWidth, textHeight, p1);
+ drawOpale(ug, xTheoricalPosition, yTheoricalPosition, path, strategy);
+ }
ug.setTranslate(dx, dy);
+ }
+
+ // private Point2D translateShape(Point2D pt) {
+ // return new Point2D.Double(pt.getX() - shape.getMinX(), pt.getY() -
+ // shape.getMinY());
+ // }
+
+ private void drawOpale(UGraphic ug, double xTheoricalPosition, double yTheoricalPosition, DotPath path,
+ Direction strategy) {
+ final StringBounder stringBounder = ug.getStringBounder();
+
+ final UPolygon polygon = getPolygonNormal(stringBounder);
+ if (withShadow) {
+ polygon.setDeltaShadow(4);
+ }
+ ug.getParam().setColor(borderColor);
+ ug.getParam().setBackcolor(noteBackgroundColor);
+ ug.draw(0, 0, polygon);
+
+ final Point2D pp1 = path.getStartPoint();
+ final Point2D pp2 = path.getEndPoint();
+
+ final UShape polygonOpale;
+ if (strategy == Direction.LEFT) {
+ polygonOpale = getPolygonLeft(stringBounder, pp1, pp2, path);
+ } else if (strategy == Direction.RIGHT) {
+ polygonOpale = getPolygonRight(stringBounder, pp1, pp2, path);
+ } else if (strategy == Direction.UP) {
+ polygonOpale = getPolygonUp(stringBounder, pp1, pp2, path);
+ } else if (strategy == Direction.DOWN) {
+ polygonOpale = getPolygonDown(stringBounder, pp1, pp2, path);
+ } else {
+ throw new IllegalArgumentException();
+ }
+
+ ug.getParam().setColor(borderColor);
+ ug.getParam().setBackcolor(noteBackgroundColor);
+ ug.draw(0, 0, polygonOpale);
+
+ ug.draw(getTextWidth(stringBounder) - cornersize, 0, new ULine(0, cornersize));
+ ug.draw(getTextWidth(stringBounder), cornersize, new ULine(-cornersize, 0));
+ getTextBlock().drawU(ug, marginX1, marginY);
+ }
+
+ private void drawNormal(UGraphic ug, double xTheoricalPosition, double yTheoricalPosition) {
+ final StringBounder stringBounder = ug.getStringBounder();
+ final UPolygon polygon = getPolygonNormal(stringBounder);
+ if (withShadow) {
+ polygon.setDeltaShadow(4);
+ }
+ ug.getParam().setColor(borderColor);
+ ug.getParam().setBackcolor(noteBackgroundColor);
+ ug.draw(0, 0, polygon);
+
+ ug.draw(getTextWidth(stringBounder) - cornersize, 0, new ULine(0, cornersize));
+ ug.draw(getTextWidth(stringBounder), cornersize, new ULine(-cornersize, 0));
+ getTextBlock().drawU(ug, marginX1, marginY);
+
+ // if (opaleLine != null) {
+ // ug.getParam().setColor(borderColor);
+ // ug.getParam().setBackcolor(noteBackgroundColor);
+ //
+ // final DotPath path = opaleLine.getDotPath();
+ // final Point2D p1 = path.getStartPoint();
+ // final Point2D p2 = path.getEndPoint();
+ // ug.draw(p1.getX() - shape.getMinX(), p1.getY() - shape.getMinY(), new
+ // UEllipse(2, 2));
+ // ug.draw(p2.getX() - shape.getMinX(), p2.getY() - shape.getMinY(), new
+ // UEllipse(2, 2));
+ // }
+ }
+
+ private UPolygon getPolygonNormal(final StringBounder stringBounder) {
+ final UPolygon polygon = new UPolygon();
+ polygon.addPoint(0, 0);
+ polygon.addPoint(0, getTextHeight(stringBounder));
+ polygon.addPoint(getTextWidth(stringBounder), getTextHeight(stringBounder));
+ polygon.addPoint(getTextWidth(stringBounder), cornersize);
+ polygon.addPoint(getTextWidth(stringBounder) - cornersize, 0);
+ polygon.addPoint(0, 0);
+ return polygon;
+ }
+
+ private final double delta = 4;
+
+ private UShape getPolygonLeft(final StringBounder stringBounder, final Point2D pp1, final Point2D pp2, DotPath path) {
+ final UPath polygon = new UPath();
+ polygon.moveTo(0, 0);
+
+ double y1 = pp1.getY() - delta;
+ y1 = MathUtils.limitation(y1, 0, getTextHeight(stringBounder) - 2 * delta);
+ polygon.lineTo(0, y1);
+ polygon.lineTo(pp2.getX(), pp2.getY());
+ polygon.lineTo(0, y1 + 2 * delta);
+
+ // final DotPath path1 = new DotPath(path);
+ // path1.moveSvek(0, -delta);
+ // path1.forceStartPoint(0, pp1.getY() - delta);
+ // path1.forceEndPoint(pp2.getX(), pp2.getY());
+ // appendPath(polygon, path1);
+ //
+ // final DotPath path2 = new DotPath(path);
+ // path2.reverse();
+ // path2.moveSvek(0, delta);
+ // path2.forceStartPoint(pp2.getX(), pp2.getY());
+ // path2.forceEndPoint(0, pp1.getY() + delta);
+ // appendPath(polygon, path2);
+
+ polygon.lineTo(0, getTextHeight(stringBounder));
+ polygon.lineTo(getTextWidth(stringBounder), getTextHeight(stringBounder));
+ polygon.lineTo(getTextWidth(stringBounder), cornersize);
+ polygon.lineTo(getTextWidth(stringBounder) - cornersize, 0);
+ polygon.lineTo(0, 0);
+ return polygon;
+ }
+
+ private void appendPath(UPath polygon, DotPath path) {
+ boolean start = true;
+ for (CubicCurve2D.Double bez : path.getBeziers()) {
+ if (start) {
+ polygon.lineTo(bez.x1, bez.y1);
+ start = false;
+ }
+ polygon.cubicTo(bez.ctrlx1, bez.ctrly1, bez.ctrlx2, bez.ctrly2, bez.x2, bez.y2);
+ }
+ }
+
+ private UShape getPolygonRight(final StringBounder stringBounder, final Point2D pp1, final Point2D pp2, DotPath path) {
+ final UPath polygon = new UPath();
+ polygon.moveTo(0, 0);
+ polygon.lineTo(0, getTextHeight(stringBounder));
+ polygon.lineTo(getTextWidth(stringBounder), getTextHeight(stringBounder));
+
+ double y1 = pp1.getY() - delta;
+ y1 = MathUtils.limitation(y1, cornersize, getTextHeight(stringBounder) - 2 * delta);
+ polygon.lineTo(getTextWidth(stringBounder), y1 + 2 * delta);
+ polygon.lineTo(pp2.getX(), pp2.getY());
+ polygon.lineTo(getTextWidth(stringBounder), y1);
+
+ polygon.lineTo(getTextWidth(stringBounder), cornersize);
+ polygon.lineTo(getTextWidth(stringBounder) - cornersize, 0);
+ polygon.lineTo(0, 0);
+ return polygon;
+ }
+
+ private UShape getPolygonUp(final StringBounder stringBounder, final Point2D pp1, final Point2D pp2, DotPath path) {
+ final UPath polygon = new UPath();
+ polygon.moveTo(0, 0);
+ polygon.lineTo(0, getTextHeight(stringBounder));
+ polygon.lineTo(getTextWidth(stringBounder), getTextHeight(stringBounder));
+ polygon.lineTo(getTextWidth(stringBounder), cornersize);
+ polygon.lineTo(getTextWidth(stringBounder) - cornersize, 0);
+
+ double x1 = pp1.getX() - delta;
+ x1 = MathUtils.limitation(x1, 0, getTextWidth(stringBounder) - cornersize);
+ polygon.lineTo(x1 + 2 * delta, 0);
+ polygon.lineTo(pp2.getX(), pp2.getY());
+
+ polygon.lineTo(x1, 0);
+ polygon.lineTo(0, 0);
+ return polygon;
+ }
+
+ private UShape getPolygonDown(final StringBounder stringBounder, final Point2D pp1, final Point2D pp2, DotPath path) {
+ final UPath polygon = new UPath();
+ polygon.moveTo(0, 0);
+ polygon.lineTo(0, getTextHeight(stringBounder));
+
+ double x1 = pp1.getX() - delta;
+ x1 = MathUtils.limitation(x1, 0, getTextWidth(stringBounder));
+ polygon.lineTo(x1, getTextHeight(stringBounder));
+ polygon.lineTo(pp2.getX(), pp2.getY());
+ polygon.lineTo(x1 + 2 * delta, getTextHeight(stringBounder));
+
+ polygon.lineTo(getTextWidth(stringBounder), getTextHeight(stringBounder));
+ polygon.lineTo(getTextWidth(stringBounder), cornersize);
+ polygon.lineTo(getTextWidth(stringBounder) - cornersize, 0);
+ polygon.lineTo(0, 0);
+ return polygon;
+ }
+
+ private Direction getOpaleStrategy(double width, double height, Point2D pt) {
+ final double d1 = GeomUtils.getOrthoDistance(new Line2D.Double(width, 0, width, height), pt);
+ final double d2 = GeomUtils.getOrthoDistance(new Line2D.Double(0, height, width, height), pt);
+ final double d3 = GeomUtils.getOrthoDistance(new Line2D.Double(0, 0, 0, height), pt);
+ final double d4 = GeomUtils.getOrthoDistance(new Line2D.Double(0, 0, width, 0), pt);
+ if (d3 <= d1 && d3 <= d2 && d3 <= d4) {
+ return Direction.LEFT;
+ }
+ if (d1 <= d2 && d1 <= d3 && d1 <= d4) {
+ return Direction.RIGHT;
+ }
+ if (d4 <= d1 && d4 <= d2 && d4 <= d3) {
+ return Direction.UP;
+ }
+ if (d2 <= d1 && d2 <= d3 && d2 <= d4) {
+ return Direction.DOWN;
+ }
+ return null;
}
public ShapeType getShapeType() {
return ShapeType.RECTANGLE;
}
-
+
public int getShield() {
return 0;
}
+ private Line opaleLine;
+ private Shape shape;
+
+ public void setOpaleLine(Line line, Shape shape) {
+ this.opaleLine = line;
+ this.shape = shape;
+
+ }
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageObject.java b/src/net/sourceforge/plantuml/svek/EntityImageObject.java
index 461a36f13..ecb02f5ae 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageObject.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageObject.java
@@ -126,7 +126,9 @@ public class EntityImageObject extends AbstractEntityImage {
final double widthTotal = dimTotal.getWidth();
final double heightTotal = dimTotal.getHeight();
final Shadowable rect = new URectangle(widthTotal, heightTotal);
- rect.setDeltaShadow(4);
+ if (getSkinParam().shadowing()) {
+ rect.setDeltaShadow(4);
+ }
ug.getParam().setColor(getColor(ColorParam.objectBorder, getStereo()));
ug.getParam().setBackcolor(getColor(ColorParam.objectBackground, getStereo()));
@@ -158,10 +160,9 @@ public class EntityImageObject extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.RECTANGLE;
}
-
+
public int getShield() {
return 0;
}
-
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageState.java b/src/net/sourceforge/plantuml/svek/EntityImageState.java
index 8aee739b6..5b8453965 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageState.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageState.java
@@ -100,7 +100,9 @@ public class EntityImageState extends AbstractEntityImage {
final double widthTotal = dimTotal.getWidth();
final double heightTotal = dimTotal.getHeight();
final Shadowable rect = new URectangle(widthTotal, heightTotal, CORNER, CORNER);
- rect.setDeltaShadow(4);
+ if (getSkinParam().shadowing()) {
+ rect.setDeltaShadow(4);
+ }
ug.getParam().setStroke(new UStroke(1.5));
ug.getParam().setColor(getColor(ColorParam.stateBorder, getStereo()));
@@ -130,7 +132,7 @@ public class EntityImageState extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.ROUND_RECTANGLE;
}
-
+
public int getShield() {
return 0;
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageSynchroBar.java b/src/net/sourceforge/plantuml/svek/EntityImageSynchroBar.java
index 9ddefb36b..347f96226 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageSynchroBar.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageSynchroBar.java
@@ -58,7 +58,9 @@ public class EntityImageSynchroBar extends AbstractEntityImage {
public void drawU(UGraphic ug, double xTheoricalPosition, double yTheoricalPosition) {
final Dimension2D dim = getDimension(ug.getStringBounder());
final Shadowable rect = new URectangle(dim.getWidth(), dim.getHeight());
- rect.setDeltaShadow(4);
+ if (getSkinParam().shadowing()) {
+ rect.setDeltaShadow(4);
+ }
ug.getParam().setColor(null);
ug.getParam().setBackcolor(getColor(ColorParam.activityBar, getStereo()));
ug.draw(xTheoricalPosition, yTheoricalPosition, rect);
@@ -67,10 +69,9 @@ public class EntityImageSynchroBar extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.RECTANGLE;
}
-
+
public int getShield() {
return 0;
}
-
}
diff --git a/src/net/sourceforge/plantuml/svek/EntityImageUseCase.java b/src/net/sourceforge/plantuml/svek/EntityImageUseCase.java
index bed7f2cbd..395e641e4 100644
--- a/src/net/sourceforge/plantuml/svek/EntityImageUseCase.java
+++ b/src/net/sourceforge/plantuml/svek/EntityImageUseCase.java
@@ -97,7 +97,9 @@ public class EntityImageUseCase extends AbstractEntityImage {
final double widthTotal = dimTotal.getWidth();
final double heightTotal = dimTotal.getHeight();
final UEllipse ellipse = new UEllipse(widthTotal, heightTotal);
- ellipse.setDeltaShadow(3);
+ if (getSkinParam().shadowing()) {
+ ellipse.setDeltaShadow(3);
+ }
ug.getParam().setStroke(new UStroke(1.5));
ug.getParam().setColor(getColor(ColorParam.usecaseBorder, getStereo()));
@@ -119,7 +121,7 @@ public class EntityImageUseCase extends AbstractEntityImage {
public ShapeType getShapeType() {
return ShapeType.OVAL;
}
-
+
public int getShield() {
return 0;
}
diff --git a/src/net/sourceforge/plantuml/svek/Line.java b/src/net/sourceforge/plantuml/svek/Line.java
index 2bd15f9f1..f591ff07b 100644
--- a/src/net/sourceforge/plantuml/svek/Line.java
+++ b/src/net/sourceforge/plantuml/svek/Line.java
@@ -41,6 +41,8 @@ import java.util.List;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.command.Position;
+import net.sourceforge.plantuml.cucadiagram.EntityType;
+import net.sourceforge.plantuml.cucadiagram.IEntity;
import net.sourceforge.plantuml.cucadiagram.Link;
import net.sourceforge.plantuml.cucadiagram.LinkDecor;
import net.sourceforge.plantuml.graphic.FontConfiguration;
@@ -52,17 +54,19 @@ import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.UDrawable3;
import net.sourceforge.plantuml.posimo.BezierUtils;
import net.sourceforge.plantuml.posimo.DotPath;
+import net.sourceforge.plantuml.posimo.Moveable;
import net.sourceforge.plantuml.posimo.Positionable;
import net.sourceforge.plantuml.posimo.PositionableUtils;
import net.sourceforge.plantuml.svek.SvekUtils.PointListIterator;
import net.sourceforge.plantuml.ugraphic.UEllipse;
import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.UGraphicUtils;
import net.sourceforge.plantuml.ugraphic.ULine;
import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.UShape;
import net.sourceforge.plantuml.ugraphic.UStroke;
-public class Line {
+public class Line implements Moveable {
private final String ltail;
private final String lhead;
@@ -319,6 +323,13 @@ public class Line {
this.endHeadColor, fullHeight));
}
+ if (isOpalisable() == false) {
+ setOpale(false);
+ }
+ }
+
+ private boolean isOpalisable() {
+ return dotPath.getBeziers().size() <= 1;
}
private Point2D.Double getXY(String svg, int color, int height) {
@@ -330,13 +341,77 @@ public class Line {
}
+// public void patchLineForCluster(List clusters) {
+// if (clusters != null) {
+// return;
+// }
+// if (link.getEntity1().getType() == EntityType.GROUP) {
+// final IEntity ent = link.getEntity1();
+// for (Cluster cl : clusters) {
+// if (cl.isClusterOf(ent) == false) {
+// continue;
+// }
+// final UPolygon frontier = cl.getSpecificFrontier();
+// if (frontier == null) {
+// continue;
+// }
+// final double frontierY = frontier.getPoints().get(0).getY();
+// final double frontierX = frontier.getPoints().get(2).getX();
+// final Point2D pt = dotPath.getStartPoint();
+// if (pt.getY() < frontierY) {
+// System.err.println("frontier = " + frontier);
+// System.err.println("p1 = " + pt);
+// final double deltaY = frontierY - pt.getY();
+// dotPath.forceStartPoint(pt.getX(), frontierY);
+// if (endHead != null) {
+// endHead = UGraphicUtils.translate(endHead, 0, deltaY);
+// }
+// }
+// }
+// }
+//
+// if (link.getEntity2().getType() == EntityType.GROUP) {
+// final IEntity ent = link.getEntity2();
+// for (Cluster cl : clusters) {
+// if (cl.isClusterOf(ent) == false) {
+// continue;
+// }
+// final UPolygon frontier = cl.getSpecificFrontier();
+// if (frontier == null) {
+// continue;
+// }
+// final double frontierY = frontier.getPoints().get(0).getY();
+// final double frontierX = frontier.getPoints().get(2).getX();
+// final Point2D pt = dotPath.getEndPoint();
+// if (pt.getY() < frontierY) {
+// System.err.println("frontier = " + frontier);
+// System.err.println("p2 = " + pt);
+// dotPath.forceEndPoint(pt.getX(), frontierY);
+// final double deltaY = frontierY - pt.getY();
+// if (startTail != null) {
+// startTail = UGraphicUtils.translate(startTail, 0, deltaY);
+// }
+//
+// }
+// }
+// }
+//
+// }
+
public void drawU(UGraphic ug, double x, double y, HtmlColor color) {
+ if (opale) {
+ return;
+ }
+ x += dx;
+ y += dy;
+
if (link.isInvis()) {
return;
}
if (this.link.getSpecificColor() != null) {
color = this.link.getSpecificColor();
}
+
ug.getParam().setColor(color);
ug.getParam().setBackcolor(null);
ug.getParam().setStroke(link.getType().getStroke());
@@ -433,35 +508,6 @@ public class Line {
return strategy.getResult() + getDecorDzeta();
}
- // private Positionable getStartTailPositionnable() {
- // if (startTailText == null) {
- // return null;
- // }
- // return new Positionable() {
- // public Point2D getPosition() {
- // return startTailLabelXY.;
- // }
- //
- // public Dimension2D getSize() {
- // return startTailText.calculateDimension(stringBounder);
- // }
- // };
- // }
- //
- // private Positionable getEndHeadPositionnable() {
- // if (endHeadText == null) {
- // return null;
- // }
- // return new Positionable() {
- // public Point2D getPosition() {
- // return endHeadLabelXY;
- // }
- //
- // public Dimension2D getSize() {
- // return endHeadText.calculateDimension(stringBounder);
- // }
- // };
- // }
public void manageCollision(List allShapes) {
@@ -569,4 +615,48 @@ public class Line {
}
+ private double dx;
+ private double dy;
+
+ public void moveSvek(double deltaX, double deltaY) {
+ this.dx += deltaX;
+ this.dy += deltaY;
+ }
+
+ public final DotPath getDotPath() {
+ final DotPath result = new DotPath(dotPath);
+ result.moveSvek(dx, dy);
+ return result;
+ }
+
+ public int getLength() {
+ return link.getLength();
+ }
+
+ private boolean opale;
+
+ public void setOpale(boolean opale) {
+ this.link.setOpale(opale);
+ this.opale = opale;
+
+ }
+
+ public boolean isOpale() {
+ return opale;
+ }
+
+ // public void moveSvek(double deltaX, double deltaY) {
+ // if (startTailLabelXY != null) {
+ // startTailLabelXY.moveSvek(deltaX, deltaY);
+ // }
+ // if (endHeadLabelXY != null) {
+ // endHeadLabelXY.moveSvek(deltaX, deltaY);
+ // }
+ // if (noteLabelXY != null) {
+ // noteLabelXY.moveSvek(deltaX, deltaY);
+ // }
+ // dotPath.moveSvek(deltaX, deltaY);
+ //
+ // }
+
}
diff --git a/src/net/sourceforge/plantuml/svek/Shape.java b/src/net/sourceforge/plantuml/svek/Shape.java
index 0e0b9d8b4..a3b4718fa 100644
--- a/src/net/sourceforge/plantuml/svek/Shape.java
+++ b/src/net/sourceforge/plantuml/svek/Shape.java
@@ -38,6 +38,9 @@ import java.awt.geom.Point2D;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.StringUtils;
+import net.sourceforge.plantuml.cucadiagram.EntityType;
+import net.sourceforge.plantuml.cucadiagram.IEntity;
+import net.sourceforge.plantuml.cucadiagram.dot.DotData;
import net.sourceforge.plantuml.posimo.Positionable;
public class Shape implements Positionable {
@@ -65,7 +68,8 @@ public class Shape implements Positionable {
this.cluster = cluster;
}
- public Shape(ShapeType type, double width, double height, ColorSequence colorSequence, boolean top, int shield) {
+ public Shape(IEntityImage image, ShapeType type, double width, double height, ColorSequence colorSequence, boolean top, int shield) {
+ this.image = image;
this.top = top;
this.type = type;
this.width = width;
@@ -199,9 +203,9 @@ public class Shape implements Positionable {
}
public final void setMinX(double minX) {
- if (minX < 0) {
- minX = 0;
- }
+ // if (minX < 0) {
+ // minX = 0;
+ // }
this.minX = minX;
}
@@ -216,11 +220,7 @@ public class Shape implements Positionable {
this.minY = minY;
}
- private IEntityImage image;
-
- public void setImage(IEntityImage image) {
- this.image = image;
- }
+ private final IEntityImage image;
public IEntityImage getImage() {
return image;
@@ -278,4 +278,79 @@ public class Shape implements Positionable {
return "" + x1 + "," + y1 + "," + x2 + "," + y2;
}
+ public void moveSvek(double deltaX, double deltaY) {
+ this.minX += deltaX;
+ this.minY += deltaY;
+ }
+
+
+ public static IEntityImage printEntity(IEntity ent, DotData dotData) {
+
+ final IEntityImage image;
+ if (ent.getSvekImage() == null) {
+ image = createEntityImageBlock(dotData, ent);
+ } else {
+ image = ent.getSvekImage();
+ }
+ return image;
+ }
+
+ private static IEntityImage createEntityImageBlock(DotData dotData, IEntity ent) {
+ if (ent.getType() == EntityType.CLASS || ent.getType() == EntityType.ABSTRACT_CLASS
+ || ent.getType() == EntityType.INTERFACE || ent.getType() == EntityType.ENUM) {
+ return new EntityImageClass(ent, dotData.getSkinParam(), dotData);
+ }
+ if (ent.getType() == EntityType.NOTE) {
+ return new EntityImageNote(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.ACTIVITY) {
+ return new EntityImageActivity(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.STATE) {
+ return new EntityImageState(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.CIRCLE_START) {
+ return new EntityImageCircleStart(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.CIRCLE_END) {
+ return new EntityImageCircleEnd(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.USECASE) {
+ return new EntityImageUseCase(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.BRANCH) {
+ return new EntityImageBranch(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.LOLLIPOP) {
+ return new EntityImageLollipopInterface(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.ACTOR) {
+ return new EntityImageActor(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.COMPONENT) {
+ return new EntityImageComponent(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.OBJECT) {
+ return new EntityImageObject(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.SYNCHRO_BAR) {
+ return new EntityImageSynchroBar(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.CIRCLE_INTERFACE) {
+ return new EntityImageCircleInterface(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.POINT_FOR_ASSOCIATION) {
+ return new EntityImageAssociationPoint(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.GROUP) {
+ return new EntityImageGroup(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.EMPTY_PACKAGE) {
+ return new EntityImageEmptyPackage(ent, dotData.getSkinParam());
+ }
+ if (ent.getType() == EntityType.ASSOCIATION) {
+ return new EntityImageAssociation(ent, dotData.getSkinParam());
+ }
+ throw new UnsupportedOperationException(ent.getType().toString());
+ }
}
diff --git a/src/net/sourceforge/plantuml/svek/SvekResult.java b/src/net/sourceforge/plantuml/svek/SvekResult.java
index ee752701e..4220ee2f3 100644
--- a/src/net/sourceforge/plantuml/svek/SvekResult.java
+++ b/src/net/sourceforge/plantuml/svek/SvekResult.java
@@ -36,19 +36,21 @@ package net.sourceforge.plantuml.svek;
import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ColorParam;
+import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.UmlDiagramType;
import net.sourceforge.plantuml.cucadiagram.dot.DotData;
import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.StringBounder;
+import net.sourceforge.plantuml.posimo.Moveable;
import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.ugraphic.UGraphic;
-public final class SvekResult implements IEntityImage {
+public final class SvekResult implements IEntityImage, Moveable {
private final Rose rose = new Rose();
private final HtmlColor clusterBorder;
- private final Dimension2D dim;
+ private Dimension2D dim;
private final DotData dotData;
private final DotStringFactory dotStringFactory;
@@ -63,7 +65,7 @@ public final class SvekResult implements IEntityImage {
for (Cluster cluster : dotStringFactory.getAllSubCluster()) {
cluster.drawU(ug, x, y, clusterBorder, dotData);
}
-
+
for (Shape shape : dotStringFactory.getShapes()) {
final double minX = shape.getMinX();
final double minY = shape.getMinY();
@@ -71,6 +73,7 @@ public final class SvekResult implements IEntityImage {
}
for (Line line : dotStringFactory.getLines()) {
+ // line.patchLineForCluster(dotStringFactory.getAllSubCluster());
final HtmlColor color = rose.getHtmlColor(dotData.getSkinParam(), getArrowColorParam(), null);
line.drawU(ug, x, y, color);
}
@@ -105,10 +108,14 @@ public final class SvekResult implements IEntityImage {
public ShapeType getShapeType() {
return ShapeType.RECTANGLE;
}
-
+
public int getShield() {
return 0;
}
+ public void moveSvek(double deltaX, double deltaY) {
+ dotStringFactory.moveSvek(deltaX, deltaY);
+ dim = Dimension2DDouble.delta(dim, deltaX > 0 ? deltaX : 0, deltaY > 0 ? deltaY : 0);
+ }
}
diff --git a/src/net/sourceforge/plantuml/svg/SvgGraphics.java b/src/net/sourceforge/plantuml/svg/SvgGraphics.java
index 3b6115cb1..b54f213e8 100644
--- a/src/net/sourceforge/plantuml/svg/SvgGraphics.java
+++ b/src/net/sourceforge/plantuml/svg/SvgGraphics.java
@@ -28,11 +28,12 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 6910 $
+ * Revision $Revision: 7216 $
*
*/
package net.sourceforge.plantuml.svg;
+import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -52,7 +53,9 @@ import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import net.sourceforge.plantuml.Log;
+import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.eps.EpsGraphics;
+import net.sourceforge.plantuml.ugraphic.ShadowManager;
import net.sourceforge.plantuml.ugraphic.UPath;
import net.sourceforge.plantuml.ugraphic.USegment;
import net.sourceforge.plantuml.ugraphic.USegmentType;
@@ -393,15 +396,15 @@ public class SvgGraphics {
final USegmentType type = seg.getSegmentType();
final double coord[] = seg.getCoord();
if (type == USegmentType.SEG_MOVETO) {
- sb.append("M" + (coord[0] + x) + "," + (coord[1] + y) + " ");
+ sb.append("M" + format(coord[0] + x) + "," + format(coord[1] + y) + " ");
} else if (type == USegmentType.SEG_LINETO) {
- sb.append("L" + (coord[0] + x) + "," + (coord[1] + y) + " ");
+ sb.append("L" + format(coord[0] + x) + "," + format(coord[1] + y) + " ");
} else if (type == USegmentType.SEG_QUADTO) {
- sb.append("Q" + (coord[0] + x) + "," + (coord[1] + y) + " " + (coord[2] + x) + "," + (coord[3] + y)
+ sb.append("Q" + format(coord[0] + x) + "," + format(coord[1] + y) + " " + format(coord[2] + x) + "," + format(coord[3] + y)
+ " ");
} else if (type == USegmentType.SEG_CUBICTO) {
- sb.append("C" + (coord[0] + x) + "," + (coord[1] + y) + " " + (coord[2] + x) + "," + (coord[3] + y)
- + " " + (coord[4] + x) + "," + (coord[5] + y) + " ");
+ sb.append("C" + format(coord[0] + x) + "," + format(coord[1] + y) + " " + format(coord[2] + x) + "," + format(coord[3] + y)
+ + " " + format(coord[4] + x) + "," + format(coord[5] + y) + " ");
} else if (type == USegmentType.SEG_CLOSE) {
// Nothing
} else {
@@ -467,4 +470,38 @@ public class SvgGraphics {
}
+ // Shadow
+ final private ShadowManager shadowManager = new ShadowManager(80, 200);
+
+ public void svgRectangleShadow(double x, double y, double width, double height, double rx, double ry,
+ double deltaShadow) {
+
+ setStrokeColor(null);
+ for (double i = 0; i <= deltaShadow; i += 0.5) {
+ setFillColor(StringUtils.getAsHtml(shadowManager.getColor(i, deltaShadow)));
+ final double diff = i;
+ svgRectangle(x + deltaShadow + diff, y + deltaShadow + diff, width - 2 * diff, height - 2 * diff, rx + 1,
+ ry + 1);
+ }
+ }
+
+ public void svgPolygonShadow(double deltaShadow, double... points) {
+ setStrokeColor(null);
+ for (double i = 0; i <= deltaShadow; i += 0.5) {
+ setFillColor(StringUtils.getAsHtml(shadowManager.getColor(i, deltaShadow)));
+ final double diff = i;
+ svgPolygon(shadowManager.getShadowDeltaPoints(deltaShadow, diff, points));
+ }
+ }
+
+ public void svgEllipseShadow(double x, double y, double xRadius, double yRadius, double deltaShadow) {
+ setStrokeColor(null);
+ for (double i = 0; i <= deltaShadow; i += 0.5) {
+ setFillColor(StringUtils.getAsHtml(shadowManager.getColor(i, deltaShadow)));
+ final double diff = i;
+ svgEllipse(x + deltaShadow, y + deltaShadow, xRadius - diff, yRadius - diff);
+ }
+ }
+
+
}
diff --git a/src/net/sourceforge/plantuml/ugraphic/ShadowManager.java b/src/net/sourceforge/plantuml/ugraphic/ShadowManager.java
new file mode 100644
index 000000000..d7b74cd89
--- /dev/null
+++ b/src/net/sourceforge/plantuml/ugraphic/ShadowManager.java
@@ -0,0 +1,77 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009, Arnaud Roques
+ *
+ * Project Info: http://plantuml.sourceforge.net
+ *
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
+ * in the United States and other countries.]
+ *
+ * Original Author: Arnaud Roques
+ *
+ * Revision $Revision: 6590 $
+ *
+ */
+package net.sourceforge.plantuml.ugraphic;
+
+import java.awt.Color;
+
+public class ShadowManager {
+
+ // http://www.w3schools.com/svg/svg_feoffset.asp
+
+ private final int c1;
+ private final int c2;
+
+ public ShadowManager(int c1, int c2) {
+ this.c1 = c1;
+ this.c2 = c2;
+ }
+
+ public double[] getShadowDeltaPoints(double deltaShadow, double diff, double[] points) {
+ double cx = 0;
+ double cy = 0;
+ for (int i = 0; i < points.length; i += 2) {
+ cx += points[i];
+ cy += points[i + 1];
+ }
+ final int nbPoints = points.length / 2;
+
+ cx = cx / nbPoints;
+ cy = cy / nbPoints;
+
+ final double[] result = new double[points.length];
+ for (int i = 0; i < result.length; i += 2) {
+ final double diffx = points[i] > cx ? -diff : diff;
+ final double diffy = points[i + 1] > cy ? -diff : diff;
+ result[i] = points[i] + diffx + deltaShadow;
+ result[i + 1] = points[i + 1] + diffy + deltaShadow;
+ }
+ return result;
+ }
+
+ public Color getColor(double delta, double total) {
+ final int c = (int) (c2 + 1.0 * delta / total * (c1 - c2));
+ return new Color(c, c, c);
+ }
+
+}
diff --git a/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java b/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java
index 3754b74f3..26e18ea3a 100644
--- a/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java
+++ b/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java
@@ -34,9 +34,20 @@
package net.sourceforge.plantuml.ugraphic;
import net.sourceforge.plantuml.graphic.StringBounder;
+import net.sourceforge.plantuml.graphic.UDrawable3;
public abstract class UGraphicUtils {
+ public static UDrawable3 translate(final UDrawable3 d, final double dx, final double dy) {
+ return new UDrawable3() {
+ @Override
+ public void drawU(UGraphic ug, double x, double y) {
+ d.drawU(ug, x + dx, y + dy);
+ }
+ };
+
+ }
+
public static UGraphic translate(final UGraphic g, final double tx, final double ty) {
return new UGraphic() {
diff --git a/src/net/sourceforge/plantuml/ugraphic/UPath.java b/src/net/sourceforge/plantuml/ugraphic/UPath.java
index 0107b573d..af2ce8d84 100644
--- a/src/net/sourceforge/plantuml/ugraphic/UPath.java
+++ b/src/net/sourceforge/plantuml/ugraphic/UPath.java
@@ -45,6 +45,18 @@ public class UPath implements UShape, Iterable {
segments.add(new USegment(coord, pathType));
}
+ public void moveTo(double x, double y) {
+ add(new double[] { x, y }, USegmentType.SEG_MOVETO);
+ }
+
+ public void lineTo(double x, double y) {
+ add(new double[] { x, y }, USegmentType.SEG_LINETO);
+ }
+
+ public void cubicTo(double ctrlx1, double ctrly1, double ctrlx2, double ctrly2, double x2, double y2) {
+ add(new double[] { ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2 }, USegmentType.SEG_CUBICTO);
+ }
+
@Override
public String toString() {
return segments.toString();
diff --git a/src/net/sourceforge/plantuml/ugraphic/UPolygon.java b/src/net/sourceforge/plantuml/ugraphic/UPolygon.java
index 2562b357a..89aef1ad4 100644
--- a/src/net/sourceforge/plantuml/ugraphic/UPolygon.java
+++ b/src/net/sourceforge/plantuml/ugraphic/UPolygon.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7143 $
+ * Revision $Revision: 7226 $
*
*/
package net.sourceforge.plantuml.ugraphic;
@@ -57,10 +57,23 @@ public class UPolygon extends AbstractShadowable {
return all;
}
+ public UPolygon translate(double dx, double dy) {
+ final UPolygon result = new UPolygon();
+ for (Point2D.Double pt : all) {
+ result.addPoint(pt.x + dx, pt.y + dy);
+ }
+ return result;
+ }
+
public void rotate(double theta) {
final AffineTransform rotate = AffineTransform.getRotateInstance(theta);
for (Point2D.Double pt : all) {
rotate.transform(pt, pt);
}
}
+
+ @Override
+ public String toString() {
+ return super.toString() + " " + all;
+ }
}
diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverEllipseEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverEllipseEps.java
index 136a1c647..2cd824ee6 100644
--- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverEllipseEps.java
+++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverEllipseEps.java
@@ -41,9 +41,14 @@ import net.sourceforge.plantuml.ugraphic.UShape;
public class DriverEllipseEps implements UDriver {
public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, EpsGraphics eps) {
- final UEllipse rect = (UEllipse) ushape;
- final double width = rect.getWidth();
- final double height = rect.getHeight();
+ final UEllipse shape = (UEllipse) ushape;
+ final double width = shape.getWidth();
+ final double height = shape.getHeight();
+
+ // Shadow
+ if (shape.getDeltaShadow() != 0) {
+ eps.epsEllipseShadow(x + width / 2, y + height / 2, width / 2, height / 2, shape.getDeltaShadow());
+ }
eps.setFillColor(mapper.getMappedColor(param.getBackcolor()));
eps.setStrokeColor(mapper.getMappedColor(param.getColor()));
diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverPathEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverPathEps.java
new file mode 100644
index 000000000..97f9973d7
--- /dev/null
+++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverPathEps.java
@@ -0,0 +1,54 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009, Arnaud Roques
+ *
+ * Project Info: http://plantuml.sourceforge.net
+ *
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
+ * in the United States and other countries.]
+ *
+ * Original Author: Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.ugraphic.eps;
+
+import net.sourceforge.plantuml.eps.EpsGraphics;
+import net.sourceforge.plantuml.ugraphic.ColorMapper;
+import net.sourceforge.plantuml.ugraphic.UDriver;
+import net.sourceforge.plantuml.ugraphic.UParam;
+import net.sourceforge.plantuml.ugraphic.UPath;
+import net.sourceforge.plantuml.ugraphic.UShape;
+
+public class DriverPathEps implements UDriver {
+
+ public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, EpsGraphics eps) {
+ final UPath shape = (UPath) ushape;
+
+ eps.setStrokeColor(mapper.getMappedColor(param.getColor()));
+ eps.setFillColor(mapper.getMappedColor(param.getBackcolor()));
+ eps.setStrokeWidth("" + param.getStroke().getThickness(), param.getStroke().getDashVisible(), param
+ .getStroke().getDashSpace());
+
+ eps.epsPath(x, y, shape);
+
+ }
+}
diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverPolygonEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverPolygonEps.java
index 7be45dc76..4f3d634bf 100644
--- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverPolygonEps.java
+++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverPolygonEps.java
@@ -70,6 +70,11 @@ public class DriverPolygonEps implements UDriver {
}
}
}
+
+ if (shape.getDeltaShadow() != 0) {
+ eps.epsPolygonShadow(shape.getDeltaShadow(), points);
+ }
+
eps.setFillColor(mapper.getMappedColor(param.getBackcolor()));
eps.setStrokeColor(mapper.getMappedColor(param.getColor()));
diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverRectangleEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverRectangleEps.java
index 1bf924ba5..22f67b5c2 100644
--- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverRectangleEps.java
+++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverRectangleEps.java
@@ -65,10 +65,15 @@ public class DriverRectangleEps implements UDriver {
width = r.width;
height = r.height;
}
-
+
final double rx = rect.getRx();
final double ry = rect.getRy();
+ // Shadow
+ if (rect.getDeltaShadow() != 0) {
+ eps.epsRectangleShadow(x, y, width, height, rx / 2, ry / 2, rect.getDeltaShadow());
+ }
+
final UGradient gr = param.getGradient();
if (gr == null) {
eps.setStrokeColor(mapper.getMappedColor(param.getColor()));
diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java
index 680045080..93151a69a 100644
--- a/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java
+++ b/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java
@@ -53,6 +53,7 @@ import net.sourceforge.plantuml.ugraphic.UEllipse;
import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.UImage;
import net.sourceforge.plantuml.ugraphic.ULine;
+import net.sourceforge.plantuml.ugraphic.UPath;
import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.URectangle;
import net.sourceforge.plantuml.ugraphic.UText;
@@ -77,6 +78,7 @@ public class UGraphicEps extends AbstractUGraphic implements ClipCo
registerDriver(UPolygon.class, new DriverPolygonEps(this));
registerDriver(UEllipse.class, new DriverEllipseEps());
registerDriver(UImage.class, new DriverImageEps());
+ registerDriver(UPath.class, new DriverPathEps());
registerDriver(DotPath.class, new DriverDotPathEps());
}
diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverPathG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverPathG2d.java
new file mode 100644
index 000000000..ad52cf15a
--- /dev/null
+++ b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverPathG2d.java
@@ -0,0 +1,84 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009, Arnaud Roques
+ *
+ * Project Info: http://plantuml.sourceforge.net
+ *
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
+ * in the United States and other countries.]
+ *
+ * Original Author: Arnaud Roques
+ *
+ * Revision $Revision: 3837 $
+ *
+ */
+package net.sourceforge.plantuml.ugraphic.g2d;
+
+import java.awt.Graphics2D;
+import java.awt.geom.CubicCurve2D;
+import java.awt.geom.GeneralPath;
+
+import net.sourceforge.plantuml.ugraphic.ColorMapper;
+import net.sourceforge.plantuml.ugraphic.UDriver;
+import net.sourceforge.plantuml.ugraphic.UParam;
+import net.sourceforge.plantuml.ugraphic.UPath;
+import net.sourceforge.plantuml.ugraphic.USegment;
+import net.sourceforge.plantuml.ugraphic.USegmentType;
+import net.sourceforge.plantuml.ugraphic.UShape;
+
+public class DriverPathG2d implements UDriver {
+
+ public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, Graphics2D g2d) {
+ final UPath shape = (UPath) ushape;
+ DriverLineG2d.manageStroke(param, g2d);
+
+ final GeneralPath p = new GeneralPath();
+ for (USegment seg : shape) {
+ final USegmentType type = seg.getSegmentType();
+ final double coord[] = seg.getCoord();
+ if (type == USegmentType.SEG_MOVETO) {
+ p.moveTo(x + coord[0], y + coord[1]);
+ } else if (type == USegmentType.SEG_LINETO) {
+ p.lineTo(x + coord[0], y + coord[1]);
+ } else if (type == USegmentType.SEG_CUBICTO) {
+ p.curveTo(x + coord[0], y + coord[1], x + coord[2], y + coord[3], x + coord[4], y + coord[5]);
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ // bez = new CubicCurve2D.Double(x + bez.x1, y + bez.y1, x +
+ // bez.ctrlx1, y + bez.ctrly1, x + bez.ctrlx2, y
+ // + bez.ctrly2, x + bez.x2, y + bez.y2);
+ // p.append(bez, true);
+ }
+ // p.closePath();
+
+ if (param.getBackcolor() != null) {
+ g2d.setColor(mapper.getMappedColor(param.getBackcolor()));
+ g2d.fill(p);
+ }
+ if (param.getColor() != null) {
+ g2d.setColor(mapper.getMappedColor(param.getColor()));
+ g2d.draw(p);
+ }
+ }
+
+}
diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/UGraphicG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/UGraphicG2d.java
index 3de714d0c..301729a75 100644
--- a/src/net/sourceforge/plantuml/ugraphic/g2d/UGraphicG2d.java
+++ b/src/net/sourceforge/plantuml/ugraphic/g2d/UGraphicG2d.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7143 $
+ * Revision $Revision: 7211 $
*
*/
package net.sourceforge.plantuml.ugraphic.g2d;
@@ -54,6 +54,7 @@ import net.sourceforge.plantuml.ugraphic.UEllipse;
import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.UImage;
import net.sourceforge.plantuml.ugraphic.ULine;
+import net.sourceforge.plantuml.ugraphic.UPath;
import net.sourceforge.plantuml.ugraphic.UPixel;
import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.URectangle;
@@ -83,6 +84,7 @@ public class UGraphicG2d extends AbstractUGraphic {
registerDriver(UEllipse.class, new DriverEllipseG2d());
registerDriver(UImage.class, new DriverImageG2d());
registerDriver(DotPath.class, new DriverDotPathG2d());
+ registerDriver(UPath.class, new DriverPathG2d());
}
public StringBounder getStringBounder() {
diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java
index a33e9bb0d..28f0eca6d 100644
--- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java
+++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java
@@ -42,13 +42,18 @@ import net.sourceforge.plantuml.ugraphic.UShape;
public class DriverEllipseSvg implements UDriver {
public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, SvgGraphics svg) {
- final UEllipse rect = (UEllipse) ushape;
- final double width = rect.getWidth();
- final double height = rect.getHeight();
+ final UEllipse shape = (UEllipse) ushape;
+ final double width = shape.getWidth();
+ final double height = shape.getHeight();
final String color = param.getColor() == null ? "none" : StringUtils.getAsHtml(mapper.getMappedColor(param.getColor()));
final String backcolor = param.getBackcolor() == null ? "none" : StringUtils.getAsHtml(mapper.getMappedColor(param.getBackcolor()));
+ // Shadow
+ if (shape.getDeltaShadow() != 0) {
+ svg.svgEllipseShadow(x + width / 2, y + height / 2, width / 2, height / 2, shape.getDeltaShadow());
+ }
+
svg.setFillColor(backcolor);
svg.setStrokeColor(color);
svg.setStrokeWidth(""+param.getStroke().getThickness(), param.getStroke().getDasharraySvg());
diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java
index 8f36f7160..f211ffe7b 100644
--- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java
+++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java
@@ -31,6 +31,7 @@
*/
package net.sourceforge.plantuml.ugraphic.svg;
+import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.svg.SvgGraphics;
import net.sourceforge.plantuml.ugraphic.ClipContainer;
import net.sourceforge.plantuml.ugraphic.ColorMapper;
@@ -50,6 +51,15 @@ public class DriverPathSvg implements UDriver {
public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, SvgGraphics svg) {
final UPath shape = (UPath) ushape;
+ final String color = param.getColor() == null ? "none" : StringUtils.getAsHtml(mapper.getMappedColor(param
+ .getColor()));
+ final String backcolor = param.getBackcolor() == null ? "none" : StringUtils.getAsHtml(mapper
+ .getMappedColor(param.getBackcolor()));
+
+ svg.setFillColor(backcolor);
+ svg.setStrokeColor(color);
+ svg.setStrokeWidth("" + param.getStroke().getThickness(), param.getStroke().getDasharraySvg());
+
svg.svgPath(x, y, shape);
}
diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverPolygonSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverPolygonSvg.java
index 2ef81ed75..a699b6454 100644
--- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverPolygonSvg.java
+++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverPolygonSvg.java
@@ -71,6 +71,11 @@ public class DriverPolygonSvg implements UDriver {
}
}
}
+
+ if (shape.getDeltaShadow() != 0) {
+ svg.svgPolygonShadow(shape.getDeltaShadow(), points);
+ }
+
final String color = param.getColor() == null ? "none" : StringUtils.getAsHtml(mapper.getMappedColor(param.getColor()));
final String backcolor = param.getBackcolor() == null ? "none" : StringUtils.getAsHtml(mapper.getMappedColor(param.getBackcolor()));
diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java
index 24c701fea..a9df65f26 100644
--- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java
+++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java
@@ -59,6 +59,12 @@ public class DriverRectangleSvg implements UDriver {
final double ry = rect.getRy();
double width = rect.getWidth();
double height = rect.getHeight();
+
+ // Shadow
+ if (rect.getDeltaShadow() != 0) {
+ svg.svgRectangleShadow(x, y, width, height, rx / 2, ry / 2, rect.getDeltaShadow());
+ }
+
final UGradient gr = param.getGradient();
if (gr == null) {
diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java
index d55c8c083..6551a5b60 100644
--- a/src/net/sourceforge/plantuml/version/Version.java
+++ b/src/net/sourceforge/plantuml/version/Version.java
@@ -28,7 +28,7 @@
*
* Original Author: Arnaud Roques
*
- * Revision $Revision: 7178 $
+ * Revision $Revision: 7233 $
*
*/
package net.sourceforge.plantuml.version;
@@ -36,11 +36,11 @@ package net.sourceforge.plantuml.version;
public class Version {
public static int version() {
- return 7177;
+ return 7232;
}
public static long compileTime() {
- return 1314897125765L;
+ return 1315477780453L;
}
}