001    /**
002     * Copyright 2005-2013 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.krad.datadictionary.parse.BeanTag;
020    import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute;
021    import org.kuali.rice.krad.datadictionary.parse.BeanTags;
022    import org.kuali.rice.krad.uif.UifConstants;
023    import org.kuali.rice.krad.uif.component.Component;
024    import org.kuali.rice.krad.uif.container.Group;
025    import org.kuali.rice.krad.uif.view.View;
026    
027    import java.util.List;
028    
029    /**
030     * Field that contains a nested <code>Group</code>. Can be used to group
031     * together fields by providing a group without header and footer, or simply to
032     * nest full groups. The items getter/setter provided is for convenience and
033     * will set the items <code>List</code> in the nested <code>Group</code>
034     *
035     * @author Kuali Rice Team (rice.collab@kuali.org)
036     */
037    @BeanTags({@BeanTag(name = "fieldGroup-bean", parent = "Uif-FieldGroupBase"),
038            @BeanTag(name = "verticalFieldGroup-bean", parent = "Uif-VerticalFieldGroup"),
039            @BeanTag(name = "horizontalFieldGroup-bean", parent = "Uif-HorizontalFieldGroup")})
040    public class FieldGroup extends FieldBase {
041        private static final long serialVersionUID = -505654043702442196L;
042    
043        private Group group;
044    
045        public FieldGroup() {
046            super();
047        }
048    
049        /**
050         * The following initialization is performed:
051         *
052         * <ul>
053         * <li>Set the align on group if empty and the align has been set on the field</li>
054         * </ul>
055         *
056         * @see org.kuali.rice.krad.uif.component.ComponentBase#performInitialization(org.kuali.rice.krad.uif.view.View,
057         *      java.lang.Object)
058         */
059        @Override
060        public void performInitialization(View view, Object model) {
061            super.performInitialization(view, model);
062    
063            if (StringUtils.isNotBlank(getAlign()) && group != null) {
064                group.setAlign(getAlign());
065            }
066        }
067    
068        @Override
069        public void performFinalize(View view, Object model, Component parent) {
070            super.performFinalize(view, model, parent);
071    
072            this.addDataAttribute("parent", parent.getId());
073            if (group != null) {
074                this.addDataAttribute("group", group.getId());
075            }
076    
077            setNestedComponentIdAndSuffix(getFieldLabel(), UifConstants.IdSuffixes.LABEL);
078    
079            if (this.getFieldLabel() != null) {
080                this.getFieldLabel().setLabelForComponentId(this.getId() + UifConstants.IdSuffixes.FIELDSET);
081            }
082        }
083    
084        /**
085         * @see org.kuali.rice.krad.uif.component.ComponentBase#getComponentsForLifecycle()
086         */
087        @Override
088        public List<Component> getComponentsForLifecycle() {
089            List<Component> components = super.getComponentsForLifecycle();
090    
091            components.add(group);
092    
093            return components;
094        }
095    
096        /**
097         * <code>Group</code> instance that is contained within in the field
098         *
099         * @return Group instance
100         */
101        @BeanTagAttribute(name = "group", type = BeanTagAttribute.AttributeType.SINGLEBEAN)
102        public Group getGroup() {
103            return this.group;
104        }
105    
106        /**
107         * Setter for the field's nested group
108         *
109         * @param group
110         */
111        public void setGroup(Group group) {
112            this.group = group;
113        }
114    
115        /**
116         * List of <code>Component</code> instances contained in the nested group
117         *
118         * <p>
119         * Convenience method for configuration to get the items List from the
120         * field's nested group
121         * </p>
122         *
123         * @return List<? extends Component> items
124         */
125        @BeanTagAttribute(name = "items", type = BeanTagAttribute.AttributeType.LISTBEAN)
126        public List<? extends Component> getItems() {
127            if (group != null) {
128                return group.getItems();
129            }
130    
131            return null;
132        }
133    
134        /**
135         * Setter for the field's nested group items
136         *
137         * <p>
138         * Convenience method for configuration to set the items List for the
139         * field's nested group
140         * </p>
141         *
142         * @param items
143         */
144        public void setItems(List<? extends Component> items) {
145            if (group != null) {
146                group.setItems(items);
147            }
148        }
149    
150    }