mirror of
https://github.com/octoleo/plantuml.git
synced 2024-12-22 10:59:01 +00:00
fix: wip on various issues
https://github.com/plantuml/plantuml/issues/1352 https://github.com/plantuml/plantuml/issues/1348
This commit is contained in:
parent
cdec3380ec
commit
003222a00f
@ -719,4 +719,32 @@ final public class Entity implements SpecificBackcolorable, Hideable, Removeable
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean canBePacked() {
|
||||||
|
if (isPacked())
|
||||||
|
return false;
|
||||||
|
if (countChildren() != 1)
|
||||||
|
return false;
|
||||||
|
if (leafs().size() != 0)
|
||||||
|
return false;
|
||||||
|
for (Link link : entityFactory.getLinks())
|
||||||
|
if (link.contains(this))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
final Entity child = groups().iterator().next();
|
||||||
|
if (child.countChildren() == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean packed;
|
||||||
|
|
||||||
|
public final void setPacked(boolean packed) {
|
||||||
|
this.packed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isPacked() {
|
||||||
|
return packed;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -334,23 +334,19 @@ public class Link extends WithLinkType implements Hideable, Removeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean contains(Entity entity) {
|
public boolean contains(Entity entity) {
|
||||||
if (isSame(getEntity1(), entity))
|
if (getEntity1() == entity)
|
||||||
return true;
|
return true;
|
||||||
if (isSame(getEntity2(), entity))
|
if (getEntity2() == entity)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static private boolean isSame(Entity a, Entity b) {
|
|
||||||
return a == b;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Entity getOther(Entity entity) {
|
public Entity getOther(Entity entity) {
|
||||||
if (isSame(getEntity1(), entity))
|
if (getEntity1() == entity)
|
||||||
return getEntity2();
|
return getEntity2();
|
||||||
|
|
||||||
if (isSame(getEntity2(), entity))
|
if (getEntity2() == entity)
|
||||||
return getEntity1();
|
return getEntity1();
|
||||||
|
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
|
@ -45,6 +45,7 @@ import net.sourceforge.plantuml.abel.Link;
|
|||||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||||
import net.sourceforge.plantuml.core.ImageData;
|
import net.sourceforge.plantuml.core.ImageData;
|
||||||
import net.sourceforge.plantuml.core.UmlSource;
|
import net.sourceforge.plantuml.core.UmlSource;
|
||||||
|
import net.sourceforge.plantuml.klimt.creole.Display;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
import net.sourceforge.plantuml.objectdiagram.AbstractClassOrObjectDiagram;
|
import net.sourceforge.plantuml.objectdiagram.AbstractClassOrObjectDiagram;
|
||||||
import net.sourceforge.plantuml.plasma.Quark;
|
import net.sourceforge.plantuml.plasma.Quark;
|
||||||
@ -118,10 +119,37 @@ public class ClassDiagram extends AbstractClassOrObjectDiagram {
|
|||||||
link2.setLength(1);
|
link2.setLength(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getPragma().useIntermediatePackages() == false)
|
||||||
|
packSomePackage();
|
||||||
|
|
||||||
this.applySingleStrategy();
|
this.applySingleStrategy();
|
||||||
return super.checkFinalError();
|
return super.checkFinalError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void packSomePackage() {
|
||||||
|
String separator = getNamespaceSeparator();
|
||||||
|
if (separator == null)
|
||||||
|
separator = ".";
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
boolean changed = false;
|
||||||
|
for (Entity group : this.entityFactory.groups()) {
|
||||||
|
if (group.canBePacked()) {
|
||||||
|
final Entity child = group.groups().iterator().next();
|
||||||
|
final String appended = group.getDisplay().get(0) + separator;
|
||||||
|
final Display newDisplay = child.getDisplay().appendFirstLine(appended);
|
||||||
|
child.setDisplay(newDisplay);
|
||||||
|
group.setPacked(true);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (changed == false)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public CommandExecutionResult checkIfPackageHierarchyIfOk(Entity entity) {
|
public CommandExecutionResult checkIfPackageHierarchyIfOk(Entity entity) {
|
||||||
Quark<Entity> current = entity.getQuark().getParent();
|
Quark<Entity> current = entity.getQuark().getParent();
|
||||||
while (current.isRoot() == false) {
|
while (current.isRoot() == false) {
|
||||||
|
@ -416,6 +416,12 @@ public class Display implements Iterable<CharSequence> {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Display appendFirstLine(String appended) {
|
||||||
|
final Display result = new Display(this.showStereotype, this, this.defaultCreoleMode);
|
||||||
|
result.displayData.set(0, appended + result.displayData.get(0));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public Display add(CharSequence s) {
|
public Display add(CharSequence s) {
|
||||||
final Display result = new Display(this.showStereotype, this, this.defaultCreoleMode);
|
final Display result = new Display(this.showStereotype, this, this.defaultCreoleMode);
|
||||||
result.displayData.add(s);
|
result.displayData.add(s);
|
||||||
|
@ -317,14 +317,18 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
if (g.getGroupType() == GroupType.CONCURRENT_STATE)
|
if (g.getGroupType() == GroupType.CONCURRENT_STATE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
final ClusterHeader clusterHeader = new ClusterHeader((Entity) g, diagram.getSkinParam(), diagram,
|
if (g.isPacked() == false) {
|
||||||
stringBounder);
|
final ClusterHeader clusterHeader = new ClusterHeader(g, diagram.getSkinParam(), diagram, stringBounder);
|
||||||
dotStringFactory.openCluster(g, clusterHeader);
|
dotStringFactory.openCluster(g, clusterHeader);
|
||||||
|
}
|
||||||
|
|
||||||
this.printEntities(g.leafs());
|
this.printEntities(g.leafs());
|
||||||
|
|
||||||
printAllSubgroups(g);
|
printAllSubgroups(g);
|
||||||
|
|
||||||
dotStringFactory.closeCluster();
|
if (g.isPacked() == false) {
|
||||||
|
dotStringFactory.closeCluster();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printEntities(Collection<Entity> entities) {
|
private void printEntities(Collection<Entity> entities) {
|
||||||
@ -361,8 +365,8 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
|
|
||||||
result = agnode(zz, cluster, new CString("z" + group.getUid()), true);
|
result = agnode(zz, cluster, new CString("z" + group.getUid()), true);
|
||||||
agsafeset(zz, result, new CString("shape"), new CString("box"), new CString(""));
|
agsafeset(zz, result, new CString("shape"), new CString("box"), new CString(""));
|
||||||
agsafeset(zz, result, new CString("width"), new CString("1"), new CString(""));
|
agsafeset(zz, result, new CString("width"), new CString("0.1"), new CString(""));
|
||||||
agsafeset(zz, result, new CString("height"), new CString("1"), new CString(""));
|
agsafeset(zz, result, new CString("height"), new CString("0.1"), new CString(""));
|
||||||
coreNodes.put(group, result);
|
coreNodes.put(group, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -373,7 +377,6 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
System.err.println("CANNOT FIND NODE");
|
System.err.println("CANNOT FIND NODE");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
System.err.println("exportEntity " + leaf);
|
|
||||||
final ST_Agnode_s agnode = agnode(zz, cluster, new CString(node.getUid()), true);
|
final ST_Agnode_s agnode = agnode(zz, cluster, new CString(node.getUid()), true);
|
||||||
agsafeset(zz, agnode, new CString("shape"), new CString("box"), new CString(""));
|
agsafeset(zz, agnode, new CString("shape"), new CString("box"), new CString(""));
|
||||||
final XDimension2D dim = getDim(node);
|
final XDimension2D dim = getDim(node);
|
||||||
@ -484,9 +487,14 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void exportGroup(Globals zz, ST_Agraph_s graph, Entity group) {
|
private void exportGroup(Globals zz, ST_Agraph_s graph, Entity group) {
|
||||||
|
if (group.isPacked()) {
|
||||||
|
this.exportEntities(zz, graph, group.leafs());
|
||||||
|
this.exportGroups(zz, graph, group);
|
||||||
|
return;
|
||||||
|
}
|
||||||
final Cluster cluster = getBibliotekon().getCluster(group);
|
final Cluster cluster = getBibliotekon().getCluster(group);
|
||||||
if (cluster == null) {
|
if (cluster == null) {
|
||||||
System.err.println("CucaDiagramFileMakerJDot::exportGroup issue");
|
System.err.println("CucaDiagramFileMakerSmetana::exportGroup issue");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
JUtils.LOG2("cluster = " + cluster.getClusterId());
|
JUtils.LOG2("cluster = " + cluster.getClusterId());
|
||||||
|
@ -74,6 +74,10 @@ public class Pragma {
|
|||||||
return "true".equalsIgnoreCase(s) || "on".equalsIgnoreCase(s);
|
return "true".equalsIgnoreCase(s) || "on".equalsIgnoreCase(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isFalse(final String s) {
|
||||||
|
return "false".equalsIgnoreCase(s) || "off".equalsIgnoreCase(s);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean useVerticalIf() {
|
public boolean useVerticalIf() {
|
||||||
return isTrue(getValue("useverticalif"));
|
return isTrue(getValue("useverticalif"));
|
||||||
}
|
}
|
||||||
@ -86,4 +90,8 @@ public class Pragma {
|
|||||||
return isTrue(getValue("kermor"));
|
return isTrue(getValue("kermor"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean useIntermediatePackages() {
|
||||||
|
return !isFalse(getValue("useintermediatepackages"));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -66,6 +66,10 @@ public class ClusterDotString {
|
|||||||
this.skinParam = skinParam;
|
this.skinParam = skinParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isPacked() {
|
||||||
|
return cluster.getGroup().isPacked();
|
||||||
|
}
|
||||||
|
|
||||||
void printInternal(StringBuilder sb, Collection<SvekLine> lines, StringBounder stringBounder, DotMode dotMode,
|
void printInternal(StringBuilder sb, Collection<SvekLine> lines, StringBounder stringBounder, DotMode dotMode,
|
||||||
GraphvizVersion graphvizVersion, UmlDiagramType type) {
|
GraphvizVersion graphvizVersion, UmlDiagramType type) {
|
||||||
if (cluster.diagram.getPragma().useKermor()) {
|
if (cluster.diagram.getPragma().useKermor()) {
|
||||||
@ -73,6 +77,14 @@ public class ClusterDotString {
|
|||||||
graphvizVersion, type);
|
graphvizVersion, type);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
final boolean packed = isPacked();
|
||||||
|
|
||||||
|
if (packed) {
|
||||||
|
cluster.printCluster1(sb, lines, stringBounder);
|
||||||
|
final SvekNode added = cluster.printCluster2(sb, lines, stringBounder, dotMode, graphvizVersion, type);
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
final boolean thereALinkFromOrToGroup2 = isThereALinkFromOrToGroup(lines);
|
final boolean thereALinkFromOrToGroup2 = isThereALinkFromOrToGroup(lines);
|
||||||
boolean thereALinkFromOrToGroup1 = thereALinkFromOrToGroup2;
|
boolean thereALinkFromOrToGroup1 = thereALinkFromOrToGroup2;
|
||||||
final boolean useProtectionWhenThereALinkFromOrToGroup = graphvizVersion
|
final boolean useProtectionWhenThereALinkFromOrToGroup = graphvizVersion
|
||||||
@ -154,6 +166,8 @@ public class ClusterDotString {
|
|||||||
SvekUtils.println(sb);
|
SvekUtils.println(sb);
|
||||||
}
|
}
|
||||||
SvekUtils.println(sb);
|
SvekUtils.println(sb);
|
||||||
|
|
||||||
|
// -----------
|
||||||
cluster.printCluster1(sb, lines, stringBounder);
|
cluster.printCluster1(sb, lines, stringBounder);
|
||||||
|
|
||||||
final SvekNode added = cluster.printCluster2(sb, lines, stringBounder, dotMode, graphvizVersion, type);
|
final SvekNode added = cluster.printCluster2(sb, lines, stringBounder, dotMode, graphvizVersion, type);
|
||||||
@ -167,6 +181,8 @@ public class ClusterDotString {
|
|||||||
}
|
}
|
||||||
SvekUtils.println(sb);
|
SvekUtils.println(sb);
|
||||||
|
|
||||||
|
// -----------
|
||||||
|
|
||||||
sb.append("}");
|
sb.append("}");
|
||||||
if (protection1)
|
if (protection1)
|
||||||
sb.append("}");
|
sb.append("}");
|
||||||
|
@ -415,6 +415,9 @@ public class DotStringFactory implements Moveable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (Cluster cluster : bibliotekon.allCluster()) {
|
for (Cluster cluster : bibliotekon.allCluster()) {
|
||||||
|
if (cluster.getGroup().isPacked())
|
||||||
|
continue;
|
||||||
|
|
||||||
int idx = getClusterIndex(svg, cluster.getColor());
|
int idx = getClusterIndex(svg, cluster.getColor());
|
||||||
final int starting = idx;
|
final int starting = idx;
|
||||||
final List<XPoint2D> points = svgResult.substring(starting).extractList(SvgResult.POINTS_EQUALS);
|
final List<XPoint2D> points = svgResult.substring(starting).extractList(SvgResult.POINTS_EQUALS);
|
||||||
|
@ -72,7 +72,8 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage
|
|||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
|
||||||
for (Cluster cluster : dotStringFactory.getBibliotekon().allCluster())
|
for (Cluster cluster : dotStringFactory.getBibliotekon().allCluster())
|
||||||
cluster.drawU(ug, dotData.getUmlDiagramType());
|
if (cluster.getGroup().isPacked() == false)
|
||||||
|
cluster.drawU(ug, dotData.getUmlDiagramType());
|
||||||
|
|
||||||
final Style style2 = getDefaultStyleDefinition(null)
|
final Style style2 = getDefaultStyleDefinition(null)
|
||||||
.getMergedStyle(dotData.getSkinParam().getCurrentStyleBuilder());
|
.getMergedStyle(dotData.getSkinParam().getCurrentStyleBuilder());
|
||||||
|
Loading…
Reference in New Issue
Block a user