/**
   * Shows an insertion line if there is one or more current children.
   *
   * @see LayoutEditPolicy#showLayoutTargetFeedback(Request)
   */
  protected void showLayoutTargetFeedback(Request request) {
    if (getHost().getChildren().size() == 0) return;
    Polyline fb = getLineFeedback();
    Transposer transposer = new Transposer();
    transposer.setEnabled(!isLayoutHorizontal());

    int epIndex = getFeedbackIndexFor(request);
    Rectangle r = null;
    if (epIndex == -1) {
      epIndex = getHost().getChildren().size() - 1;
      EditPart editPart = (EditPart) getHost().getChildren().get(epIndex);
      r = transposer.t(getAbsoluteBounds((GraphicalEditPart) editPart));
    } else {
      EditPart editPart = (EditPart) getHost().getChildren().get(epIndex);
      r = transposer.t(getAbsoluteBounds((GraphicalEditPart) editPart));
      Point p = transposer.t(getLocationFromRequest(request));
      if (p.x > r.x + (r.width / 2)) {
        editPart = (EditPart) getHost().getChildren().get(epIndex);
        r = transposer.t(getAbsoluteBounds((GraphicalEditPart) editPart));
      }
    }
    int x = r.x;
    Point p1 = new Point(x, r.y - 4);
    p1 = transposer.t(p1);
    fb.translateToRelative(p1);
    Point p2 = new Point(x, r.y + r.height + 4);
    p2 = transposer.t(p2);
    fb.translateToRelative(p2);
    fb.setPoint(p1, 0);
    fb.setPoint(p2, 1);
  }
  /**
   * @param request the Request
   * @return the index for the insertion reference
   */
  protected int getFeedbackIndexFor(Request request) {
    List children = getHost().getChildren();
    if (children.isEmpty()) return -1;

    Transposer transposer = new Transposer();
    transposer.setEnabled(!isLayoutHorizontal());

    Point p = transposer.t(getLocationFromRequest(request));
    if (children.size() == 0 || children.size() == 1) {
      return -1;
    }
    int[] y = new int[children.size()];
    for (int i = 0; i < children.size(); i++) {
      EditPart child = (EditPart) children.get(i);
      Rectangle rect = transposer.t(getAbsoluteBounds(((GraphicalEditPart) child)));
      y[i] = rect.y;
    }
    int height = 5;
    if (y[0] + height >= p.y) {
      // add to first item;
      return 0;
    }
    if (y[y.length - 1] - height <= p.y) {
      // add to end item;
      return y.length - 1;
    }

    int candidateIndex = -1;
    for (int i = 0; i < y.length; i++) {
      if (i + 1 == y.length) {
        break;
      }
      if (p.y >= y[i] && p.y <= y[i + 1]) {
        candidateIndex = i;
        break;
      }
    }

    return candidateIndex;
  }