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.component; 17 18 import org.kuali.rice.krad.uif.modifier.ComponentModifier; 19 import org.kuali.rice.krad.uif.service.ViewHelperService; 20 import org.kuali.rice.krad.uif.view.View; 21 22 import java.io.Serializable; 23 import java.util.List; 24 import java.util.Map; 25 26 /** 27 * All classes of the UIF that are used as a rendering element implement the 28 * component interface. This interface defines basic properties and methods that 29 * all such classes much implement. All components within the framework have the 30 * following structure: 31 * <ul> 32 * <li>Dictionary Configuration/Composition</li> 33 * <li>Java Class (the Component implementation</li> 34 * <li>>JSP Template Renderer</li> 35 * </ul> 36 * 37 * There are three basic types of components: 38 * <ul> 39 * <li>Container Components: <code>View</code>, <code>Group</code></li> 40 * <li>Field Components: <code>Field</code></li> 41 * <li>Widget Components: <code>Widget</code></li> 42 * </ul> 43 * 44 * @author Kuali Rice Team (rice.collab@kuali.org) 45 * @see org.kuali.rice.krad.uif.container.Container 46 * @see org.kuali.rice.krad.uif.field.Field 47 * @see org.kuali.rice.krad.uif.widget.Widget 48 */ 49 public interface Component extends Configurable, Serializable, Ordered, ScriptEventSupport { 50 51 /** 52 * The unique id (within a given tree) for the component 53 * 54 * <p> 55 * The id will be used by renderers to set the HTML element id. This gives a 56 * way to find various elements for scripting. If the id is not given, a 57 * default will be generated by the framework 58 * </p> 59 * 60 * @return String id 61 */ 62 public String getId(); 63 64 /** 65 * Sets the unique id (within a given tree) for the component 66 * 67 * @param id - string to set as the component id 68 */ 69 public void setId(String id); 70 71 /** 72 * Holds the id for the component that can be used to request new instances of that component from the 73 * {@link org.kuali.rice.krad.uif.util.ComponentFactory} 74 * 75 * <p> 76 * During component refreshes the component is reinitialized and the lifecycle is performed again to 77 * reflect the component state based on the latest updates (data, other component state). Since the lifecycle 78 * is only performed on the component, a new instance with configured initial state needs to be retrieved. Some 79 * component instances, such as those that are nested or created in code, cannot be obtained from the spring 80 * factory. For those the initial state is captured during the perform initialize phase and the factory id 81 * generated for referencing retrieving that configuration during a refresh 82 * </p> 83 * 84 * @return String bean id for component 85 */ 86 public String getFactoryId(); 87 88 /** 89 * Sets the factory id that backs the component instance 90 * 91 * @param factoryId 92 */ 93 public void setFactoryId(String factoryId); 94 95 /** 96 * The name for the component type 97 * 98 * <p> 99 * This is used within the rendering layer to pass the component instance 100 * into the template. The component instance is exported under the name 101 * given by this method. 102 * </p> 103 * 104 * @return String type name 105 */ 106 public String getComponentTypeName(); 107 108 /** 109 * The path to the JSP file that should be called to render the component 110 * 111 * <p> 112 * The path should be relative to the web root. An attribute will be 113 * available to the component to use under the name given by the method 114 * <code>getComponentTypeName</code>. Based on the component type, 115 * additional attributes could be available for use. See the component 116 * documentation for more information on such attributes. 117 * </p> 118 * 119 * <p> 120 * e.g. '/krad/WEB-INF/jsp/tiles/component.jsp' 121 * </p> 122 * 123 * @return String representing the template path 124 */ 125 public String getTemplate(); 126 127 /** 128 * Setter for the components template 129 * 130 * @param template 131 */ 132 public void setTemplate(String template); 133 134 /** 135 * A title for the component. Depending on the component can be used in 136 * various ways. For example with a Container component the title is used to 137 * set the header text. For components like controls other other components 138 * that render an HTML element it is used to set the HTML title attribute 139 * 140 * @return String title for component 141 */ 142 public String getTitle(); 143 144 /** 145 * Setter for the components title 146 * 147 * @param title 148 */ 149 public void setTitle(String title); 150 151 /** 152 * Should be called to initialize the component 153 * 154 * <p> 155 * Where components can set defaults and setup other necessary state. The 156 * initialize method should only be called once per component lifecycle and 157 * is invoked within the initialize phase of the view lifecylce. 158 * </p> 159 * 160 * @param view - view instance in which the component belongs 161 * @param model - object instance containing the view data 162 * @see ViewHelperService#initializeComponent 163 */ 164 public void performInitialization(View view, Object model); 165 166 /** 167 * Called after the initialize phase to perform conditional logic based on 168 * the model data 169 * 170 * <p> 171 * Where components can perform conditional logic such as dynamically 172 * generating new fields or setting field state based on the given data 173 * </p> 174 * 175 * @param view - view instance to which the component belongs 176 * @param model - Top level object containing the data (could be the form or a 177 * top level business object, dto) 178 */ 179 public void performApplyModel(View view, Object model, Component parent); 180 181 /** 182 * The last phase before the view is rendered. Here final preparations can 183 * be made based on the updated view state 184 * 185 * @param view - view instance that should be finalized for rendering 186 * @param model - top level object containing the data 187 * @param parent - parent component 188 */ 189 public void performFinalize(View view, Object model, Component parent); 190 191 /** 192 * List of components that are contained within the component and should be sent through 193 * the lifecycle 194 * 195 * <p> 196 * Used by <code>ViewHelperService</code> for the various lifecycle 197 * callbacks 198 * </p> 199 * 200 * @return List<Component> child components 201 */ 202 public List<Component> getComponentsForLifecycle(); 203 204 /** 205 * List of components that are maintained by the component as prototypes for creating other component instances 206 * 207 * <p> 208 * Prototypes are held for configuring how a component should be created during the lifecycle. An example of this 209 * are the fields in a collection group that are created for each collection record. They only participate in the 210 * initialize phase. 211 * </p> 212 * 213 * @return List<Component> child component prototypes 214 */ 215 public List<Component> getComponentPrototypes(); 216 217 /** 218 * List of components that are contained within the List of <code>PropertyReplacer</code> in component 219 * 220 * <p> 221 * Used to get all the nested components in the property replacer's 222 * </p> 223 * 224 * @return List<Component> <code>PropertyReplacer</code> child components 225 */ 226 public List<Component> getPropertyReplacerComponents(); 227 228 /** 229 * <code>ComponentModifier</code> instances that should be invoked to 230 * initialize the component 231 * 232 * <p> 233 * These provide dynamic initialization behavior for the component and are 234 * configured through the components definition. Each initializer will get 235 * invoked by the initialize method. 236 * </p> 237 * 238 * @return List of component modifiers 239 * @see ViewHelperService#initializeComponent 240 */ 241 public List<ComponentModifier> getComponentModifiers(); 242 243 /** 244 * Setter for the components List of <code>ComponentModifier</code> 245 * instances 246 * 247 * @param componentModifiers 248 */ 249 public void setComponentModifiers(List<ComponentModifier> componentModifiers); 250 251 /** 252 * Indicates whether the component should be rendered in the UI 253 * 254 * <p> 255 * If set to false, the corresponding component template will not be invoked 256 * (therefore nothing will be rendered to the UI). 257 * </p> 258 * 259 * @return boolean true if the component should be rendered, false if it 260 * should not be 261 */ 262 public boolean isRender(); 263 264 /** 265 * Setter for the components render indicator 266 * 267 * @param render 268 */ 269 public void setRender(boolean render); 270 271 /** 272 * Indicates whether the component should be hidden in the UI 273 * 274 * <p> 275 * How the hidden data is maintained depends on the views persistence mode. 276 * If the mode is request, the corresponding data will be rendered to the UI 277 * but not visible. If the mode is session, the data will not be rendered to 278 * the UI but maintained server side. 279 * </p> 280 * 281 * <p> 282 * For a <code>Container</code> component, the hidden setting will apply to 283 * all contained components (making a section hidden makes all fields within 284 * the section hidden) 285 * </p> 286 * 287 * @return boolean true if the component should be hidden, false if it 288 * should be visible 289 */ 290 public boolean isHidden(); 291 292 /** 293 * Setter for the hidden indicator 294 * 295 * @param hidden 296 */ 297 public void setHidden(boolean hidden); 298 299 /** 300 * Indicates whether the component can be edited 301 * 302 * <p> 303 * When readOnly the controls and widgets of <code>Field</code> components 304 * will not be rendered. If the Field has an underlying value it will be 305 * displayed readOnly to the user. 306 * </p> 307 * 308 * <p> 309 * For a <code>Container</code> component, the readOnly setting will apply 310 * to all contained components (making a section readOnly makes all fields 311 * within the section readOnly) 312 * </p> 313 * </p> 314 * 315 * @return boolean true if the component should be readOnly, false if is 316 * allows editing 317 */ 318 public boolean isReadOnly(); 319 320 /** 321 * Setter for the read only indicator 322 * 323 * @param readOnly 324 */ 325 public void setReadOnly(boolean readOnly); 326 327 /** 328 * Indicates whether the component is required 329 * 330 * <p> 331 * At the general component level required means there is some action the 332 * user needs to take within the component. For example, within a section it 333 * might mean the fields within the section should be completed. At a field 334 * level, it means the field should be completed. This provides the ability 335 * for the renderers to indicate the required action. 336 * </p> 337 * 338 * @return boolean true if the component is required, false if it is not 339 * required 340 */ 341 public Boolean getRequired(); 342 343 /** 344 * Setter for the required indicator 345 * 346 * @param required 347 */ 348 public void setRequired(Boolean required); 349 350 /** 351 * CSS style string to be applied to the component 352 * 353 * <p> 354 * Any style override or additions can be specified with this attribute. 355 * This is used by the renderer to set the style attribute on the 356 * corresponding element. 357 * </p> 358 * 359 * <p> 360 * e.g. 'color: #000000;text-decoration: underline;' 361 * </p> 362 * 363 * @return String css style string 364 */ 365 public String getStyle(); 366 367 /** 368 * Setter for the components style 369 * 370 * @param style 371 */ 372 public void setStyle(String style); 373 374 /** 375 * CSS style class(s) to be applied to the component 376 * 377 * <p> 378 * Declares style classes for the component. Multiple classes are specified 379 * with a space delimiter. This is used by the renderer to set the class 380 * attribute on the corresponding element. The class(s) declared must be 381 * available in the common style sheets or the style sheets specified for 382 * the view 383 * </p> 384 * 385 * <p> 386 * e.g. 'header left' 387 * </p> 388 * 389 * @return List<String> css style classes to apply 390 */ 391 public List<String> getStyleClasses(); 392 393 /** 394 * Setter for the components style classes 395 * 396 * @param styleClass 397 */ 398 public void setStyleClasses(List<String> styleClasses); 399 400 /** 401 * Adds a single style to the list of styles on this component 402 * 403 * @param style 404 */ 405 public void addStyleClass(String styleClass); 406 407 /** 408 * TODO: javadoc 409 * 410 * @param itemStyle 411 */ 412 public void appendToStyle(String itemStyle); 413 414 /** 415 * Number of places the component should take up horizontally in the 416 * container 417 * 418 * <p> 419 * All components belong to a <code>Container</code> and are placed using a 420 * <code>LayoutManager</code>. This property specifies how many places 421 * horizontally the component should take up within the container. This is 422 * only applicable for table based layout managers. Default is 1 423 * </p> 424 * 425 * TODO: this should not be on component interface since it only applies if 426 * the layout manager supports it, need some sort of layoutOptions map for 427 * field level options that depend on the manager 428 * 429 * @return int number of columns to span 430 */ 431 public int getColSpan(); 432 433 /** 434 * Setter for the components column span 435 * 436 * @param colSpan 437 */ 438 public void setColSpan(int colSpan); 439 440 /** 441 * Number of places the component should take up vertically in the container 442 * 443 * <p> 444 * All components belong to a <code>Container</code> and are placed using a 445 * <code>LayoutManager</code>. This property specifies how many places 446 * vertically the component should take up within the container. This is 447 * only applicable for table based layout managers. Default is 1 448 * </p> 449 * 450 * TODO: this should not be on component interface since it only applies if 451 * the layout manager supports it, need some sort of layoutOptions map for 452 * field level options that depend on the manager 453 * 454 * @return int number of rows to span 455 */ 456 public int getRowSpan(); 457 458 /** 459 * Setter for the component row span 460 * 461 * @param rowSpan 462 */ 463 public void setRowSpan(int rowSpan); 464 465 /** 466 * Context map for the component 467 * 468 * <p> 469 * Any el statements configured for the components properties (e.g. 470 * title="@{foo.property}") are evaluated using the el context map. This map 471 * will get populated with default objects like the model, view, and request 472 * from the <code>ViewHelperService</code>. Other components can push 473 * further objects into the context so that they are available for use with 474 * that component. For example, <code>Field</code> instances that are part 475 * of a collection line as receive the current line instance 476 * </p> 477 * 478 * <p> 479 * Context map also provides objects to methods that are invoked for 480 * <code>GeneratedField</code> instances 481 * </p> 482 * 483 * <p> 484 * The Map key gives the name of the variable that can be used within 485 * expressions, and the Map value gives the object instance for which 486 * expressions containing the variable should evaluate against 487 * </p> 488 * 489 * <p> 490 * NOTE: Calling getContext().putAll() will skip updating any configured property replacers for the 491 * component. Instead you should call #pushAllToContext 492 * </p> 493 * 494 * @return Map<String, Object> context 495 */ 496 public Map<String, Object> getContext(); 497 498 /** 499 * Setter for the context Map 500 * 501 * @param context 502 */ 503 public void setContext(Map<String, Object> context); 504 505 /** 506 * Places the given object into the context Map for the component with the 507 * given name 508 * 509 * <p> 510 * Note this also will push context to property replacers configured on the component. 511 * To place multiple objects in the context, you should use #pushAllToContext since that 512 * will call this method for each and update property replacers. Using #getContext().putAll() 513 * will bypass property replacers. 514 * </p> 515 * 516 * @param objectName - name the object should be exposed under in the context map 517 * @param object - object instance to place into context 518 */ 519 public void pushObjectToContext(String objectName, Object object); 520 521 /** 522 * Places each entry of the given Map into the context for the component 523 * 524 * <p> 525 * Note this will call #pushObjectToContext for each entry which will update any configured property 526 * replacers as well. This should be used in place of getContext().putAll() 527 * </p> 528 * 529 * @param objects - Map<String, Object> objects to add to context, where the entry key will be the context key 530 * and the entry value will be the context value 531 */ 532 public void pushAllToContext(Map<String, Object> objects); 533 534 /** 535 * List of <code>PropertyReplacer</code> instances that will be evaluated 536 * during the view lifecycle to conditionally set properties on the 537 * <code>Component</code> based on expression evaluations 538 * 539 * @return List<PropertyReplacer> replacers to evaluate 540 */ 541 public List<PropertyReplacer> getPropertyReplacers(); 542 543 /** 544 * Setter for the components property substitutions 545 * 546 * @param propertyReplacers 547 */ 548 public void setPropertyReplacers(List<PropertyReplacer> propertyReplacers); 549 550 /** 551 * Options that are passed through to the Component renderer. The Map key is 552 * the option name, with the Map value as the option value. See 553 * documentation on the particular widget render for available options. 554 * 555 * @return Map<String, String> options 556 */ 557 public Map<String, String> getComponentOptions(); 558 559 /** 560 * Setter for the widget's options 561 * 562 * @param widgetOptions 563 */ 564 public void setComponentOptions(Map<String, String> componentOptions); 565 566 /** 567 * Options that are passed through to the Component renderer. See 568 * documentation on the particular widget render for available options. 569 * 570 * @return String options 571 */ 572 public String getComponentOptionsJSString(); 573 574 /** 575 * Setter for the widget's options 576 * 577 * @param widgetOptions 578 */ 579 public void setComponentOptionsJSString(String componentOptions); 580 581 /** 582 * Can be used to order a component within a List of other components, lower 583 * numbers are placed higher up in the list, while higher numbers are placed 584 * lower in the list 585 * 586 * @return int ordering number 587 * @see org.springframework.core.Ordered#getOrder() 588 */ 589 public int getOrder(); 590 591 /** 592 * Setter for the component's order 593 * 594 * @param order 595 */ 596 public void setOrder(int order); 597 598 /** 599 * Name of the method that should be invoked for finalizing the component 600 * configuration (full method name, without parameters or return type) 601 * 602 * <p> 603 * Note the method can also be set with the finalizeMethodInvoker 604 * targetMethod property. If the method is on the configured 605 * <code>ViewHelperService</code>, only this property needs to be configured 606 * </p> 607 * 608 * <p> 609 * The model backing the view will be passed as the first argument method and then 610 * the <code>Component</code> instance as the second argument. If any additional method 611 * arguments are declared with the finalizeMethodAdditionalArguments, they will then 612 * be passed in the order declared in the list 613 * </p> 614 * 615 * <p> 616 * If the component is selfRendered, the finalize method can return a string which 617 * will be set as the component's renderOutput. The selfRendered indicator will also 618 * be set to true on the component. 619 * </p> 620 * 621 * @return String method name 622 */ 623 public String getFinalizeMethodToCall(); 624 625 /** 626 * List of Object instances that should be passed as arguments to the finalize method 627 * 628 * <p> 629 * These arguments are passed to the finalize method after the standard model and component 630 * arguments. They are passed in the order declared in the list 631 * </p> 632 * 633 * @return List<Object> additional method arguments 634 */ 635 public List<Object> getFinalizeMethodAdditionalArguments(); 636 637 /** 638 * <code>MethodInvokerConfig</code> instance for the method that should be invoked 639 * for finalizing the component configuration 640 * 641 * <p> 642 * MethodInvoker can be configured to specify the class or object the method 643 * should be called on. For static method invocations, the targetClass 644 * property can be configured. For object invocations, that targetObject 645 * property can be configured 646 * </p> 647 * 648 * <p> 649 * If the component is selfRendered, the finalize method can return a string which 650 * will be set as the component's renderOutput. The selfRendered indicator will also 651 * be set to true on the component. 652 * </p> 653 * 654 * @return MethodInvokerConfig instance 655 */ 656 public MethodInvokerConfig getFinalizeMethodInvoker(); 657 658 /** 659 * Indicates whether the component contains its own render output (through 660 * the renderOutput property) 661 * 662 * <p> 663 * If self rendered is true, the corresponding template for the component 664 * will not be invoked and the renderOutput String will be written to the 665 * response as is. 666 * </p> 667 * 668 * @return boolean true if component is self rendered, false if not (renders 669 * through template) 670 */ 671 public boolean isSelfRendered(); 672 673 /** 674 * Setter for the self render indicator 675 * 676 * @param selfRendered 677 */ 678 public void setSelfRendered(boolean selfRendered); 679 680 /** 681 * Rendering output for the component that will be sent as part of the 682 * response (can contain static text and HTML) 683 * 684 * @return String render output 685 */ 686 public String getRenderOutput(); 687 688 /** 689 * Setter for the component's render output 690 * 691 * @param renderOutput 692 */ 693 public void setRenderOutput(String renderOutput); 694 695 /** 696 * Indicates whether the component should be stored with the session view regardless of configuration 697 * 698 * <p> 699 * By default the framework nulls out any components that do not have a refresh condition or are needed for 700 * collection processing. This can be a problem if custom application code is written to refresh a component 701 * without setting the corresponding component flag. In this case this property can be set to true to force the 702 * framework to keep the component in session. Defaults to false 703 * </p> 704 * 705 * @return boolean true if the component should be stored in session, false if not 706 */ 707 public boolean isPersistInSession(); 708 709 /** 710 * Setter for the indicator to force persistence of the component in session 711 * 712 * @param persistInSession 713 */ 714 public void setPersistInSession(boolean persistInSession); 715 716 /** 717 * Security object that indicates what authorization (permissions) exist for the component 718 * 719 * @return ComponentSecurity instance 720 */ 721 public ComponentSecurity getComponentSecurity(); 722 723 /** 724 * Setter for the components security object 725 * 726 * @param componentSecurity 727 */ 728 public void setComponentSecurity(ComponentSecurity componentSecurity); 729 730 /** 731 * @return the progressiveRender 732 */ 733 public String getProgressiveRender(); 734 735 /** 736 * @param progressiveRender the progressiveRender to set 737 */ 738 public void setProgressiveRender(String progressiveRender); 739 740 /** 741 * @return the conditionalRefresh 742 */ 743 public String getConditionalRefresh(); 744 745 /** 746 * @param conditionalRefresh the conditionalRefresh to set 747 */ 748 public void setConditionalRefresh(String conditionalRefresh); 749 750 /** 751 * @return the progressiveDisclosureControlNames 752 */ 753 public List<String> getProgressiveDisclosureControlNames(); 754 755 /** 756 * @return the progressiveDisclosureConditionJs 757 */ 758 public String getProgressiveDisclosureConditionJs(); 759 760 /** 761 * @return the conditionalRefreshConditionJs 762 */ 763 public String getConditionalRefreshConditionJs(); 764 765 /** 766 * @return the conditionalRefreshControlNames 767 */ 768 public List<String> getConditionalRefreshControlNames(); 769 770 /** 771 * @return the progressiveRenderViaAJAX 772 */ 773 public boolean isProgressiveRenderViaAJAX(); 774 775 /** 776 * @param progressiveRenderViaAJAX the progressiveRenderViaAJAX to set 777 */ 778 public void setProgressiveRenderViaAJAX(boolean progressiveRenderViaAJAX); 779 780 /** 781 * If true, when the progressiveRender condition is satisfied, the component 782 * will always be retrieved from the server and shown(as opposed to being 783 * stored on the client, but hidden, after the first retrieval as is the 784 * case with the progressiveRenderViaAJAX option). <b>By default, this is 785 * false, so components with progressive render capabilities will always be 786 * already within the client html and toggled to be hidden or visible.</b> 787 * 788 * @return the progressiveRenderAndRefresh 789 */ 790 public boolean isProgressiveRenderAndRefresh(); 791 792 /** 793 * @param progressiveRenderAndRefresh the progressiveRenderAndRefresh to set 794 */ 795 public void setProgressiveRenderAndRefresh(boolean progressiveRenderAndRefresh); 796 797 /** 798 * Specifies a property by name that when it value changes will 799 * automatically perform a refresh on this component. This can be a comma 800 * separated list of multiple properties that require this component to be 801 * refreshed when any of them change. <Br>DO NOT use with progressiveRender 802 * unless it is know that progressiveRender condition will always be 803 * satisfied before one of these fields can be changed. 804 * 805 * @return the refreshWhenChanged 806 */ 807 public String getRefreshWhenChanged(); 808 809 /** 810 * @param refreshWhenChanged the refreshWhenChanged to set 811 */ 812 public void setRefreshWhenChanged(String refreshWhenChanged); 813 814 /** 815 * Indicates the component can be refreshed by an action 816 * 817 * <p> 818 * This is set by the framework for configured ajax action buttons, should not be set in 819 * configuration 820 * </p> 821 * 822 * @return boolean true if the component is refreshed by an action, false if not 823 */ 824 public boolean isRefreshedByAction(); 825 826 /** 827 * Setter for the refresjed by action indicator 828 * 829 * <p> 830 * This is set by the framework for configured ajax action buttons, should not be set in 831 * configuration 832 * </p> 833 * 834 * @param refreshedByAction 835 */ 836 public void setRefreshedByAction(boolean refreshedByAction); 837 838 /** 839 * Indicates whether data contained within the component should be reset (set to default) when the 840 * component is refreshed 841 * 842 * @return boolean true if data should be refreshed, false if data should remain as is 843 */ 844 public boolean isResetDataOnRefresh(); 845 846 /** 847 * Setter for the reset data on refresh indicator 848 * 849 * @param resetDataOnRefresh 850 */ 851 public void setResetDataOnRefresh(boolean resetDataOnRefresh); 852 853 /** 854 * Result of the conditionalRefresh expression, true if satisfied, otherwise false. 855 * Note: not currently used for any processing, required by the expression evaluator. 856 * 857 * @return the refresh 858 */ 859 public boolean isRefresh(); 860 861 /** 862 * @param refresh the refresh to set 863 */ 864 public void setRefresh(boolean refresh); 865 866 /** 867 * Control names which will refresh this component when they are changed, added 868 * internally 869 * 870 * @return the refreshWhenChangedControlNames 871 */ 872 public List<String> getRefreshWhenChangedControlNames(); 873 874 }