/**
   * 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);
    //        }
  }