예제 #1
0
  /**
   * Implements the algorithm to layout the components of the given container figure. Each component
   * is laid out using its own layout constraint specifying its size and position.
   *
   * @see LayoutManager#layout(IFigure)
   */
  public void layout(IFigure parent) {
    Iterator children = parent.getChildren().iterator();
    Point offset = getOrigin(parent);
    IFigure f;
    while (children.hasNext()) {
      f = (IFigure) children.next();
      Rectangle bounds = (Rectangle) getConstraint(f);
      if (bounds == null) continue;

      if (bounds.width == -1 || bounds.height == -1) {
        Dimension preferredSize = f.getPreferredSize(bounds.width, bounds.height);
        bounds = bounds.getCopy();
        if (bounds.width == -1) bounds.width = preferredSize.width;
        if (bounds.height == -1) bounds.height = preferredSize.height;
      }
      bounds = bounds.getTranslated(offset);
      f.setBounds(bounds);
    }
  }
예제 #2
0
  /**
   * Calculates and returns the preferred size of the input figure. Since in XYLayout the location
   * of the child should be preserved, the preferred size would be a region which would hold all the
   * children of the input figure. If no constraint is set, that child is ignored for calculation.
   * If width and height are not positive, the preferred dimensions of the child are taken.
   *
   * @see AbstractLayout#calculatePreferredSize(IFigure, int, int)
   * @since 2.0
   */
  protected Dimension calculatePreferredSize(IFigure f, int wHint, int hHint) {
    Rectangle rect = new Rectangle();
    ListIterator children = f.getChildren().listIterator();
    while (children.hasNext()) {
      IFigure child = (IFigure) children.next();
      Rectangle r = (Rectangle) constraints.get(child);
      if (r == null) continue;

      if (r.width == -1 || r.height == -1) {
        Dimension preferredSize = child.getPreferredSize(r.width, r.height);
        r = r.getCopy();
        if (r.width == -1) r.width = preferredSize.width;
        if (r.height == -1) r.height = preferredSize.height;
      }
      rect.union(r);
    }
    Dimension d = rect.getSize();
    Insets insets = f.getInsets();
    return new Dimension(d.width + insets.getWidth(), d.height + insets.getHeight())
        .union(getBorderPreferredSize(f));
  }