public class SCLScenegraph {
private static final Logger LOGGER = LoggerFactory.getLogger(SCLScenegraph.class);
+
+ private static final String MAIN_SECTION = "main";
+ private static final String SELECTION_SECTION = "selection";
+ private static final String SELECTION_MASK_SECTION = "selectionMask";
+
+ private static final String[] ALL_SECTIONS = { MAIN_SECTION, SELECTION_SECTION, SELECTION_MASK_SECTION };
+
public static ICanvasSceneGraphProvider getICanvasSceneGraphProvider(Resource model, Resource diagram, String diagramRVI) throws DatabaseException, InterruptedException {
ICanvasSceneGraphProvider provider = DiagramNodeUtil.loadSceneGraphProvider(model, diagram, diagramRVI);
});
}
+ static class RenderSVGContext {
+
+ Map<String,StringBuilder> documents = new HashMap<>();
+
+ public void append(String[] keys, String svgText) {
+ for(String key : keys) append(key, svgText);
+ }
+
+ public void append(String key, String svgText) {
+ StringBuilder builder = documents.get(key);
+ if(builder == null) {
+ builder = new StringBuilder();
+ documents.put(key, builder);
+ }
+ builder.append(svgText);
+ }
+
+ public void append(RenderSVGContext other) {
+ for(String key : other.documents.keySet()) {
+ append(key, other.get(key));
+ }
+ }
+
+ public String get(String key) {
+ StringBuilder builder = documents.get(key);
+ if(builder == null) return "";
+ else return builder.toString();
+ }
+
+ }
+
private static String renderSVG0(ICanvasContext ctx, Function1<Set<?>, Map<?, ?>> mappingFunction) {
// Get a DOMImplementation.
// Create an instance of the SVG Generator.
SVGGraphics2D svgGenerator = new Generator(document);
- StringBuilder result = new StringBuilder();
+ RenderSVGContext result = new RenderSVGContext();
try {
double trX = -1 * content.getX();
double trY = -1 * content.getY();
+
+ result.append(MAIN_SECTION, "<g transform=\"translate(");
+ result.append(MAIN_SECTION, "" + trX);
+ result.append(MAIN_SECTION, " ");
+ result.append(MAIN_SECTION, "" + trY);
+ result.append(MAIN_SECTION, "\">");
- result.append("<svg width=\"100%\" height=\"100%\" stroke=\"black\"><g transform=\"translate(").append(trX).append(' ').append(trY).append(")\">");
-
+ result.append(SELECTION_SECTION, "<g class=\"selections\">");
+
+ result.append(SELECTION_MASK_SECTION, "<g class=\"selectionMasks\">");
+
KeyVisitor keyVisitor = new KeyVisitor();
sg.accept(keyVisitor);
Map<?, ?> mappings = mappingFunction.apply(keys);
IG2DNodeVisitor visitor = new PrintingVisitor(result, mappings);
+
sg.accept(visitor);
} catch (Throwable t) {
LOGGER.error("Problems rendering canvas context to SVG", t);
}
- result.append("</g></svg>");
- //System.err.println(" == FINAL RESULT == ");
- //System.err.println(b);
- return result.toString();
+
+ result.append(SELECTION_SECTION, "</g>");
+ result.append(SELECTION_MASK_SECTION, "</g>");
+ result.append(MAIN_SECTION, "</g>");
+
+ StringBuilder res = new StringBuilder();
+ res.append("<svg width=\"100%\" height=\"100%\" stroke=\"black\">");
+ res.append(result.get(MAIN_SECTION));
+ res.append(result.get(SELECTION_SECTION));
+ res.append(result.get(SELECTION_MASK_SECTION));
+ res.append(result.get("</svg>"));
+
+// System.err.println(" == FINAL RESULT == ");
+// System.err.println(res.toString());
+
+ return res.toString();
+
}
int indent = 0;
- HashMap<SingleElementNode,StringBuilder> senBuilders = new HashMap<>();
+ HashMap<SingleElementNode,RenderSVGContext> senBuilders = new HashMap<>();
- private StringBuilder result;
+ private RenderSVGContext result;
private Map<?, ?> mappings;
- public PrintingVisitor(StringBuilder result, Map<?, ?> mappings) {
+ public PrintingVisitor(RenderSVGContext result, Map<?, ?> mappings) {
this.result = result;
this.mappings = mappings;
}
@Override
public void enter(IG2DNode node) {
- StringBuilder parentBuilder = getParentBuilder(node);
+ RenderSVGContext parentBuilder = getParentBuilder(node);
indent++;
if(node instanceof ConnectionNode) {
}
String key = getKey((ConnectionNode) node);
- parentBuilder.append("\n<g class=\"connection\" id=\"" + key + "\">");
+ parentBuilder.append(MAIN_SECTION, "\n<g class=\"connection\" id=\"" + key + "\">");
+ parentBuilder.append(SELECTION_SECTION, "\n<g style=\"visibility:hidden\" class=\"selection\" id=\"" + key + "\">");
+ parentBuilder.append(SELECTION_MASK_SECTION, "\n<g class=\"selectionMask\" opacity=\"0.001\" id=\"" + key + "\">");
+
Element doc = renderSVGNode((IG2DNode)node);
String svg = printSVGDocument(doc);
- parentBuilder.append(svg);
+ parentBuilder.append(MAIN_SECTION, svg);
for(RouteGraphNode n : NodeUtil.collectNodes(node, RouteGraphNode.class)) {
n.setIgnoreSelection(false);
}
- parentBuilder.append("\n<g style=\"visibility:hidden\" class=\"selection\" id=\"" + key + "\">");
doc = renderSVGNode((IG2DNode)node);
svg = printSVGDocument(doc);
- parentBuilder.append(svg);
- parentBuilder.append("\n</g>");
+ parentBuilder.append(SELECTION_SECTION, svg);
- BasicStroke bs = new BasicStroke(5f);
+ BasicStroke bs = new BasicStroke(10f);
for(RouteGraphNode n : NodeUtil.collectNodes(node, RouteGraphNode.class)) {
n.setDynamicStroke(bs);
}
- parentBuilder.append("\n<g class=\"selectionMask\" opacity=\"0.001\" id=\"" + key + "\">");
doc = renderSVGNode((IG2DNode)node);
svg = printSVGDocument(doc);
- parentBuilder.append(svg);
- parentBuilder.append("\n</g>");
+ parentBuilder.append(SELECTION_MASK_SECTION, svg);
- parentBuilder.append("\n</g>");
+ parentBuilder.append(SELECTION_MASK_SECTION, "\n</g>");
+ parentBuilder.append(SELECTION_SECTION, "\n</g>");
+ parentBuilder.append(MAIN_SECTION, "\n</g>");
} else if (node instanceof SelectionNode) {
SingleElementNode parentSEN = (SingleElementNode)NodeUtil.getNearestParentOfType(node, SingleElementNode.class);
if(parentSEN != null && parentSEN.getKey() != null) {
- StringBuilder parentBuilder2 = getParentBuilder(parentSEN);
+ RenderSVGContext parentBuilder2 = getParentBuilder(parentSEN);
String key = getKey(parentSEN);
Element doc = renderSVGNode((IG2DNode)node);
String svg = printSVGDocument(doc);
- parentBuilder2.append("\n<g style=\"visibility:hidden\" class=\"selection\" id=\"" + key + "\">");
- parentBuilder2.append(svg);
- parentBuilder2.append("\n</g>");
- parentBuilder2.append("\n<g class=\"selectionMask\" id=\"" + key + "\">");
+ parentBuilder2.append(SELECTION_SECTION, "\n<g style=\"visibility:hidden\" class=\"selection\" id=\"" + key + "\">");
+ parentBuilder2.append(SELECTION_SECTION, svg);
+ parentBuilder2.append(SELECTION_SECTION, "\n</g>");
+ parentBuilder2.append(SELECTION_MASK_SECTION, "\n<g class=\"selectionMask\" id=\"" + key + "\">");
Rectangle2D rect = n.getRect();
- parentBuilder2.append("<rect style=\"fill:#fff\" opacity=\"0.001\"");
- parentBuilder2.append(" x=\"" + rect.getX() + "\" y=\"" + rect.getY() + "\"");
- parentBuilder2.append(" width=\"" + rect.getWidth() + "\" height=\"" + rect.getHeight() + "\"");
- parentBuilder2.append("></rect>");
- parentBuilder2.append("\n</g>");
+ parentBuilder2.append(SELECTION_MASK_SECTION,"<rect style=\"fill:#fff\" opacity=\"0.001\"");
+ parentBuilder2.append(SELECTION_MASK_SECTION," x=\"" + rect.getX() + "\" y=\"" + rect.getY() + "\"");
+ parentBuilder2.append(SELECTION_MASK_SECTION," width=\"" + rect.getWidth() + "\" height=\"" + rect.getHeight() + "\"");
+ parentBuilder2.append(SELECTION_MASK_SECTION,"></rect>");
+ parentBuilder2.append(SELECTION_MASK_SECTION,"\n</g>");
}
} else if (node instanceof SVGNode) {
SVGNode svg = (SVGNode)node;
- parentBuilder.append(svg.getSVGText());
+ parentBuilder.append(MAIN_SECTION, svg.getSVGText());
} else if (node instanceof G2DParentNode) {
AffineTransform at = node.getTransform();
if(node instanceof SingleElementNode) {
SingleElementNode sen = (SingleElementNode)node;
if(sen.getKey() != null) {
String key = getKey(sen);
- parentBuilder.append("\n<g class=\"definedElement\" id=\"" + key + "\">");
+ String typeClass = sen.getTypeClass();
+ String clazz = "definedElement";
+ if(typeClass != null && !typeClass.isEmpty())
+ clazz = clazz + " " + typeClass;
+
+ parentBuilder.append(MAIN_SECTION, "\n<g class=\""+clazz+"\" id=\"" + key + "\">");
}
- senBuilders.put(sen, new StringBuilder());
+ senBuilders.put(sen, new RenderSVGContext());
}
if(!at.isIdentity()) {
if(at.getScaleX() == 1.0 && at.getScaleY() == 1.0 && at.getShearX() == 0.0 && at.getShearY() == 0.0) {
String m = "translate(" + at.getTranslateX() + " " + at.getTranslateY() + ")";
- parentBuilder.append("\n<g transform=\"" + m + "\">");
+ parentBuilder.append(ALL_SECTIONS, "\n<g transform=\"" + m + "\">");
} else {
double[] ds = new double[6];
at.getMatrix(ds);
String m = "matrix(" + ds[0] + " " + ds[1] + " " + ds[2] + " " + ds[3] + " " + ds[4] + " " + ds[5] + ")";
- parentBuilder.append("\n<g transform=\"" + m + "\">");
+ parentBuilder.append(ALL_SECTIONS, "\n<g transform=\"" + m + "\">");
}
}
}
}
- private StringBuilder getParentBuilder(IG2DNode node) {
+ private RenderSVGContext getParentBuilder(IG2DNode node) {
INode parentSEN = NodeUtil.getNearestParentOfType(node, SingleElementNode.class);
if(parentSEN instanceof G2DSceneGraph) return result;
- StringBuilder parentBuilder = senBuilders.get(parentSEN);
+ RenderSVGContext parentBuilder = senBuilders.get(parentSEN);
if(parentBuilder == null) return result;
return parentBuilder;
// We are done
} else if (node instanceof G2DParentNode) {
- StringBuilder parentBuilder = getParentBuilder(node);
+ RenderSVGContext parentBuilder = getParentBuilder(node);
if(node instanceof SingleElementNode) {
- SingleElementNode sen = (SingleElementNode)node;
-// if(sen.getKey() != null) {
- StringBuilder b = senBuilders.get(sen);
- String content = b.toString();
- if(content.isEmpty()) {
- if(sen.getKey() != null) {
-
- for(SelectionNode n : NodeUtil.collectNodes(node, SelectionNode.class)) {
- n.setIgnore(true);
- }
-
- Element doc = renderSVGNode((IG2DNode)node);
- String svg = printSVGDocument(doc);
- parentBuilder.append(svg);
- }
- } else {
- parentBuilder.append(content);
- }
-// }
+ SingleElementNode sen = (SingleElementNode)node;
+ RenderSVGContext b = senBuilders.get(sen);
+ String content = b.get(MAIN_SECTION);
+ if(content.isEmpty()) {
+ if(sen.getKey() != null) {
+
+ for(SelectionNode n : NodeUtil.collectNodes(node, SelectionNode.class)) {
+ n.setIgnore(true);
+ }
+
+ Element doc = renderSVGNode((IG2DNode)node);
+ String svg = printSVGDocument(doc);
+ parentBuilder.append(MAIN_SECTION, svg);
+ }
+ } else {
+ parentBuilder.append(b);
+ }
}
-
AffineTransform at = node.getTransform();
if(!at.isIdentity()) {
- parentBuilder.append("</g>");
+ parentBuilder.append(ALL_SECTIONS, "</g>");
}
if(node instanceof SingleElementNode) {
SingleElementNode sen = (SingleElementNode)node;
if(sen.getKey() != null) {
- parentBuilder.append("</g>");
+ parentBuilder.append(MAIN_SECTION, "</g>");
}
}
}