mirror of
https://github.com/octoleo/plantuml.git
synced 2024-12-22 10:59:01 +00:00
version 1.2019.6
This commit is contained in:
parent
511dbb8096
commit
99041c5ccb
2
pom.xml
2
pom.xml
@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
<groupId>net.sourceforge.plantuml</groupId>
|
<groupId>net.sourceforge.plantuml</groupId>
|
||||||
<artifactId>plantuml</artifactId>
|
<artifactId>plantuml</artifactId>
|
||||||
<version>1.2019.6-SNAPSHOT</version>
|
<version>1.2019.7-SNAPSHOT</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>PlantUML</name>
|
<name>PlantUML</name>
|
||||||
|
@ -99,7 +99,7 @@ public class AnnotatedWorker {
|
|||||||
final double width = x1 + Math.max(dimOriginal.getWidth(), dimTitle.getWidth()) + x2;
|
final double width = x1 + Math.max(dimOriginal.getWidth(), dimTitle.getWidth()) + x2;
|
||||||
final double height = dimTitle.getHeight() + y1 + dimOriginal.getHeight() + y2;
|
final double height = dimTitle.getHeight() + y1 + dimOriginal.getHeight() + y2;
|
||||||
final TextBlock result = USymbol.FRAME.asBig(title, HorizontalAlignment.LEFT, TextBlockUtils.empty(0, 0),
|
final TextBlock result = USymbol.FRAME.asBig(title, HorizontalAlignment.LEFT, TextBlockUtils.empty(0, 0),
|
||||||
width, height, symbolContext);
|
width, height, symbolContext, skinParam.getStereotypeAlignment());
|
||||||
|
|
||||||
return new TextBlockBackcolored() {
|
return new TextBlockBackcolored() {
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ import net.sourceforge.plantuml.code.Transcoder;
|
|||||||
import net.sourceforge.plantuml.code.TranscoderUtil;
|
import net.sourceforge.plantuml.code.TranscoderUtil;
|
||||||
import net.sourceforge.plantuml.command.regex.Matcher2;
|
import net.sourceforge.plantuml.command.regex.Matcher2;
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemErrorPreprocessor;
|
||||||
import net.sourceforge.plantuml.preproc.Defines;
|
import net.sourceforge.plantuml.preproc.Defines;
|
||||||
import net.sourceforge.plantuml.preproc2.PreprocessorMode;
|
import net.sourceforge.plantuml.preproc2.PreprocessorMode;
|
||||||
import net.sourceforge.plantuml.preproc2.PreprocessorModeSet;
|
import net.sourceforge.plantuml.preproc2.PreprocessorModeSet;
|
||||||
@ -57,6 +58,7 @@ import net.sourceforge.plantuml.version.Version;
|
|||||||
public class BlockUml {
|
public class BlockUml {
|
||||||
|
|
||||||
private final List<StringLocated> data;
|
private final List<StringLocated> data;
|
||||||
|
private List<StringLocated> debug;
|
||||||
private Diagram system;
|
private Diagram system;
|
||||||
private final Defines localDefines;
|
private final Defines localDefines;
|
||||||
private final ISkinSimple skinParam;
|
private final ISkinSimple skinParam;
|
||||||
@ -96,6 +98,9 @@ public class BlockUml {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PreprocessorMode pmode = PreprocessorMode.V1_LEGACY;
|
||||||
|
private boolean preprocessorError;
|
||||||
|
|
||||||
public BlockUml(List<StringLocated> strings, Defines defines, ISkinSimple skinParam, PreprocessorModeSet mode) {
|
public BlockUml(List<StringLocated> strings, Defines defines, ISkinSimple skinParam, PreprocessorModeSet mode) {
|
||||||
this.localDefines = defines;
|
this.localDefines = defines;
|
||||||
this.skinParam = skinParam;
|
this.skinParam = skinParam;
|
||||||
@ -104,7 +109,12 @@ public class BlockUml {
|
|||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
if (mode != null && mode.getPreprocessorMode() == PreprocessorMode.V2_NEW_TIM) {
|
if (mode != null && mode.getPreprocessorMode() == PreprocessorMode.V2_NEW_TIM) {
|
||||||
this.data = new TimLoader(mode.getImportedFiles(), defines).load(strings);
|
this.pmode = mode.getPreprocessorMode();
|
||||||
|
final TimLoader timLoader = new TimLoader(mode.getImportedFiles(), defines, mode.getCharset());
|
||||||
|
timLoader.load(strings);
|
||||||
|
this.data = timLoader.getResult();
|
||||||
|
this.debug = timLoader.getDebug();
|
||||||
|
this.preprocessorError = timLoader.isPreprocessorError();
|
||||||
} else {
|
} else {
|
||||||
this.data = new ArrayList<StringLocated>(strings);
|
this.data = new ArrayList<StringLocated>(strings);
|
||||||
}
|
}
|
||||||
@ -139,7 +149,11 @@ public class BlockUml {
|
|||||||
|
|
||||||
public Diagram getDiagram() {
|
public Diagram getDiagram() {
|
||||||
if (system == null) {
|
if (system == null) {
|
||||||
system = new PSystemBuilder().createPSystem(skinParam, data);
|
if (preprocessorError) {
|
||||||
|
system = new PSystemErrorPreprocessor(data, debug);
|
||||||
|
} else {
|
||||||
|
system = new PSystemBuilder().createPSystem(skinParam, data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return system;
|
return system;
|
||||||
}
|
}
|
||||||
|
@ -57,18 +57,20 @@ import net.sourceforge.plantuml.utils.StartUtils;
|
|||||||
|
|
||||||
public final class BlockUmlBuilder implements DefinitionsContainer {
|
public final class BlockUmlBuilder implements DefinitionsContainer {
|
||||||
|
|
||||||
private PreprocessorMode mode = PreprocessorMode.V1_LEGACY;
|
private PreprocessorMode mode = PreprocessorMode.V2_NEW_TIM;
|
||||||
|
|
||||||
private final List<BlockUml> blocks = new ArrayList<BlockUml>();
|
private final List<BlockUml> blocks = new ArrayList<BlockUml>();
|
||||||
private Set<FileWithSuffix> usedFiles = new HashSet<FileWithSuffix>();
|
private Set<FileWithSuffix> usedFiles = new HashSet<FileWithSuffix>();
|
||||||
private final UncommentReadLine reader2;
|
private final UncommentReadLine reader2;
|
||||||
private final Defines defines;
|
private final Defines defines;
|
||||||
private final ImportedFiles importedFiles;
|
private final ImportedFiles importedFiles;
|
||||||
|
private final String charset;
|
||||||
|
|
||||||
public BlockUmlBuilder(List<String> config, String charset, Defines defines, Reader reader, File newCurrentDir,
|
public BlockUmlBuilder(List<String> config, String charset, Defines defines, Reader reader, File newCurrentDir,
|
||||||
String desc) throws IOException {
|
String desc) throws IOException {
|
||||||
ReadLineNumbered includer = null;
|
ReadLineNumbered includer = null;
|
||||||
this.defines = defines;
|
this.defines = defines;
|
||||||
|
this.charset = charset;
|
||||||
try {
|
try {
|
||||||
this.reader2 = new UncommentReadLine(new PreprocessorChangeModeReader(ReadLineReader.create(reader, desc),
|
this.reader2 = new UncommentReadLine(new PreprocessorChangeModeReader(ReadLineReader.create(reader, desc),
|
||||||
this));
|
this));
|
||||||
@ -159,4 +161,8 @@ public final class BlockUmlBuilder implements DefinitionsContainer {
|
|||||||
return importedFiles;
|
return importedFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final String getCharset() {
|
||||||
|
return charset;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -140,6 +140,8 @@ public enum ColorParam {
|
|||||||
nodeBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
nodeBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
||||||
rectangleBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
rectangleBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
||||||
rectangleBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
rectangleBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
||||||
|
archimateBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
||||||
|
archimateBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
||||||
cardBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
cardBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
||||||
cardBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
cardBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
||||||
agentBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
agentBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
package net.sourceforge.plantuml;
|
package net.sourceforge.plantuml;
|
||||||
|
|
||||||
public enum CornerParam {
|
public enum CornerParam {
|
||||||
DEFAULT, diagramBorder, titleBorder, rectangle, component, card, agent;
|
DEFAULT, diagramBorder, titleBorder, rectangle, archimate, component, card, agent;
|
||||||
|
|
||||||
public String getRoundKey() {
|
public String getRoundKey() {
|
||||||
if (this == DEFAULT) {
|
if (this == DEFAULT) {
|
||||||
|
@ -35,14 +35,11 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml;
|
package net.sourceforge.plantuml;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.suggest.SuggestEngineResult;
|
|
||||||
import net.sourceforge.plantuml.suggest.SuggestEngineStatus;
|
|
||||||
|
|
||||||
public class ErrorUml {
|
public class ErrorUml {
|
||||||
|
|
||||||
private final String error;
|
private final String error;
|
||||||
private final ErrorUmlType type;
|
private final ErrorUmlType type;
|
||||||
private SuggestEngineResult suggest;
|
|
||||||
private final LineLocation lineLocation;
|
private final LineLocation lineLocation;
|
||||||
|
|
||||||
public ErrorUml(ErrorUmlType type, String error, LineLocation lineLocation) {
|
public ErrorUml(ErrorUmlType type, String error, LineLocation lineLocation) {
|
||||||
@ -62,12 +59,12 @@ public class ErrorUml {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return error.hashCode() + type.hashCode() + getPosition() + (suggest == null ? 0 : suggest.hashCode());
|
return error.hashCode() + type.hashCode() + getPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return type.toString() + " " + getPosition() + " " + error + " " + suggest;
|
return type.toString() + " " + getPosition() + " " + error;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String getError() {
|
public final String getError() {
|
||||||
@ -86,16 +83,4 @@ public class ErrorUml {
|
|||||||
return lineLocation;
|
return lineLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final SuggestEngineResult getSuggest() {
|
|
||||||
return suggest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean hasSuggest() {
|
|
||||||
return suggest != null && suggest.getStatus() == SuggestEngineStatus.ONE_SUGGESTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSuggest(SuggestEngineResult suggest) {
|
|
||||||
this.suggest = suggest;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,7 @@ public enum FontParam {
|
|||||||
ENTITY(14, Font.PLAIN), //
|
ENTITY(14, Font.PLAIN), //
|
||||||
AGENT(14, Font.PLAIN), //
|
AGENT(14, Font.PLAIN), //
|
||||||
RECTANGLE(14, Font.PLAIN), //
|
RECTANGLE(14, Font.PLAIN), //
|
||||||
|
ARCHIMATE(14, Font.PLAIN), //
|
||||||
CARD(14, Font.PLAIN), //
|
CARD(14, Font.PLAIN), //
|
||||||
NODE(14, Font.PLAIN), //
|
NODE(14, Font.PLAIN), //
|
||||||
DATABASE(14, Font.PLAIN), //
|
DATABASE(14, Font.PLAIN), //
|
||||||
@ -110,6 +111,7 @@ public enum FontParam {
|
|||||||
ENTITY_STEREOTYPE(14, Font.ITALIC), //
|
ENTITY_STEREOTYPE(14, Font.ITALIC), //
|
||||||
AGENT_STEREOTYPE(14, Font.ITALIC), //
|
AGENT_STEREOTYPE(14, Font.ITALIC), //
|
||||||
RECTANGLE_STEREOTYPE(14, Font.ITALIC), //
|
RECTANGLE_STEREOTYPE(14, Font.ITALIC), //
|
||||||
|
ARCHIMATE_STEREOTYPE(14, Font.ITALIC), //
|
||||||
CARD_STEREOTYPE(14, Font.ITALIC), //
|
CARD_STEREOTYPE(14, Font.ITALIC), //
|
||||||
NODE_STEREOTYPE(14, Font.ITALIC), //
|
NODE_STEREOTYPE(14, Font.ITALIC), //
|
||||||
FOLDER_STEREOTYPE(14, Font.ITALIC), //
|
FOLDER_STEREOTYPE(14, Font.ITALIC), //
|
||||||
|
@ -38,6 +38,7 @@ package net.sourceforge.plantuml;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
|
|
||||||
public class GeneratedImageImpl implements GeneratedImage {
|
public class GeneratedImageImpl implements GeneratedImage {
|
||||||
|
|
||||||
@ -68,7 +69,7 @@ public class GeneratedImageImpl implements GeneratedImage {
|
|||||||
public int lineErrorRaw() {
|
public int lineErrorRaw() {
|
||||||
final Diagram system = blockUml.getDiagram();
|
final Diagram system = blockUml.getDiagram();
|
||||||
if (system instanceof PSystemError) {
|
if (system instanceof PSystemError) {
|
||||||
return ((PSystemError) system).getHigherErrorPosition2().getPosition();
|
return ((PSystemError) system).getLineLocation().getPosition();
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,8 @@ public interface ISkinParam extends ISkinSimple {
|
|||||||
|
|
||||||
public HorizontalAlignment getDefaultTextAlignment(HorizontalAlignment defaultValue);
|
public HorizontalAlignment getDefaultTextAlignment(HorizontalAlignment defaultValue);
|
||||||
|
|
||||||
|
public HorizontalAlignment getStereotypeAlignment();
|
||||||
|
|
||||||
public int getCircledCharacterRadius();
|
public int getCircledCharacterRadius();
|
||||||
|
|
||||||
public char getCircledCharacter(Stereotype stereotype);
|
public char getCircledCharacter(Stereotype stereotype);
|
||||||
|
@ -55,6 +55,7 @@ public enum LineParam {
|
|||||||
titleBorder,
|
titleBorder,
|
||||||
diagramBorder,
|
diagramBorder,
|
||||||
rectangleBorder,
|
rectangleBorder,
|
||||||
|
archimateBorder,
|
||||||
componentBorder,
|
componentBorder,
|
||||||
cardBorder,
|
cardBorder,
|
||||||
agentBorder,
|
agentBorder,
|
||||||
|
@ -63,6 +63,8 @@ import net.sourceforge.plantuml.eggs.PSystemColorsFactory;
|
|||||||
import net.sourceforge.plantuml.eggs.PSystemEggFactory;
|
import net.sourceforge.plantuml.eggs.PSystemEggFactory;
|
||||||
import net.sourceforge.plantuml.eggs.PSystemRIPFactory;
|
import net.sourceforge.plantuml.eggs.PSystemRIPFactory;
|
||||||
import net.sourceforge.plantuml.eggs.PSystemWelcomeFactory;
|
import net.sourceforge.plantuml.eggs.PSystemWelcomeFactory;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemErrorUtils;
|
||||||
import net.sourceforge.plantuml.flowdiagram.FlowDiagramFactory;
|
import net.sourceforge.plantuml.flowdiagram.FlowDiagramFactory;
|
||||||
import net.sourceforge.plantuml.font.PSystemListFontsFactory;
|
import net.sourceforge.plantuml.font.PSystemListFontsFactory;
|
||||||
import net.sourceforge.plantuml.help.HelpFactory;
|
import net.sourceforge.plantuml.help.HelpFactory;
|
||||||
@ -100,15 +102,15 @@ public class PSystemBuilder {
|
|||||||
final DiagramType type = DiagramType.getTypeFromArobaseStart(strings2.get(0).getString());
|
final DiagramType type = DiagramType.getTypeFromArobaseStart(strings2.get(0).getString());
|
||||||
final UmlSource umlSource = new UmlSource(strings2, type == DiagramType.UML);
|
final UmlSource umlSource = new UmlSource(strings2, type == DiagramType.UML);
|
||||||
|
|
||||||
// int cpt = 0;
|
|
||||||
for (StringLocated s : strings2) {
|
for (StringLocated s : strings2) {
|
||||||
if (s.getPreprocessorError() != null) {
|
if (s.getPreprocessorError() != null) {
|
||||||
|
// Dead code : should not append
|
||||||
Log.error("Preprocessor Error: " + s.getPreprocessorError());
|
Log.error("Preprocessor Error: " + s.getPreprocessorError());
|
||||||
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, s.getPreprocessorError(), /* cpt */
|
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, s.getPreprocessorError(), /* cpt */
|
||||||
s.getLocation());
|
s.getLocation());
|
||||||
return new PSystemError(umlSource, err, Collections.<String> emptyList());
|
// return PSystemErrorUtils.buildV1(umlSource, err, Collections.<String> emptyList());
|
||||||
|
return PSystemErrorUtils.buildV2(umlSource, err, Collections.<String> emptyList(), strings2);
|
||||||
}
|
}
|
||||||
// cpt++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final DiagramType diagramType = umlSource.getDiagramType();
|
final DiagramType diagramType = umlSource.getDiagramType();
|
||||||
@ -126,7 +128,7 @@ public class PSystemBuilder {
|
|||||||
errors.add((PSystemError) sys);
|
errors.add((PSystemError) sys);
|
||||||
}
|
}
|
||||||
|
|
||||||
final PSystemError err = PSystemError.merge(errors);
|
final PSystemError err = PSystemErrorUtils.merge(errors);
|
||||||
result = err;
|
result = err;
|
||||||
return err;
|
return err;
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -44,6 +44,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
import net.sourceforge.plantuml.preproc.Defines;
|
import net.sourceforge.plantuml.preproc.Defines;
|
||||||
|
|
||||||
public class Pipe {
|
public class Pipe {
|
||||||
|
@ -550,6 +550,15 @@ public class SkinParam implements ISkinParam {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HorizontalAlignment getStereotypeAlignment() {
|
||||||
|
final String value = getValue("stereotypealignment");
|
||||||
|
final HorizontalAlignment result = HorizontalAlignment.fromString(value);
|
||||||
|
if (result == null) {
|
||||||
|
return HorizontalAlignment.CENTER;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private String getArg(String value, int i) {
|
private String getArg(String value, int i) {
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -317,5 +317,10 @@ public class SkinParamDelegator implements ISkinParam {
|
|||||||
public Map<String, String> values() {
|
public Map<String, String> values() {
|
||||||
return skinParam.values();
|
return skinParam.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HorizontalAlignment getStereotypeAlignment() {
|
||||||
|
return skinParam.getStereotypeAlignment();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,7 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
import net.sourceforge.plantuml.preproc.FileWithSuffix;
|
import net.sourceforge.plantuml.preproc.FileWithSuffix;
|
||||||
|
|
||||||
public abstract class SourceFileReaderAbstract {
|
public abstract class SourceFileReaderAbstract {
|
||||||
|
@ -38,6 +38,7 @@ package net.sourceforge.plantuml;
|
|||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
|
|
||||||
public class StdrptPipe0 implements Stdrpt {
|
public class StdrptPipe0 implements Stdrpt {
|
||||||
|
|
||||||
@ -45,7 +46,7 @@ public class StdrptPipe0 implements Stdrpt {
|
|||||||
if (sys instanceof PSystemError) {
|
if (sys instanceof PSystemError) {
|
||||||
final PSystemError err = (PSystemError) sys;
|
final PSystemError err = (PSystemError) sys;
|
||||||
output.println("ERROR");
|
output.println("ERROR");
|
||||||
output.println(err.getHigherErrorPosition2().getPosition());
|
output.println(err.getLineLocation().getPosition());
|
||||||
for (ErrorUml er : err.getErrorsUml()) {
|
for (ErrorUml er : err.getErrorsUml()) {
|
||||||
output.println(er.getError());
|
output.println(er.getError());
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ import java.io.PrintStream;
|
|||||||
import net.sourceforge.plantuml.command.PSystemAbstractFactory;
|
import net.sourceforge.plantuml.command.PSystemAbstractFactory;
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
import net.sourceforge.plantuml.eggs.PSystemWelcome;
|
import net.sourceforge.plantuml.eggs.PSystemWelcome;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
|
|
||||||
public class StdrptV1 implements Stdrpt {
|
public class StdrptV1 implements Stdrpt {
|
||||||
|
|
||||||
@ -58,7 +59,7 @@ public class StdrptV1 implements Stdrpt {
|
|||||||
output.println("status=NO_DATA");
|
output.println("status=NO_DATA");
|
||||||
} else {
|
} else {
|
||||||
output.println("status=ERROR");
|
output.println("status=ERROR");
|
||||||
output.println("lineNumber=" + err.getHigherErrorPosition2().getPosition());
|
output.println("lineNumber=" + err.getLineLocation().getPosition());
|
||||||
for (ErrorUml er : err.getErrorsUml()) {
|
for (ErrorUml er : err.getErrorsUml()) {
|
||||||
output.println("label=" + er.getError());
|
output.println("label=" + er.getError());
|
||||||
}
|
}
|
||||||
|
@ -262,7 +262,7 @@ public class ActivityDiagram3 extends UmlDiagram {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void split() {
|
public void split() {
|
||||||
final InstructionSplit instructionSplit = new InstructionSplit(current(), nextLinkRenderer());
|
final InstructionSplit instructionSplit = new InstructionSplit(current(), nextLinkRenderer(), swinlanes.getCurrentSwimlane());
|
||||||
setNextLinkRendererInternal(LinkRendering.none());
|
setNextLinkRendererInternal(LinkRendering.none());
|
||||||
current().add(instructionSplit);
|
current().add(instructionSplit);
|
||||||
setCurrent(instructionSplit);
|
setCurrent(instructionSplit);
|
||||||
@ -279,7 +279,7 @@ public class ActivityDiagram3 extends UmlDiagram {
|
|||||||
|
|
||||||
public CommandExecutionResult endSplit() {
|
public CommandExecutionResult endSplit() {
|
||||||
if (current() instanceof InstructionSplit) {
|
if (current() instanceof InstructionSplit) {
|
||||||
((InstructionSplit) current()).endSplit(nextLinkRenderer());
|
((InstructionSplit) current()).endSplit(nextLinkRenderer(), swinlanes.getCurrentSwimlane());
|
||||||
setNextLinkRendererInternal(LinkRendering.none());
|
setNextLinkRendererInternal(LinkRendering.none());
|
||||||
setCurrent(((InstructionSplit) current()).getParent());
|
setCurrent(((InstructionSplit) current()).getParent());
|
||||||
return CommandExecutionResult.ok();
|
return CommandExecutionResult.ok();
|
||||||
|
@ -155,15 +155,6 @@ public class InstructionList extends WithNote implements Instruction, Instructio
|
|||||||
|
|
||||||
public Swimlane getSwimlaneIn() {
|
public Swimlane getSwimlaneIn() {
|
||||||
return defaultSwimlane;
|
return defaultSwimlane;
|
||||||
// final Set<Swimlane> swimlanes = getSwimlanes();
|
|
||||||
// if (swimlanes.size() == 0) {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// if (swimlanes.size() == 1) {
|
|
||||||
// return swimlanes.iterator().next();
|
|
||||||
// }
|
|
||||||
// System.err.println("foo1="+getClass());
|
|
||||||
// return all.get(0).getSwimlaneIn();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Swimlane getSwimlaneOut() {
|
public Swimlane getSwimlaneOut() {
|
||||||
|
@ -52,16 +52,20 @@ public class InstructionSplit implements Instruction {
|
|||||||
private final List<InstructionList> splits = new ArrayList<InstructionList>();
|
private final List<InstructionList> splits = new ArrayList<InstructionList>();
|
||||||
private final Instruction parent;
|
private final Instruction parent;
|
||||||
private final LinkRendering inlinkRendering;
|
private final LinkRendering inlinkRendering;
|
||||||
|
private final Swimlane swimlaneIn;
|
||||||
|
private Swimlane swimlaneOut;
|
||||||
|
|
||||||
public InstructionSplit(Instruction parent, LinkRendering inlinkRendering) {
|
public InstructionSplit(Instruction parent, LinkRendering inlinkRendering, Swimlane swimlane) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.splits.add(new InstructionList());
|
this.swimlaneIn = swimlane;
|
||||||
|
|
||||||
|
this.splits.add(new InstructionList(swimlane));
|
||||||
this.inlinkRendering = inlinkRendering;
|
this.inlinkRendering = inlinkRendering;
|
||||||
if (inlinkRendering == null) {
|
if (inlinkRendering == null) {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsBreak() {
|
public boolean containsBreak() {
|
||||||
for (InstructionList split : splits) {
|
for (InstructionList split : splits) {
|
||||||
if (split.containsBreak()) {
|
if (split.containsBreak()) {
|
||||||
@ -71,7 +75,6 @@ public class InstructionSplit implements Instruction {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private InstructionList getLast() {
|
private InstructionList getLast() {
|
||||||
return splits.get(splits.size() - 1);
|
return splits.get(splits.size() - 1);
|
||||||
}
|
}
|
||||||
@ -96,14 +99,15 @@ public class InstructionSplit implements Instruction {
|
|||||||
if (inlinkRendering != null) {
|
if (inlinkRendering != null) {
|
||||||
getLast().setOutRendering(inlinkRendering);
|
getLast().setOutRendering(inlinkRendering);
|
||||||
}
|
}
|
||||||
final InstructionList list = new InstructionList();
|
final InstructionList list = new InstructionList(swimlaneIn);
|
||||||
this.splits.add(list);
|
this.splits.add(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void endSplit(LinkRendering inlinkRendering) {
|
public void endSplit(LinkRendering inlinkRendering, Swimlane endSwimlane) {
|
||||||
if (inlinkRendering != null) {
|
if (inlinkRendering != null) {
|
||||||
getLast().setOutRendering(inlinkRendering);
|
getLast().setOutRendering(inlinkRendering);
|
||||||
}
|
}
|
||||||
|
this.swimlaneOut = endSwimlane;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,7 +132,8 @@ public class InstructionSplit implements Instruction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Swimlane getSwimlaneOut() {
|
public Swimlane getSwimlaneOut() {
|
||||||
return getLast().getSwimlaneOut();
|
return swimlaneOut;
|
||||||
|
// return getLast().getSwimlaneOut();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -43,8 +43,6 @@ import net.sourceforge.plantuml.command.regex.RegexConcat;
|
|||||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
|
||||||
import net.sourceforge.plantuml.graphic.color.ColorParser;
|
|
||||||
|
|
||||||
public class CommandCase extends SingleLineCommand2<ActivityDiagram3> {
|
public class CommandCase extends SingleLineCommand2<ActivityDiagram3> {
|
||||||
|
|
||||||
|
@ -48,6 +48,44 @@ public class FtileGeometry extends Dimension2D {
|
|||||||
private final double inY;
|
private final double inY;
|
||||||
private final double outY;
|
private final double outY;
|
||||||
|
|
||||||
|
public Point2D getPointA() {
|
||||||
|
return new Point2D.Double(left, inY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Point2D getPointIn() {
|
||||||
|
return new Point2D.Double(left, inY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Point2D getPointB() {
|
||||||
|
if (outY == Double.MIN_NORMAL) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
return new Point2D.Double(width, (inY + outY) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Point2D getPointC() {
|
||||||
|
if (outY == Double.MIN_NORMAL) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
return new Point2D.Double(left, outY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Point2D getPointD() {
|
||||||
|
if (outY == Double.MIN_NORMAL) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
return new Point2D.Double(0, (inY + outY) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Point2D getPointOut() {
|
||||||
|
if (outY == Double.MIN_NORMAL) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
return new Point2D.Double(left, outY);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public FtileGeometry(Dimension2D dim, double left, double inY) {
|
public FtileGeometry(Dimension2D dim, double left, double inY) {
|
||||||
this(dim.getWidth(), dim.getHeight(), left, inY);
|
this(dim.getWidth(), dim.getHeight(), left, inY);
|
||||||
}
|
}
|
||||||
@ -86,17 +124,6 @@ public class FtileGeometry extends Dimension2D {
|
|||||||
return outY != Double.MIN_NORMAL;
|
return outY != Double.MIN_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Point2D getPointIn() {
|
|
||||||
return new Point2D.Double(left, inY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Point2D getPointOut() {
|
|
||||||
if (outY == Double.MIN_NORMAL) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
return new Point2D.Double(left, outY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public FtileGeometry withoutPointOut() {
|
public FtileGeometry withoutPointOut() {
|
||||||
return new FtileGeometry(width, height, left, inY);
|
return new FtileGeometry(width, height, left, inY);
|
||||||
}
|
}
|
||||||
|
@ -66,12 +66,11 @@ public class Snake implements UShape {
|
|||||||
private MergeStrategy mergeable = MergeStrategy.FULL;
|
private MergeStrategy mergeable = MergeStrategy.FULL;
|
||||||
private Direction emphasizeDirection;
|
private Direction emphasizeDirection;
|
||||||
private final HorizontalAlignment horizontalAlignment;
|
private final HorizontalAlignment horizontalAlignment;
|
||||||
|
|
||||||
public final void setIgnoreForCompression(boolean ignoreForCompression) {
|
public final void setIgnoreForCompression(boolean ignoreForCompression) {
|
||||||
this.worm.setIgnoreForCompression(ignoreForCompression);
|
this.worm.setIgnoreForCompression(ignoreForCompression);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Snake transformX(CompressionTransform compressionTransform) {
|
public Snake transformX(CompressionTransform compressionTransform) {
|
||||||
final Snake result = new Snake(startDecoration, horizontalAlignment, color, endDecoration);
|
final Snake result = new Snake(startDecoration, horizontalAlignment, color, endDecoration);
|
||||||
result.textBlock = this.textBlock;
|
result.textBlock = this.textBlock;
|
||||||
@ -206,14 +205,19 @@ public class Snake implements UShape {
|
|||||||
final Dimension2D dim = textBlock.calculateDimension(stringBounder);
|
final Dimension2D dim = textBlock.calculateDimension(stringBounder);
|
||||||
double x = Math.max(pt1.getX(), pt2.getX()) + 4;
|
double x = Math.max(pt1.getX(), pt2.getX()) + 4;
|
||||||
final boolean zigzag = worm.getDirectionsCode().startsWith("DLD") || worm.getDirectionsCode().startsWith("DRD");
|
final boolean zigzag = worm.getDirectionsCode().startsWith("DLD") || worm.getDirectionsCode().startsWith("DRD");
|
||||||
|
double y = (pt1.getY() + pt2.getY()) / 2 - dim.getHeight() / 2;
|
||||||
if (horizontalAlignment == HorizontalAlignment.CENTER && zigzag) {
|
if (horizontalAlignment == HorizontalAlignment.CENTER && zigzag) {
|
||||||
final Point2D pt3 = worm.get(2);
|
final Point2D pt3 = worm.get(2);
|
||||||
x = (pt2.getX() + pt3.getX()) / 2 - dim.getWidth() / 2;
|
x = (pt2.getX() + pt3.getX()) / 2 - dim.getWidth() / 2;
|
||||||
} else if (horizontalAlignment == HorizontalAlignment.RIGHT && zigzag) {
|
} else if (horizontalAlignment == HorizontalAlignment.RIGHT && zigzag) {
|
||||||
// final Point2D pt3 = worm.get(2);
|
|
||||||
x = Math.max(pt1.getX(), pt2.getX()) - dim.getWidth() - 4;
|
x = Math.max(pt1.getX(), pt2.getX()) - dim.getWidth() - 4;
|
||||||
|
} else if (worm.getDirectionsCode().equals("RD")) {
|
||||||
|
x = Math.max(pt1.getX(), pt2.getX());
|
||||||
|
y = (pt1.getY() + worm.get(2).getY()) / 2 - dim.getHeight() / 2;
|
||||||
|
} else if (worm.getDirectionsCode().equals("LD")) {
|
||||||
|
x = Math.min(pt1.getX(), pt2.getX());
|
||||||
|
y = (pt1.getY() + worm.get(2).getY()) / 2 - dim.getHeight() / 2;
|
||||||
}
|
}
|
||||||
final double y = (pt1.getY() + pt2.getY()) / 2 - dim.getHeight() / 2;
|
|
||||||
return new Point2D.Double(x, y);
|
return new Point2D.Double(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,6 +206,12 @@ public class Worm implements Iterable<Point2D.Double> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addPoint(double x, double y) {
|
public void addPoint(double x, double y) {
|
||||||
|
if (points.size() > 0) {
|
||||||
|
final Point2D last = getLast();
|
||||||
|
if (last.getX() == x && last.getY() == y) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
this.points.add(new Point2D.Double(x, y));
|
this.points.add(new Point2D.Double(x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,10 +40,8 @@ import java.util.List;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.ColorParam;
|
import net.sourceforge.plantuml.ColorParam;
|
||||||
import net.sourceforge.plantuml.FontParam;
|
import net.sourceforge.plantuml.FontParam;
|
||||||
import net.sourceforge.plantuml.LineBreakStrategy;
|
|
||||||
import net.sourceforge.plantuml.activitydiagram3.Branch;
|
import net.sourceforge.plantuml.activitydiagram3.Branch;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.LinkRendering;
|
import net.sourceforge.plantuml.activitydiagram3.LinkRendering;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.Diamond;
|
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactoryDelegator;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactoryDelegator;
|
||||||
@ -51,20 +49,17 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileMinWidth;
|
|||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.FtileSwitchNude;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.FtileSwitchNude;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.FtileSwitchWithDiamonds;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.FtileSwitchWithDiamonds;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileDiamond;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.FtileSwitchWithOneLink;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.FtileSwitchWithManyLinks;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileDiamondInside;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileDiamondInside;
|
||||||
import net.sourceforge.plantuml.creole.CreoleMode;
|
|
||||||
import net.sourceforge.plantuml.creole.CreoleParser;
|
|
||||||
import net.sourceforge.plantuml.creole.Sheet;
|
|
||||||
import net.sourceforge.plantuml.creole.SheetBlock1;
|
|
||||||
import net.sourceforge.plantuml.creole.SheetBlock2;
|
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||||
|
import net.sourceforge.plantuml.graphic.HtmlColorAndStyle;
|
||||||
|
import net.sourceforge.plantuml.graphic.Rainbow;
|
||||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||||
import net.sourceforge.plantuml.svek.ConditionStyle;
|
|
||||||
|
|
||||||
public class FtileFactoryDelegatorSwitch extends FtileFactoryDelegator {
|
public class FtileFactoryDelegatorSwitch extends FtileFactoryDelegator {
|
||||||
|
|
||||||
@ -93,7 +88,8 @@ public class FtileFactoryDelegatorSwitch extends FtileFactoryDelegator {
|
|||||||
// fcArrow, topInlinkRendering, afterEndwhile, fcTest);
|
// fcArrow, topInlinkRendering, afterEndwhile, fcTest);
|
||||||
|
|
||||||
// return createNude(swimlane, branches);
|
// return createNude(swimlane, branches);
|
||||||
return createWithDiamonds(swimlane, branches, labelTest);
|
// return createWithDiamonds(swimlane, branches, labelTest);
|
||||||
|
return createWithLinks(swimlane, branches, labelTest);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Ftile createNude(Swimlane swimlane, List<Branch> branches) {
|
private Ftile createNude(Swimlane swimlane, List<Branch> branches) {
|
||||||
@ -111,7 +107,27 @@ public class FtileFactoryDelegatorSwitch extends FtileFactoryDelegator {
|
|||||||
}
|
}
|
||||||
final Ftile diamond1 = getDiamond1(swimlane, branches.get(0), labelTest);
|
final Ftile diamond1 = getDiamond1(swimlane, branches.get(0), labelTest);
|
||||||
final Ftile diamond2 = getDiamond2(swimlane, branches.get(0));
|
final Ftile diamond2 = getDiamond2(swimlane, branches.get(0));
|
||||||
return new FtileSwitchWithDiamonds(ftiles, swimlane, diamond1, diamond2, getStringBounder());
|
|
||||||
|
return new FtileSwitchWithDiamonds(ftiles, branches, swimlane, diamond1, diamond2, getStringBounder());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Ftile createWithLinks(Swimlane swimlane, List<Branch> branches, Display labelTest) {
|
||||||
|
final List<Ftile> ftiles = new ArrayList<Ftile>();
|
||||||
|
for (Branch branch : branches) {
|
||||||
|
ftiles.add(new FtileMinWidth(branch.getFtile(), 30));
|
||||||
|
}
|
||||||
|
final Ftile diamond1 = getDiamond1(swimlane, branches.get(0), labelTest);
|
||||||
|
final Ftile diamond2 = getDiamond2(swimlane, branches.get(0));
|
||||||
|
final Rainbow arrowColor = HtmlColorAndStyle.build(skinParam());
|
||||||
|
if (ftiles.size() == 1) {
|
||||||
|
final FtileSwitchWithOneLink result = new FtileSwitchWithOneLink(ftiles, branches, swimlane, diamond1,
|
||||||
|
diamond2, getStringBounder(), arrowColor);
|
||||||
|
return result.addLinks();
|
||||||
|
}
|
||||||
|
final FtileSwitchWithManyLinks result = new FtileSwitchWithManyLinks(ftiles, branches, swimlane, diamond1,
|
||||||
|
diamond2, getStringBounder(), arrowColor);
|
||||||
|
return result.addLinks();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Ftile getDiamond1(Swimlane swimlane, Branch branch0, Display test) {
|
private Ftile getDiamond1(Swimlane swimlane, Branch branch0, Display test) {
|
||||||
|
@ -209,7 +209,7 @@ public class FtileGroup extends AbstractFtile {
|
|||||||
.withShadow(skinParam().shadowing(null)).withStroke(stroke).withCorner(roundCorner, 0);
|
.withShadow(skinParam().shadowing(null)).withStroke(stroke).withCorner(roundCorner, 0);
|
||||||
|
|
||||||
type.asBig(name, inner.skinParam().getHorizontalAlignment(AlignmentParam.packageTitleAlignment, null, false),
|
type.asBig(name, inner.skinParam().getHorizontalAlignment(AlignmentParam.packageTitleAlignment, null, false),
|
||||||
TextBlockUtils.empty(0, 0), dimTotal.getWidth(), dimTotal.getHeight(), symbolContext).drawU(ug);
|
TextBlockUtils.empty(0, 0), dimTotal.getWidth(), dimTotal.getHeight(), symbolContext, skinParam().getStereotypeAlignment()).drawU(ug);
|
||||||
|
|
||||||
final Dimension2D dimHeaderNote = headerNote.calculateDimension(stringBounder);
|
final Dimension2D dimHeaderNote = headerNote.calculateDimension(stringBounder);
|
||||||
headerNote.drawU(ug.apply(new UTranslate(dimTotal.getWidth() - dimHeaderNote.getWidth() - 10,
|
headerNote.drawU(ug.apply(new UTranslate(dimTotal.getWidth() - dimHeaderNote.getWidth() - 10,
|
||||||
|
@ -593,13 +593,22 @@ class FtileIfLongHorizontal extends AbstractFtile {
|
|||||||
for (Ftile couple : couples) {
|
for (Ftile couple : couples) {
|
||||||
result = Dimension2DDouble.mergeLR(result, couple.calculateDimension(stringBounder));
|
result = Dimension2DDouble.mergeLR(result, couple.calculateDimension(stringBounder));
|
||||||
}
|
}
|
||||||
final FtileGeometry dimTile2 = tile2.calculateDimension(stringBounder);
|
Dimension2D dimTile2 = tile2.calculateDimension(stringBounder);
|
||||||
|
dimTile2 = Dimension2DDouble.delta(dimTile2, 0, getDiamondsHeight(stringBounder) / 2);
|
||||||
result = Dimension2DDouble.mergeLR(result, dimTile2);
|
result = Dimension2DDouble.mergeLR(result, dimTile2);
|
||||||
result = Dimension2DDouble.delta(result, xSeparation * couples.size(), 100);
|
result = Dimension2DDouble.delta(result, xSeparation * couples.size(), 100);
|
||||||
|
|
||||||
return new FtileGeometry(result, result.getWidth() / 2, 0);
|
return new FtileGeometry(result, result.getWidth() / 2, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private double getDiamondsHeight(StringBounder stringBounder) {
|
||||||
|
double height = 0;
|
||||||
|
for (Ftile diamond : diamonds) {
|
||||||
|
height = Math.max(height, diamond.calculateDimension(stringBounder).getHeight());
|
||||||
|
}
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected FtileGeometry calculateDimensionFtile(StringBounder stringBounder) {
|
protected FtileGeometry calculateDimensionFtile(StringBounder stringBounder) {
|
||||||
final Dimension2D dimTotal = calculateDimensionInternal(stringBounder);
|
final Dimension2D dimTotal = calculateDimensionInternal(stringBounder);
|
||||||
|
@ -70,6 +70,7 @@ import net.sourceforge.plantuml.graphic.HtmlColor;
|
|||||||
import net.sourceforge.plantuml.graphic.Rainbow;
|
import net.sourceforge.plantuml.graphic.Rainbow;
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||||
|
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||||
import net.sourceforge.plantuml.svek.ConditionStyle;
|
import net.sourceforge.plantuml.svek.ConditionStyle;
|
||||||
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
|
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
|
||||||
import net.sourceforge.plantuml.ugraphic.UChangeColor;
|
import net.sourceforge.plantuml.ugraphic.UChangeColor;
|
||||||
@ -118,8 +119,8 @@ class FtileWhile extends AbstractFtile {
|
|||||||
ConditionStyle conditionStyle, FontConfiguration fcTest, Instruction specialOut) {
|
ConditionStyle conditionStyle, FontConfiguration fcTest, Instruction specialOut) {
|
||||||
|
|
||||||
final TextBlock yesTb = yes.create(fontArrow, HorizontalAlignment.LEFT, ftileFactory.skinParam());
|
final TextBlock yesTb = yes.create(fontArrow, HorizontalAlignment.LEFT, ftileFactory.skinParam());
|
||||||
final TextBlock testTb = test.create(fcTest,
|
final TextBlock testTb = test.isWhite() ? TextBlockUtils.empty(0, 0) : test.create(fcTest, whileBlock
|
||||||
whileBlock.skinParam().getDefaultTextAlignment(HorizontalAlignment.LEFT), ftileFactory.skinParam());
|
.skinParam().getDefaultTextAlignment(HorizontalAlignment.LEFT), ftileFactory.skinParam());
|
||||||
final TextBlock out = out2.create(fontArrow, HorizontalAlignment.LEFT, ftileFactory.skinParam());
|
final TextBlock out = out2.create(fontArrow, HorizontalAlignment.LEFT, ftileFactory.skinParam());
|
||||||
|
|
||||||
final Ftile diamond1;
|
final Ftile diamond1;
|
||||||
|
@ -119,18 +119,15 @@ public class FtileIfWithLinks extends FtileIfWithDiamonds {
|
|||||||
|
|
||||||
private Point2D getP1(StringBounder stringBounder) {
|
private Point2D getP1(StringBounder stringBounder) {
|
||||||
final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder);
|
final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder);
|
||||||
final double diamondWidth = dimDiamond1.getWidth();
|
final Point2D pt;
|
||||||
final double x;
|
|
||||||
if (getFtile2() == tile1) {
|
if (getFtile2() == tile1) {
|
||||||
x = 0;
|
pt = dimDiamond1.getPointD();
|
||||||
} else if (getFtile2() == tile2) {
|
} else if (getFtile2() == tile2) {
|
||||||
x = diamondWidth;
|
pt = dimDiamond1.getPointB();
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
final double half = (dimDiamond1.getOutY() - dimDiamond1.getInY()) / 2;
|
return getTranslateDiamond1(stringBounder).getTranslated(pt);
|
||||||
return getTranslateDiamond1(stringBounder)
|
|
||||||
.getTranslated(new Point2D.Double(x, dimDiamond1.getInY() + half));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Point2D getP2(final StringBounder stringBounder) {
|
private Point2D getP2(final StringBounder stringBounder) {
|
||||||
@ -214,18 +211,16 @@ public class FtileIfWithLinks extends FtileIfWithDiamonds {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Point2D getP2(StringBounder stringBounder) {
|
private Point2D getP2(StringBounder stringBounder) {
|
||||||
final Dimension2D dimDiamond2 = diamond2.calculateDimension(stringBounder);
|
final FtileGeometry dimDiamond2 = diamond2.calculateDimension(stringBounder);
|
||||||
final double diamondWidth = dimDiamond2.getWidth();
|
final Point2D pt;
|
||||||
final double x;
|
|
||||||
if (getFtile1() == tile1) {
|
if (getFtile1() == tile1) {
|
||||||
x = 0;
|
pt = dimDiamond2.getPointD();
|
||||||
} else if (getFtile1() == tile2) {
|
} else if (getFtile1() == tile2) {
|
||||||
x = diamondWidth;
|
pt = dimDiamond2.getPointB();
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
return getTranslateDiamond2(stringBounder)
|
return getTranslateDiamond2(stringBounder).getTranslated(pt);
|
||||||
.getTranslated(new Point2D.Double(x, dimDiamond2.getHeight() / 2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private UTranslate translate(StringBounder stringBounder) {
|
private UTranslate translate(StringBounder stringBounder) {
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
package net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond;
|
package net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond;
|
||||||
|
|
||||||
import java.awt.geom.Dimension2D;
|
import java.awt.geom.Dimension2D;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -91,12 +90,12 @@ public class FtileSwitchNude extends FtileDimensionMemoize {
|
|||||||
@Override
|
@Override
|
||||||
public UTranslate getTranslateFor(Ftile child, StringBounder stringBounder) {
|
public UTranslate getTranslateFor(Ftile child, StringBounder stringBounder) {
|
||||||
if (tiles.contains(child)) {
|
if (tiles.contains(child)) {
|
||||||
return getTranslate1(child, stringBounder);
|
return getTranslateNude(child, stringBounder);
|
||||||
}
|
}
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private UTranslate getTranslate1(Ftile tile, StringBounder stringBounder) {
|
protected UTranslate getTranslateNude(Ftile tile, StringBounder stringBounder) {
|
||||||
double x1 = 0;
|
double x1 = 0;
|
||||||
for (Ftile candidate : tiles) {
|
for (Ftile candidate : tiles) {
|
||||||
final FtileGeometry dim1 = candidate.calculateDimension(stringBounder);
|
final FtileGeometry dim1 = candidate.calculateDimension(stringBounder);
|
||||||
@ -111,7 +110,7 @@ public class FtileSwitchNude extends FtileDimensionMemoize {
|
|||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
final StringBounder stringBounder = ug.getStringBounder();
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
for (Ftile tile : tiles) {
|
for (Ftile tile : tiles) {
|
||||||
ug.apply(getTranslate1(tile, stringBounder)).draw(tile);
|
ug.apply(getTranslateNude(tile, stringBounder)).draw(tile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,18 +35,21 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond;
|
package net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond;
|
||||||
|
|
||||||
import java.awt.geom.Dimension2D;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.FontParam;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.Branch;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
||||||
|
import net.sourceforge.plantuml.creole.CreoleMode;
|
||||||
|
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||||
|
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
import net.sourceforge.plantuml.ugraphic.UChange;
|
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
|
|
||||||
@ -54,10 +57,12 @@ public class FtileSwitchWithDiamonds extends FtileSwitchNude {
|
|||||||
|
|
||||||
protected final Ftile diamond1;
|
protected final Ftile diamond1;
|
||||||
protected final Ftile diamond2;
|
protected final Ftile diamond2;
|
||||||
|
protected final List<Branch> branches;
|
||||||
|
|
||||||
public FtileSwitchWithDiamonds(List<Ftile> tiles, Swimlane in, Ftile diamond1, Ftile diamond2,
|
public FtileSwitchWithDiamonds(List<Ftile> tiles, List<Branch> branches, Swimlane in, Ftile diamond1,
|
||||||
StringBounder stringBounder) {
|
Ftile diamond2, StringBounder stringBounder) {
|
||||||
super(tiles, in);
|
super(tiles, in);
|
||||||
|
this.branches = branches;
|
||||||
this.diamond1 = diamond1;
|
this.diamond1 = diamond1;
|
||||||
this.diamond2 = diamond2;
|
this.diamond2 = diamond2;
|
||||||
}
|
}
|
||||||
@ -96,11 +101,11 @@ public class FtileSwitchWithDiamonds extends FtileSwitchNude {
|
|||||||
final StringBounder stringBounder = ug.getStringBounder();
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
|
||||||
ug.apply(getTranslateDiamond1(stringBounder)).draw(diamond1);
|
ug.apply(getTranslateDiamond1(stringBounder)).draw(diamond1);
|
||||||
super.drawU(ug.apply(getUTranslateMain(stringBounder)));
|
super.drawU(ug.apply(getTranslateMain(stringBounder)));
|
||||||
ug.apply(getTranslateDiamond2(stringBounder)).draw(diamond2);
|
ug.apply(getTranslateDiamond2(stringBounder)).draw(diamond2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private UChange getUTranslateMain(StringBounder stringBounder) {
|
protected UTranslate getTranslateMain(StringBounder stringBounder) {
|
||||||
final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder);
|
final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder);
|
||||||
return new UTranslate(0, dimDiamond1.getHeight() + getYdelta1a(stringBounder));
|
return new UTranslate(0, dimDiamond1.getHeight() + getYdelta1a(stringBounder));
|
||||||
}
|
}
|
||||||
@ -121,4 +126,15 @@ public class FtileSwitchWithDiamonds extends FtileSwitchNude {
|
|||||||
return new UTranslate(x2, y2);
|
return new UTranslate(x2, y2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected UTranslate getTranslateOf(Ftile tile, StringBounder stringBounder) {
|
||||||
|
return getTranslateNude(tile, stringBounder).compose(getTranslateMain(stringBounder));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TextBlock getLabelPositive(Branch branch) {
|
||||||
|
final FontConfiguration fcArrow = new FontConfiguration(skinParam(), FontParam.ARROW, null);
|
||||||
|
return branch.getLabelPositive().create(fcArrow, HorizontalAlignment.LEFT, skinParam(), CreoleMode.SIMPLE_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,280 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2020, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: http://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* http://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* http://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* 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 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.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond;
|
||||||
|
|
||||||
|
import java.awt.geom.Point2D;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.Branch;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractConnection;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Arrows;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Connection;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileUtils;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Snake;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
||||||
|
import net.sourceforge.plantuml.graphic.Rainbow;
|
||||||
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UPolygon;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
|
|
||||||
|
public class FtileSwitchWithManyLinks extends FtileSwitchWithDiamonds {
|
||||||
|
|
||||||
|
private final Rainbow arrowColor;
|
||||||
|
private final double margin = 10;
|
||||||
|
|
||||||
|
public FtileSwitchWithManyLinks(List<Ftile> tiles, List<Branch> branches, Swimlane in, Ftile diamond1,
|
||||||
|
Ftile diamond2, StringBounder stringBounder, Rainbow arrowColor) {
|
||||||
|
super(tiles, branches, in, diamond1, diamond2, stringBounder);
|
||||||
|
this.arrowColor = arrowColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConnectionHorizontalThenVertical extends AbstractConnection {
|
||||||
|
|
||||||
|
private final Branch branch;
|
||||||
|
|
||||||
|
public ConnectionHorizontalThenVertical(Ftile tile, Branch branch) {
|
||||||
|
super(diamond1, tile);
|
||||||
|
this.branch = branch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
final Point2D p1 = getP1(stringBounder);
|
||||||
|
final Point2D p2 = getP2(stringBounder);
|
||||||
|
final double x1 = p1.getX();
|
||||||
|
final double y1 = p1.getY();
|
||||||
|
final double x2 = p2.getX();
|
||||||
|
final double y2 = p2.getY();
|
||||||
|
|
||||||
|
final Snake snake = new Snake(null, arrowHorizontalAlignment(), arrowColor, Arrows.asToDown());
|
||||||
|
snake.setLabel(getLabelPositive(branch));
|
||||||
|
snake.addPoint(x1, y1);
|
||||||
|
snake.addPoint(x2, y1);
|
||||||
|
snake.addPoint(x2, y2);
|
||||||
|
|
||||||
|
ug.draw(snake);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP1(StringBounder stringBounder) {
|
||||||
|
final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder);
|
||||||
|
final Point2D pt;
|
||||||
|
if (getFtile2() == tiles.get(0)) {
|
||||||
|
pt = dimDiamond1.getPointD();
|
||||||
|
} else if (getFtile2() == tiles.get(tiles.size() - 1)) {
|
||||||
|
pt = dimDiamond1.getPointB();
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
return getTranslateDiamond1(stringBounder).getTranslated(pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP2(final StringBounder stringBounder) {
|
||||||
|
return getTranslateOf(getFtile2(), stringBounder).getTranslated(
|
||||||
|
getFtile2().calculateDimension(stringBounder).getPointIn());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConnectionVerticalThenHorizontal extends AbstractConnection {
|
||||||
|
|
||||||
|
public ConnectionVerticalThenHorizontal(Ftile tile) {
|
||||||
|
super(tile, diamond2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
final FtileGeometry geo = getFtile1().calculateDimension(stringBounder);
|
||||||
|
if (geo.hasPointOut() == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final Point2D p1 = getP1(stringBounder);
|
||||||
|
final Point2D p2 = getP2(stringBounder);
|
||||||
|
|
||||||
|
final double x1 = p1.getX();
|
||||||
|
final double y1 = p1.getY();
|
||||||
|
final double x2 = p2.getX();
|
||||||
|
final double y2 = p2.getY();
|
||||||
|
|
||||||
|
final UPolygon arrow = x2 > x1 ? Arrows.asToRight() : Arrows.asToLeft();
|
||||||
|
final Snake snake = new Snake(arrowHorizontalAlignment(), arrowColor, arrow);
|
||||||
|
snake.addPoint(x1, y1);
|
||||||
|
snake.addPoint(x1, y2);
|
||||||
|
snake.addPoint(x2, y2);
|
||||||
|
|
||||||
|
ug.draw(snake);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP1(StringBounder stringBounder) {
|
||||||
|
return getTranslateOf(getFtile1(), stringBounder).getTranslated(
|
||||||
|
getFtile1().calculateDimension(stringBounder).getPointOut());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP2(StringBounder stringBounder) {
|
||||||
|
final FtileGeometry dimDiamond2 = diamond2.calculateDimension(stringBounder);
|
||||||
|
final Point2D pt;
|
||||||
|
if (getFtile1() == tiles.get(0)) {
|
||||||
|
pt = dimDiamond2.getPointD();
|
||||||
|
} else if (getFtile1() == tiles.get(tiles.size() - 1)) {
|
||||||
|
pt = dimDiamond2.getPointB();
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
return getTranslateDiamond2(stringBounder).getTranslated(pt);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected UTranslate getTranslateOf(Ftile tile, StringBounder stringBounder) {
|
||||||
|
return getTranslateNude(tile, stringBounder).compose(getTranslateMain(stringBounder));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConnectionVerticalTop extends AbstractConnection {
|
||||||
|
|
||||||
|
private final Branch branch;
|
||||||
|
|
||||||
|
public ConnectionVerticalTop(Ftile tile, Branch branch) {
|
||||||
|
super(diamond1, tile);
|
||||||
|
this.branch = branch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder);
|
||||||
|
final UTranslate translateDiamond1 = getTranslateDiamond1(stringBounder);
|
||||||
|
final Point2D p1b = translateDiamond1.getTranslated(dimDiamond1.getPointB());
|
||||||
|
final Point2D p1c = translateDiamond1.getTranslated(dimDiamond1.getPointC());
|
||||||
|
final Point2D p1d = translateDiamond1.getTranslated(dimDiamond1.getPointD());
|
||||||
|
|
||||||
|
final Point2D p2 = getP2(stringBounder);
|
||||||
|
final double x2 = p2.getX();
|
||||||
|
final double y2 = p2.getY();
|
||||||
|
|
||||||
|
final Snake snake = new Snake(null, arrowHorizontalAlignment(), arrowColor, Arrows.asToDown());
|
||||||
|
snake.setLabel(getLabelPositive(branch));
|
||||||
|
if (x2 < p1d.getX() - margin || x2 > p1b.getX() + margin) {
|
||||||
|
snake.addPoint(x2, p1d.getY());
|
||||||
|
snake.addPoint(x2, y2);
|
||||||
|
} else {
|
||||||
|
final double x1 = p1c.getX();
|
||||||
|
final double y1 = p1c.getY();
|
||||||
|
|
||||||
|
final double ym = (y1 * 2 + y2) / 3;
|
||||||
|
snake.addPoint(x1, y1);
|
||||||
|
snake.addPoint(x1, ym);
|
||||||
|
snake.addPoint(x2, ym);
|
||||||
|
snake.addPoint(x2, y2);
|
||||||
|
}
|
||||||
|
ug.draw(snake);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP2(final StringBounder stringBounder) {
|
||||||
|
return getTranslateOf(getFtile2(), stringBounder).getTranslated(
|
||||||
|
getFtile2().calculateDimension(stringBounder).getPointIn());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConnectionVerticalBottom extends AbstractConnection {
|
||||||
|
|
||||||
|
public ConnectionVerticalBottom(Ftile tile) {
|
||||||
|
super(tile, diamond2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
final Point2D p1 = getP1(stringBounder);
|
||||||
|
final FtileGeometry dimDiamond2 = diamond2.calculateDimension(stringBounder);
|
||||||
|
final UTranslate translateDiamond2 = getTranslateDiamond2(stringBounder);
|
||||||
|
final Point2D p2a = translateDiamond2.getTranslated(dimDiamond2.getPointA());
|
||||||
|
final Point2D p2b = translateDiamond2.getTranslated(dimDiamond2.getPointB());
|
||||||
|
final Point2D p2d = translateDiamond2.getTranslated(dimDiamond2.getPointD());
|
||||||
|
|
||||||
|
final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder);
|
||||||
|
final UTranslate translateDiamond1 = getTranslateDiamond1(stringBounder);
|
||||||
|
final Point2D p1b = translateDiamond1.getTranslated(dimDiamond1.getPointB());
|
||||||
|
final Point2D p1c = translateDiamond1.getTranslated(dimDiamond1.getPointC());
|
||||||
|
final Point2D p1d = translateDiamond1.getTranslated(dimDiamond1.getPointD());
|
||||||
|
|
||||||
|
final double x1 = p1.getX();
|
||||||
|
final double y1 = p1.getY();
|
||||||
|
final double x2 = p2a.getX();
|
||||||
|
final double y2 = p2a.getY();
|
||||||
|
|
||||||
|
final double ym = (y1 + y2) / 2;
|
||||||
|
|
||||||
|
final Snake snake = new Snake(null, arrowHorizontalAlignment(), arrowColor, Arrows.asToDown());
|
||||||
|
|
||||||
|
if (x1 < p1d.getX() - margin || x1 > p1b.getX() + margin) {
|
||||||
|
snake.addPoint(x1, y1);
|
||||||
|
snake.addPoint(x1, p2d.getY());
|
||||||
|
} else {
|
||||||
|
snake.addPoint(x1, y1);
|
||||||
|
snake.addPoint(x1, ym);
|
||||||
|
snake.addPoint(x2, ym);
|
||||||
|
snake.addPoint(x2, y2);
|
||||||
|
}
|
||||||
|
|
||||||
|
ug.draw(snake);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP1(StringBounder stringBounder) {
|
||||||
|
return getTranslateOf(getFtile1(), stringBounder).getTranslated(
|
||||||
|
getFtile1().calculateDimension(stringBounder).getPointOut());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Ftile addLinks() {
|
||||||
|
final List<Connection> conns = new ArrayList<Connection>();
|
||||||
|
conns.add(new ConnectionHorizontalThenVertical(tiles.get(0), branches.get(0)));
|
||||||
|
conns.add(new ConnectionHorizontalThenVertical(tiles.get(tiles.size() - 1), branches.get(tiles.size() - 1)));
|
||||||
|
conns.add(new ConnectionVerticalThenHorizontal(tiles.get(0)));
|
||||||
|
conns.add(new ConnectionVerticalThenHorizontal(tiles.get(tiles.size() - 1)));
|
||||||
|
for (int i = 1; i < tiles.size() - 1; i++) {
|
||||||
|
conns.add(new ConnectionVerticalTop(tiles.get(i), branches.get(i)));
|
||||||
|
conns.add(new ConnectionVerticalBottom(tiles.get(i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return FtileUtils.addConnection(this, conns);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,150 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2020, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: http://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* http://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* http://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* 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 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.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond;
|
||||||
|
|
||||||
|
import java.awt.geom.Point2D;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.FontParam;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.Branch;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractConnection;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Arrows;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Connection;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileUtils;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Snake;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
||||||
|
import net.sourceforge.plantuml.creole.CreoleMode;
|
||||||
|
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||||
|
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||||
|
import net.sourceforge.plantuml.graphic.Rainbow;
|
||||||
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
|
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
|
|
||||||
|
public class FtileSwitchWithOneLink extends FtileSwitchWithDiamonds {
|
||||||
|
|
||||||
|
private final Rainbow arrowColor;
|
||||||
|
|
||||||
|
public FtileSwitchWithOneLink(List<Ftile> tiles, List<Branch> branches, Swimlane in, Ftile diamond1,
|
||||||
|
Ftile diamond2, StringBounder stringBounder, Rainbow arrowColor) {
|
||||||
|
super(tiles, branches, in, diamond1, diamond2, stringBounder);
|
||||||
|
this.arrowColor = arrowColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConnectionVerticalTop extends AbstractConnection {
|
||||||
|
|
||||||
|
private final Branch branch;
|
||||||
|
|
||||||
|
public ConnectionVerticalTop(Ftile tile, Branch branch) {
|
||||||
|
super(diamond1, tile);
|
||||||
|
this.branch = branch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
final Point2D p1 = getP1(stringBounder);
|
||||||
|
final Point2D p2 = getP2(stringBounder);
|
||||||
|
final double x1 = p1.getX();
|
||||||
|
final double y1 = p1.getY();
|
||||||
|
final double x2 = p2.getX();
|
||||||
|
final double y2 = p2.getY();
|
||||||
|
|
||||||
|
final Snake snake = new Snake(null, arrowHorizontalAlignment(), arrowColor, Arrows.asToDown());
|
||||||
|
snake.setLabel(getLabelPositive(branch));
|
||||||
|
// snake.addPoint(x1, y1);
|
||||||
|
snake.addPoint(x2, y1);
|
||||||
|
snake.addPoint(x2, y2);
|
||||||
|
|
||||||
|
ug.draw(snake);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP1(StringBounder stringBounder) {
|
||||||
|
final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder);
|
||||||
|
return getTranslateDiamond1(stringBounder).getTranslated(dimDiamond1.getPointC());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP2(final StringBounder stringBounder) {
|
||||||
|
return getTranslateOf(getFtile2(), stringBounder).getTranslated(
|
||||||
|
getFtile2().calculateDimension(stringBounder).getPointIn());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConnectionVerticalBottom extends AbstractConnection {
|
||||||
|
|
||||||
|
public ConnectionVerticalBottom(Ftile tile) {
|
||||||
|
super(tile, diamond2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
final Point2D p1 = getP1(stringBounder);
|
||||||
|
final Point2D p2 = getP2(stringBounder);
|
||||||
|
final double x1 = p1.getX();
|
||||||
|
final double y1 = p1.getY();
|
||||||
|
final double x2 = p2.getX();
|
||||||
|
final double y2 = p2.getY();
|
||||||
|
|
||||||
|
final Snake snake = new Snake(null, arrowHorizontalAlignment(), arrowColor, Arrows.asToDown());
|
||||||
|
// snake.addPoint(x1, y1);
|
||||||
|
snake.addPoint(x2, y1);
|
||||||
|
snake.addPoint(x2, y2);
|
||||||
|
|
||||||
|
ug.draw(snake);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP1(StringBounder stringBounder) {
|
||||||
|
return getTranslateOf(getFtile1(), stringBounder).getTranslated(
|
||||||
|
getFtile1().calculateDimension(stringBounder).getPointOut());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point2D getP2(StringBounder stringBounder) {
|
||||||
|
final FtileGeometry dimDiamond2 = diamond2.calculateDimension(stringBounder);
|
||||||
|
return getTranslateDiamond2(stringBounder).getTranslated(dimDiamond2.getPointA());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Ftile addLinks() {
|
||||||
|
final List<Connection> conns = new ArrayList<Connection>();
|
||||||
|
conns.add(new ConnectionVerticalTop(tiles.get(0), branches.get(0)));
|
||||||
|
conns.add(new ConnectionVerticalBottom(tiles.get(0)));
|
||||||
|
|
||||||
|
return FtileUtils.addConnection(this, conns);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -48,7 +48,6 @@ import java.util.List;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.BackSlash;
|
import net.sourceforge.plantuml.BackSlash;
|
||||||
import net.sourceforge.plantuml.LineLocation;
|
import net.sourceforge.plantuml.LineLocation;
|
||||||
import net.sourceforge.plantuml.LineLocationImpl;
|
|
||||||
import net.sourceforge.plantuml.StringLocated;
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
|
|
||||||
|
@ -35,14 +35,17 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.command;
|
package net.sourceforge.plantuml.command;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.AbstractPSystem;
|
import java.util.List;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.ErrorUml;
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
import net.sourceforge.plantuml.ErrorUmlType;
|
import net.sourceforge.plantuml.ErrorUmlType;
|
||||||
import net.sourceforge.plantuml.LineLocation;
|
import net.sourceforge.plantuml.LineLocation;
|
||||||
import net.sourceforge.plantuml.PSystemError;
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
import net.sourceforge.plantuml.api.PSystemFactory;
|
import net.sourceforge.plantuml.api.PSystemFactory;
|
||||||
import net.sourceforge.plantuml.core.DiagramType;
|
import net.sourceforge.plantuml.core.DiagramType;
|
||||||
import net.sourceforge.plantuml.core.UmlSource;
|
import net.sourceforge.plantuml.core.UmlSource;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemErrorUtils;
|
||||||
|
|
||||||
public abstract class PSystemAbstractFactory implements PSystemFactory {
|
public abstract class PSystemAbstractFactory implements PSystemFactory {
|
||||||
|
|
||||||
@ -53,17 +56,20 @@ public abstract class PSystemAbstractFactory implements PSystemFactory {
|
|||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
final protected AbstractPSystem buildEmptyError(UmlSource source, LineLocation lineLocation) {
|
final protected PSystemError buildEmptyError(UmlSource source, LineLocation lineLocation,
|
||||||
|
List<StringLocated> trace) {
|
||||||
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, EMPTY_DESCRIPTION, /* 1, */lineLocation);
|
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, EMPTY_DESCRIPTION, /* 1, */lineLocation);
|
||||||
final PSystemError result = new PSystemError(source, err, null);
|
// final AbstractPSystemError result = PSystemErrorUtils.buildV1(source, err, null);
|
||||||
|
final PSystemError result = PSystemErrorUtils.buildV2(source, err, null, trace);
|
||||||
result.setSource(source);
|
result.setSource(source);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
final protected PSystemError buildExecutionError(UmlSource source, String stringError, LineLocation lineLocation) {
|
final protected PSystemError buildExecutionError(UmlSource source, String stringError,
|
||||||
|
LineLocation lineLocation, List<StringLocated> trace) {
|
||||||
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, stringError, /* 1, */
|
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, stringError, /* 1, */
|
||||||
lineLocation);
|
lineLocation);
|
||||||
final PSystemError result = new PSystemError(source, err, null);
|
final PSystemError result = PSystemErrorUtils.buildV2(source, err, null, trace);
|
||||||
result.setSource(source);
|
result.setSource(source);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -38,11 +38,11 @@ package net.sourceforge.plantuml.command;
|
|||||||
import net.sourceforge.plantuml.AbstractPSystem;
|
import net.sourceforge.plantuml.AbstractPSystem;
|
||||||
import net.sourceforge.plantuml.ErrorUml;
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
import net.sourceforge.plantuml.ErrorUmlType;
|
import net.sourceforge.plantuml.ErrorUmlType;
|
||||||
import net.sourceforge.plantuml.PSystemError;
|
|
||||||
import net.sourceforge.plantuml.StringLocated;
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
import net.sourceforge.plantuml.core.DiagramType;
|
import net.sourceforge.plantuml.core.DiagramType;
|
||||||
import net.sourceforge.plantuml.core.UmlSource;
|
import net.sourceforge.plantuml.core.UmlSource;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemErrorUtils;
|
||||||
import net.sourceforge.plantuml.utils.StartUtils;
|
import net.sourceforge.plantuml.utils.StartUtils;
|
||||||
import net.sourceforge.plantuml.version.IteratorCounter2;
|
import net.sourceforge.plantuml.version.IteratorCounter2;
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ public abstract class PSystemBasicFactory<P extends AbstractPSystem> extends PSy
|
|||||||
first = false;
|
first = false;
|
||||||
if (StartUtils.isArobaseEndDiagram(s.getString())) {
|
if (StartUtils.isArobaseEndDiagram(s.getString())) {
|
||||||
if (source.getTotalLineCount() == 2 && source.isStartDef() == false) {
|
if (source.getTotalLineCount() == 2 && source.isStartDef() == false) {
|
||||||
return buildEmptyError(source, s.getLocation());
|
return buildEmptyError(source, s.getLocation(), it.getTrace());
|
||||||
}
|
}
|
||||||
if (system != null) {
|
if (system != null) {
|
||||||
system.setSource(source);
|
system.setSource(source);
|
||||||
@ -90,7 +90,8 @@ public abstract class PSystemBasicFactory<P extends AbstractPSystem> extends PSy
|
|||||||
system = executeLine(system, s.getString());
|
system = executeLine(system, s.getString());
|
||||||
if (system == null) {
|
if (system == null) {
|
||||||
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", s.getLocation());
|
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", s.getLocation());
|
||||||
return new PSystemError(source, err, null);
|
// return PSystemErrorUtils.buildV1(source, err, null);
|
||||||
|
return PSystemErrorUtils.buildV2(source, err, null, it.getTrace());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (system != null) {
|
if (system != null) {
|
||||||
|
@ -38,11 +38,12 @@ package net.sourceforge.plantuml.command;
|
|||||||
import net.sourceforge.plantuml.AbstractPSystem;
|
import net.sourceforge.plantuml.AbstractPSystem;
|
||||||
import net.sourceforge.plantuml.ErrorUml;
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
import net.sourceforge.plantuml.ErrorUmlType;
|
import net.sourceforge.plantuml.ErrorUmlType;
|
||||||
import net.sourceforge.plantuml.PSystemError;
|
import net.sourceforge.plantuml.LineLocation;
|
||||||
import net.sourceforge.plantuml.StringLocated;
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
import net.sourceforge.plantuml.core.DiagramType;
|
import net.sourceforge.plantuml.core.DiagramType;
|
||||||
import net.sourceforge.plantuml.core.UmlSource;
|
import net.sourceforge.plantuml.core.UmlSource;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemErrorUtils;
|
||||||
import net.sourceforge.plantuml.utils.StartUtils;
|
import net.sourceforge.plantuml.utils.StartUtils;
|
||||||
import net.sourceforge.plantuml.version.IteratorCounter2;
|
import net.sourceforge.plantuml.version.IteratorCounter2;
|
||||||
|
|
||||||
@ -61,7 +62,8 @@ public abstract class PSystemSingleLineFactory extends PSystemAbstractFactory {
|
|||||||
}
|
}
|
||||||
final IteratorCounter2 it = source.iterator2();
|
final IteratorCounter2 it = source.iterator2();
|
||||||
if (source.isEmpty()) {
|
if (source.isEmpty()) {
|
||||||
return buildEmptyError(source, it.peek().getLocation());
|
final LineLocation location = it.next().getLocation();
|
||||||
|
return buildEmptyError(source, location, it.getTrace());
|
||||||
}
|
}
|
||||||
|
|
||||||
final StringLocated startLine = it.next();
|
final StringLocated startLine = it.next();
|
||||||
@ -70,17 +72,17 @@ public abstract class PSystemSingleLineFactory extends PSystemAbstractFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (it.hasNext() == false) {
|
if (it.hasNext() == false) {
|
||||||
return buildEmptyError(source, startLine.getLocation());
|
return buildEmptyError(source, startLine.getLocation(), it.getTrace());
|
||||||
}
|
}
|
||||||
final StringLocated s = it.next();
|
final StringLocated s = it.next();
|
||||||
if (StartUtils.isArobaseEndDiagram(s.getString())) {
|
if (StartUtils.isArobaseEndDiagram(s.getString())) {
|
||||||
return buildEmptyError(source, s.getLocation());
|
return buildEmptyError(source, s.getLocation(), it.getTrace());
|
||||||
}
|
}
|
||||||
final AbstractPSystem sys = executeLine(s.getString());
|
final AbstractPSystem sys = executeLine(s.getString());
|
||||||
if (sys == null) {
|
if (sys == null) {
|
||||||
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?",
|
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", s.getLocation());
|
||||||
/* it.currentNum() - 1, */s.getLocation());
|
// return PSystemErrorUtils.buildV1(source, err, null);
|
||||||
return new PSystemError(source, err, null);
|
return PSystemErrorUtils.buildV2(source, err, null, it.getTrace());
|
||||||
}
|
}
|
||||||
sys.setSource(source);
|
sys.setSource(source);
|
||||||
return sys;
|
return sys;
|
||||||
|
@ -36,11 +36,11 @@
|
|||||||
package net.sourceforge.plantuml.command;
|
package net.sourceforge.plantuml.command;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.LineLocation;
|
import net.sourceforge.plantuml.LineLocation;
|
||||||
import net.sourceforge.plantuml.PSystemError;
|
|
||||||
import net.sourceforge.plantuml.StringLocated;
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
|
|
||||||
public abstract class SingleLineCommand2<S extends Diagram> implements Command<S> {
|
public abstract class SingleLineCommand2<S extends Diagram> implements Command<S> {
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ import java.util.List;
|
|||||||
import net.sourceforge.plantuml.AbstractPSystem;
|
import net.sourceforge.plantuml.AbstractPSystem;
|
||||||
import net.sourceforge.plantuml.ErrorUml;
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
import net.sourceforge.plantuml.ErrorUmlType;
|
import net.sourceforge.plantuml.ErrorUmlType;
|
||||||
import net.sourceforge.plantuml.PSystemError;
|
import net.sourceforge.plantuml.LineLocation;
|
||||||
import net.sourceforge.plantuml.StringLocated;
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
import net.sourceforge.plantuml.StringUtils;
|
import net.sourceforge.plantuml.StringUtils;
|
||||||
import net.sourceforge.plantuml.classdiagram.command.CommandHideShowByGender;
|
import net.sourceforge.plantuml.classdiagram.command.CommandHideShowByGender;
|
||||||
@ -51,6 +51,8 @@ import net.sourceforge.plantuml.classdiagram.command.CommandHideShowByVisibility
|
|||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
import net.sourceforge.plantuml.core.DiagramType;
|
import net.sourceforge.plantuml.core.DiagramType;
|
||||||
import net.sourceforge.plantuml.core.UmlSource;
|
import net.sourceforge.plantuml.core.UmlSource;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemError;
|
||||||
|
import net.sourceforge.plantuml.error.PSystemErrorUtils;
|
||||||
import net.sourceforge.plantuml.sequencediagram.command.CommandSkin;
|
import net.sourceforge.plantuml.sequencediagram.command.CommandSkin;
|
||||||
import net.sourceforge.plantuml.utils.StartUtils;
|
import net.sourceforge.plantuml.utils.StartUtils;
|
||||||
import net.sourceforge.plantuml.version.IteratorCounter2;
|
import net.sourceforge.plantuml.version.IteratorCounter2;
|
||||||
@ -76,7 +78,8 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (source.isEmpty()) {
|
if (source.isEmpty()) {
|
||||||
return buildEmptyError(source, startLine.getLocation());
|
it.next();
|
||||||
|
return buildEmptyError(source, startLine.getLocation(), it.getTrace());
|
||||||
}
|
}
|
||||||
AbstractPSystem sys = createEmptyDiagram();
|
AbstractPSystem sys = createEmptyDiagram();
|
||||||
|
|
||||||
@ -87,10 +90,12 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
|
|||||||
}
|
}
|
||||||
final String err = sys.checkFinalError();
|
final String err = sys.checkFinalError();
|
||||||
if (err != null) {
|
if (err != null) {
|
||||||
return buildExecutionError(source, err, it.peek().getLocation());
|
final LineLocation location = it.next().getLocation();
|
||||||
|
return buildExecutionError(source, err, location, it.getTrace());
|
||||||
}
|
}
|
||||||
if (source.getTotalLineCount() == 2) {
|
if (source.getTotalLineCount() == 2) {
|
||||||
return buildEmptyError(source, it.peek().getLocation());
|
final LineLocation location = it.next().getLocation();
|
||||||
|
return buildEmptyError(source, location, it.getTrace());
|
||||||
}
|
}
|
||||||
sys.makeDiagramReady();
|
sys.makeDiagramReady();
|
||||||
if (sys.isOk() == false) {
|
if (sys.isOk() == false) {
|
||||||
@ -113,14 +118,15 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
|
|||||||
final Step step = getCandidate(it);
|
final Step step = getCandidate(it);
|
||||||
if (step == null) {
|
if (step == null) {
|
||||||
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", it.peek().getLocation());
|
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", it.peek().getLocation());
|
||||||
return new PSystemError(source, err, null);
|
it.next();
|
||||||
|
return PSystemErrorUtils.buildV2(source, err, null, it.getTrace());
|
||||||
}
|
}
|
||||||
|
|
||||||
final CommandExecutionResult result = sys.executeCommand(step.command, step.blocLines);
|
final CommandExecutionResult result = sys.executeCommand(step.command, step.blocLines);
|
||||||
if (result.isOk() == false) {
|
if (result.isOk() == false) {
|
||||||
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
|
final ErrorUml err = new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
|
||||||
((StringLocated) step.blocLines.getFirst499()).getLocation());
|
((StringLocated) step.blocLines.getFirst499()).getLocation());
|
||||||
sys = new PSystemError(source, err, result.getDebugLines());
|
sys = PSystemErrorUtils.buildV2(source, err, result.getDebugLines(), it.getTrace());
|
||||||
}
|
}
|
||||||
if (result.getNewDiagram() != null) {
|
if (result.getNewDiagram() != null) {
|
||||||
sys = result.getNewDiagram();
|
sys = result.getNewDiagram();
|
||||||
|
@ -35,6 +35,8 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.command.note.sequence;
|
package net.sourceforge.plantuml.command.note.sequence;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.ColorParam;
|
||||||
|
import net.sourceforge.plantuml.FontParam;
|
||||||
import net.sourceforge.plantuml.LineLocation;
|
import net.sourceforge.plantuml.LineLocation;
|
||||||
import net.sourceforge.plantuml.StringUtils;
|
import net.sourceforge.plantuml.StringUtils;
|
||||||
import net.sourceforge.plantuml.Url;
|
import net.sourceforge.plantuml.Url;
|
||||||
@ -51,6 +53,7 @@ import net.sourceforge.plantuml.command.regex.RegexConcat;
|
|||||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
|
import net.sourceforge.plantuml.cucadiagram.Stereotype;
|
||||||
import net.sourceforge.plantuml.graphic.color.ColorParser;
|
import net.sourceforge.plantuml.graphic.color.ColorParser;
|
||||||
import net.sourceforge.plantuml.graphic.color.ColorType;
|
import net.sourceforge.plantuml.graphic.color.ColorType;
|
||||||
import net.sourceforge.plantuml.graphic.color.Colors;
|
import net.sourceforge.plantuml.graphic.color.Colors;
|
||||||
@ -65,7 +68,11 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
|
|||||||
return new RegexConcat( //
|
return new RegexConcat( //
|
||||||
new RegexLeaf("^"), //
|
new RegexLeaf("^"), //
|
||||||
new RegexLeaf("VMERGE", "(/)?[%s]*"), //
|
new RegexLeaf("VMERGE", "(/)?[%s]*"), //
|
||||||
new RegexLeaf("STYLE", "(note|hnote|rnote)[%s]+over[%s]+"), //
|
new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
|
||||||
|
new RegexLeaf("[%s]*"), //
|
||||||
|
new RegexLeaf("STEREO", "(\\<{2}.*\\>{2})?"), //
|
||||||
|
new RegexLeaf("[%s]*"), //
|
||||||
|
new RegexLeaf("over[%s]+"), //
|
||||||
new RegexLeaf("P1", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])[%s]*\\,[%s]*"), //
|
new RegexLeaf("P1", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])[%s]*\\,[%s]*"), //
|
||||||
new RegexLeaf("P2", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])[%s]*"), //
|
new RegexLeaf("P2", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])[%s]*"), //
|
||||||
color().getRegex(), //
|
color().getRegex(), //
|
||||||
@ -78,7 +85,11 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
|
|||||||
return new RegexConcat( //
|
return new RegexConcat( //
|
||||||
new RegexLeaf("^"), //
|
new RegexLeaf("^"), //
|
||||||
new RegexLeaf("VMERGE", "(/)?[%s]*"), //
|
new RegexLeaf("VMERGE", "(/)?[%s]*"), //
|
||||||
new RegexLeaf("STYLE", "(note|hnote|rnote)[%s]+over[%s]+"), //
|
new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
|
||||||
|
new RegexLeaf("[%s]*"), //
|
||||||
|
new RegexLeaf("STEREO", "(\\<{2}.*\\>{2})?"), //
|
||||||
|
new RegexLeaf("[%s]*"), //
|
||||||
|
new RegexLeaf("over[%s]+"), //
|
||||||
new RegexLeaf("P1", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])[%s]*\\,[%s]*"), //
|
new RegexLeaf("P1", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])[%s]*\\,[%s]*"), //
|
||||||
new RegexLeaf("P2", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])[%s]*"), //
|
new RegexLeaf("P2", "([\\p{L}0-9_.@]+|[%g][^%g]+[%g])[%s]*"), //
|
||||||
color().getRegex(), //
|
color().getRegex(), //
|
||||||
@ -87,17 +98,17 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
|
|||||||
new RegexLeaf("NOTE", "(.*)"), //
|
new RegexLeaf("NOTE", "(.*)"), //
|
||||||
new RegexLeaf("$"));
|
new RegexLeaf("$"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ColorParser color() {
|
private static ColorParser color() {
|
||||||
return ColorParser.simpleColor(ColorType.BACK);
|
return ColorParser.simpleColor(ColorType.BACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Command<SequenceDiagram> createSingleLine() {
|
public Command<SequenceDiagram> createSingleLine() {
|
||||||
return new SingleLineCommand2<SequenceDiagram>(getRegexConcatSingleLine()) {
|
return new SingleLineCommand2<SequenceDiagram>(getRegexConcatSingleLine()) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected CommandExecutionResult executeArg(final SequenceDiagram system, LineLocation location, RegexResult arg) {
|
protected CommandExecutionResult executeArg(final SequenceDiagram system, LineLocation location,
|
||||||
|
RegexResult arg) {
|
||||||
final BlocLines strings = BlocLines.getWithNewlines(arg.get("NOTE", 0));
|
final BlocLines strings = BlocLines.getWithNewlines(arg.get("NOTE", 0));
|
||||||
|
|
||||||
return executeInternal(system, arg, strings);
|
return executeInternal(system, arg, strings);
|
||||||
@ -135,9 +146,16 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
|
|||||||
final boolean tryMerge = line0.get("VMERGE", 0) != null;
|
final boolean tryMerge = line0.get("VMERGE", 0) != null;
|
||||||
final Display display = diagram.manageVariable(lines.toDisplay());
|
final Display display = diagram.manageVariable(lines.toDisplay());
|
||||||
final Note note = new Note(p1, p2, display);
|
final Note note = new Note(p1, p2, display);
|
||||||
final Colors colors = color().getColor(line0, diagram.getSkinParam().getIHtmlColorSet());
|
Colors colors = color().getColor(line0, diagram.getSkinParam().getIHtmlColorSet());
|
||||||
|
final String stereotypeString = line0.get("STEREO", 0);
|
||||||
|
if (stereotypeString != null) {
|
||||||
|
final Stereotype stereotype = new Stereotype(stereotypeString);
|
||||||
|
colors = colors.applyStereotypeForNote(stereotype, diagram.getSkinParam(), FontParam.NOTE,
|
||||||
|
ColorParam.noteBackground, ColorParam.noteBorder);
|
||||||
|
}
|
||||||
note.setColors(colors);
|
note.setColors(colors);
|
||||||
// note.setSpecificColorTOBEREMOVED(ColorType.BACK, diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(line0.get("COLOR", 0)));
|
// note.setSpecificColorTOBEREMOVED(ColorType.BACK,
|
||||||
|
// diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(line0.get("COLOR", 0)));
|
||||||
note.setStyle(NoteStyle.getNoteStyle(line0.get("STYLE", 0)));
|
note.setStyle(NoteStyle.getNoteStyle(line0.get("STYLE", 0)));
|
||||||
if (line0.get("URL", 0) != null) {
|
if (line0.get("URL", 0) != null) {
|
||||||
final UrlBuilder urlBuilder = new UrlBuilder(diagram.getSkinParam().getValue("topurl"), ModeUrl.STRICT);
|
final UrlBuilder urlBuilder = new UrlBuilder(diagram.getSkinParam().getValue("topurl"), ModeUrl.STRICT);
|
||||||
|
@ -36,6 +36,6 @@
|
|||||||
package net.sourceforge.plantuml.creole;
|
package net.sourceforge.plantuml.creole;
|
||||||
|
|
||||||
public enum CreoleMode {
|
public enum CreoleMode {
|
||||||
FULL, SIMPLE_LINE;
|
FULL, SIMPLE_LINE, NO_CREOLE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -452,8 +452,8 @@ public class Display implements Iterable<CharSequence> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
|
public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
|
||||||
ISkinSimple spriteContainer, CreoleMode modeSimpleLine) {
|
ISkinSimple spriteContainer, CreoleMode creoleMode) {
|
||||||
return create(fontConfiguration, horizontalAlignment, spriteContainer, LineBreakStrategy.NONE, modeSimpleLine,
|
return create(fontConfiguration, horizontalAlignment, spriteContainer, LineBreakStrategy.NONE, creoleMode,
|
||||||
null, null);
|
null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,7 +470,7 @@ public class Display implements Iterable<CharSequence> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
|
public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
|
||||||
ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize, CreoleMode modeSimpleLine,
|
ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize, CreoleMode creoleMode,
|
||||||
UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
|
UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
|
||||||
if (maxMessageSize == null) {
|
if (maxMessageSize == null) {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
@ -492,12 +492,12 @@ public class Display implements Iterable<CharSequence> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return getCreole(fontConfiguration, horizontalAlignment, spriteContainer, maxMessageSize, modeSimpleLine);
|
return getCreole(fontConfiguration, horizontalAlignment, spriteContainer, maxMessageSize, creoleMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TextBlock getCreole(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
|
private TextBlock getCreole(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
|
||||||
ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize, CreoleMode modeSimpleLine) {
|
ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize, CreoleMode creoleMode) {
|
||||||
final Sheet sheet = new CreoleParser(fontConfiguration, horizontalAlignment, spriteContainer, modeSimpleLine)
|
final Sheet sheet = new CreoleParser(fontConfiguration, horizontalAlignment, spriteContainer, creoleMode)
|
||||||
.createSheet(this);
|
.createSheet(this);
|
||||||
final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, maxMessageSize, spriteContainer == null ? 0
|
final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, maxMessageSize, spriteContainer == null ? 0
|
||||||
: spriteContainer.getPadding());
|
: spriteContainer.getPadding());
|
||||||
|
@ -245,6 +245,9 @@ public class Stereotype implements CharSequence {
|
|||||||
if (isWithOOSymbol()) {
|
if (isWithOOSymbol()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
if (spriteName != null && spriteName.startsWith("archimate/")) {
|
||||||
|
return guillemet.manageGuillemet("<<" + spriteName.substring("archimate/".length()) + ">>");
|
||||||
|
}
|
||||||
return guillemet.manageGuillemet(label);
|
return guillemet.manageGuillemet(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,33 +132,31 @@ public class GraphvizUtils {
|
|||||||
if (local != null) {
|
if (local != null) {
|
||||||
return local;
|
return local;
|
||||||
}
|
}
|
||||||
final String env = System.getProperty("PLANTUML_LIMIT_SIZE");
|
final String env = getenv("PLANTUML_LIMIT_SIZE");
|
||||||
if (StringUtils.isNotEmpty(env) && env.matches("\\d+")) {
|
if (StringUtils.isNotEmpty(env) && env.matches("\\d+")) {
|
||||||
return Integer.parseInt(env);
|
return Integer.parseInt(env);
|
||||||
}
|
}
|
||||||
final String getenv = System.getenv("PLANTUML_LIMIT_SIZE");
|
|
||||||
if (StringUtils.isNotEmpty(getenv) && getenv.matches("\\d+")) {
|
|
||||||
return Integer.parseInt(getenv);
|
|
||||||
}
|
|
||||||
return 4096;
|
return 4096;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getenvDefaultConfigFilename() {
|
public static String getenvDefaultConfigFilename() {
|
||||||
final String env = System.getProperty("PLANTUML_DEFAULT_CONFIG_FILENAME");
|
return getenv("PLANTUML_DEFAULT_CONFIG_FILENAME");
|
||||||
if (StringUtils.isNotEmpty(env)) {
|
|
||||||
return env;
|
|
||||||
}
|
|
||||||
return System.getenv("PLANTUML_DEFAULT_CONFIG_FILENAME");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getenvLogData() {
|
public static String getenvLogData() {
|
||||||
final String env = System.getProperty("PLANTUML_LOGDATA");
|
return getenv("PLANTUML_LOGDATA");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getenv(String name) {
|
||||||
|
final String env = System.getProperty(name);
|
||||||
if (StringUtils.isNotEmpty(env)) {
|
if (StringUtils.isNotEmpty(env)) {
|
||||||
return env;
|
return env;
|
||||||
}
|
}
|
||||||
return System.getenv("PLANTUML_LOGDATA");
|
return System.getenv(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static String dotVersion = null;
|
private static String dotVersion = null;
|
||||||
|
|
||||||
public static String dotVersion() throws IOException, InterruptedException {
|
public static String dotVersion() throws IOException, InterruptedException {
|
||||||
|
@ -51,6 +51,7 @@ public class Dedications {
|
|||||||
addNormal("Write your own dedication!", "dedication");
|
addNormal("Write your own dedication!", "dedication");
|
||||||
addNormal("linux_china", "linux_china");
|
addNormal("linux_china", "linux_china");
|
||||||
addNormal("ARKBAN", "arkban");
|
addNormal("ARKBAN", "arkban");
|
||||||
|
addNormal("Boundaries allow discipline to create true strength", "boundaries");
|
||||||
addCrypted("0", "pOhci6rKgPXw32AeYXhOpSY0suoauHq5VUSwFqHLHsLYgSO6WaJ7BW5vtHBAoU6ePbcW7d8Flx99MWjPSKQTDm00");
|
addCrypted("0", "pOhci6rKgPXw32AeYXhOpSY0suoauHq5VUSwFqHLHsLYgSO6WaJ7BW5vtHBAoU6ePbcW7d8Flx99MWjPSKQTDm00");
|
||||||
addCrypted("1", "LTxN3hdnhSJ515qcA7IQ841axt4GXfUd3n2wgNirYCdLnyX2360Gv1OEOnJ1-gwFzRW5B3HAqLBkR6Ge0WW_Z000");
|
addCrypted("1", "LTxN3hdnhSJ515qcA7IQ841axt4GXfUd3n2wgNirYCdLnyX2360Gv1OEOnJ1-gwFzRW5B3HAqLBkR6Ge0WW_Z000");
|
||||||
}
|
}
|
||||||
|
BIN
src/net/sourceforge/plantuml/dedication/boundaries.png
Normal file
BIN
src/net/sourceforge/plantuml/dedication/boundaries.png
Normal file
Binary file not shown.
@ -101,8 +101,8 @@ public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
|
|||||||
final Code code = Code.of(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(codeRaw));
|
final Code code = Code.of(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(codeRaw));
|
||||||
final String icon = arg.getLazzy("STEREOTYPE", 0);
|
final String icon = arg.getLazzy("STEREOTYPE", 0);
|
||||||
|
|
||||||
final IEntity entity = diagram.getOrCreateLeaf(code, LeafType.DESCRIPTION, USymbol.RECTANGLE);
|
final IEntity entity = diagram.getOrCreateLeaf(code, LeafType.DESCRIPTION, USymbol.ARCHIMATE);
|
||||||
|
|
||||||
final String displayRaw = arg.getLazzy("DISPLAY", 0);
|
final String displayRaw = arg.getLazzy("DISPLAY", 0);
|
||||||
|
|
||||||
String display = displayRaw;
|
String display = displayRaw;
|
||||||
@ -112,7 +112,7 @@ public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
|
|||||||
display = StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(display);
|
display = StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(display);
|
||||||
|
|
||||||
entity.setDisplay(Display.getWithNewlines(display));
|
entity.setDisplay(Display.getWithNewlines(display));
|
||||||
entity.setUSymbol(USymbol.RECTANGLE);
|
entity.setUSymbol(USymbol.ARCHIMATE);
|
||||||
if (icon != null) {
|
if (icon != null) {
|
||||||
entity.setStereotype(new Stereotype("<<$archimate/" + icon + ">>", diagram.getSkinParam()
|
entity.setStereotype(new Stereotype("<<$archimate/" + icon + ">>", diagram.getSkinParam()
|
||||||
.getCircledCharacterRadius(), diagram.getSkinParam().getFont(null, false,
|
.getCircledCharacterRadius(), diagram.getSkinParam().getFont(null, false,
|
||||||
@ -124,5 +124,4 @@ public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
|
|||||||
|
|
||||||
return CommandExecutionResult.ok();
|
return CommandExecutionResult.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,23 +70,24 @@ public class PSystemDonors extends AbstractPSystem {
|
|||||||
|
|
||||||
private static final int COLS = 6;
|
private static final int COLS = 6;
|
||||||
private static final int FREE_LINES = 6;
|
private static final int FREE_LINES = 6;
|
||||||
|
|
||||||
public static final String DONORS = "6nC90AmEEBmtNeGqQuvtvvyfOnYjY14ipnEA4uiuxGR47-3Ujh6l87u5mINjNXY1P6bpXlCCebWGDPxr"
|
public static final String DONORS = "6qq90AmER5DS9tl8vfhbtlpPbKCCAM84o_E4uZ2mYAUx0V47kBTjx2k8Nq5mIRiNHY1PcfrHNOSGbmZ6"
|
||||||
+ "KuTjRlPNQ4jzbOnnKnDcmWH88JoNxPv-tYvLP9GWfehjjqnexsy_BjGXhHM2At1JEVztQO1veO0qJgTu"
|
+ "UZUdwEgVdbcBbJybk-gCEFN2l32zqB1XCybzPh80tdwg32d1lpLJ_WZwmrDMI5HRTZHHjDaZL_zlEeNa"
|
||||||
+ "29S3r7yAbjuekTPi_jATxOLcRJPqN81ADTfOiwDOi-L3HEbheJ6HsMkCWcoRQyUUKV8enbSYnLeRMs2L"
|
+ "eI8CGxCL7YMZ4Mf_89AnPgUQmzsFQjsrwk8kA7HReSPqYZY6gyBS4Xz5LlOApDboYPUh5efRQHnxGSMj"
|
||||||
+ "anOKQcCunITQ3_zH2sZIcbr3UhQ0OXaf6itRlZRs7PoVmQ0HmgnqnA3iKEBGNM2iKD-e8KnAi20tYcbi"
|
+ "cF0IAQwsiGGkEQY9IaqEPxWXzVKVzGRQRAwmKikzeBYs8KcjV__OEGvmVWw3IXY7MB21COSAX_a4FKMz"
|
||||||
+ "9END4pL2EA32B_oZ92bd3raPPTY0CDi31Qn-JH28PrD12MTxNWCAzs2BXWPBTMvPwIxt3yDJeImQhWKT"
|
+ "4OEnYqGJfPuCOnCndpmnm8GNcjZ0FyeYfaTfPaz76yRXaL30vTTm0d5KLLHeTl0ne7YKMdIicAwBuqwp"
|
||||||
+ "PWvoWLG0UHDq8P-hprpIk8rDCSEBxiPuzKr2tcJd-UFDWxxfj34mVkuUcYdBSg3QUaZXbEiOlpewvAU6"
|
+ "-lhGUqeQYuQRm8A31Mc2L01v4tJ2dn5hV5MvjztGm2lEpZhRPY6lyl3oyUP6tzwuir2-xnwUwUEweTgY"
|
||||||
+ "ZEpzfexOPWdX-MqkJFlI0fqVG2-rXednD-UNXMI8Z2breQVEwPDzYa1vPIaiUXLJNWlzeilLRI2UHmyM"
|
+ "bBcDxwszvoqWTolrMl5FEMAPQ-9skNegqFBh1V8Fe9VcHCNwcPU7XUOGzpRiYxZF-PsF8G9ZnMcmsBiO"
|
||||||
+ "s5HVvrfPmGvTcTWDVK8hdCCwN-1K3VNFGwwwZa_1DM6tUzkKCsbpgVX_wvPc9ka1EcYYZT3L4YDFtxIg"
|
+ "wZNfoIv_iuaipo0Bl8IVYutCn1Q-Sl4mw9TQyJoYyuMGPMNvkEXeMNjCj2PkrhrzikU8kPh_VpTzX9ca"
|
||||||
+ "5vCXWfT17uRS0d83gY-JH-Lb-P3usXzGU4iYWIfjpcY_KPanNt9OH7ZXlJDLF01cDubyGLWyI0_YEe7U"
|
+ "4tGoHMtgceXIPkrUjIU35C7JG6-6t0Ho1whJzIfE7nVvptf0z5P51gAqEUFzGd51RMWpn1nOwqA96y3y"
|
||||||
+ "XYgRwB2xVa-Jac7JniovKIgMkmvZL3wcavMBxjLSu2iDmx9i3ktMVi1Hm0FOQLvr5dUj0fosz9vOB8qd"
|
+ "Af5E6AUJj4HQ0-XjkBA8j6NQy-xAsRvYpBrCSc6xQpHMn0TooBEQtJq56saObx9PEgBzW3s1Hx6pN7Ms"
|
||||||
+ "6KZNCAS6qdvKsVUq9TsNEaPcMM_nhYxnRcu7VnwwV63V5YqmhNGTiY0qRngHKxSuprE3wczFo0PjJRFE"
|
+ "m5e5EExflUlDLF-9WNgL9oKXhKUKnp7ygsR34gMoQ9kyMShVC_t6duUkBzZJeaDCAxqEMGog5ur8fNyP"
|
||||||
+ "3ivL8KAWc1cN0VUx9YigEO8m6Svmw7a2mgPrNh7A3UvUcCwrpixKjKHOprnz3DIG7tKsO5IwJgG07-Uz"
|
+ "_Mv5wUyWPMDUya7Um5TqJ0DXolWKSBjvCgMABHYxThh3mXOWtERYYbK1SFT2TIujAxUmAMRTS_KnK2b-"
|
||||||
+ "W6V0eyJ-SDuhenxgsn1sBQ1431DifCBOHWYhXCqPP4Jlbvvvd-1zNjfZeTx6DpkVSIX-RA8xnWs0LcSq"
|
+ "Z4zWgCmBpmhiEEy5EWCzIgoFvhtIvscvDmLR2oXJBGGBQQAShHGKvMkHZ5ZhqdFG1dZxou8BzDQUet6a"
|
||||||
+ "4xgl6v29qCXNgPSy9ax0pxZzXdemws3ZR_IqOXp4bf8Oe0he9_mI7DJEMpIDzHPzRcljRTdvywyvCicf"
|
+ "G_5h8ReZRG2qPb6DqEUw0Pa8bN95l-PZOGJyxQ-ltODH1n__EePFnK6yf2G6f0BQqOtpe7wwferWlKMV"
|
||||||
+ "sDUnMX0z1q7-goYearYEAkz6Vb_ulC9Y8ICWri4ELruQlH1WM13Iibogjdj6uKmfbfkfdJ9AVQZmVv9B"
|
+ "Vz-sgu_Wpx_cqH2dQhltjmRHwo38Vu62S3fNp-0mAlDdu0FZT2KzeDJ1IgsyD7eQO4GGqhAUI_kSaHuP"
|
||||||
+ "4CJbZIWlDc6LqQS4gxMtUbAvRLz-n-4j1u__4rMUYUJIbSL8bWjXYlCqtiT89QnR8Go-3fy0";
|
+ "K-NsrI9th0yL_sqhnWdAUCFAYqM2eiMIitoxMYPL8FRrEnQd73B-JrHv9f9BLqv68XGxEyIPZVVHXk7c"
|
||||||
|
+ "c-36JCSL0crVVxURrQaokv2Srt0WCW00";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed)
|
final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed)
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
* Original Author: Arnaud Roques
|
* Original Author: Arnaud Roques
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml;
|
package net.sourceforge.plantuml.error;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.geom.Dimension2D;
|
import java.awt.geom.Dimension2D;
|
||||||
@ -42,18 +42,26 @@ import java.io.IOException;
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.AbstractPSystem;
|
||||||
|
import net.sourceforge.plantuml.BackSlash;
|
||||||
|
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||||
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
|
import net.sourceforge.plantuml.FileFormat;
|
||||||
|
import net.sourceforge.plantuml.FileFormatOption;
|
||||||
|
import net.sourceforge.plantuml.FileImageData;
|
||||||
|
import net.sourceforge.plantuml.LineLocation;
|
||||||
|
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||||
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
import net.sourceforge.plantuml.api.ImageDataAbstract;
|
import net.sourceforge.plantuml.api.ImageDataAbstract;
|
||||||
import net.sourceforge.plantuml.api.ImageDataSimple;
|
import net.sourceforge.plantuml.api.ImageDataSimple;
|
||||||
import net.sourceforge.plantuml.asciiart.UmlCharArea;
|
import net.sourceforge.plantuml.asciiart.UmlCharArea;
|
||||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||||
import net.sourceforge.plantuml.core.ImageData;
|
import net.sourceforge.plantuml.core.ImageData;
|
||||||
import net.sourceforge.plantuml.core.UmlSource;
|
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
import net.sourceforge.plantuml.eggs.PSystemWelcome;
|
import net.sourceforge.plantuml.eggs.PSystemWelcome;
|
||||||
import net.sourceforge.plantuml.flashcode.FlashCodeFactory;
|
import net.sourceforge.plantuml.flashcode.FlashCodeFactory;
|
||||||
@ -69,6 +77,7 @@ import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
|||||||
import net.sourceforge.plantuml.graphic.InnerStrategy;
|
import net.sourceforge.plantuml.graphic.InnerStrategy;
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||||
|
import net.sourceforge.plantuml.graphic.TextBlockRaw;
|
||||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||||
import net.sourceforge.plantuml.graphic.VerticalAlignment;
|
import net.sourceforge.plantuml.graphic.VerticalAlignment;
|
||||||
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
|
||||||
@ -83,53 +92,109 @@ import net.sourceforge.plantuml.ugraphic.txt.UGraphicTxt;
|
|||||||
import net.sourceforge.plantuml.version.LicenseInfo;
|
import net.sourceforge.plantuml.version.LicenseInfo;
|
||||||
import net.sourceforge.plantuml.version.PSystemVersion;
|
import net.sourceforge.plantuml.version.PSystemVersion;
|
||||||
|
|
||||||
public class PSystemError extends AbstractPSystem {
|
public abstract class PSystemError extends AbstractPSystem {
|
||||||
|
|
||||||
private final LineLocation higherErrorPosition;
|
protected List<StringLocated> trace;
|
||||||
private final List<ErrorUml> printedErrors;
|
protected ErrorUml singleError;
|
||||||
private final List<String> debugLines = new ArrayList<String>();
|
|
||||||
|
|
||||||
public PSystemError(UmlSource source, ErrorUml singleError, List<String> debugLines) {
|
final protected StringLocated getLastLine() {
|
||||||
this(source, Collections.singletonList(singleError), debugLines);
|
return trace.get(trace.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PSystemError(UmlSource source, List<ErrorUml> all, List<String> debugLines) {
|
final public LineLocation getLineLocation() {
|
||||||
this.setSource(source);
|
return getLastLine().getLocation();
|
||||||
|
}
|
||||||
|
|
||||||
final LineLocation execution = getHigherErrorPosition2(ErrorUmlType.EXECUTION_ERROR, all);
|
final public Collection<ErrorUml> getErrorsUml() {
|
||||||
final LineLocation syntax = getHigherErrorPosition2(ErrorUmlType.SYNTAX_ERROR, all);
|
return Collections.singleton(singleError);
|
||||||
|
}
|
||||||
|
|
||||||
if (execution == null && syntax == null) {
|
final public String getWarningOrError() {
|
||||||
throw new IllegalStateException();
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(getDescription());
|
||||||
|
sb.append(BackSlash.CHAR_NEWLINE);
|
||||||
|
for (CharSequence t : getTitle().getDisplay()) {
|
||||||
|
sb.append(t);
|
||||||
|
sb.append(BackSlash.CHAR_NEWLINE);
|
||||||
}
|
}
|
||||||
|
sb.append(BackSlash.CHAR_NEWLINE);
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
if (execution != null && (syntax == null || execution.compareTo(syntax) >= 0)) {
|
private TextBlockBackcolored getGraphicalFormatted() {
|
||||||
higherErrorPosition = execution;
|
final FontConfiguration fc0 = GraphicStrings.sansSerif14(HtmlColorUtils.BLACK).bold();
|
||||||
printedErrors = getErrorsAt2(execution, ErrorUmlType.EXECUTION_ERROR, all);
|
final FontConfiguration fc1 = GraphicStrings.sansSerif14(HtmlColorUtils.MY_GREEN).bold();
|
||||||
|
final FontConfiguration fc2 = GraphicStrings.sansSerif14(HtmlColorUtils.RED).bold();
|
||||||
|
|
||||||
|
final List<String> fullBody = getTextFullBody();
|
||||||
|
final TextBlock result0 = TextBlockUtils.addBackcolor(
|
||||||
|
TextBlockUtils.withMargin(new TextBlockRaw(getTextFromStack(), fc0), 1, 1, 1, 4),
|
||||||
|
HtmlColorUtils.MY_GREEN);
|
||||||
|
final TextBlock result1 = new TextBlockRaw(allButLast(fullBody), fc1);
|
||||||
|
final TextBlock result2 = new TextBlockRaw(onlyLast(fullBody), fc1.wave(HtmlColorUtils.RED));
|
||||||
|
final TextBlock result3 = new TextBlockRaw(getTextError(), fc2);
|
||||||
|
TextBlock result = result0;
|
||||||
|
result = TextBlockUtils.mergeTB(result, result1, HorizontalAlignment.LEFT);
|
||||||
|
result = TextBlockUtils.mergeTB(result, result2, HorizontalAlignment.LEFT);
|
||||||
|
result = TextBlockUtils.mergeTB(result, result3, HorizontalAlignment.LEFT);
|
||||||
|
result = TextBlockUtils.withMargin(result, 5, 5);
|
||||||
|
return TextBlockUtils.addBackcolor(result, HtmlColorUtils.BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getPureAsciiFormatted() {
|
||||||
|
final List<String> result = getTextFromStack();
|
||||||
|
result.addAll(getTextFullBody());
|
||||||
|
result.add("^^^^^");
|
||||||
|
result.addAll(getTextError());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getTextFromStack() {
|
||||||
|
LineLocation lineLocation = getLineLocation();
|
||||||
|
final List<String> result = new ArrayList<String>();
|
||||||
|
if (lineLocation != null) {
|
||||||
|
append(result, lineLocation);
|
||||||
|
while (lineLocation.getParent() != null) {
|
||||||
|
lineLocation = lineLocation.getParent();
|
||||||
|
append(result, lineLocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getTextFullBody() {
|
||||||
|
final List<String> result = new ArrayList<String>();
|
||||||
|
result.add(" ");
|
||||||
|
final int traceSize = trace.size();
|
||||||
|
if (traceSize > 40) {
|
||||||
|
for (StringLocated s : trace.subList(0, 5)) {
|
||||||
|
addToResult(result, s);
|
||||||
|
}
|
||||||
|
result.add("...");
|
||||||
|
final int skipped = traceSize - 5 - 20;
|
||||||
|
result.add("... ( skipping " + skipped + " lines )");
|
||||||
|
result.add("...");
|
||||||
|
for (StringLocated s : trace.subList(traceSize - 20, traceSize)) {
|
||||||
|
addToResult(result, s);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// assert syntax.compareTo(execution) > 0;
|
for (StringLocated s : trace) {
|
||||||
higherErrorPosition = syntax;
|
addToResult(result, s);
|
||||||
printedErrors = getErrorsAt2(syntax, ErrorUmlType.SYNTAX_ERROR, all);
|
}
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
if (debugLines != null) {
|
|
||||||
this.debugLines.addAll(debugLines);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getSuggestColor(boolean useRed) {
|
private void addToResult(final List<String> result, StringLocated s) {
|
||||||
if (useRed) {
|
String tmp = s.getString();
|
||||||
return "black";
|
if (tmp.length() > 120) {
|
||||||
|
tmp = tmp.substring(0, 120) + " ...";
|
||||||
}
|
}
|
||||||
return "white";
|
result.add(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getRed(boolean useRed) {
|
private List<String> getTextError() {
|
||||||
if (useRed) {
|
return Arrays.asList(" " + singleError.getError());
|
||||||
return "#CD0A0A";
|
|
||||||
}
|
|
||||||
return "red";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -138,13 +203,13 @@ public class PSystemError extends AbstractPSystem {
|
|||||||
if (fileFormat.getFileFormat() == FileFormat.ATXT || fileFormat.getFileFormat() == FileFormat.UTXT) {
|
if (fileFormat.getFileFormat() == FileFormat.ATXT || fileFormat.getFileFormat() == FileFormat.UTXT) {
|
||||||
final UGraphicTxt ugt = new UGraphicTxt();
|
final UGraphicTxt ugt = new UGraphicTxt();
|
||||||
final UmlCharArea area = ugt.getCharArea();
|
final UmlCharArea area = ugt.getCharArea();
|
||||||
area.drawStringsLR(getTextStrings(), 0, 0);
|
area.drawStringsLR(getPureAsciiFormatted(), 0, 0);
|
||||||
area.print(new PrintStream(os));
|
area.print(new PrintStream(os));
|
||||||
return new ImageDataSimple(1, 1);
|
return new ImageDataSimple(1, 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
final boolean useRed = fileFormat.isUseRedForError();
|
// final boolean useRed = fileFormat.isUseRedForError();
|
||||||
final TextBlockBackcolored result = GraphicStrings.createForError(getHtmlStrings(useRed), useRed);
|
final TextBlockBackcolored result = getGraphicalFormatted();
|
||||||
|
|
||||||
TextBlock udrawable;
|
TextBlock udrawable;
|
||||||
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
|
||||||
@ -156,11 +221,11 @@ public class PSystemError extends AbstractPSystem {
|
|||||||
}
|
}
|
||||||
final int min = (int) (System.currentTimeMillis() / 60000L) % 60;
|
final int min = (int) (System.currentTimeMillis() / 60000L) % 60;
|
||||||
// udrawable = addMessageAdopt(udrawable);
|
// udrawable = addMessageAdopt(udrawable);
|
||||||
if (min == 1 && LicenseInfo.retrieveNamedOrDistributorQuickIsValid() == false) {
|
if (min == 1 || min == 8) {
|
||||||
udrawable = addMessagePatreon(udrawable);
|
udrawable = addMessagePatreon(udrawable);
|
||||||
} else if (min == 15 && LicenseInfo.retrieveNamedOrDistributorQuickIsValid() == false) {
|
} else if (min == 15) {
|
||||||
udrawable = addMessageLiberapay(udrawable);
|
udrawable = addMessageLiberapay(udrawable);
|
||||||
} else if (min == 30 && LicenseInfo.retrieveNamedOrDistributorQuickIsValid() == false) {
|
} else if (min == 30) {
|
||||||
udrawable = addMessageDedication(udrawable);
|
udrawable = addMessageDedication(udrawable);
|
||||||
} else if (getSource().containsIgnoreCase("arecibo")) {
|
} else if (getSource().containsIgnoreCase("arecibo")) {
|
||||||
udrawable = addMessageArecibo(udrawable);
|
udrawable = addMessageArecibo(udrawable);
|
||||||
@ -171,6 +236,31 @@ public class PSystemError extends AbstractPSystem {
|
|||||||
return imageData;
|
return imageData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void append(List<String> result, LineLocation lineLocation) {
|
||||||
|
if (lineLocation.getDescription() != null) {
|
||||||
|
result.add("[From " + lineLocation.getDescription() + " (line " + (lineLocation.getPosition() + 1) + ") ]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// private String getRed(boolean useRed) {
|
||||||
|
// if (useRed) {
|
||||||
|
// return "#CD0A0A";
|
||||||
|
// }
|
||||||
|
// return "red";
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
final public DiagramDescription getDescription() {
|
||||||
|
return new DiagramDescription("(Error)");
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> allButLast(List<String> full) {
|
||||||
|
return full.subList(0, full.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> onlyLast(List<String> full) {
|
||||||
|
return full.subList(full.size() - 1, full.size());
|
||||||
|
}
|
||||||
|
|
||||||
private TextBlockBackcolored getWelcome() throws IOException {
|
private TextBlockBackcolored getWelcome() throws IOException {
|
||||||
return new PSystemWelcome(GraphicPosition.BACKGROUND_CORNER_TOP_RIGHT).getGraphicStrings();
|
return new PSystemWelcome(GraphicPosition.BACKGROUND_CORNER_TOP_RIGHT).getGraphicStrings();
|
||||||
}
|
}
|
||||||
@ -181,6 +271,9 @@ public class PSystemError extends AbstractPSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private TextBlock addMessageLiberapay(final TextBlock source) throws IOException {
|
private TextBlock addMessageLiberapay(final TextBlock source) throws IOException {
|
||||||
|
if (LicenseInfo.retrieveNamedOrDistributorQuickIsValid()) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
final TextBlock message = getMessageLiberapay();
|
final TextBlock message = getMessageLiberapay();
|
||||||
TextBlock result = TextBlockUtils.mergeTB(message, source, HorizontalAlignment.LEFT);
|
TextBlock result = TextBlockUtils.mergeTB(message, source, HorizontalAlignment.LEFT);
|
||||||
result = TextBlockUtils.mergeTB(result, message, HorizontalAlignment.LEFT);
|
result = TextBlockUtils.mergeTB(result, message, HorizontalAlignment.LEFT);
|
||||||
@ -188,6 +281,9 @@ public class PSystemError extends AbstractPSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private TextBlock addMessagePatreon(final TextBlock source) throws IOException {
|
private TextBlock addMessagePatreon(final TextBlock source) throws IOException {
|
||||||
|
if (LicenseInfo.retrieveNamedOrDistributorQuickIsValid()) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
final TextBlock message = getMessagePatreon();
|
final TextBlock message = getMessagePatreon();
|
||||||
TextBlock result = TextBlockUtils.mergeTB(message, source, HorizontalAlignment.LEFT);
|
TextBlock result = TextBlockUtils.mergeTB(message, source, HorizontalAlignment.LEFT);
|
||||||
result = TextBlockUtils.mergeTB(result, message, HorizontalAlignment.LEFT);
|
result = TextBlockUtils.mergeTB(result, message, HorizontalAlignment.LEFT);
|
||||||
@ -195,12 +291,18 @@ public class PSystemError extends AbstractPSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private TextBlock addMessageDedication(final TextBlock source) throws IOException {
|
private TextBlock addMessageDedication(final TextBlock source) throws IOException {
|
||||||
|
if (LicenseInfo.retrieveNamedOrDistributorQuickIsValid()) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
final TextBlock message = getMessageDedication();
|
final TextBlock message = getMessageDedication();
|
||||||
TextBlock result = TextBlockUtils.mergeTB(message, source, HorizontalAlignment.LEFT);
|
TextBlock result = TextBlockUtils.mergeTB(message, source, HorizontalAlignment.LEFT);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TextBlock addMessageAdopt(final TextBlock source) throws IOException {
|
private TextBlock addMessageAdopt(final TextBlock source) throws IOException {
|
||||||
|
if (LicenseInfo.retrieveNamedOrDistributorQuickIsValid()) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
final TextBlock message = getMessageAdopt();
|
final TextBlock message = getMessageAdopt();
|
||||||
TextBlock result = TextBlockUtils.mergeTB(message, source, HorizontalAlignment.LEFT);
|
TextBlock result = TextBlockUtils.mergeTB(message, source, HorizontalAlignment.LEFT);
|
||||||
return result;
|
return result;
|
||||||
@ -341,6 +443,10 @@ public class PSystemError extends AbstractPSystem {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int size() {
|
||||||
|
return trace.size();
|
||||||
|
}
|
||||||
|
|
||||||
private BufferedImage smaller(BufferedImage im) {
|
private BufferedImage smaller(BufferedImage im) {
|
||||||
if (im == null) {
|
if (im == null) {
|
||||||
return null;
|
return null;
|
||||||
@ -349,241 +455,4 @@ public class PSystemError extends AbstractPSystem {
|
|||||||
return im.getSubimage(nb, nb, im.getWidth() - 2 * nb, im.getHeight() - 2 * nb);
|
return im.getSubimage(nb, nb, im.getWidth() - 2 * nb, im.getHeight() - 2 * nb);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getTextStrings() {
|
|
||||||
final List<String> result = new ArrayList<String>(getStack());
|
|
||||||
if (result.size() > 0) {
|
|
||||||
result.add(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String s : getPartialCode()) {
|
|
||||||
result.add(s);
|
|
||||||
}
|
|
||||||
final String errorLine = getSource().getLine(higherErrorPosition);
|
|
||||||
final String err = StringUtils.hideComparatorCharacters(errorLine);
|
|
||||||
if (StringUtils.isNotEmpty(err)) {
|
|
||||||
result.add(err);
|
|
||||||
}
|
|
||||||
final StringBuilder underscore = new StringBuilder();
|
|
||||||
for (int i = 0; i < errorLine.length(); i++) {
|
|
||||||
underscore.append("^");
|
|
||||||
}
|
|
||||||
result.add(underscore.toString());
|
|
||||||
final Collection<String> textErrors = new LinkedHashSet<String>();
|
|
||||||
for (ErrorUml er : printedErrors) {
|
|
||||||
textErrors.add(er.getError());
|
|
||||||
}
|
|
||||||
for (String er : textErrors) {
|
|
||||||
result.add(" " + er);
|
|
||||||
}
|
|
||||||
boolean first = true;
|
|
||||||
for (String s : getSuggest()) {
|
|
||||||
if (first) {
|
|
||||||
result.add(" " + s);
|
|
||||||
} else {
|
|
||||||
result.add(s);
|
|
||||||
}
|
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
result.addAll(this.debugLines);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> getStack() {
|
|
||||||
LineLocation lineLocation = getLineLocation();
|
|
||||||
final List<String> result = new ArrayList<String>();
|
|
||||||
if (lineLocation != null) {
|
|
||||||
append(result, lineLocation);
|
|
||||||
while (lineLocation.getParent() != null) {
|
|
||||||
lineLocation = lineLocation.getParent();
|
|
||||||
append(result, lineLocation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LineLocation getLineLocation() {
|
|
||||||
for (ErrorUml err : printedErrors) {
|
|
||||||
if (err.getLineLocation() != null) {
|
|
||||||
return err.getLineLocation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void append(List<String> result, LineLocation lineLocation) {
|
|
||||||
if (lineLocation.getDescription() != null) {
|
|
||||||
result.add("[From " + lineLocation.getDescription() + " (line " + (lineLocation.getPosition() + 1) + ") ]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> getPartialCode() {
|
|
||||||
List<String> result = new ArrayList<String>();
|
|
||||||
for (Iterator<StringLocated> it = getSource().iterator2(); it.hasNext();) {
|
|
||||||
final StringLocated s = it.next();
|
|
||||||
final String tmp = s.getString();
|
|
||||||
result.add(tmp);
|
|
||||||
final LineLocation location = s.getLocation();
|
|
||||||
if (location.getDescription().equals(higherErrorPosition.getDescription())
|
|
||||||
&& location.compareTo(higherErrorPosition) >= 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
final int limit = 5;
|
|
||||||
if (result.size() > limit) {
|
|
||||||
final int skip = result.size() - limit + 1;
|
|
||||||
final String skipMessage;
|
|
||||||
if (skip == 1) {
|
|
||||||
skipMessage = "... (skipping 1 line) ...";
|
|
||||||
} else {
|
|
||||||
skipMessage = "... (skipping " + skip + " lines) ...";
|
|
||||||
}
|
|
||||||
result = new ArrayList<String>(result.subList(skip, result.size()));
|
|
||||||
result.add(0, skipMessage);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> getHtmlStrings(boolean useRed) {
|
|
||||||
final List<String> htmlStrings = new ArrayList<String>(getStack());
|
|
||||||
if (htmlStrings.size() > 0) {
|
|
||||||
htmlStrings.add("----");
|
|
||||||
}
|
|
||||||
|
|
||||||
final List<String> partialCode = getPartialCode();
|
|
||||||
for (String s : partialCode) {
|
|
||||||
htmlStrings.add(StringUtils.hideComparatorCharacters(s));
|
|
||||||
}
|
|
||||||
if (partialCode.size() > 0) {
|
|
||||||
final int idx = htmlStrings.size() - 1;
|
|
||||||
final String last = htmlStrings.get(idx);
|
|
||||||
htmlStrings.set(idx, "<w:" + getRed(useRed) + ">" + last + "</w>");
|
|
||||||
}
|
|
||||||
|
|
||||||
final Collection<String> textErrors = new LinkedHashSet<String>();
|
|
||||||
for (ErrorUml er : printedErrors) {
|
|
||||||
textErrors.add(er.getError());
|
|
||||||
}
|
|
||||||
for (String er : textErrors) {
|
|
||||||
htmlStrings.add(" <color:" + getRed(useRed) + ">" + er + "</color>");
|
|
||||||
}
|
|
||||||
boolean first = true;
|
|
||||||
for (String s : getSuggest()) {
|
|
||||||
if (first) {
|
|
||||||
htmlStrings.add(" <color:" + getSuggestColor(useRed) + "><i>" + s + "</i></color>");
|
|
||||||
} else {
|
|
||||||
htmlStrings.add("<color:" + getSuggestColor(useRed) + ">" + StringUtils.hideComparatorCharacters(s)
|
|
||||||
+ "</color>");
|
|
||||||
}
|
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
htmlStrings.addAll(this.debugLines);
|
|
||||||
|
|
||||||
return htmlStrings;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<String> getSuggest() {
|
|
||||||
boolean suggested = false;
|
|
||||||
for (ErrorUml er : printedErrors) {
|
|
||||||
if (er.hasSuggest()) {
|
|
||||||
suggested = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (suggested == false) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
final List<String> result = new ArrayList<String>();
|
|
||||||
result.add("Did you mean:");
|
|
||||||
for (ErrorUml er : printedErrors) {
|
|
||||||
if (er.hasSuggest()) {
|
|
||||||
result.add(er.getSuggest().getSuggestedLine());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Collections.unmodifiableList(result);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private Collection<ErrorUml> getErrors(ErrorUmlType type, List<ErrorUml> all) {
|
|
||||||
final Collection<ErrorUml> result = new LinkedHashSet<ErrorUml>();
|
|
||||||
for (ErrorUml error : all) {
|
|
||||||
if (error.getType() == type) {
|
|
||||||
result.add(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LineLocation getHigherErrorPosition2(ErrorUmlType type, List<ErrorUml> all) {
|
|
||||||
LineLocation max = null;
|
|
||||||
for (ErrorUml error : getErrors(type, all)) {
|
|
||||||
if (max == null || error.getLineLocation().compareTo(max) > 0) {
|
|
||||||
max = error.getLineLocation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return max;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<ErrorUml> getErrorsAt2(LineLocation position, ErrorUmlType type, List<ErrorUml> all) {
|
|
||||||
final List<ErrorUml> result = new ArrayList<ErrorUml>();
|
|
||||||
for (ErrorUml error : getErrors(type, all)) {
|
|
||||||
if (error.getLineLocation().compareTo(position) == 0 && StringUtils.isNotEmpty(error.getError())) {
|
|
||||||
result.add(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DiagramDescription getDescription() {
|
|
||||||
return new DiagramDescription("(Error)");
|
|
||||||
}
|
|
||||||
|
|
||||||
public final LineLocation getHigherErrorPosition2() {
|
|
||||||
return higherErrorPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final Collection<ErrorUml> getErrorsUml() {
|
|
||||||
return Collections.unmodifiableCollection(printedErrors);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getWarningOrError() {
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(getDescription());
|
|
||||||
sb.append(BackSlash.CHAR_NEWLINE);
|
|
||||||
for (CharSequence t : getTitle().getDisplay()) {
|
|
||||||
sb.append(t);
|
|
||||||
sb.append(BackSlash.CHAR_NEWLINE);
|
|
||||||
}
|
|
||||||
sb.append(BackSlash.CHAR_NEWLINE);
|
|
||||||
for (String s : getSuggest()) {
|
|
||||||
sb.append(s);
|
|
||||||
sb.append(BackSlash.CHAR_NEWLINE);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PSystemError merge(Collection<PSystemError> ps) {
|
|
||||||
UmlSource source = null;
|
|
||||||
final List<ErrorUml> errors = new ArrayList<ErrorUml>();
|
|
||||||
final List<String> debugs = new ArrayList<String>();
|
|
||||||
for (PSystemError system : ps) {
|
|
||||||
if (system == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (system.getSource() != null && source == null) {
|
|
||||||
source = system.getSource();
|
|
||||||
}
|
|
||||||
errors.addAll(system.getErrorsUml());
|
|
||||||
debugs.addAll(system.debugLines);
|
|
||||||
if (system.debugLines.size() > 0) {
|
|
||||||
debugs.add("-");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (source == null) {
|
|
||||||
throw new IllegalStateException();
|
|
||||||
}
|
|
||||||
return new PSystemError(source, errors, debugs);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2020, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: http://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* http://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* http://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* 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 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.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.error;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
|
import net.sourceforge.plantuml.ErrorUmlType;
|
||||||
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
|
import net.sourceforge.plantuml.core.DiagramType;
|
||||||
|
import net.sourceforge.plantuml.core.UmlSource;
|
||||||
|
|
||||||
|
public class PSystemErrorPreprocessor extends PSystemError {
|
||||||
|
|
||||||
|
public PSystemErrorPreprocessor(List<StringLocated> input, List<StringLocated> trace) {
|
||||||
|
final DiagramType type = DiagramType.getTypeFromArobaseStart(input.get(0).getString());
|
||||||
|
this.setSource(new UmlSource(input, type == DiagramType.UML));
|
||||||
|
this.trace = trace;
|
||||||
|
this.singleError = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, getLastLine().getPreprocessorError(), getLastLine()
|
||||||
|
.getLocation());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
106
src/net/sourceforge/plantuml/error/PSystemErrorUtils.java
Normal file
106
src/net/sourceforge/plantuml/error/PSystemErrorUtils.java
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2020, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: http://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* http://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* http://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* 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 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.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.error;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
|
import net.sourceforge.plantuml.core.UmlSource;
|
||||||
|
|
||||||
|
public class PSystemErrorUtils {
|
||||||
|
|
||||||
|
// public static AbstractPSystemError buildV1(UmlSource source, ErrorUml singleError, List<String> debugLines) {
|
||||||
|
// return new PSystemErrorV1(source, singleError, debugLines);
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static PSystemError buildV2(UmlSource source, ErrorUml singleError, List<String> debugLines,
|
||||||
|
List<StringLocated> list) {
|
||||||
|
// return new PSystemErrorV1(source, singleError, debugLines);
|
||||||
|
return new PSystemErrorV2(source, list, singleError);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PSystemError merge(Collection<PSystemError> ps) {
|
||||||
|
UmlSource source = null;
|
||||||
|
final List<ErrorUml> errors = new ArrayList<ErrorUml>();
|
||||||
|
// final List<String> debugs = new ArrayList<String>();
|
||||||
|
final List<PSystemErrorV2> errorsV2 = new ArrayList<PSystemErrorV2>();
|
||||||
|
for (PSystemError system : ps) {
|
||||||
|
if (system == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (system.getSource() != null && source == null) {
|
||||||
|
source = system.getSource();
|
||||||
|
}
|
||||||
|
errors.addAll(system.getErrorsUml());
|
||||||
|
// if (system instanceof PSystemErrorV1) {
|
||||||
|
// debugs.addAll(((PSystemErrorV1) system).debugLines);
|
||||||
|
// if (((PSystemErrorV1) system).debugLines.size() > 0) {
|
||||||
|
// debugs.add("-");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
if (system instanceof PSystemErrorV2) {
|
||||||
|
errorsV2.add((PSystemErrorV2) system);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (source == null) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
if (errorsV2.size() > 0) {
|
||||||
|
return mergeV2(errorsV2);
|
||||||
|
}
|
||||||
|
throw new IllegalStateException();
|
||||||
|
// return new PSystemErrorV1(source, errors, debugs);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PSystemErrorV2 mergeV2(List<PSystemErrorV2> errorsV2) {
|
||||||
|
PSystemErrorV2 result = null;
|
||||||
|
for (PSystemErrorV2 err : errorsV2) {
|
||||||
|
if (result == null || result.size() < err.size()) {
|
||||||
|
result = err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isDiagramError(Class<? extends Diagram> type) {
|
||||||
|
return PSystemError.class.isAssignableFrom(type);
|
||||||
|
// return type == PSystemErrorV1.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -31,11 +31,22 @@
|
|||||||
*
|
*
|
||||||
* Original Author: Arnaud Roques
|
* Original Author: Arnaud Roques
|
||||||
*
|
*
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.suggest;
|
package net.sourceforge.plantuml.error;
|
||||||
|
|
||||||
public enum SuggestEngineStatus {
|
import java.util.List;
|
||||||
SYNTAX_OK, CANNOT_CORRECT, ONE_SUGGESTION
|
|
||||||
|
import net.sourceforge.plantuml.ErrorUml;
|
||||||
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
|
import net.sourceforge.plantuml.core.UmlSource;
|
||||||
|
|
||||||
|
public class PSystemErrorV2 extends PSystemError {
|
||||||
|
|
||||||
|
public PSystemErrorV2(UmlSource source, List<StringLocated> trace, ErrorUml singleError) {
|
||||||
|
this.setSource(source);
|
||||||
|
this.trace = trace;
|
||||||
|
this.singleError = singleError;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -44,12 +44,12 @@ import javax.imageio.ImageIO;
|
|||||||
|
|
||||||
public class IconLoader {
|
public class IconLoader {
|
||||||
|
|
||||||
private static final int NUMBER_OF_ICONS = 27;
|
private static final int NUMBER_OF_ICONS = 29;
|
||||||
|
|
||||||
private final static Map<String, BufferedImage> all = new ConcurrentHashMap<String, BufferedImage>();
|
private final static Map<String, BufferedImage> all = new ConcurrentHashMap<String, BufferedImage>();
|
||||||
|
|
||||||
public static BufferedImage getRandom() {
|
public static BufferedImage getRandom() {
|
||||||
// return addTransparent(getIcon("sprite026.png"));
|
// return addTransparent(getIcon("sprite028.png"));
|
||||||
return addTransparent(getIcon(getSomeQuote()));
|
return addTransparent(getIcon(getSomeQuote()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
BIN
src/net/sourceforge/plantuml/fun/sprite027.png
Normal file
BIN
src/net/sourceforge/plantuml/fun/sprite027.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 400 B |
BIN
src/net/sourceforge/plantuml/fun/sprite028.png
Normal file
BIN
src/net/sourceforge/plantuml/fun/sprite028.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
@ -222,6 +222,10 @@ public class FontConfiguration {
|
|||||||
return add(FontStyle.UNDERLINE);
|
return add(FontStyle.UNDERLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FontConfiguration wave(HtmlColor color) {
|
||||||
|
return add(FontStyle.WAVE).changeExtendedColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
public FontConfiguration hyperlink() {
|
public FontConfiguration hyperlink() {
|
||||||
if (useUnderlineForHyperlink) {
|
if (useUnderlineForHyperlink) {
|
||||||
return add(FontStyle.UNDERLINE).withHyperlink();
|
return add(FontStyle.UNDERLINE).withHyperlink();
|
||||||
|
@ -41,6 +41,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||||
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||||
|
import net.sourceforge.plantuml.creole.CreoleMode;
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
import net.sourceforge.plantuml.svek.IEntityImage;
|
import net.sourceforge.plantuml.svek.IEntityImage;
|
||||||
import net.sourceforge.plantuml.svek.Margins;
|
import net.sourceforge.plantuml.svek.Margins;
|
||||||
@ -58,13 +59,9 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
|
|||||||
|
|
||||||
private final HtmlColor background;
|
private final HtmlColor background;
|
||||||
|
|
||||||
private final UFont font;
|
private final static HtmlColor hyperlinkColor = HtmlColorUtils.BLUE;
|
||||||
|
|
||||||
private final HtmlColor maincolor;
|
private final static boolean useUnderlineForHyperlink = true;
|
||||||
|
|
||||||
private final HtmlColor hyperlinkColor = HtmlColorUtils.BLUE;
|
|
||||||
|
|
||||||
private final boolean useUnderlineForHyperlink = true;
|
|
||||||
|
|
||||||
private final List<String> strings;
|
private final List<String> strings;
|
||||||
|
|
||||||
@ -72,63 +69,87 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
|
|||||||
|
|
||||||
private final GraphicPosition position;
|
private final GraphicPosition position;
|
||||||
|
|
||||||
|
private final FontConfiguration fontConfiguration;
|
||||||
|
|
||||||
public static IEntityImage createForError(List<String> strings, boolean useRed) {
|
public static IEntityImage createForError(List<String> strings, boolean useRed) {
|
||||||
|
return new GraphicStrings(strings, sansSerif14(getForeColor(useRed)).bold(), getBackColor(useRed), null, null,
|
||||||
|
CreoleMode.NO_CREOLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HtmlColor getForeColor(boolean useRed) {
|
||||||
if (useRed) {
|
if (useRed) {
|
||||||
return new GraphicStrings(strings, UFont.sansSerif(14).bold(), HtmlColorUtils.BLACK,
|
return HtmlColorUtils.BLACK;
|
||||||
HtmlColorUtils.RED_LIGHT, null, null);
|
|
||||||
}
|
}
|
||||||
return new GraphicStrings(strings, UFont.sansSerif(14).bold(), HtmlColorSet.getInstance().getColorIfValid(
|
return HtmlColorUtils.MY_GREEN;
|
||||||
"#33FF02"), HtmlColorUtils.BLACK, null, null);
|
}
|
||||||
|
|
||||||
|
private static HtmlColor getBackColor(boolean useRed) {
|
||||||
|
if (useRed) {
|
||||||
|
return HtmlColorUtils.RED_LIGHT;
|
||||||
|
}
|
||||||
|
return HtmlColorUtils.BLACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TextBlockBackcolored createGreenOnBlackMonospaced(List<String> strings) {
|
public static TextBlockBackcolored createGreenOnBlackMonospaced(List<String> strings) {
|
||||||
return new GraphicStrings(strings, monospaced14(), HtmlColorUtils.GREEN, HtmlColorUtils.BLACK, null, null);
|
return new GraphicStrings(strings, monospaced14(HtmlColorUtils.GREEN), HtmlColorUtils.BLACK, null, null,
|
||||||
|
CreoleMode.SIMPLE_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TextBlockBackcolored createBlackOnWhite(List<String> strings) {
|
public static TextBlockBackcolored createBlackOnWhite(List<String> strings) {
|
||||||
return new GraphicStrings(strings, sansSerif12(), HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, null, null);
|
return new GraphicStrings(strings, sansSerif12(HtmlColorUtils.BLACK), HtmlColorUtils.WHITE, null, null,
|
||||||
|
CreoleMode.FULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TextBlockBackcolored createBlackOnWhiteMonospaced(List<String> strings) {
|
public static TextBlockBackcolored createBlackOnWhiteMonospaced(List<String> strings) {
|
||||||
return new GraphicStrings(strings, monospaced14(), HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, null, null);
|
return new GraphicStrings(strings, monospaced14(HtmlColorUtils.BLACK), HtmlColorUtils.WHITE, null, null,
|
||||||
|
CreoleMode.FULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TextBlockBackcolored createBlackOnWhite(List<String> strings, BufferedImage image,
|
public static TextBlockBackcolored createBlackOnWhite(List<String> strings, BufferedImage image,
|
||||||
GraphicPosition position) {
|
GraphicPosition position) {
|
||||||
return new GraphicStrings(strings, sansSerif12(), HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, image, position);
|
return new GraphicStrings(strings, sansSerif12(HtmlColorUtils.BLACK), HtmlColorUtils.WHITE, image, position,
|
||||||
|
CreoleMode.FULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static UFont sansSerif12() {
|
private static FontConfiguration sansSerif12(HtmlColor color) {
|
||||||
return UFont.sansSerif(12);
|
return new FontConfiguration(UFont.sansSerif(12), color, hyperlinkColor, useUnderlineForHyperlink);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static UFont monospaced14() {
|
public static FontConfiguration sansSerif14(HtmlColor color) {
|
||||||
return UFont.monospaced(14);
|
return new FontConfiguration(UFont.sansSerif(14), color, hyperlinkColor, useUnderlineForHyperlink);
|
||||||
}
|
}
|
||||||
|
|
||||||
private GraphicStrings(List<String> strings, UFont font, HtmlColor maincolor, HtmlColor background,
|
private static FontConfiguration monospaced14(HtmlColor color) {
|
||||||
BufferedImage image, GraphicPosition position) {
|
return new FontConfiguration(UFont.monospaced(14), color, hyperlinkColor, useUnderlineForHyperlink);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final CreoleMode mode;
|
||||||
|
|
||||||
|
private GraphicStrings(List<String> strings, FontConfiguration fontConfiguration, HtmlColor background,
|
||||||
|
BufferedImage image, GraphicPosition position, CreoleMode mode) {
|
||||||
this.strings = strings;
|
this.strings = strings;
|
||||||
this.font = font;
|
|
||||||
this.maincolor = maincolor;
|
|
||||||
this.background = background;
|
this.background = background;
|
||||||
this.image = image;
|
this.image = image;
|
||||||
this.position = position;
|
this.position = position;
|
||||||
|
this.mode = mode;
|
||||||
|
this.fontConfiguration = fontConfiguration;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TextBlock getTextBlock() {
|
private TextBlock getTextBlock() {
|
||||||
TextBlock result = null;
|
final Display display = Display.create(strings);
|
||||||
result = Display.create(strings).create(
|
if (mode == CreoleMode.NO_CREOLE) {
|
||||||
new FontConfiguration(font, maincolor, hyperlinkColor, useUnderlineForHyperlink),
|
return new TextBlockRaw(strings, fontConfiguration);
|
||||||
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
|
||||||
// result = DateEventUtils.addEvent(result, green);
|
} else {
|
||||||
return result;
|
return display.create(fontConfiguration, HorizontalAlignment.LEFT, new SpriteContainerEmpty(), mode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
ug = ug.apply(new UTranslate(margin, margin));
|
ug = ug.apply(new UTranslate(margin, margin));
|
||||||
final Dimension2D size = calculateDimensionInternal(ug.getStringBounder());
|
final Dimension2D size = calculateDimensionInternal(ug.getStringBounder());
|
||||||
getTextBlock().drawU(ug.apply(new UChangeColor(maincolor)));
|
getTextBlock().drawU(ug.apply(new UChangeColor(fontConfiguration.getColor())));
|
||||||
|
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
if (position == GraphicPosition.BOTTOM) {
|
if (position == GraphicPosition.BOTTOM) {
|
||||||
@ -176,10 +197,9 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
|
|||||||
public boolean isHidden() {
|
public boolean isHidden() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getOverscanX(StringBounder stringBounder) {
|
public double getOverscanX(StringBounder stringBounder) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ public class HtmlColorUtils {
|
|||||||
public static final HtmlColor LIGHT_GRAY;
|
public static final HtmlColor LIGHT_GRAY;
|
||||||
public static final HtmlColor MY_YELLOW;
|
public static final HtmlColor MY_YELLOW;
|
||||||
public static final HtmlColor MY_RED;
|
public static final HtmlColor MY_RED;
|
||||||
|
public static final HtmlColor MY_GREEN;
|
||||||
|
|
||||||
public static final HtmlColor COL_C82930;
|
public static final HtmlColor COL_C82930;
|
||||||
public static final HtmlColor COL_F24D5C;
|
public static final HtmlColor COL_F24D5C;
|
||||||
@ -86,6 +87,7 @@ public class HtmlColorUtils {
|
|||||||
LIGHT_GRAY = set.getColorIfValid("#C0C0C0");
|
LIGHT_GRAY = set.getColorIfValid("#C0C0C0");
|
||||||
MY_YELLOW = set.getColorIfValid("#FEFECE");
|
MY_YELLOW = set.getColorIfValid("#FEFECE");
|
||||||
MY_RED = set.getColorIfValid("#A80036");
|
MY_RED = set.getColorIfValid("#A80036");
|
||||||
|
MY_GREEN = set.getColorIfValid("#33FF02");
|
||||||
|
|
||||||
COL_C82930 = set.getColorIfValid("#C82930");
|
COL_C82930 = set.getColorIfValid("#C82930");
|
||||||
COL_F24D5C = set.getColorIfValid("#F24D5C");
|
COL_F24D5C = set.getColorIfValid("#F24D5C");
|
||||||
|
@ -304,7 +304,16 @@ public class QuoteUtils {
|
|||||||
"Dhnaq ibhf rgrf rzorgrf, rzoebhvyyrm gbhg", "Gurer nva'g ab phevat jung'f jebat jvgu gung guvat",
|
"Dhnaq ibhf rgrf rzorgrf, rzoebhvyyrm gbhg", "Gurer nva'g ab phevat jung'f jebat jvgu gung guvat",
|
||||||
"Vs lbh cevpx hf, qb jr abg oyrrq?", "V qvq lbhe wbo bapr - V jnf tbbq ng vg.",
|
"Vs lbh cevpx hf, qb jr abg oyrrq?", "V qvq lbhe wbo bapr - V jnf tbbq ng vg.",
|
||||||
"Vyf cbheenvrag snver har fryrpgvba nh fgnaqneq...", "Gung'f ab jnl gb gerng n sevraq.",
|
"Vyf cbheenvrag snver har fryrpgvba nh fgnaqneq...", "Gung'f ab jnl gb gerng n sevraq.",
|
||||||
"Ubjrire ornhgvshy gur fgengrtl, lbh fubhyq bppnfvbanyyl ybbx ng gur erfhygf");
|
"Ubjrire ornhgvshy gur fgengrtl, lbh fubhyq bppnfvbanyyl ybbx ng gur erfhygf",
|
||||||
|
"Qba'g svk vg vs vg'f abg oebxra",
|
||||||
|
"Fhqqrayl V'z gnxvat fhttrfgvbaf sebz fbzr fgebat-nez zna jvgu na VD bs zvahf 50.",
|
||||||
|
"Fur ehvaf rirelguvat fur'f va. Fur ehvaf guvatf fur'f abg rira va.",
|
||||||
|
"Byvir, V guvax lbh fubhyq xabj guvf: lbh'er n ubeevoyr npgerff.",
|
||||||
|
"Lbh'er yngr! Qb lbh unir ab pbaprcg bs gvzr ?",
|
||||||
|
"P'zba zna, yrg'f qb fbzrguvat gung ernyyl pbbxf.",
|
||||||
|
"Nh sbaq, znvagranag, yrf qvcybzngrf ceraqenvrag cyhgbg yr cnf fhe yrf ubzzrf q'npgvba.",
|
||||||
|
"Whfg zragnyyl gubhtu... ner lbh bxnl ?", "Jr xabj fur'f bxnl orpnhfr fur'f oybaq",
|
||||||
|
"Gh oyhssrf Znegbav");
|
||||||
|
|
||||||
private QuoteUtils() {
|
private QuoteUtils() {
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,24 @@ class SingleLine extends AbstractTextBlock implements Line {
|
|||||||
private final List<TextBlock> blocs = new ArrayList<TextBlock>();
|
private final List<TextBlock> blocs = new ArrayList<TextBlock>();
|
||||||
private final HorizontalAlignment horizontalAlignment;
|
private final HorizontalAlignment horizontalAlignment;
|
||||||
|
|
||||||
public SingleLine(String text, FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
|
public static SingleLine withSomeHtmlTag(String text, FontConfiguration fontConfiguration,
|
||||||
|
HorizontalAlignment horizontalAlignment, SpriteContainer spriteContainer) {
|
||||||
|
return new SingleLine(text, fontConfiguration, horizontalAlignment, spriteContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SingleLine rawText(String text, FontConfiguration fontConfiguration) {
|
||||||
|
return new SingleLine(text, fontConfiguration);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SingleLine(String text, FontConfiguration fontConfiguration) {
|
||||||
|
if (text.length() == 0) {
|
||||||
|
text = " ";
|
||||||
|
}
|
||||||
|
this.horizontalAlignment = HorizontalAlignment.LEFT;
|
||||||
|
this.blocs.add(new TileText(text, fontConfiguration, null));
|
||||||
|
}
|
||||||
|
|
||||||
|
private SingleLine(String text, FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
|
||||||
SpriteContainer spriteContainer) {
|
SpriteContainer spriteContainer) {
|
||||||
if (text.length() == 0) {
|
if (text.length() == 0) {
|
||||||
text = " ";
|
text = " ";
|
||||||
@ -139,4 +156,5 @@ class SingleLine extends AbstractTextBlock implements Line {
|
|||||||
public HorizontalAlignment getHorizontalAlignment() {
|
public HorizontalAlignment getHorizontalAlignment() {
|
||||||
return horizontalAlignment;
|
return horizontalAlignment;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -97,6 +97,10 @@ public class SkinParameter {
|
|||||||
ColorParam.rectangleBorder, FontParam.RECTANGLE, FontParam.RECTANGLE_STEREOTYPE, LineParam.rectangleBorder,
|
ColorParam.rectangleBorder, FontParam.RECTANGLE, FontParam.RECTANGLE_STEREOTYPE, LineParam.rectangleBorder,
|
||||||
CornerParam.rectangle);
|
CornerParam.rectangle);
|
||||||
|
|
||||||
|
public static final SkinParameter ARCHIMATE = new SkinParameter("ARCHIMATE", ColorParam.archimateBackground,
|
||||||
|
ColorParam.archimateBorder, FontParam.ARCHIMATE, FontParam.ARCHIMATE_STEREOTYPE, LineParam.archimateBorder,
|
||||||
|
CornerParam.archimate);
|
||||||
|
|
||||||
public static final SkinParameter COLLECTIONS = new SkinParameter("COLLECTIONS", ColorParam.collectionsBackground,
|
public static final SkinParameter COLLECTIONS = new SkinParameter("COLLECTIONS", ColorParam.collectionsBackground,
|
||||||
ColorParam.collectionsBorder, FontParam.RECTANGLE, FontParam.RECTANGLE_STEREOTYPE);
|
ColorParam.collectionsBorder, FontParam.RECTANGLE, FontParam.RECTANGLE_STEREOTYPE);
|
||||||
|
|
||||||
|
95
src/net/sourceforge/plantuml/graphic/TextBlockRaw.java
Normal file
95
src/net/sourceforge/plantuml/graphic/TextBlockRaw.java
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2020, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: http://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* http://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* http://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* 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 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.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.graphic;
|
||||||
|
|
||||||
|
import java.awt.geom.Dimension2D;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
|
|
||||||
|
public class TextBlockRaw extends AbstractTextBlock implements TextBlock {
|
||||||
|
|
||||||
|
private List<Line> lines2;
|
||||||
|
|
||||||
|
private final List<String> strings;
|
||||||
|
private final FontConfiguration fontConfiguration;
|
||||||
|
|
||||||
|
public TextBlockRaw(List<String> strings, FontConfiguration fontConfiguration) {
|
||||||
|
this.strings = strings;
|
||||||
|
this.fontConfiguration = fontConfiguration;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Line> getLines(StringBounder stringBounder) {
|
||||||
|
if (lines2 == null) {
|
||||||
|
if (stringBounder == null) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
this.lines2 = new ArrayList<Line>();
|
||||||
|
for (String s : strings) {
|
||||||
|
lines2.add(SingleLine.rawText(s, fontConfiguration));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lines2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
|
return getTextDimension(stringBounder);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final Dimension2D getTextDimension(StringBounder stringBounder) {
|
||||||
|
double width = 0;
|
||||||
|
double height = 0;
|
||||||
|
for (Line line : getLines(stringBounder)) {
|
||||||
|
final Dimension2D size2D = line.calculateDimension(stringBounder);
|
||||||
|
height += size2D.getHeight();
|
||||||
|
width = Math.max(width, size2D.getWidth());
|
||||||
|
}
|
||||||
|
return new Dimension2DDouble(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
double y = 0;
|
||||||
|
|
||||||
|
for (Line line : getLines(ug.getStringBounder())) {
|
||||||
|
line.drawU(ug.apply(new UTranslate(0, y)));
|
||||||
|
y += line.calculateDimension(ug.getStringBounder()).getHeight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -145,15 +145,15 @@ public class TextBlockSimple extends AbstractTextBlock implements TextBlock {
|
|||||||
if (s.length() == 0 || MyPattern.mtches(s, "^[%s]*$ ")) {
|
if (s.length() == 0 || MyPattern.mtches(s, "^[%s]*$ ")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lines2.add(new SingleLine(s, fontConfiguration, horizontalAlignment, spriteContainer));
|
lines2.add(SingleLine.withSomeHtmlTag(s, fontConfiguration, horizontalAlignment, spriteContainer));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addSingleLine(String s) {
|
private void addSingleLine(String s) {
|
||||||
lines2.add(new SingleLine(s, fontConfiguration, horizontalAlignment, spriteContainer));
|
lines2.add(SingleLine.withSomeHtmlTag(s, fontConfiguration, horizontalAlignment, spriteContainer));
|
||||||
}
|
}
|
||||||
|
|
||||||
private double getTextWidth(StringBounder stringBounder, String s) {
|
private double getTextWidth(StringBounder stringBounder, String s) {
|
||||||
final Line line = new SingleLine(s, fontConfiguration, horizontalAlignment, spriteContainer);
|
final Line line = SingleLine.withSomeHtmlTag(s, fontConfiguration, horizontalAlignment, spriteContainer);
|
||||||
return line.calculateDimension(stringBounder).getWidth();
|
return line.calculateDimension(stringBounder).getWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ public class TextBlockSimple extends AbstractTextBlock implements TextBlock {
|
|||||||
assert s.getLabel(Guillemet.DOUBLE_COMPARATOR) != null;
|
assert s.getLabel(Guillemet.DOUBLE_COMPARATOR) != null;
|
||||||
final List<SingleLine> result = new ArrayList<SingleLine>();
|
final List<SingleLine> result = new ArrayList<SingleLine>();
|
||||||
for (String st : s.getLabels(spriteContainer.guillemet())) {
|
for (String st : s.getLabels(spriteContainer.guillemet())) {
|
||||||
result.add(new SingleLine(st, fontConfiguration, horizontalAlignment, spriteContainer));
|
result.add(SingleLine.withSomeHtmlTag(st, fontConfiguration, horizontalAlignment, spriteContainer));
|
||||||
}
|
}
|
||||||
return Collections.unmodifiableList(result);
|
return Collections.unmodifiableList(result);
|
||||||
}
|
}
|
||||||
|
@ -124,6 +124,11 @@ public class TextBlockUtils {
|
|||||||
return new TextBlockVertical2(b1, b2, horizontalAlignment);
|
return new TextBlockVertical2(b1, b2, horizontalAlignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// public static TextBlockBackcolored mergeColoredTB(TextBlockBackcolored b1, TextBlockBackcolored b2,
|
||||||
|
// HorizontalAlignment horizontalAlignment) {
|
||||||
|
// return addBackcolor(mergeTB(b1, b2, horizontalAlignment), b1.getBackcolor());
|
||||||
|
// }
|
||||||
|
|
||||||
public static MinMax getMinMax(TextBlock tb, StringBounder stringBounder) {
|
public static MinMax getMinMax(TextBlock tb, StringBounder stringBounder) {
|
||||||
final LimitFinder limitFinder = new LimitFinder(stringBounder, false);
|
final LimitFinder limitFinder = new LimitFinder(stringBounder, false);
|
||||||
tb.drawU(limitFinder);
|
tb.drawU(limitFinder);
|
||||||
|
@ -58,14 +58,16 @@ public abstract class USymbol {
|
|||||||
public final static USymbol ARTIFACT = record("ARTIFACT", SkinParameter.ARTIFACT, new USymbolArtifact());
|
public final static USymbol ARTIFACT = record("ARTIFACT", SkinParameter.ARTIFACT, new USymbolArtifact());
|
||||||
public final static USymbol PACKAGE = record("PACKAGE", SkinParameter.PACKAGE, new USymbolFolder(
|
public final static USymbol PACKAGE = record("PACKAGE", SkinParameter.PACKAGE, new USymbolFolder(
|
||||||
SkinParameter.PACKAGE, true));
|
SkinParameter.PACKAGE, true));
|
||||||
public final static USymbol FOLDER = record("FOLDER", SkinParameter.FOLDER, new USymbolFolder(SkinParameter.FOLDER, false));
|
public final static USymbol FOLDER = record("FOLDER", SkinParameter.FOLDER, new USymbolFolder(SkinParameter.FOLDER,
|
||||||
|
false));
|
||||||
public final static USymbol FILE = record("FILE", SkinParameter.FILE, new USymbolFile());
|
public final static USymbol FILE = record("FILE", SkinParameter.FILE, new USymbolFile());
|
||||||
public final static USymbol RECTANGLE = record("RECTANGLE", SkinParameter.RECTANGLE, new USymbolRect(
|
public final static USymbol RECTANGLE = record("RECTANGLE", SkinParameter.RECTANGLE, new USymbolRect(
|
||||||
SkinParameter.RECTANGLE, HorizontalAlignment.CENTER));
|
SkinParameter.RECTANGLE));
|
||||||
|
public final static USymbol ARCHIMATE = record("ARCHIMATE", SkinParameter.ARCHIMATE, new USymbolRect(
|
||||||
|
SkinParameter.ARCHIMATE));
|
||||||
public final static USymbol COLLECTIONS = record("COLLECTIONS", SkinParameter.COLLECTIONS, new USymbolCollections(
|
public final static USymbol COLLECTIONS = record("COLLECTIONS", SkinParameter.COLLECTIONS, new USymbolCollections(
|
||||||
SkinParameter.RECTANGLE, HorizontalAlignment.CENTER));
|
SkinParameter.RECTANGLE));
|
||||||
public final static USymbol AGENT = record("AGENT", SkinParameter.AGENT, new USymbolRect(SkinParameter.AGENT,
|
public final static USymbol AGENT = record("AGENT", SkinParameter.AGENT, new USymbolRect(SkinParameter.AGENT));
|
||||||
HorizontalAlignment.CENTER));
|
|
||||||
public final static USymbol ACTOR = record("ACTOR", SkinParameter.ACTOR, new USymbolActor());
|
public final static USymbol ACTOR = record("ACTOR", SkinParameter.ACTOR, new USymbolActor());
|
||||||
public final static USymbol USECASE = null;
|
public final static USymbol USECASE = null;
|
||||||
public final static USymbol COMPONENT1 = record("COMPONENT1", SkinParameter.COMPONENT1, new USymbolComponent1());
|
public final static USymbol COMPONENT1 = record("COMPONENT1", SkinParameter.COMPONENT1, new USymbolComponent1());
|
||||||
@ -81,9 +83,9 @@ public abstract class USymbol {
|
|||||||
|
|
||||||
abstract public SkinParameter getSkinParameter();
|
abstract public SkinParameter getSkinParameter();
|
||||||
|
|
||||||
public USymbol withStereoAlignment(HorizontalAlignment alignment) {
|
// public USymbol withStereoAlignment(HorizontalAlignment alignment) {
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public FontParam getFontParam() {
|
public FontParam getFontParam() {
|
||||||
return getSkinParameter().getFontParam();
|
return getSkinParameter().getFontParam();
|
||||||
@ -124,10 +126,11 @@ public abstract class USymbol {
|
|||||||
return symbol;
|
return symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract TextBlock asSmall(TextBlock name, TextBlock label, TextBlock stereotype, SymbolContext symbolContext);
|
public abstract TextBlock asSmall(TextBlock name, TextBlock label, TextBlock stereotype,
|
||||||
|
SymbolContext symbolContext, HorizontalAlignment stereoAlignment);
|
||||||
|
|
||||||
public abstract TextBlock asBig(TextBlock label, HorizontalAlignment labelAlignment, TextBlock stereotype,
|
public abstract TextBlock asBig(TextBlock label, HorizontalAlignment labelAlignment, TextBlock stereotype,
|
||||||
double width, double height, SymbolContext symbolContext);
|
double width, double height, SymbolContext symbolContext, HorizontalAlignment stereoAlignment);
|
||||||
|
|
||||||
static class Margin {
|
static class Margin {
|
||||||
private final double x1;
|
private final double x1;
|
||||||
|
@ -95,7 +95,7 @@ class USymbolArtifact extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -119,7 +119,7 @@ class USymbolArtifact extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -73,7 +73,7 @@ class USymbolCard extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -96,7 +96,7 @@ class USymbolCard extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -216,7 +216,7 @@ class USymbolCloud extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -239,7 +239,7 @@ class USymbolCloud extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -47,17 +47,17 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
|
|||||||
class USymbolCollections extends USymbol {
|
class USymbolCollections extends USymbol {
|
||||||
|
|
||||||
private final SkinParameter skinParameter;
|
private final SkinParameter skinParameter;
|
||||||
private final HorizontalAlignment stereotypeAlignement;
|
// private final HorizontalAlignment stereotypeAlignement;
|
||||||
|
|
||||||
public USymbolCollections(SkinParameter skinParameter, HorizontalAlignment stereotypeAlignement) {
|
public USymbolCollections(SkinParameter skinParameter) {
|
||||||
this.skinParameter = skinParameter;
|
this.skinParameter = skinParameter;
|
||||||
this.stereotypeAlignement = stereotypeAlignement;
|
// this.stereotypeAlignement = stereotypeAlignement;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public USymbol withStereoAlignment(HorizontalAlignment alignment) {
|
// public USymbol withStereoAlignment(HorizontalAlignment alignment) {
|
||||||
return new USymbolCollections(skinParameter, alignment);
|
// return new USymbolCollections(skinParameter, alignment);
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SkinParameter getSkinParameter() {
|
public SkinParameter getSkinParameter() {
|
||||||
@ -85,7 +85,7 @@ class USymbolCollections extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -95,7 +95,7 @@ class USymbolCollections extends USymbol {
|
|||||||
drawCollections(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing(),
|
drawCollections(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing(),
|
||||||
symbolContext.getRoundCorner());
|
symbolContext.getRoundCorner());
|
||||||
final Margin margin = getMargin();
|
final Margin margin = getMargin();
|
||||||
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, stereotypeAlignement);
|
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, stereoAlignment);
|
||||||
tb.drawU(ug.apply(new UTranslate(margin.getX1() - getDeltaCollection() / 2, margin.getY1()
|
tb.drawU(ug.apply(new UTranslate(margin.getX1() - getDeltaCollection() / 2, margin.getY1()
|
||||||
- getDeltaCollection() / 2)));
|
- getDeltaCollection() / 2)));
|
||||||
}
|
}
|
||||||
@ -110,7 +110,7 @@ class USymbolCollections extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
||||||
@ -120,7 +120,7 @@ class USymbolCollections extends USymbol {
|
|||||||
final Dimension2D dimStereo = stereotype.calculateDimension(ug.getStringBounder());
|
final Dimension2D dimStereo = stereotype.calculateDimension(ug.getStringBounder());
|
||||||
final double posStereoX;
|
final double posStereoX;
|
||||||
final double posStereoY;
|
final double posStereoY;
|
||||||
if (stereotypeAlignement == HorizontalAlignment.RIGHT) {
|
if (stereoAlignment == HorizontalAlignment.RIGHT) {
|
||||||
posStereoX = width - dimStereo.getWidth() - getMargin().getX1() / 2;
|
posStereoX = width - dimStereo.getWidth() - getMargin().getX1() / 2;
|
||||||
posStereoY = getMargin().getY1() / 2;
|
posStereoY = getMargin().getY1() / 2;
|
||||||
} else {
|
} else {
|
||||||
|
@ -75,7 +75,7 @@ class USymbolComponent1 extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -100,7 +100,7 @@ class USymbolComponent1 extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ class USymbolComponent2 extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -104,7 +104,7 @@ class USymbolComponent2 extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -114,7 +114,7 @@ class USymbolDatabase extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -137,7 +137,7 @@ class USymbolDatabase extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -105,7 +105,7 @@ class USymbolFile extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -129,7 +129,7 @@ class USymbolFile extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -134,7 +134,7 @@ public class USymbolFolder extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(final TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(final TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
@ -167,7 +167,7 @@ public class USymbolFolder extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -98,7 +98,7 @@ class USymbolFrame extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -122,7 +122,7 @@ class USymbolFrame extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -48,11 +48,22 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
|
|||||||
|
|
||||||
class USymbolNode extends USymbol {
|
class USymbolNode extends USymbol {
|
||||||
|
|
||||||
|
// private final HorizontalAlignment stereotypeAlignement;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SkinParameter getSkinParameter() {
|
public SkinParameter getSkinParameter() {
|
||||||
return SkinParameter.NODE;
|
return SkinParameter.NODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// public USymbolNode(HorizontalAlignment stereotypeAlignement) {
|
||||||
|
// this.stereotypeAlignement = stereotypeAlignement;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public USymbol withStereoAlignment(HorizontalAlignment alignment) {
|
||||||
|
// return new USymbolNode(alignment);
|
||||||
|
// }
|
||||||
|
|
||||||
private void drawNode(UGraphic ug, double width, double height, boolean shadowing) {
|
private void drawNode(UGraphic ug, double width, double height, boolean shadowing) {
|
||||||
final UPolygon shape = new UPolygon();
|
final UPolygon shape = new UPolygon();
|
||||||
shape.addPoint(0, 10);
|
shape.addPoint(0, 10);
|
||||||
@ -111,7 +122,7 @@ class USymbolNode extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -119,7 +130,7 @@ class USymbolNode extends USymbol {
|
|||||||
ug = symbolContext.apply(ug);
|
ug = symbolContext.apply(ug);
|
||||||
drawNode(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing());
|
drawNode(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing());
|
||||||
final Margin margin = getMargin();
|
final Margin margin = getMargin();
|
||||||
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, HorizontalAlignment.CENTER);
|
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, stereoAlignment);
|
||||||
final UGraphic ug2 = new MyUGraphicNode(ug, dim.getWidth());
|
final UGraphic ug2 = new MyUGraphicNode(ug, dim.getWidth());
|
||||||
tb.drawU(ug2.apply(new UTranslate(margin.getX1(), margin.getY1())));
|
tb.drawU(ug2.apply(new UTranslate(margin.getX1(), margin.getY1())));
|
||||||
}
|
}
|
||||||
@ -134,7 +145,7 @@ class USymbolNode extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -144,8 +155,15 @@ class USymbolNode extends USymbol {
|
|||||||
ug = ug.apply(new UTranslate(-4, 11));
|
ug = ug.apply(new UTranslate(-4, 11));
|
||||||
|
|
||||||
final Dimension2D dimStereo = stereotype.calculateDimension(ug.getStringBounder());
|
final Dimension2D dimStereo = stereotype.calculateDimension(ug.getStringBounder());
|
||||||
final double posStereo = (width - dimStereo.getWidth()) / 2;
|
final double posStereoX;
|
||||||
stereotype.drawU(ug.apply(new UTranslate(posStereo, 2)));
|
final double posStereoY = 2;
|
||||||
|
if (stereoAlignment == HorizontalAlignment.RIGHT) {
|
||||||
|
posStereoX = width - dimStereo.getWidth() - getMargin().getX1();
|
||||||
|
} else {
|
||||||
|
posStereoX = (width - dimStereo.getWidth()) / 2;
|
||||||
|
|
||||||
|
}
|
||||||
|
stereotype.drawU(ug.apply(new UTranslate(posStereoX, posStereoY)));
|
||||||
final Dimension2D dimTitle = title.calculateDimension(ug.getStringBounder());
|
final Dimension2D dimTitle = title.calculateDimension(ug.getStringBounder());
|
||||||
final double posTitle = (width - dimTitle.getWidth()) / 2;
|
final double posTitle = (width - dimTitle.getWidth()) / 2;
|
||||||
title.drawU(ug.apply(new UTranslate(posTitle, 2 + dimStereo.getHeight())));
|
title.drawU(ug.apply(new UTranslate(posTitle, 2 + dimStereo.getHeight())));
|
||||||
|
@ -129,7 +129,7 @@ class USymbolQueue extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -153,7 +153,7 @@ class USymbolQueue extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -49,17 +49,17 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
|
|||||||
class USymbolRect extends USymbol {
|
class USymbolRect extends USymbol {
|
||||||
|
|
||||||
private final SkinParameter skinParameter;
|
private final SkinParameter skinParameter;
|
||||||
private final HorizontalAlignment stereotypeAlignement;
|
// private final HorizontalAlignment stereotypeAlignement;
|
||||||
|
|
||||||
public USymbolRect(SkinParameter skinParameter, HorizontalAlignment stereotypeAlignement) {
|
public USymbolRect(SkinParameter skinParameter) {
|
||||||
this.skinParameter = skinParameter;
|
this.skinParameter = skinParameter;
|
||||||
this.stereotypeAlignement = stereotypeAlignement;
|
// this.stereotypeAlignement = stereotypeAlignement;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public USymbol withStereoAlignment(HorizontalAlignment alignment) {
|
// public USymbol withStereoAlignment(HorizontalAlignment alignment) {
|
||||||
return new USymbolRect(skinParameter, alignment);
|
// return new USymbolRect(skinParameter, alignment);
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SkinParameter getSkinParameter() {
|
public SkinParameter getSkinParameter() {
|
||||||
@ -96,7 +96,7 @@ class USymbolRect extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -106,7 +106,7 @@ class USymbolRect extends USymbol {
|
|||||||
drawRect(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing(),
|
drawRect(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing(),
|
||||||
symbolContext.getRoundCorner(), symbolContext.getDiagonalCorner());
|
symbolContext.getRoundCorner(), symbolContext.getDiagonalCorner());
|
||||||
final Margin margin = getMargin();
|
final Margin margin = getMargin();
|
||||||
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, stereotypeAlignement);
|
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, stereoAlignment);
|
||||||
tb.drawU(ug.apply(new UTranslate(margin.getX1(), margin.getY1())));
|
tb.drawU(ug.apply(new UTranslate(margin.getX1(), margin.getY1())));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +120,7 @@ class USymbolRect extends USymbol {
|
|||||||
|
|
||||||
@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 SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
||||||
@ -130,7 +130,7 @@ class USymbolRect extends USymbol {
|
|||||||
final Dimension2D dimStereo = stereotype.calculateDimension(ug.getStringBounder());
|
final Dimension2D dimStereo = stereotype.calculateDimension(ug.getStringBounder());
|
||||||
final double posStereoX;
|
final double posStereoX;
|
||||||
final double posStereoY;
|
final double posStereoY;
|
||||||
if (stereotypeAlignement == HorizontalAlignment.RIGHT) {
|
if (stereoAlignment == HorizontalAlignment.RIGHT) {
|
||||||
posStereoX = width - dimStereo.getWidth() - getMargin().getX1() / 2;
|
posStereoX = width - dimStereo.getWidth() - getMargin().getX1() / 2;
|
||||||
posStereoY = getMargin().getY1() / 2;
|
posStereoY = getMargin().getY1() / 2;
|
||||||
} else {
|
} else {
|
||||||
|
@ -45,7 +45,7 @@ abstract class USymbolSimpleAbstract extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
if (stereotype == null) {
|
if (stereotype == null) {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ abstract class USymbolSimpleAbstract extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ class USymbolStack extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -115,7 +115,7 @@ class USymbolStack extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ class USymbolStorage extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -88,7 +88,7 @@ class USymbolStorage extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -49,13 +49,13 @@ class USymbolTogether extends USymbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return TextBlockUtils.empty(10, 10);
|
return TextBlockUtils.empty(10, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
|
||||||
final double width, final double height, final SymbolContext symbolContext) {
|
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
@ -69,7 +69,7 @@ public class GTileNode extends AbstractTextBlock implements GTile {
|
|||||||
final SheetBlock1 sheetBlock1 = getTextBlock(display);
|
final SheetBlock1 sheetBlock1 = getTextBlock(display);
|
||||||
|
|
||||||
final SymbolContext symbolContext = new SymbolContext(HtmlColorUtils.MY_YELLOW, HtmlColorUtils.BLACK);
|
final SymbolContext symbolContext = new SymbolContext(HtmlColorUtils.MY_YELLOW, HtmlColorUtils.BLACK);
|
||||||
tb = USymbol.RECTANGLE.asSmall(null, sheetBlock1, TextBlockUtils.empty(0, 0), symbolContext);
|
tb = USymbol.RECTANGLE.asSmall(null, sheetBlock1, TextBlockUtils.empty(0, 0), symbolContext, HorizontalAlignment.CENTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SheetBlock1 getTextBlock(final Display display) {
|
public static SheetBlock1 getTextBlock(final Display display) {
|
||||||
|
@ -90,9 +90,8 @@ public class MindMapDiagram extends UmlDiagram {
|
|||||||
final double dpiFactor = scale == null ? getScaleCoef(fileFormatOption) : scale.getScale(100, 100);
|
final double dpiFactor = scale == null ? getScaleCoef(fileFormatOption) : scale.getScale(100, 100);
|
||||||
final ISkinParam skinParam = getSkinParam();
|
final ISkinParam skinParam = getSkinParam();
|
||||||
final ImageBuilder imageBuilder = new ImageBuilder(skinParam.getColorMapper(), dpiFactor,
|
final ImageBuilder imageBuilder = new ImageBuilder(skinParam.getColorMapper(), dpiFactor,
|
||||||
skinParam.getBackgroundColor(),
|
skinParam.getBackgroundColor(), fileFormatOption.isWithMetadata() ? getMetadata() : null, "", 10, 10,
|
||||||
fileFormatOption.isWithMetadata() ? getMetadata() : null,
|
null, skinParam.handwritten());
|
||||||
"", 10, 10, null, skinParam.handwritten());
|
|
||||||
TextBlock result = getTextBlock();
|
TextBlock result = getTextBlock();
|
||||||
|
|
||||||
result = new AnnotatedWorker(this, skinParam, fileFormatOption.getDefaultStringBounder()).addAdd(result);
|
result = new AnnotatedWorker(this, skinParam, fileFormatOption.getDefaultStringBounder()).addAdd(result);
|
||||||
|
@ -88,7 +88,7 @@ public class DiagElement {
|
|||||||
ColorParam.activityBorder.getDefaultValue()).withShadow(true);
|
ColorParam.activityBorder.getDefaultValue()).withShadow(true);
|
||||||
final TextBlock desc = toTextBlock(description);
|
final TextBlock desc = toTextBlock(description);
|
||||||
final TextBlock box = shape
|
final TextBlock box = shape
|
||||||
.asSmall(TextBlockUtils.empty(0, 0), desc, TextBlockUtils.empty(0, 0), symbolContext);
|
.asSmall(TextBlockUtils.empty(0, 0), desc, TextBlockUtils.empty(0, 0), symbolContext, HorizontalAlignment.CENTER);
|
||||||
return new LinkedElement(ad1, box, ad2, mainNetwork, this);
|
return new LinkedElement(ad1, box, ad2, mainNetwork, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ public class EvalBoolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isIdentifier() {
|
private boolean isIdentifier() {
|
||||||
return ch == '_' || Character.isLetterOrDigit(ch);
|
return ch == '_' || ch == '$' || Character.isLetterOrDigit(ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean eval() {
|
public boolean eval() {
|
||||||
|
@ -193,5 +193,9 @@ public class FileWithSuffix {
|
|||||||
public final String getSuffix() {
|
public final String getSuffix() {
|
||||||
return suffix;
|
return suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String toStringDebug() {
|
||||||
|
return file.getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
93
src/net/sourceforge/plantuml/preproc/Sub2.java
Normal file
93
src/net/sourceforge/plantuml/preproc/Sub2.java
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2020, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: http://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* http://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* http://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* 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 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.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.preproc;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.StringLocated;
|
||||||
|
import net.sourceforge.plantuml.tim.EaterException;
|
||||||
|
import net.sourceforge.plantuml.tim.EaterStartsub;
|
||||||
|
import net.sourceforge.plantuml.tim.TContext;
|
||||||
|
import net.sourceforge.plantuml.tim.TLineType;
|
||||||
|
import net.sourceforge.plantuml.tim.TMemory;
|
||||||
|
|
||||||
|
public class Sub2 {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final List<StringLocated> lines = new ArrayList<StringLocated>();
|
||||||
|
|
||||||
|
public Sub2(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(StringLocated s) {
|
||||||
|
this.lines.add(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final List<StringLocated> lines() {
|
||||||
|
return Collections.unmodifiableList(lines);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Sub2 fromFile(ReadLine reader, String blocname, TContext context, TMemory memory) throws IOException,
|
||||||
|
EaterException {
|
||||||
|
Sub2 result = null;
|
||||||
|
StringLocated s = null;
|
||||||
|
while ((s = reader.readLine()) != null) {
|
||||||
|
final TLineType type = TLineType.getFromLine(s.getStringTrimmed());
|
||||||
|
if (type == TLineType.STARTSUB) {
|
||||||
|
final EaterStartsub eater = new EaterStartsub(s.getStringTrimmed());
|
||||||
|
eater.execute(context, memory);
|
||||||
|
if (eater.getSubname().equals(blocname)) {
|
||||||
|
result = new Sub2(blocname);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (type == TLineType.ENDSUB && result != null) {
|
||||||
|
reader.close();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (result != null) {
|
||||||
|
result.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -35,7 +35,7 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.preproc;
|
package net.sourceforge.plantuml.preproc;
|
||||||
|
|
||||||
interface Truth {
|
public interface Truth {
|
||||||
public boolean isTrue(String name);
|
public boolean isTrue(String name);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -48,13 +48,11 @@ public class UncommentReadLine extends ReadLineInstrumented implements ReadLine
|
|||||||
private static final Pattern2 unpause = MyPattern.cmpile(StartUtils.PAUSE_PATTERN);
|
private static final Pattern2 unpause = MyPattern.cmpile(StartUtils.PAUSE_PATTERN);
|
||||||
|
|
||||||
private final ReadLine raw;
|
private final ReadLine raw;
|
||||||
// private final Pattern2 start;
|
|
||||||
private String headerToRemove;
|
private String headerToRemove;
|
||||||
private boolean paused;
|
private boolean paused;
|
||||||
|
|
||||||
public UncommentReadLine(ReadLine source) {
|
public UncommentReadLine(ReadLine source) {
|
||||||
this.raw = source;
|
this.raw = source;
|
||||||
// this.start = MyPattern.cmpile(StartUtils.START_PATTERN);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -70,10 +68,6 @@ public class UncommentReadLine extends ReadLineInstrumented implements ReadLine
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// final Matcher m = start.matcher(result);
|
|
||||||
// if (m.find()) {
|
|
||||||
// headerToRemove = m.group(1);
|
|
||||||
// }
|
|
||||||
final String tmp = StartUtils.beforeStartUml(result.getString());
|
final String tmp = StartUtils.beforeStartUml(result.getString());
|
||||||
if (tmp != null) {
|
if (tmp != null) {
|
||||||
headerToRemove = tmp;
|
headerToRemove = tmp;
|
||||||
|
@ -72,12 +72,12 @@ public class Preprocessor implements ReadLineNumbered {
|
|||||||
defines.saveState();
|
defines.saveState();
|
||||||
}
|
}
|
||||||
final ReadFilterAnd filtersV2 = new ReadFilterAnd();
|
final ReadFilterAnd filtersV2 = new ReadFilterAnd();
|
||||||
filtersV2.add(new ReadLineQuoteComment());
|
filtersV2.add(new ReadLineQuoteComment(true));
|
||||||
filtersV2.add(new SubPreprocessor(charset, definitionsContainer));
|
filtersV2.add(new ReadLineAddConfig(config));
|
||||||
this.sourceV2 = filtersV2.applyFilter(reader);
|
this.sourceV2 = filtersV2.applyFilter(reader);
|
||||||
|
|
||||||
final ReadFilterAnd filters = new ReadFilterAnd();
|
final ReadFilterAnd filters = new ReadFilterAnd();
|
||||||
filters.add(new ReadLineQuoteComment());
|
filters.add(new ReadLineQuoteComment(false));
|
||||||
include = new PreprocessorInclude(config, charset, defines, definitionsContainer, importedFiles,
|
include = new PreprocessorInclude(config, charset, defines, definitionsContainer, importedFiles,
|
||||||
filesUsedGlobal);
|
filesUsedGlobal);
|
||||||
filters.add(new ReadLineAddConfig(config));
|
filters.add(new ReadLineAddConfig(config));
|
||||||
|
@ -69,6 +69,7 @@ import net.sourceforge.plantuml.preproc.ReadLineSimple;
|
|||||||
import net.sourceforge.plantuml.preproc.ReadLineSingle;
|
import net.sourceforge.plantuml.preproc.ReadLineSingle;
|
||||||
import net.sourceforge.plantuml.preproc.StartDiagramExtractReader;
|
import net.sourceforge.plantuml.preproc.StartDiagramExtractReader;
|
||||||
import net.sourceforge.plantuml.preproc.Stdlib;
|
import net.sourceforge.plantuml.preproc.Stdlib;
|
||||||
|
import net.sourceforge.plantuml.tim.EaterException;
|
||||||
import net.sourceforge.plantuml.utils.StartUtils;
|
import net.sourceforge.plantuml.utils.StartUtils;
|
||||||
|
|
||||||
public class PreprocessorInclude implements ReadFilter {
|
public class PreprocessorInclude implements ReadFilter {
|
||||||
@ -336,7 +337,7 @@ public class PreprocessorInclude implements ReadFilter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ReadLine getReaderIncludeUrl(final URL url, StringLocated s, String suf, String charset) {
|
private static ReadLine getReaderIncludeUrl(final URL url, StringLocated s, String suf, String charset) {
|
||||||
try {
|
try {
|
||||||
if (StartDiagramExtractReader.containsStartDiagram(url, s, charset)) {
|
if (StartDiagramExtractReader.containsStartDiagram(url, s, charset)) {
|
||||||
return StartDiagramExtractReader.build(url, s, suf, charset);
|
return StartDiagramExtractReader.build(url, s, suf, charset);
|
||||||
@ -355,6 +356,25 @@ public class PreprocessorInclude implements ReadFilter {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ReadLine getReaderIncludeUrl2(final URL url, StringLocated s, String suf, String charset) throws EaterException {
|
||||||
|
try {
|
||||||
|
if (StartDiagramExtractReader.containsStartDiagram(url, s, charset)) {
|
||||||
|
return StartDiagramExtractReader.build(url, s, suf, charset);
|
||||||
|
}
|
||||||
|
final InputStream is = url.openStream();
|
||||||
|
if (charset == null) {
|
||||||
|
Log.info("Using default charset");
|
||||||
|
return ReadLineReader.create(new InputStreamReader(is), url.toString(), s.getLocation());
|
||||||
|
}
|
||||||
|
Log.info("Using charset " + charset);
|
||||||
|
return ReadLineReader.create(new InputStreamReader(is, charset), url.toString(), s.getLocation());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new EaterException("Cannot open URL");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public Set<FileWithSuffix> getFilesUsedGlobal() {
|
public Set<FileWithSuffix> getFilesUsedGlobal() {
|
||||||
return filesUsedGlobal;
|
return filesUsedGlobal;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
package net.sourceforge.plantuml.preproc2;
|
package net.sourceforge.plantuml.preproc2;
|
||||||
|
|
||||||
public enum PreprocessorIncludeStrategy {
|
public enum PreprocessorIncludeStrategy {
|
||||||
ONCE, MANY;
|
ONCE, MANY, DEFAULT;
|
||||||
|
|
||||||
public static PreprocessorIncludeStrategy fromString(String group) {
|
public static PreprocessorIncludeStrategy fromString(String group) {
|
||||||
if ("once".equalsIgnoreCase(group)) {
|
if ("once".equalsIgnoreCase(group)) {
|
||||||
|
@ -44,6 +44,8 @@ public interface PreprocessorModeSet {
|
|||||||
public void setPreprocessorMode(PreprocessorMode mode);
|
public void setPreprocessorMode(PreprocessorMode mode);
|
||||||
|
|
||||||
public ImportedFiles getImportedFiles();
|
public ImportedFiles getImportedFiles();
|
||||||
|
|
||||||
|
public String getCharset();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ public class ReadLineAddConfig implements ReadFilter {
|
|||||||
}
|
}
|
||||||
result = raw.readLine();
|
result = raw.readLine();
|
||||||
if (result != null && StartUtils.isArobaseStartDiagram(result.getString()) && config.size() > 0) {
|
if (result != null && StartUtils.isArobaseStartDiagram(result.getString()) && config.size() > 0) {
|
||||||
inserted = new ReadLineQuoteComment().applyFilter(new ReadLineList(config, result.getLocation()));
|
inserted = new ReadLineQuoteComment(false).applyFilter(new ReadLineList(config, result.getLocation()));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,17 @@ import net.sourceforge.plantuml.preproc.ReadLine;
|
|||||||
|
|
||||||
public class ReadLineQuoteComment implements ReadFilter {
|
public class ReadLineQuoteComment implements ReadFilter {
|
||||||
|
|
||||||
|
private final boolean ignoreMe;
|
||||||
|
|
||||||
|
public ReadLineQuoteComment(boolean ignoreMe) {
|
||||||
|
this.ignoreMe = ignoreMe;
|
||||||
|
}
|
||||||
|
|
||||||
public ReadLine applyFilter(final ReadLine source) {
|
public ReadLine applyFilter(final ReadLine source) {
|
||||||
|
if (ignoreMe) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
return new ReadLine() {
|
return new ReadLine() {
|
||||||
|
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
|
@ -178,7 +178,7 @@ public class SubPreprocessor implements ReadFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ReadLine getReaderIncludeWithoutComment(StringLocated s, final File f) {
|
private ReadLine getReaderIncludeWithoutComment(StringLocated s, final File f) {
|
||||||
return new ReadLineQuoteComment().applyFilter(getReaderIncludeRaw(s, f));
|
return new ReadLineQuoteComment(false).applyFilter(getReaderIncludeRaw(s, f));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ReadLine getReaderIncludeRaw(StringLocated s, final File f) {
|
private ReadLine getReaderIncludeRaw(StringLocated s, final File f) {
|
||||||
|
@ -209,11 +209,20 @@ public class CommandArrow extends SingleLineCommand2<SequenceDiagram> {
|
|||||||
if (circleAtStart) {
|
if (circleAtStart) {
|
||||||
config = config.withDecoration1(ArrowDecoration.CIRCLE);
|
config = config.withDecoration1(ArrowDecoration.CIRCLE);
|
||||||
}
|
}
|
||||||
if (dressing1.contains("x")) {
|
if (reverseDefine) {
|
||||||
config = config.withHead2(ArrowHead.CROSSX);
|
if (dressing1.contains("x")) {
|
||||||
}
|
config = config.withHead2(ArrowHead.CROSSX);
|
||||||
if (dressing2.contains("x")) {
|
}
|
||||||
config = config.withHead2(ArrowHead.CROSSX);
|
if (dressing2.contains("x")) {
|
||||||
|
config = config.withHead1(ArrowHead.CROSSX);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (dressing1.contains("x")) {
|
||||||
|
config = config.withHead1(ArrowHead.CROSSX);
|
||||||
|
}
|
||||||
|
if (dressing2.contains("x")) {
|
||||||
|
config = config.withHead2(ArrowHead.CROSSX);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (reverseDefine) {
|
if (reverseDefine) {
|
||||||
config = config.reverseDefine();
|
config = config.reverseDefine();
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user