Frontier prepareMessage(ConstraintSet constraintSet, InGroupablesStack inGroupablesStack) {
    final Arrow graphic = createArrow();
    final double arrowYStartLevel = graphic.getArrowYStartLevel(getStringBounder());
    final double arrowYEndLevel = graphic.getArrowYEndLevel(getStringBounder());

    for (LifeEvent lifeEvent : getMessage().getLiveEvents()) {
      beforeMessage(lifeEvent, arrowYStartLevel);
    }

    final double length = graphic.getArrowOnlyWidth(getStringBounder());
    incFreeY(graphic.getPreferredHeight(getStringBounder()));
    double marginActivateAndDeactive = 0;
    if (getMessage().isActivateAndDeactive()) {
      marginActivateAndDeactive = 30;
      incFreeY(marginActivateAndDeactive);
    }
    getDrawingSet().addEvent(getMessage(), graphic);

    final LivingParticipantBox livingParticipantBox = getLivingParticipantBox();
    if (messageArrow.getType().isRightBorder()) {
      constraintSet
          .getConstraint(livingParticipantBox.getParticipantBox(), constraintSet.getLastborder())
          .ensureValue(length);
    } else {
      constraintSet
          .getConstraint(constraintSet.getFirstBorder(), livingParticipantBox.getParticipantBox())
          .ensureValue(length);
    }

    for (LifeEvent lifeEvent : getMessage().getLiveEvents()) {
      afterMessage(getStringBounder(), lifeEvent, arrowYEndLevel + marginActivateAndDeactive);
    }

    assert graphic instanceof InGroupable;
    if (graphic instanceof InGroupable) {
      inGroupablesStack.addElement((InGroupable) graphic);
      inGroupablesStack.addElement(livingParticipantBox);
    }

    return getFreeY();
  }