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 rows 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 centered row with a size of 14 dlu 041 * that won't grow. 042 * <pre> 043 * new RowSpec(Sizes.dluX(14)); 044 * new RowSpec(RowSpec.CENTER, Sizes.dluX(14), 0.0); 045 * new RowSpec(rowSpec.CENTER, Sizes.dluX(14), RowSpec.NO_GROW); 046 * new RowSpec("14dlu"); 047 * new RowSpec("14dlu:0"); 048 * new RowSpec("center:14dlu:0"); 049 * </pre><p> 050 * 051 * The {@link com.jgoodies.forms.factories.FormFactory} provides 052 * predefined frequently used RowSpec 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 RowSpec extends FormSpec { 062 063 // Vertical Orientations ************************************************ 064 065 /** 066 * By default put the components in the top. 067 */ 068 public static final DefaultAlignment TOP = FormSpec.TOP_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 the components in the bottom. 077 */ 078 public static final DefaultAlignment BOTTOM = FormSpec.BOTTOM_ALIGN; 079 080 /** 081 * By default fill the component into the row. 082 */ 083 public static final DefaultAlignment FILL = FormSpec.FILL_ALIGN; 084 085 /** 086 * Unless overridden the default alignment for a row is CENTER. 087 */ 088 public static final DefaultAlignment DEFAULT = CENTER; 089 090 // Instance Creation **************************************************** 091 092 /** 093 * Constructs a RowSpec from the given default orientation, 094 * size, and resize weight.<p> 095 * 096 * The resize weight must be a non-negative double; you can use 097 * <code>NO_FILL</code> as a convenience value for no resize. 098 * 099 * @param defaultAlignment the row's default alignment 100 * @param size constant size, component size, or bounded size 101 * @param resizeWeight the row's non-negative resize weight 102 * @exception IllegalArgumentException if the size is invalid or 103 * the resize weight is negative 104 */ 105 public RowSpec(DefaultAlignment defaultAlignment, Size size, 106 double resizeWeight) { 107 super(defaultAlignment, size, resizeWeight); 108 } 109 110 /** 111 * Constructs a RowSpec for the given size using the 112 * default alignment, and no resizing. 113 * 114 * @param size constant size, component size, or bounded size 115 * @exception IllegalArgumentException if the size is invalid 116 */ 117 public RowSpec(Size size) { 118 super(DEFAULT, size, NO_GROW); 119 } 120 121 /** 122 * Constructs a RowSpec from the specified encoded 123 * description. The description will be parsed to set initial values. 124 * 125 * @param encodedDescription the encoded description 126 */ 127 public RowSpec(String encodedDescription) { 128 super(DEFAULT, encodedDescription); 129 } 130 131 // Implementing Abstract Behavior *************************************** 132 133 /** 134 * Returns if this is a horizontal specification (vs. vertical). 135 * Used to distinct between horizontal and vertical dialog units, 136 * which have different conversion factors. 137 * 138 * @return true for horizontal, false for vertical 139 */ 140 @Override 141 protected boolean isHorizontal() { 142 return false; 143 } 144 145 // Parsing and Decoding of Row Descriptions ***************************** 146 147 /** 148 * Parses and splits encoded row specifications and returns 149 * an array of RowSpec objects. 150 * 151 * @param encodedRowSpecs comma separated encoded row specifications 152 * @return an array of decoded row specifications 153 * @exception NullPointerException if the encoded row specifications string 154 * is <code>null</code> 155 * 156 * @see RowSpec#RowSpec(String) 157 */ 158 public static RowSpec[] decodeSpecs(String encodedRowSpecs) { 159 if (encodedRowSpecs == null) { 160 throw new NullPointerException( 161 "The row specification must not be null."); 162 } 163 164 StringTokenizer tokenizer = new StringTokenizer(encodedRowSpecs, ", "); 165 int rowCount = tokenizer.countTokens(); 166 RowSpec[] rowSpecs = new RowSpec[rowCount]; 167 for (int i = 0; i < rowCount; i++) { 168 rowSpecs[i] = new RowSpec(tokenizer.nextToken()); 169 } 170 return rowSpecs; 171 } 172 173}