components/visual-panels/core/src/java/util/com/oracle/solaris/vp/util/swing/layout/AbstractTableLayout.java
changeset 3553 f1d133b09a8c
parent 3552 077ebe3d0d24
child 3554 ef58713bafc4
--- a/components/visual-panels/core/src/java/util/com/oracle/solaris/vp/util/swing/layout/AbstractTableLayout.java	Tue Dec 16 05:53:51 2014 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,630 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
- */
-
-package com.oracle.solaris.vp.util.swing.layout;
-
-import java.awt.*;
-import java.util.*;
-import java.util.List;
-import com.oracle.solaris.vp.util.swing.layout.AbstractLayout.SizedSet;
-import com.oracle.solaris.vp.util.swing.layout.Anchor.AnchorType;
-
-public abstract class AbstractTableLayout<C extends HasAnchors>
-    extends ConstrainedLayout<C> implements HasAnchors {
-
-    //
-    // Inner classes
-    //
-
-    protected static class CellInfo {
-	//
-	// Instance data
-	//
-
-	private Component component;
-	private Dimension size;
-	private boolean preferred;
-	private List<RowOrCol> parents = new ArrayList<RowOrCol>();
-
-	//
-	// Constructors
-	//
-
-	public CellInfo(Component component, boolean preferred) {
-	    this.component = component;
-	    this.preferred = preferred;
-	}
-
-	//
-	// CellInfo methods
-	//
-
-	public void add(RowOrCol parent) {
-	    parents.add(parent);
-	}
-
-	public Component getComponent() {
-	    return component;
-	}
-
-	public Dimension getSize() {
-	    // Deferred fetch
-	    if (size == null) {
-		size = preferred ?
-		    component.getPreferredSize() : component.getMinimumSize();
-	    }
-	    return size;
-	}
-
-	public void remove() {
-	    for (int i = parents.size() - 1; i >= 0; i--) {
-		parents.get(i).childRemoved(this);
-		parents.remove(i);
-	    }
-	}
-    }
-
-    protected static class RowOrCol {
-	//
-	// Instance data
-	//
-
-	private AbstractTableConstraint constraint;
-	private boolean isRow;
-	private int size = -1;
-	private float weight = -1f;
-	private List<CellInfo> children = new ArrayList<CellInfo>();
-	private List<CellInfo> roChildren =
-	    Collections.unmodifiableList(children);
-
-	//
-	// Constructors
-	//
-
-	public RowOrCol(AbstractTableConstraint constraint, boolean isRow) {
-	    this.constraint = constraint;
-	    this.isRow = isRow;
-	}
-
-	//
-	// Instance data
-	//
-
-	public void add(CellInfo child) {
-	    children.add(child);
-	    child.add(this);
-	}
-
-	/**
-	 * Called by the child when it is removed from layout.
-	 */
-	public boolean childRemoved(CellInfo child) {
-	    boolean ret = children.remove(child);
-	    if (ret) {
-		size = -1;
-	    }
-	    return ret;
-	}
-
-	public AbstractTableConstraint getConstraint() {
-	    return constraint;
-	}
-
-	public List<CellInfo> getChildren() {
-	    return roChildren;
-	}
-
-	/**
-	 * Get the maximum size (row height or column width) of every child
-	 * {@code Component}.
-	 */
-	public int getSize() {
-	    // Deferred fetch
-	    if (size == -1) {
-		for (CellInfo child : children) {
-		    Dimension d = child.getSize();
-		    int s = isRow ? d.height : d.width;
-		    if (s > size) {
-			size = s;
-		    }
-		}
-	    }
-	    return size;
-	}
-
-	public float getWeight() {
-	    // Deferred fetch
-	    if (weight == -1) {
-		weight = constraint.getWeight();
-	    }
-	    return weight;
-	}
-
-	/**
-	 * Remove all children in this row/column from layout (in any
-	 * row/column).
-	 */
-	public void remove() {
-	    for (int i = children.size() - 1; i >= 0; i--) {
-		remove(children.get(i));
-	    }
-	}
-
-	/**
-	 * Remove the given child in this row/column from layout (in any
-	 * row/column).
-	 */
-	public boolean remove(CellInfo child) {
-	    if (children.contains(child)) {
-		child.remove();
-		return true;
-	    }
-	    return false;
-	}
-
-	public void setSize(int size) {
-	    this.size = size;
-	}
-
-	public void setWeight(float weight) {
-	    this.weight = weight;
-	}
-    }
-
-    protected static class RowOrColSet implements SizedSet {
-	//
-	// Instance data
-	//
-
-	private int tSizes = -1;
-	private int tGaps = -1;
-	private List<RowOrCol> elements = new ArrayList<RowOrCol>();
-	private List<RowOrCol> roElements =
-	    Collections.unmodifiableList(elements);
-
-	//
-	// SizedSet methods
-	//
-
-	@Override
-	public int getCount() {
-	    return elements.size();
-	}
-
-	@Override
-	public int getSize(int i) {
-	    return elements.get(i).getSize();
-	}
-
-	@Override
-	public float getWeight(int i) {
-	    return elements.get(i).getWeight();
-	}
-
-	@Override
-	public void setSize(int i, int size) {
-	    elements.get(i).setSize(size);
-	}
-
-	@Override
-	public void setWeight(int i, float weight) {
-	    elements.get(i).setWeight(weight);
-	}
-
-	//
-	// RowOrColSet methods
-	//
-
-	public void add(RowOrCol element) {
-	    elements.add(element);
-	}
-
-	public void add(int i, RowOrCol element) {
-	    elements.add(i, element);
-	}
-
-	public List<RowOrCol> getElements() {
-	    return roElements;
-	}
-
-	public int getGap(int i) {
-	    AbstractTableConstraint constraint =
-		elements.get(i).getConstraint();
-
-	    return (i == 0 && constraint.getIgnoreFirstGap()) ?
-		0 : constraint.getGap();
-	}
-
-	public int getGapTotal() {
-	    // Deferred fetch
-	    if (tGaps == -1) {
-		tGaps = 0;
-		for (int i = 0, n = getCount(); i < n; i++) {
-		    tGaps += getGap(i);
-		}
-	    }
-	    return tGaps;
-	}
-
-	public int getSizeTotal() {
-	    // Deferred fetch
-	    if (tSizes == -1) {
-		tSizes = 0;
-		for (RowOrCol element : elements) {
-		    tSizes += element.getSize();
-		}
-	    }
-	    return tSizes;
-	}
-
-	public void remove(int i) {
-	    RowOrCol element = elements.remove(i);
-	    if (element != null) {
-		element.remove();
-		tSizes = -1;
-		tGaps = -1;
-	    }
-	}
-    }
-
-    protected static class TableInfo {
-	//
-	// Instance data
-	//
-
-	private RowOrColSet cols;
-	private RowOrColSet rows;
-
-	//
-	// Constructors
-	//
-
-	public TableInfo(RowOrColSet cols, RowOrColSet rows) {
-	    this.cols = cols;
-	    this.rows = rows;
-
-	    // Remove rows/columns from layout if a) directed by constraints b)
-	    // they contain only invisible Components
-	    for (RowOrColSet set : new RowOrColSet[] {rows, cols}) {
-		List<RowOrCol> elements = set.getElements();
-		OUTER: for (int i = elements.size() - 1; i >= 0; i--) {
-		    RowOrCol element = elements.get(i);
-		    if (!element.getConstraint().getLayoutIfInvisible()) {
-			for (CellInfo comp : element.getChildren()) {
-			    if (comp.getComponent().isVisible()) {
-				continue OUTER;
-			    }
-			}
-
-			// Remove this row/column from layout
-			set.remove(i);
-		    }
-		}
-	    }
-	}
-
-	//
-	// TableInfo methods
-	//
-
-	public RowOrColSet getColumns() {
-	    return cols;
-	}
-
-	public RowOrColSet getRows() {
-	    return rows;
-	}
-    }
-
-    //
-    // Instance data
-    //
-
-    public HorizontalAnchor hAnchor;
-    public VerticalAnchor vAnchor;
-
-    //
-    // Constructors
-    //
-
-    public AbstractTableLayout(HorizontalAnchor hAnchor,
-	VerticalAnchor vAnchor, C defaultElementConstraint) {
-
-	super(defaultElementConstraint);
-	this.hAnchor = hAnchor;
-	this.vAnchor = vAnchor;
-    }
-
-    //
-    // HasAnchors methods
-    //
-
-    @Override
-    public HorizontalAnchor getHorizontalAnchor() {
-	return hAnchor;
-    }
-
-    @Override
-    public VerticalAnchor getVerticalAnchor() {
-	return vAnchor;
-    }
-
-    //
-    // LayoutManager methods
-    //
-
-    /**
-     * Lay out Components in the given Container.
-     */
-    @Override
-    public void layoutContainer(Container container) {
-	TableInfo info = getTableInfo(container, true);
-
-	RowOrColSet rows = info.getRows();
-	int nRows = rows.getCount();
-	if (nRows == 0) {
-	    return;
-	}
-
-	RowOrColSet cols = info.getColumns();
-	int nCols = cols.getCount();
-
-	Insets insets = container.getInsets();
-	Dimension aSize = container.getSize();
-
-	// The amount of space we have to work with
-	int cWidth = aSize.width - insets.left - insets.right;
-	int cHeight = aSize.height - insets.top - insets.bottom;
-
-	// Where to start drawing the first Component
-	int top = insets.top;
-	int tableLeft = insets.left;
-
-	// First set heights of rows
-	top += fitToSize(cHeight, rows, getVerticalAnchor());
-
-	// Then set widths of columns
-	tableLeft += fitToSize(cWidth, cols, getHorizontalAnchor());
-
-	// Lay out components
-	for (int r = 0; r < nRows; r++) {
-
-	    RowOrCol row = rows.getElements().get(r);
-	    int rSize = row.getSize();
-	    top += rows.getGap(r);
-
-	    List<CellInfo> children = row.getChildren();
-	    int left = tableLeft;
-	    for (int c = 0; c < nCols; c++) {
-
-		RowOrCol col = cols.getElements().get(c);
-		int cSize = col.getSize();
-		left += cols.getGap(c);
-
-		if (c < children.size()) {
-		    CellInfo cInfo = children.get(c);
-		    Component comp = cInfo.getComponent();
-		    Dimension pSize = cInfo.getSize();
-
-		    HasAnchors hasAnchors = compToConst.get(comp);
-
-		    int[] yAndHeight = getOffsetAndSize(rSize,
-			pSize.height, hasAnchors.getVerticalAnchor());
-
-		    int[] xAndWidth = getOffsetAndSize(cSize,
-			pSize.width, hasAnchors.getHorizontalAnchor());
-
-		    comp.setBounds(left + xAndWidth[0], top + yAndHeight[0],
-			xAndWidth[1], yAndHeight[1]);
-		}
-
-		left += cSize;
-	    }
-
-	    top += rSize;
-	}
-    }
-
-    //
-    // AbstractLayout methods
-    //
-
-    @Override
-    protected Dimension getLayoutSize(Container container, boolean preferred) {
-	TableInfo info = getTableInfo(container, preferred);
-
-	RowOrColSet cols = info.getColumns();
-	RowOrColSet rows = info.getRows();
-
-	int width = cols.getSizeTotal() + cols.getGapTotal();
-	int height = rows.getSizeTotal() + rows.getGapTotal();
-
-	Insets insets = container.getInsets();
-	width += insets.left + insets.right;
-	height += insets.top + insets.bottom;
-
-	return new Dimension(width, height);
-    }
-
-    protected TableInfo getTableInfo(Container container, boolean preferred) {
-	Component[] comps = getLayoutComponents(container.getComponents());
-
-	int nCols = getColumnCount(container);
-	int nRows = 0;
-	if (nCols != 0) {
-	    nRows = comps.length / nCols;
-	    if (comps.length % nCols > 0) {
-		nRows++;
-	    }
-	}
-
-	// Build cells
-	CellInfo[] cInfo = new CellInfo[comps.length];
-	for (int i = 0; i < comps.length; i++) {
-	    cInfo[i] = new CellInfo(comps[i], preferred);
-	}
-
-	// Build columns
-	RowOrColSet cols = new RowOrColSet();
-	for (int c = 0; c < nCols; c++) {
-	    AbstractTableConstraint constraint =
-		getColumnConstraint(container, c);
-
-	    RowOrCol col = new RowOrCol(constraint, false);
-
-	    for (int r = 0; r < nRows; r++) {
-		int index = r * nCols + c;
-		if (index < cInfo.length) {
-		    col.add(cInfo[index]);
-		}
-	    }
-
-	    cols.add(col);
-	}
-
-	// Build rows
-	RowOrColSet rows = new RowOrColSet();
-	for (int r = 0; r < nRows; r++) {
-	    AbstractTableConstraint constraint =
-		getRowConstraint(container, r);
-
-	    RowOrCol row = new RowOrCol(constraint, true);
-
-	    for (int c = 0; c < nCols; c++) {
-		int index = r * nCols + c;
-		if (index < cInfo.length) {
-		    row.add(cInfo[index]);
-		}
-	    }
-
-	    rows.add(row);
-	}
-
-	return new TableInfo(cols, rows);
-    }
-
-    //
-    // AbstractTableLayout methods
-    //
-
-    protected abstract AbstractTableConstraint getColumnConstraint(
-	Container container, int col);
-
-    protected abstract AbstractTableConstraint getRowConstraint(
-	Container container, int row);
-
-    /**
-     * Gets the number of columns in this {@code AbstractTableLayout}.
-     *
-     * @param	    container
-     *		    the {@code Container} being layed out
-     */
-    protected abstract int getColumnCount(Container container);
-
-    public void setHorizontalAnchor(HorizontalAnchor hAnchor) {
-	this.hAnchor = hAnchor;
-    }
-
-    public void setVerticalAnchor(VerticalAnchor vAnchor) {
-	this.vAnchor = vAnchor;
-    }
-
-    //
-    // Private methods
-    //
-
-    private int fitToSize(int aSize, RowOrColSet set, Anchor anchor) {
-	int top = 0;
-	int tSizes = set.getSizeTotal();
-	int tGaps = set.getGapTotal();
-
-	// Excess/insufficient space
-	int extraSize = aSize - tSizes - tGaps;
-
-	if (extraSize != 0) {
-
-	    if (extraSize < 0 ||
-		anchor.getAnchorType() == Anchor.AnchorType.FILL) {
-
-		distributeSpace(extraSize, set);
-	    } else {
-
-		switch (anchor.getAnchorType()) {
-		    case RIGHT_BOTTOM:
-			top += (aSize - tSizes - tGaps);
-			break;
-
-		    case CENTER:
-			top += (aSize - tSizes - tGaps) / 2;
-			break;
-		}
-	    }
-	}
-
-	return top;
-    }
-
-    /**
-     * Returns a two-element array consisting of the offset and size of a
-     * resized {@code Component}.
-     *
-     * @param	    aSize
-     *		    the available size in which to fit the {@code Component}
-     *
-     * @param	    pSize
-     *		    the preferred size in which to fit the {@code Component}
-     *
-     * @param	    anchor
-     *		    the Anchor of the {@code Component}
-     */
-    private int[] getOffsetAndSize(int aSize, int pSize, Anchor anchor) {
-	// Excess/insufficient space
-	int extra = aSize - pSize;
-
-	int offset = 0;
-	int size = pSize;
-	Anchor.AnchorType type = anchor.getAnchorType();
-
-	if (extra != 0) {
-
-	    if (extra < 0 || type == Anchor.AnchorType.FILL) {
-		size = aSize;
-	    } else {
-
-		switch (type) {
-		    case RIGHT_BOTTOM:
-			offset = (aSize - pSize);
-			break;
-
-		    case CENTER:
-			offset = (aSize - pSize) / 2;
-			break;
-		}
-	    }
-	}
-
-	return new int[] {offset, size};
-    }
-}