001/**
002 * Copyright 2005-2015 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 */
016package org.kuali.rice.krad.uif.layout;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.krad.uif.UifPropertyPaths;
020import org.kuali.rice.krad.uif.container.Container;
021import org.kuali.rice.krad.uif.view.View;
022import org.kuali.rice.krad.uif.component.Component;
023import org.kuali.rice.krad.uif.component.ConfigurableBase;
024import org.kuali.rice.krad.uif.component.PropertyReplacer;
025import org.kuali.rice.krad.uif.component.ReferenceCopy;
026
027import java.util.ArrayList;
028import java.util.Arrays;
029import java.util.HashMap;
030import java.util.HashSet;
031import java.util.List;
032import java.util.Map;
033import java.util.Set;
034
035/**
036 * Base class for all layout managers
037 * 
038 * <p>
039 * Provides general properties of all layout managers, such as the unique id,
040 * rendering template, and style settings
041 * </p>
042 * 
043 * @author Kuali Rice Team (rice.collab@kuali.org)
044 */
045public abstract class LayoutManagerBase extends ConfigurableBase implements LayoutManager {
046        private static final long serialVersionUID = -2657663560459456814L;
047
048        private String id;
049        private String template;
050        private String style;
051
052        private List<String> styleClasses;
053
054        @ReferenceCopy(newCollectionInstance=true)
055        private Map<String, Object> context;
056
057        private List<PropertyReplacer> propertyReplacers;
058
059        public LayoutManagerBase() {
060        super();
061
062                styleClasses = new ArrayList<String>();
063                context = new HashMap<String, Object>();
064                propertyReplacers = new ArrayList<PropertyReplacer>();
065        }
066
067        /**
068         * @see org.kuali.rice.krad.uif.layout.LayoutManager#performInitialization(org.kuali.rice.krad.uif.view.View,
069         *      java.lang.Object, org.kuali.rice.krad.uif.container.Container)
070         */
071        public void performInitialization(View view, Object model, Container container) {
072                // set id of layout manager from container
073                if (StringUtils.isBlank(id)) {
074                        id = container.getId() + "_layout";
075                }
076        }
077
078        /**
079         * @see org.kuali.rice.krad.uif.layout.LayoutManager#performApplyModel(org.kuali.rice.krad.uif.view.View,
080         *      java.lang.Object, org.kuali.rice.krad.uif.container.Container)
081         */
082        public void performApplyModel(View view, Object model, Container container) {
083
084        }
085
086        /**
087         * @see org.kuali.rice.krad.uif.layout.LayoutManager#performFinalize(org.kuali.rice.krad.uif.view.View,
088         *      java.lang.Object, org.kuali.rice.krad.uif.container.Container)
089         */
090        public void performFinalize(View view, Object model, Container container) {
091
092        }
093
094        /**
095         * Set of property names for the layout manager base for which on the
096         * property value reference should be copied. Subclasses can override this
097         * but should include a call to super
098         * 
099         * @see org.kuali.rice.krad.uif.layout.LayoutManager.
100         *      getPropertiesForReferenceCopy()
101         */
102        public Set<String> getPropertiesForReferenceCopy() {
103                Set<String> refCopyProperties = new HashSet<String>();
104
105                refCopyProperties.add(UifPropertyPaths.CONTEXT);
106
107                return refCopyProperties;
108        }
109
110        /**
111         * Default Impl
112         * 
113         * @see org.kuali.rice.krad.uif.layout.LayoutManager#getSupportedContainer()
114         */
115        @Override
116        public Class<? extends Container> getSupportedContainer() {
117                return Container.class;
118        }
119
120        /**
121         * @see org.kuali.rice.krad.uif.layout.LayoutManager#getComponentsForLifecycle()
122         */
123        public List<Component> getComponentsForLifecycle() {
124                return new ArrayList<Component>();
125        }
126
127    /**
128     * @see org.kuali.rice.krad.uif.layout.LayoutManager#getComponentPrototypes()
129     */
130    public List<Component> getComponentPrototypes() {
131        List<Component> components = new ArrayList<Component>();
132
133        return components;
134    }
135
136        /**
137         * @see org.kuali.rice.krad.uif.layout.LayoutManager#getId()
138         */
139        public String getId() {
140                return this.id;
141        }
142
143        /**
144         * @see org.kuali.rice.krad.uif.layout.LayoutManager#setId(java.lang.String)
145         */
146        public void setId(String id) {
147                this.id = id;
148        }
149
150        /**
151         * @see org.kuali.rice.krad.uif.layout.LayoutManager#getTemplate()
152         */
153        public String getTemplate() {
154                return this.template;
155        }
156
157        /**
158         * @see org.kuali.rice.krad.uif.layout.LayoutManager#setTemplate(java.lang.String)
159         */
160        public void setTemplate(String template) {
161                this.template = template;
162        }
163
164        /**
165         * @see org.kuali.rice.krad.uif.layout.LayoutManager#getStyle()
166         */
167        public String getStyle() {
168                return this.style;
169        }
170
171        /**
172         * @see org.kuali.rice.krad.uif.layout.LayoutManager#setStyle(java.lang.String)
173         */
174        public void setStyle(String style) {
175                this.style = style;
176        }
177
178        /**
179         * @see org.kuali.rice.krad.uif.layout.LayoutManager#getStyleClasses()
180         */
181        public List<String> getStyleClasses() {
182                return this.styleClasses;
183        }
184
185        /**
186         * @see org.kuali.rice.krad.uif.layout.LayoutManager#setStyleClasses(java.util.List)
187         */
188        public void setStyleClasses(List<String> styleClasses) {
189                this.styleClasses = styleClasses;
190        }
191
192        /**
193         * Builds the HTML class attribute string by combining the styleClasses list
194         * with a space delimiter
195         * 
196         * @return String class attribute string
197         */
198        public String getStyleClassesAsString() {
199                if (styleClasses != null) {
200                        return StringUtils.join(styleClasses, " ");
201                }
202
203                return "";
204        }
205
206        /**
207         * Sets the styleClasses list from the given string that has the classes
208         * delimited by space. This is a convenience for configuration. If a child
209         * bean needs to inherit the classes from the parent, it should configure as
210         * a list and use merge="true"
211         * 
212         * @param styleClasses
213         */
214        public void setStyleClasses(String styleClasses) {
215                String[] classes = StringUtils.split(styleClasses);
216                this.styleClasses = Arrays.asList(classes);
217        }
218
219        /**
220         * This method adds a single style to the list of css style classes on this layoutManager
221         * 
222         * @param style
223         */
224        @Override
225        public void addStyleClass(String styleClass){
226                if(!styleClasses.contains(styleClass)){
227                        styleClasses.add(styleClass);
228                }
229        }
230
231        /**
232         * @see org.kuali.rice.krad.uif.layout.LayoutManager#getContext()
233         */
234        public Map<String, Object> getContext() {
235                return this.context;
236        }
237
238        /**
239         * @see org.kuali.rice.krad.uif.layout.LayoutManager#setContext(java.util.Map)
240         */
241        public void setContext(Map<String, Object> context) {
242                this.context = context;
243        }
244
245        /**
246         * @see org.kuali.rice.krad.uif.layout.LayoutManager#pushObjectToContext(java.lang.String,
247         *      java.lang.Object)
248         */
249        public void pushObjectToContext(String objectName, Object object) {
250                if (this.context == null) {
251                        this.context = new HashMap<String, Object>();
252                }
253
254                this.context.put(objectName, object);
255        }
256
257        /**
258         * @see org.kuali.rice.krad.uif.layout.LayoutManager#getPropertyReplacers()
259         */
260        public List<PropertyReplacer> getPropertyReplacers() {
261                return this.propertyReplacers;
262        }
263
264        /**
265         * @see org.kuali.rice.krad.uif.layout.LayoutManager#setPropertyReplacers(java.util.List)
266         */
267        public void setPropertyReplacers(List<PropertyReplacer> propertyReplacers) {
268                this.propertyReplacers = propertyReplacers;
269        }
270
271}