001 /* 002 * Copyright 2002-2004 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 005 * use this file except in compliance with the License. You may obtain a copy of 006 * the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 013 * License for the specific language governing permissions and limitations under 014 * the License. 015 */ 016 package org.springframework.richclient.form.builder; 017 018 import javax.swing.JComponent; 019 import javax.swing.JLabel; 020 import javax.swing.JPanel; 021 022 import org.springframework.richclient.factory.ComponentFactory; 023 import org.springframework.richclient.form.FormModelHelper; 024 import org.springframework.richclient.form.binding.BindingFactory; 025 import org.springframework.richclient.layout.GridBagLayoutBuilder; 026 import org.springframework.richclient.layout.LabelOrientation; 027 import org.springframework.richclient.layout.LayoutBuilder; 028 029 /** 030 * @see GridBagLayoutBuilder 031 */ 032 public class GridBagLayoutFormBuilder extends AbstractFormBuilder implements LayoutBuilder { 033 034 private final GridBagLayoutBuilder builder; 035 036 public GridBagLayoutFormBuilder(BindingFactory bindingFactory) { 037 super(bindingFactory); 038 this.builder = new FormModelAwareGridBagLayoutBuilder(); 039 } 040 041 /** 042 * Returns the underlying {@link GridBagLayoutBuilder}. Should be used with 043 * caution. 044 * 045 * @return never null 046 */ 047 public final GridBagLayoutBuilder getBuilder() { 048 return builder; 049 } 050 051 public void setComponentFactory(ComponentFactory componentFactory) { 052 super.setComponentFactory(componentFactory); 053 builder.setComponentFactory(componentFactory); 054 } 055 056 /** 057 * Appends a label and field to the end of the current line. 058 * <p /> 059 * 060 * The label will be to the left of the field, and be right-justified. 061 * <br /> 062 * The field will "grow" horizontally as space allows. 063 * <p /> 064 * 065 * @param propertyName the name of the property to create the controls for 066 * 067 * @return "this" to make it easier to string together append calls 068 * 069 * @see FormModelHelper#createLabel(String) 070 * @see FormModelHelper#createBoundControl(String) 071 */ 072 public GridBagLayoutFormBuilder appendLabeledField(String propertyName) { 073 return appendLabeledField(propertyName, LabelOrientation.LEFT); 074 } 075 076 /** 077 * Appends a label and field to the end of the current line. 078 * <p /> 079 * 080 * The label will be to the left of the field, and be right-justified. 081 * <br /> 082 * The field will "grow" horizontally as space allows. 083 * <p /> 084 * 085 * @param propertyName the name of the property to create the controls for 086 * @param colSpan the number of columns the field should span 087 * 088 * @return "this" to make it easier to string together append calls 089 * 090 * @see FormModelHelper#createLabel(String) 091 * @see FormModelHelper#createBoundControl(String) 092 */ 093 public GridBagLayoutFormBuilder appendLabeledField(String propertyName, int colSpan) { 094 return appendLabeledField(propertyName, LabelOrientation.LEFT, colSpan); 095 } 096 097 /** 098 * Appends a label and field to the end of the current line. 099 * <p /> 100 * 101 * The label will be to the left of the field, and be right-justified. 102 * <br /> 103 * The field will "grow" horizontally as space allows. 104 * <p /> 105 * 106 * @param propertyName the name of the property to create the controls for 107 * 108 * @return "this" to make it easier to string together append calls 109 * 110 * @see FormModelHelper#createLabel(String) 111 * @see FormModelHelper#createBoundControl(String) 112 */ 113 public GridBagLayoutFormBuilder appendLabeledField(String propertyName, LabelOrientation labelOrientation) { 114 return appendLabeledField(propertyName, labelOrientation, 1); 115 } 116 117 /** 118 * Appends a label and field to the end of the current line. 119 * <p /> 120 * 121 * The label will be to the left of the field, and be right-justified. 122 * <br /> 123 * The field will "grow" horizontally as space allows. 124 * <p /> 125 * 126 * @param propertyName the name of the property to create the controls for 127 * @param colSpan the number of columns the field should span 128 * 129 * @return "this" to make it easier to string together append calls 130 * 131 * @see FormModelHelper#createLabel(String) 132 * @see FormModelHelper#createBoundControl(String) 133 */ 134 public GridBagLayoutFormBuilder appendLabeledField(String propertyName, LabelOrientation labelOrientation, 135 int colSpan) { 136 final JComponent field = createDefaultBinding(propertyName).getControl(); 137 138 return appendLabeledField(propertyName, field, labelOrientation, colSpan); 139 } 140 141 /** 142 * Appends a label and field to the end of the current line. 143 * <p /> 144 * 145 * The label will be to the left of the field, and be right-justified. 146 * <br /> 147 * The field will "grow" horizontally as space allows. 148 * <p /> 149 * 150 * @param propertyName the name of the property to create the controls for 151 * 152 * @return "this" to make it easier to string together append calls 153 * 154 * @see FormModelHelper#createLabel(String) 155 * @see FormModelHelper#createBoundControl(String) 156 */ 157 public GridBagLayoutFormBuilder appendLabeledField(String propertyName, final JComponent field, 158 LabelOrientation labelOrientation) { 159 return appendLabeledField(propertyName, field, labelOrientation, 1); 160 } 161 162 /** 163 * Appends a label and field to the end of the current line. 164 * <p /> 165 * 166 * The label will be to the left of the field, and be right-justified. 167 * <br /> 168 * The field will "grow" horizontally as space allows. 169 * <p /> 170 * 171 * @param propertyName the name of the property to create the controls for 172 * @param colSpan the number of columns the field should span 173 * 174 * @return "this" to make it easier to string together append calls 175 * 176 * @see FormModelHelper#createLabel(String) 177 * @see FormComponentInterceptor#processLabel(String, JComponent) 178 */ 179 public GridBagLayoutFormBuilder appendLabeledField(String propertyName, final JComponent field, 180 LabelOrientation labelOrientation, int colSpan) { 181 return appendLabeledField(propertyName, field, labelOrientation, colSpan, 1, true, false); 182 } 183 184 /** 185 * Appends a label and field to the end of the current line. 186 * <p /> 187 * 188 * The label will be to the left of the field, and be right-justified. 189 * <br /> 190 * The field will "grow" horizontally as space allows. 191 * <p /> 192 * 193 * @param propertyName the name of the property to create the controls for 194 * @param colSpan the number of columns the field should span 195 * 196 * @return "this" to make it easier to string together append calls 197 * 198 * @see FormModelHelper#createLabel(String) 199 * @see FormComponentInterceptor#processLabel(String, JComponent) 200 */ 201 public GridBagLayoutFormBuilder appendLabeledField(String propertyName, final JComponent field, 202 LabelOrientation labelOrientation, int colSpan, int rowSpan, boolean expandX, boolean expandY) { 203 builder.appendLabeledField(propertyName, field, labelOrientation, colSpan, rowSpan, expandX, expandY); 204 return this; 205 } 206 207 /** 208 * Appends a separator (usually a horizontal line). Has an implicit 209 * {@link #nextLine()}before and after it. 210 * 211 * @return "this" to make it easier to string together append calls 212 */ 213 public GridBagLayoutFormBuilder appendSeparator() { 214 return appendSeparator(null); 215 } 216 217 /** 218 * Appends a separator (usually a horizontal line) using the provided string 219 * as the key to look in the 220 * {@link #setComponentFactory(ComponentFactory) ComponentFactory's}message 221 * bundle for the text to put along with the separator. Has an implicit 222 * {@link #nextLine()}before and after it. 223 * 224 * @return "this" to make it easier to string together append calls 225 */ 226 public GridBagLayoutFormBuilder appendSeparator(String labelKey) { 227 builder.appendSeparator(labelKey); 228 return this; 229 } 230 231 /** 232 * Ends the current line and starts a new one 233 * 234 * @return "this" to make it easier to string together append calls 235 */ 236 public GridBagLayoutFormBuilder nextLine() { 237 builder.nextLine(); 238 return this; 239 } 240 241 /** 242 * Should this show "guidelines"? Useful for debugging layouts. 243 */ 244 public void setShowGuidelines(boolean showGuidelines) { 245 builder.setShowGuidelines(showGuidelines); 246 } 247 248 /** 249 * Creates and returns a JPanel with all the given components in it, using 250 * the "hints" that were provided to the builder. 251 * 252 * @return a new JPanel with the components laid-out in it 253 */ 254 public JPanel getPanel() { 255 return builder.getPanel(); 256 } 257 258 /** 259 * @see GridBagLayoutBuilder#setAutoSpanLastComponent(boolean) 260 */ 261 public void setAutoSpanLastComponent(boolean autoSpanLastComponent) { 262 builder.setAutoSpanLastComponent(autoSpanLastComponent); 263 } 264 265 protected final class FormModelAwareGridBagLayoutBuilder extends GridBagLayoutBuilder { 266 protected JLabel createLabel(String propertyName) { 267 JLabel label = getComponentFactory().createLabel(""); 268 getFormModel().getFieldFace(propertyName).configure(label); 269 return label; 270 } 271 } 272 }