001/** 002 * Copyright 2005-2016 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.util; 017 018import org.apache.commons.lang.StringUtils; 019import org.kuali.rice.core.api.uif.RemotableAbstractWidget; 020import org.kuali.rice.core.api.uif.RemotableAttributeField; 021import org.kuali.rice.core.api.uif.RemotableCheckbox; 022import org.kuali.rice.core.api.uif.RemotableCheckboxGroup; 023import org.kuali.rice.core.api.uif.RemotableControlContract; 024import org.kuali.rice.core.api.uif.RemotableDatepicker; 025import org.kuali.rice.core.api.uif.RemotableHiddenInput; 026import org.kuali.rice.core.api.uif.RemotableQuickFinder; 027import org.kuali.rice.core.api.uif.RemotableRadioButtonGroup; 028import org.kuali.rice.core.api.uif.RemotableSelect; 029import org.kuali.rice.core.api.uif.RemotableSelectGroup; 030import org.kuali.rice.core.api.uif.RemotableTextExpand; 031import org.kuali.rice.core.api.uif.RemotableTextInput; 032import org.kuali.rice.core.api.uif.RemotableTextarea; 033import org.kuali.rice.core.api.util.ConcreteKeyValue; 034import org.kuali.rice.core.api.util.KeyValue; 035import org.kuali.rice.krad.datadictionary.validation.constraint.ValidCharactersConstraint; 036import org.kuali.rice.krad.keyvalues.KeyValuesFinder; 037import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 038import org.kuali.rice.krad.uif.UifConstants; 039import org.kuali.rice.krad.uif.container.CollectionGroup; 040import org.kuali.rice.krad.uif.container.Group; 041import org.kuali.rice.krad.uif.container.LinkGroup; 042import org.kuali.rice.krad.uif.container.NavigationGroup; 043import org.kuali.rice.krad.uif.container.PageGroup; 044import org.kuali.rice.krad.uif.container.TabGroup; 045import org.kuali.rice.krad.uif.container.TreeGroup; 046import org.kuali.rice.krad.uif.control.CheckboxControl; 047import org.kuali.rice.krad.uif.control.CheckboxGroupControl; 048import org.kuali.rice.krad.uif.control.Control; 049import org.kuali.rice.krad.uif.control.FileControl; 050import org.kuali.rice.krad.uif.control.HiddenControl; 051import org.kuali.rice.krad.uif.control.MultiValueControl; 052import org.kuali.rice.krad.uif.control.RadioGroupControl; 053import org.kuali.rice.krad.uif.control.SelectControl; 054import org.kuali.rice.krad.uif.control.SizedControl; 055import org.kuali.rice.krad.uif.control.TextAreaControl; 056import org.kuali.rice.krad.uif.control.TextControl; 057import org.kuali.rice.krad.uif.component.Component; 058import org.kuali.rice.krad.uif.field.ActionField; 059import org.kuali.rice.krad.uif.field.DataField; 060import org.kuali.rice.krad.uif.field.InputField; 061import org.kuali.rice.krad.uif.field.BlankField; 062import org.kuali.rice.krad.uif.field.ErrorsField; 063import org.kuali.rice.krad.uif.field.FieldGroup; 064import org.kuali.rice.krad.uif.field.GenericField; 065import org.kuali.rice.krad.uif.field.HeaderField; 066import org.kuali.rice.krad.uif.field.IframeField; 067import org.kuali.rice.krad.uif.field.ImageField; 068import org.kuali.rice.krad.uif.field.LabelField; 069import org.kuali.rice.krad.uif.field.LinkField; 070import org.kuali.rice.krad.uif.field.MessageField; 071import org.kuali.rice.krad.uif.view.View; 072 073import java.util.ArrayList; 074import java.util.HashMap; 075import java.util.List; 076import java.util.Map; 077 078/** 079 * Factory class for creating new UIF components from their base definitions 080 * in the dictionary 081 * 082 * @author Kuali Rice Team (rice.collab@kuali.org) 083 */ 084public class ComponentFactory { 085 086 protected static final String TEXT_CONTROL = "Uif-TextControl"; 087 protected static final String CHECKBOX_CONTROL = "Uif-CheckboxControl"; 088 protected static final String HIDDEN_CONTROL = "Uif-HiddenControl"; 089 protected static final String TEXTAREA_CONTROL = "Uif-TextAreaControl"; 090 protected static final String SELECT_CONTROL = "Uif-DropdownControl"; 091 protected static final String CHECKBOX_GROUP_CONTROL = "Uif-VerticalCheckboxesControl"; 092 protected static final String CHECKBOX_GROUP_CONTROL_HORIZONTAL = "Uif-HorizontalCheckboxesControl"; 093 protected static final String RADIO_GROUP_CONTROL = "Uif-VerticalRadioControl"; 094 protected static final String RADIO_GROUP_CONTROL_HORIZONTAL = "Uif-HorizontalRadioControl"; 095 protected static final String FILE_CONTROL = "Uif-FileControl"; 096 protected static final String DATE_CONTROL = "Uif-DateControl"; 097 protected static final String USER_CONTROL = "Uif-KimPersonControl"; 098 protected static final String GROUP_CONTROL = "Uif-KimGroupControl"; 099 100 protected static final String DATA_FIELD = "Uif-DataField"; 101 protected static final String INPUT_FIELD = "Uif-InputField"; 102 protected static final String ERRORS_FIELD = "Uif-FieldValidationMessages"; 103 protected static final String ACTION_FIELD = "Uif-PrimaryActionButton"; 104 protected static final String ACTION_LINK_FIELD = "Uif-ActionLink"; 105 protected static final String LINK_FIELD = "Uif-Link"; 106 protected static final String IFRAME_FIELD = "Uif-IframeField"; 107 protected static final String IMAGE_FIELD = "Uif-ImageField"; 108 protected static final String BLANK_FIELD = "Uif-EmptyField"; 109 protected static final String GENERIC_FIELD = "Uif-CustomTemplateField"; 110 protected static final String LABEL_FIELD = "Uif-Label"; 111 protected static final String MESSAGE_FIELD = "Uif-MessageField"; 112 protected static final String FIELD_GROUP = "Uif-VerticalFieldGroup"; 113 protected static final String HORIZONTAL_FIELD_GROUP = "Uif-HorizontalFieldGroup"; 114 115 protected static final String GROUP = "Uif-BoxSection"; 116 protected static final String PAGE_GROUP = "Uif-Page"; 117 protected static final String GROUP_GRID_LAYOUT = "Uif-GridSection"; 118 protected static final String GROUP_BODY_ONLY = "Uif-BoxGroup"; 119 protected static final String GROUP_GRID_BODY_ONLY = "Uif-GridGroup"; 120 protected static final String TAB_GROUP = "Uif-TabSection"; 121 protected static final String NAVIGATION_GROUP = "Uif-NavigationGroupBase"; 122 protected static final String TREE_GROUP = "Uif-TreeSection"; 123 protected static final String LINK_GROUP = "Uif-LinkGroup"; 124 protected static final String COLLECTION_GROUP = "Uif-StackedCollectionSection"; 125 protected static final String COLLECTION_GROUP_TABLE_LAYOUT = "Uif-TableCollectionSection"; 126 protected static final String LIST_GROUP = "Uif-ListCollectionSection"; 127 128 protected static final String HEADER = "Uif-HeaderFieldBase"; 129 protected static final String FOOTER = "Uif-FooterBase"; 130 protected static final String FOOTER_SAVECLOSECANCEL = "Uif-FormFooter"; 131 132 /** 133 * Gets a fresh copy of the component by the id passed in which used to look up the component in 134 * the view index, then retrieve a new instance with initial state configured using the factory id 135 * 136 * @param id - id for the component in the view index 137 * @return Component new instance 138 */ 139 public static Component getNewInstanceForRefresh(View view, String id) { 140 Component component = null; 141 Component origComponent = view.getViewIndex().getComponentById(id); 142 143 if (origComponent == null) { 144 throw new RuntimeException(id + " not found in view index try setting p:persistInSession=\"true\" in xml"); 145 } 146 147 if (view.getViewIndex().getInitialComponentStates().containsKey(origComponent.getFactoryId())) { 148 component = view.getViewIndex().getInitialComponentStates().get(origComponent.getFactoryId()); 149 } else { 150 component = (Component) KRADServiceLocatorWeb.getDataDictionaryService().getDictionaryObject( 151 origComponent.getFactoryId()); 152 } 153 154 if (component != null) { 155 component = ComponentUtils.copyObject(component); 156 component.setId(origComponent.getFactoryId()); 157 } 158 159 return component; 160 } 161 162 /** 163 * Returns a new <code>Component</code> instance for the given bean id from the spring factory 164 * 165 * @param beanId - id of the bean definition 166 * @return new component instance or null if no such component definition was found 167 */ 168 public static Component getNewComponentInstance(String beanId) { 169 Component component = (Component) KRADServiceLocatorWeb.getDataDictionaryService().getDictionaryObject(beanId); 170 171 // clear id before returning so duplicates do not occur 172 component.setId(null); 173 component.setFactoryId(null); 174 175 return component; 176 } 177 178 public static TextControl getTextControl() { 179 return (TextControl) getNewComponentInstance(TEXT_CONTROL); 180 } 181 182 public static TextAreaControl getTextAreaControl() { 183 return (TextAreaControl) getNewComponentInstance(TEXTAREA_CONTROL); 184 } 185 186 public static CheckboxControl getCheckboxControl() { 187 return (CheckboxControl) getNewComponentInstance(CHECKBOX_CONTROL); 188 } 189 190 public static HiddenControl getHiddenControl() { 191 return (HiddenControl) getNewComponentInstance(HIDDEN_CONTROL); 192 } 193 194 public static SelectControl getSelectControl() { 195 return (SelectControl) getNewComponentInstance(SELECT_CONTROL); 196 } 197 198 public static CheckboxGroupControl getCheckboxGroupControl() { 199 return (CheckboxGroupControl) getNewComponentInstance(CHECKBOX_GROUP_CONTROL); 200 } 201 202 public static CheckboxGroupControl getCheckboxGroupControlHorizontal() { 203 return (CheckboxGroupControl) getNewComponentInstance(CHECKBOX_GROUP_CONTROL_HORIZONTAL); 204 } 205 206 public static RadioGroupControl getRadioGroupControl() { 207 return (RadioGroupControl) getNewComponentInstance(RADIO_GROUP_CONTROL); 208 } 209 210 public static RadioGroupControl getRadioGroupControlHorizontal() { 211 return (RadioGroupControl) getNewComponentInstance(RADIO_GROUP_CONTROL_HORIZONTAL); 212 } 213 214 public static FileControl getFileControl() { 215 return (FileControl) getNewComponentInstance(FILE_CONTROL); 216 } 217 218 public static TextControl getDateControl() { 219 return (TextControl) getNewComponentInstance(DATE_CONTROL); 220 } 221 222 public static TextControl getUserControl() { 223 return (TextControl) getNewComponentInstance(USER_CONTROL); 224 } 225 226 public static TextControl getGroupControl() { 227 return (TextControl) getNewComponentInstance(GROUP_CONTROL); 228 } 229 230 public static DataField getDataField() { 231 return (DataField) getNewComponentInstance(DATA_FIELD); 232 } 233 234 public static DataField getDataField(String propertyName, String label) { 235 DataField field = (DataField) getNewComponentInstance(DATA_FIELD); 236 237 field.setPropertyName(propertyName); 238 field.setLabel(label); 239 240 return field; 241 } 242 243 public static InputField getInputField() { 244 return (InputField) getNewComponentInstance(INPUT_FIELD); 245 } 246 247 public static InputField getInputField(String propertyName, String label) { 248 InputField field = (InputField) getNewComponentInstance(INPUT_FIELD); 249 250 field.setPropertyName(propertyName); 251 field.setLabel(label); 252 253 return field; 254 } 255 256 public static InputField getInputField(String propertyName, String label, UifConstants.ControlType controlType) { 257 InputField field = (InputField) getNewComponentInstance(INPUT_FIELD); 258 259 field.setPropertyName(propertyName); 260 field.setLabel(label); 261 field.setControl(getControl(controlType)); 262 263 return field; 264 } 265 266 public static InputField getInputField(String propertyName, String label, UifConstants.ControlType controlType, 267 String defaultValue) { 268 InputField field = (InputField) getNewComponentInstance(INPUT_FIELD); 269 270 field.setPropertyName(propertyName); 271 field.setLabel(label); 272 field.setControl(getControl(controlType)); 273 field.setDefaultValue(defaultValue); 274 275 return field; 276 } 277 278 public static InputField getInputField(String propertyName, String label, UifConstants.ControlType controlType, 279 Class<? extends KeyValuesFinder> optionsFinderClass) { 280 InputField field = (InputField) getNewComponentInstance(INPUT_FIELD); 281 282 field.setPropertyName(propertyName); 283 field.setLabel(label); 284 field.setControl(getControl(controlType)); 285 field.setOptionsFinderClass(optionsFinderClass); 286 287 return field; 288 } 289 290 public static InputField getInputField(String propertyName, String label, UifConstants.ControlType controlType, 291 List<KeyValue> options) { 292 InputField field = (InputField) getNewComponentInstance(INPUT_FIELD); 293 294 field.setPropertyName(propertyName); 295 field.setLabel(label); 296 297 Control control = getControl(controlType); 298 if (control instanceof MultiValueControl) { 299 ((MultiValueControl) control).setOptions(options); 300 } else { 301 throw new RuntimeException("Control is not instance of multi-value control, cannot set options"); 302 } 303 304 return field; 305 } 306 307 public static InputField getInputField(String propertyName, String label, UifConstants.ControlType controlType, 308 int size, int maxLength, int minLength) { 309 InputField field = (InputField) getNewComponentInstance(INPUT_FIELD); 310 311 field.setPropertyName(propertyName); 312 field.setLabel(label); 313 314 Control control = getControl(controlType); 315 if (control instanceof SizedControl) { 316 ((SizedControl) control).setSize(size); 317 } else { 318 throw new RuntimeException("Control does not support the size property"); 319 } 320 321 field.setMaxLength(maxLength); 322 field.setMinLength(minLength); 323 324 return field; 325 } 326 327 /** 328 * Builds a new <code>InputField</code> from the properties set on the 329 * given <code>RemotableAttributeField</code> 330 * 331 * <p> 332 * Note the returned InputField will not be initialized yet. Its state will be that of the initial 333 * object returned from the UIF dictionary with the properties set from the remotable attribute field, thus it 334 * is really just a more configuration complete field 335 * </p> 336 * 337 * @return AttributeField instance built from remotable field 338 */ 339 public static InputField translateRemotableField(RemotableAttributeField remotableField) { 340 InputField inputField = getInputField(); 341 342 inputField.setPropertyName(remotableField.getName()); 343 inputField.setShortLabel(remotableField.getShortLabel()); 344 inputField.setLabel(remotableField.getLongLabel()); 345 inputField.setHelpSummary(remotableField.getHelpSummary()); 346 inputField.setHelpDescription(remotableField.getHelpDescription()); 347 inputField.setConstraintText(remotableField.getConstraintText()); 348 inputField.setPerformUppercase(remotableField.isForceUpperCase()); 349 inputField.setMinLength(remotableField.getMinLength()); 350 inputField.setMaxLength(remotableField.getMaxLength()); 351 352 // why are exclusive min and max strings? 353 if (remotableField.getMinValue() != null) { 354 inputField.setExclusiveMin(remotableField.getMinValue().toString()); 355 } 356 if (remotableField.getMaxValue() != null) { 357 inputField.setInclusiveMax(remotableField.getMaxValue().toString()); 358 } 359 inputField.setRequired(remotableField.isRequired()); 360 361 if ((remotableField.getDefaultValues() != null) && !remotableField.getDefaultValues().isEmpty()) { 362 inputField.setDefaultValue(remotableField.getDefaultValues().iterator().next()); 363 } 364 365 if (StringUtils.isNotBlank(remotableField.getRegexConstraint())) { 366 ValidCharactersConstraint constraint = new ValidCharactersConstraint(); 367 constraint.setValue(remotableField.getRegexConstraint()); 368 inputField.setValidCharactersConstraint(constraint); 369 // TODO: how to deal with remotable field regexContraintMsg? 370 } 371 372 RemotableDatepicker remotableDatepicker = null; 373 RemotableTextExpand remotableTextExpand = null; 374 RemotableQuickFinder remotableQuickFinder = null; 375 for (RemotableAbstractWidget remoteWidget : remotableField.getWidgets()) { 376 if (remoteWidget instanceof RemotableDatepicker) { 377 remotableDatepicker = (RemotableDatepicker) remoteWidget; 378 } else if (remoteWidget instanceof RemotableTextExpand) { 379 remotableTextExpand = (RemotableTextExpand) remoteWidget; 380 } else if (remoteWidget instanceof RemotableQuickFinder) { 381 remotableQuickFinder = (RemotableQuickFinder) remoteWidget; 382 } 383 } 384 385 if (remotableQuickFinder != null) { 386 inputField.getFieldLookup().setBaseLookupUrl(remotableQuickFinder.getBaseLookupUrl()); 387 inputField.getFieldLookup().setDataObjectClassName(remotableQuickFinder.getDataObjectClass()); 388 inputField.getFieldLookup().setLookupParameters(remotableQuickFinder.getLookupParameters()); 389 inputField.getFieldLookup().setFieldConversions(remotableQuickFinder.getFieldConversions()); 390 } 391 392 if (remotableField.getControl() != null) { 393 Control control = null; 394 395 RemotableControlContract remotableControl = remotableField.getControl(); 396 if (remotableControl instanceof RemotableHiddenInput) { 397 control = getHiddenControl(); 398 } else if (remotableControl instanceof RemotableRadioButtonGroup) { 399 RemotableRadioButtonGroup remotableRadioButtonGroup = (RemotableRadioButtonGroup) remotableControl; 400 control = getRadioGroupControl(); 401 ((RadioGroupControl) control).setOptions(buildKeyValuePairs(remotableRadioButtonGroup.getKeyLabels())); 402 } else if (remotableControl instanceof RemotableSelect) { 403 RemotableSelect remotableSelect = (RemotableSelect) remotableControl; 404 control = getSelectControl(); 405 406 Map<String, String> keyLabels = new HashMap<String, String>(); 407 if ((remotableSelect.getGroups() != null) && (!remotableSelect.getGroups().isEmpty())) { 408 for (RemotableSelectGroup remotableSelectGroup : remotableSelect.getGroups()) { 409 keyLabels.putAll(remotableSelectGroup.getKeyLabels()); 410 } 411 } else { 412 keyLabels = remotableSelect.getKeyLabels(); 413 } 414 415 ((SelectControl) control).setOptions(buildKeyValuePairs(keyLabels)); 416 if (remotableSelect.getSize() != null) { 417 ((SelectControl) control).setSize(remotableSelect.getSize()); 418 } 419 ((SelectControl) control).setMultiple(remotableSelect.isMultiple()); 420 } else if (remotableControl instanceof RemotableCheckboxGroup) { 421 RemotableCheckboxGroup remotableCheckboxGroup = (RemotableCheckboxGroup) remotableControl; 422 control = getCheckboxGroupControl(); 423 ((CheckboxGroupControl) control).setOptions(buildKeyValuePairs(remotableCheckboxGroup.getKeyLabels())); 424 } else if (remotableControl instanceof RemotableCheckbox) { 425 control = getCheckboxControl(); 426 } else if (remotableControl instanceof RemotableTextarea) { 427 RemotableTextarea remotableTextarea = (RemotableTextarea) remotableControl; 428 control = getTextAreaControl(); 429 430 if (remotableTextExpand != null) { 431 ((TextAreaControl) control).setTextExpand(true); 432 } 433 ((TextAreaControl) control).setRows(remotableTextarea.getRows()); 434 ((TextAreaControl) control).setCols(remotableTextarea.getCols()); 435 ((TextAreaControl) control).setWatermarkText(remotableTextarea.getWatermark()); 436 437 } else if (remotableControl instanceof RemotableTextInput) { 438 RemotableTextInput remotableTextInput = (RemotableTextInput) remotableControl; 439 440 if (remotableDatepicker != null) { 441 control = getDateControl(); 442 } else { 443 control = getTextControl(); 444 } 445 446 if (remotableTextExpand != null) { 447 ((TextAreaControl) control).setTextExpand(true); 448 } 449 ((TextControl) control).setSize(remotableTextInput.getSize()); 450 ((TextControl) control).setWatermarkText(remotableTextInput.getWatermark()); 451 } 452 453 inputField.setControl(control); 454 } 455 456 return inputField; 457 } 458 459 /** 460 * For each remotable field in the given list creates a new {@link org.kuali.rice.krad.uif.field.InputField} 461 * instance and sets the 462 * corresponding properties from the remotable instance 463 * 464 * @param remotableFields - list of remotable fields to translate 465 * @return List<AttributeField> list of attribute fields built from the remotable field properties 466 */ 467 public static List<InputField> translateRemotableFields(List<RemotableAttributeField> remotableFields) { 468 List<InputField> inputFields = new ArrayList<InputField>(); 469 470 for (RemotableAttributeField remotableField : remotableFields) { 471 inputFields.add(translateRemotableField(remotableField)); 472 } 473 474 return inputFields; 475 } 476 477 protected static List<KeyValue> buildKeyValuePairs(Map<String, String> optionsMap) { 478 List<KeyValue> options = new ArrayList<KeyValue>(); 479 480 for (Map.Entry<String, String> optionEntry : optionsMap.entrySet()) { 481 KeyValue keyValue = new ConcreteKeyValue(optionEntry.getKey(), optionEntry.getValue()); 482 options.add(keyValue); 483 } 484 485 return options; 486 } 487 488 protected static Control getControl(UifConstants.ControlType controlType) { 489 Control control = null; 490 switch (controlType) { 491 case CHECKBOX: 492 control = getCheckboxControl(); 493 case CHECKBOXGROUP: 494 control = getCheckboxGroupControl(); 495 case FILE: 496 control = getFileControl(); 497 case GROUP: 498 control = getGroupControl(); 499 case HIDDEN: 500 control = getHiddenControl(); 501 case RADIOGROUP: 502 control = getRadioGroupControl(); 503 case SELECT: 504 control = getSelectControl(); 505 case TEXTAREA: 506 control = getTextAreaControl(); 507 case TEXT: 508 control = getTextControl(); 509 case USER: 510 control = getUserControl(); 511 } 512 513 return control; 514 } 515 516 public static ErrorsField getErrorsField() { 517 return (ErrorsField) getNewComponentInstance(ERRORS_FIELD); 518 } 519 520 public static ActionField getActionField() { 521 return (ActionField) getNewComponentInstance(ACTION_FIELD); 522 } 523 524 public static ActionField getActionLinkField() { 525 return (ActionField) getNewComponentInstance(ACTION_LINK_FIELD); 526 } 527 528 public static LinkField getLinkField() { 529 return (LinkField) getNewComponentInstance(LINK_FIELD); 530 } 531 532 public static IframeField getIframeField() { 533 return (IframeField) getNewComponentInstance(IFRAME_FIELD); 534 } 535 536 public static ImageField getImageField() { 537 return (ImageField) getNewComponentInstance(IMAGE_FIELD); 538 } 539 540 public static BlankField getBlankField() { 541 return (BlankField) getNewComponentInstance(BLANK_FIELD); 542 } 543 544 public static GenericField getGenericField() { 545 return (GenericField) getNewComponentInstance(GENERIC_FIELD); 546 } 547 548 public static LabelField getLabelField() { 549 return (LabelField) getNewComponentInstance(LABEL_FIELD); 550 } 551 552 public static MessageField getMessageField() { 553 return (MessageField) getNewComponentInstance(MESSAGE_FIELD); 554 } 555 556 public static FieldGroup getFieldGroup() { 557 return (FieldGroup) getNewComponentInstance(FIELD_GROUP); 558 } 559 560 public static FieldGroup getHorizontalFieldGroup() { 561 return (FieldGroup) getNewComponentInstance(HORIZONTAL_FIELD_GROUP); 562 } 563 564 public static Group getGroup() { 565 return (Group) getNewComponentInstance(GROUP); 566 } 567 568 public static PageGroup getPageGroup() { 569 return (PageGroup) getNewComponentInstance(PAGE_GROUP); 570 } 571 572 public static Group getGroupGridLayout() { 573 return (Group) getNewComponentInstance(GROUP_GRID_LAYOUT); 574 } 575 576 public static Group getGroupBodyOnly() { 577 return (Group) getNewComponentInstance(GROUP_BODY_ONLY); 578 } 579 580 public static Group getGroupGridBodyOnly() { 581 return (Group) getNewComponentInstance(GROUP_GRID_BODY_ONLY); 582 } 583 584 public static TabGroup getTabGroup() { 585 return (TabGroup) getNewComponentInstance(TAB_GROUP); 586 } 587 588 public static NavigationGroup getNavigationGroup() { 589 return (NavigationGroup) getNewComponentInstance(NAVIGATION_GROUP); 590 } 591 592 public static TreeGroup getTreeGroup() { 593 return (TreeGroup) getNewComponentInstance(TREE_GROUP); 594 } 595 596 public static LinkGroup getLinkGroup() { 597 return (LinkGroup) getNewComponentInstance(LINK_GROUP); 598 } 599 600 public static CollectionGroup getCollectionGroup() { 601 return (CollectionGroup) getNewComponentInstance(COLLECTION_GROUP); 602 } 603 604 public static CollectionGroup getCollectionGroupTableLayout() { 605 return (CollectionGroup) getNewComponentInstance(COLLECTION_GROUP_TABLE_LAYOUT); 606 } 607 608 public static CollectionGroup getListGroup() { 609 return (CollectionGroup) getNewComponentInstance(LIST_GROUP); 610 } 611 612 public static HeaderField getHeader() { 613 return (HeaderField) getNewComponentInstance(HEADER); 614 } 615 616 public static Group getFooter() { 617 return (Group) getNewComponentInstance(FOOTER); 618 } 619 620 public static Group getFooterSaveCloseCancel() { 621 return (Group) getNewComponentInstance(FOOTER_SAVECLOSECANCEL); 622 } 623 624}