Property Expression Parsing
The following discussion of the experiments with alternate property expression parsing is very much a work in progress, and subject to sudden changes.

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 PropertyValues.

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:

static final int EOF = 0 ,NCNAME = 1 ,MULTIPLY = 2 ,LPAR = 3 ,RPAR = 4 ,LITERAL = 5 ,FUNCTION_LPAR = 6 ,PLUS = 7 ,MINUS = 8 ,MOD = 9 ,DIV = 10 ,COMMA = 11 ,PERCENT = 12 ,COLORSPEC = 13 ,FLOAT = 14 ,INTEGER = 15 ,ABSOLUTE_LENGTH = 16 ,RELATIVE_LENGTH = 17 ,TIME = 18 ,FREQ = 19 ,ANGLE = 20 ,INHERIT = 21 ,AUTO = 22 ,NONE = 23 ,BOOL = 24 ,URI = 25 ,MIMETYPE = 26 // NO_UNIT is a transient token for internal use only. It is // never set as the end result of parsing a token. ,NO_UNIT = 27 ;

Most of these tokens are self-explanatory, but a few need further comment.

AUTO
Because of its frequency of occurrence, and the fact that it is always the initial value for any property which supports it, AUTO has been promoted into a pseudo-type with its on datatype class. Therefore, it is also reported as a token.
NONE
Similarly to AUTO, NONE has been promoted to a pseudo-type because of its frequency.
BOOL
There is a de facto boolean type buried in the enumeration types for many of the properties. It had been specified as a type in its own right in this code.
MIMETYPE
The property 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. NCNames 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.

PropertyValueLists may contain PropertyValues or other PropertyValueLists. 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.

39' href='#n39'>39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
---
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.