/** * layoutCombinedFragment * * @param fragmentNodeList void */ private void layoutCombinedFragment(List<NotationNode> fragmentNodeList) { if (fragmentNodeList.size() <= 0) { return; } NotationNode fragmentNode; for (int i = 0; i < fragmentNodeList.size(); i++) { fragmentNode = fragmentNodeList.get(i); if (isMoveFragment(fragmentNode)) { fragmentNode.setX(fragmentNode.getX() + (newX - oldX)); } else if (isResizeFragment(fragmentNode)) { fragmentNode.setWidth(fragmentNode.getWidth() + (newX - oldX)); if (fragmentNode.getCompartmentList().size() > 0) { List<NotationNode> list = new ArrayList<NotationNode>(); for (AbstractNode abstractNode : fragmentNode.getCompartmentList()) { ContainerNode operandNode = (ContainerNode) abstractNode; List<NotationNode> combindFragmentNodeList = SequenceUtil.getOnlyCombindFragmentNodeList(operandNode.getNodeList()); list.addAll(combindFragmentNodeList); } layoutCombinedFragment(list); } } } }
/** @see org.eclipse.gef.commands.Command#execute() */ @Override public void execute() { node.setX(newX); setLifeLineLayout(); if (diagram != null) { SequenceUtil.refreshLifeLineOrder(diagram); } }
/** Move 되는 위치에 따라서 다이어그램 내의 다른 LifeLine의 위치를 조정한다. void */ private void setLifeLineLayout() { LifeLineNode lifeLineNode; LifeLineNode otherLifeLineNode; for (int i = 0; i < lifeLineNodeList.size(); i++) { lifeLineNode = (LifeLineNode) lifeLineNodeList.get(i); if (node.equals(lifeLineNode)) { for (int k = i + 1; k < lifeLineNodeList.size(); k++) { otherLifeLineNode = (LifeLineNode) lifeLineNodeList.get(k); otherLifeLineNode.setX(otherLifeLineNode.getX() + (newX - oldX)); } break; } } layoutCombinedFragment(SequenceUtil.getOnlyCombindFragmentNodeList(diagram.getNodeList())); }
/** @see org.eclipse.gef.commands.Command#execute() */ @Override public void execute() { boolean resize = false; int delta = 0; if (newConstraint.height - oldConstraint.height != 0 && newConstraint.y - oldConstraint.y != 0) { if (newConstraint.y - oldConstraint.y != 0) { notationNode.setY(newConstraint.y); notationNode.setWidth(newConstraint.width); notationNode.setHeight(newConstraint.height); int lastNodeInedex = notationNode.getCompartmentList().size() - 1; ContainerNode operandNode = (ContainerNode) notationNode.getCompartmentList().get(lastNodeInedex); operandNode.setHeight(newConstraint.height); return; } } if (newConstraint.height - oldConstraint.height != 0) { resize = true; delta = newConstraint.height - oldConstraint.height; SequenceUtil.shiftByNewInputBounds(delta, notationNode, resize); } if (newConstraint.y - oldConstraint.y != 0) { delta = newConstraint.y - oldConstraint.y; SequenceUtil.shiftByNewInputBounds(delta, notationNode, resize); } notationNode.setWidth(newConstraint.width); notationNode.setY(newConstraint.y); if (notationNode.getParent() instanceof ContainerNode) { int absoluteY = SequenceUtil.translateToAbsoluteYByParentNode( 0, (ContainerNode) notationNode.getParent(), notationNode); Diagram diagram = SequenceUtil.getDiagram(notationNode); List<NotationNode> allFragments = SequenceUtil.getAllCombinedFragmentNodeInDiagram(diagram); // 중복 시프트를 하지 않도록 프래그먼트 리스트를 검사하여 부모-자식 관계의 프래그먼트는 자식을 리스트에서 삭제한다. SequenceUtil.checkDuplicatedNode(allFragments); for (NotationNode abstractNode : allFragments) { // 프래그먼트 하위요소가 아니면 넘어감. if (!(abstractNode.getParent() instanceof ContainerNode)) { continue; } // 같은 부모를 가지고 있는지 확인. if (!SequenceUtil.getAncestor(notationNode) .equals(SequenceUtil.getAncestor(abstractNode))) { continue; } if (notationNode.getCompartmentList().contains(abstractNode.getParent())) { continue; } int absoluteNodeY = SequenceUtil.translateToAbsoluteYByParentNode( 0, (ContainerNode) abstractNode.getParent(), abstractNode); // if (absoluteY < absoluteNodeY && absoluteY + notationNode.getHeight() < // absoluteNodeY ) { // abstractNode.setY(abstractNode.getY() + delta); // } else if (absoluteY + notationNode.getHeight() < absoluteNodeY) { // abstractNode.setY(abstractNode.getY() + delta); // } if (notationNode.getY() + notationNode.getHeight() < absoluteNodeY && absoluteNodeY < notationNode.getY() + notationNode.getHeight() - delta) { abstractNode.setY(abstractNode.getY() + delta); } else if (notationNode.getY() + notationNode.getHeight() < absoluteNodeY && absoluteNodeY < notationNode.getY() + notationNode.getHeight()) { abstractNode.setY(abstractNode.getY() + delta); } else if (notationNode.getY() < abstractNode.getY()) { abstractNode.setY(abstractNode.getY() + delta); } } } if (resize) { notationNode.setHeight(newConstraint.height); // 아래로 높이가 변경된 경우 int fragmentHeightConstraint = newConstraint.height - oldConstraint.height; if (fragmentHeightConstraint != 0) { // 높이가 변경된 경우 if (newConstraint.y == oldConstraint.y) { int lastNodeInedex = notationNode.getCompartmentList().size() - 1; ContainerNode operandNode = (ContainerNode) notationNode.getCompartmentList().get(lastNodeInedex); operandNode.setHeight(operandNode.getHeight() + fragmentHeightConstraint); } } } // CombinedFragment의 사이즈 조절 시, 사이즈 조절이 되지 않고 move되던 부분 수정. // if(fragmentHeightConstraint != 0 && newConstraint.y > oldConstraint.y) { // fragmentHeightConstraint = 0; // } // if(fragmentHeightConstraint != 0) { //높이가 변경된 경우 // notationNode.setHeight(notationNode.getHeight() + fragmentHeightConstraint); // //위로 높이가 변경된 경우(위로 늘림) // if(newConstraint.y != oldConstraint.y) { // //가장 위에 위치한 operand노드의 높이를 늘려준다. // ContainerNode operandNode = (ContainerNode) // notationNode.getCompartmentList().get(0); // //Operand높이가 변경될 경우 자식 cominedFragment node의 절대값을 유지 시킨다. // SequenceUtil.setOperandHeight(operandNode, fragmentHeightConstraint); // } else { // //아래로 높이가 변경된 경우 // int lastNodeInedex = notationNode.getCompartmentList().size() -1; // ContainerNode operandNode = (ContainerNode) // notationNode.getCompartmentList().get(lastNodeInedex); // operandNode.setHeight(operandNode.getHeight() + fragmentHeightConstraint); // // // // 라이프라인 크기 조정 // Diagram diagram = SequenceUtil.getDiagram(notationNode); // SequenceUtil.setAllLifeLineHeight(diagram); // } // } else if( newConstraint.y - oldConstraint.y > 0 ) { // 라이프라인 크기 조정 Diagram diagram = SequenceUtil.getDiagram(notationNode); SequenceUtil.setAllLifeLineHeight(diagram); // } }