The parsing of property value expressions is handled by two
closely related classes: PropertyTokenizer
and its
subclass, PropertyParser
.
PropertyTokenizer
, as the name suggests, handles
the tokenizing of the expression, handing tokens
back to its subclass,
PropertyParser
. PropertyParser
, in
turn, returns a PropertyValueList
, a list of
PropertyValue
s.
The tokenizer and parser rely in turn on the datatype
definition from the org.apache.fop.datatypes
package and the datatype static final int
constants from PropertyConsts
.
The data types currently defined in
org.apache.fop.datatypes
include:
Numbers and lengths | |||
---|---|---|---|
Numeric | The fundamental numeric data type. Numerics of various types are constructed by the classes listed below. | ||
Constructor classes for Numeric | |||
Angle | In degrees(deg), gradients(grad) or radians(rad) | ||
Ems | Relative length in ems | ||
Frequency | In hertz(Hz) or kilohertz(kHz) | ||
IntegerType | |||
Length | In centimetres(cm), millimetres(mm), inches(in), points(pt), picas(pc) or pixels(px) | ||
Percentage | |||
Time | In seconds(s) or milliseconds(ms) | ||
Strings | |||
StringType | Base class for data types which result in a String. | ||
Literal | A subclass of StringType for literals which exceed the constraints of an NCName. | ||
MimeType | A subclass of StringType for literals which represent a mime type. | ||
UriType | A subclass of StringType for literals which represent a URI, as specified by the argument to url(). | ||
NCName | A subclass of StringType for literals which meet the constraints of an NCName. | ||
Country | An RFC 3066/ISO 3166 country code. | ||
Language | An RFC 3066/ISO 639 language code. | ||
Script | An ISO 15924 script code. | ||
Enumerated types | |||
EnumType | An integer representing one of the tokens in a set of enumeration values. | ||
MappedEnumType | A subclass of EnumType. Maintains a String with the value to which the associated "raw" enumeration token maps. E.g., the font-size enumeration value "medium" maps to the String "12pt". | ||
Colors | |||
ColorType | Maintains a four-element array of float, derived from the name of a standard colour, the name returned by a call to system-color(), or an RGB specification. | ||
Fonts | |||
FontFamilySet | Maintains an array of Strings containing a prioritized list of possibly generic font family names. | ||
Pseudo-types | |||
A variety of pseudo-types have been defined as convenience types for frequently appearing enumeration token values, or for other special purposes. | |||
Inherit | For values of inherit. | ||
Auto | For values of auto. | ||
None | For values of none. | ||
Bool | For values of true/false. | ||
FromNearestSpecified | Created to ensure that, when associated with a shorthand, the from-nearest-specified-value() core function is the sole component of the expression. | ||
FromParent | Created to ensure that, when associated with a shorthand, the from-parent() core function is the sole component of the expression. |
The tokenizer returns one of the following token values:
Most of these tokens are self-explanatory, but a few need further comment.
content-type
introduces this
complication. It can have two values of the form
content-type:mime-type
(e.g. content-type="content-type:xml/svg"
) or
namespace-prefix:prefix
(e.g. content-type="namespace-prefix:svg"
). The
experimental code reduces these options to the payload
in each case: an NCName
in the case of a
namespace prefix, and a MIMETYPE in the case of a
content-type specification. NCName
s cannot
contain a "/".
The parser retuns a PropertyValueList
,
necessary because of the possibility that a list of
PropertyValue
elements may be returned from the
expressions of soem properties.
PropertyValueList
s may contain
PropertyValue
s or other
PropertyValueList
s. This latter provision is
necessitated for the peculiar case of of
text-shadow, which may contain whitespace separated
sublists of either two or three elements, separated from one
another by commas. To accommodate this peculiarity, comma
separated elements are added to the top-level list, while
whitespace separated values are always collected into
sublists to be added to the top-level list.
Other special cases include the processing of the core
functions from-parent()
and
from-nearest-specified-value()
when these
function calls are assigned to a shorthand property, or used
with a shorthand property name as an argument. In these
cases, the function call must be the sole component of the
expression. The pseudo-element classes
FromParent
and
FromNearestSpecified
are generated in these
circumstances so that an exception will be thrown if they
are involved in expression evaluation with other
components. (See Rec. Section 5.10.4 Property Value
Functions.)
The experimental code is a simple extension of the existing parser code, which itself borrowed heavily from James Clark's XT processor.
---
title: ProgressBar
order: 27
layout: page
---
[[components.progressbar]]
= [classname]#ProgressBar#
ifdef::web[]
[.sampler]
image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/interaction/progress-bar"]
endif::web[]
The [classname]#ProgressBar# component allows visualizing progress of a task.
The progress is specified as a floating-point value between 0.0 and 1.0.
[[figure.components.progressbar.basic]]
.The [classname]#ProgressBar# component
image::img/progressbar-basic.png[width=30%, scaledwidth=70%]
To display upload progress with the [classname]#Upload# component, you can
update the progress bar in a [interfacename]#ProgressListener#.
When the position of a progress bar is done in a background thread, the change
is not shown in the browser immediately. You need to use either polling or
server push to update the browser. You can enable polling with
[methodname]#setPollInterval()# in the current UI instance. See
<<dummy/../../../framework/advanced/advanced-push#advanced.push,"Server Push">>
for instructions about using server push. Whichever method you use to update the
UI, it is important to lock the user session by modifying the progress bar value
inside [methodname]#access()# call, as illustrated in the following example and
described in
<<dummy/../../../framework/advanced/advanced-push#advanced.push.running,"Accessing UI from Another Thread">>.
[source, java]
----
final ProgressBar bar = new ProgressBar(0.0f);
layout.addComponent(bar);
layout.addComponent(new Button("Increase",
new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
float current = bar.getValue();
if (current < 1.0f)
bar.setValue(current + 0.10f);
}
}));
----
[[components.progressbar.indeterminate]]
== Indeterminate Mode
In the indeterminate mode, a non-progressive indicator is displayed
continuously. The indeterminate indicator is a circular wheel in the built-in
themes. The progress value has no meaning in the indeterminate mode.
[source, java]
----
ProgressBar bar = new ProgressBar();
bar.setIndeterminate(true);
----
[[figure.components.progressbar.indeterminate]]
.Indeterminate progress bar
image::img/progressbar-indeterminate.png[width=15%, scaledwidth=40%]
ifdef::web[]
[[components.progressbar.thread]]
== Doing Heavy Computation
The progress bar is typically used to display the progress of a heavy
server-side computation task, often running in a background thread. The UI,
including the progress bar, can be updated either with polling or by using
server push. When doing so, you must ensure thread-safety, most easily by
updating the UI inside a [methodname]#UI.access()# call in a
[interfacename]#Runnable#, as described in
<<dummy/../../../framework/advanced/advanced-push#advanced.push.running,"Accessing
UI from Another Thread">>.
In the following example, we create a thread in the server to do some "heavy
work" and use polling to update the UI. All the thread needs to do is to set the
value of the progress bar with [methodname]#setValue()# and the current progress
is displayed automatically when the browser polls the server.
[source, java]
----
HorizontalLayout barbar = new HorizontalLayout();
layout.addComponent(barbar);
// Create the bar, disabled until progress is started
final ProgressBar progress = new ProgressBar(new Float(0.0));
progress.setEnabled(false);
barbar.addComponent(progress);
final Label status = new Label("not running");
barbar.addComponent(status);
// A button to start progress
final Button button = new Button("Click to start");
layout.addComponent(button);
// A thread to do some work
class WorkThread extends Thread {
// Volatile because read in another thread in access()
volatile double current = 0.0;
@Override
public void run() {
// Count up until 1.0 is reached
while (current < 1.0) {
current += 0.01;
// Do some "heavy work"
try {
sleep(50); // Sleep for 50 milliseconds
} catch (InterruptedException e) {}
// Update the UI thread-safely
UI.getCurrent().access(new Runnable() {
@Override
public void run() {
progress.setValue(new Float(current));
if (current < 1.0)
status.setValue("" +
((int)(current*100)) + "% done");
else
status.setValue("all done");
}
});
}
// Show the "all done" for a while
try {
sleep(2000); // Sleep for 2 seconds
} catch (InterruptedException e) {}
// Update the UI thread-safely
UI.getCurrent().access(new Runnable() {
@Override
public void run() {
// Restore the state to initial
progress.setValue(new Float(0.0));
progress.setEnabled(false);
// Stop polling
UI.getCurrent().setPollInterval(-1);
button.setEnabled(true);
status.setValue("not running");
}
});
}
}
// Clicking the button creates and runs a work thread
button.addClickListener(new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
final WorkThread thread = new WorkThread();
thread.start();
// Enable polling and set frequency to 0.5 seconds
UI.getCurrent().setPollInterval(500);
// Disable the button until the work is done
progress.setEnabled(true);
button.setEnabled(false);
status.setValue("running...");
}
});
----
The example is illustrated in <<figure.components.progressbar.thread>>.
[[figure.components.progressbar.thread]]
.Doing heavy work
image::img/progressbar-thread.png[width=40%, scaledwidth=70%]
endif::web[]
[[components.progressbar.css]]
== CSS Style Rules
[source, css]
----
.v-progressbar, v-progressbar-indeterminate {}
.v-progressbar-wrapper {}
.v-progressbar-indicator {}
----
The progress bar has a [literal]#++v-progressbar++# base style.
The progress is an element with [literal]#++v-progressbar-indicator++# style inside the wrapper, and therefore displayed on top of it.
When the progress element grows, it covers more and more of the animated background.
The progress bar can be animated (some themes use that).
Animation is done in the element with the [literal]#v-progressbar-wrapper# style, by having an animated GIF as the background image.
In the indeterminate mode, the top element also has the
[literal]#++v-progressbar-indeterminate++# style.
The built-in themes simply display the animated GIF in the top element and have the inner elements disabled.