001 /**
002 * Copyright 2005-2012 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
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,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.krad.uif.field;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.core.api.exception.RiceRemoteServiceConnectionException;
020 import org.kuali.rice.core.api.exception.RiceRuntimeException;
021 import org.kuali.rice.krad.uif.UifConstants.Position;
022 import org.kuali.rice.krad.uif.component.ComponentSecurity;
023 import org.kuali.rice.krad.uif.view.View;
024 import org.kuali.rice.krad.uif.component.Component;
025 import org.kuali.rice.krad.uif.component.ComponentBase;
026 import org.kuali.rice.krad.uif.util.ComponentFactory;
027
028 import java.util.List;
029
030 /**
031 * Base class for <code>Field</code> implementations
032 *
033 * <p>
034 * Sets the component type name so that all field templates have a fixed
035 * contract
036 * </p>
037 *
038 * <p>
039 * Holds a nested <code>LabelField</code> with configuration for rendering the
040 * label and configuration on label placement.
041 * </p>
042 *
043 * @author Kuali Rice Team (rice.collab@kuali.org)
044 */
045 public class FieldBase extends ComponentBase implements Field {
046 private static final long serialVersionUID = -5888414844802862760L;
047
048 private String shortLabel;
049 private LabelField labelField;
050
051 private Position labelPlacement;
052
053 private boolean labelFieldRendered;
054
055 public FieldBase() {
056 labelFieldRendered = false;
057 labelPlacement = Position.LEFT;
058 }
059
060 /**
061 * The following initialization is performed:
062 *
063 * <ul>
064 * </ul>
065 *
066 * @see org.kuali.rice.krad.uif.component.ComponentBase#performInitialization(org.kuali.rice.krad.uif.view.View, java.lang.Object)
067 */
068 @Override
069 public void performInitialization(View view, Object model) {
070 super.performInitialization(view, model);
071 }
072
073 /**
074 * The following finalization is performed:
075 *
076 * <ul>
077 * <li>Set the labelForComponentId to this component id</li>
078 * <li>Set the label text on the label field from the field's label property
079 * </li>
080 * <li>Set the render property on the label's required message field if this
081 * field is marked as required</li>
082 * <li>If label placement is right, set render colon to false</li>
083 * </ul>
084 *
085 * @see org.kuali.rice.krad.uif.component.ComponentBase#performFinalize(org.kuali.rice.krad.uif.view.View,
086 * java.lang.Object, org.kuali.rice.krad.uif.component.Component)
087 */
088 @Override
089 public void performFinalize(View view, Object model, Component parent) {
090 super.performFinalize(view, model, parent);
091
092 if (labelField != null) {
093 labelField.setLabelForComponentId(this.getId());
094
095 if ((getRequired() != null) && getRequired().booleanValue()) {
096 labelField.getRequiredMessageField().setRender(true);
097 } else {
098 setRequired(new Boolean(false));
099 labelField.getRequiredMessageField().setRender(true);
100 String prefixStyle = "";
101 if (StringUtils.isNotBlank(labelField.getRequiredMessageField().getStyle())) {
102 prefixStyle = labelField.getRequiredMessageField().getStyle();
103 }
104 labelField.getRequiredMessageField().setStyle(prefixStyle + ";" + "display: none;");
105 }
106
107 if (labelPlacement.equals(Position.RIGHT)) {
108 labelField.setRenderColon(false);
109 }
110
111 if (labelPlacement.equals(Position.TOP) || labelPlacement.equals(Position.BOTTOM)){
112 labelField.addStyleClass("uif-labelBlock");
113 }
114 }
115 }
116
117 /**
118 * @see org.kuali.rice.krad.uif.component.Component#getComponentTypeName()
119 */
120 @Override
121 public final String getComponentTypeName() {
122 return "field";
123 }
124
125 /**
126 * @see org.kuali.rice.krad.uif.component.ComponentBase#getComponentsForLifecycle()
127 */
128 @Override
129 public List<Component> getComponentsForLifecycle() {
130 List<Component> components = super.getComponentsForLifecycle();
131
132 components.add(labelField);
133
134 return components;
135 }
136
137 /**
138 * @see org.kuali.rice.krad.uif.field.Field#getLabel()
139 */
140 public String getLabel() {
141 if (labelField != null) {
142 return labelField.getLabelText();
143 }
144
145 return null;
146 }
147
148 /**
149 * @see org.kuali.rice.krad.uif.field.Field#setLabel(java.lang.String)
150 */
151 public void setLabel(String label) {
152 if (StringUtils.isNotBlank(label) && labelField == null) {
153 labelField = ComponentFactory.getLabelField();
154 }
155
156 if (labelField != null) {
157 labelField.setLabelText(label);
158 }
159 }
160
161 /**
162 * @see org.kuali.rice.krad.uif.field.Field#getShortLabel()
163 */
164 public String getShortLabel() {
165 return this.shortLabel;
166 }
167
168 /**
169 * @see org.kuali.rice.krad.uif.field.Field#setShortLabel(java.lang.String)
170 */
171 public void setShortLabel(String shortLabel) {
172 this.shortLabel = shortLabel;
173 }
174
175 /**
176 * Sets whether the label should be displayed
177 *
178 * <p>
179 * Convenience method for configuration that sets the render indicator on
180 * the fields <code>LabelField</code> instance
181 * </p>
182 *
183 * @param showLabel boolean true if label should be displayed, false if the label
184 * should not be displayed
185 */
186 public void setShowLabel(boolean showLabel) {
187 if (labelField != null) {
188 labelField.setRender(showLabel);
189 }
190 }
191
192 /**
193 * @see org.kuali.rice.krad.uif.field.Field#getLabelField()
194 */
195 public LabelField getLabelField() {
196 return this.labelField;
197 }
198
199 /**
200 * @see org.kuali.rice.krad.uif.field.Field#setLabelField(org.kuali.rice.krad.uif.field.LabelField)
201 */
202 public void setLabelField(LabelField labelField) {
203 this.labelField = labelField;
204 }
205
206 /**
207 * Indicates where the label is placed in relation to the field (valid options are
208 * LEFT, RIGHT, BOTTOM, and TOP
209 *
210 * @return Position position of label
211 */
212 public Position getLabelPlacement() {
213 return this.labelPlacement;
214 }
215
216 /**
217 * Setter for the label's position in relation to the field (control if editable)
218 *
219 * @param labelPlacement
220 */
221 public void setLabelPlacement(Position labelPlacement) {
222 this.labelPlacement = labelPlacement;
223 }
224
225 /**
226 * @see org.kuali.rice.krad.uif.field.Field#isLabelFieldRendered()
227 */
228 public boolean isLabelFieldRendered() {
229 return this.labelFieldRendered;
230 }
231
232 /**
233 * @see org.kuali.rice.krad.uif.field.Field#setLabelFieldRendered(boolean)
234 */
235 public void setLabelFieldRendered(boolean labelFieldRendered) {
236 this.labelFieldRendered = labelFieldRendered;
237 }
238
239 /**
240 * Field Security object that indicates what authorization (permissions) exist for the field
241 *
242 * @return FieldSecurity instance
243 */
244 @Override
245 public FieldSecurity getComponentSecurity() {
246 return (FieldSecurity) super.getComponentSecurity();
247 }
248
249 /**
250 * Override to assert a {@link FieldSecurity} instance is set
251 *
252 * @param componentSecurity - instance of FieldSecurity
253 */
254 @Override
255 public void setComponentSecurity(ComponentSecurity componentSecurity) {
256 if (!(componentSecurity instanceof FieldSecurity)) {
257 throw new RiceRuntimeException("Component security for Field should be instance of FieldSecurity");
258 }
259
260 super.setComponentSecurity(componentSecurity);
261 }
262
263 @Override
264 protected Class<? extends ComponentSecurity> getComponentSecurityClass() {
265 return FieldSecurity.class;
266 }
267 }