/*******************************************************************************
 * Copyright (c) 2004, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.internal.layout;

/**
 * Describes a single row (or column) in a CellLayout
 *
 * @since 3.0
 */
public class Row {
    /**
     * True iff this row will expand to fill available space
     */
    boolean grows = false;

    /**
     * Size of this row. For growing rows, this is the relative size
     * of the row with respect to other rows (ie: a row of size 100 is twice
     * as wide as a row of size 50). For fixed rows, this is the absolute size
     * of the row, in pixels.
     */
    int size = 0;

    /**
     * True iff this row should query its child controls for its size.
     */
    boolean largerThanChildren = true;

    /**
     * Creates a fixed-size row with the given width (pixels).
     * The preferred sizes of child controls are ignored.
     *
     * @param size
     */
    public Row(int size) {
        largerThanChildren = false;
        this.size = size;
        grows = false;
    }

    /**
     * Creates a row that automatically computes its size based on the preferred
     * sizes of its children.
     *
     * @param growing
     */
    public Row(boolean growing) {
        this.grows = growing;

        if (growing) {
            size = 100;
        }
    }

    /**
     * Creates a growing row.
     *
     * @param sizeRatio determines the size of this row with respect to other growing rows
     * (for example, a row with size = 3 will be 3x as large as a row with size = 1)
     * @param largerThanChildren true iff the preferred size of this row should take into
     * account the preferred sizes of its children.
     */
    public Row(int size, boolean largerThanChildren) {
        this.grows = true;
        this.size = size;
        this.largerThanChildren = largerThanChildren;
    }

    /**
     * Construct and return a typical growing row.
     *
     * @return a growing row
     */
    public static Row growing() {
        return new Row(100, true);
    }

    /**
     * Construct and return a growing row with custom properties
     *
     * @param size relative size of this row with respect to other growing rows
     * @param largerThanChildren true iff the preferred size of this row should
     * be based on the preferred sizes of its children
     * @return a new Row
     */
    public static Row growing(int size, boolean largerThanChildren) {
        return new Row(size, largerThanChildren);
    }

    /**
     * Construct and return a fixed-size row. The row will not grow when the layout
     * is resized, and its size will be computed from the default sizes of its children.
     *
     * @return a new Row
     */
    public static Row fixed() {
        return new Row(false);
    }

    /**
     * Construct and return a fixed-size row. The row will always have the given
     * width, regardless of the size of the layout or the preferred sizes of its children.
     *
     * @param pixels size of the row
     * @return a fixed-size row with the given width (in pixels)
     */
    public static Row fixed(int pixels) {
        return new Row(pixels);
    }
}
