/**
  * Performs the layout with no constraint, so the content size is determined by the bounds of the
  * shape and/or line drawn to represent the series.
  *
  * @param g2 the graphics device.
  * @return The content size.
  */
 protected ArrangeResult arrangeNN(Graphics2D g2, ArrangeParams params) {
   Rectangle2D contentSize = new Rectangle2D.Double();
   if (this.line != null) {
     contentSize.setRect(this.line.getBounds2D());
   }
   if (this.shape != null) {
     contentSize = contentSize.createUnion(this.shape.getBounds2D());
   }
   ArrangeResult result = params.getRecyclableResult();
   if (result != null) {
     result.setSize(contentSize.getWidth(), contentSize.getHeight());
   } else {
     result = new ArrangeResult(contentSize.getWidth(), contentSize.getHeight(), null);
   }
   return result;
 }
  protected ArrangeResult arrangeFF(
      Graphics2D g2, double fixedWidth, double fixedHeight, ArrangeParams params) {

    Rectangle2D contentSize = new Rectangle2D.Double();
    if (this.line != null) {
      contentSize.setRect(this.line.getBounds2D());
    }
    if (this.shape != null) {
      contentSize = contentSize.createUnion(this.shape.getBounds2D());
    }
    // TODO: compare the contentSize to the required fixed size
    // and possibly log the problems
    ArrangeResult result = params.getRecyclableResult();
    if (result != null) {
      result.setSize(fixedWidth, fixedHeight);
    } else {
      result = new ArrangeResult(fixedWidth, fixedHeight, null);
    }
    return result;
  }
 /**
  * Arranges the contents of the block, within the given constraints, and returns the block size.
  *
  * @param g2 the graphics device.
  * @param constraint the constraint (<code>null</code> not permitted).
  * @param params the layout parameters (<code>null</code> not permitted).
  * @return The block size (in Java2D units, never <code>null</code>).
  */
 public ArrangeResult arrange(
     Graphics2D g2, RectangleConstraint constraint, ArrangeParams params) {
   RectangleConstraint contentConstraint = toContentConstraint(constraint);
   LengthConstraintType w = contentConstraint.getWidthConstraintType();
   LengthConstraintType h = contentConstraint.getHeightConstraintType();
   ArrangeResult result = null;
   if (w == LengthConstraintType.NONE) {
     if (h == LengthConstraintType.NONE) {
       result = arrangeNN(g2, params);
     } else if (h == LengthConstraintType.RANGE) {
       throw new RuntimeException("Not yet implemented.");
     } else if (h == LengthConstraintType.FIXED) {
       throw new RuntimeException("Not yet implemented.");
     }
   } else if (w == LengthConstraintType.RANGE) {
     if (h == LengthConstraintType.NONE) {
       throw new RuntimeException("Not yet implemented.");
     } else if (h == LengthConstraintType.RANGE) {
       throw new RuntimeException("Not yet implemented.");
     } else if (h == LengthConstraintType.FIXED) {
       throw new RuntimeException("Not yet implemented.");
     }
   } else if (w == LengthConstraintType.FIXED) {
     if (h == LengthConstraintType.NONE) {
       throw new RuntimeException("Not yet implemented.");
     } else if (h == LengthConstraintType.RANGE) {
       throw new RuntimeException("Not yet implemented.");
     } else if (h == LengthConstraintType.FIXED) {
       result = arrangeFF(g2, contentConstraint.getWidth(), contentConstraint.getHeight(), params);
     }
   }
   // TODO: review messaging here
   result.setSize(
       calculateTotalWidth(result.getWidth()), calculateTotalHeight(result.getHeight()));
   return result;
 }