1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-06-09 19:52:25 +00:00

fix: minor issues about multiples stereotype and improve new shapes action and process

https://github.com/plantuml/plantuml/issues/1538
https://github.com/plantuml/plantuml/issues/1631
This commit is contained in:
Arnaud Roques 2024-01-08 21:11:41 +01:00
parent d07cda5f5f
commit 6c73caa943
7 changed files with 95 additions and 30 deletions

View File

@ -108,11 +108,11 @@ public class ActivityDiagram3 extends UmlDiagram {
return swinlanes.nextLinkRenderer(); return swinlanes.nextLinkRenderer();
} }
public CommandExecutionResult addActivity(Display activity, BoxStyle style, Url url, Colors colors, public CommandExecutionResult addActivity(Display activity, BoxStyle boxStyle, Url url, Colors colors,
Stereotype stereotype) { Stereotype stereotype) {
manageSwimlaneStrategy(); manageSwimlaneStrategy();
final InstructionSimple ins = new InstructionSimple(activity, nextLinkRenderer(), final InstructionSimple ins = new InstructionSimple(activity, nextLinkRenderer(),
swinlanes.getCurrentSwimlane(), style, url, colors, stereotype); swinlanes.getCurrentSwimlane(), boxStyle, url, colors, stereotype);
final CommandExecutionResult added = current().add(ins); final CommandExecutionResult added = current().add(ins);
if (added.isOk() == false) if (added.isOk() == false)
return added; return added;
@ -396,7 +396,7 @@ public class ActivityDiagram3 extends UmlDiagram {
} }
if (current() instanceof InstructionWhile) { if (current() instanceof InstructionWhile) {
final InstructionWhile instructionWhile = (InstructionWhile) current(); final InstructionWhile instructionWhile = (InstructionWhile) current();
instructionWhile.setBackward(label, swinlanes.getCurrentSwimlane(), boxStyle, incoming1, incoming2); instructionWhile.setBackward(label, boxStyle, incoming1, incoming2, stereotype);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
return CommandExecutionResult.error("Cannot find repeat"); return CommandExecutionResult.error("Cannot find repeat");
@ -406,7 +406,7 @@ public class ActivityDiagram3 extends UmlDiagram {
public void doWhile(Display test, Display yes, HColor color) { public void doWhile(Display test, Display yes, HColor color) {
manageSwimlaneStrategy(); manageSwimlaneStrategy();
final InstructionWhile instructionWhile = new InstructionWhile(swinlanes.getCurrentSwimlane(), current(), test, final InstructionWhile instructionWhile = new InstructionWhile(swinlanes.getCurrentSwimlane(), current(), test,
nextLinkRenderer(), yes, color, getSkinParam()); nextLinkRenderer(), yes, color, getSkinParam().getCurrentStyleBuilder());
current().add(instructionWhile); current().add(instructionWhile);
setCurrent(instructionWhile); setCurrent(instructionWhile);
} }

View File

@ -62,7 +62,7 @@ public class InstructionSimple extends MonoSwimable implements Instruction {
private final Display label; private final Display label;
private final Colors colors; private final Colors colors;
private final LinkRendering inlinkRendering; private final LinkRendering inlinkRendering;
private final BoxStyle style; private final BoxStyle boxStyle;
private final Url url; private final Url url;
private final Stereotype stereotype; private final Stereotype stereotype;
@ -71,12 +71,12 @@ public class InstructionSimple extends MonoSwimable implements Instruction {
return false; return false;
} }
public InstructionSimple(Display label, LinkRendering inlinkRendering, Swimlane swimlane, BoxStyle style, Url url, public InstructionSimple(Display label, LinkRendering inlinkRendering, Swimlane swimlane, BoxStyle boxStyle,
Colors colors, Stereotype stereotype) { Url url, Colors colors, Stereotype stereotype) {
super(swimlane); super(swimlane);
this.stereotype = stereotype; this.stereotype = stereotype;
this.url = url; this.url = url;
this.style = style; this.boxStyle = boxStyle;
this.label = label; this.label = label;
this.inlinkRendering = Objects.requireNonNull(inlinkRendering); this.inlinkRendering = Objects.requireNonNull(inlinkRendering);
this.colors = Objects.requireNonNull(colors); this.colors = Objects.requireNonNull(colors);
@ -85,7 +85,7 @@ public class InstructionSimple extends MonoSwimable implements Instruction {
// ::comment when __CORE__ // ::comment when __CORE__
@Override @Override
public Gtile createGtile(ISkinParam skinParam, StringBounder stringBounder) { public Gtile createGtile(ISkinParam skinParam, StringBounder stringBounder) {
GtileBox result = GtileBox.create(stringBounder, colors.mute(skinParam), label, getSwimlaneIn(), style, GtileBox result = GtileBox.create(stringBounder, colors.mute(skinParam), label, getSwimlaneIn(), boxStyle,
stereotype); stereotype);
if (hasNotes()) { if (hasNotes()) {
final Collection<PositionedNote> notes = getPositionedNotes(); final Collection<PositionedNote> notes = getPositionedNotes();
@ -103,7 +103,7 @@ public class InstructionSimple extends MonoSwimable implements Instruction {
@Override @Override
public Ftile createFtile(FtileFactory factory) { public Ftile createFtile(FtileFactory factory) {
Ftile result = factory.activity(label, getSwimlaneIn(), style, colors, stereotype); Ftile result = factory.activity(label, getSwimlaneIn(), boxStyle, colors, stereotype);
if (url != null) { if (url != null) {
result = factory.addUrl(result, url); result = factory.addUrl(result, url);
} }

View File

@ -55,6 +55,7 @@ import net.sourceforge.plantuml.klimt.font.StringBounder;
import net.sourceforge.plantuml.klimt.geom.VerticalAlignment; import net.sourceforge.plantuml.klimt.geom.VerticalAlignment;
import net.sourceforge.plantuml.sequencediagram.NotePosition; import net.sourceforge.plantuml.sequencediagram.NotePosition;
import net.sourceforge.plantuml.sequencediagram.NoteType; import net.sourceforge.plantuml.sequencediagram.NoteType;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
@ -73,13 +74,14 @@ public class InstructionWhile extends WithNote implements Instruction, Instructi
private LinkRendering outColor = LinkRendering.none(); private LinkRendering outColor = LinkRendering.none();
private final Swimlane swimlane; private final Swimlane swimlane;
private final ISkinParam skinParam;
private Instruction specialOut; private Instruction specialOut;
private BoxStyle boxStyle; private BoxStyle boxStyle;
private Swimlane swimlaneOut;
private Display backward = Display.NULL; private Display backward = Display.NULL;
private Stereotype stereotype;
private LinkRendering incoming1 = LinkRendering.none(); private LinkRendering incoming1 = LinkRendering.none();
private LinkRendering incoming2 = LinkRendering.none(); private LinkRendering incoming2 = LinkRendering.none();
private boolean backwardCalled; private boolean backwardCalled;
@ -90,15 +92,14 @@ public class InstructionWhile extends WithNote implements Instruction, Instructi
} }
public InstructionWhile(Swimlane swimlane, Instruction parent, Display test, LinkRendering nextLinkRenderer, public InstructionWhile(Swimlane swimlane, Instruction parent, Display test, LinkRendering nextLinkRenderer,
Display yes, HColor color, ISkinParam skinParam) { Display yes, HColor color, StyleBuilder currentStyleBuilder) {
this.parent = parent; this.parent = parent;
this.test = Objects.requireNonNull(test); this.test = Objects.requireNonNull(test);
this.nextLinkRenderer = Objects.requireNonNull(nextLinkRenderer); this.nextLinkRenderer = Objects.requireNonNull(nextLinkRenderer);
this.yes = Objects.requireNonNull(yes); this.yes = Objects.requireNonNull(yes);
this.swimlane = swimlane; this.swimlane = swimlane;
this.currentStyleBuilder = skinParam.getCurrentStyleBuilder(); this.currentStyleBuilder = currentStyleBuilder;
this.color = color; this.color = color;
this.skinParam = skinParam;
} }
@Override @Override
@ -119,9 +120,10 @@ public class InstructionWhile extends WithNote implements Instruction, Instructi
@Override @Override
public Ftile createFtile(FtileFactory factory) { public Ftile createFtile(FtileFactory factory) {
final Ftile back = Display.isNull(backward) ? null final Ftile back = Display.isNull(backward) ? null
: factory.activity(backward, swimlane, boxStyle, Colors.empty(), null); : factory.activity(backward, swimlane, boxStyle, Colors.empty(), stereotype);
Ftile tmp = repeatList.createFtile(factory); Ftile tmp = repeatList.createFtile(factory);
tmp = factory.createWhile(outColor, swimlane, tmp, test, yes, color, specialOut, back, incoming1, incoming2, currentStyleBuilder); tmp = factory.createWhile(outColor, swimlane, tmp, test, yes, color, specialOut, back, incoming1, incoming2,
currentStyleBuilder);
if (getPositionedNotes().size() > 0) if (getPositionedNotes().size() > 0)
tmp = FtileWithNoteOpale.create(tmp, getPositionedNotes(), false, VerticalAlignment.CENTER); tmp = FtileWithNoteOpale.create(tmp, getPositionedNotes(), false, VerticalAlignment.CENTER);
@ -194,14 +196,14 @@ public class InstructionWhile extends WithNote implements Instruction, Instructi
return repeatList.containsBreak(); return repeatList.containsBreak();
} }
public void setBackward(Display label, Swimlane swimlaneOut, BoxStyle boxStyle, LinkRendering incoming1, public void setBackward(Display label, BoxStyle boxStyle, LinkRendering incoming1, LinkRendering incoming2,
LinkRendering incoming2) { Stereotype stereotype) {
this.backward = label; this.backward = label;
this.swimlaneOut = swimlaneOut;
this.boxStyle = boxStyle; this.boxStyle = boxStyle;
this.incoming1 = incoming1; this.incoming1 = incoming1;
this.incoming2 = incoming2; this.incoming2 = incoming2;
this.backwardCalled = true; this.backwardCalled = true;
this.stereotype = stereotype;
} }
public void incoming(LinkRendering incoming) { public void incoming(LinkRendering incoming) {

View File

@ -160,11 +160,12 @@ public enum BoxStyle {
if (bs.style == style.charAt(0)) if (bs.style == style.charAt(0))
return bs; return bs;
style = style.replaceAll("\\W", ""); for (String s : style.split("\\s")) {
s = s.replaceAll("\\W", "");
for (BoxStyle bs : BoxStyle.values()) for (BoxStyle bs : BoxStyle.values())
if (style.equalsIgnoreCase(bs.stereotype)) if (s.equalsIgnoreCase(bs.stereotype))
return bs; return bs;
}
} }
return PLAIN; return PLAIN;
} }

View File

@ -102,12 +102,44 @@ class USymbolAction extends USymbol {
} }
}; };
} }
private double getHTitle(XDimension2D dimTitle) {
final double htitle;
if (dimTitle.getWidth() == 0)
htitle = 10;
else
htitle = dimTitle.getHeight();
return htitle;
}
@Override @Override
public TextBlock asBig(final TextBlock title, final HorizontalAlignment labelAlignment, final TextBlock stereotype, public TextBlock asBig(final TextBlock title, final HorizontalAlignment labelAlignment, final TextBlock stereotype,
final double width, final double height, final Fashion symbolContext, final double width, final double height, final Fashion symbolContext,
final HorizontalAlignment stereoAlignment) { final HorizontalAlignment stereoAlignment) {
throw new UnsupportedOperationException(); return new AbstractTextBlock() {
public void drawU(UGraphic ug) {
final StringBounder stringBounder = ug.getStringBounder();
final XDimension2D dim = calculateDimension(stringBounder);
ug = symbolContext.apply(ug);
final XDimension2D dimTitle = title.calculateDimension(stringBounder);
drawAction(ug, dim.getWidth(), dim.getHeight(), symbolContext.getDeltaShadow(),
symbolContext.getRoundCorner(), symbolContext.getDiagonalCorner());
final double posTitle = (width - dimTitle.getWidth()) / 2;
title.drawU(ug.apply(new UTranslate(posTitle, 2)));
final XDimension2D dimStereo = stereotype.calculateDimension(stringBounder);
final double posStereo = (width - dimStereo.getWidth()) / 2;
stereotype.drawU(ug.apply(new UTranslate(4 + posStereo, 2 + getHTitle(dimTitle))));
}
public XDimension2D calculateDimension(StringBounder stringBounder) {
return new XDimension2D(width, height);
}
};
} }
} }

View File

@ -64,7 +64,7 @@ class USymbolProcess extends USymbol {
return sname; return sname;
} }
private void drawAction(UGraphic ug, double width, double height, double shadowing, double roundCorner, private void drawProcess(UGraphic ug, double width, double height, double shadowing, double roundCorner,
double diagonalCorner) { double diagonalCorner) {
final UPolygon shape = new UPolygon(); final UPolygon shape = new UPolygon();
shape.addPoint(0, 0); shape.addPoint(0, 0);
@ -89,7 +89,7 @@ class USymbolProcess extends USymbol {
final XDimension2D dim = calculateDimension(ug.getStringBounder()); final XDimension2D dim = calculateDimension(ug.getStringBounder());
ug = UGraphicStencil.create(ug, dim); ug = UGraphicStencil.create(ug, dim);
ug = symbolContext.apply(ug); ug = symbolContext.apply(ug);
drawAction(ug, dim.getWidth(), dim.getHeight(), symbolContext.getDeltaShadow(), drawProcess(ug, dim.getWidth(), dim.getHeight(), symbolContext.getDeltaShadow(),
symbolContext.getRoundCorner(), symbolContext.getDiagonalCorner()); symbolContext.getRoundCorner(), symbolContext.getDiagonalCorner());
final Margin margin = getMargin(); final Margin margin = getMargin();
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, stereoAlignment); final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, stereoAlignment);
@ -104,11 +104,41 @@ class USymbolProcess extends USymbol {
}; };
} }
private double getHTitle(XDimension2D dimTitle) {
final double htitle;
if (dimTitle.getWidth() == 0)
htitle = 10;
else
htitle = dimTitle.getHeight();
return htitle;
}
@Override @Override
public TextBlock asBig(final TextBlock title, final HorizontalAlignment labelAlignment, final TextBlock stereotype, public TextBlock asBig(final TextBlock title, final HorizontalAlignment labelAlignment, final TextBlock stereotype,
final double width, final double height, final Fashion symbolContext, final double width, final double height, final Fashion symbolContext,
final HorizontalAlignment stereoAlignment) { final HorizontalAlignment stereoAlignment) {
throw new UnsupportedOperationException(); return new AbstractTextBlock() {
public void drawU(UGraphic ug) {
final StringBounder stringBounder = ug.getStringBounder();
final XDimension2D dim = calculateDimension(stringBounder);
ug = symbolContext.apply(ug);
final XDimension2D dimTitle = title.calculateDimension(stringBounder);
drawProcess(ug, dim.getWidth(), dim.getHeight(), symbolContext.getDeltaShadow(),
symbolContext.getRoundCorner(), symbolContext.getDiagonalCorner());
final double posTitle = (width - dimTitle.getWidth()) / 2;
title.drawU(ug.apply(new UTranslate(posTitle, 2)));
final XDimension2D dimStereo = stereotype.calculateDimension(stringBounder);
final double posStereo = (width - dimStereo.getWidth()) / 2;
stereotype.drawU(ug.apply(new UTranslate(4 + posStereo, 2 + getHTitle(dimTitle))));
}
public XDimension2D calculateDimension(StringBounder stringBounder) {
return new XDimension2D(width, height);
}
};
} }
} }

View File

@ -72,7 +72,7 @@ public class CommandPackageWithUSymbol extends SingleLineCommand2<AbstractEntity
private static IRegex getRegexConcat() { private static IRegex getRegexConcat() {
return RegexConcat.build(CommandPackageWithUSymbol.class.getName(), RegexLeaf.start(), // return RegexConcat.build(CommandPackageWithUSymbol.class.getName(), RegexLeaf.start(), //
new RegexLeaf("SYMBOL", new RegexLeaf("SYMBOL",
"(package|rectangle|hexagon|node|artifact|folder|file|frame|cloud|database|storage|component|card|queue|stack)"), // "(package|rectangle|hexagon|node|artifact|folder|file|frame|cloud|action|process|database|storage|component|card|queue|stack)"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexOr(// new RegexOr(//
new RegexConcat( // new RegexConcat( //