Package org.zkoss.zk.ui.metainfo

## Class ComponentInfo

- java.lang.Object
- - org.zkoss.zk.ui.metainfo.ComponentInfo

- All Implemented Interfaces:
    `java.io.Serializable`, `NodeInfo`, `Condition`
  Direct Known Subclasses:
    `NativeInfo`

      public class ComponentInfo
      extends java.lang.Object

  Represents a component instance defined in a ZUML page.

  Though serializable, we can restore `NodeInfo.getPageDefinition()` correctly after deserialized.

  Note:it is not thread-safe.

  It is serializable.

  Author:
    tomyeh
  See Also:
    Serialized Form

- - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `ComponentInfo​(NodeInfo parent, ComponentDefinition compdef, java.lang.String tag)` | Constructs the information about how to create component.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `addAnnotation​(java.lang.String propName, java.lang.String annotName, java.util.Map<java.lang.String,​java.lang.String[]> annotAttrs, Location loc)` | Adds an annotation to the specified property of this component info.
    `void` | `addEventHandler​(java.lang.String name, ZScript zscript, ConditionImpl cond)` | Adds an event handler.
    `void` | `addProperty​(java.lang.String name, java.lang.String value, ConditionImpl cond)` | Adds a property initializer.
    `void` | `addProperty​(java.lang.String name, NativeInfo value, ConditionImpl cond)` | Adds a property initializer based on the native content.
    `void` | `addWidgetAttribute​(java.lang.String name, java.lang.String value, ConditionImpl cond)` | Adds a custom DOM attribute to the peer widget.
    `void` | `addWidgetListener​(java.lang.String name, java.lang.String script, ConditionImpl cond)` | Adds an event listener for the peer widget.
    `void` | `addWidgetOverride​(java.lang.String name, java.lang.String script, ConditionImpl cond)` | Adds a method or a value to the peer widget.
    `void` | `appendChild​(NodeInfo child)` | Adds a child.
    `void` | `applyProperties​(Component comp)` | Applies the event handlers and properties to the specified component.
    `void` | `disableBindingAnnotation()` |
    `ComponentInfo` | `duplicate()` | Duplicates the specified component info but retaining the same but virtual parent-child relationship.
    `void` | `enableBindingAnnotation()` |
    `java.util.Map<java.lang.String,​java.lang.Object>` | `evalProperties​(java.util.Map<java.lang.String,​java.lang.Object> propmap, Page owner, Component parent, boolean defIncluded)` | Evaluates and retrieves properties to the specified map from `ComponentDefinition` (and `ComponentInfo`).
    `AnnotationMap` | `getAnnotationMap()` | Returns the annotation map defined in this info, or null if no annotation is ever defined.
    `java.lang.String` | `getApply()` | Returns the apply attribute that is a list of `Composer` class names or EL expressions returning classes, class names or composer instances, or null if no apply attribute.
    `java.util.List<NodeInfo>` | `getChildren()` | Returns a readonly list of children.
    `ComponentDefinition` | `getComponentDefinition()` | Returns the component definition, or null if it is PageDefinition.
    `ConditionImpl` | `getCondition()` | Returns the effectiveness condition.
    `Evaluator` | `getEvaluator()` | Returns the evaluator.
    `EvaluatorRef` | `getEvaluatorRef()` | Returns the evaluator reference.
    `java.util.Set<java.lang.String>` | `getEventHandlerNames()` | Returns a readonly collection of event names (String), or an empty collection if no event name is registered.
    `java.lang.String` | `getForward()` | Returns the forward condition that controls how to forward an event, that is received by the component created by this info, to another component.
    `java.lang.String` | `getFulfill()` | Returns the fulfill condition that controls when to create the child components, or null if the child components are created at the time when the page is loaded.
    `java.lang.String` | `getImplementation()` | Returns the class name or an expression returning a class instance, a class name, or a component.
    `LanguageDefinition` | `getLanguageDefinition()` | Returns the language definition that `getComponentDefinition()` belongs to, or null if the component definition is temporary.
    `PageDefinition` | `getPageDefinition()` | Returns the page definition, i.e., the root node, or null if not available.
    `NodeInfo` | `getParent()` | Returns the parent, or null if it has no parent.
    `java.util.List<Property>` | `getProperties()` | Returns a readonly list of properties (`Property`) (never null).
    `java.lang.String` | `getReplaceableText()` | Returns the replaceable text, nor null if it cannot be replaced with a text.
    `java.lang.String` | `getTag()` | Returns the tag name, or null if no tag name.
    `java.lang.String` | `getTextAs()` | Returns the property name to which the text enclosed within the element (associated with this component definition) is assigned to.
    `java.lang.String` | `getWidgetClass()` | Returns the widget class (might contain EL expressions), or null if not available.
    `boolean` | `hasBindingAnnotation()` |
    `boolean` | `isBlankPreserved()` | Returns whether to preserve the blank text.
    `boolean` | `isChildAllowedInTextAs()` | Returns if a child is allowed in the text-as area.
    `boolean` | `isEffective​(Component comp)` | Used to evaluate whether it is effective.
    `boolean` | `isEffective​(Page page)` | Used to evaluate whether it is effective.
    `Component` | `newInstance​(Page page)` | Creates an component based on this info (never null).
    `Component` | `newInstance​(Page page, Component parent)` | Creates an component based on this info (never null).
    `boolean` | `removeChild​(NodeInfo child)` | Removes a child.
    `Composer` | `resolveComposer​(Page page, Component comp)` | Returns the composer for this info, or null if not available.
    `ForEach` | `resolveForEach​(Page page, Component comp)` | Returns the forEach object if the forEach attribute is defined (or `ForEachBranchInfo.setForEach(java.lang.String, java.lang.String, java.lang.String)` is called).
    `java.lang.Class` | `resolveImplementationClass​(Page page)` | Resolves and returns the class for the component represented by this info (never null).
    `java.lang.Class` | `resolveImplementationClass​(Page page, Component parent)` | Resolves and returns the class for the component represented by this info (never null).
    `java.lang.String` | `resolveWidgetClass​(Component comp)` | Resolves the widget class, or null if the default is expected.
    `void` | `setApply​(java.lang.String apply)` | Sets the apply attribute that is is a list of `Composer` class or EL expressions returning classes, class names or composer instances.
    `void` | `setCondition​(ConditionImpl cond)` | Sets the effectiveness condition.
    `void` | `setForEach​(java.lang.String expr, java.lang.String begin, java.lang.String end)` | Sets the forEach attribute, which is usually an expression.
    `void` | `setForEach​(java.lang.String expr, java.lang.String begin, java.lang.String end, java.lang.String step)` | Sets the forEach attribute, which is usually an expression.
    `void` | `setForward​(java.lang.String forward)` | Sets the forward condition that controls when to forward an event receiving by this component to another component.
    `void` | `setFulfill​(java.lang.String fulfill)` | Sets the fulfill condition that controls when to create the child components.
    `void` | `setImplementation​(java.lang.String expr)` | Sets the string that implements the component.
    `void` | `setReplaceableText​(java.lang.String text)` | Sets the replaceable text.
    `void` | `setWidgetClass​(java.lang.String wgtcls)` | Sets the widget class.
    `java.lang.String` | `toString()` |
    `boolean` | `withCondition()` | Tests if the condition is set
    `boolean` | `withForEach()` | Returns whether the forEach condition is defined.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Constructor Detail

    - #### ComponentInfo

          public ComponentInfo​(NodeInfo parent,
                               ComponentDefinition compdef,
                               java.lang.String tag)

      Constructs the information about how to create component.
      Parameters:
        `parent` - the parent; never null.
        `compdef` - the component definition; never null
        `tag` - the tag name; Note: if component implements `DynamicTag`, this argument must be specified. If `DynamicTag` is not implemented, this argument is optional.

  - ### Method Detail

    - #### getLanguageDefinition

          public LanguageDefinition getLanguageDefinition()

      Returns the language definition that `getComponentDefinition()` belongs to, or null if the component definition is temporary.

    - #### getComponentDefinition

          public ComponentDefinition getComponentDefinition()

      Returns the component definition, or null if it is PageDefinition.

    - #### appendChild

          public void appendChild​(NodeInfo child)

      Adds a child.
      Specified by:
        `appendChild` in interface `NodeInfo`
      Throws:
        `java.lang.IllegalStateException` - if this is not an instance of `NativeInfo` and the child is `TextInfo`.

    - #### getTag

          public java.lang.String getTag()

      Returns the tag name, or null if no tag name.
      Since:
        3.0.0

    - #### getTextAs

          public java.lang.String getTextAs()

      Returns the property name to which the text enclosed within the element (associated with this component definition) is assigned to.

      Default: the same as `ComponentDefinition.getTextAs()`.

      Since:
        3.0.0
      See Also:
        `ComponentDefinition.getTextAs()`, `isChildAllowedInTextAs()`

    - #### isChildAllowedInTextAs

          public boolean isChildAllowedInTextAs()

      Returns if a child is allowed in the text-as area. It is meaningful only if `getTextAs()` is not null. If true, the text enclosed within the element is considered as text only if there is no other XML element.

      For example, <div> in the following example won't be considered as text. Rather, a div component will be created.

          <a>
            <div>...</div>
          </a>

      Default: the same as `ComponentDefinition.isChildAllowedInTextAs()`.

      Since:
        6.0.0
      See Also:
        `getTextAs()`

    - #### isBlankPreserved

          public boolean isBlankPreserved()

      Returns whether to preserve the blank text. If false, the blank text (a non-empty string consisting of whitespaces) are ignored. If true, they are converted to a label child.

      Default: false.

      Since:
        3.5.0

    - #### getReplaceableText

          public java.lang.String getReplaceableText()

      Returns the replaceable text, nor null if it cannot be replaced with a text.

      By replaceable text we mean the component can be replaced by a text (a.k.a., string). ZK uses it to optimize the output by generating some content directly.

      The replaceable text must be a string consisting of whitespaces only.

      Since:
        3.5.0
      See Also:
        `PrologAllowed`

    - #### setReplaceableText

          public void setReplaceableText​(java.lang.String text)

      Sets the replaceable text.
      Parameters:
        `text` - the text that can be used to replace the component being generated by this info. If null, it means no way to replace it with text.
      Since:
        3.5.0
      See Also:
        `PrologAllowed`

    - #### getFulfill

          public java.lang.String getFulfill()

      Returns the fulfill condition that controls when to create the child components, or null if the child components are created at the time when the page is loaded.

      Default: null.

      There are several forms:
      "eventName", "targetId.evetName", "id1/id2.evetName", and "${elExpr}.eventName".

      Since 3.0.2, you can specify a list of fulfill conditions by separating them with comma. For example:
      "id1.event1, id2/id3.event2"

      If not null, the child components specified in `getChildren()` are created, when the event specified in the fulfill condition is received at the first time.

      It is the value specified in the fulfill attribute.

      Since:
        2.4.0

    - #### setFulfill

          public void setFulfill​(java.lang.String fulfill)

      Sets the fulfill condition that controls when to create the child components.

      If not null, the child components specified in `getChildren()` are created, when the event specified in the fulfill condition is received at the first time.

      Parameters:
        `fulfill` - the fulfill condition. There are several forms:
        "eventName", "targetId.evetName", "id1/id2.evetName", and "${elExpr}.eventName".

        Since 3.0.2, you can specify a list of fulfill conditions by separating them with comma. For example:
        "id1.event1, id2/id3.event2"

        Since 3.5.0, you can specify the URI to fulfill with. For example:
        "id1.event1=/my/super.zul".

      Since:
        2.4.0

    - #### resolveComposer

          public Composer resolveComposer​(Page page,
                                          Component comp)

      Returns the composer for this info, or null if not available.
      Parameters:
        `comp` - the component used as the self variable to resolve EL expressions, if any. Notice that UI engine uses the parent component for this argument. If comp is null, the page is used as the parent component. If comp is not null, it is used as the self variable.
      Since:
        3.5.0
      See Also:
        `getApply()`

    - #### getApply

          public java.lang.String getApply()

      Returns the apply attribute that is a list of `Composer` class names or EL expressions returning classes, class names or composer instances, or null if no apply attribute.
      Since:
        3.0.0
      See Also:
        `resolveComposer(org.zkoss.zk.ui.Page, org.zkoss.zk.ui.Component)`

    - #### setApply

          public void setApply​(java.lang.String apply)

      Sets the apply attribute that is is a list of `Composer` class or EL expressions returning classes, class names or composer instances.
      Parameters:
        `apply` - the attribute this is a list of `Composer` class or EL expressions El expressions are allowed, but self means the parent, if available; or page, if no parent at all. (Note: the component is not created yet when the apply attribute is evaluated).
      Since:
        3.0.0

    - #### getForward

          public java.lang.String getForward()

      Returns the forward condition that controls how to forward an event, that is received by the component created by this info, to another component.

      Default: null.

      If not null, when the component created by this info receives the event specified in the forward condition, it will forward it to the target component, which is also specified in the forward condition.

      Since:
        3.0.0
      See Also:
        `setForward(java.lang.String)`

    - #### setForward

          public void setForward​(java.lang.String forward)

      Sets the forward condition that controls when to forward an event receiving by this component to another component.

      The basic format:
      `onEvent1=id1/id2.onEvent2`

      It means when onEvent1 is received, onEvent2 will be posted to the component with the specified path (id1/id2).

      If onEvent1 is omitted, it is assumed to be onClick (and the equal sign need not to be specified. If the path is omitted, it is assumed to be the space owner `Component.getSpaceOwner()`.

      For example, "onOK" means "onClick=onOK".

      You can specify several forward conditions by separating them with comma as follows:

      `onChanging=onChanging,onChange=onUpdate,onOK`

      Parameters:
        `forward` - the forward condition. There are several forms: "onEvent1", "target.onEvent1" and "onEvent1(target.onEvent2)", where target could be "id", "id1/id2" or "${elExpr}". The EL expression must return either a path or a reference to a component.
      Since:
        3.0.0

    - #### getProperties

          public java.util.List<Property> getProperties()

      Returns a readonly list of properties (`Property`) (never null).
      Since:
        2.4.0

    - #### addProperty

          public void addProperty​(java.lang.String name,
                                  java.lang.String value,
                                  ConditionImpl cond)

      Adds a property initializer. It will initialize a component when created with this info.
      Parameters:
        `name` - the member name. The component must have a valid setter for it.
        `value` - the value. It might contain expressions (${}).

    - #### addProperty

          public void addProperty​(java.lang.String name,
                                  NativeInfo value,
                                  ConditionImpl cond)

      Adds a property initializer based on the native content. The native content is a XML fragment represented by `NativeInfo`.
      Parameters:
        `value` - the property value represented by `NativeInfo`.
      Since:
        3.5.0

    - #### addEventHandler

          public void addEventHandler​(java.lang.String name,
                                      ZScript zscript,
                                      ConditionImpl cond)

      Adds an event handler.
      Parameters:
        `name` - the event name.
        `zscript` - the script.

    - #### getEventHandlerNames

          public java.util.Set<java.lang.String> getEventHandlerNames()

      Returns a readonly collection of event names (String), or an empty collection if no event name is registered.

      To add an event handler, use `addEventHandler(java.lang.String, org.zkoss.zk.ui.metainfo.ZScript, org.zkoss.zk.ui.util.ConditionImpl)` instead.

      Since:
        3.0.2

    - #### addWidgetListener

          public void addWidgetListener​(java.lang.String name,
                                        java.lang.String script,
                                        ConditionImpl cond)

      Adds an event listener for the peer widget.
      Since:
        5.0.0

    - #### addWidgetOverride

          public void addWidgetOverride​(java.lang.String name,
                                        java.lang.String script,
                                        ConditionImpl cond)

      Adds a method or a value to the peer widget. If there was a method with the same name, it will be renamed to `$name` so can you access it for callback purpose.

          <label w:setValue="function (value) {
            this.$setValue(value); //old method
          }"/>

      Parameters:
        `script` - the client side script. EL expressions are allowed.
      Since:
        5.0.0
      See Also:
        `addWidgetAttribute(java.lang.String, java.lang.String, org.zkoss.zk.ui.util.ConditionImpl)`

    - #### addWidgetAttribute

          public void addWidgetAttribute​(java.lang.String name,
                                         java.lang.String value,
                                         ConditionImpl cond)

      Adds a custom DOM attribute to the peer widget.

      Unlike `addWidgetOverride(java.lang.String, java.lang.String, org.zkoss.zk.ui.util.ConditionImpl)`, the attributes added here are generated directly as DOM attributes at the client. In other words, it is not a property or method of the peer widget.

      Parameters:
        `name` - the name of the attribute. Unlike `addWidgetOverride(java.lang.String, java.lang.String, org.zkoss.zk.ui.util.ConditionImpl)`, the name might contain no alphanumeric characters, such as colon and dash.
      Since:
        5.0.3
      See Also:
        `addWidgetOverride(java.lang.String, java.lang.String, org.zkoss.zk.ui.util.ConditionImpl)`

    - #### setWidgetClass

          public void setWidgetClass​(java.lang.String wgtcls)

      Sets the widget class.
      Parameters:
        `wgtcls` - the widget class (at the client side). EL expressions are allowed.
      Since:
        5.0.2

    - #### getWidgetClass

          public java.lang.String getWidgetClass()

      Returns the widget class (might contain EL expressions), or null if not available.
      Since:
        5.0.2

    - #### resolveWidgetClass

          public java.lang.String resolveWidgetClass​(Component comp)

      Resolves the widget class, or null if the default is expected. It will evaluate EL expressions if any.

      You rarely need to invoke this method since it is called automatically when `applyProperties(org.zkoss.zk.ui.Component)` is called.

      Parameters:
        `comp` - the component that the widget class represents at the client.
      Since:
        5.0.2

    - #### getImplementation

          public java.lang.String getImplementation()

      Returns the class name or an expression returning a class instance, a class name, or a component. It is the same value that `setImplementation(java.lang.String)` was called. To resolve the real implementation class, use `resolveImplementationClass(org.zkoss.zk.ui.Page, org.zkoss.zk.ui.Component)`.

      Notice that, if a component is returned by the expression, it shall not be assigned to any page.

      Since:
        3.6.0

    - #### setImplementation

          public void setImplementation​(java.lang.String expr)

      Sets the string that implements the component.
      Parameters:
        `expr` - the class name, or an expression returning a class instance, a class name, or a component instance.
      Since:
        3.6.0

    - #### newInstance

          public Component newInstance​(Page page,
                                       Component parent)

      Creates an component based on this info (never null).

      Like `ComponentDefinition.newInstance(org.zkoss.zk.ui.Page, java.lang.String)`, this method doesn't invoke `applyProperties(org.zkoss.zk.ui.Component)`. It is caller's job to invoke them if necessary. Since the value of properties might depend on the component tree, it is better to assign the component with a proper parent before calling `applyProperties(org.zkoss.zk.ui.Component)`.

      Since:
        3.0.2

    - #### newInstance

          public Component newInstance​(Page page)

      Creates an component based on this info (never null). It is the same as newInstance(page, null).

      If the implementation class (`getImplementation()`) doesn't have any EL expression, or its EL expression doesn't have reference to the self variable, the result is the same.

      This method is preserved for backward compatibility. It is better to use `newInstance(Page, Component)`.

    - #### resolveImplementationClass

          public java.lang.Class resolveImplementationClass​(Page page,
                                                            Component parent)
                                                     throws java.lang.ClassNotFoundException

      Resolves and returns the class for the component represented by this info (never null).

      Unlike `getImplementation()`, this method will resolve a class name (String) to a class (Class), if necessary.

      Parameters:
        `page` - the page to check whether the class is defined in the page (such as interpreters). Ignored if null. This method will search the class loader of the current thread. If not found, it will search the interpreters of the specified page (`Page.getLoadedInterpreters()`). Note: this method won't attach the component to the specified page.
      Throws:
        `java.lang.ClassNotFoundException` - if the class not found
      Since:
        3.0.2

    - #### resolveImplementationClass

          public java.lang.Class resolveImplementationClass​(Page page)
                                                     throws java.lang.ClassNotFoundException

      Resolves and returns the class for the component represented by this info (never null). It is the same as resolveImplementationClass(page, null).

      If the implementation class (`getImplementation()`) doesn't have any EL expression, or its EL expression doesn't have reference to the self variable, the result is the same.

      This method is preserved for backward compatibility. It is better to use `resolveImplementationClass(Page, Component)`.

      Throws:
        `java.lang.ClassNotFoundException`
      Since:
        3.0.0

    - #### getAnnotationMap

          public AnnotationMap getAnnotationMap()

      Returns the annotation map defined in this info, or null if no annotation is ever defined.

    - #### applyProperties

          public void applyProperties​(Component comp)

      Applies the event handlers and properties to the specified component.

      It also invokes `ComponentDefinition.applyProperties(org.zkoss.zk.ui.Component)`.

      Note: custom attributes are not part of `ComponentInfo`, so they won't be applied here.

      Note: annotations are applied to the component when a component is created. So, this method doesn't and need not to copy them. See also `AbstractComponent(boolean)`.

      Note: the widget class (`setWidgetClass(java.lang.String)`) is set by this method.

      Since:
        3.0.0

    - #### evalProperties

          public java.util.Map<java.lang.String,​java.lang.Object> evalProperties​(java.util.Map<java.lang.String,​java.lang.Object> propmap,
                                                                                       Page owner,
                                                                                       Component parent,
                                                                                       boolean defIncluded)

      Evaluates and retrieves properties to the specified map from `ComponentDefinition` (and `ComponentInfo`).
      Parameters:
        `propmap` - the map to store the retrieved properties (String name, Object value). If null, a HashMap instance is created.
        `owner` - the owner page; used if parent is null
        `parent` - the parent component (may be null)
        `defIncluded` - whether to call `ComponentDefinition.evalProperties(java.util.Map<java.lang.String, java.lang.Object>, org.zkoss.zk.ui.Page, org.zkoss.zk.ui.Component)`.

    - #### addAnnotation

          public void addAnnotation​(java.lang.String propName,
                                    java.lang.String annotName,
                                    java.util.Map<java.lang.String,​java.lang.String[]> annotAttrs,
                                    Location loc)

      Adds an annotation to the specified property of this component info.
      Parameters:
        `propName` - the property name. If null, the annotation is associated with the whole component rather than a particular property.
        `annotName` - the annotation name (never null, nor empty).
        `annotAttrs` - a map of attributes, or null if no attribute at all. The attribute must be in a pair of strings (String name, String value), or (String name, String[] value).
        `loc` - the location information of the annotation in the document, or null if not available.
      Since:
        6.0.0

    - #### duplicate

          public ComponentInfo duplicate()

      Duplicates the specified component info but retaining the same but virtual parent-child relationship. It is designed to use with `ComposerExt.doBeforeCompose(org.zkoss.zk.ui.Page, org.zkoss.zk.ui.Component, org.zkoss.zk.ui.metainfo.ComponentInfo)` to override some properties of the default component info.

      Unlike `Object.clone()`, the parent-child relation is duplicated but it is 'virtual'. By virtual we mean all the children's parent doesn't reference to the duplicated info (the returned instance). Rather, they reference to the original info being duplicated.

      Since the parent-children relation of the returned info is 'virtual', you can not call `appendChild(org.zkoss.zk.ui.metainfo.NodeInfo)` or others to change it. If you need to change the parent-children relation, use `Object.clone()` instead, and then clone the required children.

      Notice, we actually copy the values to the returned info so any change to the original one doesn't affect the duplicated info.

      Since:
        3.0.8
      See Also:
        `Object.clone()`

    - #### toString

          public java.lang.String toString()

      Overrides:
        `toString` in class `java.lang.Object`

    - #### hasBindingAnnotation

          public boolean hasBindingAnnotation()

    - #### enableBindingAnnotation

          public void enableBindingAnnotation()

    - #### disableBindingAnnotation

          public void disableBindingAnnotation()

    - #### resolveForEach

          public ForEach resolveForEach​(Page page,
                                        Component comp)

      Returns the forEach object if the forEach attribute is defined (or `ForEachBranchInfo.setForEach(java.lang.String, java.lang.String, java.lang.String)` is called).

      If comp is not null, both pagedef and page are ignored. If comp is null, page must be specified.

      Parameters:
        `page` - the page. It is used only if comp is null.
        `comp` - the component.
      Returns:
        the forEach object to iterate this info multiple times, or null if this info shall be interpreted only once.

    - #### setForEach

          public void setForEach​(java.lang.String expr,
                                 java.lang.String begin,
                                 java.lang.String end)

      Sets the forEach attribute, which is usually an expression.
      Parameters:
        `expr` - the expression to return a collection of objects, or null/empty to denote no iteration.

    - #### setForEach

          public void setForEach​(java.lang.String expr,
                                 java.lang.String begin,
                                 java.lang.String end,
                                 java.lang.String step)

      Sets the forEach attribute, which is usually an expression.
      Parameters:
        `expr` - the expression to return a collection of objects, or null/empty to denote no iteration.
      Since:
        8.0.0

    - #### withForEach

          public boolean withForEach()

      Returns whether the forEach condition is defined.

    - #### getCondition

          public ConditionImpl getCondition()

      Returns the effectiveness condition.

    - #### setCondition

          public void setCondition​(ConditionImpl cond)

      Sets the effectiveness condition.

    - #### withCondition

          public boolean withCondition()

      Tests if the condition is set

    - #### removeChild

          public boolean removeChild​(NodeInfo child)

      Description copied from interface: `NodeInfo`
      Removes a child.
      Specified by:
        `removeChild` in interface `NodeInfo`

    - #### getChildren

          public java.util.List<NodeInfo> getChildren()

      Description copied from interface: `NodeInfo`
      Returns a readonly list of children.

      Note: the returned list is readonly. To modify, please use `NodeInfo.appendChild(org.zkoss.zk.ui.metainfo.NodeInfo)` and `NodeInfo.removeChild(org.zkoss.zk.ui.metainfo.NodeInfo)` instead.

      Specified by:
        `getChildren` in interface `NodeInfo`

    - #### isEffective

          public boolean isEffective​(Component comp)

      Description copied from interface: `Condition`
      Used to evaluate whether it is effective.
      Specified by:
        `isEffective` in interface `Condition`
      Parameters:
        `comp` - used as the self variable. Ignored if null.

    - #### isEffective

          public boolean isEffective​(Page page)

      Description copied from interface: `Condition`
      Used to evaluate whether it is effective.
      Specified by:
        `isEffective` in interface `Condition`
      Parameters:
        `page` - used as the self variable. Ignored if null.

    - #### getEvaluatorRef

          public EvaluatorRef getEvaluatorRef()

      Description copied from interface: `NodeInfo`
      Returns the evaluator reference.
      Specified by:
        `getEvaluatorRef` in interface `NodeInfo`

    - #### getPageDefinition

          public PageDefinition getPageDefinition()

      Description copied from interface: `NodeInfo`
      Returns the page definition, i.e., the root node, or null if not available.
      Specified by:
        `getPageDefinition` in interface `NodeInfo`

    - #### getEvaluator

          public Evaluator getEvaluator()

      Description copied from interface: `NodeInfo`
      Returns the evaluator.

      All nodes in the same ZUML tree has the same evaluator reference (inherited from the root node, `PageDefinition.getEvaluatorRef()`).

      Specified by:
        `getEvaluator` in interface `NodeInfo`

    - #### getParent

          public NodeInfo getParent()

      Description copied from interface: `NodeInfo`
      Returns the parent, or null if it has no parent.
      Specified by:
        `getParent` in interface `NodeInfo`