/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.stunner.bpmn.backend.legacy; import java.util.Comparator; import java.util.List; import org.eclipse.bpmn2.BaseElement; import org.eclipse.bpmn2.FlowNode; import org.eclipse.bpmn2.Lane; import org.eclipse.bpmn2.LaneSet; import org.eclipse.bpmn2.SubProcess; import org.eclipse.bpmn2.di.BPMNEdge; import org.eclipse.bpmn2.di.BPMNShape; import org.eclipse.dd.di.DiagramElement; public final class DIZorderComparator implements Comparator<DiagramElement> { @Override public int compare(DiagramElement a, DiagramElement b) { boolean aShape = a instanceof BPMNShape; boolean bShape = b instanceof BPMNShape; boolean aEdge = a instanceof BPMNEdge; boolean bEdge = b instanceof BPMNEdge; if (aShape && bEdge) { return -1; } else if (aEdge && bShape) { return 1; } if (aShape && bShape) { return compareShape((BPMNShape) a, (BPMNShape) b); } return 0; } private int compareShape(BPMNShape a, BPMNShape b) { BaseElement aElem = a.getBpmnElement(); BaseElement bElem = b.getBpmnElement(); boolean aIsSecondTier = aElem instanceof Lane || aElem instanceof SubProcess; boolean bIsSecondTier = bElem instanceof Lane || bElem instanceof SubProcess; if (aIsSecondTier && bIsSecondTier) { if (isParent(aElem, bElem)) { return -1; } else if (isParent(bElem, aElem)) { return 1; } return 0; } else if (aIsSecondTier && !bIsSecondTier) { return -1; } else if (!aIsSecondTier && bIsSecondTier) { return 1; } return 0; } private boolean isParent(BaseElement parent, BaseElement child) { if (child instanceof FlowNode) { if (((FlowNode) child).getLanes().contains(parent)) { return true; } else if (parent instanceof Lane) { return isChildParent(parent, child); } } else if (parent instanceof Lane) { if (child instanceof Lane) { LaneSet childLaneSet = ((Lane) parent).getChildLaneSet(); if (childLaneSet == null) { return false; } if (((Lane) parent).getChildLaneSet().getLanes().contains(child)) { return true; } return isChildParent(parent, child); } } return false; } private boolean isChildParent(BaseElement parent, BaseElement child) { LaneSet childLaneSet = ((Lane) parent).getChildLaneSet(); if (childLaneSet == null) { return false; } List<Lane> lanes = childLaneSet.getLanes(); for (Lane lane : lanes) { if (isParent(lane, child)) { return true; } } return false; } }