diff --git a/open-bpmn.glsp-client/workspace/demo/test.bpmn b/open-bpmn.glsp-client/workspace/demo/test.bpmn index cae2d987..10b32405 100644 --- a/open-bpmn.glsp-client/workspace/demo/test.bpmn +++ b/open-bpmn.glsp-client/workspace/demo/test.bpmn @@ -1,8 +1,11 @@ + + + - + sequenceFlow_lSyUUw sequenceFlow_Z90WfQ @@ -13,16 +16,16 @@ sequenceFlow_fOGZ3Q sequenceFlow_FM0m0Q - + sequenceFlow_lSyUUw - + sequenceFlow_1avBJw sequenceFlow_fOGZ3Q - + sequenceFlow_Z90WfQ sequenceFlow_1avBJw @@ -33,7 +36,7 @@ - + @@ -52,9 +55,9 @@ - + - + @@ -70,12 +73,11 @@ - + - diff --git a/open-bpmn.glsp-server/src/main/java/org/openbpmn/extensions/AbstractBPMNElementExtension.java b/open-bpmn.glsp-server/src/main/java/org/openbpmn/extensions/AbstractBPMNElementExtension.java index 42949731..0057c438 100644 --- a/open-bpmn.glsp-server/src/main/java/org/openbpmn/extensions/AbstractBPMNElementExtension.java +++ b/open-bpmn.glsp-server/src/main/java/org/openbpmn/extensions/AbstractBPMNElementExtension.java @@ -30,9 +30,6 @@ import org.openbpmn.bpmn.BPMNNS; import org.openbpmn.bpmn.elements.Event; import org.openbpmn.bpmn.elements.core.BPMNElement; -import org.openbpmn.bpmn.elements.core.BPMNElementNode; -import org.openbpmn.bpmn.elements.core.BPMNLabel; -import org.openbpmn.bpmn.exceptions.BPMNMissingElementException; import org.openbpmn.bpmn.exceptions.BPMNModelException; import org.openbpmn.glsp.bpmn.BPMNGEdge; import org.openbpmn.glsp.bpmn.BPMNGNode; @@ -103,9 +100,13 @@ public int getPriority() { * corresponding GNode Element in the diagram plane. *

* The method distinguish between embedded labels (Task) and BPMNLabes. - * - * In case of a LabelGNode elements can support multilineor simple line + *

+ * In case of a LabelGNode elements can support multiline or simple line * GLabel elements + *

+ * Note: If the name is empty an existing gMultiLineTextNode will be removed. + * This has the effect that not blank area is shown in the diagram for elements + * with out a label. The method automatically recreates the label if missing. * * @param json * @param bpmnElement @@ -117,6 +118,7 @@ public void updateNameProperty(final JsonObject json, BPMNElement bpmnElement, // Update the name feature String name = json.getString("name", ""); if (!name.equals(bpmnElement.getName())) { + bpmnElement.setName(name); if (gNodeElement instanceof BPMNGNode || gNodeElement instanceof BPMNGEdge) { @@ -134,24 +136,23 @@ public void updateNameProperty(final JsonObject json, BPMNElement bpmnElement, if (gModelElement instanceof LabelGNode) { LabelGNode lgn = (LabelGNode) gModelElement; // update the bpmn-text-node of the GNodeElement. - // Here we use the recomputeBPMNLabelHeight method to optimize - // the height of the BPMNLabel gMultiLineTextNode = BPMNGModelUtil.findMultiLineTextNode(lgn); if (gMultiLineTextNode != null) { gMultiLineTextNode.getArgs().put("text", name); - LabelGNode label = (LabelGNode) gModelElement; - try { - BPMNLabel bpmnLabel = ((BPMNElementNode) bpmnElement).getLabel(); - // BPMNGModelUtil.optimizeBPMNLabelHeight(label, bpmnLabel, name); - } catch (BPMNMissingElementException e) { - e.printStackTrace(); - } + } + // if empty then we remove the lable element + if (name.isEmpty()) { + modelState.reset(); } } else { // default to GLabel GLabel gLabel = (GLabel) gModelElement; gLabel.setText(name); } + } else { + // the gLabel was not found. This can be the case if the element had no label + // before. So we reset the model to ensure the correct position of the label. + modelState.reset(); } } } diff --git a/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/elements/label/LabelGNodeBuilder.java b/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/elements/label/LabelGNodeBuilder.java index d271c646..a987d53a 100644 --- a/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/elements/label/LabelGNodeBuilder.java +++ b/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/elements/label/LabelGNodeBuilder.java @@ -21,10 +21,10 @@ import org.eclipse.glsp.graph.util.GConstants; import org.eclipse.glsp.graph.util.GraphUtil; import org.openbpmn.bpmn.BPMNTypes; -import org.openbpmn.bpmn.elements.Event; import org.openbpmn.bpmn.elements.core.BPMNElementNode; import org.openbpmn.bpmn.elements.core.BPMNLabel; import org.openbpmn.bpmn.exceptions.BPMNMissingElementException; +import org.openbpmn.bpmn.util.BPMNXMLUtil; import org.openbpmn.glsp.bpmn.BpmnFactory; import org.openbpmn.glsp.bpmn.LabelGNode; import org.openbpmn.glsp.utils.BPMNGModelUtil; @@ -65,34 +65,11 @@ public LabelGNodeBuilder(final BPMNElementNode flowElement) { y = flowElement.getLabel().getBounds().getPosition().getY(); width = flowElement.getLabel().getBounds().getDimension().getWidth(); height = flowElement.getLabel().getBounds().getDimension().getHeight(); - // If no x/y is set we compute the default position. This will also reflect to // the source model, if the model will be saved later by the user... - if (x == 0 || y == 0) { - x = flowElement.getBounds().getPosition().getX() + (Event.DEFAULT_WIDTH / 2) - - (BPMNLabel.DEFAULT_WIDTH / 2); - y = flowElement.getBounds().getPosition().getY() + Event.DEFAULT_HEIGHT + Event.LABEL_OFFSET; - // update source model with default width/height! - flowElement.getLabel().getBounds().setPosition(x, y); - } - // If no width/heigh is set or the width/height does not match - // the open bpmn DEFAULT_WIDTH/HEIGHT, we adjust the dimensions - // to the default settings. This will also reflect to the source model, - // if the model will be saved later by the user... - if (width != BPMNLabel.DEFAULT_WIDTH || height != BPMNLabel.DEFAULT_HEIGHT) { - if (width > 0) { - // adjust x postion ..... - double xOffset = ((BPMNLabel.DEFAULT_WIDTH - width) / 2); - x = x - xOffset; - flowElement.getLabel().getBounds().setPosition(x, y); - } - - width = BPMNLabel.DEFAULT_WIDTH; - height = BPMNLabel.DEFAULT_HEIGHT; - // update source model with default width/height! - flowElement.getLabel().getBounds().setDimension(width, height); + if (x == 0 || y == 0 || width == 0 || height == 0) { + BPMNXMLUtil.resetLabelBounds(flowElement); } - } } catch (BPMNMissingElementException e) { // failed to compute size diff --git a/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/model/BPMNGModelFactory.java b/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/model/BPMNGModelFactory.java index b9b95840..fdaaf9cf 100644 --- a/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/model/BPMNGModelFactory.java +++ b/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/model/BPMNGModelFactory.java @@ -66,6 +66,7 @@ import org.openbpmn.bpmn.elements.core.BPMNPoint; import org.openbpmn.bpmn.exceptions.BPMNMissingElementException; import org.openbpmn.bpmn.exceptions.BPMNModelException; +import org.openbpmn.bpmn.util.BPMNXMLUtil; import org.openbpmn.extensions.BPMNElementExtension; import org.openbpmn.glsp.bpmn.BPMNGEdge; import org.openbpmn.glsp.bpmn.DataObjectGNode; @@ -586,8 +587,15 @@ List computeGModelElements(final BPMNProcess process, final Parti // now add a GLabel BPMNLabel bpmnLabel = event.getLabel(); - LabelGNode labelNode = createLabelNode(bpmnLabel, event, participant); - gNodeList.add(labelNode); + // create only if name is defined + if (!event.getName().isEmpty()) { + LabelGNode labelNode = createLabelNode(bpmnLabel, event, participant); + gNodeList.add(labelNode); + } else { + // we do not draw gLabel because name is empty + // reset the position + BPMNXMLUtil.resetLabelBounds(event); + } } // Add all Gateways... @@ -607,8 +615,15 @@ List computeGModelElements(final BPMNProcess process, final Parti // now add a GLabel BPMNLabel bpmnLabel = gateway.getLabel(); - LabelGNode labelNode = createLabelNode(bpmnLabel, gateway, participant); - gNodeList.add(labelNode); + // create only if name is defined + if (!gateway.getName().isEmpty()) { + LabelGNode labelNode = createLabelNode(bpmnLabel, gateway, participant); + gNodeList.add(labelNode); + } else { + // we do not draw gLabel because name is empty + // reset the position + BPMNXMLUtil.resetLabelBounds(gateway); + } } // Add all Dataobjects... diff --git a/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/operations/BPMNChangeBoundsOperationHandler.java b/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/operations/BPMNChangeBoundsOperationHandler.java index 1f82c7c1..cad64467 100644 --- a/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/operations/BPMNChangeBoundsOperationHandler.java +++ b/open-bpmn.glsp-server/src/main/java/org/openbpmn/glsp/operations/BPMNChangeBoundsOperationHandler.java @@ -367,7 +367,9 @@ private void updateFlowElement(final GNode gNode, final BPMNElementNode bpmnElem BPMNLabel bpmnLabel = bpmnElementNode.getLabel(); GNode _labelnode = (GNode) modelState.getIndex() .get(bpmnElementNode.getId() + "_bpmnlabel").orElse(null); - updateLabel(_labelnode, bpmnLabel, offsetX, offsetY); + if (_labelnode != null) { + updateLabel(_labelnode, bpmnLabel, offsetX, offsetY); + } } } diff --git a/open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/util/BPMNXMLUtil.java b/open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/util/BPMNXMLUtil.java index cf5db51b..9dacaffc 100644 --- a/open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/util/BPMNXMLUtil.java +++ b/open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/util/BPMNXMLUtil.java @@ -15,6 +15,13 @@ ********************************************************************************/ package org.openbpmn.bpmn.util; +import org.openbpmn.bpmn.BPMNModel; +import org.openbpmn.bpmn.elements.Event; +import org.openbpmn.bpmn.elements.Gateway; +import org.openbpmn.bpmn.elements.core.BPMNElementNode; +import org.openbpmn.bpmn.elements.core.BPMNLabel; +import org.openbpmn.bpmn.exceptions.BPMNMissingElementException; + /** * The BPMNXMLUtil provides helper methods for xml strings * @@ -23,6 +30,35 @@ */ public class BPMNXMLUtil { + /** + * This method resets the Label Postion and bounds to its default values. The + * method is used in cases where no bounds are set or in case the postion should + * be reset to the default position of a label. This will also reflect to the + * source model, if the model will be saved later by the user... + * + * @throws BPMNMissingElementException + */ + public static void resetLabelBounds(final BPMNElementNode flowElement) throws BPMNMissingElementException { + double x = 0; + double y = 0; + if (BPMNModel.isGateway(flowElement)) { + // gateway dimensions... + x = flowElement.getBounds().getPosition().getX() + (Gateway.DEFAULT_WIDTH / 2) + - (BPMNLabel.DEFAULT_WIDTH / 2); + y = flowElement.getBounds().getPosition().getY() + Gateway.DEFAULT_HEIGHT + Gateway.LABEL_OFFSET; + } else { + // default (events) + x = flowElement.getBounds().getPosition().getX() + (Event.DEFAULT_WIDTH / 2) + - (BPMNLabel.DEFAULT_WIDTH / 2); + y = flowElement.getBounds().getPosition().getY() + Event.DEFAULT_HEIGHT + Event.LABEL_OFFSET; + } + + // update source model with default width/height! + flowElement.getLabel().getBounds().setPosition(x, y); + // update source model with default width/height! + flowElement.getLabel().getBounds().setDimension(BPMNLabel.DEFAULT_WIDTH, BPMNLabel.DEFAULT_HEIGHT); + } + /** * This method removes whitespace around CDATA Tags like: *