Package com.extjs.gxt.ui.client.widget.layout

Source Code of com.extjs.gxt.ui.client.widget.layout.RowLayout

/*
* Ext GWT 2.2.4 - Ext for GWT
* Copyright(c) 2007-2010, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.widget.layout;

import com.extjs.gxt.ui.client.Style.Orientation;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.core.XDOM;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.util.Size;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.Container;
import com.extjs.gxt.ui.client.widget.Layout;
import com.extjs.gxt.ui.client.widget.ScrollContainer;

/**
* This layout positions the container's children in a single horizontal or
* vertical row. Each component may specify its height and width in pixels or as
* percentage.
*
* <p/>
* Each components margin may also be specified using a RowData instance. Only 1
* component should specify a margin on adjacent sides.
*
* @see RowData
*/
public class RowLayout extends Layout {

  private Orientation orientation = Orientation.VERTICAL;
  private boolean adjustForScroll;

  /**
   * Creates a new vertical row layout.
   */
  public RowLayout() {
    this(Orientation.VERTICAL);
  }

  /**
   * Creates a new row layout with the given orientation.
   *
   * @param orientation the orientation of row layout
   */
  public RowLayout(Orientation orientation) {
    this.orientation = orientation;
    monitorResize = true;
  }

  /**
   * Returns the orientation of the layout.
   *
   * @return the orientation
   */
  public Orientation getOrientation() {
    return orientation;
  }

  /**
   * Returns true if adjust for scroll is enabled.
   *
   * @return the adjust for scroll state
   */
  public boolean isAdjustForScroll() {
    return adjustForScroll;
  }

  /**
   * True to adjust the container width calculations to account for the scroll
   * bar (defaults to false).
   *
   * @param adjustForScroll the adjust for scroll state
   */
  public void setAdjustForScroll(boolean adjustForScroll) {
    this.adjustForScroll = adjustForScroll;
  }

  /**
   * Sets the orientation of the layout.
   *
   * @param orientation the orientation
   */
  public void setOrientation(Orientation orientation) {
    this.orientation = orientation;
  }

  protected void layoutHorizontal(El target) {
    Size size = target.getStyleSize();

    int w = size.width - (adjustForScroll ? XDOM.getScrollBarWidth() : 0);
    int h = size.height;
    int pw = w;

    int count = container.getItemCount();

    // some columns can be percentages while others are fixed
    // so we need to make 2 passes
    for (int i = 0; i < count; i++) {
      Component c = container.getItem(i);
      if(!c.isVisible(false)){
        continue;
      }
      c.el().makePositionable(true);
      c.el().setStyleAttribute("margin", "0px");

      RowData data = null;
      LayoutData d = getLayoutData(c);
      if (d != null && d instanceof RowData) {
        data = (RowData) d;
      } else {
        data = new RowData();
      }

      if (data.getWidth() > 1) {
        pw -= data.getWidth();
      } else if (data.getWidth() == -1) {
        callLayout(c, false);

        pw -= c.getOffsetWidth();
        if (data.getMargins() != null) {
          pw -= data.getMargins().left;
          pw -= data.getMargins().right;
        }
      }
    }

    pw = pw < 0 ? 0 : pw;

    int x = target.getPadding("l");
    int sTop = target.getPadding("t");

    for (int i = 0; i < count; i++) {
      Component c = container.getItem(i);
      if(!c.isVisible(false)){
        continue;
      }
      RowData data = null;
      LayoutData d = getLayoutData(c);
      if (d != null && d instanceof RowData) {
        data = (RowData) d;
      } else {
        data = new RowData();
      }
      double height = data.getHeight();

      if (height > 0 && height <= 1) {
        height = height * h;
      } else if (height == -1) {
        height = c.getOffsetHeight();
      }

      double width = data.getWidth();
      if (width > 0 && width <= 1) {
        width = width * pw;
      } else if (width == -1) {
        width = c.getOffsetWidth();
      }

      int tx = x;
      int ty = sTop;
      int tw = (int) width;
      int th = (int) height;

      Margins m = data.getMargins();
      if (m != null) {
        tx += m.left;
        ty += m.top;
        if (data.getHeight() != -1) {
          th -= m.top;
          th -= m.bottom;
        }
        if (data.getWidth() != -1) {
          tw -= m.left;
          tw -= m.right;
        }
      }

      setPosition(c, tx, ty);
      setSize(c, tw, th);
      x += tw + (m != null ? m.right + m.left : 0);
    }
  }

  protected void layoutVertical(El target) {
    Size size = target.getStyleSize();

    int w = size.width - (adjustForScroll ? XDOM.getScrollBarWidth() : 0);
    int h = size.height;
    int ph = h;

    int count = container.getItemCount();

    // some columns can be percentages while others are fixed
    // so we need to make 2 passes
    for (int i = 0; i < count; i++) {
      Component c = container.getItem(i);
      if(!c.isVisible(false)){
        continue;
      }
      RowData data = null;
      LayoutData d = getLayoutData(c);
      if (d != null && d instanceof RowData) {
        data = (RowData) d;
      } else {
        data = new RowData();
      }

      if (data.getHeight() > 1) {
        ph -= data.getHeight();
      } else if (data.getHeight() == -1) {
        callLayout(c, false);

        ph -= c.getOffsetHeight();
        ph -= c.el().getMargins("tb");
      }

    }

    ph = ph < 0 ? 0 : ph;

    for (int i = 0; i < count; i++) {
      Component c = container.getItem(i);
      if(!c.isVisible(false)){
        continue;
      }
      RowData data = null;
      LayoutData d = getLayoutData(c);
      if (d != null && d instanceof RowData) {
        data = (RowData) d;
      } else {
        data = new RowData();
      }

      double width = data.getWidth();

      if (width > 0 && width <= 1) {
        width = width * w;
      }

      width -= getSideMargins(c);

      double height = data.getHeight();
      if (height > 0 && height <= 1) {
        height = height * ph;
      }

      height -= c.el().getMargins("tb");

      setSize(c, (int) width, (int) height);
    }
  }

  @Override
  protected void onLayout(Container<?> container, El target) {
    super.onLayout(container, target);

    if (container instanceof ScrollContainer<?>) {
      ScrollContainer<?> sc = (ScrollContainer<?>) container;
      sc.setScrollMode(sc.getScrollMode());
    } else {
      target.setStyleAttribute("overflow", "hidden");
    }

    if (orientation == Orientation.VERTICAL) {
      layoutVertical(target);
    } else {
      target.makePositionable();
      layoutHorizontal(target);
    }
  }

}
TOP

Related Classes of com.extjs.gxt.ui.client.widget.layout.RowLayout

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.