1 /**
2 * Copyright 2005-2014 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.krad.uif.layout;
17
18 import org.kuali.rice.krad.datadictionary.uif.UifDictionaryBean;
19 import org.kuali.rice.krad.uif.container.Container;
20 import org.kuali.rice.krad.uif.view.View;
21 import org.kuali.rice.krad.uif.component.Component;
22 import org.kuali.rice.krad.uif.component.PropertyReplacer;
23 import org.kuali.rice.krad.uif.service.ViewHelperService;
24
25 import java.io.Serializable;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29
30 /**
31 * Manages the rendering of <code>Component</code> instances within a
32 * <code>Container</code>
33 *
34 * @author Kuali Rice Team (rice.collab@kuali.org)
35 */
36 public interface LayoutManager extends UifDictionaryBean, Serializable {
37
38 /**
39 * The unique id (within a given tree) for the layout manager instance
40 *
41 * <p>
42 * The id is used to identify a <code>LayoutManager</code> instance within
43 * the tree and can be used by renderers
44 * </p>
45 *
46 * @return String id
47 */
48 public String getId();
49
50 /**
51 * Sets the unique id (within a given tree) for the layout manager
52 *
53 * @param id
54 * - string to set as the layout manager id
55 */
56 public void setId(String id);
57
58 /**
59 * The path to the JSP file that should be called to invoke the layout
60 * manager
61 *
62 * <p>
63 * The path should be relative to the web root. All layout manager templates
64 * receive the list of items of be placed, the configured layout manager,
65 * and the container to which the layout manager applies
66 * </p>
67 *
68 * <p>
69 * e.g. '/krad/WEB-INF/jsp/tiles/boxLayout.jsp'
70 * </p>
71 *
72 * @return String representing the template path
73 */
74 public String getTemplate();
75
76 /**
77 * Setter for the layout managers template
78 *
79 * @param template
80 */
81 public void setTemplate(String template);
82
83 /**
84 * Should be called to initialize the layout manager
85 *
86 * <p>
87 * This is where layout managers can set defaults and setup other necessary
88 * state. The initialize method should only be called once per layout
89 * manager lifecycle and is invoked within the initialize phase of the view
90 * lifecylce.
91 * </p>
92 *
93 * @param view
94 * - View instance the layout manager is a part of
95 * @param model - the object instance containing the view data
96 * @param container
97 * - Container the layout manager applies to
98 * @see ViewHelperService#performInitialization
99 */
100 public void performInitialization(View view, Object model, Container container);
101
102 /**
103 * Called after the initialize phase to perform conditional logic based on
104 * the model data
105 *
106 * @param view
107 * - view instance to which the layout manager belongs
108 * @param model
109 * - Top level object containing the data (could be the form or a
110 * top level business object, dto)
111 * @param container
112 * - Container the layout manager applies to
113 */
114 public void performApplyModel(View view, Object model, Container container);
115
116 /**
117 * The last phase before the view is rendered. Here final preparations can
118 * be made based on the updated view state
119 *
120 *
121 * @param view
122 * - view instance that should be finalized for rendering
123 * @param model
124 * - top level object containing the data
125 * @param container
126 * - Container the layout manager applies to
127 */
128 public void performFinalize(View view, Object model, Container container);
129
130 /**
131 * Determines what <code>Container</code> classes are supported by the
132 * <code>LayoutManager</code>
133 *
134 * @return Class<? extends Container> container class supported
135 */
136 public Class<? extends Container> getSupportedContainer();
137
138 /**
139 * List of components that are contained within the layout manager that should be sent through the lifecycle
140 *
141 * <p>
142 * Used by <code>ViewHelperService</code> for the various lifecycle
143 * callbacks
144 * </p>
145 *
146 * @return List<Component> child components
147 */
148 public List<Component> getComponentsForLifecycle();
149
150 /**
151 * List of components that are maintained by the layout manager as prototypes for creating other component
152 * instances
153 *
154 * <p>
155 * Prototypes are held for configuring how a component should be created during the lifecycle. An example of this
156 * are the fields in a collection group that are created for each collection record. They only participate in the
157 * initialize phase.
158 * </p>
159 *
160 * @return List<Component> child component prototypes
161 */
162 public List<Component> getComponentPrototypes();
163
164 /**
165 * Used by the copy process to determine for which properties only the value
166 * reference should be copied (not a new copy instance). Subclasses can
167 * define the properties for which only the reference should be copied
168 *
169 * @return Set<String> property names for which only the value reference
170 * should be copied
171 * @see org.kuali.rice.krad.uif.util.ComponentUtils#copy(org.kuali.rice.krad.uif.component.Component)
172 */
173 public Set<String> getPropertiesForReferenceCopy();
174
175 /**
176 * CSS style string to be applied to the area (div) the layout manager
177 * generates for the items
178 *
179 * <p>
180 * Note the styleClass/style configured on the <code>Container</code>
181 * applies to all the container content (header, body, footer), while the
182 * styleClass/style configured on the <code>LayoutManager</code> only
183 * applies to the div surrounding the items placed by the manager (the
184 * container's body)
185 * </p>
186 *
187 * <p>
188 * Any style override or additions can be specified with this attribute.
189 * This is used by the renderer to set the style attribute on the
190 * corresponding element.
191 * </p>
192 *
193 * <p>
194 * e.g. 'color: #000000;text-decoration: underline;'
195 * </p>
196 *
197 * @return String css style string
198 */
199 public String getStyle();
200
201 /**
202 * Setter for the layout manager div style
203 *
204 * @param style
205 */
206 public void setStyle(String style);
207
208 /**
209 * CSS style class(s) to be applied to the area (div) the layout manager
210 * generates for the items
211 *
212 * <p>
213 * Note the styleClass/style configured on the <code>Container</code>
214 * applies to all the container content (header, body, footer), while the
215 * styleClass/style configured on the <code>LayoutManager</code> only
216 * applies to the div surrounding the items placed by the manager (the
217 * container's body)
218 * </p>
219 *
220 * <p>
221 * Declares additional style classes for the div. Multiple classes are
222 * specified with a space delimiter. This is used by the renderer to set the
223 * class attribute on the corresponding element. The class(s) declared must
224 * be available in the common style sheets or the style sheets specified for
225 * the view
226 * </p>
227 *
228 * <p>
229 * e.g. 'header left'
230 * </p>
231 *
232 * @return List<String> css style classes to apply
233 */
234 public List<String> getCssClasses();
235
236 /**
237 * Setter for the layout manager div style class
238 *
239 * @param styleClasses
240 */
241 public void setCssClasses(List<String> styleClasses);
242
243 /**
244 * This method adds a single style class to the list of css style classes on this component
245 *
246 * @param styleClass
247 */
248 public void addStyleClass(String styleClass);
249
250 /**
251 * Context map for the layout manager
252 *
253 * @return Map<String, Object> context
254 * @see org.kuali.rice.krad.uif.component.Component#getContext()
255 */
256 public Map<String, Object> getContext();
257
258 /**
259 * Appends to the inline style set on this layoutManager
260 *
261 * @param styleRules
262 */
263 public void appendToStyle(String styleRules);
264
265 /**
266 * Setter for the context Map
267 *
268 * @param context
269 */
270 public void setContext(Map<String, Object> context);
271
272 /**
273 * Places the given object into the context Map for the layout manager
274 * with the given name
275 *
276 * @see org.kuali.rice.krad.uif.component.Component#pushObjectToContext(String,
277 * Object)
278 */
279 public void pushObjectToContext(String objectName, Object object);
280
281 /**
282 * List of <code>PropertyReplacer</code> instances that will be
283 * evaluated during the view lifecycle to conditional set properties on the
284 * <code>LayoutManager</code> based on expression evaluations
285 *
286 * @return List<PropertyReplacer> replacers to evaluate
287 */
288 public List<PropertyReplacer> getPropertyReplacers();
289
290 /**
291 * Setter for the layout managers property substitutions
292 *
293 * @param propertyReplacers
294 */
295 public void setPropertyReplacers(List<PropertyReplacer> propertyReplacers);
296
297 }