View Javadoc
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.container;
17  
18  import java.util.List;
19  
20  import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
21  import org.kuali.rice.krad.uif.component.BindingInfo;
22  import org.kuali.rice.krad.uif.component.Component;
23  import org.kuali.rice.krad.uif.component.ComponentSecurity;
24  import org.kuali.rice.krad.uif.component.DataBinding;
25  import org.kuali.rice.krad.uif.element.Action;
26  import org.kuali.rice.krad.uif.element.Message;
27  import org.kuali.rice.krad.uif.view.View;
28  import org.kuali.rice.krad.uif.widget.QuickFinder;
29  
30  /**
31   * Interface representing an editable collection within a view. 
32   * 
33   * @author Kuali Rice Team (rice.collab@kuali.org)
34   */
35  public interface CollectionGroup extends Group, DataBinding {
36  
37      /**
38       * New collection lines are handled in the framework by maintaining a map on
39       * the form. The map contains as a key the collection name, and as value an
40       * instance of the collection type. An entry is created here for the
41       * collection represented by the <code>CollectionGroup</code> if an instance
42       * is not available (clearExistingLine will force a new instance). The given
43       * model must be a subclass of <code>UifFormBase</code> in order to find the
44       * Map.
45       *
46       * @param model Model instance that contains the new collection lines Map
47       * @param clearExistingLine boolean that indicates whether the line should be set to a
48       * new instance if it already exists
49       */
50      void initializeNewCollectionLine(View view, Object model, CollectionGroup collectionGroup,
51              boolean clearExistingLine);
52  
53      /**
54       * Object class the collection maintains. Used to get dictionary information
55       * in addition to creating new instances for the collection when necessary
56       *
57       * @return collection object class
58       */
59      Class<?> getCollectionObjectClass();
60  
61      /**
62       * Setter for the collection object class
63       *
64       * @param collectionObjectClass
65       */
66      void setCollectionObjectClass(Class<?> collectionObjectClass);
67  
68      /**
69       * Setter for the collections property name
70       *
71       * @param propertyName
72       */
73      void setPropertyName(String propertyName);
74  
75      /**
76       * Action fields that should be rendered for each collection line. Example
77       * line action is the delete action
78       *
79       * @return line action fields
80       */
81      List<? extends Component> getLineActions();
82  
83      /**
84       * Setter for the line action fields list
85       *
86       * @param lineActions
87       */
88      void setLineActions(List<? extends Component> lineActions);
89  
90      /**
91       * Indicates whether the action column for the collection should be rendered
92       *
93       * @return true if the actions should be rendered, false if not
94       * @see #getLineActions()
95       */
96      boolean isRenderLineActions();
97  
98      /**
99       * Setter for the render line actions indicator
100      *
101      * @param renderLineActions
102      */
103     void setRenderLineActions(boolean renderLineActions);
104 
105     /**
106      * Indicates whether an add line should be rendered for the collection
107      *
108      * @return true if add line should be rendered, false if it should
109      *         not be
110      */
111     boolean isRenderAddLine();
112 
113     /**
114      * Setter for the render add line indicator
115      *
116      * @param renderAddLine
117      */
118     void setRenderAddLine(boolean renderAddLine);
119 
120     /**
121      * Convenience getter for the add line label field text. The text is used to
122      * label the add line when rendered and its placement depends on the
123      * <code>LayoutManager</code>
124      *
125      * <p>
126      * For the <code>TableLayoutManager</code> the label appears in the sequence
127      * column to the left of the add line fields. For the
128      * <code>StackedLayoutManager</code> the label is placed into the group
129      * header for the line.
130      * </p>
131      *
132      * @return add line label
133      */
134     String getAddLabel();
135 
136     /**
137      * Setter for the add line label text
138      *
139      * @param addLabelText
140      */
141     void setAddLabel(String addLabelText);
142 
143     /**
144      * <code>Message</code> instance for the add line label
145      *
146      * @return add line Message
147      * @see #getAddLabel
148      */
149     Message getAddLineLabel();
150 
151     /**
152      * Setter for the <code>Message</code> instance for the add line label
153      *
154      * @param addLineLabel
155      * @see #getAddLabel
156      */
157     void setAddLineLabel(Message addLineLabel);
158 
159     /**
160      * Name of the property that contains an instance for the add line. If set
161      * this is used with the binding info to create the path to the add line.
162      * Can be left blank in which case the framework will manage the add line
163      * instance in a generic map.
164      *
165      * @return add line property name
166      */
167     String getAddLinePropertyName();
168 
169     /**
170      * Setter for the add line property name
171      *
172      * @param addLinePropertyName
173      */
174     void setAddLinePropertyName(String addLinePropertyName);
175 
176     /**
177      * <code>BindingInfo</code> instance for the add line property used to
178      * determine the full binding path. If add line name given
179      * {@link #getAddLabel} then it is set as the binding name on the
180      * binding info. Add line label and binding info are not required, in which
181      * case the framework will manage the new add line instances through a
182      * generic map (model must extend UifFormBase)
183      *
184      * @return BindingInfo add line binding info
185      */
186     BindingInfo getAddLineBindingInfo();
187 
188     /**
189      * Setter for the add line binding info
190      *
191      * @param addLineBindingInfo
192      */
193     void setAddLineBindingInfo(BindingInfo addLineBindingInfo);
194 
195     /**
196      * List of <code>Component</code> instances that should be rendered for the
197      * collection add line (if enabled). If not set, the default group's items
198      * list will be used
199      *
200      * @return add line field list
201      * @see CollectionGroup#performInitialization(Object)
202      */
203     List<? extends Component> getAddLineItems();
204 
205     /**
206      * Setter for the add line field list
207      *
208      * @param addLineItems
209      */
210     void setAddLineItems(List<? extends Component> addLineItems);
211 
212     /**
213      * Component fields that should be rendered for the add line.
214      *
215      * <p>This is generally the add action (button) but can be configured to contain additional
216      * components
217      * </p>
218      *
219      * @return add line action fields
220      */
221     List<? extends Component> getAddLineActions();
222 
223     /**
224      * Setter for the add line action components fields
225      *
226      * @param addLineActions
227      */
228     void setAddLineActions(List<? extends Component> addLineActions);
229 
230     /**
231      * Indicates whether lines of the collection group should be selected by rendering a
232      * field for each line that will allow selection
233      *
234      * <p>
235      * For example, having the select field enabled could allow selecting multiple lines from a search
236      * to return (multi-value lookup)
237      * </p>
238      *
239      * @return true if select field should be rendered, false if not
240      */
241     boolean isIncludeLineSelectionField();
242 
243     /**
244      * Setter for the render selected field indicator
245      *
246      * @param includeLineSelectionField
247      */
248     void setIncludeLineSelectionField(boolean includeLineSelectionField);
249 
250     /**
251      * When {@link #isIncludeLineSelectionField()} is true, gives the name of the property the select field
252      * should bind to
253      *
254      * <p>
255      * Note if no prefix is given in the property name, such as 'form.', it is assumed the property is
256      * contained on the collection line. In this case the binding path to the collection line will be
257      * appended. In other cases, it is assumed the property is a list or set of String that will hold the
258      * selected identifier strings
259      * </p>
260      *
261      * <p>
262      * This property is not required. If not the set the framework will use a property contained on
263      * <code>UifFormBase</code>
264      * </p>
265      *
266      * @return property name for select field
267      */
268     String getLineSelectPropertyName();
269 
270     /**
271      * Setter for the property name that will bind to the select field
272      *
273      * @param lineSelectPropertyName
274      */
275     void setLineSelectPropertyName(String lineSelectPropertyName);
276 
277     /**
278      * Instance of the <code>QuickFinder</code> widget that configures a multi-value lookup for the collection
279      *
280      * <p>
281      * If the collection lookup is enabled (by the render property of the quick finder), {@link
282      * #getCollectionObjectClass()} will be used as the data object class for the lookup (if not set). Field
283      * conversions need to be set as usual and will be applied for each line returned
284      * </p>
285      *
286      * @return instance configured for the collection lookup
287      */
288     QuickFinder getCollectionLookup();
289 
290     /**
291      * Setter for the collection lookup quickfinder instance
292      *
293      * @param collectionLookup
294      */
295     void setCollectionLookup(QuickFinder collectionLookup);
296 
297     /**
298      * Indicates whether inactive collections lines should be displayed
299      *
300      * <p>
301      * Setting only applies when the collection line type implements the
302      * <code>Inactivatable</code> interface. If true and showInactive is
303      * set to false, the collection will be filtered to remove any items
304      * whose active status returns false
305      * </p>
306      *
307      * @return true to show inactive records, false to not render inactive records
308      */
309     boolean isShowInactiveLines();
310 
311     /**
312      * Setter for the show inactive indicator
313      *
314      * @param showInactiveLines boolean show inactive
315      */
316     void setShowInactiveLines(boolean showInactiveLines);
317 
318     /**
319      * Collection filter instance for filtering the collection data when the
320      * showInactive flag is set to false
321      *
322      * @return CollectionFilter
323      */
324     CollectionFilter getActiveCollectionFilter();
325 
326     /**
327      * Setter for the collection filter to use for filter inactive records from the
328      * collection
329      *
330      * @param activeCollectionFilter CollectionFilter instance
331      */
332     void setActiveCollectionFilter(CollectionFilter activeCollectionFilter);
333 
334     /**
335      * List of {@link CollectionFilter} instances that should be invoked to filter the collection before
336      * displaying
337      *
338      * @return List<CollectionFilter>
339      */
340     List<CollectionFilter> getFilters();
341 
342     /**
343      * Setter for the List of collection filters for which the collection will be filtered against
344      *
345      * @param filters
346      */
347     void setFilters(List<CollectionFilter> filters);
348 
349     /**
350      *  List of {@link BindingInfo} instances that represent lines not authorized to be viewed or edited by the user.
351      */
352     List<BindingInfo> getUnauthorizedLineBindingInfos();
353 
354     /**
355      * @see CollectionGroup#getUnauthorizedLineBindingInfos()
356      */
357     void setUnauthorizedLineBindingInfos(List<BindingInfo> unauthorizedLineBindingInfos);
358 
359     /**
360      * List of <code>CollectionGroup</code> instances that are sub-collections
361      * of the collection represented by this collection group
362      *
363      * @return sub collections
364      */
365     List<CollectionGroup> getSubCollections();
366 
367     /**
368      * Setter for the sub collection list
369      *
370      * @param subCollections
371      */
372     void setSubCollections(List<CollectionGroup> subCollections);
373 
374     /**
375      * Collection Security object that indicates what authorization (permissions) exist for the collection
376      *
377      * @return CollectionGroupSecurity instance
378      */
379     CollectionGroupSecurity getCollectionGroupSecurity();
380 
381     /**
382      * Override to assert a {@link CollectionGroupSecurity} instance is set
383      *
384      * @param componentSecurity instance of CollectionGroupSecurity
385      */
386     void setComponentSecurity(ComponentSecurity componentSecurity);
387 
388     /**
389      * @see org.kuali.rice.krad.uif.container.CollectionGroupSecurity#isEditLineAuthz()
390      */
391     boolean isEditLineAuthz();
392 
393     /**
394      * @see org.kuali.rice.krad.uif.container.CollectionGroupSecurity#setEditLineAuthz(boolean)
395      */
396     void setEditLineAuthz(boolean editLineAuthz);
397 
398     /**
399      * @see org.kuali.rice.krad.uif.container.CollectionGroupSecurity#isViewLineAuthz()
400      */
401     boolean isViewLineAuthz();
402 
403     /**
404      * @see org.kuali.rice.krad.uif.container.CollectionGroupSecurity#setViewLineAuthz(boolean)
405      */
406     void setViewLineAuthz(boolean viewLineAuthz);
407 
408     /**
409      * <code>CollectionGroupBuilder</code> instance that will build the
410      * components dynamically for the collection instance
411      *
412      * @return CollectionGroupBuilder instance
413      */
414     CollectionGroupBuilder getCollectionGroupBuilder();
415 
416     /**
417      * Setter for the collection group building instance
418      *
419      * @param collectionGroupBuilder
420      */
421     void setCollectionGroupBuilder(CollectionGroupBuilder collectionGroupBuilder);
422 
423     /**
424      * @param renderInactiveToggleButton the showHideInactiveButton to set
425      */
426     void setRenderInactiveToggleButton(boolean renderInactiveToggleButton);
427 
428     /**
429      * @return the showHideInactiveButton
430      */
431     boolean isRenderInactiveToggleButton();
432 
433     /**
434      * The number of records to display for a collection
435      *
436      * @return int
437      */
438     int getDisplayCollectionSize();
439 
440     /**
441      * Setter for the display collection size
442      *
443      * @param displayCollectionSize
444      */
445     void setDisplayCollectionSize(int displayCollectionSize);
446 
447     /**
448      * Indicates whether new items should be styled with the #newItemsCssClass
449      *
450      * @return true if new items must be highlighted
451      */
452     boolean isHighlightNewItems();
453 
454     /**
455      * Setter for the flag that allows for different styling of new items
456      *
457      * @param highlightNewItems
458      */
459     void setHighlightNewItems(boolean highlightNewItems);
460 
461     /**
462      * The css style class that will be added on new items
463      *
464      * @return the new items css style class
465      */
466     String getNewItemsCssClass();
467 
468     /**
469      * Setter for the new items css style class
470      *
471      * @param newItemsCssClass
472      */
473     void setNewItemsCssClass(String newItemsCssClass);
474 
475     /**
476      * The css style class that will be added on the add item group or row
477      *
478      * @return the add item group or row css style class
479      */
480     String getAddItemCssClass();
481 
482     /**
483      * Setter for the add item css style class
484      *
485      * @param addItemCssClass
486      */
487     void setAddItemCssClass(String addItemCssClass);
488 
489     /**
490      * Indicates whether the add item group or row should be styled with the #addItemCssClass
491      *
492      * @return true if add item group or row must be highlighted
493      */
494     boolean isHighlightAddItem();
495 
496     /**
497      * Setter for the flag that allows for different styling of the add item group or row
498      *
499      * @param highlightAddItem
500      */
501     void setHighlightAddItem(boolean highlightAddItem);
502 
503     /**
504      * Indicates that a button will be rendered that allows the user to add blank lines to the collection
505      *
506      * <p>
507      * The button will be added separately from the collection items. The default add line wil not be rendered. The
508      * action of the button will call the controller, add the blank line to the collection and do a component refresh.
509      * </p>
510      *
511      * @return boolean
512      */
513     boolean isRenderAddBlankLineButton();
514 
515     /**
516      * Setter for the flag indicating that the add blank line button must be rendered
517      *
518      * @param renderAddBlankLineButton
519      */
520     void setRenderAddBlankLineButton(boolean renderAddBlankLineButton);
521 
522     /**
523      * The add blank line {@link Action} field rendered when renderAddBlankLineButton is true
524      *
525      * @return boolean
526      */
527     Action getAddBlankLineAction();
528 
529     /**
530      * Setter for the add blank line {@link Action} field
531      *
532      * @param addBlankLineAction
533      */
534     void setAddBlankLineAction(Action addBlankLineAction);
535 
536     /**
537      * Indicates the add line placement
538      *
539      * <p>
540      * Valid values are 'TOP' or 'BOTTOM'. The default is 'TOP'. When the value is 'BOTTOM' the blank line will be
541      * added
542      * to the end of the collection.
543      * </p>
544      *
545      * @return the add blank line action placement
546      */
547     String getAddLinePlacement();
548 
549     /**
550      * Setter for the add line placement
551      *
552      * @param addLinePlacement add line placement string
553      */
554     void setAddLinePlacement(String addLinePlacement);
555 
556     /**
557      * Indicates whether the save line actions should be rendered
558      *
559      * @return boolean
560      */
561     boolean isRenderSaveLineActions();
562 
563     /**
564      * Setter for the flag indicating whether the save actions should be rendered
565      *
566      * @param renderSaveLineActions
567      */
568     void setRenderSaveLineActions(boolean renderSaveLineActions);
569 
570     /**
571      * Indicates that a add action should be rendered and that the add group be displayed in a lightbox
572      *
573      * @return boolean
574      */
575     boolean isAddViaLightBox();
576 
577     /**
578      * Setter for the flag to indicate that add groups should be displayed in a light box
579      *
580      * @param addViaLightBox
581      */
582     void setAddViaLightBox(boolean addViaLightBox);
583 
584     /**
585      * The {@link Action} that will be displayed that will open the add line group in a lightbox
586      *
587      * @return Action
588      */
589     Action getAddViaLightBoxAction();
590 
591     /**
592      * Setter for the add line via lightbox {@link Action}
593      *
594      * @param addViaLightBoxAction
595      */
596     void setAddViaLightBoxAction(Action addViaLightBoxAction);
597 
598     /**
599      * Gets useServerPaging, the flag that indicates whether server side paging is enabled.  Defaults to false.
600      *
601      * @return true if server side paging is enabled.
602      */
603     boolean isUseServerPaging();
604 
605     /**
606      * Sets useServerPaging, the flag indicating whether server side paging is enabled.
607      *
608      * @param useServerPaging the useServerPaging value to set
609      */
610     void setUseServerPaging(boolean useServerPaging);
611 
612     int getPageSize();
613 
614     void setPageSize(int pageSize);
615 
616     /**
617      * Gets the displayStart, the index of the first item to display on the page (assuming useServerPaging is enabled).
618      *
619      * <p>if this field has not been set, the returned value will be -1</p>
620      *
621      * @return the index of the first item to display, or -1 if unset
622      */
623     int getDisplayStart();
624 
625     /**
626      * Sets the displayStart, the index of the first item to display on the page (assuming useServerPaging is enabled).
627      *
628      * @param displayStart the displayStart to set
629      */
630     void setDisplayStart(int displayStart);
631 
632     /**
633      * Gets the displayLength, the number of items to display on the page (assuming useServerPaging is enabled).
634      *
635      * <p>if this field has not been set, the returned value will be -1</p>
636      *
637      * @return the number of items to display on the page, or -1 if unset
638      */
639     int getDisplayLength();
640 
641     /**
642      * Sets the displayLength, the number of items to display on the page (assuming useServerPaging is enabled).
643      *
644      * @param displayLength the displayLength to set
645      */
646     void setDisplayLength(int displayLength);
647 
648     /**
649      * Gets the number of un-filtered elements from the model collection.
650      *
651      * <p>if this field has not been set, the returned value will be -1</p>
652      *
653      * @return the filtered collection size, or -1 if unset
654      */
655     int getFilteredCollectionSize();
656 
657     /**
658      * Sets the number of un-filtered elements from the model collection.
659      *
660      * <p>This value is used for display and rendering purposes, it has no effect on the model collection</p>
661      *
662      * @param filteredCollectionSize the filtered collection size
663      */
664     void setFilteredCollectionSize(int filteredCollectionSize);
665 
666     /**
667      * @see org.kuali.rice.krad.uif.component.Component#completeValidation
668      */
669     void completeValidation(ValidationTrace tracer);
670 
671     /**
672      * This method ...
673      * 
674      */
675     void pushCollectionGroupToReference();
676     
677     /**
678      * This method ...
679      * 
680      * @return
681      */
682     List<String> getDuplicateLinePropertyNames();
683 
684 }