Search in sources :

Example 1 with AbstractShapeDefinition

use of org.kie.workbench.common.stunner.svg.gen.model.impl.AbstractShapeDefinition 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;
}
Also used : ViewDefinitionImpl(org.kie.workbench.common.stunner.svg.gen.model.impl.ViewDefinitionImpl) NodeList(org.w3c.dom.NodeList) Element(org.w3c.dom.Element) Node(org.w3c.dom.Node) AbstractShapeDefinition(org.kie.workbench.common.stunner.svg.gen.model.impl.AbstractShapeDefinition) ViewDefinition(org.kie.workbench.common.stunner.svg.gen.model.ViewDefinition) PrimitiveDefinition(org.kie.workbench.common.stunner.svg.gen.model.PrimitiveDefinition) Document(org.w3c.dom.Document) LinkedList(java.util.LinkedList) GroupDefinition(org.kie.workbench.common.stunner.svg.gen.model.impl.GroupDefinition) ViewRefDefinition(org.kie.workbench.common.stunner.svg.gen.model.ViewRefDefinition) StyleSheetDefinition(org.kie.workbench.common.stunner.svg.gen.model.StyleSheetDefinition) TranslatorException(org.kie.workbench.common.stunner.svg.gen.exception.TranslatorException)

Aggregations

LinkedList (java.util.LinkedList)1 TranslatorException (org.kie.workbench.common.stunner.svg.gen.exception.TranslatorException)1 PrimitiveDefinition (org.kie.workbench.common.stunner.svg.gen.model.PrimitiveDefinition)1 StyleSheetDefinition (org.kie.workbench.common.stunner.svg.gen.model.StyleSheetDefinition)1 ViewDefinition (org.kie.workbench.common.stunner.svg.gen.model.ViewDefinition)1 ViewRefDefinition (org.kie.workbench.common.stunner.svg.gen.model.ViewRefDefinition)1 AbstractShapeDefinition (org.kie.workbench.common.stunner.svg.gen.model.impl.AbstractShapeDefinition)1 GroupDefinition (org.kie.workbench.common.stunner.svg.gen.model.impl.GroupDefinition)1 ViewDefinitionImpl (org.kie.workbench.common.stunner.svg.gen.model.impl.ViewDefinitionImpl)1 Document (org.w3c.dom.Document)1 Element (org.w3c.dom.Element)1 Node (org.w3c.dom.Node)1 NodeList (org.w3c.dom.NodeList)1