1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-05-29 22:50:48 +00:00
plantuml/src/net/sourceforge/plantuml/cucadiagram/Stereotype.java
Arnaud Roques 9bdc69ecee wip
2022-09-20 22:35:41 +02:00

232 lines
7.1 KiB
Java

/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2023, 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.cucadiagram;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourceforge.plantuml.Guillemet;
import net.sourceforge.plantuml.SpriteContainer;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.sprite.Sprite;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.svek.PackageStyle;
import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.color.HColor;
import net.sourceforge.plantuml.ugraphic.color.HColorSet;
import net.sourceforge.plantuml.ugraphic.color.NoSuchColorException;
public class Stereotype implements CharSequence {
private final double radius;
private final UFont circledFont;
private final boolean automaticPackageStyle;
private final StereotypeDecoration decoration;
private Stereotype(boolean automaticPackageStyle, String label, StereotypeDecoration decoration, double radius,
UFont circledFont) {
this.automaticPackageStyle = automaticPackageStyle;
this.radius = radius;
this.circledFont = circledFont;
this.decoration = Objects.requireNonNull(decoration);
}
private static void checkLabel(String label) {
if (label.startsWith("<<") == false || label.endsWith(">>") == false)
throw new IllegalArgumentException(label);
}
public static Stereotype build(String label) {
return build(label, true);
}
public static Stereotype build(String label, boolean automaticPackageStyle) {
checkLabel(label);
final StereotypeDecoration decoration = StereotypeDecoration.buildSimple(label);
return new Stereotype(automaticPackageStyle, label, decoration, 0, null);
}
public static Stereotype build(String label, double radius, UFont circledFont, HColorSet htmlColorSet)
throws NoSuchColorException {
checkLabel(label);
final StereotypeDecoration decoration = StereotypeDecoration.buildComplex(label, htmlColorSet);
return new Stereotype(true, label, decoration, radius, circledFont);
}
public HColor getHtmlColor() {
return decoration.htmlColor;
}
public char getCharacter() {
return decoration.character;
}
public final TextBlock getSprite(SpriteContainer container) {
if (decoration.spriteName == null || container == null)
return null;
final Sprite tmp = container.getSprite(decoration.spriteName);
if (tmp == null)
return null;
return tmp.asTextBlock(getHtmlColor(), decoration.spriteScale);
}
public boolean isWithOOSymbol() {
return "<<O-O>>".equalsIgnoreCase(decoration.label);
}
public List<String> getMultipleLabels() {
final List<String> result = new ArrayList<>();
final Pattern p = Pattern.compile("\\<\\<\\s?((?:\\<&\\w+\\>|[^<>])+?)\\s?\\>\\>");
final Matcher m = p.matcher(decoration.label);
while (m.find())
result.add(m.group(1));
return Collections.unmodifiableList(result);
}
public boolean isSpotted() {
return decoration.character != 0;
}
@Override
public String toString() {
if (decoration.character == 0)
return decoration.label;
return decoration.character + " " + decoration.label;
}
public char charAt(int arg0) {
return toString().charAt(arg0);
}
public int length() {
return toString().length();
}
public CharSequence subSequence(int arg0, int arg1) {
return toString().subSequence(arg0, arg1);
}
public double getRadius() {
return radius;
}
public final UFont getCircledFont() {
return circledFont;
}
public String getLabel(Guillemet guillemet) {
if (isWithOOSymbol())
return null;
if (decoration.spriteName != null && decoration.spriteName.startsWith("archimate/"))
return guillemet.manageGuillemet("<<" + decoration.spriteName.substring("archimate/".length()) + ">>");
return guillemet.manageGuillemet(decoration.label);
}
public List<String> getLabels(Guillemet guillemet) {
final String labelLocal = getLabel(Guillemet.DOUBLE_COMPARATOR);
if (labelLocal == null)
return Collections.emptyList();
return StereotypeDecoration.cutLabels(labelLocal, guillemet);
}
public List<Style> getStyles(StyleBuilder builder) {
final List<Style> result = new ArrayList<>();
for (String s : getStyleNames()) {
final Style style = builder.createStyle(s);
assert (style != null);
result.add(style);
}
return Collections.unmodifiableList(result);
}
public List<String> getStyleNames() {
return decoration.getStyleNames();
}
public PackageStyle getPackageStyle() {
if (automaticPackageStyle == false)
return null;
for (PackageStyle p : EnumSet.allOf(PackageStyle.class))
if (("<<" + p + ">>").equalsIgnoreCase(decoration.label))
return p;
return null;
}
public boolean isBiddableOrUncertain() {
return decoration.label.equalsIgnoreCase("<<B>>") || decoration.label.equalsIgnoreCase("<<Biddable>>")
|| decoration.label.equalsIgnoreCase("<<Uncertain>>");
}
public boolean isCausal() {
return decoration.label.equalsIgnoreCase("<<C>>") || decoration.label.equalsIgnoreCase("<<Causal>>");
}
public boolean isLexicalOrGiven() {
return decoration.label.equalsIgnoreCase("<<L>>") || decoration.label.equalsIgnoreCase("<<Lexical>>")
|| decoration.label.equalsIgnoreCase("<<X>>") || decoration.label.equalsIgnoreCase("<<Given>>");
}
public boolean isDesignedOrSolved() {
return decoration.label.equalsIgnoreCase("<<D>>") || decoration.label.equalsIgnoreCase("<<Designed>>")
|| decoration.label.equalsIgnoreCase("<<Nested>>") || decoration.label.equalsIgnoreCase("<<Solved>>");
}
public boolean isMachineOrSpecification() {
return decoration.label.equalsIgnoreCase("M") || decoration.label.equalsIgnoreCase("<<Machine>>")
|| decoration.label.equalsIgnoreCase("<<S>>") || decoration.label.equalsIgnoreCase("<<Spec>>")
|| decoration.label.equalsIgnoreCase("<<Specification>>");
}
}