Table of Contents | Prev | Next | Bottom |
Quick Table of Contents |
---|
9 XForms User Interface 9.1 group 9.2 switch 9.3 repeat 9.3.1 Repeat Processing 9.3.2 Nested Repeats 9.3.3 User Interface Interaction |
This chapter covers XForms features for combining form controls into user interfaces.
All form controls defined in 8 Form Controls are treated as individual units for purposes of visual layout e.g., in XHTML processing. Aggregation of form controls with markup defined in this chapter provides semantics about the relationship among user interface controls; such knowledge can be useful in delivering a coherent UI to small devices. For example, if the user interface needs to be split up over several screens, controls appearing inside the same aggregation would typically be rendered on the same screen or page.
The group
element is used as a container for defining a
hierarchy of form controls. Groups can be nested to create complex
hierarchies.
group
><group (single node binding attributes) (common attributes) > <!-- caption?, ##all --> </group>
(single node binding attributes) - Selection of instance data node, defined in 8.12.2 Single Node Binding Attributes
(common attributes) - defined in 8.12.1 Common Attributes
<group ref="address"> <caption>Shipping Address</caption> <input ref="line_1"> <caption>Address line 1</caption> </input> <input ref="line_2"> <caption>Address line 2</caption> </input> <input ref="postcode"> <caption>Postcode</caption> </input> </group>
The hierarchy defined by nested group elements is used to determine the
traversal order specified by attribute navIndex
on form controls.
Setting the input focus on a group results in the focus being set to the first
form control in the tabbing order within that group.
The XForms model allows the authoring of dynamic user
interfaces that vary based on the current state of the instance data being
populated—see model item property relevant
6.1.4 relevant. As an example, portions of a
questionnaire pertaining to the user's automobile may become
relevant only if the user has answered in the affirmative to the
question 'Do you own a car?'. Another example is when the underlying XForms
model contains conditional structures.
This section defines construct switch
that allows
the creation of user interfaces where the user interface can be varied based on
user actions and events. Element switch
contains one or more
case
elements. Markup contained within element case
specifies
the user interface that is displayed when that case
is
selected. Boolean attribute selected
of element
case
determines the selected state and can be manipulated
programmatically via the DOM, or declaratively via XForms action
toggle
. Attribute id
of case
is used within action toggle
for this
purpose. The following example demonstrates the use of switch
.
<switch id="sw"> <case id="in" selected="true"> <input ref="yourname"> <caption>Please tell me your name</caption> <action ev:event="activate"> <toggle case="out"/> </action> </input> </case> <case id="out" selected="false"> <html:p>Hello <output ref="yourname" />. <button id="editButton"> <caption>Edit</caption> <action id="editAction" ev:event="activate"> <toggle case="in"/> </action> </button> </html:p> </case> </switch>
The above results in the portion of the user interface contained in the
first case
being displayed initially. This prompts for the user's name; filling in
a value and activating the control e.g., by pressing return
results in XForms event activate
. Event activate
is handled by the attached handler—element action
. This
handler uses XForms action toggle
to select the case
with id="out"
. This sets attribute selected
on case
id="out"
to true
. The markup contained in the selected case
displays the name the user entered along with an edit
button. Activating the edit button in turn results in the attached
handler selecting case
id="in"
.
switch
><switch (common attributes) > <!-- case+ --> </switch>
(common attributes) - defined in 8.12.1 Common Attributes
case
><case selected = xsd:boolean > <!-- ##any --> </case>
selected = xsd:boolean - optional selection status for the case.
If multiple case
s within a switch
are marked as selected="true"
, the first selected case
remains and all others are
deselected. If none are selected, the first becomes selected.
The XForms Model allows the definition of repeating structures such as
multiple items within a purchase order. When defining the XForms Model, such
higher-level collections are constructed out of basic building blocks;
similarly, this section defines user interface construct repeat
that
can bind to data structures such as lists and collections. Element
repeat
encapsulates a UI mapping over a homogeneous collection, in
other words, a collection consisting of data items having the same type and
structure.
<repeat nodeset="/cart/items/item"> <input ref="." .../><html:br/> </repeat>
Element repeat
operates over a homogeneous
collection by binding the encapsulated user interface controls to
each element of the collection. Attributes on element repeat
specify
how many members of the collection are presented to the user at any given time.
XForms actions insert
, delete
and setRepeatCursor
can be used to operate on the collection—see 10 XForms Actions.
Another way to view repeat processing (disregarding special user interface
interactions) is to consider "unrolling" the repeat. The above
example is similar to the following (assuming four item elements in the
returned node-set):
<!-- unrolled repeat --> <input ref="/cart/items/item[1]" .../><html:br/> <input ref="/cart/items/item[2]" .../><html:br/> <input ref="/cart/items/item[3]" .../><html:br/> <input ref="/cart/items/item[4]" .../><html:br/>
Notice that the model for the collection being populated would typically
have defined attributes minOccurs
and maxOccurs
; these
values may in turn determine if the user agent displays appropriate UI controls
for the user to add or delete entries in the collection.
<model> <instance> <my:lines> <my:line name="a"> <my:price>3.00</my:price> </my:line> <my:line name="b"> <my:price>32.25</my:price> </my:line> <my:line name="c"> <my:price>132.99</my:price> </my:line> </my:lines> </instance> </model> ... <repeat id="lineset" nodeset="my:lines/my:line"> <input ref="my:price"> <caption>Line Item</caption> </input> <input ref="@name"> <caption>Name</caption> </input> </repeat> <button> <caption>Insert a new item after the current one</caption> <action ev:event="activate"> <insert nodeset="my:lines/my:line" at="cursor('lineset')" position="after"/> <setValue ref="my:lines/my:line[cursor('lineset')]/@name"/> <setValue ref="my:lines/my:line[cursor('lineset')]/price">0.00</setValue> </action> </button> <button> <caption>remove current item</caption> <delete ev:event="activate" nodeset="my:lines/my:line" at="cursor('lineset')"/> </button>
repeat
><repeat (node-set binding attributes) (common attributes) startIndex = xsd:positiveInteger : 1 number = xsd:nonNegativeInteger > <!-- ##any --> </repeat>
(nodeset binding attributes) - Selection of context node-set, defined in 8.12.3 Nodeset Binding Attributes
(common attributes) - defined in 8.12.1 Common Attributes
startIndex - 1-based hint to the XForms Processor as to which starting element from the collection to display.
number - hint to the XForms Processor as to how many elements from the collection to display.
The markup contained within the body of element
repeat
specifies the user interface to be generated for each member of
the underlying collection. During user interface initialization (see
4.2.4 xforms:UIInitialize), the following steps are performed for
repeat
:
Attribute nodeset
is evaluated to locate the
homogeneous collection to be operated on by this repeat
.
The corresponding nodes in element instance
in the
source document are located—these nodes provide initial values and also
serve as a prototypical instance for constructing members of the
repeating collection.
The cursor for this repeating structure is initialized to point at the head of the collection.
The user interface template specified within element
repeat
is bound to this prototypical instance. If there
is a type mismatch between the prototypical instance and the binding
restrictions for the user interface controls, an error is signaled and
processing stops.
User interface as specified by the repeat
is generated
for the requisite number of members of the collection as specified by
attributes on element repeat
, and model item constraints minOccurs
and maxOccurs
.
The user interface markup for repeating structures adds encapsulation
metadata about the collection being populated. The processing model for
repeating structures uses a cursor that points to the
current item in the data instance. This repeat cursor is accessed
via XForms extension functions cursor
7.4.2.5 cursor() and manipulated via XForms action
setRepeatCursor
10.10 setRepeatCursor. This cursor
is used as a reference point for insert
and delete
operations. Notice that the contained XForms form controls inside
element repeat
do not explicitly specify the index of the collection
entry being populated. This is intentional; it keeps both authoring as well as
the processing model simple.
The binding expression attached to the repeating sequence
returns a node-set of the collection being populated, not an individual node.
Within the body of element repeat
, binding expressions are evaluated
with a context node of the node determined by the repeatCursor. Repeat
processing uses XPath expressions to address the collection over which element
repeat
operates. The XPath expression used as the value of attribute
nodeset
must select a node-set of contiguous child element nodes,
with the same local name and namespace name of a common parent node—this
ensures that the node-set represent a homogeneous collection. The behavior of
element repeat
with respect to other XPath node-sets is undefined. The
initial instance data supplies the prototypical member of the homogeneous
collection, and this is used during UI initialization—4.2.4 xforms:UIInitialize—to construct the members of the homogeneous
collection. This prototypical instance is also used by action insert
when creating new members of the collection. To create homogeneous
collections, the initial instance data must specify at least one
member of the collection; this requirement is similar to requiring
instance data in addition to a schema, and the same justification applies.
The form controls appearing inside repeat
need to be
suitable for populating individual items of the collection. A simple but
powerful consequence of the above is that if the XForms Model specifies nested
collections, then a corresponding user interface can nest repeat
elements.
It is possible to nest repeat elements to create more
powerful user interface for editing structured data.
E.2 Editing Hierarchical Bookmarks Using XForms is an example of a form using nested
repeats to edit hierarchical data consisting of bookmarks within multiple
sections. Notice that an inner repeat's cursor always starts from 1
. Consider the following insert
statement that appears as part of that example.
<xforms:insert nodeset="/bookmarks/section[cursor('repeatSections')]/bookmark" at="cursor('repeatBookmarks')" position="after"/>
The above insert
statement is used in that example to add new bookmark entries into the
currently selected section. The inner (nested) repeat operates on
bookmarks in this selected section; The cursor—as returned by XForms
function cursor
—for this inner repeat starts at 1
. Hence, after a new empty section of bookmarks is created and becomes
current, the first insert bookmark operation adds the
newly created bookmark at the front of the list.
Element repeat
enables the binding of user interaction to a
homogeneous collection. The number of displayed items might be less than the
total number available in the collection. In this case, the presentation would
render only a portion of the repeating items at a given time. For example, a
graphical user interface might present a scrolling table. The current item
indicated by the repeat cursor should be presented at all times, for example,
not allowed to scroll out of view. The XForms Actions enumerated at
10 XForms Actions may be used within event listeners to manipulate the
homogeneous collection being populated by scrolling, inserting and deleting
entries.
Notice that the markup encapsulated by element
repeat
acts as the template for the user interaction that is presented
to the user. As a consequence, it is not possible to refer to portions of the
generated user interface via statically authored idref
attributes. A necessary consequence of this is that XForms 1.0 does not
specify the behavior of construct switch
within element
repeat
. Future versions of XForms may specify the behavior of
switch
inside repeat
based on implementation experience and
user feedback.
Table of Contents | Top |