use of org.kie.workbench.common.stunner.svg.gen.model.PrimitiveDefinition in project kie-wb-common by kiegroup.
the class SVGPrimitiveGeneratorUtils method generateSvgPrimitive.
public static String generateSvgPrimitive(final String instanceId, final Function<PrimitiveDefinition, PrimitiveDefinitionGenerator<PrimitiveDefinition<?>>> generatorProvider, final PrimitiveDefinition child, final Predicate<PrimitiveDefinition> generationFilter) {
String childRaw = null;
try {
final StringBuffer childBuffer = generatorProvider.apply(child).generate(child);
final String scalableRaw = String.valueOf(child.isScalable());
final LayoutDefinition layoutDefinition = child.getLayoutDefinition();
final String childLayoutRaw = formatLayout(layoutDefinition);
if (generationFilter.test(child)) {
if (child instanceof ShapeDefinition) {
childRaw = AbstractGenerator.formatString(NEW_SVG_SHAPE_TEMPLATE, instanceId, childBuffer.toString(), scalableRaw, childLayoutRaw);
} else if (child instanceof GroupDefinition) {
final GroupDefinition groupDefinition = (GroupDefinition) child;
final List<PrimitiveDefinition> children = groupDefinition.getChildren();
if (children.stream().anyMatch(generationFilter)) {
// Generate the group primitive.
childRaw = AbstractGenerator.formatString(NEW_SVG_CONTAINER_TEMPLATE, instanceId, groupDefinition.getId(), childBuffer.toString(), scalableRaw, childLayoutRaw);
// Generate the group children ones.
for (final PrimitiveDefinition childDef : children) {
final String childDefInstanceId = SVGGeneratorFormatUtils.getValidInstanceId(childDef);
final String childDefRaw = generateSvgPrimitive(childDefInstanceId, generatorProvider, childDef, generationFilter);
if (null != childDefRaw) {
childRaw += childDefRaw;
childRaw += AbstractGenerator.formatString(GROUP_ADD_CHILD_TEMPLATE, instanceId, childDefInstanceId);
}
}
}
}
}
} catch (GeneratorException e) {
throw new RuntimeException(e);
}
return childRaw;
}
use of org.kie.workbench.common.stunner.svg.gen.model.PrimitiveDefinition in project kie-wb-common by kiegroup.
the class SVGDocumentTranslatorImpl method translate.
@Override
@SuppressWarnings("unchecked")
public ViewDefinition<SVGShapeView> translate(final SVGTranslatorContext context) throws TranslatorException {
final Document root = context.getRoot();
final StyleSheetDefinition styleSheetDefinition = context.getGlobalStyleSheet().orElse(null);
// Initialze the context with the available translators.
context.setElementTranslators(elementTranslators);
// Process the SVG node stuff.
final double[] svgCoord = new double[] { 0d, 0d };
final double[] svgSize = new double[] { 0d, 0d };
final ViewDefinition.ViewBoxDefinition[] viewBox = new ViewDefinition.ViewBoxDefinition[1];
final NodeList svgNodes = root.getElementsByTagName(SVG_TAG);
if (null != svgNodes && svgNodes.getLength() > 1) {
throw new TranslatorException("Only a single SVG node supported.!");
} else if (null == svgNodes || svgNodes.getLength() == 0) {
throw new TranslatorException("No SVG root node found!");
}
final Element svgNode = (Element) svgNodes.item(0);
// SVG id.
String svgId = svgNode.getAttribute(ID);
if (isEmpty(svgId)) {
throw new TranslatorException("The SVG node must contain a valid ID attribute.");
}
context.setSVGId(svgId);
if (null == context.getViewId()) {
svgId = svgNode.getAttribute(ID);
context.setViewId(svgId);
}
// View box.
final String x = svgNode.getAttribute(X);
final String y = svgNode.getAttribute(Y);
final String width = svgNode.getAttribute(WIDTH);
if (isEmpty(width)) {
throw new TranslatorException("The SVG node [" + svgId + "] must contain a valid WIDTH attribute.");
}
final String height = svgNode.getAttribute(HEIGHT);
if (isEmpty(height)) {
throw new TranslatorException("The SVG node [" + svgId + "] must contain a valid HEIGHT attribute.");
}
svgCoord[0] = SVGAttributeParser.toPixelValue(x, X_DEFAULT);
svgCoord[1] = SVGAttributeParser.toPixelValue(y, Y_DEFAULT);
svgSize[0] = SVGAttributeParser.toPixelValue(width);
svgSize[1] = SVGAttributeParser.toPixelValue(height);
final String vbox = svgNode.getAttribute(VIEW_BOX);
if (isEmpty(vbox)) {
throw new TranslatorException("The SVG node [" + svgId + "] must contain a valid VIEWBOX attribute.");
}
viewBox[0] = SVGViewBoxTranslator.translate(vbox);
// Parser innver SVG View elements.
ShapeDefinition<?> main = null;
final List<PrimitiveDefinition<?>> result = new LinkedList<>();
final NodeList nodes = svgNode.getChildNodes();
if (null != nodes) {
for (int i = 0; i < nodes.getLength(); i++) {
final Node node = nodes.item(i);
if (node instanceof Element) {
final Element element = (Element) node;
final SVGElementTranslator<Element, Object> translator = context.getElementTranslator(element.getTagName());
if (null != translator) {
final Object definition = translator.translate(element, context);
if (null != definition) {
if (definition instanceof PrimitiveDefinition) {
final PrimitiveDefinition primitiveDefinition = (PrimitiveDefinition) definition;
if (null == main) {
main = (ShapeDefinition<?>) primitiveDefinition;
} else {
result.add(primitiveDefinition);
}
} else if (definition instanceof ViewRefDefinition) {
context.addSVGViewRef((ViewRefDefinition) definition);
}
}
}
}
}
}
if (null == main) {
throw new TranslatorException("No SVG main node found.");
}
if (main instanceof GroupDefinition) {
throw new TranslatorException("Main node cannot be a group.");
}
// Main view shape should listen for events.
if (main instanceof AbstractShapeDefinition) {
((AbstractShapeDefinition) main).setMainShape(true);
((AbstractShapeDefinition) main).setListening(true);
}
// Generate the view definition instance.
final ViewDefinition viewDefinition = new ViewDefinitionImpl(svgId, svgCoord[0], svgCoord[1], svgSize[0], svgSize[1], styleSheetDefinition, viewBox[0], main, result.toArray(new PrimitiveDefinition<?>[result.size()]));
viewDefinition.getSVGViewRefs().addAll(context.getViewRefDefinitions());
return viewDefinition;
}
use of org.kie.workbench.common.stunner.svg.gen.model.PrimitiveDefinition in project kie-wb-common by kiegroup.
the class SVGViewDefinitionGenerator method generate.
@Override
@SuppressWarnings("unchecked")
public StringBuffer generate(final ViewFactory viewFactory, final ViewDefinition<SVGShapeView> viewDefinition) throws GeneratorException {
StringBuffer result = null;
final String factoryName = viewFactory.getSimpleName();
final String viewId = viewDefinition.getId();
final String methodName = viewDefinition.getFactoryMethodName();
final ShapeDefinition main = viewDefinition.getMain();
if (null != main) {
final Map<String, Object> root = new HashMap<>();
// Generate the children primitives.
final List<String> childrenRaw = new LinkedList<>();
final List<PrimitiveDefinition> children = viewDefinition.getChildren();
for (final PrimitiveDefinition child : children) {
final String childId = SVGGeneratorFormatUtils.getValidInstanceId(child);
String childRaw = SVGPrimitiveGeneratorUtils.generateSvgPrimitive(childId, SVGViewDefinitionGenerator::getGenerator, child);
if (null != childRaw) {
childrenRaw.add(childRaw);
childrenRaw.add(AbstractGenerator.formatString(PRIM_CHILD_TEMPLATE, childId));
}
}
// SVG View children.
final List<String> svgChildrenRaw = new LinkedList<>();
final List<ViewRefDefinition> svgViewRefs = viewDefinition.getSVGViewRefs();
svgViewRefs.forEach(viewRef -> {
final String parent = viewRef.getParent();
final String svgName = viewRef.getFilePath();
final String viewRefId = viewRef.getViewRefId();
final boolean existReferencedView = viewFactory.getViewDefinitions().stream().anyMatch(def -> viewRefId.equals(def.getId()));
if (existReferencedView) {
final String childRaw = formatString(SVG_CHILD_TEMPLATE, parent, factoryName, viewRefId);
svgChildrenRaw.add(childRaw);
} else {
throw new RuntimeException("The view [" + viewRefId + "] references " + "another the view [" + svgName + "], but no factory method " + "for it exists in [" + viewFactory.getImplementedType() + "]");
}
});
// Look for the state shape view.
final List<ShapeDefinition> stateViews = new LinkedList<>();
SVGModelUtils.visit(viewDefinition, p -> {
if (p instanceof ShapeDefinition && SVGPrimitiveGeneratorUtils.CAN_GENERATE_PRIMITIVE_CODE.test(p)) {
final ShapeDefinition shapeDefinition = (ShapeDefinition) p;
shapeDefinition.getStateDefinition().ifPresent(s -> stateViews.add((ShapeDefinition) p));
}
});
final String stateViewIds = stateViews.isEmpty() ? "view" : stateViews.stream().map(d -> SVGGeneratorFormatUtils.getValidInstanceId(d.getId())).collect(Collectors.joining(","));
final String stateViewPolicyType = stateViews.isEmpty() ? ShapeStateDefaultHandler.RenderType.STROKE.name() : ((ShapeDefinition.ShapeStateDefinition) stateViews.get(0).getStateDefinition().get()).name();
final String stateViewPolicy = ShapeStateDefaultHandler.RenderType.class.getName().replace("$", ".") + "." + stateViewPolicyType.toUpperCase();
// Generate the main shape.
final PrimitiveDefinitionGenerator<PrimitiveDefinition<?>> mainGenerator = getGenerator(main);
final StringBuffer mainBuffer = mainGenerator.generate(main);
final LayoutDefinition mainLayoutDefinition = main.getLayoutDefinition();
final String mainLayoutRaw = SVGPrimitiveGeneratorUtils.formatLayout(mainLayoutDefinition);
// Generate the view's text styling stuff.
final StyleSheetDefinition globalStyleSheetDefinition = ((ViewDefinitionImpl) viewDefinition).getGlobalStyleSheetDefinition();
final String viewTextRaw = null != globalStyleSheetDefinition ? SVGShapeTextCodeBuilder.generate("view", viewId, globalStyleSheetDefinition) : "";
// Populate the context and generate using the template.
root.put("viewId", viewId);
root.put("name", methodName);
root.put("mainShape", mainBuffer.toString());
root.put("layout", mainLayoutRaw);
root.put("width", formatDouble(viewDefinition.getWidth()));
root.put("height", formatDouble(viewDefinition.getHeight()));
root.put("text", viewTextRaw);
root.put("stateViewIds", stateViewIds);
root.put("stateViewPolicy", stateViewPolicy);
root.put("children", childrenRaw);
root.put("svgChildren", svgChildrenRaw);
try {
result = writeTemplate(root);
} catch (final GenerationException e) {
throw new GeneratorException(e);
}
}
return result;
}
use of org.kie.workbench.common.stunner.svg.gen.model.PrimitiveDefinition in project kie-wb-common by kiegroup.
the class SVGGroupTranslator method doTranslate.
@Override
protected GroupDefinition doTranslate(final Element element, final SVGTranslatorContext context) throws TranslatorException {
final String id = getId(element);
final GroupDefinition groupDefinition = new GroupDefinition(id);
final NodeList childNodes = element.getChildNodes();
if (null != childNodes && childNodes.getLength() > 0) {
for (int i = 0; i < childNodes.getLength(); i++) {
final Node child = childNodes.item(i);
if (child instanceof Element) {
final Element childElement = (Element) child;
final SVGElementTranslator<Element, Object> translator = context.getElementTranslator(childElement.getTagName());
if (null != translator) {
final Object childDefinition = translator.translate(childElement, context);
if (childDefinition instanceof ViewRefDefinition) {
context.addSVGViewRef((ViewRefDefinition) childDefinition);
} else if (childDefinition instanceof ShapeDefinition) {
groupDefinition.getChildren().add((PrimitiveDefinition) childDefinition);
} else if (childDefinition instanceof GroupDefinition) {
throw new UnsupportedOperationException("Nested SVG groups are not allowed! [svgId=" + context.getSVGId() + "]");
}
}
}
}
}
return groupDefinition;
}
use of org.kie.workbench.common.stunner.svg.gen.model.PrimitiveDefinition in project kie-wb-common by kiegroup.
the class SVGDocumentTranslatorTest method testTranslate.
@Test
public void testTranslate() throws Exception {
final ViewDefinition<SVGShapeView> viewDefinition = translator.translate(new SVGTranslatorContext(svgTest, "", styleSheetDefinition));
assertNotNull(viewDefinition);
assertEquals("svg-test-file", viewDefinition.getId());
// View definition's viewBox.
final ViewDefinition.ViewBoxDefinition viewBox = viewDefinition.getViewBox();
assertNotNull(viewBox);
final double minX = viewBox.getMinX();
final double minY = viewBox.getMinY();
final double width = viewBox.getWidth();
final double height = viewBox.getHeight();
assertEquals(minX, 0d, 0d);
assertEquals(minY, 0d, 0d);
assertEquals(width, 448d, 0d);
assertEquals(height, 448d, 0d);
// View definition's main shape.
final PrimitiveDefinition mainShapeDef = viewDefinition.getMain();
assertNotNull(mainShapeDef);
assertTrue(mainShapeDef instanceof MultiPathDefinition);
final MultiPathDefinition mainPathDef = (MultiPathDefinition) mainShapeDef;
SVGTranslationTestAssertions.assertPath(mainPathDef);
assertTrue(mainPathDef.isListening());
// View definition's child shapes.
final List<PrimitiveDefinition> childrenDefs = viewDefinition.getChildren();
assertNotNull(childrenDefs);
assertTrue(childrenDefs.size() == 3);
final RectDefinition rectDefinition = (RectDefinition) childrenDefs.get(0);
SVGTranslationTestAssertions.assertRectangle(rectDefinition);
assertFalse(rectDefinition.isListening());
final CircleDefinition circleDefinition = (CircleDefinition) childrenDefs.get(1);
SVGTranslationTestAssertions.assertCircle(circleDefinition);
assertFalse(circleDefinition.isListening());
// Assert other svg reference elements.
final GroupDefinition groupDefinition = (GroupDefinition) childrenDefs.get(2);
assertFalse(groupDefinition.isListening());
SVGTranslationTestAssertions.assertGroupRef(groupDefinition);
final List<ViewRefDefinition> svgViewRefs = viewDefinition.getSVGViewRefs();
assertNotNull(svgViewRefs);
assertTrue(svgViewRefs.size() == 1);
final ViewRefDefinition viewRefDef = svgViewRefs.get(0);
SVGTranslationTestAssertions.assertViewRef(viewRefDef);
}
Aggregations