diff --git a/src/net/atmp/CucaDiagram.java b/src/net/atmp/CucaDiagram.java index 39cd59929..22ac06271 100644 --- a/src/net/atmp/CucaDiagram.java +++ b/src/net/atmp/CucaDiagram.java @@ -46,6 +46,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormatOption; @@ -84,10 +85,12 @@ import net.sourceforge.plantuml.security.SecurityUtils; import net.sourceforge.plantuml.skin.UmlDiagramType; import net.sourceforge.plantuml.skin.VisibilityModifier; import net.sourceforge.plantuml.statediagram.StateDiagram; +import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; import net.sourceforge.plantuml.svek.CucaDiagramFileMaker; import net.sourceforge.plantuml.svek.CucaDiagramFileMakerSvek; import net.sourceforge.plantuml.text.BackSlash; +import net.sourceforge.plantuml.text.Guillemet; import net.sourceforge.plantuml.xmi.CucaDiagramXmiMaker; import net.sourceforge.plantuml.xmlsc.StateDiagramScxmlMaker; @@ -523,6 +526,41 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy, return result; } + @Override + public List getVisibleStereotypeLabels(Entity entity) { + Stereotype stereotype = entity.getStereotype(); + + if (stereotype == null) { + return null; + } + + List commands = new ArrayList<>(); + for (EntityHideOrShow hideOrShowEntry : hideOrShows) { + if (hideOrShowEntry.portion == EntityPortion.STEREOTYPE) { + commands.add(hideOrShowEntry); + } + } + + List visibleStereotypeLabels = new ArrayList<>(); + for (String stereoTypeLabel: entity.getStereotype().getLabels(Guillemet.DOUBLE_COMPARATOR)) { + if (isHiddenStereotypeLabel(stereoTypeLabel, commands)) { + visibleStereotypeLabels.add(stereoTypeLabel); + } + } + + return visibleStereotypeLabels; + } + + private boolean isHiddenStereotypeLabel(String stereoTypeLabel, List commands) { + for (EntityHideOrShow cmd : commands) { + String gender = cmd.gender.getGender(); + if (gender != null && gender.equals(stereoTypeLabel)) { + return false; + } + } + return true; + } + public final void hideOrShow(EntityGender gender, EntityPortion portions, boolean show) { for (EntityPortion portion : portions.asSet()) this.hideOrShows.add(new EntityHideOrShow(gender, portion, show)); diff --git a/src/net/sourceforge/plantuml/abel/EntityGenderUtils.java b/src/net/sourceforge/plantuml/abel/EntityGenderUtils.java index 6c644a44d..4561c98f3 100644 --- a/src/net/sourceforge/plantuml/abel/EntityGenderUtils.java +++ b/src/net/sourceforge/plantuml/abel/EntityGenderUtils.java @@ -71,7 +71,14 @@ public class EntityGenderUtils { if (test.getStereotype() == null) { return false; } - return stereotype.equals(test.getStereotype().getLabel(Guillemet.DOUBLE_COMPARATOR)); + + for (String label : test.getStereotype().getLabels(Guillemet.DOUBLE_COMPARATOR)) { + if (label.equals(stereotype)) { + return true; + } + } + + return false; } @Override diff --git a/src/net/sourceforge/plantuml/cucadiagram/PortionShower.java b/src/net/sourceforge/plantuml/cucadiagram/PortionShower.java index c3d2a375e..0cb7cb926 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/PortionShower.java +++ b/src/net/sourceforge/plantuml/cucadiagram/PortionShower.java @@ -38,7 +38,11 @@ package net.sourceforge.plantuml.cucadiagram; import net.sourceforge.plantuml.abel.Entity; import net.sourceforge.plantuml.abel.EntityPortion; +import java.util.List; + public interface PortionShower { boolean showPortion(EntityPortion portion, Entity entity); + + List getVisibleStereotypeLabels(Entity entity); } diff --git a/src/net/sourceforge/plantuml/dot/DotData.java b/src/net/sourceforge/plantuml/dot/DotData.java index 5b35c7ad0..95a30aaab 100644 --- a/src/net/sourceforge/plantuml/dot/DotData.java +++ b/src/net/sourceforge/plantuml/dot/DotData.java @@ -37,6 +37,7 @@ package net.sourceforge.plantuml.dot; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -101,6 +102,11 @@ final public class DotData implements PortionShower { public boolean showPortion(EntityPortion portion, Entity entity) { return true; } + + public List getVisibleStereotypeLabels(Entity entity) { + return Collections.emptyList(); + } + }, entityFactory, isHideEmptyDescriptionForState, dotMode, namespaceSeparator, pragma); } @@ -136,6 +142,10 @@ final public class DotData implements PortionShower { return portionShower.showPortion(portion, entity); } + public List getVisibleStereotypeLabels(Entity entity) { + return portionShower.getVisibleStereotypeLabels(entity); + } + public Entity getRootGroup() { return entityFactory.getRootGroup(); } diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java b/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java index d6b885e53..b4cc279ce 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java @@ -68,6 +68,8 @@ import net.sourceforge.plantuml.svek.HeaderLayout; import net.sourceforge.plantuml.svek.ShapeType; import net.sourceforge.plantuml.text.Guillemet; +import java.util.List; + public class EntityImageClassHeader extends AbstractEntityImage { final private HeaderLayout headerLayout; @@ -112,11 +114,12 @@ public class EntityImageClassHeader extends AbstractEntityImage { } final TextBlock stereo; + List stereotypeLabels = portionShower.getVisibleStereotypeLabels(entity); if (stereotype == null || stereotype.getLabel(Guillemet.DOUBLE_COMPARATOR) == null - || portionShower.showPortion(EntityPortion.STEREOTYPE, entity) == false) + || stereotypeLabels.isEmpty()) stereo = null; else - stereo = TextBlockUtils.withMargin(Display.create(stereotype.getLabels(skinParam.guillemet())).create( + stereo = TextBlockUtils.withMargin(Display.create(stereotypeLabels).create( FontConfiguration.create(getSkinParam(), FontParam.CLASS_STEREOTYPE, stereotype), HorizontalAlignment.CENTER, skinParam), 1, 0);