001/*
002 * Copyright (c) 2002-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
003 *
004 * Redistribution and use in source and binary forms, with or without
005 * modification, are permitted provided that the following conditions are met:
006 *
007 *  o Redistributions of source code must retain the above copyright notice,
008 *    this list of conditions and the following disclaimer.
009 *
010 *  o Redistributions in binary form must reproduce the above copyright notice,
011 *    this list of conditions and the following disclaimer in the documentation
012 *    and/or other materials provided with the distribution.
013 *
014 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of
015 *    its contributors may be used to endorse or promote products derived
016 *    from this software without specific prior written permission.
017 *
018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030
031package com.jgoodies.forms.layout;
032
033import java.util.StringTokenizer;
034
035/**
036 * Specifies columns in FormLayout by their default orientation,
037 * start size and resizing behavior.<p>
038 *
039 * <strong>Examples:</strong><br>
040 * The following examples specify a column with FILL alignment, a size of
041 * 10&nbsp;dlu that won't grow.
042 * <pre>
043 * new ColumnSpec(Sizes.dluX(10));
044 * new ColumnSpec(ColumnSpec.FILL, Sizes.dluX(10), 0.0);
045 * new ColumnSpec(ColumnSpec.FILL, Sizes.dluX(10), ColumnSpec.NO_GROW);
046 * new ColumnSpec("10dlu");
047 * new ColumnSpec("10dlu:0");
048 * new ColumnSpec("fill:10dlu:0");
049 * </pre><p>
050 *
051 * The {@link com.jgoodies.forms.factories.FormFactory} provides
052 * predefined frequently used ColumnSpec instances.
053 *
054 * @author        Karsten Lentzsch
055 * @version $Revision$
056 *
057 * @see     com.jgoodies.forms.factories.FormFactory
058 */
059
060@SuppressWarnings("serial")
061public final class ColumnSpec extends FormSpec {
062
063    // Horizontal Orientations *********************************************
064
065    /**
066     * By default put components in the left.
067     */
068    public static final DefaultAlignment LEFT = FormSpec.LEFT_ALIGN;
069
070    /**
071     * By default put the components in the center.
072     */
073    public static final DefaultAlignment CENTER = FormSpec.CENTER_ALIGN;
074
075    /**
076     * By default put components in the middle.
077     */
078    public static final DefaultAlignment MIDDLE = CENTER;
079
080    /**
081     * By default put components in the right.
082     */
083    public static final DefaultAlignment RIGHT = FormSpec.RIGHT_ALIGN;
084
085    /**
086     * By default fill the component into the column.
087     */
088    public static final DefaultAlignment FILL = FormSpec.FILL_ALIGN;
089
090    /**
091     * Unless overridden the default alignment for a column is FILL.
092     */
093    public static final DefaultAlignment DEFAULT = FILL;
094
095    // Instance Creation ****************************************************
096
097    /**
098     * Constructs a ColumnSpec for the given default alignment,
099     * size and resize weight.<p>
100     *
101     * The resize weight must be a non-negative double; you can use
102     * <code>NO_GROW</code> as a convenience value for no resize.
103     *
104     * @param defaultAlignment the column's default alignment
105     * @param size             constant, component size or bounded size
106     * @param resizeWeight     the column's non-negative resize weight
107     * @exception IllegalArgumentException if the size is invalid or
108     *      the resize weight is negative
109     */
110    public ColumnSpec(DefaultAlignment defaultAlignment, Size size,
111            double resizeWeight) {
112        super(defaultAlignment, size, resizeWeight);
113    }
114
115    /**
116     * Constructs a ColumnSpec for the given size using the
117     * default alignment, and no resizing.
118     *
119     * @param size             constant size, component size, or bounded size
120     * @exception IllegalArgumentException if the size is invalid
121     */
122    public ColumnSpec(Size size) {
123        super(DEFAULT, size, NO_GROW);
124    }
125
126    /**
127     * Constructs a ColumnSpec from the specified encoded description.
128     * The description will be parsed to set initial values.
129     *
130     * @param encodedDescription        the encoded description
131     */
132    public ColumnSpec(String encodedDescription) {
133        super(DEFAULT, encodedDescription);
134    }
135
136    // Implementing Abstract Behavior ***************************************
137
138    /**
139     * Returns if this is a horizontal specification (vs. vertical).
140     * Used to distinct between horizontal and vertical dialog units,
141     * which have different conversion factors.
142     *
143     * @return  always true (for horizontal)
144     */
145    @Override
146    protected final boolean isHorizontal() {
147        return true;
148    }
149
150    // Parsing and Decoding of Column Descriptions **************************
151
152    /**
153     * Parses and splits encoded column specifications and returns
154     * an array of ColumnSpec objects.
155     *
156     * @param encodedColumnSpecs  comma separated encoded column specifications
157     * @return an array of decoded column specifications
158     * @exception NullPointerException if the encoded column specifications string
159     *     is <code>null</code>
160     *
161     * @see ColumnSpec#ColumnSpec(String)
162     */
163    public static ColumnSpec[] decodeSpecs(String encodedColumnSpecs) {
164        if (encodedColumnSpecs == null) {
165            throw new NullPointerException(
166                    "The column specification must not be null.");
167        }
168
169        StringTokenizer tokenizer = new StringTokenizer(encodedColumnSpecs,
170                ", ");
171        int columnCount = tokenizer.countTokens();
172        ColumnSpec[] columnSpecs = new ColumnSpec[columnCount];
173        for (int i = 0; i < columnCount; i++) {
174            columnSpecs[i] = new ColumnSpec(tokenizer.nextToken());
175        }
176        return columnSpecs;
177    }
178
179}