public class ComponentInfo extends Object
Though serializable, we can restore getPageDefinition()
correctly after deserialized.
Note:it is not thread-safe.
It is serializable.
Constructor and Description |
---|
ComponentInfo(NodeInfo parent,
ComponentDefinition compdef,
String tag)
Constructs the information about how to create component.
|
Modifier and Type | Method and Description |
---|---|
void |
addAnnotation(String propName,
String annotName,
Map<String,String[]> annotAttrs,
org.zkoss.util.resource.Location loc)
Adds an annotation to the specified property of this component
info.
|
void |
addEventHandler(String name,
ZScript zscript,
ConditionImpl cond)
Adds an event handler.
|
void |
addProperty(String name,
NativeInfo value,
ConditionImpl cond)
Adds a property initializer based on the native content.
|
void |
addProperty(String name,
String value,
ConditionImpl cond)
Adds a property initializer.
|
void |
addWidgetAttribute(String name,
String value,
ConditionImpl cond)
Adds a custom DOM attribute to the peer widget.
|
void |
addWidgetListener(String name,
String script,
ConditionImpl cond)
Adds an event listener for the peer widget.
|
void |
addWidgetOverride(String name,
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() |
Map<String,Object> |
evalProperties(Map<String,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.
|
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. |
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.
|
Set<String> |
getEventHandlerNames()
Returns a readonly collection of event names (String),
or an empty collection if no event name is registered.
|
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.
|
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.
|
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.
|
List<Property> |
getProperties()
Returns a readonly list of properties (
Property ) (never null). |
String |
getReplaceableText()
Returns the replaceable text, nor null if it cannot be replaced
with a text.
|
String |
getTag()
Returns the tag name, or null if no tag name.
|
String |
getTextAs()
Returns the property name to which the text enclosed within
the element (associated with this component definition) is assigned to.
|
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
setForEach(java.lang.String, java.lang.String, java.lang.String) is called). |
Class |
resolveImplementationClass(Page page)
Resolves and returns the class for the component represented
by this info (never null).
|
Class |
resolveImplementationClass(Page page,
Component parent)
Resolves and returns the class for the component represented
by this info (never null).
|
String |
resolveWidgetClass(Component comp)
Resolves the widget class, or null if the default is expected.
|
void |
setApply(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(String expr,
String begin,
String end)
Sets the forEach attribute, which is usually an expression.
|
void |
setForEach(String expr,
String begin,
String end,
String step)
Sets the forEach attribute, which is usually an expression.
|
void |
setForward(String forward)
Sets the forward condition that controls when to forward
an event receiving by this component to another component.
|
void |
setFulfill(String fulfill)
Sets the fulfill condition that controls when to create
the child components.
|
void |
setImplementation(String expr)
Sets the string that implements the component.
|
void |
setReplaceableText(String text)
Sets the replaceable text.
|
void |
setWidgetClass(String wgtcls)
Sets the widget class.
|
String |
toString() |
boolean |
withCondition()
Tests if the condition is set
|
boolean |
withForEach()
Returns whether the forEach condition is defined.
|
public ComponentInfo(NodeInfo parent, ComponentDefinition compdef, String tag)
parent
- the parent; never null.compdef
- the component definition; never nulltag
- the tag name; Note: if component implements
DynamicTag
, this argument must be specified.
If DynamicTag
is not implemented, this argument is optional.public LanguageDefinition getLanguageDefinition()
getComponentDefinition()
belongs to, or null if the component definition is temporary.public ComponentDefinition getComponentDefinition()
public void appendChild(NodeInfo child)
appendChild
in interface NodeInfo
IllegalStateException
- if this is not an instance of
NativeInfo
and the child is TextInfo
.public String getTag()
public String getTextAs()
Default: the same as ComponentDefinition.getTextAs()
.
ComponentDefinition.getTextAs()
,
isChildAllowedInTextAs()
public boolean isChildAllowedInTextAs()
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()
.
getTextAs()
public boolean isBlankPreserved()
Default: false.
public String getReplaceableText()
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.
PrologAllowed
public void setReplaceableText(String text)
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.PrologAllowed
public String getFulfill()
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.
public void setFulfill(String fulfill)
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.
fulfill
- the fulfill condition. There are several forms: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".
public Composer resolveComposer(Page page, Component comp)
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.getApply()
public String getApply()
Composer
class
names or EL expressions returning classes, class names or composer
instances, or null if no apply attribute.resolveComposer(org.zkoss.zk.ui.Page, org.zkoss.zk.ui.Component)
public void setApply(String apply)
Composer
class
or EL expressions returning classes, class names or composer instances.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).public String getForward()
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.
setForward(java.lang.String)
public void setForward(String forward)
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
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.public List<Property> getProperties()
Property
) (never null).public void addProperty(String name, String value, ConditionImpl cond)
name
- the member name. The component must have a valid setter
for it.value
- the value. It might contain expressions (${}).public void addProperty(String name, NativeInfo value, ConditionImpl cond)
NativeInfo
.value
- the property value represented by NativeInfo
.public void addEventHandler(String name, ZScript zscript, ConditionImpl cond)
name
- the event name.zscript
- the script.public Set<String> getEventHandlerNames()
To add an event handler, use addEventHandler(java.lang.String, org.zkoss.zk.ui.metainfo.ZScript, org.zkoss.zk.ui.util.ConditionImpl)
instead.
public void addWidgetListener(String name, String script, ConditionImpl cond)
public void addWidgetOverride(String name, String script, ConditionImpl cond)
$name
so can you access it for callback purpose.
<label w:setValue="function (value) {
this.$setValue(value); //old method
}"/>
script
- the client side script. EL expressions are allowed.addWidgetAttribute(java.lang.String, java.lang.String, org.zkoss.zk.ui.util.ConditionImpl)
public void addWidgetAttribute(String name, String value, ConditionImpl cond)
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.
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.addWidgetOverride(java.lang.String, java.lang.String, org.zkoss.zk.ui.util.ConditionImpl)
public void setWidgetClass(String wgtcls)
wgtcls
- the widget class (at the client side).
EL expressions are allowed.public String getWidgetClass()
public String resolveWidgetClass(Component comp)
You rarely need to invoke this method since it is called
automatically when applyProperties(org.zkoss.zk.ui.Component)
is called.
comp
- the component that the widget class represents at the client.public String getImplementation()
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.
public void setImplementation(String expr)
expr
- the class name, or an expression returning a class instance,
a class name, or a component instance.public Component newInstance(Page page, Component parent)
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)
.
public Component newInstance(Page page)
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)
.
public Class resolveImplementationClass(Page page, Component parent) throws ClassNotFoundException
Unlike getImplementation()
,
this method will resolve a class name (String) to a class (Class),
if necessary.
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.ClassNotFoundException
- if the class not foundpublic Class resolveImplementationClass(Page page) throws ClassNotFoundException
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)
.
ClassNotFoundException
public AnnotationMap getAnnotationMap()
public void applyProperties(Component comp)
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.AbstractComponent(boolean)
.
Note: the widget class (setWidgetClass(java.lang.String)
) is set by this method.
public Map<String,Object> evalProperties(Map<String,Object> propmap, Page owner, Component parent, boolean defIncluded)
ComponentDefinition
(and ComponentInfo
).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 nullparent
- 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)
.public void addAnnotation(String propName, String annotName, Map<String,String[]> annotAttrs, org.zkoss.util.resource.Location loc)
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.public ComponentInfo duplicate()
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.
Object.clone()
public boolean hasBindingAnnotation()
public void enableBindingAnnotation()
public void disableBindingAnnotation()
public ForEach resolveForEach(Page page, Component comp)
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.
page
- the page. It is used only if comp is null.comp
- the component.public void setForEach(String expr, String begin, String end)
expr
- the expression to return a collection of objects, or
null/empty to denote no iteration.public void setForEach(String expr, String begin, String end, String step)
expr
- the expression to return a collection of objects, or
null/empty to denote no iteration.public boolean withForEach()
public ConditionImpl getCondition()
public void setCondition(ConditionImpl cond)
public boolean withCondition()
public boolean removeChild(NodeInfo child)
NodeInfo
removeChild
in interface NodeInfo
public List<NodeInfo> getChildren()
NodeInfo
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.
getChildren
in interface NodeInfo
public boolean isEffective(Component comp)
Condition
isEffective
in interface Condition
comp
- used as the self variable. Ignored if null.public boolean isEffective(Page page)
Condition
isEffective
in interface Condition
page
- used as the self variable. Ignored if null.public EvaluatorRef getEvaluatorRef()
NodeInfo
getEvaluatorRef
in interface NodeInfo
public PageDefinition getPageDefinition()
NodeInfo
getPageDefinition
in interface NodeInfo
public Evaluator getEvaluator()
NodeInfo
All nodes in the same ZUML tree has the same evaluator reference
(inherited from the root node, PageDefinition.getEvaluatorRef()
).
getEvaluator
in interface NodeInfo
Copyright © 2017. All rights reserved.