package net.miginfocom.layout; import java.io.*; import java.util.ArrayList; /* * License (BSD): * ============== * * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this * list of conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * Neither the name of the MiG InfoCom AB nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * @version 1.0 * @author Mikael Grev, MiG InfoCom AB * Date: 2006-sep-08 */ /** A constraint that holds the column or row constraints for the grid. It also holds the gaps between the rows and columns. *
* This class is a holder and builder for a number of {@link net.miginfocom.layout.DimConstraint}s. *
* For a more thorough explanation of what these constraints do, and how to build the constraints, see the White Paper or Cheat Sheet at www.migcomponents.com. *
* Note that there are two way to build this constraint. Through String (e.g.
* Yes, we are embarrassingly aware that the method is misspelled.
* @return The different {@link net.miginfocom.layout.DimConstraint}s that this object consists of. A new list and
* never
* Yes, we are embarrassingly aware that the method is misspelled.
* @param constr The different {@link net.miginfocom.layout.DimConstraint}s that this object consists of. The list
* will be copied for storage.
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* The next call to any of the constraint methods (e.g. {@link net.miginfocom.layout.AC#noGrid}) will be carried
* out on this new row/column.
*
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param i The new current row/column.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
// * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
// * @param s A name to associate on the group that should be the same for other rows/columns in the same group.
// * @return
// * For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
// * @param s A name to associate on the group that should be the same for other rows/columns in the same group.
// * @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
// * @return
* Same as
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param s A name to associate on the group that should be the same for other rows/columns in the same group.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param s A name to associate on the group that should be the same for other rows/columns in the same group.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param s The minimum and/or preferred and/or maximum size of this row. The string will be interpreted
* as a BoundSize. For more info on how BoundSize is formatted see the documentation.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param size The minimum and/or preferred and/or maximum size of this row. The string will be interpreted
* as a BoundSize. For more info on how BoundSize is formatted see the documentation.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param size minimum and/or preferred and/or maximum size of the gap between this and the next row/column.
* The string will be interpreted as a BoundSize. For more info on how BoundSize is formatted see the documentation.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param size minimum and/or preferred and/or maximum size of the gap between this and the next row/column.
* The string will be interpreted as a BoundSize. For more info on how BoundSize is formatted see the documentation.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param side The default side to align the components. E.g. "top" or "left", or "leading" or "trailing" or "bottom" or "right".
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param side The default side to align the components. E.g. "top" or "left", or "before" or "after" or "bottom" or "right".
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param p The new grow priority.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param p The new grow priority.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* Same as
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param w The new grow weight.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param w The new grow weight.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param p The new shrink priority.
* @return
* For a more thorough explanation of what this constraint does see the white paper or cheat Sheet at www.migcomponents.com.
* @param p The new shrink priority.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* Same as
* For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com.
* @return
* For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com.
* @param w The shrink weight.
* @return
* For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com.
* @param w The shrink weight.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return
* For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com.
* @param w The shrink weight.
* @return
* For a more thorough explanation of what this constraint does see the White Paper or Cheat Sheet at www.migcomponents.com.
* @param w The shrink weight.
* @param indexes The index(es) (0-based) of the columns/rows that should be affected by this constraint.
* @return "[100]3[200,fill]"
or through API (E.g.
* new AC().size("100").gap("3").size("200").fill()
.
*/
public final class AC implements Externalizable
{
private final ArrayListDimConstraints
contains all information in this class.
* null
.
*/
public final DimConstraint[] getConstaints()
{
return cList.toArray(new DimConstraint[cList.size()]);
}
/** Sets the different {@link net.miginfocom.layout.DimConstraint}s that this object should consists of.
* null
or and empty array will reset the constraints to one DimConstraint
* with default values.
*/
public final void setConstaints(DimConstraint[] constr)
{
if (constr == null || constr.length < 1 )
constr = new DimConstraint[] {new DimConstraint()};
cList.clear();
cList.ensureCapacity(constr.length);
for (DimConstraint c : constr)
cList.add(c);
}
/** Returns the number of rows/columns that this constraints currently have.
* @return The number of rows/columns that this constraints currently have. At least 1.
*/
public int getCount()
{
return cList.size();
}
/** Sets the total number of rows/columns to size
. If the number of rows/columns is already more
* than size
nothing will happen.
* @param size The total number of rows/columns
* @return this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC count(int size)
{
makeSize(size);
return this;
}
/** Specifies that the current row/column should not be grid-like. The while row/column will have its components layed out
* in one single cell. It is the same as to say that the cells in this column/row will all be merged (a.k.a spanned).
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC noGrid()
{
return noGrid(curIx);
}
/** Specifies that the indicated rows/columns should not be grid-like. The while row/column will have its components layed out
* in one single cell. It is the same as to say that the cells in this column/row will all be merged (a.k.a spanned).
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC noGrid(int... indexes)
{
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setNoGrid(true);
}
return this;
}
/** Sets the current row/column to i
. If the current number of rows/columns is less than i
a call
* to {@link #count(int)} will set the size accordingly.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC index(int i)
{
makeSize(i);
curIx = i;
return this;
}
/** Specifies that the current row/column's component should grow by default. It does not affect the size of the row/column.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC fill()
{
return fill(curIx);
}
/** Specifies that the indicated rows'/columns' component should grow by default. It does not affect the size of the row/column.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC fill(int... indexes)
{
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setFill(true);
}
return this;
}
// /** Specifies that the current row/column should be put in the end group s
and will thus share the same ending
// * coordinate within the group.
// * this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
// */
// public final AxisConstraint endGroup(String s)
// {
// return endGroup(s, curIx);
// }
//
// /** Specifies that the indicated rows/columns should be put in the end group s
and will thus share the same ending
// * coordinate within the group.
// * this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
// */
// public final AxisConstraint endGroup(String s, int... indexes)
// {
// for (int i = indexes.length - 1; i >= 0; i--) {
// int ix = indexes[i];
// makeSize(ix);
// cList.get(ix).setEndGroup(s);
// }
// return this;
// }
/** Specifies that the current row/column should be put in the size group s
and will thus share the same size
* constraints as the other components in the group.
* sizeGroup("")
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
* @since 3.7.2
*/
public final AC sizeGroup()
{
return sizeGroup("", curIx);
}
/** Specifies that the current row/column should be put in the size group s
and will thus share the same size
* constraints as the other components in the group.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC sizeGroup(String s)
{
return sizeGroup(s, curIx);
}
/** Specifies that the indicated rows/columns should be put in the size group s
and will thus share the same size
* constraints as the other components in the group.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC sizeGroup(String s, int... indexes)
{
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setSizeGroup(s);
}
return this;
}
/** Specifies the current row/column's min and/or preferred and/or max size. E.g. "10px"
or "50:100:200"
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC size(String s)
{
return size(s, curIx);
}
/** Specifies the indicated rows'/columns' min and/or preferred and/or max size. E.g. "10px"
or "50:100:200"
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC size(String size, int... indexes)
{
BoundSize bs = ConstraintParser.parseBoundSize(size, false, true);
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setSize(bs);
}
return this;
}
/** Specifies the gap size to be the default one AND moves to the next column/row. The method is called .gap()
* rather the more natural .next()
to indicate that it is very much related to the other .gap(..)
methods.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC gap()
{
curIx++;
makeSize(curIx);
return this;
}
/** Specifies the gap size to size
AND moves to the next column/row.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC gap(String size)
{
return gap(size, curIx++);
}
/** Specifies the indicated rows'/columns' gap size to size
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC gap(String size, int... indexes)
{
BoundSize bsa = size != null ? ConstraintParser.parseBoundSize(size, true, true) : null;
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix + 1);
if (bsa != null)
cList.get(ix).setGapAfter(bsa);
}
return this;
}
/** Specifies the current row/column's columns default alignment for its components. It does not affect the positioning
* or size of the columns/row itself. For columns it is the horizontal alignment (e.g. "left") and for rows it is the vertical
* alignment (e.g. "top").
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC align(String side)
{
return align(side, curIx);
}
/** Specifies the indicated rows'/columns' columns default alignment for its components. It does not affect the positioning
* or size of the columns/row itself. For columns it is the horizontal alignment (e.g. "left") and for rows it is the vertical
* alignment (e.g. "top").
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC align(String side, int... indexes)
{
UnitValue al = ConstraintParser.parseAlignKeywords(side, true);
if (al == null)
al = ConstraintParser.parseAlignKeywords(side, false);
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setAlign(al);
}
return this;
}
/** Specifies the current row/column's grow priority.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC growPrio(int p)
{
return growPrio(p, curIx);
}
/** Specifies the indicated rows'/columns' grow priority.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC growPrio(int p, int... indexes)
{
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setGrowPriority(p);
}
return this;
}
/** Specifies the current row/column's grow weight within columns/rows with the grow priority
100f.
* grow(100f)
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
* @since 3.7.2
*/
public final AC grow()
{
return grow(100f, curIx);
}
/** Specifies the current row/column's grow weight within columns/rows with the same grow priority
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC grow(float w)
{
return grow(w, curIx);
}
/** Specifies the indicated rows'/columns' grow weight within columns/rows with the same grow priority
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC grow(float w, int... indexes)
{
Float gw = new Float(w);
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setGrow(gw);
}
return this;
}
/** Specifies the current row/column's shrink priority.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC shrinkPrio(int p)
{
return shrinkPrio(p, curIx);
}
/** Specifies the indicated rows'/columns' shrink priority.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
*/
public final AC shrinkPrio(int p, int... indexes)
{
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setShrinkPriority(p);
}
return this;
}
/** Specifies that the current row/column's shrink weight within the columns/rows with the shrink priority
100f.
* shrink(100f)
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
* @since 3.7.2
*/
public final AC shrink()
{
return shrink(100f, curIx);
}
/** Specifies that the current row/column's shrink weight within the columns/rows with the same shrink priority
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
* @since 3.7.2
*/
public final AC shrink(float w)
{
return shrink(w, curIx);
}
/** Specifies the indicated rows'/columns' shrink weight within the columns/rows with the same shrink priority
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
* @since 3.7.2
*/
public final AC shrink(float w, int... indexes)
{
Float sw = new Float(w);
for (int i = indexes.length - 1; i >= 0; i--) {
int ix = indexes[i];
makeSize(ix);
cList.get(ix).setShrink(sw);
}
return this;
}
/** Specifies that the current row/column's shrink weight within the columns/rows with the same shrink priority
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
* @deprecated in 3.7.2. Use {@link #shrink(float)} instead.
*/
public final AC shrinkWeight(float w)
{
return shrink(w);
}
/** Specifies the indicated rows'/columns' shrink weight within the columns/rows with the same shrink priority
.
* this
so it is possible to chain calls. E.g. new AxisConstraint().noGrid().gap().fill()
.
* @deprecated in 3.7.2. Use {@link #shrink(float, int...)} instead.
*/
public final AC shrinkWeight(float w, int... indexes)
{
return shrink(w, indexes);
}
private void makeSize(int sz)
{
if (cList.size() <= sz) {
cList.ensureCapacity(sz);
for (int i = cList.size(); i <= sz; i++)
cList.add(new DimConstraint());
}
}
// ************************************************
// Persistence Delegate and Serializable combined.
// ************************************************
private Object readResolve() throws ObjectStreamException
{
return LayoutUtil.getSerializedObject(this);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in));
}
@Override
public void writeExternal(ObjectOutput out) throws IOException
{
if (getClass() == AC.class)
LayoutUtil.writeAsXML(out, this);
}
}