aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManolo Carrasco <manolo@vaadin.com>2016-07-13 13:26:49 +0200
committerManolo Carrasco <manolo@vaadin.com>2016-07-13 13:26:49 +0200
commit45f92ac0e09749e994af190149581aa5542a536f (patch)
tree0a78a49eeacd5bc0363a382f4f8f60c7b75d9408
parentaedc62f24a5d80c2ec5b116bf44905d632036604 (diff)
parent94ae194409ea2be4afa2b571338e4e9c7b5a3732 (diff)
downloadvaadin-framework-45f92ac0e09749e994af190149581aa5542a536f.tar.gz
vaadin-framework-45f92ac0e09749e994af190149581aa5542a536f.zip
Merge branch 'master' into feature/elements
-rw-r--r--README.md91
-rw-r--r--all/pom.xml9
-rw-r--r--all/src/main/templates/release-notes.html31
-rw-r--r--checkstyle/suppressions.xml9
-rw-r--r--checkstyle/vaadin-checkstyle.xml2
-rw-r--r--client-compiler/pom.xml63
-rw-r--r--client/pom.xml73
-rw-r--r--client/src/main/java/com/vaadin/client/communication/MessageHandler.java19
-rw-r--r--client/src/main/java/com/vaadin/client/ui/VFilterSelect.java232
-rw-r--r--client/src/main/java/com/vaadin/client/ui/combobox/ComboBoxConnector.java38
-rw-r--r--client/src/main/java/com/vaadin/client/ui/loginform/LoginFormConnector.java194
-rw-r--r--client/src/main/java/com/vaadin/client/ui/loginform/VLoginForm.java27
-rw-r--r--client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java10
-rw-r--r--client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledEvent.java2
-rw-r--r--client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledHandler.java9
-rw-r--r--client/src/main/java/com/vaadin/client/widgets/Escalator.java38
-rw-r--r--client/src/main/java/com/vaadin/client/widgets/Grid.java12
-rw-r--r--documentation/addons/addons-cval.asciidoc49
-rw-r--r--documentation/addons/addons-downloading.asciidoc9
-rw-r--r--documentation/addons/addons-eclipse.asciidoc22
-rw-r--r--documentation/addons/addons-maven.asciidoc291
-rw-r--r--documentation/addons/addons-overview.asciidoc34
-rw-r--r--documentation/addons/chapter-addons.asciidoc11
-rw-r--r--documentation/addons/img/addon-architecture.pngbin0 -> 69070 bytes
-rw-r--r--documentation/addons/img/directory-activate.pngbin0 -> 9965 bytes
-rw-r--r--documentation/addons/img/directory-install.pngbin0 -> 11654 bytes
-rw-r--r--documentation/addons/img/directory-maven-pom.pngbin36482 -> 30352 bytes
-rw-r--r--documentation/addons/img/directory-version.pngbin0 -> 12731 bytes
-rw-r--r--documentation/addons/img/online-compilation-cdn.pngbin0 -> 61051 bytes
-rw-r--r--documentation/addons/img/widgetset-compiling-toolbar-hi.pngbin17549 -> 0 bytes
-rw-r--r--documentation/addons/img/widgetset-compiling-toolbar-lo.pngbin8550 -> 0 bytes
-rw-r--r--documentation/addons/img/widgetset-compiling-toolbar.pngbin7429 -> 4556 bytes
-rw-r--r--documentation/addons/img/widgetset-mode-cdn.pngbin0 -> 59688 bytes
-rw-r--r--documentation/addons/img/widgetset-mode-fetch.pngbin0 -> 56725 bytes
-rw-r--r--documentation/addons/img/widgetset-mode-local.pngbin0 -> 34393 bytes
-rw-r--r--documentation/addons/img/widgetset-modes.pngbin0 -> 63805 bytes
-rw-r--r--documentation/addons/original-drawings/Makefile13
-rw-r--r--documentation/addons/original-drawings/addon-architecture.svg513
-rw-r--r--documentation/addons/original-drawings/widgetset-compiling-toolbar.svg176
-rw-r--r--documentation/addons/original-drawings/widgetset-mode-cdn.svg434
-rw-r--r--documentation/addons/original-drawings/widgetset-mode-fetch.svg403
-rw-r--r--documentation/addons/original-drawings/widgetset-mode-local.svg357
-rw-r--r--documentation/addons/original-drawings/widgetset-modes.svg466
-rw-r--r--documentation/advanced/advanced-windows.asciidoc8
-rw-r--r--documentation/application/application-architecture.asciidoc23
-rw-r--r--documentation/application/application-environment.asciidoc48
-rw-r--r--documentation/application/application-notifications.asciidoc34
-rw-r--r--documentation/application/application-overview.asciidoc7
-rw-r--r--documentation/application/application-resources.asciidoc22
-rw-r--r--documentation/architecture/architecture-client-side.asciidoc5
-rw-r--r--documentation/architecture/architecture-events.asciidoc19
-rw-r--r--documentation/architecture/architecture-overview.asciidoc2
-rw-r--r--documentation/architecture/architecture-technology.asciidoc15
-rw-r--r--documentation/clientside/clientside-compiling.asciidoc192
-rw-r--r--documentation/clientside/img/widgetset-compiling-toolbar.pngbin0 -> 4556 bytes
-rw-r--r--documentation/components/components-button.asciidoc18
-rw-r--r--documentation/components/components-calendar.asciidoc14
-rw-r--r--documentation/components/components-checkbox.asciidoc9
-rw-r--r--documentation/components/components-combobox.asciidoc6
-rw-r--r--documentation/components/components-customcomponent.asciidoc15
-rw-r--r--documentation/components/components-customfield.asciidoc87
-rw-r--r--documentation/components/components-datefield.asciidoc30
-rw-r--r--documentation/components/components-embedded.asciidoc19
-rw-r--r--documentation/components/components-features.asciidoc107
-rw-r--r--documentation/components/components-fields.asciidoc70
-rw-r--r--documentation/components/components-grid.asciidoc75
-rw-r--r--documentation/components/components-label.asciidoc16
-rw-r--r--documentation/components/components-link.asciidoc72
-rw-r--r--documentation/components/components-listselect.asciidoc11
-rw-r--r--documentation/components/components-menubar.asciidoc27
-rw-r--r--documentation/components/components-nativeselect.asciidoc11
-rw-r--r--documentation/components/components-optiongroup.asciidoc20
-rw-r--r--documentation/components/components-passwordfield.asciidoc10
-rw-r--r--documentation/components/components-progressbar.asciidoc59
-rw-r--r--documentation/components/components-richtextarea.asciidoc8
-rw-r--r--documentation/components/components-selection.asciidoc81
-rw-r--r--documentation/components/components-slider.asciidoc29
-rw-r--r--documentation/components/components-table.asciidoc66
-rw-r--r--documentation/components/components-textarea.asciidoc10
-rw-r--r--documentation/components/components-textfield.asciidoc22
-rw-r--r--documentation/components/components-tree.asciidoc204
-rw-r--r--documentation/components/components-treetable.asciidoc19
-rw-r--r--documentation/components/components-twincolselect.asciidoc6
-rw-r--r--documentation/components/components-upload.asciidoc20
-rw-r--r--documentation/components/img/customfield-basic.pngbin0 -> 3215 bytes
-rw-r--r--documentation/components/img/slider-example1-hi.pngbin8084 -> 12675 bytes
-rw-r--r--documentation/components/img/slider-orig.pngbin3308 -> 16803 bytes
-rw-r--r--documentation/components/img/table-columnformatting.pngbin14101 -> 25223 bytes
-rw-r--r--documentation/components/img/tree-example1.pngbin21923 -> 15383 bytes
-rw-r--r--documentation/components/original-drawings/slider-example1.svg261
-rw-r--r--documentation/getting-started/chapter-getting-started.asciidoc5
-rw-r--r--documentation/getting-started/getting-started-first-project.asciidoc126
-rw-r--r--documentation/getting-started/getting-started-idea.asciidoc12
-rw-r--r--documentation/getting-started/getting-started-maven.asciidoc20
-rw-r--r--documentation/getting-started/getting-started-netbeans.asciidoc10
-rw-r--r--documentation/getting-started/getting-started-overview.adoc8
-rw-r--r--documentation/getting-started/img/idea-maven-newproject-1.pngbin48841 -> 30956 bytes
-rw-r--r--documentation/getting-started/img/idea-newproject-1.pngbin47846 -> 29951 bytes
-rw-r--r--documentation/getting-started/img/idea-newproject-2.pngbin48811 -> 29030 bytes
-rw-r--r--documentation/getting-started/img/myproject-compiletheme.pngbin0 -> 3210 bytes
-rw-r--r--documentation/getting-started/img/myproject-compilewidgetset.pngbin60613 -> 4556 bytes
-rw-r--r--documentation/getting-started/img/myproject-created-annotated-hi.pngbin159382 -> 180152 bytes
-rw-r--r--documentation/getting-started/img/myproject-created.pngbin161562 -> 113354 bytes
-rw-r--r--documentation/getting-started/img/netbeans-created-annotated-hi.pngbin100861 -> 138602 bytes
-rw-r--r--documentation/getting-started/img/netbeans-newproject-1.pngbin55377 -> 45003 bytes
-rw-r--r--documentation/getting-started/img/netbeans-newproject-2.pngbin49508 -> 39198 bytes
-rw-r--r--documentation/getting-started/img/netbeans-newproject-created.pngbin22317 -> 16261 bytes
-rw-r--r--documentation/getting-started/img/netbeans-server.pngbin27387 -> 18349 bytes
-rw-r--r--documentation/getting-started/original-drawings/myproject-created-annotated.svg202
-rw-r--r--documentation/getting-started/original-drawings/netbeans-created-annotated.svg197
-rw-r--r--documentation/gwt/gwt-shared-state.asciidoc2
-rw-r--r--documentation/installing/img/installation-steps.svg1019
-rw-r--r--documentation/installing/img/sign-in-form.pngbin23263 -> 13875 bytes
-rw-r--r--documentation/installing/img/signin-via-website.pngbin36736 -> 26780 bytes
-rw-r--r--documentation/installing/installing-eclipse.adoc55
-rw-r--r--documentation/installing/installing-idea.asciidoc4
-rw-r--r--documentation/installing/installing-netbeans.asciidoc2
-rw-r--r--documentation/installing/installing-other.adoc2
-rw-r--r--documentation/installing/installing-overview.adoc2
-rw-r--r--documentation/installing/installing-toolchain.adoc2
-rw-r--r--documentation/installing/original-drawings/installation-steps-constellation.svg143
-rw-r--r--documentation/installing/original-drawings/installation-steps.svg65
-rw-r--r--documentation/introduction/intro-overview.asciidoc5
-rw-r--r--documentation/jpacontainer/jpacontainer-overview.asciidoc11
-rw-r--r--documentation/layout/img/layout-intro-example-1.pngbin21093 -> 46039 bytes
-rw-r--r--documentation/layout/img/layout-schematic-hi.pngbin0 -> 54863 bytes
-rw-r--r--documentation/layout/layout-gridlayout.asciidoc81
-rw-r--r--documentation/layout/layout-orderedlayout.asciidoc50
-rw-r--r--documentation/layout/layout-overview.asciidoc48
-rw-r--r--documentation/layout/original-drawings/Makefile17
-rw-r--r--documentation/layout/original-drawings/layout-schematic.svg546
-rw-r--r--documentation/themes/themes-fonts.asciidoc2
-rw-r--r--documentation/tutorial.adoc39
-rw-r--r--pom.xml1
-rw-r--r--server/pom.xml41
-rw-r--r--server/src/main/java/com/vaadin/data/util/GeneratedPropertyContainer.java16
-rw-r--r--server/src/main/java/com/vaadin/navigator/Navigator.java74
-rw-r--r--server/src/main/java/com/vaadin/server/JsonPaintTarget.java2
-rw-r--r--server/src/main/java/com/vaadin/server/KeyMapper.java2
-rw-r--r--server/src/main/java/com/vaadin/server/VaadinServlet.java2
-rw-r--r--server/src/main/java/com/vaadin/server/communication/JSR356WebsocketInitializer.java32
-rw-r--r--server/src/main/java/com/vaadin/server/communication/data/RpcDataProviderExtension.java36
-rw-r--r--server/src/main/java/com/vaadin/ui/AbstractField.java6
-rw-r--r--server/src/main/java/com/vaadin/ui/ComboBox.java33
-rw-r--r--server/src/main/java/com/vaadin/ui/LoginForm.java492
-rw-r--r--server/src/main/java/com/vaadin/ui/UI.java5
-rw-r--r--server/src/main/java/com/vaadin/ui/declarative/Design.java35
-rw-r--r--server/src/test/java/com/vaadin/data/util/GeneratedPropertyContainerTest.java10
-rw-r--r--server/src/test/java/com/vaadin/tests/design/DesignFormatterTest.java3
-rw-r--r--server/src/test/java/com/vaadin/tests/design/InnerClassDesignReadWriteTest.java38
-rw-r--r--server/src/test/java/com/vaadin/tests/design/UPPERCASE/InUpperCasePackage.java7
-rw-r--r--server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java21
-rw-r--r--server/src/test/java/com/vaadin/tests/server/component/grid/GridContainerTest.java39
-rw-r--r--server/src/test/java/com/vaadin/tests/server/navigator/NavigatorTest.java92
-rw-r--r--shared/pom.xml32
-rw-r--r--shared/src/main/java/com/vaadin/shared/ui/grid/HeightMode.java8
-rw-r--r--shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormConstants.java31
-rw-r--r--shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormRpc.java23
-rw-r--r--shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormState.java28
-rw-r--r--shared/src/main/java/com/vaadin/shared/ui/ui/UIServerRpc.java3
-rw-r--r--themes/src/main/themes/VAADIN/themes/base/select/select.scss24
-rw-r--r--themes/src/main/themes/VAADIN/themes/chameleon/common/common.scss5
-rw-r--r--themes/src/main/themes/VAADIN/themes/liferay/select/select.scss16
-rw-r--r--themes/src/main/themes/VAADIN/themes/reindeer/select/select.scss2
-rw-r--r--themes/src/main/themes/VAADIN/themes/runo/select/select.scss2
-rw-r--r--themes/src/main/themes/VAADIN/themes/valo/components/_combobox.scss24
-rw-r--r--uitest/pom.xml90
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidth.java47
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthLegacy.java47
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPercentage.java46
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPixels.java46
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/grid/GridHeight.java189
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/grid/GridResizeHiddenColumn.java64
-rw-r--r--uitest/src/main/java/com/vaadin/tests/push/PushRemoveConnectors.java92
-rw-r--r--uitest/src/test/java/com/vaadin/tests/VerifyBrowserVersionTest.java2
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthLegacyTest.java52
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPercentageTest.java52
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPixelsTest.java51
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthTest.java52
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/grid/GridHeightTest.java199
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/grid/GridResizeHiddenColumnTest.java116
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/GridDescriptionGeneratorTest.java8
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/label/LabelTooltipTest.java9
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/window/ToolTipInWindowTest.java2
-rw-r--r--uitest/src/test/java/com/vaadin/tests/fieldgroup/BooleanTextFieldTest.java10
-rw-r--r--uitest/src/test/java/com/vaadin/tests/navigator/NavigationTest.java54
-rw-r--r--uitest/src/test/java/com/vaadin/tests/push/PushRemoveConnectorsTest.java36
-rw-r--r--uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTest.java18
-rw-r--r--uitest/src/test/java/com/vaadin/tests/tb3/TooltipTest.java4
-rw-r--r--uitest/src/test/java/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java4
-rw-r--r--uitest/src/test/java/com/vaadin/tests/tooltip/StationaryTooltipTest.java5
-rw-r--r--uitest/src/test/java/com/vaadin/tests/validation/ValidationOfRequiredEmptyFieldsTest.java9
-rw-r--r--widgets/src/main/java/com/vaadin/themes/valoutil/BodyStyleName.java16
193 files changed, 8156 insertions, 2438 deletions
diff --git a/README.md b/README.md
index 70d4b46ccb..0377df5b1d 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,19 @@
-Vaadin
-======
-*[Vaadin](https://vaadin.com) is a Java framework for building modern web applications that look great, perform well and make you and your users happy.*
+# Vaadin Framework
-For instructions about _using_ Vaadin to develop applications, please refer to
-https://vaadin.com/learn
+*[Vaadin Framework](https://vaadin.com/framework) allows you to build modern web apps efficiently in plain Java, without touchking low level web technologies.*
-To contribute, first refer to [Contributing Code](https://vaadin.com/wiki/-/wiki/Main/Contributing+Code)
-for general instructions and requirements for contributing code to the Vaadin framework.
+For instructions about _using_ Vaadin to develop applications, please refer to [Vaadin tutorial](https://vaadin.com/docs/-/part/framework/tutorial.html) and other [documentation](https://vaadin.com/docs/).
-Instructions on how to set up a working environments for developing the Vaadin
-framework follow below.
+To contribute, first refer to [Contributing Code](https://vaadin.com/wiki/-/wiki/Main/Contributing+Code) for general instructions and requirements for contributing code to the Vaadin framework.
+
+Instructions on how to set up a working environments for developing the Vaadin Framework follow below.
+
+## Building a package
+
+The distribution files can be built by running the standard Maven goal `mvn install` in the project root.
+
+## Eclipse Quick Setup
-Eclipse Quick Setup
-======
1. Run
<code>git clone https://github.com/vaadin/vaadin.git</code>
command or clone the repository your favorite Git tool.
@@ -26,16 +27,15 @@ Note that the first compilation takes a while to finish as maven downloads depen
Now the project should compile without further configuration.
+### Compiling the Default Widget Set and Themes
-Compiling the Default Widget Set and Themes
---------
* Compile the default widgetset by running <code>install</code> maven goal in `vaadin-client-compiled` module root.
In Eclipse this is done by right clicking on vaadin-client-compiled project it and choosing *Run As* -> *Maven Build...*.
* Compile the default themes by running <code>install</code> maven goal in `vaadin-themes` module root.
In Eclipse this is done by right clicking on vaadin-themes project it and choosing *Run As* -> *Maven Build...*.
-Set up extra workspace preferences
---------
+### Set up extra workspace preferences
+
The following preferences need to be set to keep the project consistent. You need to do this especially to be able to contribute changes to the project.
1. Open *Window* -> *Preferences* (Windows) or *Eclipse* -> *Preferences* (Mac)
@@ -44,32 +44,24 @@ The following preferences need to be set to keep the project consistent. You nee
1. Set *New text file line delimiter* to *Unix*
1. Go to XML -> XML Files -> Editor
1. Ensure the settings are follows:
-<pre><code>Line width: 72
-Format comments: true
-Join lines: true
-Insert whitespace before closing empty end-tags: true
-Indent-using spaces: true
-Indentation size: 4
-</code></pre>
-
-Running a UI test
-------
+
+ Line width: 72
+ Format comments: true
+ Join lines: true
+ Insert whitespace before closing empty end-tags: true
+ Indent-using spaces: true
+ Indentation size: 4
+
+
+### Running a UI test
+
1. In a Project Explorer right-click *vaadin-uitest*
1. Open *Run As* -> *Maven build...*
1. Type in <code>jetty:run-exploded</code> into *Goals* and click *Run*
1. Open URL *http://localhost:8080/run/<testUI>*
-Building a package
-=====
-The distribution files can be built by running maven goal
-<pre><code>maven clean install</code></pre>
-in the project root directory.
-
-To use a specific version number, modify <code>&lt;version&gt;</code> tag in root pom.xml file.
-This goal runs all project tests TestBench tests, which require access to a a TestBench cluster, currently only available internally at Vaadin Ltd.
+## Setting up IntelliJ IDEA to Develop Vaadin 7
-Setting up IntelliJ IDEA to Develop Vaadin 7
-=========
1. Intall and run IDEA. Ultimate Edition is better but Community Edition should also work.
1. Ensure if Git and Maven plugins are installed, properly configured and enabled.
1. Clone the repository, using menu VCS -> Checkout from Version Control -> Git -> Git Repository URL -> https://github.com/vaadin/vaadin.git.
@@ -78,8 +70,33 @@ Setting up IntelliJ IDEA to Develop Vaadin 7
1. Have a coffee break while IDEA is loading dependencies and indexing the project
1. Run Maven targets <code>clean</code> and <code>install</code> using *Maven Projects* tool window to compile the whole project
-Running a UI test
-------
+## Running a specific UI test
+
1. Open *Maven Projects*
1. Open *vaadin-uitest* -> *Plugins* -> *jetty* -> *jetty:run-exploded*
1. Open URL *http://localhost:8080/run/<testUI>*
+
+## Running a Development Server
+
+1. Open *File* -> *New* -> *Module...*
+ 1. Choose type *Java* and click *Next*
+ 1. Type in name <code>uitest-run</code> and set *Content Root* and *Module File Location* to <code>&lt;your project location&gt;/uitest-run</code>
+ 1. Click *Finish*
+1. Open *File* -> *Project Structure...*
+ 1. Choose <code>uitest-run</code> module
+ 1. Open *Dependencies* tab
+ 1. Click *+* -> *Module Dependency* -> *vaadin-uitest* -> *OK*
+ 1. Click *+* -> *Library...* -> *New Library...* -> *From Maven*
+ 1. Type in <code>org.eclipse.jetty.aggregate:jetty-all:9.4.0.M0</code> and press *Tab*
+ 1. Wait a little while Idea is trying to download the library, then click *OK*
+ 1. Close *Project Structure* dialog by pressing *OK*
+1. Open *Run* -> *Edit Configurations...* then create a new configuration of type *Application* named <code>DevelopmentServerLauncher</code>
+ 1. Set *Main class* to <code>com.vaadin.launcher.DevelopmentServerLauncher</code>
+ 1. Set *Single instance only* checkmark
+ 1. Set *VM options* to <code>-ea</code>
+ 1. Set *Use classpath options* to <code>uitest-run</code>
+ 1. Set *Working directory* to <code>uitest</code>
+ 1. Close *Run/Debug Configurations* dialog by pressing *OK*
+
+The run configuration is ready.
+
diff --git a/all/pom.xml b/all/pom.xml
index 5d29cd73cb..7742b54f7d 100644
--- a/all/pom.xml
+++ b/all/pom.xml
@@ -126,18 +126,11 @@
<expandproperties />
<replacetokens begintoken="@" endtoken="@">
<token key="version" value="${project.version}" />
- </replacetokens>
- <replacetokens begintoken="@" endtoken="@">
<token key="version-minor"
value="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}" />
- </replacetokens>
- <replacetokens begintoken="@" endtoken="@">
+ <token key="gwt-version" value="${vaadin.gwt.version}" />
<token key="builddate" value="${maven.build.timestamp}" />
- </replacetokens>
- <replacetokens begintoken="@" endtoken="@">
<token key="release-notes-tickets" value="${release-notes-tickets}" />
- </replacetokens>
- <replacetokens begintoken="@" endtoken="@">
<token key="release-notes-authors" value="${release-notes-authors}" />
</replacetokens>
</filterchain>
diff --git a/all/src/main/templates/release-notes.html b/all/src/main/templates/release-notes.html
index 8c2a7d653e..a6ff88e79e 100644
--- a/all/src/main/templates/release-notes.html
+++ b/all/src/main/templates/release-notes.html
@@ -48,6 +48,7 @@
<li><a href="#incompatible">Incompatible or Behavior-altering Changes in
@version-minor@</a></li>
<li><a href="#knownissues">Known Issues and Limitations</a></li>
+ <li><a href="#gwtdep">GWT Dependency Changes</a></li>
<li><a href="#vaadin">Vaadin Installation</a></li>
<li><a href="#package">Package Contents</a></li>
<li><a href="#migrating">Migrating from Vaadin 6</a></li>
@@ -115,6 +116,10 @@
<li>The return type of BootstrapHandler.getWidgetsetForUI() has changed.</li>
<li>Vaadin shared no longer depends on a custom build of Guava. Any project that depends on Guava as a transitive dependency should use standard Guava.</li>
<li>Valo theme field error styles now apply to NativeSelect, ListSelect and TwinColSelect as well.</li>
+ <li>The LoginForm component has been rewritten to better support auto-completion of passwords on modern browsers.
+ Its API, look and DOM structure have changed somewhat, so any application level customizations of LoginForm need changes.
+ See also <a href="http://dev.vaadin.com/ticket/8171">#8171</a></li>
+ <li>The way we handle GWT dependencies has been completely changed. See <a href="#gwtdep">this section</a> for more details</li>
</ul>
<h3 id="knownissues">Known Issues and Limitations</h3>
<ul>
@@ -157,6 +162,32 @@
<li>Grid does not support adding components to cells. Instead light-weight Renderers can be
used to present and edit data.</li>
</ul>
+
+ <h3 id="gwtdep">GWT Dependency Changes</h3>
+
+ <p>
+ The GWT dependencies for Vaadin are now provided as actual dependencies
+ and not bundled with Vaadin packages. This means that you can override
+ the GWT version in your own project if you want to. Note that the GWT Elemental
+ is still partially bundled with shared package to avoid having the gwt-user as a
+ dependency everywhere.
+ </p>
+
+ <ul>
+ <li>Basic Vaadin server-side only use does not need any changes to your project.</li>
+ <li>Custom widgets and Add-ons should work just like before.</li>
+ <li>Projects that use GWT RPC or other utils from the com.google package should add gwt-servlet dependency
+ <pre>
+&lt;dependency>
+ &lt;groupId>com.vaadin.external.gwt&lt;/groupId>
+ &lt;artifactId>gwt-servlet&lt;/artifactId>
+ &lt;version>@gwt-version@&lt;/version>
+&lt;/dependency>
+ </pre>
+ </li>
+ <li>OSGi currently does not work with client and client-compiler packages. Those should not be used with OSGi.</li>
+ </ul>
+
<h2 id="vaadin">Vaadin Installation</h2>
diff --git a/checkstyle/suppressions.xml b/checkstyle/suppressions.xml
new file mode 100644
index 0000000000..835ad5f11a
--- /dev/null
+++ b/checkstyle/suppressions.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE suppressions PUBLIC
+"-//Puppy Crawl//DTD Suppressions 1.1//EN"
+"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
+
+<suppressions>
+ <suppress files="[/\\]target[/\\]" checks=".*"/>
+</suppressions>
diff --git a/checkstyle/vaadin-checkstyle.xml b/checkstyle/vaadin-checkstyle.xml
index f545b6b442..2979857a87 100644
--- a/checkstyle/vaadin-checkstyle.xml
+++ b/checkstyle/vaadin-checkstyle.xml
@@ -269,7 +269,7 @@
<module name="RegexpSinglelineJava">
<property name="format" value="System\.err\.println" />
</module>
-
+
</module>
</module>
diff --git a/client-compiler/pom.xml b/client-compiler/pom.xml
index ef6f5cbeb4..33a3423b3f 100644
--- a/client-compiler/pom.xml
+++ b/client-compiler/pom.xml
@@ -69,21 +69,6 @@
<version>1.6.5</version>
</dependency>
<dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm</artifactId>
- <version>5.0.3</version>
- </dependency>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm-util</artifactId>
- <version>5.0.3</version>
- </dependency>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm-commons</artifactId>
- <version>5.0.3</version>
- </dependency>
- <dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-annotations</artifactId>
<version>8.1.12.v20130726</version>
@@ -185,7 +170,6 @@
<groupId>com.vaadin.external.gwt</groupId>
<artifactId>gwt-dev</artifactId>
<version>${vaadin.gwt.version}</version>
- <scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
@@ -206,51 +190,6 @@
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>unpack-dependencies</id>
- <phase>generate-resources</phase>
- <goals>
- <goal>unpack</goal>
- </goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-dev</artifactId>
- <includes>
- about_files/**,
- com/google/gwt/core/**,
- com/google/gwt/dev/**,
- com/google/gwt/lang/**,
- com/google/gwt/soyc/**,
- com/google/gwt/thirdparty/json/**,
- com/google/gwt/thirdparty/guava/**,
- com/google/gwt/util/**,
- license/LICENSE.sax.txt,
- netscape/**,
- org/apache/COPYING,
- org/apache/jasper/**,
- org/apache/commons/el/**,
- org/apache/commons/lang3/**,
- templates/*,
- about.html,
- jetty-dir.css,
- plugin.properties
- </includes>
- <excludes>
- com/google/gwt/dev/protobuf/**,
- com/google/gwt/dev/About.properties
- </excludes>
- </artifactItem>
- </artifactItems>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<executions>
<execution>
@@ -291,7 +230,7 @@
<configuration>
<instructions>
<Bundle-RequiredExecutionEnvironment>JavaSE-1.6</Bundle-RequiredExecutionEnvironment>
- <Export-Package>com.vaadin.*;version="${project.version}",com.google.gwt.*;version="${project.version}"</Export-Package>
+ <Export-Package>com.vaadin.*;version="${project.version}"</Export-Package>
<!--TODO decide gwt packages version number<Export-Package>com.vaadin.*;version="${project.version}",com.google.gwt.*;version="${vaadin.gwt.version}"</Export-Package> -->
<Import-Package></Import-Package> <!--todo find out what should be in Import-Package -->
</instructions>
diff --git a/client/pom.xml b/client/pom.xml
index 8a80b3ddbb..87a6e93d53 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -36,28 +36,6 @@
</exclusions>
</dependency>
- <!-- gwt-user dependencies -->
- <dependency>
- <groupId>org.w3c.css</groupId>
- <artifactId>sac</artifactId>
- <version>1.3</version>
- </dependency>
-
- <!-- Bean Validation API -->
- <dependency>
- <groupId>javax.validation</groupId>
- <artifactId>validation-api</artifactId>
- <version>${javax.validation.version}</version>
- <scope>provided</scope>
- </dependency>
-
- <dependency>
- <groupId>javax.validation</groupId>
- <artifactId>validation-api</artifactId>
- <version>${javax.validation.version}</version>
- <classifier>sources</classifier>
- </dependency>
-
<!-- Testing dependencies -->
<dependency>
<groupId>junit</groupId>
@@ -76,62 +54,13 @@
<!-- Needed GWT dependencies. Required parts are packaged to jar -->
<dependency>
<groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-user</artifactId>
- <version>${vaadin.gwt.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>com.vaadin.external.gwt</groupId>
<artifactId>gwt-elemental</artifactId>
<version>${vaadin.gwt.version}</version>
- <scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
-
- <!-- Copy needed GWT dependencies to package -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>unpack-dependencies</id>
- <phase>generate-resources</phase>
- <goals>
- <goal>unpack</goal>
- </goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-user</artifactId>
- <excludes>
- META-INF/**,
- **/*.gwtar,
- com/google/gwt/*/server/**,
- com/google/gwt/*/shared/**,
- com/google/gwt/*/*/shared/**,
- com/google/web/bindery/*/shared/**,
- com/google/gwt/user/client/rpc/IsSerializable.*,
- com/google/gwt/thirdparty/streamhtmlparser/**,
- org/w3c/**,
- javax/servlet/**
- </excludes>
- </artifactItem>
- <artifactItem>
- <groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-elemental</artifactId>
- <excludes>META-INF/**</excludes>
- </artifactItem>
- </artifactItems>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
-
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
@@ -167,7 +96,7 @@
<configuration>
<instructions>
<Bundle-RequiredExecutionEnvironment>JavaSE-1.6</Bundle-RequiredExecutionEnvironment>
- <Export-Package>com.vaadin.*;version="${project.version}",com.google.*;version="${project.version}"</Export-Package>
+ <Export-Package>com.vaadin.*;version="${project.version}"</Export-Package>
<Import-Package></Import-Package>
</instructions>
</configuration>
diff --git a/client/src/main/java/com/vaadin/client/communication/MessageHandler.java b/client/src/main/java/com/vaadin/client/communication/MessageHandler.java
index 3ffadeb9ce..15e94ca8d9 100644
--- a/client/src/main/java/com/vaadin/client/communication/MessageHandler.java
+++ b/client/src/main/java/com/vaadin/client/communication/MessageHandler.java
@@ -493,8 +493,12 @@ public class MessageHandler {
json.getValueMap("dd"));
}
- unregisterRemovedConnectors(connectorHierarchyUpdateResult.detachedConnectorIds);
-
+ int removed = unregisterRemovedConnectors(connectorHierarchyUpdateResult.detachedConnectorIds);
+ if (removed > 0 && !isResponse(json)) {
+ // Must acknowledge the removal using an XHR or server
+ // memory usage will keep growing
+ getUIConnector().sendAck();
+ }
getLogger()
.info("handleUIDLMessage: "
+ (Duration.currentTimeMillis() - processUidlStart)
@@ -802,12 +806,13 @@ public class MessageHandler {
Profiler.leave("verifyConnectorHierarchy - this is only performed in debug mode");
}
- private void unregisterRemovedConnectors(
+ private int unregisterRemovedConnectors(
FastStringSet detachedConnectors) {
Profiler.enter("unregisterRemovedConnectors");
JsArrayString detachedArray = detachedConnectors.dump();
- for (int i = 0; i < detachedArray.length(); i++) {
+ int nrDetached = detachedArray.length();
+ for (int i = 0; i < nrDetached; i++) {
ServerConnector connector = getConnectorMap().getConnector(
detachedArray.get(i));
@@ -822,10 +827,10 @@ public class MessageHandler {
verifyConnectorHierarchy();
}
- getLogger().info(
- "* Unregistered " + detachedArray.length()
- + " connectors");
+ getLogger()
+ .info("* Unregistered " + nrDetached + " connectors");
Profiler.leave("unregisterRemovedConnectors");
+ return nrDetached;
}
private JsArrayString createConnectorsIfNeeded(ValueMap json) {
diff --git a/client/src/main/java/com/vaadin/client/ui/VFilterSelect.java b/client/src/main/java/com/vaadin/client/ui/VFilterSelect.java
index 9fb6d18ac5..8411e05490 100644
--- a/client/src/main/java/com/vaadin/client/ui/VFilterSelect.java
+++ b/client/src/main/java/com/vaadin/client/ui/VFilterSelect.java
@@ -31,9 +31,11 @@ import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Unit;
+import com.google.gwt.dom.client.Style.Visibility;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
@@ -242,7 +244,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
deltaY = -0.5*e.wheelDelta;
}
- @com.vaadin.client.ui.VFilterSelect.JsniUtil::moveScrollFromEvent(*)(widget, deltaX, deltaY, e);
+ @com.vaadin.client.ui.VFilterSelect.JsniUtil::moveScrollFromEvent(*)(widget, deltaX, deltaY, e, e.deltaMode);
});
}-*/;
@@ -256,12 +258,57 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
* as much as feasible.
*/
static class JsniUtil {
+ private static final int DOM_DELTA_PIXEL = 0;
+ private static final int DOM_DELTA_LINE = 1;
+ private static final int DOM_DELTA_PAGE = 2;
+
+ // Rough estimation of item height
+ private static final int SCROLL_UNIT_PX = 25;
+
+ private static double deltaSum = 0;
+
public static void moveScrollFromEvent(final Widget widget,
final double deltaX, final double deltaY,
- final NativeEvent event) {
+ final NativeEvent event, final int deltaMode) {
if (!Double.isNaN(deltaY)) {
- ((VFilterSelect) widget).suggestionPopup.scroll(deltaY);
+ VFilterSelect filterSelect = (VFilterSelect) widget;
+
+ switch (deltaMode) {
+ case DOM_DELTA_LINE:
+ if (deltaY >= 0) {
+ filterSelect.suggestionPopup.selectNextItem();
+ } else {
+ filterSelect.suggestionPopup.selectPrevItem();
+ }
+ break;
+ case DOM_DELTA_PAGE:
+ if (deltaY >= 0) {
+ filterSelect.selectNextPage();
+ } else {
+ filterSelect.selectPrevPage();
+ }
+ break;
+ case DOM_DELTA_PIXEL:
+ default:
+ // Accumulate dampened deltas
+ deltaSum += Math.pow(Math.abs(deltaY), 0.7)
+ * Math.signum(deltaY);
+
+ // "Scroll" if change exceeds item height
+ while (Math.abs(deltaSum) >= SCROLL_UNIT_PX) {
+ if (!filterSelect.waitingForFilteringResponse) {
+ // Move selection if page flip is not in progress
+ if (deltaSum < 0) {
+ filterSelect.suggestionPopup.selectPrevItem();
+ } else {
+ filterSelect.suggestionPopup.selectNextItem();
+ }
+ }
+ deltaSum -= SCROLL_UNIT_PX * Math.signum(deltaSum);
+ }
+ break;
+ }
}
}
}
@@ -327,7 +374,11 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
@Override
protected void onLoad() {
super.onLoad();
- mouseWheeler.attachMousewheelListener(getElement());
+
+ // Register mousewheel listener on paged select
+ if (pageLength > 0) {
+ mouseWheeler.attachMousewheelListener(getElement());
+ }
}
@Override
@@ -658,7 +709,7 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
debug("VFS.SP: setPosition(" + offsetWidth + ", " + offsetHeight
+ ")");
- int top;
+ int top = topPosition;
int left = getPopupLeft();
// reset menu size and retrieve its "natural" size
@@ -675,27 +726,55 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
+ "]");
Element menuFirstChild = menu.getElement().getFirstChildElement();
- final int naturalMenuWidth = WidgetUtil
- .getRequiredWidth(menuFirstChild);
+ int naturalMenuWidth;
+ if (BrowserInfo.get().isIE()
+ && BrowserInfo.get().getBrowserMajorVersion() < 10) {
+ // On IE 8 & 9 visibility is set to hidden and measuring
+ // elements while they are hidden yields incorrect results
+ String before = menu.getElement().getParentElement().getStyle()
+ .getVisibility();
+ menu.getElement().getParentElement().getStyle()
+ .setVisibility(Visibility.VISIBLE);
+ naturalMenuWidth = WidgetUtil.getRequiredWidth(menuFirstChild);
+ menu.getElement().getParentElement().getStyle()
+ .setProperty("visibility", before);
+ } else {
+ naturalMenuWidth = WidgetUtil.getRequiredWidth(menuFirstChild);
+ }
if (popupOuterPadding == -1) {
popupOuterPadding = WidgetUtil
- .measureHorizontalPaddingAndBorder(getElement(), 2);
+ .measureHorizontalPaddingAndBorder(menu.getElement(), 2)
+ + WidgetUtil.measureHorizontalPaddingAndBorder(
+ suggestionPopup.getElement(), 0);
}
- if (naturalMenuWidth < desiredWidth) {
- menu.setWidth((desiredWidth - popupOuterPadding) + "px");
- menuFirstChild.getStyle().setWidth(100, Unit.PCT);
- }
+ updateMenuWidth(desiredWidth, naturalMenuWidth);
if (BrowserInfo.get().isIE()
&& BrowserInfo.get().getBrowserMajorVersion() < 11) {
// Must take margin,border,padding manually into account for
// menu element as we measure the element child and set width to
// the element parent
- double naturalMenuOuterWidth = WidgetUtil
- .getRequiredWidthDouble(menuFirstChild)
- + getMarginBorderPaddingWidth(menu.getElement());
+
+ double naturalMenuOuterWidth;
+ if (BrowserInfo.get().getBrowserMajorVersion() < 10) {
+ // On IE 8 & 9 visibility is set to hidden and measuring
+ // elements while they are hidden yields incorrect results
+ String before = menu.getElement().getParentElement()
+ .getStyle().getVisibility();
+ menu.getElement().getParentElement().getStyle()
+ .setVisibility(Visibility.VISIBLE);
+ naturalMenuOuterWidth = WidgetUtil
+ .getRequiredWidthDouble(menuFirstChild)
+ + getMarginBorderPaddingWidth(menu.getElement());
+ menu.getElement().getParentElement().getStyle()
+ .setProperty("visibility", before);
+ } else {
+ naturalMenuOuterWidth = WidgetUtil
+ .getRequiredWidthDouble(menuFirstChild)
+ + getMarginBorderPaddingWidth(menu.getElement());
+ }
/*
* IE requires us to specify the width for the container
@@ -756,10 +835,12 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
menu.setHeight(menuHeight + "px");
- final int naturalMenuWidthPlusScrollBar = naturalMenuWidth
- + WidgetUtil.getNativeScrollbarSize();
- if (offsetWidth < naturalMenuWidthPlusScrollBar) {
- menu.setWidth(naturalMenuWidthPlusScrollBar + "px");
+ if (suggestionPopupWidth == null) {
+ final int naturalMenuWidthPlusScrollBar = naturalMenuWidth
+ + WidgetUtil.getNativeScrollbarSize();
+ if (offsetWidth < naturalMenuWidthPlusScrollBar) {
+ menu.setWidth(naturalMenuWidthPlusScrollBar + "px");
+ }
}
}
@@ -769,6 +850,11 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
if (left < 0) {
left = 0;
menu.setWidth(Window.getClientWidth() + "px");
+
+ }
+ if (BrowserInfo.get().isIE()
+ && BrowserInfo.get().getBrowserMajorVersion() < 10) {
+ setTdWidth(menu.getElement(), Window.getClientWidth() - 8);
}
}
@@ -777,6 +863,105 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
}
/**
+ * Adds in-line CSS rules to the DOM according to the
+ * suggestionPopupWidth field
+ *
+ * @param desiredWidth
+ * @param naturalMenuWidth
+ */
+ private void updateMenuWidth(final int desiredWidth,
+ int naturalMenuWidth) {
+ /**
+ * Three different width modes for the suggestion pop-up:
+ *
+ * 1. Legacy "null"-mode: width is determined by the longest item
+ * caption for each page while still maintaining minimum width of
+ * (desiredWidth - popupOuterPadding)
+ *
+ * 2. relative to the component itself
+ *
+ * 3. fixed width
+ */
+ String width = "auto";
+ if (suggestionPopupWidth == null) {
+ if (naturalMenuWidth < desiredWidth) {
+ naturalMenuWidth = desiredWidth - popupOuterPadding;
+ width = (desiredWidth - popupOuterPadding) + "px";
+ }
+ } else if (isrelativeUnits(suggestionPopupWidth)) {
+ float mainComponentWidth = desiredWidth - popupOuterPadding;
+ // convert percentage value to fraction
+ int widthInPx = Math.round(mainComponentWidth
+ * asFraction(suggestionPopupWidth));
+ width = widthInPx + "px";
+ } else {
+ // use as fixed width CSS definition
+ width = WidgetUtil.escapeAttribute(suggestionPopupWidth);
+ }
+ menu.setWidth(width);
+
+ // IE8 or 9?
+ if (BrowserInfo.get().isIE()
+ && BrowserInfo.get().getBrowserMajorVersion() < 10) {
+ // using legacy mode?
+ if (suggestionPopupWidth == null) {
+ // set the TD widths manually as these browsers do not
+ // respect display: block; width:100% rules
+ setTdWidth(menu.getElement(), naturalMenuWidth);
+ } else {
+ int compensation = WidgetUtil
+ .measureHorizontalPaddingAndBorder(
+ menu.getElement(), 4);
+ setTdWidth(menu.getElement(), menu.getOffsetWidth()
+ - compensation);
+ }
+
+ }
+ }
+
+ /**
+ * Descends to child elements until finds TD elements and sets their
+ * width in pixels. Can be used to workaround IE8 & 9 TD element
+ * display: block issues
+ *
+ * @param parent
+ * @param width
+ */
+ private void setTdWidth(Node parent, int width) {
+ for (int i = 0; i < parent.getChildCount(); i++) {
+ Node child = parent.getChild(i);
+ if ("td".equals(child.getNodeName().toLowerCase())) {
+ ((Element) child).getStyle().setWidth(width, Unit.PX);
+ } else {
+ setTdWidth(child, width);
+ }
+
+ }
+ }
+
+ /**
+ * Returns the percentage value as a fraction, e.g. 42% -> 0.42
+ *
+ * @param percentage
+ */
+ private float asFraction(String percentage) {
+ String trimmed = percentage.trim();
+ String withoutPercentSign = trimmed.substring(0,
+ trimmed.length() - 1);
+ float asFraction = Float.parseFloat(withoutPercentSign) / 100;
+ return asFraction;
+ }
+
+ /**
+ * @since 7.7
+ * @param suggestionPopupWidth
+ * @return
+ */
+ private boolean isrelativeUnits(String suggestionPopupWidth) {
+ return suggestionPopupWidth.trim().endsWith("%");
+ }
+
+ /**
* Was the popup just closed?
*
* @return true if popup was just closed
@@ -932,6 +1117,13 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
isFirstIteration = false;
}
+ if (suggestionPopupWidth != null && BrowserInfo.get().isIE()
+ && BrowserInfo.get().getBrowserMajorVersion() < 10) {
+ // set TD width to a low value so that they won't mandate the
+ // suggestion pop-up width
+ suggestionPopup
+ .setTdWidth(suggestionPopup.menu.getElement(), 1);
+ }
}
/**
@@ -1355,6 +1547,8 @@ public class VFilterSelect extends Composite implements Field, KeyDownHandler,
/** For internal use only. May be removed or replaced in the future. */
public int suggestionPopupMinWidth = 0;
+ public String suggestionPopupWidth = null;
+
private int popupWidth = -1;
/**
* Stores the last new item string to avoid double submissions. Cleared on
diff --git a/client/src/main/java/com/vaadin/client/ui/combobox/ComboBoxConnector.java b/client/src/main/java/com/vaadin/client/ui/combobox/ComboBoxConnector.java
index 1224a2eaf2..c498f88dde 100644
--- a/client/src/main/java/com/vaadin/client/ui/combobox/ComboBoxConnector.java
+++ b/client/src/main/java/com/vaadin/client/ui/combobox/ComboBoxConnector.java
@@ -35,8 +35,8 @@ import com.vaadin.shared.ui.combobox.FilteringMode;
import com.vaadin.ui.ComboBox;
@Connect(ComboBox.class)
-public class ComboBoxConnector extends AbstractFieldConnector implements
- Paintable, SimpleManagedLayout {
+public class ComboBoxConnector extends AbstractFieldConnector
+ implements Paintable, SimpleManagedLayout {
// oldSuggestionTextMatchTheOldSelection is used to detect when it's safe to
// update textbox text by a changed item caption.
@@ -65,15 +65,16 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
// work without additional UIDL messages
boolean noTextInput = uidl
.hasAttribute(ComboBoxConstants.ATTR_NO_TEXT_INPUT)
- && uidl.getBooleanAttribute(ComboBoxConstants.ATTR_NO_TEXT_INPUT);
+ && uidl.getBooleanAttribute(
+ ComboBoxConstants.ATTR_NO_TEXT_INPUT);
getWidget().setTextInputEnabled(!noTextInput);
// not a FocusWidget -> needs own tabindex handling
getWidget().tb.setTabIndex(getState().tabIndex);
if (uidl.hasAttribute("filteringmode")) {
- getWidget().filteringmode = FilteringMode.valueOf(uidl
- .getStringAttribute("filteringmode"));
+ getWidget().filteringmode = FilteringMode
+ .valueOf(uidl.getStringAttribute("filteringmode"));
}
getWidget().immediate = getState().immediate;
@@ -97,6 +98,13 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
getWidget().inputPrompt = "";
}
+ if (uidl.hasAttribute("suggestionPopupWidth")) {
+ getWidget().suggestionPopupWidth = uidl
+ .getStringAttribute("suggestionPopupWidth");
+ } else {
+ getWidget().suggestionPopupWidth = null;
+ }
+
getWidget().suggestionPopup.updateStyleNames(uidl, getState());
getWidget().allowNewItem = uidl.hasAttribute("allownewitem");
@@ -177,8 +185,8 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
&& uidl.hasAttribute("selectedCaption")) {
// scrolling to correct page is disabled, caption is passed as a
// special parameter
- getWidget().tb.setText(uidl
- .getStringAttribute("selectedCaption"));
+ getWidget().tb
+ .setText(uidl.getStringAttribute("selectedCaption"));
} else {
resetSelection();
}
@@ -266,16 +274,16 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
if (!getWidget().waitingForFilteringResponse
|| getWidget().popupOpenerClicked) {
if (!suggestionKey.equals(getWidget().selectedOptionKey)
- || suggestion.getReplacementString().equals(
- getWidget().tb.getText())
+ || suggestion.getReplacementString()
+ .equals(getWidget().tb.getText())
|| oldSuggestionTextMatchTheOldSelection) {
// Update text field if we've got a new
// selection
// Also update if we've got the same text to
// retain old text selection behavior
// OR if selected item caption is changed.
- getWidget().setPromptingOff(
- suggestion.getReplacementString());
+ getWidget()
+ .setPromptingOff(suggestion.getReplacementString());
getWidget().selectedOptionKey = suggestionKey;
}
}
@@ -288,8 +296,8 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
private boolean isWidgetsCurrentSelectionTextInTextBox() {
return getWidget().currentSuggestion != null
- && getWidget().currentSuggestion.getReplacementString().equals(
- getWidget().tb.getText());
+ && getWidget().currentSuggestion.getReplacementString()
+ .equals(getWidget().tb.getText());
}
private void resetSelection() {
@@ -311,8 +319,8 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
// just clear the input if the value has changed from something
// else to null
if (getWidget().selectedOptionKey != null
- || (getWidget().allowNewItem && !getWidget().tb
- .getValue().isEmpty())) {
+ || (getWidget().allowNewItem
+ && !getWidget().tb.getValue().isEmpty())) {
getWidget().tb.setValue("");
}
}
diff --git a/client/src/main/java/com/vaadin/client/ui/loginform/LoginFormConnector.java b/client/src/main/java/com/vaadin/client/ui/loginform/LoginFormConnector.java
new file mode 100644
index 0000000000..da80287826
--- /dev/null
+++ b/client/src/main/java/com/vaadin/client/ui/loginform/LoginFormConnector.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.client.ui.loginform;
+
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyDownEvent;
+import com.google.gwt.event.dom.client.KeyDownHandler;
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.ui.FocusWidget;
+import com.google.gwt.user.client.ui.FormPanel;
+import com.vaadin.client.ComponentConnector;
+import com.vaadin.client.ConnectorHierarchyChangeEvent;
+import com.vaadin.client.communication.StateChangeEvent;
+import com.vaadin.client.ui.AbstractSingleComponentContainerConnector;
+import com.vaadin.client.ui.VTextField;
+import com.vaadin.client.ui.button.ButtonConnector;
+import com.vaadin.client.ui.nativebutton.NativeButtonConnector;
+import com.vaadin.client.ui.textfield.TextFieldConnector;
+import com.vaadin.shared.Connector;
+import com.vaadin.shared.ui.Connect;
+import com.vaadin.shared.ui.loginform.LoginFormConstants;
+import com.vaadin.shared.ui.loginform.LoginFormRpc;
+import com.vaadin.shared.ui.loginform.LoginFormState;
+import com.google.gwt.core.client.Scheduler;
+
+@Connect(com.vaadin.ui.LoginForm.class)
+public class LoginFormConnector extends
+ AbstractSingleComponentContainerConnector {
+
+ private VTextField passwordField;
+ private VTextField userField;
+ private LoginFormRpc loginFormRpc;
+
+ @Override
+ public void updateCaption(ComponentConnector connector) {
+
+ }
+
+ @Override
+ public VLoginForm getWidget() {
+ return (VLoginForm) super.getWidget();
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+
+ loginFormRpc = getRpcProxy(LoginFormRpc.class);
+ getWidget().addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
+ @Override
+ public void onSubmitComplete(FormPanel.SubmitCompleteEvent event) {
+ valuesChanged();
+ loginFormRpc.submitCompleted();
+ }
+ });
+ }
+
+ @Override
+ public LoginFormState getState() {
+ return (LoginFormState) super.getState();
+ }
+
+ @Override
+ public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) {
+ ComponentConnector content = getContent();
+ if (content != null) {
+ getWidget().setWidget(getContentWidget());
+ }
+ }
+
+ @Override
+ public void onStateChanged(StateChangeEvent stateChangeEvent) {
+ super.onStateChanged(stateChangeEvent);
+
+ LoginFormState state = getState();
+ userField = configureTextField(state.userNameFieldConnector, "username");
+ passwordField = configureTextField(state.passwordFieldConnector,
+ "password");
+ addSubmitButtonClickHandler(state.loginButtonConnector);
+ getWidget().setAction(
+ getResourceUrl(LoginFormConstants.LOGIN_RESOURCE_NAME));
+ }
+
+ private VTextField configureTextField(Connector connector, String id) {
+ if (connector != null) {
+ VTextField textField = ((TextFieldConnector) connector).getWidget();
+
+ textField.addKeyDownHandler(new SubmitKeyHandler());
+
+ Element element = textField.getElement();
+ String externalId = element.getId();
+ if (externalId == null || externalId.isEmpty()
+ || externalId.startsWith("gwt-")) {
+ element.setId(id);
+ }
+ DOM.setElementAttribute(element, "name", id);
+ DOM.setElementAttribute(element, "autocomplete", "on");
+
+ return textField;
+ } else {
+ return null;
+ }
+ }
+
+ private void loginLater() {
+ Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
+ @Override
+ public boolean execute() {
+ login();
+ return false;
+ }
+ }, 100);
+ }
+
+ private void login() {
+ getWidget().submit();
+ }
+
+ private void addSubmitButtonClickHandler(Connector buttonConnector) {
+ if (buttonConnector instanceof ButtonConnector) {
+ addSubmitButtonClickHandler(((ButtonConnector) buttonConnector)
+ .getWidget());
+ } else if (buttonConnector instanceof NativeButtonConnector) {
+ addSubmitButtonClickHandler(((NativeButtonConnector) buttonConnector)
+ .getWidget());
+ }
+ }
+
+ private void addSubmitButtonClickHandler(FocusWidget button) {
+ button.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ login();
+ }
+ });
+ }
+
+ private void valuesChanged() {
+ if (passwordField != null) {
+ passwordField.valueChange(true);
+ }
+ if (userField != null) {
+ userField.valueChange(true);
+ }
+ }
+
+ private class SubmitKeyHandler implements KeyDownHandler {
+
+ private int previousKeyCode;
+
+ @Override
+ public void onKeyDown(KeyDownEvent event) {
+ int keyCode = event.getNativeKeyCode();
+ if (keyCode == KeyCodes.KEY_ENTER) {
+ if (isInAutoComplete()) {
+ previousKeyCode = keyCode;
+ } else {
+ loginLater();
+ }
+ } else {
+ previousKeyCode = keyCode;
+ }
+ }
+
+ private boolean isInAutoComplete() {
+ switch (previousKeyCode) {
+ case KeyCodes.KEY_PAGEUP:
+ case KeyCodes.KEY_PAGEDOWN:
+ case KeyCodes.KEY_UP:
+ case KeyCodes.KEY_DOWN:
+ return true;
+ default:
+ return false;
+ }
+ }
+ }
+}
diff --git a/client/src/main/java/com/vaadin/client/ui/loginform/VLoginForm.java b/client/src/main/java/com/vaadin/client/ui/loginform/VLoginForm.java
new file mode 100644
index 0000000000..e3dccd1ba5
--- /dev/null
+++ b/client/src/main/java/com/vaadin/client/ui/loginform/VLoginForm.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.client.ui.loginform;
+
+import com.google.gwt.user.client.ui.FormPanel;
+
+public class VLoginForm extends FormPanel {
+
+ public VLoginForm() {
+ getElement().setId("loginForm");
+ setMethod(METHOD_POST);
+ }
+}
diff --git a/client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java b/client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java
index 6f4872729d..ca9cb879af 100644
--- a/client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java
+++ b/client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java
@@ -1131,4 +1131,14 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
private static Logger getLogger() {
return Logger.getLogger(UIConnector.class.getName());
}
+
+ /**
+ * Send an acknowledgement RPC to the server. This allows the server to know
+ * which messages the client has received, even when the client is not
+ * sending any other traffic.
+ */
+ public void sendAck() {
+ getRpcProxy(UIServerRpc.class).acknowledge();
+
+ }
}
diff --git a/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledEvent.java b/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledEvent.java
index 2e4be88671..795e87610d 100644
--- a/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledEvent.java
+++ b/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledEvent.java
@@ -20,7 +20,7 @@ import com.google.gwt.event.shared.GwtEvent;
/**
* An enabled/disabled event, fired by the Grid when it is disabled or enabled.
*
- * @since
+ * @since 7.7
* @author Vaadin Ltd
*/
public class GridEnabledEvent extends GwtEvent<GridEnabledHandler> {
diff --git a/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledHandler.java b/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledHandler.java
index 26ac498bcc..a7488e2bc9 100644
--- a/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledHandler.java
+++ b/client/src/main/java/com/vaadin/client/widget/grid/events/GridEnabledHandler.java
@@ -18,10 +18,10 @@ package com.vaadin.client.widget.grid.events;
import com.google.gwt.event.shared.EventHandler;
/**
- * Handler for a Grid enabled/disabled event, called when the Grid is enabled
- * or disabled.
+ * Handler for a Grid enabled/disabled event, called when the Grid is enabled or
+ * disabled.
*
- * @since
+ * @since 7.7
* @author Vaadin Ltd
*/
public interface GridEnabledHandler extends EventHandler {
@@ -30,7 +30,8 @@ public interface GridEnabledHandler extends EventHandler {
* Called when Grid is enabled or disabled.
*
* @param enabled
- * true if status changes from disabled to enabled, otherwise false.
+ * true if status changes from disabled to enabled, otherwise
+ * false.
*/
public void onEnabled(boolean enabled);
}
diff --git a/client/src/main/java/com/vaadin/client/widgets/Escalator.java b/client/src/main/java/com/vaadin/client/widgets/Escalator.java
index 77138a09d7..4c78311ea7 100644
--- a/client/src/main/java/com/vaadin/client/widgets/Escalator.java
+++ b/client/src/main/java/com/vaadin/client/widgets/Escalator.java
@@ -1202,6 +1202,9 @@ public class Escalator extends Widget implements RequiresResize,
assertArgumentsAreValidAndWithinRange(index, numberOfRows);
rows -= numberOfRows;
+ if (heightMode == HeightMode.UNDEFINED) {
+ heightByRows = rows;
+ }
if (!isAttached()) {
return;
@@ -1325,6 +1328,9 @@ public class Escalator extends Widget implements RequiresResize,
}
rows += numberOfRows;
+ if (heightMode == HeightMode.UNDEFINED) {
+ heightByRows = rows;
+ }
/*
* only add items in the DOM if the widget itself is attached to the
@@ -5845,7 +5851,13 @@ public class Escalator extends Widget implements RequiresResize,
if (height != null && !height.isEmpty()) {
heightByCss = height;
} else {
- heightByCss = DEFAULT_HEIGHT;
+ if (getHeightMode() == HeightMode.UNDEFINED) {
+ heightByRows = body.getRowCount();
+ applyHeightByRows();
+ return;
+ } else {
+ heightByCss = DEFAULT_HEIGHT;
+ }
}
if (getHeightMode() == HeightMode.CSS) {
@@ -5859,7 +5871,16 @@ public class Escalator extends Widget implements RequiresResize,
if (height != null && !height.isEmpty()) {
super.setHeight(height);
} else {
- super.setHeight(DEFAULT_HEIGHT);
+ if (getHeightMode() == HeightMode.UNDEFINED) {
+ int newHeightByRows = body.getRowCount();
+ if (heightByRows != newHeightByRows) {
+ heightByRows = newHeightByRows;
+ applyHeightByRows();
+ }
+ return;
+ } else {
+ super.setHeight(DEFAULT_HEIGHT);
+ }
}
recalculateElementSizes();
@@ -6337,7 +6358,7 @@ public class Escalator extends Widget implements RequiresResize,
* define its height that way.
*/
private void applyHeightByRows() {
- if (heightMode != HeightMode.ROW) {
+ if (heightMode != HeightMode.ROW && heightMode != HeightMode.UNDEFINED) {
return;
}
@@ -6346,9 +6367,13 @@ public class Escalator extends Widget implements RequiresResize,
double bodyHeight = body.getDefaultRowHeight() * heightByRows;
double scrollbar = horizontalScrollbar.showsScrollHandle() ? horizontalScrollbar
.getScrollbarThickness() : 0;
+ double spacerHeight = 0; // ignored if HeightMode.ROW
+ if (heightMode == HeightMode.UNDEFINED) {
+ spacerHeight = body.spacerContainer.getSpacerHeightsSum();
+ }
- double totalHeight = headerHeight + bodyHeight + scrollbar
- + footerHeight;
+ double totalHeight = headerHeight + bodyHeight + spacerHeight
+ + scrollbar + footerHeight;
setHeightInternal(totalHeight + "px");
}
@@ -6389,6 +6414,9 @@ public class Escalator extends Widget implements RequiresResize,
case ROW:
setHeightByRows(heightByRows);
break;
+ case UNDEFINED:
+ setHeightByRows(body.getRowCount());
+ break;
default:
throw new IllegalStateException("Unimplemented feature "
+ "- unknown HeightMode: " + this.heightMode);
diff --git a/client/src/main/java/com/vaadin/client/widgets/Grid.java b/client/src/main/java/com/vaadin/client/widgets/Grid.java
index a022db58a4..7665111416 100644
--- a/client/src/main/java/com/vaadin/client/widgets/Grid.java
+++ b/client/src/main/java/com/vaadin/client/widgets/Grid.java
@@ -3011,7 +3011,7 @@ public class Grid<T> extends ResizeComposite implements
/**
* Sets whether the selection column is enabled.
*
- * @since
+ * @since 7.7
* @param enabled <code>true</code> to enable the column,
* <code>false</code> to disable it.
*/
@@ -3600,6 +3600,9 @@ public class Grid<T> extends ResizeComposite implements
}
escalator.getBody().setSpacer(rowIndex, spacerHeight);
+ if (getHeightMode() == HeightMode.UNDEFINED) {
+ setHeightByRows(getEscalator().getBody().getRowCount());
+ }
}
@Override
@@ -3628,6 +3631,11 @@ public class Grid<T> extends ResizeComposite implements
setParent(detailsWidget, null);
spacerElement.removeAllChildren();
+ if (getHeightMode() == HeightMode.UNDEFINED) {
+ // update spacer height
+ escalator.getBody().setSpacer(spacer.getRow(), 0);
+ setHeightByRows(getEscalator().getBody().getRowCount());
+ }
}
}
@@ -5702,7 +5710,7 @@ public class Grid<T> extends ResizeComposite implements
minCellWidth = escalator
.getMinCellWidth(getColumns()
.indexOf(col));
- for (Column<?, T> c : getColumns()) {
+ for (Column<?, T> c : getVisibleColumns()) {
if (selectionColumn == c) {
// Don't modify selection column.
continue;
diff --git a/documentation/addons/addons-cval.asciidoc b/documentation/addons/addons-cval.asciidoc
index 8624bed70c..09a6ff4064 100644
--- a/documentation/addons/addons-cval.asciidoc
+++ b/documentation/addons/addons-cval.asciidoc
@@ -18,20 +18,16 @@ them when deploying the application.
You can purchase add-ons or obtain a free trial key from the Vaadin website. You
need to register in the website to obtain a key.
-You can get license keys from
-link:https://vaadin.com/pro/licenses[vaadin.com/pro/licenses], where you can
-navigate by selecting in the Vaadin website "My Account > Licenses" or directly
-[menuchoice]#Licenses# if you are a Pro Tools subscriber.
-
-[[figure.addons.cval.obtaining]]
-.Obtaining CVAL License
-image::img/cval-pro-licenses-3.png[]
+You can get license keys from link:https://vaadin.com/pro/licenses[vaadin.com/pro/licenses].
-Click on a license key to obtain the purchased or trial key.
+. Select in the Vaadin website "My Account > Licenses" or directly
+[menuchoice]#Licenses# if you are a Pro Tools subscriber.
++
+image::img/cval-pro-licenses-3.png[width=80%, scaledwidth=100%]
-[[figure.addons.cval.obtaining]]
-.Obtaining CVAL License Key
-image::img/cval-pro-licenses-code.png[]
+. Click on a license key to obtain the purchased or trial key.
++
+image::img/cval-pro-licenses-code.png[width=80%, scaledwidth=100%]
[[addons.cval.installing]]
@@ -63,8 +59,11 @@ usually with a [literal]#++-D++# option. For example, on the command-line:
[subs="normal"]
----
-[prompt]#$# [command]#java# -D[parameter]#vaadin.[replaceable]+++#+++&lt;product&gt;+++#+++.developer.license#=[replaceable]#L1cen5e-c0de# ...
+[prompt]#$# [command]#java# -Dvaadin.[replaceable]##<product>##.developer.license=[replaceable]#L1cen5e-c0de# ...
----
+
+where the [literal]`<product>` is the product ID, such as `charts`, `spreadsheet`, `designer`, or `testbench`.
+
ifdef::web[]
See link:https://vaadin.com/directory/help/installing-cval-license[the CVAL
license key installation instructions] for more details.
@@ -82,10 +81,7 @@ navigate to the "Java > Installed JREs" section. Select the JRE version that you
use for the application and click [guibutton]#Edit#. In the [guilabel]#Default
VM arguments#, give the [parameter]#-D# expression as shown above.
-Apache Ant:: If compiling the project with Apache Ant, you could set the key in the Ant
-script as follows:
-
-
+Apache Ant:: If compiling the project with Apache Ant, you could set the key in the Ant script as follows:
+
[subs="normal"]
----
@@ -97,8 +93,6 @@ However, you should never store license keys in a source repository, so if the
Ant script is stored in a source repository, you should pass the license key to
Ant as a property that you then use in the script for the value argument of the
[literal]#++<sysproperty>++# as follows:
-
-
+
[subs="normal"]
----
@@ -109,23 +103,16 @@ Ant as a property that you then use in the script for the value argument of the
When invoking Ant from the command-line, you can pass the property with a
[parameter]#-D# parameter to Ant.
-Apache Maven:: If building the project with Apache Maven, you can pass the license key with a
-[literal]#++-D++# parameter to Maven:
-
-
+Apache Maven:: If building the project with Apache Maven, you can pass the license key with a [literal]#++-D++# parameter to Maven:
+
[subs="normal"]
----
-[prompt]#$# [command]#mvn# -D[parameter]#vaadin.[replaceable]+++#+++&lt;product&gt;+++#+++.developer.license#=[replaceable]#L1cen5e-c0de# package
+[prompt]#$# [command]#mvn# -Dvaadin.[replaceable]##&lt;product&gt;##.developer.license=[replaceable]##L1cen5e-c0de## package
----
++
+where the [literal]`<product>` is the product ID, such as `charts`, `spreadsheet`, `designer`, or `testbench`.
+
Continuous Integration Systems:: In CIS systems, you can pass the license key to build runners as a system
property in the build configuration. However, this only passes it to a runner.
As described above, Ant does not pass it to sub-processes implicitly, so you
need to forward it explicitly as described earlier.
-
-
-
-
-
-
-
diff --git a/documentation/addons/addons-downloading.asciidoc b/documentation/addons/addons-downloading.asciidoc
index 6ccf440420..321721b381 100644
--- a/documentation/addons/addons-downloading.asciidoc
+++ b/documentation/addons/addons-downloading.asciidoc
@@ -1,6 +1,6 @@
---
title: Downloading Add-ons from Vaadin Directory
-order: 2
+order: 4
layout: page
---
@@ -33,8 +33,7 @@ components, that is, a __widget set__. This is the case for majority of add-ons,
except for pure server-side, theme, or data binding add-ons. Compiling the
widget set depends on the build environment. See <<addons.downloading.ant>>, or
later in this chapter for instructions for compiling the widget set with Eclipse
-and
-Maven.+
+and Maven.
////
See &lt;xref linkend="addons.compiling"/&gt; for
instructions.
@@ -55,7 +54,3 @@ it by running Ant in the directory.
If you are using an IDE such as Eclipse, __always__ remember to refresh the
project to synchronize it with the filesystem after compiling the widget set
outside the IDE.
-
-
-
-
diff --git a/documentation/addons/addons-eclipse.asciidoc b/documentation/addons/addons-eclipse.asciidoc
index cd7508466d..4bed0d43fe 100644
--- a/documentation/addons/addons-eclipse.asciidoc
+++ b/documentation/addons/addons-eclipse.asciidoc
@@ -4,13 +4,13 @@ order: 3
layout: page
---
+// This section is excluded from the print edition
+
[[addons.eclipse]]
= Installing Add-ons in Eclipse with Ivy
-The Vaadin Plugin for Eclipse uses Apache Ivy to resolve dependencies. The
-dependencies should be listed in the [filename]#ivy.xml# file in the project
-root. The Vaadin Directory allows dowloading add-ons from a Maven repository,
-which can be accessed also by Ivy.
+If you have a project that uses Apache Ivy to resolve dependencies, they should be listed in the [filename]#ivy.xml# file in the project root.
+Vaadin Directory allows downloading add-ons from a Maven repository, which can also be accessed by Ivy.
You can also use Ivy to resolve dependencies in an Ant script.
@@ -84,24 +84,14 @@ dependencies correctly.
+
IvyIDE immediately resolves the dependencies when you save the file.
-. Compile the add-on widget set
-////
-, as described in &lt;xref
-linkend="addons.compiling.eclipse"/&gt;.
-////
-by clicking the [guilabel]#Compile Vaadin widgets# button in the toolbar.
-
+. Compile the add-on widget set by clicking the [guilabel]#Compile Vaadin Widgetset# button in the toolbar.
+
[[figure.addons.eclipse.toolbar]]
.Compiling Widget Set in Eclipse
-image::img/widgetset-compiling-toolbar-hi.png[]
-
+image::img/widgetset-compiling-toolbar.png[width=50%, scaledwidth=60%]
If you experience problems with Ivy, first check all the dependency parameters.
IvyDE can sometimes cause unexpected problems. You can clear the Ivy dependency
cache by right-clicking the project and selecting "Ivy > Clean all caches". To
refresh Ivy configuration, select "Ivy > Refresh". To try resolving again Ivy,
select "Ivy > Resolve".
-
-
-
diff --git a/documentation/addons/addons-maven.asciidoc b/documentation/addons/addons-maven.asciidoc
index 9c5ca8c25c..32c4e617d7 100644
--- a/documentation/addons/addons-maven.asciidoc
+++ b/documentation/addons/addons-maven.asciidoc
@@ -1,6 +1,6 @@
---
title: Using Add-ons in a Maven Project
-order: 4
+order: 2
layout: page
---
@@ -9,14 +9,15 @@ layout: page
((("Maven", "using add-ons", id="term.addons.maven", range="startofrange")))
+To use add-ons in a Maven project, you simply have to add them as dependencies in the project POM.
-To use add-ons in a Maven project, you simply have to add them as dependencies
-in the project POM. Most add-ons include a widget set, which are compiled to the
-project widget set.
+Most add-ons include client-side widgets, counterparts of the server-side components.
+The add-on widgets will be included and compiled into the _application widget set_.
+Compiling the widget set is handled by the Vaadin Maven Plugin.
+It is enabled in Maven projects created from the Vaadin archetypes, as described in <<DUMMY/../../getting-started/getting-started-overview#getting-started.overview, "Getting Started">>.
-Creating, compiling, and packaging a Vaadin project with Maven was described in
-<<dummy/../../../framework/getting-started/getting-started-maven#getting-started.maven,"Using
-Vaadin with Maven">>.
+The plugin will attempt to automatically detect if you need to compile the application widget set.
+It will generate a [filename]#target/generated-sources/gwt/AppWidgetset.gwt.xml# widget set descriptor, update it when necessary, and use it for compiling the widget set.
[[addons.maven.dependency]]
== Adding a Dependency
@@ -26,61 +27,106 @@ Directory.
. Open the add-on page in Vaadin Directory.
-. Select the version. The latest is shown by default, but you can choose another
-the version from the dropdown menu in the header of the add-on details page.
+. Choose the version on the _left-side menu bar_.
++
+image::img/directory-version.png[width=60%, scaledwidth=80%]
++
+The latest version is selected by default, but you can choose another version from the drop-down menu.
-. Click the [guilabel]#Maven/Ivy# to display the Maven dependency declaration, as
-illustrated in Figure <<figure.addons.maven.pombutton>>. If the add-on is
-available with multiple licenses, you will be prompted to select a license for
-the dependency.
+. Click [guilabel]#Install# to display the dependency declarations.
++
+image::img/directory-install.png[width=50%, scaledwidth=70%]
++
+If the add-on is available with multiple licenses, you will be prompted to select a license for the dependency.
+. Select the [guilabel]#Maven# tab.
+
-[[figure.addons.maven.pombutton]]
-.Maven POM Definitions
-image::img/directory-maven-pom.png[]
+image::img/directory-maven-pom.png[width=50%, scaledwidth=70%]
-. Copy the [literal]#++dependency++# declaration to the [filename]#pom.xml# file
-in your project, under the [literal]#++dependencies++# element.
+. Open the [filename]#pom.xml# file.
+In single-module projects, you only have one, located in the root folder of the project.
+In multi-module projects, open the one in your Vaadin application module.
+*Eclipse IDE*:: Right-click on the [filename]#pom.xml# file and select "Open With > XML Editor".
+You can also left-click it, which opens the Maven POM editor, but directly editing the XML code is usually easier.
+You can also use the XML editor tab of the POM editor.
+. Copy and paste the [literal]#dependency# declaration to under the [literal]#++dependencies++# element.
+
-[subs="normal"]
+[source, xml, subs="normal"]
----
...
- &lt;dependencies&gt;
+ <dependencies>
...
- &lt;dependency&gt;
- &lt;groupId&gt;**com.vaadin.addon**&lt;/groupId&gt;
- &lt;artifactId&gt;**vaadin-charts**&lt;/artifactId&gt;
- &lt;version&gt;**1.0.0**&lt;/version&gt;
- &lt;/dependency&gt;
- &lt;/dependencies&gt;
+ <dependency>
+ <groupId>[replaceable]#com.vaadin.addon#</groupId>
+ <artifactId>[replaceable]#vaadin-charts#</artifactId>
+ <version>[replaceable]#1.0.0#</version>
+ </dependency>
+ </dependencies>
----
+
-You can use an exact version number, as is done in the example above, or
-[literal]#++LATEST++# to always use the latest version of the add-on.
+You can use an exact version number, as is done in the example above, or [literal]#++LATEST++# to always use the latest version of the add-on.
++
+The POM excerpt given in Directory includes also a `repository` definition, but if you have used the Vaadin archetypes to create your project, it already includes the definition.
+. _For commercial add-ons_, you need a license key.
++
+Click [guilabel]#Activate# to buy a license, obtain a trial license key, or get the key from your Pro Tools subscription.
++
+image::img/directory-activate.png[width=50%, scaledwidth=70%]
+
-The POM excerpt given in Directory includes also a repository definition, but if
-you have used the [literal]#++vaadin-archetype-application++# to create your
-project, it already includes the definition.
+For official Vaadin add-ons, see <<addons-cval#addons.cval, "Installing Commercial Vaadin Add-on Licence">> for more information.
-. Compile the widget set as described in the following section.
+. _In Vaadin 7.6 and older_: You need to compile the widget set as described in <<addons.maven.compiling>>.
+[[addons.maven.compiling]]
+== Compiling the Application Widget Set
+[NOTE]
+====
+The widget set is automatically compiled in Vaadin 7.7 and later.
+The plugin will attempt to detect any add-ons that need the widget set to be compiled.
-[[addons.maven.compiling]]
-== Compiling the Project Widget Set
+Just note that it can take a bit time to compile.
+
+To speed up, instead of compiling it locally, you can also use a public cloud service to compile it for you, and use it directly from a CDN service.
+See <<addons.maven.modes>> for instructions.
+====
+
+In projects that use Vaadin 7.6 or older, you need to manually compile the widget set as follows.
+
+[[addons.maven.widgetset]]
+=== Enabling Widget Set Compilation
+
+Compiling the widget set in Maven projects requires the Vaadin Maven plugin.
+It is included in Maven projects created with a current Vaadin archetype.
+
+If all is well, you are set to go.
-If you have used the [literal]#++vaadin-archetype-application++# to create the
-project, the [filename]#pom.xml# includes all necessary declarations to compile
-the widget set. The widget set compilation occurs in standard Maven build phase,
-such as with [parameter]#package# or [parameter]#install# goal.
+If you have used the Vaadin archetypes to create the project, the POM should include all necessary declarations to compile the widget set.
+However, if your Maven project has been created otherwise, you may need to enable widget set compilation manually.
+The simplest way to do that is to copy the definitions from a POM created with the archetype.
+Specifically, you need to copy the `vaadin-maven-plugin` definition in the `plugin` section, as well as the Vaadin dependencies and any relevant settings.
+
+=== Compiling the Widget Set
+
+The widget set compilation occurs in standard Maven build phase, such as with [parameter]#package# or [parameter]#install# goal.
+
+*Eclipse IDE*::
+ Click the *Compile Vaadin Widgetset* button in the Eclipse toolbar.
++
+image::img/widgetset-compiling-toolbar.png[width=50%, scaledwidth=60%]
+
+*Command-line*::
+Simply run the `package` goal.
++
[subs="normal"]
----
-[prompt]#$# [command]#mvn# [parameter]#package#
+[prompt]#$# [command]#mvn# package
----
++
Then, just deploy the WAR to your application server.
[[addons.maven.compiling.recompiling]]
@@ -92,14 +138,22 @@ Running the [literal]#++clean++# goal usually helps, but causes a full
recompilation. You can compile the widget set manually by running the
[parameter]#vaadin:compile# goal.
+*Eclipse IDE*::
+ Click the *Compile Vaadin Widgetset* button in the Eclipse toolbar.
+
+*Command-line*::
+Run the `vaadin:compile` goal.
++
[subs="normal"]
----
-[prompt]#$# [command]#mvn# [parameter]#vaadin:compile#
+[prompt]#$# [command]#mvn# vaadin:compile
----
-Note that this does not update the project widget set by searching new widget
-sets from the class path. It must be updated if you add or remove add-ons, for
-example. You can do that by running the [literal]#++vaadin:update-widgetset++#
-goal in the project directory.
+
+=== Updating the Widget Set
+
+Note that the `vaadin:compile` goal does not update the project widget set by searching new widget sets from the class path.
+It must be updated when you, for example, add or remove add-ons.
+You can do that by running the [literal]#vaadin:update-widgetset# goal in the project directory.
[subs="normal"]
----
@@ -118,53 +172,138 @@ for Maven.
After running the update, you need to run the [literal]#++vaadin:compile++# goal
to actually compile the widget set.
+[[addons.maven.modes]]
+== Widget Set Modes
+The application widget set is by default compiled locally.
+You can also have it compiled in a public cloud service provided by Vaadin, and either use it directly from a CDN service or download it to serve it from your development server.
-[[addons.maven.widgetset]]
-== Enabling Widget Set Compilation
+.Widget set modes
+image::img/widgetset-modes.png[width=80%, scaledwidth=100%]
+
+The widget set mode, defined in the project POM, determines how the widget set is compiled.
+
+`local` (default)::
+The widget set is compiled locally in your development workstation.
+
+`cdn`::
+Compilation is done in the public cloud service.
+It is served directly from the CDN (Content Delivery Network) service.
++
+Using CDN is recommended for development.
-If you are not using a POM created with the proper Vaadin archetype, you may
-need to enable widget set compilation manually. The simplest way to do that is
-to copy the definitions from a POM created with the archetype. Specifically, you
-need to copy the [literal]#++plugin++# definitions. You also need the Vaadin
-dependencies.
+`fetch`::
+Compilation is done in the public cloud service.
+The widget set is then downloaded and deployed with the rest of the application to the application server.
-You need to create an empty widget set definition file, which the widget set
-compilation will populate with widget sets found from the class path. Create a
-[filename]#src/main/java/com/example/AppWidgetSet.gwt.xml# file (in the project
-package) with an empty [literal]#++<module>++# element as follows:
+The mode is set with a `vaadin.widgetset.mode` property in the [elementname]#properties# section at the beginning of the project POM.
+[[addons.maven.modes.local]]
+=== Local Widget Set Compilation
+If add-ons are detected, an [filename]#AppWidgetset.gwt.xml# descriptor file is generated into the [filename]#generated-resources# folder, and later updated automatically.
+The compiler uses the descriptor to compile the widget set, which is included in the web application archive.
+
+.Local widget set compilation
+image::img/widgetset-mode-local.png[width=80%, scaledwidth=60%]
+
+Local compilation is needed in projects that have custom widgets or widget sets that are not available from the Maven central repository or from the Vaadin add-ons or pre-releases repositories.
+Local compilation is necessary for completely offline work.
+
+Local compilation is currently the default mode.
+It is therefore not necessary to set it explicitly, unless you have made global Maven settings and want to override them in a particular project.
+You can set the `local` parameter in the [elementname]#properties# section of your [filename]#pom.xml#:
+
+[source, xml]
----
-<module>
-</module>
+<properties>
+ ...
+ <vaadin.widgetset.mode>local</vaadin.widgetset.mode>
+</properties>
+...
----
-[[addons.maven.widgetset.web]]
-=== Enabling the Widget Set in the UI
-If you have previously used the default widget set in the project, you need to
-enable the project widget set in the [filename]#web.xml# deployment descriptor.
-Edit the [filename]#src/main/webapp/WEB-INF/web.xml# file and add or modify the
-[literal]#++widgetset++# parameter for the servlet as follows.
+[[addons.maven.modes.cdn]]
+=== Online Widget Set Compilation and CDN
-[subs="normal"]
+The online compilation service makes it easier to use add-on components in Vaadin applications, by avoiding compilation of widget sets locally.
+It caches the widget sets, so often one is available immediately.
+A widget set can combine widgets from multiple add-ons and if a particular combination does not already exist, the service automatically compiles it.
+
+.Online widget set compilation and CDN
+image::img/widgetset-mode-cdn.png[width=80%, scaledwidth=100%]
+
+The CDN (Content Delivery Network) is a global network of web servers that serve the cached widget sets directly when you load your application in your browser.
+Avoiding local compilation can speed up development significantly.
+In development teams, all can use the shared widget sets immediately.
+
+[TIP]
+====
+While this gives benefits, the application will not work without online connnectivity.
+When you need to avoid the demo effect, either use the `local` or `fetch` mode.
+====
+
+The cloud service compiles a widget set with a given Vaadin version and a list of add-ons installed in your project.
+The Maven plug-in receives a public URL where the widget set is available and generates an [filename]#AppWidgetset.java# file that configures your application to use the online version.
+The file is generated to the default Java package.
+
+[NOTE]
+====
+Online compilation and CDN can only be used with publicly available add-ons.
+This means that the add-on dependencies must be available in the Maven central repository or in the Vaadin add-ons or pre-releases repositories.
+If you have custom widget implementations or non-public add-ons in your sources, you cannot use the online compilation and CDN service.
+====
+
+==== Enabling Compilation
+
+To enable online compilation and delivery from the CDN, set the widget set mode to `cdn` in the [elementname]#properties# section of your [filename]#pom.xml#:
+
+[source, xml]
----
-&lt;servlet&gt;
- ...
- &lt;init-param&gt;
- &lt;description&gt;Widget Set to Use&lt;/description&gt;
- &lt;param-name&gt;widgetset&lt;/param-name&gt;
- &lt;param-value&gt;**com.example.AppWidgetSet**&lt;/param-value&gt;
- &lt;/init-param&gt;
-&lt;/servlet&gt;
+<properties>
+ ...
+ <vaadin.widgetset.mode>cdn</vaadin.widgetset.mode>
+</properties>
+...
----
-The parameter is the class name of the widget set, that is, without the
-[filename]#.gwt.xml# extension and with the Java dot notation for class names
-that include the package name.
+When using the online compilation service, a [interfacename]#WidgetsetInfo# implementation is generated for your project; this makes it possible for your application to find the widget set from the correct location.
+[NOTE]
+====
+*The CDN is not meant to be used in production.*
-(((range="endofrange", startref="term.addons.maven")))
+It is are meant for speeding up development for yourself and your team.
+It is also useful if you maintain your source code in GitHub or a similar service, so that your globally working development team can immediately use the widget sets without need to compile them.
+
+For production, especially in intranet applications, you should normally use the `local` or `fetch` modes.
+This ensures that separating the availability of the Vaadin CDN service from availability of the application server does not add an extra point of failure.
+
+_They can be be used for production_ if your application is intended as globally available, you want to gain the global delivery benefit of the Vaadin CDN, and the availability tradeoff is not significant.
+====
+
+=== Serving Remotely Compiled Widget Set Locally
+
+If you want to use online compilation, but still serve the files as part of your application, you can use the `fetch` mode.
+
+.Fetching online widget set compilation
+image::img/widgetset-mode-fetch.png[width=80%, scaledwidth=100%]
+The Maven plugin downloads the compiled widget set into the project as it was compiled locally.
+It generates an [classname]#AppWidgetset# class and used to provide a correct URL to the locally stored widget set.
+To enable the fetch mode, in the [elementname]#properties# section of your [filename]#pom.xml#:
+
+[source, xml]
+----
+<properties>
+ ...
+ <vaadin.widgetset.mode>fetch</vaadin.widgetset.mode>
+</properties>
+...
+----
+
+// TODO This is recommended during development, as it avoids slow local compilation and typically.
+
+(((range="endofrange", startref="term.addons.maven")))
diff --git a/documentation/addons/addons-overview.asciidoc b/documentation/addons/addons-overview.asciidoc
index 39d699fc08..3a66bfc0d8 100644
--- a/documentation/addons/addons-overview.asciidoc
+++ b/documentation/addons/addons-overview.asciidoc
@@ -13,15 +13,24 @@ link:http://vaadin.com/directory/[Vaadin Directory] provides a rich collection
of add-ons for Vaadin, and you may find others from independent sources. Add-ons
are also one way to share your own components between projects.
-Installation of add-ons from Vaadin Directory is simple, just adding an Ivy or
-Maven dependency, or downloading the JAR package and and dropping it in the web
-library folder of the project. Most add-ons include a widget set, which you need
-to compile, but it's usually just a click of a button or a single command.
+== Installing
-After trying out an add-on, you can give some feedback to the author of the
-add-on by rating the add-on with one to five stars and optionally leaving a
-comment. Most add-ons also have a discussion forum thread for user feedback and
-questions.
+Installing add-ons from Vaadin Directory is simple, just adding a Maven or an Ivy dependency, or downloading the JAR package and and dropping it in the web library folder of the project.
+
+[[figure.addons.maven.widgetset]]
+.Role of the widget set
+image::img/addon-architecture.png[width=75%, scaledwidth=80%]
+
+Most add-ons include _widgets_, client-side counterparts of the server-side components used in the Vaadin Java API, as illustrated in <<figure.addons.maven.widgetset>>.
+The _widget set_ needs to be compiled into the application widget set.
+
+Adding the dependency in Maven projects and compiling the widget set is described in <<addons-maven#addons.maven, "Using Add-ons in a Maven Project">>.
+The section also describes how to use the online compilation and CDN services during development.
+
+For Eclipse projects that use Ivy for dependency management, see <<addons-eclipse#addons.eclipse, "Installing Add-ons in Eclipse with Ivy">>.
+You can also download and install add-ons from a ZIP-package, as described in <<addons-downloading#addons.downloading, "Downloading Add-ons from Vaadin Directory">>.
+
+== Add-on Licenses
Add-ons available from Vaadin Directory are distributed under different
licenses, of which some are commercial. While the add-ons can be downloaded
@@ -30,8 +39,11 @@ offered under a dual licensing agreement so that they can be used in open source
projects for free, and many have a trial period for closed-source development.
Commercial Vaadin add-ons distributed under the CVAL license require installing
a license key as instructed in
-<<dummy/../../../framework/addons/addons-cval#addons.cval,"Installing Commercial
-Vaadin Add-on Licence">>.
-
+<<dummy/../../../framework/addons/addons-cval#addons.cval, "Installing Commercial Vaadin Add-on Licence">>.
+== Feedback and Support
+After trying out an add-on, you can give some feedback to the author of the
+add-on by rating the add-on with one to five stars and optionally leaving a
+comment. Most add-ons also have a discussion forum thread for user feedback and
+questions.
diff --git a/documentation/addons/chapter-addons.asciidoc b/documentation/addons/chapter-addons.asciidoc
index 4319e43456..dd432abdcc 100644
--- a/documentation/addons/chapter-addons.asciidoc
+++ b/documentation/addons/chapter-addons.asciidoc
@@ -5,15 +5,16 @@ This chapter describes the installation of add-on components, themes,
containers, and other tools from the Vaadin Directory and the use of commercial
add-ons offered by Vaadin.
-
include::addons-overview.asciidoc[leveloffset=+2]
-include::addons-downloading.asciidoc[leveloffset=+2]
-
-include::addons-eclipse.asciidoc[leveloffset=+2]
-
include::addons-maven.asciidoc[leveloffset=+2]
include::addons-cval.asciidoc[leveloffset=+2]
+// Outdated for the print edition
+// include::addons-eclipse.asciidoc[leveloffset=+2]
+
+// Irrelevant for the print edition
+// include::addons-downloading.asciidoc[leveloffset=+2]
+
include::addons-troubleshooting.asciidoc[leveloffset=+2]
diff --git a/documentation/addons/img/addon-architecture.png b/documentation/addons/img/addon-architecture.png
new file mode 100644
index 0000000000..dc73899cb5
--- /dev/null
+++ b/documentation/addons/img/addon-architecture.png
Binary files differ
diff --git a/documentation/addons/img/directory-activate.png b/documentation/addons/img/directory-activate.png
new file mode 100644
index 0000000000..15681d6ab7
--- /dev/null
+++ b/documentation/addons/img/directory-activate.png
Binary files differ
diff --git a/documentation/addons/img/directory-install.png b/documentation/addons/img/directory-install.png
new file mode 100644
index 0000000000..d687e26979
--- /dev/null
+++ b/documentation/addons/img/directory-install.png
Binary files differ
diff --git a/documentation/addons/img/directory-maven-pom.png b/documentation/addons/img/directory-maven-pom.png
index 720d4b089c..624583b43f 100644
--- a/documentation/addons/img/directory-maven-pom.png
+++ b/documentation/addons/img/directory-maven-pom.png
Binary files differ
diff --git a/documentation/addons/img/directory-version.png b/documentation/addons/img/directory-version.png
new file mode 100644
index 0000000000..7217218a3f
--- /dev/null
+++ b/documentation/addons/img/directory-version.png
Binary files differ
diff --git a/documentation/addons/img/online-compilation-cdn.png b/documentation/addons/img/online-compilation-cdn.png
new file mode 100644
index 0000000000..63328013ef
--- /dev/null
+++ b/documentation/addons/img/online-compilation-cdn.png
Binary files differ
diff --git a/documentation/addons/img/widgetset-compiling-toolbar-hi.png b/documentation/addons/img/widgetset-compiling-toolbar-hi.png
deleted file mode 100644
index 79e14ec60e..0000000000
--- a/documentation/addons/img/widgetset-compiling-toolbar-hi.png
+++ /dev/null
Binary files differ
diff --git a/documentation/addons/img/widgetset-compiling-toolbar-lo.png b/documentation/addons/img/widgetset-compiling-toolbar-lo.png
deleted file mode 100644
index 70b3e9bfb4..0000000000
--- a/documentation/addons/img/widgetset-compiling-toolbar-lo.png
+++ /dev/null
Binary files differ
diff --git a/documentation/addons/img/widgetset-compiling-toolbar.png b/documentation/addons/img/widgetset-compiling-toolbar.png
index 853b2c457c..8a77aaaf58 100644
--- a/documentation/addons/img/widgetset-compiling-toolbar.png
+++ b/documentation/addons/img/widgetset-compiling-toolbar.png
Binary files differ
diff --git a/documentation/addons/img/widgetset-mode-cdn.png b/documentation/addons/img/widgetset-mode-cdn.png
new file mode 100644
index 0000000000..ad6c7a4d78
--- /dev/null
+++ b/documentation/addons/img/widgetset-mode-cdn.png
Binary files differ
diff --git a/documentation/addons/img/widgetset-mode-fetch.png b/documentation/addons/img/widgetset-mode-fetch.png
new file mode 100644
index 0000000000..9963c2ca08
--- /dev/null
+++ b/documentation/addons/img/widgetset-mode-fetch.png
Binary files differ
diff --git a/documentation/addons/img/widgetset-mode-local.png b/documentation/addons/img/widgetset-mode-local.png
new file mode 100644
index 0000000000..be18515d35
--- /dev/null
+++ b/documentation/addons/img/widgetset-mode-local.png
Binary files differ
diff --git a/documentation/addons/img/widgetset-modes.png b/documentation/addons/img/widgetset-modes.png
new file mode 100644
index 0000000000..768aa59e50
--- /dev/null
+++ b/documentation/addons/img/widgetset-modes.png
Binary files differ
diff --git a/documentation/addons/original-drawings/Makefile b/documentation/addons/original-drawings/Makefile
new file mode 100644
index 0000000000..9736c8b5ea
--- /dev/null
+++ b/documentation/addons/original-drawings/Makefile
@@ -0,0 +1,13 @@
+IMAGES = widgetset-modes widgetset-mode-cdn widgetset-mode-local \
+ widgetset-mode-fetch addon-architecture
+
+SRCIMAGES := $(foreach file, $(IMAGES), $(file).svg)
+TRGIMAGES := $(foreach file, $(IMAGES), ../img/$(file).png)
+
+images: $(TRGIMAGES) FORCE
+# Just do low now $(TRGIMAGES_LO)
+
+$(TRGIMAGES): ../img/%.png: %.svg
+ inkscape --export-png $@ --export-dpi=300 --export-area-page $<
+
+FORCE:
diff --git a/documentation/addons/original-drawings/addon-architecture.svg b/documentation/addons/original-drawings/addon-architecture.svg
new file mode 100644
index 0000000000..83dd192cf7
--- /dev/null
+++ b/documentation/addons/original-drawings/addon-architecture.svg
@@ -0,0 +1,513 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="260"
+ height="130"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r"
+ sodipodi:docname="addon-architecture.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/magi/itmill/toolkit5/doc/manual/original-drawings/intro/architecture.png"
+ inkscape:export-xdpi="300"
+ inkscape:export-ydpi="300"
+ version="1.1">
+ <defs
+ id="defs1903">
+ <marker
+ id="marker18095"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective110" />
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutL"
+ style="overflow:visible">
+ <path
+ id="path3520"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ id="linearGradient3503">
+ <stop
+ style="stop-color:#37ff40;stop-opacity:0.53608245;"
+ offset="0"
+ id="stop3505" />
+ <stop
+ style="stop-color:#ffe0e0;stop-opacity:1;"
+ offset="1"
+ id="stop3507" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path6743"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(1.1,0,0,1.1,1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ id="linearGradient19816">
+ <stop
+ id="stop19818"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop19820"
+ offset="1"
+ style="stop-color:#e7e790;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11516">
+ <stop
+ id="stop11518"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop11520"
+ offset="1"
+ style="stop-color:#a090e7;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11508">
+ <stop
+ id="stop11510"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop11512"
+ offset="1"
+ style="stop-color:#e27979;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3286">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3288" />
+ <stop
+ style="stop-color:#79e291;stop-opacity:1;"
+ offset="1"
+ id="stop3290" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path16811"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8"
+ inkscape:cx="164.39568"
+ inkscape:cy="59.7456"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ gridtolerance="10000"
+ inkscape:window-width="1672"
+ inkscape:window-height="1019"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:showpageshadow="false"
+ borderlayer="false"
+ showgrid="true"
+ inkscape:window-maximized="0"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-bbox="true"
+ inkscape:object-nodes="true"
+ inkscape:object-paths="true"
+ units="pt">
+ <inkscape:grid
+ type="xygrid"
+ id="grid6362"
+ visible="true"
+ enabled="true"
+ empspacing="5"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="-50,130"
+ id="guide3154" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata1906">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Taso 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="opacity:1"
+ transform="translate(0,-922.36211)">
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect6815"
+ width="85"
+ height="119.99995"
+ x="110"
+ y="927.36212"
+ ry="3.7880721" />
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
+ id="rect3810"
+ width="75"
+ height="119.99995"
+ x="30"
+ y="927.36212"
+ ry="3.7880721" />
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
+ id="rect6791"
+ width="55"
+ height="119.99995"
+ x="200"
+ y="927.36212"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(317.36739,662.01687)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none"
+ id="flowRoot9963-2-3-6"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9965-2-7-7"><rect
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ y="271.51425"
+ x="-113.13708"
+ height="51.315746"
+ width="68.012077"
+ id="rect9967-3-5-6" /></flowRegion><flowPara
+ id="flowPara10992">UI Logic</flowPara></flowRoot> <g
+ id="g6827-8"
+ transform="matrix(0.06329721,0,0,0.06329721,199.30626,995.21824)">
+ <g
+ transform="matrix(29.999985,-0.03019888,0.03019888,29.999985,-11004.945,-15375.022)"
+ id="g6829-7">
+ <g
+ id="g6831-7"
+ transform="matrix(0.71644053,0,0,0.71644053,103.9698,144.62879)"
+ style="fill:#ffffff;fill-opacity:1">
+ <path
+ id="path6833-7"
+ d="M 142.5625,-6.4375 40.6875,-6.34375 C 29.868538,-6.48507 19.811533,-0.790227 14.367338,8.560208 8.9231424,17.910644 8.9351814,29.468085 14.398845,38.807157 19.862509,48.14623 29.931356,53.820109 40.75,53.65625 L 142.625,53.5625 c 10.81896,0.14132 20.87597,-5.553523 26.32016,-14.903958 5.4442,-9.350436 5.43216,-20.907877 -0.0315,-30.246949 C 163.44999,-0.92748 153.38114,-6.601359 142.5625,-6.4375 l 0,0 z"
+ style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ transform="matrix(0.03333332,3.3554312e-5,-3.3554312e-5,0.03333332,366.53421,512.86995)"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path6835-3"
+ d="m 366.65701,514.67289 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#a0a0a0;fill-opacity:0.75384617;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
+ id="rect4680-4-4-7-0"
+ width="175"
+ height="35.000011"
+ x="5"
+ y="977.36212"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(227.87246,661.85916)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.75px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none"
+ id="flowRoot9963-2-3"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9965-2-7"><rect
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.75px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ y="271.51425"
+ x="-113.13708"
+ height="37.315746"
+ width="95.012077"
+ id="rect9967-3-5" /></flowRegion><flowPara
+ id="flowPara4438">Server-side API</flowPara></flowRoot> <rect
+ ry="3.7880721"
+ y="942.36218"
+ x="120"
+ height="95.000008"
+ width="70"
+ id="rect4680-4-4-7-0-9"
+ style="display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" />
+ <g
+ transform="translate(93.189487,766.92955)"
+ id="g28403-3-5-6-2">
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect4680-7-10-5-0"
+ width="60"
+ height="25"
+ x="21.810513"
+ y="180.43254"
+ ry="3.7880721" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot11361-6-1-8-1-4"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ transform="translate(-787.43047,-878.23713)"
+ inkscape:export-filename="/home/magi/itmill/toolkit5/doc/manual/img/intro/toolchain.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><flowRegion
+ id="flowRegion11363-2-0-7-7-9"><rect
+ id="rect11365-5-4-6-4-2"
+ width="138.69197"
+ height="47.876488"
+ x="813.87988"
+ y="1064.3831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" /></flowRegion><flowPara
+ id="flowPara4198-9-0">Built-in</flowPara><flowPara
+ id="flowPara4300-0">Components</flowPara></flowRoot> </g>
+ <g
+ transform="translate(93.189487,801.92955)"
+ id="g28403-3-5-6-6-7">
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#4fb047;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect4680-7-10-5-5-8"
+ width="60"
+ height="25"
+ x="21.810513"
+ y="180.43254"
+ ry="3.7880721" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot11361-6-1-8-1-1-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ transform="translate(-787.52461,-878.4214)"
+ inkscape:export-filename="/home/magi/itmill/toolkit5/doc/manual/img/intro/toolchain.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><flowRegion
+ id="flowRegion11363-2-0-7-7-5-3"><rect
+ id="rect11365-5-4-6-4-5-9"
+ width="138.69197"
+ height="47.876488"
+ x="813.87988"
+ y="1064.3831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" /></flowRegion><flowPara
+ id="flowPara4198-9-9-4">Add-on</flowPara><flowPara
+ id="flowPara4338-2">Components</flowPara></flowRoot> </g>
+ <g
+ transform="translate(93.189487,836.92955)"
+ id="g28403-3-5-6-6-6-5">
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:1.5, 1.5;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect4680-7-10-5-5-9-2"
+ width="60"
+ height="25"
+ x="21.810513"
+ y="180.43254"
+ ry="3.7880721" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot11361-6-1-8-1-1-4-4"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ transform="translate(-787.52461,-878.4214)"
+ inkscape:export-filename="/home/magi/itmill/toolkit5/doc/manual/img/intro/toolchain.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><flowRegion
+ id="flowRegion11363-2-0-7-7-5-8-5"><rect
+ id="rect11365-5-4-6-4-5-7-3"
+ width="138.69197"
+ height="47.876488"
+ x="813.87988"
+ y="1064.3831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" /></flowRegion><flowPara
+ id="flowPara4198-9-9-0-2">Custom</flowPara><flowPara
+ id="flowPara4338-0-3">Components</flowPara></flowRoot> </g>
+ <g
+ transform="matrix(-1.8989154,-0.0019115,-0.0019115,1.8989154,892.26083,22.007358)"
+ id="g6829-2-5">
+ <g
+ id="g6831-2-7"
+ transform="matrix(0.71644053,0,0,0.71644053,103.9698,144.62879)"
+ style="fill:#ffffff;fill-opacity:1">
+ <path
+ id="path6833-1-5"
+ d="M 142.5625,-6.4375 40.6875,-6.34375 C 29.868538,-6.48507 19.811533,-0.790227 14.367338,8.560208 8.9231424,17.910644 8.9351814,29.468085 14.398845,38.807157 19.862509,48.14623 29.931356,53.820109 40.75,53.65625 L 142.625,53.5625 c 10.81896,0.14132 20.87597,-5.553523 26.32016,-14.903958 5.4442,-9.350436 5.43216,-20.907877 -0.0315,-30.246949 C 163.44999,-0.92748 153.38114,-6.601359 142.5625,-6.4375 l 0,0 z"
+ style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ transform="matrix(0.03333332,3.3554312e-5,-3.3554312e-5,0.03333332,366.53421,512.86995)"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path6835-0-9"
+ d="m 366.65701,514.67289 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ transform="translate(28.189484,766.92954)"
+ id="g28403-3-5-6">
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect4680-7-10-5"
+ width="50"
+ height="25"
+ x="21.810513"
+ y="180.43254"
+ ry="3.7880721" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot11361-6-1-8-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ transform="translate(-787.43047,-878.23713)"
+ inkscape:export-filename="/home/magi/itmill/toolkit5/doc/manual/img/intro/toolchain.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><flowRegion
+ id="flowRegion11363-2-0-7-7"><rect
+ id="rect11365-5-4-6-4"
+ width="138.69197"
+ height="47.876488"
+ x="813.87988"
+ y="1064.3831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" /></flowRegion><flowPara
+ id="flowPara4198-9">Built-in</flowPara><flowPara
+ id="flowPara4300">Widgets</flowPara></flowRoot> </g>
+ <g
+ transform="translate(29.189484,836.92954)"
+ id="g28403-3-5-6-6-6">
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:1.5, 1.5;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect4680-7-10-5-5-9"
+ width="49"
+ height="24"
+ x="21.810513"
+ y="180.43254"
+ ry="3.7880721" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot11361-6-1-8-1-1-4"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ transform="translate(-787.52461,-878.4214)"
+ inkscape:export-filename="/home/magi/itmill/toolkit5/doc/manual/img/intro/toolchain.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><flowRegion
+ id="flowRegion11363-2-0-7-7-5-8"><rect
+ id="rect11365-5-4-6-4-5-7"
+ width="138.69197"
+ height="47.876488"
+ x="813.87988"
+ y="1064.3831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" /></flowRegion><flowPara
+ id="flowPara4198-9-9-0">Custom</flowPara><flowPara
+ id="flowPara4338-0">Widgets</flowPara></flowRoot> </g>
+ <flowRoot
+ transform="translate(148.55364,661.85916)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.75px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none"
+ id="flowRoot9963-2-3-6-8-6-1"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9965-2-7-7-1-9-6"><rect
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.75px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ y="271.51425"
+ x="-113.13708"
+ height="53.315746"
+ width="70.012077"
+ id="rect9967-3-5-6-4-7-9" /></flowRegion><flowPara
+ id="flowPara11082-4">Widget Set</flowPara></flowRoot> <g
+ transform="translate(28.189487,801.92955)"
+ id="g28403-3-5-6-6">
+ <rect
+ style="display:inline;overflow:visible;visibility:visible;fill:#4fb047;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect4680-7-10-5-5"
+ width="49"
+ height="24"
+ x="21.810513"
+ y="180.43254"
+ ry="3.7880721" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot11361-6-1-8-1-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1"
+ transform="translate(-787.52461,-878.4214)"
+ inkscape:export-filename="/home/magi/itmill/toolkit5/doc/manual/img/intro/toolchain.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><flowRegion
+ id="flowRegion11363-2-0-7-7-5"><rect
+ id="rect11365-5-4-6-4-5"
+ width="138.69197"
+ height="47.876488"
+ x="813.87988"
+ y="1064.3831"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1" /></flowRegion><flowPara
+ id="flowPara4198-9-9">Add-on</flowPara><flowPara
+ id="flowPara4338">Widgets</flowPara></flowRoot> </g>
+ <flowRoot
+ transform="translate(123.27856,712.26946)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.75px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+ id="flowRoot9963-2-3-1"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9965-2-7-8"><rect
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.75px;line-height:100%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1"
+ y="271.51425"
+ x="-113.13708"
+ height="37.315746"
+ width="95.012077"
+ id="rect9967-3-5-9" /></flowRegion><flowPara
+ id="flowPara10160-3">Add-on</flowPara></flowRoot> </g>
+</svg>
diff --git a/documentation/addons/original-drawings/widgetset-compiling-toolbar.svg b/documentation/addons/original-drawings/widgetset-compiling-toolbar.svg
deleted file mode 100644
index 780d401457..0000000000
--- a/documentation/addons/original-drawings/widgetset-compiling-toolbar.svg
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="210mm"
- height="297mm"
- id="svg1901"
- sodipodi:version="0.32"
- inkscape:version="0.46"
- sodipodi:docname="widgetset-compiling-toolbar.svg"
- sodipodi:docbase="/home/tsoots/ohj/translations/po"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- <defs
- id="defs1903">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- id="perspective7" />
- <inkscape:perspective
- id="perspective2499"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 526.18109 : 1"
- sodipodi:type="inkscape:persp3d" />
- <linearGradient
- y2="471.38400"
- y1="45.132561"
- xlink:href="#linearGradient7601"
- x2="1370.5586"
- x1="-526.86133"
- spreadMethod="reflect"
- inkscape:collect="always"
- id="linearGradient10877"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(8.892150e-2,0.000000,0.000000,0.155616,635.7169,9.380527)" />
- <linearGradient
- y2="471.38400"
- y1="45.132561"
- xlink:href="#linearGradient7601"
- x2="1370.5586"
- x1="-526.86133"
- spreadMethod="reflect"
- inkscape:collect="always"
- id="linearGradient10869"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.323979,0.000000,0.000000,0.566975,399.6324,14.15086)" />
- <linearGradient
- y2="471.38400"
- y1="45.132561"
- xlink:href="#linearGradient7601"
- x2="1370.5586"
- x1="-526.86133"
- spreadMethod="reflect"
- inkscape:collect="always"
- id="linearGradient7607"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.755921,0,0,1.32289,-36,0)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient7601">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop7603" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop7605" />
- </linearGradient>
- <inkscape:perspective
- id="perspective13602"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 526.18109 : 1"
- sodipodi:type="inkscape:persp3d" />
- <inkscape:perspective
- id="perspective2529"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 526.18109 : 1"
- sodipodi:type="inkscape:persp3d" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="2.8"
- inkscape:cx="295.42901"
- inkscape:cy="873.26277"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- gridtolerance="10000"
- inkscape:window-width="1333"
- inkscape:window-height="739"
- inkscape:window-x="1493"
- inkscape:window-y="131"
- showgrid="false" />
- <metadata
- id="metadata1906">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Taso 1"
- inkscape:groupmode="layer"
- id="layer1"
- style="opacity:1">
- <image
- y="116.93364"
- x="125.21431"
- id="image2501"
- height="48"
- width="281"
- sodipodi:absref="/home/magi/itmill/book-7/manual/img/addons/widgetset-compiling-toolbar.png"
- xlink:href="/home/magi/itmill/book-7/manual/img/addons/widgetset-compiling-toolbar.png" />
- <rect
- style="opacity:1;fill:#eeeff2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.0999999;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.29999998;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect2535"
- width="24.496172"
- height="16.667501"
- x="204.80843"
- y="122.51678" />
- <image
- y="122.34544"
- x="208.74406"
- id="image2531"
- height="17.262691"
- width="17.262691"
- sodipodi:absref="//home/magi/itmill/book-7/manual/img/addons/compile-widgetset-16.png"
- xlink:href="/home/magi/itmill/book-7/manual/img/addons/compile-widgetset-16.png"
- style="fill:#eeeff2;fill-opacity:1" />
- <g
- style="display:inline"
- inkscape:label="Layer 1"
- id="g13611"
- transform="matrix(2.4577007e-2,0,0,2.4577007e-2,218.45402,137.72183)">
- <g
- id="g1317">
- <path
- style="fill:url(#linearGradient7607);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
- id="path6080"
- d="M 70.29035,24.82601 L 70.29035,627.16976 L 105.72785,627.16976 L 105.72785,591.73226 L 141.16535,591.73226 L 141.16535,556.32601 L 176.5716,556.32601 L 176.5716,520.88851 L 212.0091,520.88851 L 247.4466,520.88851 L 247.4466,591.73226 L 282.8841,591.73226 L 282.8841,662.60726 L 318.3216,662.60726 L 318.3216,733.48226 L 353.7591,733.48226 L 353.7591,768.91976 L 424.60285,768.91976 L 424.60285,733.48226 L 460.04035,733.48226 L 460.04035,662.60726 L 424.60285,662.60726 L 424.60285,591.73226 L 389.1966,591.73226 L 389.1966,520.88851 L 353.7591,520.88851 L 353.7591,450.01351 L 495.47785,450.01351 L 495.47785,414.57601 L 460.04035,414.57601 L 460.04035,379.13851 L 424.60285,379.13851 L 424.60285,343.70101 L 389.1966,343.70101 L 389.1966,308.29476 L 353.7591,308.29476 L 353.7591,272.85726 L 318.3216,272.85726 L 318.3216,237.41976 L 282.8841,237.41976 L 282.8841,201.98226 L 247.4466,201.98226 L 247.4466,166.54476 L 212.0091,166.54476 L 212.0091,131.10726 L 176.5716,131.10726 L 176.5716,95.669761 L 141.16535,95.669761 L 141.16535,60.26351 L 105.72785,60.26351 L 105.72785,24.82601 L 70.29035,24.82601 z" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- id="rect1430"
- d="M 35.4375,24.8125 L 35.4375,627.15625 L 70.875,627.15625 L 70.875,591.71875 L 106.3125,591.71875 L 106.3125,556.3125 L 70.875,556.3125 L 70.875,95.65625 L 106.3125,95.65625 L 106.3125,60.25 L 70.875,60.25 L 70.875,24.8125 L 35.4375,24.8125 z M 106.3125,95.65625 L 106.3125,131.09375 L 141.71875,131.09375 L 141.71875,95.65625 L 106.3125,95.65625 z M 141.71875,131.09375 L 141.71875,166.53125 L 177.15625,166.53125 L 177.15625,131.09375 L 141.71875,131.09375 z M 177.15625,166.53125 L 177.15625,201.96875 L 212.59375,201.96875 L 212.59375,166.53125 L 177.15625,166.53125 z M 212.59375,201.96875 L 212.59375,237.40625 L 248.03125,237.40625 L 248.03125,201.96875 L 212.59375,201.96875 z M 248.03125,237.40625 L 248.03125,272.84375 L 283.46875,272.84375 L 283.46875,237.40625 L 248.03125,237.40625 z M 283.46875,272.84375 L 283.46875,308.28125 L 318.90625,308.28125 L 318.90625,272.84375 L 283.46875,272.84375 z M 318.90625,308.28125 L 318.90625,343.6875 L 354.34375,343.6875 L 354.34375,308.28125 L 318.90625,308.28125 z M 354.34375,343.6875 L 354.34375,379.125 L 389.75,379.125 L 389.75,343.6875 L 354.34375,343.6875 z M 389.75,379.125 L 389.75,414.5625 L 283.46875,414.5625 L 283.46875,450 L 283.46875,520.875 L 318.90625,520.875 L 318.90625,450 L 460.625,450 L 460.625,414.5625 L 425.1875,414.5625 L 425.1875,379.125 L 389.75,379.125 z M 318.90625,520.875 L 318.90625,591.71875 L 354.34375,591.71875 L 354.34375,520.875 L 318.90625,520.875 z M 354.34375,591.71875 L 354.34375,662.59375 L 389.75,662.59375 L 389.75,591.71875 L 354.34375,591.71875 z M 389.75,662.59375 L 389.75,733.46875 L 425.1875,733.46875 L 425.1875,662.59375 L 389.75,662.59375 z M 389.75,733.46875 L 318.90625,733.46875 L 318.90625,768.90625 L 389.75,768.90625 L 389.75,733.46875 z M 318.90625,733.46875 L 318.90625,662.59375 L 283.46875,662.59375 L 283.46875,733.46875 L 318.90625,733.46875 z M 283.46875,662.59375 L 283.46875,591.71875 L 248.03125,591.71875 L 248.03125,662.59375 L 283.46875,662.59375 z M 248.03125,591.71875 L 248.03125,520.875 L 212.59375,520.875 L 212.59375,591.71875 L 248.03125,591.71875 z M 212.59375,520.875 L 212.59375,450 L 177.15625,450 L 177.15625,485.4375 L 141.71875,485.4375 L 141.71875,520.875 L 177.15625,520.875 L 212.59375,520.875 z M 141.71875,520.875 L 106.3125,520.875 L 106.3125,556.3125 L 141.71875,556.3125 L 141.71875,520.875 z" />
- <path
- style="fill:#ffffff;fill-opacity:1;stroke:none"
- id="rect3779"
- d="M 70.875,95.65625 L 70.875,556.3125 L 106.3125,556.3125 L 106.3125,520.875 L 141.71875,520.875 L 141.71875,485.4375 L 177.15625,485.4375 L 177.15625,450 L 212.59375,450 L 212.59375,520.875 L 248.03125,520.875 L 248.03125,591.71875 L 283.46875,591.71875 L 283.46875,662.59375 L 318.90625,662.59375 L 318.90625,733.46875 L 354.34375,733.46875 L 389.75,733.46875 L 389.75,662.59375 L 354.34375,662.59375 L 354.34375,591.71875 L 318.90625,591.71875 L 318.90625,520.875 L 283.46875,520.875 L 283.46875,414.5625 L 318.90625,414.5625 L 354.34375,414.5625 L 389.75,414.5625 L 389.75,379.125 L 354.34375,379.125 L 354.34375,343.6875 L 318.90625,343.6875 L 318.90625,308.28125 L 283.46875,308.28125 L 283.46875,272.84375 L 248.03125,272.84375 L 248.03125,237.40625 L 212.59375,237.40625 L 212.59375,201.96875 L 177.15625,201.96875 L 177.15625,166.53125 L 141.71875,166.53125 L 141.71875,131.09375 L 106.3125,131.09375 L 106.3125,95.65625 L 70.875,95.65625 z" />
- </g>
- </g>
- </g>
-</svg>
diff --git a/documentation/addons/original-drawings/widgetset-mode-cdn.svg b/documentation/addons/original-drawings/widgetset-mode-cdn.svg
new file mode 100644
index 0000000000..aece217d72
--- /dev/null
+++ b/documentation/addons/original-drawings/widgetset-mode-cdn.svg
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="82mm"
+ height="38mm"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r"
+ sodipodi:docname="widgetset-mode-cdn.svg"
+ version="1.1">
+ <defs
+ id="defs1903">
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4560"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <font
+ horiz-adv-x="1024"
+ id="font3118"
+ inkscape:label="fontti 1"
+ horiz-origin-x="0"
+ horiz-origin-y="0"
+ vert-origin-x="45"
+ vert-origin-y="90"
+ vert-adv-y="90">
+ <font-face
+ units-per-em="1024"
+ id="font-face3120"
+ font-family="SVGFont 1" />
+ <missing-glyph
+ d="M0,0h1000v1024h-1000z"
+ id="missing-glyph3122" />
+ </font>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-6"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-1"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-5"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-0"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-0"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-03"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-0-1"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-03-0"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="151.15665"
+ inkscape:cy="80.517444"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1920"
+ inkscape:window-height="1060"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ showgrid="true"
+ inkscape:window-maximized="1"
+ inkscape:snap-center="true"
+ inkscape:snap-grids="true"
+ inkscape:snap-bbox="true"
+ inkscape:object-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-object-midpoints="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ fit-margin-top="5"
+ fit-margin-left="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ units="mm">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2982"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="5px"
+ spacingy="5px"
+ originx="-124.5px"
+ originy="-294.50073px" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="102.82143,174.42784"
+ id="guide3116" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="203.53571,173.53498"
+ id="guide3120" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata1906">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Taso 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-124.5,-623.21581)">
+ <g
+ transform="translate(99.811386,-32.853903)"
+ id="g3868">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806"
+ width="110"
+ height="124.99994"
+ x="30.188614"
+ y="660.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(17.799604,303.91022)"><flowRegion
+ id="flowRegion3810"><rect
+ id="rect3812"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ id="flowPara3820"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start">Development workstation</flowPara></flowRoot> <g
+ transform="translate(5.0000001,17.499998)"
+ id="g3868-81-40">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3"
+ width="85"
+ height="19.999989"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2"><rect
+ id="rect3812-4-3"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1">Vaadin Project</flowPara></flowRoot> </g>
+ <g
+ transform="translate(5.0000001,52.499998)"
+ id="g3868-81-40-5">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3-6"
+ width="85"
+ height="19.999989"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2-1"><rect
+ id="rect3812-4-3-5"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1-4">Application Server</flowPara></flowRoot> </g>
+ <g
+ transform="translate(5.0000001,87.5)"
+ id="g3868-81-40-5-8">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3-6-3"
+ width="85"
+ height="19.999987"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2-1-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2-1-0"><rect
+ id="rect3812-4-3-5-3"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1-4-0">Browser</flowPara></flowRoot> </g>
+ </g>
+ <g
+ transform="translate(269.81139,-27.853905)"
+ id="g3868-81">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2"
+ width="80"
+ height="35"
+ x="30.188614"
+ y="675.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.369364,319.99189)"><flowRegion
+ id="flowRegion3810-0"><rect
+ id="rect3812-4"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ id="flowPara3820-5"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start">Compilation</flowPara><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337">Service</flowPara></flowRoot> </g>
+ <g
+ transform="translate(269.81139,22.146095)"
+ id="g3868-81-4">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-6"
+ width="80"
+ height="35"
+ x="30.188614"
+ y="675.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-9"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.369364,319.99189)"><flowRegion
+ id="flowRegion3810-0-0"><rect
+ id="rect3812-4-7"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-6">CDN</flowPara></flowRoot> </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 385.20177,732.76568 c -5.33249,10.013 -20.30329,4.74747 -20.30329,4.74747 0,0 -0.38727,5.44989 -9.89848,7.0203 -9.51121,1.57042 -15,-5 -15,-5 0,0 -10,5 -20,5 -10,0 -15,-5 -15,-5 0,0 -15,0 -20,-10 -5,-9.99999 0,-20 0,-20 0,0 -9.85188,-7.87601 -10,-20 -0.14811,-12.12399 10,-20 10,-20 0,0 -5.58058,-7.42386 -0.58058,-17.42386 5,-10 20.58058,-7.57614 20.58058,-7.57614 0,0 4.7343,-9.51543 15,-10 10.2657,-0.48456 16.01015,8.03046 16.01015,8.03046 0,0 4.15094,-7.78741 18.98985,-8.03046 14.83891,-0.24305 17.94497,9.99264 17.94497,9.99264 0,0 12.05503,-4.99263 17.05503,5.00736 5,10 -5,20 -5,20 0,0 8.22164,8.29922 8.283,20.25254 0.0614,11.95333 -8.283,19.74746 -8.283,19.74746 0,0 5.53426,13.21924 0.20177,23.23223 z"
+ id="path4376"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zczczczczczczczczczcz" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL)"
+ d="m 340,682.36222 0,15"
+ id="path4394"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8)"
+ d="m 300,717.36219 -80,15.00002"
+ id="path4394-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8)"
+ d="m 220,667.36221 80,-2e-5"
+ id="path4394-3-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-9-5-9"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(238.22879,363.06658)"><flowRegion
+ id="flowRegion3810-0-0-3-4"><rect
+ id="rect3812-4-7-8-5"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-6-6-7">cdn</flowPara></flowRoot> <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-0)"
+ d="m 170,677.36222 0,15"
+ id="path4394-3-2-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-0-1)"
+ d="m 170,712.36222 0,15"
+ id="path4394-3-2-6-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/documentation/addons/original-drawings/widgetset-mode-fetch.svg b/documentation/addons/original-drawings/widgetset-mode-fetch.svg
new file mode 100644
index 0000000000..3b9178671b
--- /dev/null
+++ b/documentation/addons/original-drawings/widgetset-mode-fetch.svg
@@ -0,0 +1,403 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="82mm"
+ height="38mm"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r"
+ sodipodi:docname="widgetset-mode-fetch.svg"
+ version="1.1">
+ <defs
+ id="defs1903">
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4560"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <font
+ horiz-adv-x="1024"
+ id="font3118"
+ inkscape:label="fontti 1"
+ horiz-origin-x="0"
+ horiz-origin-y="0"
+ vert-origin-x="45"
+ vert-origin-y="90"
+ vert-adv-y="90">
+ <font-face
+ units-per-em="1024"
+ id="font-face3120"
+ font-family="SVGFont 1" />
+ <missing-glyph
+ d="M0,0h1000v1024h-1000z"
+ id="missing-glyph3122" />
+ </font>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-6"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-1"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-5"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-0"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-0"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-03"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-0-1"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-03-0"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="170.09701"
+ inkscape:cy="58.04155"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1920"
+ inkscape:window-height="1060"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ showgrid="true"
+ inkscape:window-maximized="1"
+ inkscape:snap-center="true"
+ inkscape:snap-grids="true"
+ inkscape:snap-bbox="true"
+ inkscape:object-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-object-midpoints="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ fit-margin-top="5"
+ fit-margin-left="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ units="mm">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2982"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="5px"
+ spacingy="5px"
+ originx="-124.5px"
+ originy="-294.50073px" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="102.82143,174.42784"
+ id="guide3116" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="203.53571,173.53498"
+ id="guide3120" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata1906">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Taso 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-124.5,-623.21581)">
+ <g
+ transform="translate(99.811386,-32.853903)"
+ id="g3868">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806"
+ width="110"
+ height="124.99994"
+ x="30.188614"
+ y="660.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(17.799604,303.91022)"><flowRegion
+ id="flowRegion3810"><rect
+ id="rect3812"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ id="flowPara3820"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start">Development workstation</flowPara></flowRoot> <g
+ transform="translate(5.0000001,17.499998)"
+ id="g3868-81-40">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3"
+ width="85"
+ height="19.999989"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2"><rect
+ id="rect3812-4-3"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1">Vaadin Project</flowPara></flowRoot> </g>
+ <g
+ transform="translate(5.0000001,52.499998)"
+ id="g3868-81-40-5">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3-6"
+ width="85"
+ height="19.999989"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2-1"><rect
+ id="rect3812-4-3-5"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1-4">Application Server</flowPara></flowRoot> </g>
+ <g
+ transform="translate(5.0000001,87.5)"
+ id="g3868-81-40-5-8">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3-6-3"
+ width="85"
+ height="19.999987"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2-1-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2-1-0"><rect
+ id="rect3812-4-3-5-3"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1-4-0">Browser</flowPara></flowRoot> </g>
+ </g>
+ <g
+ transform="translate(269.81139,-27.853905)"
+ id="g3868-81">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2"
+ width="80"
+ height="35"
+ x="30.188614"
+ y="675.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.369364,319.99189)"><flowRegion
+ id="flowRegion3810-0"><rect
+ id="rect3812-4"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ id="flowPara3820-5"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start">Compilation</flowPara><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337">Service</flowPara></flowRoot> </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 385.20177,732.76568 c -5.33249,10.013 -20.30329,4.74747 -20.30329,4.74747 0,0 -0.38727,5.44989 -9.89848,7.0203 -9.51121,1.57042 -15,-5 -15,-5 0,0 -10,5 -20,5 -10,0 -15,-5 -15,-5 0,0 -15,0 -20,-10 -5,-9.99999 0,-20 0,-20 0,0 -9.85188,-7.87601 -10,-20 -0.14811,-12.12399 10,-20 10,-20 0,0 -5.58058,-7.42386 -0.58058,-17.42386 5,-10 20.58058,-7.57614 20.58058,-7.57614 0,0 4.7343,-9.51543 15,-10 10.2657,-0.48456 16.01015,8.03046 16.01015,8.03046 0,0 4.15094,-7.78741 18.98985,-8.03046 14.83891,-0.24305 17.94497,9.99264 17.94497,9.99264 0,0 12.05503,-4.99263 17.05503,5.00736 5,10 -5,20 -5,20 0,0 8.22164,8.29922 8.283,20.25254 0.0614,11.95333 -8.283,19.74746 -8.283,19.74746 0,0 5.53426,13.21924 0.20177,23.23223 z"
+ id="path4376"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zczczczczczczczczczcz" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8)"
+ d="m 220,667.36221 80,-2e-5"
+ id="path4394-3-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-9)"
+ d="m 300,677.36222 -80,19.99999"
+ id="path4394-3-2-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-9-5-9-9"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(232.16455,328.36412)"><flowRegion
+ id="flowRegion3810-0-0-3-4-9"><rect
+ id="rect3812-4-7-8-5-1"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-6-6-7-4">fetch</flowPara></flowRoot> <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-0)"
+ d="m 170,677.36222 0,15"
+ id="path4394-3-2-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-0-1)"
+ d="m 170,712.36222 0,15"
+ id="path4394-3-2-6-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/documentation/addons/original-drawings/widgetset-mode-local.svg b/documentation/addons/original-drawings/widgetset-mode-local.svg
new file mode 100644
index 0000000000..13eaa66a7f
--- /dev/null
+++ b/documentation/addons/original-drawings/widgetset-mode-local.svg
@@ -0,0 +1,357 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="82mm"
+ height="38mm"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r"
+ sodipodi:docname="widgetset-mode-local.svg"
+ version="1.1">
+ <defs
+ id="defs1903">
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4560"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <font
+ horiz-adv-x="1024"
+ id="font3118"
+ inkscape:label="fontti 1"
+ horiz-origin-x="0"
+ horiz-origin-y="0"
+ vert-origin-x="45"
+ vert-origin-y="90"
+ vert-adv-y="90">
+ <font-face
+ units-per-em="1024"
+ id="font-face3120"
+ font-family="SVGFont 1" />
+ <missing-glyph
+ d="M0,0h1000v1024h-1000z"
+ id="missing-glyph3122" />
+ </font>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-6"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-1"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-5"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-0"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-0"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-03"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-0-1"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-03-0"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8"
+ inkscape:cx="1.0961127"
+ inkscape:cy="76.167833"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1920"
+ inkscape:window-height="1060"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ showgrid="true"
+ inkscape:window-maximized="1"
+ inkscape:snap-center="true"
+ inkscape:snap-grids="true"
+ inkscape:snap-bbox="true"
+ inkscape:object-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-object-midpoints="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ fit-margin-top="5"
+ fit-margin-left="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ units="mm">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2982"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="5px"
+ spacingy="5px"
+ originx="-124.5px"
+ originy="-294.50073px" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="102.82143,174.42784"
+ id="guide3116" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="203.53571,173.53498"
+ id="guide3120" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata1906">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Taso 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-124.5,-623.21581)">
+ <g
+ transform="translate(99.811386,-32.853916)"
+ id="g3868">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806"
+ width="110"
+ height="124.99994"
+ x="30.188614"
+ y="660.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(17.799604,303.91022)"><flowRegion
+ id="flowRegion3810"><rect
+ id="rect3812"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ id="flowPara3820"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start">Development workstation</flowPara></flowRoot> <g
+ transform="translate(5.0000001,17.499998)"
+ id="g3868-81-40">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3"
+ width="85"
+ height="19.999989"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2"><rect
+ id="rect3812-4-3"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1">Vaadin Project</flowPara></flowRoot> </g>
+ <g
+ transform="translate(5.0000001,52.499998)"
+ id="g3868-81-40-5">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3-6"
+ width="85"
+ height="19.999989"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2-1"><rect
+ id="rect3812-4-3-5"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1-4">Application Server</flowPara></flowRoot> </g>
+ <g
+ transform="translate(5.0000001,87.5)"
+ id="g3868-81-40-5-8">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3-6-3"
+ width="85"
+ height="19.999987"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2-1-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2-1-0"><rect
+ id="rect3812-4-3-5-3"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1-4-0">Browser</flowPara></flowRoot> </g>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-9-5"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(126.40097,318.57165)"><flowRegion
+ id="flowRegion3810-0-0-3"><rect
+ id="rect3812-4-7-8"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-6-6">local</flowPara></flowRoot> <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-0)"
+ d="m 170,677.36221 0,15"
+ id="path4394-3-2-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-0-1)"
+ d="m 170,712.36221 0,15"
+ id="path4394-3-2-6-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/documentation/addons/original-drawings/widgetset-modes.svg b/documentation/addons/original-drawings/widgetset-modes.svg
new file mode 100644
index 0000000000..aeb4e73c4b
--- /dev/null
+++ b/documentation/addons/original-drawings/widgetset-modes.svg
@@ -0,0 +1,466 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="82mm"
+ height="38mm"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r"
+ sodipodi:docname="widgetset-modes.svg"
+ version="1.1">
+ <defs
+ id="defs1903">
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4560"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <font
+ horiz-adv-x="1024"
+ id="font3118"
+ inkscape:label="fontti 1"
+ horiz-origin-x="0"
+ horiz-origin-y="0"
+ vert-origin-x="45"
+ vert-origin-y="90"
+ vert-adv-y="90">
+ <font-face
+ units-per-em="1024"
+ id="font-face3120"
+ font-family="SVGFont 1" />
+ <missing-glyph
+ d="M0,0h1000v1024h-1000z"
+ id="missing-glyph3122" />
+ </font>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-6"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-1"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-5"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-0"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-0"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-03"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyTriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyTriangleOutL-8-8-0-1"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4560-2-6-03-0"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,-4.8,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="101.78544"
+ inkscape:cy="80.264906"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1920"
+ inkscape:window-height="1060"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ showgrid="true"
+ inkscape:window-maximized="1"
+ inkscape:snap-center="true"
+ inkscape:snap-grids="true"
+ inkscape:snap-bbox="true"
+ inkscape:object-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-object-midpoints="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ fit-margin-top="5"
+ fit-margin-left="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ units="mm">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2982"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="5px"
+ spacingy="5px"
+ originx="-124.5px"
+ originy="-294.50073px" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="102.82143,174.42784"
+ id="guide3116" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="203.53571,173.53498"
+ id="guide3120" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata1906">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Taso 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-124.5,-623.21581)">
+ <g
+ transform="translate(99.811386,-32.853903)"
+ id="g3868">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806"
+ width="110"
+ height="124.99994"
+ x="30.188614"
+ y="660.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(17.799604,303.91022)"><flowRegion
+ id="flowRegion3810"><rect
+ id="rect3812"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ id="flowPara3820"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start">Development workstation</flowPara></flowRoot> <g
+ transform="translate(5.0000001,17.499998)"
+ id="g3868-81-40">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3"
+ width="85"
+ height="19.999989"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2"><rect
+ id="rect3812-4-3"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1">Vaadin Project</flowPara></flowRoot> </g>
+ <g
+ transform="translate(5.0000001,52.499998)"
+ id="g3868-81-40-5">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3-6"
+ width="85"
+ height="19.999989"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2-1"><rect
+ id="rect3812-4-3-5"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1-4">Application Server</flowPara></flowRoot> </g>
+ <g
+ transform="translate(5.0000001,87.5)"
+ id="g3868-81-40-5-8">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-3-6-3"
+ width="85"
+ height="19.999987"
+ x="30.188614"
+ y="672.71613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-2-1-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.467279,316.68226)"><flowRegion
+ id="flowRegion3810-0-2-1-0"><rect
+ id="rect3812-4-3-5-3"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-1-4-0">Browser</flowPara></flowRoot> </g>
+ </g>
+ <g
+ transform="translate(269.81139,-27.853905)"
+ id="g3868-81">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2"
+ width="80"
+ height="35"
+ x="30.188614"
+ y="675.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.369364,319.99189)"><flowRegion
+ id="flowRegion3810-0"><rect
+ id="rect3812-4"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ id="flowPara3820-5"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start">Compilation</flowPara><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337">Service</flowPara></flowRoot> </g>
+ <g
+ transform="translate(269.81139,22.146095)"
+ id="g3868-81-4">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3806-2-6"
+ width="80"
+ height="35"
+ x="30.188614"
+ y="675.21613"
+ ry="3.0304618"
+ rx="3.0304618" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-9"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.369364,319.99189)"><flowRegion
+ id="flowRegion3810-0-0"><rect
+ id="rect3812-4-7"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-6">CDN</flowPara></flowRoot> </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 385.20177,732.76568 c -5.33249,10.013 -20.30329,4.74747 -20.30329,4.74747 0,0 -0.38727,5.44989 -9.89848,7.0203 -9.51121,1.57042 -15,-5 -15,-5 0,0 -10,5 -20,5 -10,0 -15,-5 -15,-5 0,0 -15,0 -20,-10 -5,-9.99999 0,-20 0,-20 0,0 -9.85188,-7.87601 -10,-20 -0.14811,-12.12399 10,-20 10,-20 0,0 -5.58058,-7.42386 -0.58058,-17.42386 5,-10 20.58058,-7.57614 20.58058,-7.57614 0,0 4.7343,-9.51543 15,-10 10.2657,-0.48456 16.01015,8.03046 16.01015,8.03046 0,0 4.15094,-7.78741 18.98985,-8.03046 14.83891,-0.24305 17.94497,9.99264 17.94497,9.99264 0,0 12.05503,-4.99263 17.05503,5.00736 5,10 -5,20 -5,20 0,0 8.22164,8.29922 8.283,20.25254 0.0614,11.95333 -8.283,19.74746 -8.283,19.74746 0,0 5.53426,13.21924 0.20177,23.23223 z"
+ id="path4376"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zczczczczczczczczczcz" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL)"
+ d="m 340,682.36222 0,15"
+ id="path4394"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8)"
+ d="m 300,717.36219 -80,15.00002"
+ id="path4394-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8)"
+ d="m 220,667.36221 80,-2e-5"
+ id="path4394-3-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-9-5"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(126.40097,318.57166)"><flowRegion
+ id="flowRegion3810-0-0-3"><rect
+ id="rect3812-4-7-8"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-6-6">local</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-9-5-9"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(238.22879,363.06658)"><flowRegion
+ id="flowRegion3810-0-0-3-4"><rect
+ id="rect3812-4-7-8-5"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-6-6-7">cdn</flowPara></flowRoot> <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-9)"
+ d="m 300,677.36222 -80,19.99999"
+ id="path4394-3-2-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3808-6-9-5-9-9"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(232.16455,328.36412)"><flowRegion
+ id="flowRegion3810-0-0-3-4-9"><rect
+ id="rect3812-4-7-8-5-1"
+ width="85.278"
+ height="32.083519"
+ x="16.541248"
+ y="363.14072"
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:7.5px;line-height:89.99999762%;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro, Medium';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4337-6-6-7-4">fetch</flowPara></flowRoot> <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-0)"
+ d="m 170,677.36222 0,15"
+ id="path4394-3-2-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#EmptyTriangleOutL-8-8-0-1)"
+ d="m 170,712.36222 0,15"
+ id="path4394-3-2-6-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/documentation/advanced/advanced-windows.asciidoc b/documentation/advanced/advanced-windows.asciidoc
index 5bd77f7c80..d838ee81d0 100644
--- a/documentation/advanced/advanced-windows.asciidoc
+++ b/documentation/advanced/advanced-windows.asciidoc
@@ -43,12 +43,12 @@ linkend="advanced.windows.caveats"/&gt;.
////
[[advanced.windows.popup]]
-== Opening Popup Windows
+== Opening Pop-up Windows
((("popup windows")))
((("windows", "popup")))
-Popup windows are native browser windows or tabs opened by user interaction with
-an existing window. Due to browser security reasons, it is made incovenient for
+Pop-up windows are native browser windows or tabs opened by user interaction with
+an existing window. Due to browser security reasons, it is made inconvenient for
a web page to open popup windows using JavaScript commands. At the least, the
browser will ask for a permission to open the popup, if it is possible at all.
This limitation can be circumvented by letting the browser open the new window
@@ -57,7 +57,7 @@ Vaadin with the [classname]#BrowserWindowOpener# component extension, which
causes the browser to open a window or tab when the component is clicked.
[[advanced.windows.popup.ui]]
-=== The Popup Window UI
+=== The Pop-up Window UI
A popup Window displays an [classname]#UI#. The UI of a popup window is defined
just like a main UI in a Vaadin application, and it can have a theme, title, and
diff --git a/documentation/application/application-architecture.asciidoc b/documentation/application/application-architecture.asciidoc
index 77c1756594..c00a378a11 100644
--- a/documentation/application/application-architecture.asciidoc
+++ b/documentation/application/application-architecture.asciidoc
@@ -14,7 +14,6 @@ way you like to think about it), from the [classname]#UI# class of the
application. You normally set a layout component as the content of the UI and
fill it with other components.
-
[source, java]
----
public class MyHierarchicalUI extends UI {
@@ -24,10 +23,10 @@ public class MyHierarchicalUI extends UI {
VerticalLayout content = new VerticalLayout();
content.setSizeFull(); // Use entire window
setContent(content); // Attach to the UI
-
+
// Add some component
content.addComponent(new Label("Hello!"));
-
+
// Layout inside layout
HorizontalLayout hor = new HorizontalLayout();
hor.setSizeFull(); // Use all available space
@@ -64,8 +63,8 @@ UI
The result is shown in <<figure.application.architecture.example>>.
[[figure.application.architecture.example]]
-.Simple Hierarchical UI
-image::img/ui-architecture-hierarchical.png[]
+.Simple hierarchical UI
+image::img/ui-architecture-hierarchical.png[width=70%, scaledwidth=90%]
Instead of building the layout in Java, you can also use a declarative design,
as described later in
@@ -131,7 +130,7 @@ class MyView extends VerticalLayout {
addComponent(entry);
addComponent(display);
addComponent(click);
-
+
// Configure it a bit
setSizeFull();
addStyleName("myview");
@@ -164,13 +163,13 @@ class MyView extends CustomComponent {
public MyView() {
Layout layout = new VerticalLayout();
-
+
layout.addComponent(entry);
layout.addComponent(display);
layout.addComponent(click);
-
+
setCompositionRoot(layout);
-
+
setSizeFull();
}
}
@@ -233,7 +232,7 @@ UI.getCurrent().setLocale(new Locale("en"));
// Set the page title (window or tab caption)
Page.getCurrent().setTitle("My Page");
-
+
// Set a session attribute
VaadinSession.getCurrent().setAttribute("myattrib", "hello");
@@ -252,7 +251,3 @@ ifdef::web[]
<<dummy/../../../framework/advanced/advanced-global#advanced.global.threadlocal,"ThreadLocal
Pattern">>.
endif::web[]
-
-
-
-
diff --git a/documentation/application/application-environment.asciidoc b/documentation/application/application-environment.asciidoc
index 0322c77e4a..f5933afe85 100644
--- a/documentation/application/application-environment.asciidoc
+++ b/documentation/application/application-environment.asciidoc
@@ -62,7 +62,9 @@ Your own theme files (OPTIONAL)::
If your application uses a special theme (look and feel), you must include it in [filename]#VAADIN/themes/themename# directory.
Widget sets (OPTIONAL)::
-If your application uses a project-specific widget set, it must be compiled in the [filename]#VAADIN/widgetset/# directory.
+If your application uses add-ons or custom widgets, they must be compiled to the [filename]#VAADIN/widgetset/# directory.
+When using add-ons, this is done automatically in Maven projects.
+See <<dummy/../../../framework/addons/addons-maven#addons.maven, "Using Add-ons in a Maven Project">> for more information.
[[application.environment.webservlet]]
== Web Servlet Class
@@ -137,7 +139,7 @@ The servlet is then mapped to a URL path in a standard way for Java Servlets.
&lt;!-- If not using the default widget set--&gt;
&lt;init-param&gt;
&lt;param-name&gt;widgetset&lt;/param-name&gt;
- &lt;param-value&gt;[replaceable]##com.ex.myprj.MyWidgetSet##&lt;/param-value&gt;
+ &lt;param-value&gt;[replaceable]##com.ex.myprj.AppWidgetSet##&lt;/param-value&gt;
&lt;/init-param&gt;
&lt;/servlet&gt;
@@ -173,24 +175,36 @@ Servlet 3.0 support is useful for at least server push.
[[application.environment.web-xml.widgetset]]
=== Widget Set
-If the UI uses add-on components or custom widgets, it needs a custom widget
-set, which can be specified with the [parameter]#widgetset# parameter for the
-servlet. Alternatively, you can defined it with the [classname]#@WidgetSet#
-annotation for the UI class. The parameter is a class name with the same path
-but without the [filename]#.gwt.xml# extension as the widget set definition
-file. If the parameter is not given, the
-[classname]#com.vaadin.DefaultWidgetSet# is used, which contains all the widgets
-for the built-in Vaadin components.
+The widget set is normally defined and compiled automatically in Maven projects.
+It may be necessary to define it manually in some cases, such as when developing custom widgets or if you need to include special rules in the widget set definition file ([filename]#.gwt.xml# module descriptor).
-Unless using the default widget set (which is included in the
-[filename]#vaadin-client-compiled# JAR), the widget set must be compiled, as
-described in
-<<dummy/../../../framework/addons/addons-overview.asciidoc#addons.overview,"Using
-Vaadin Add-ons">> or
-<<dummy/../../../framework/clientside/clientside-compiling#clientside.compiling,"Compiling
-a Client-Side Module">>, and properly deployed with the application.
+The widget set of a UI can be defined with the [classname]#@WidgetSet# annotation for the UI class.
+[source, Java, subs="normal"]
+----
+@WidgetSet("[replaceable]#com.example.myproject.MyWidgetSet#")
+class MyUI extends UI {
+ ...
+----
+
+You can also define it in the [filename]#web.xml# descriptor for the servlet:
+
+[source, xml, subs="normal"]
+----
+<init-param>
+ <param-name>widgetset</param-name>
+ <param-value>com.example.myproject.MyWidgetSet</param-value>
+</init-param>
+----
+
+The name of a widget set is technically a Java class name with the same path as the widget set definition file, but without the [filename]#.gwt.xml# extension.
+
+If a widget set is not specified, the default is used.
+In a project that does not use add-ons or custom widgets, the [classname]#com.vaadin.DefaultWidgetSet# is used.
+It contains all the widgets for the built-in Vaadin components.
+When using add-ons, the Vaadin Maven Plugin automatically defines an [classname]#AppWidgetSet# that includes all the add-on widget sets.
+The widget set must be compiled, as described in <<dummy/../../../framework/addons/addons-overview.asciidoc#addons.overview,"Using Vaadin Add-ons">> (for add-ons) or <<dummy/../../../framework/clientside/clientside-compiling#clientside.compiling,"Compiling a Client-Side Module">> (for custom widgets and client-side modules), and properly deployed with the application.
[[application.environment.servlet-mapping]]
== Servlet Mapping with URL Patterns
diff --git a/documentation/application/application-notifications.asciidoc b/documentation/application/application-notifications.asciidoc
index d58bf7b59a..920bcbc6f7 100644
--- a/documentation/application/application-notifications.asciidoc
+++ b/documentation/application/application-notifications.asciidoc
@@ -28,7 +28,7 @@ Notification.show("This is the caption",
[[figure.notification.example1]]
.Notification
-image::img/notification-example2.png[]
+image::img/notification-example2.png[width=50%, scaledwidth=80%]
For more control, you can create a [classname]#Notification# object. Different
constructors exist for taking just the caption, and optionally the description,
@@ -57,7 +57,7 @@ User Input to Prevent Cross-Site Scripting">>.
[[figure.notification.example2]]
.Notification with HTML Formatting
-image::img/notification-example3.png[]
+image::img/notification-example3.png[width=30%, scaledwidth=60%]
[[application.notifications.type]]
== Notification Type
@@ -67,31 +67,41 @@ notification. If no notification type is given, the "humanized" type is used as
the default. The notification types, listed below, are defined in the
[classname]#Notification.Type# class.
-[parameter]#TYPE_HUMANIZED_MESSAGE# image:[]:: A user-friendly message that does not annoy too much: it does not require
+[parameter]#TYPE_HUMANIZED_MESSAGE#::
+image:img/notification-humanized.png[width=30%, scaledwidth=50%]
++
+A user-friendly message that does not annoy too much: it does not require
confirmation by clicking and disappears quickly. It is centered and has a
neutral gray color.
-[parameter]#TYPE_WARNING_MESSAGE# image:[]:: Warnings are messages of medium importance. They are displayed with colors that
+[parameter]#TYPE_WARNING_MESSAGE#::
+image:img/notification-warning.png[width=30%, scaledwidth=50%]
++
+Warnings are messages of medium importance. They are displayed with colors that
are neither neutral nor too distractive. A warning is displayed for 1.5 seconds,
but the user can click the message box to dismiss it. The user can continue to
interact with the application while the warning is displayed.
-[parameter]#TYPE_ERROR_MESSAGE# image:[]:: Error messages are notifications that require the highest user attention, with
+[parameter]#TYPE_ERROR_MESSAGE#::
+image:img/notification-error.png[width=30%, scaledwidth=50%]
++
+Error messages are notifications that require the highest user attention, with
alert colors, and they require the user to click the message to dismiss it. The
error message box does not itself include an instruction to click the message,
although the close box in the upper right corner indicates it visually. Unlike
with other notifications, the user can not interact with the application while
the error message is displayed.
-[parameter]#TYPE_TRAY_NOTIFICATION# image:[]:: Tray notifications are displayed in the "system tray" area, that is, in the
+[parameter]#TYPE_TRAY_NOTIFICATION#::
+image:img/notification-tray.png[width=30%, scaledwidth=50%]
++
+Tray notifications are displayed in the "system tray" area, that is, in the
lower-right corner of the browser view. As they do not usually obscure any user
interface, they are displayed longer than humanized or warning messages, 3
seconds by default. The user can continue to interact with the application
normally while the tray notification is displayed.
-
-
ifdef::web[]
[[application.notifications.customization]]
== Customizing Notifications
@@ -114,7 +124,7 @@ notif.setDelayMsec(20000);
notif.setPosition(Position.BOTTOM_RIGHT);
notif.setStyleName("mystyle");
notif.setIcon(new ThemeResource("img/reindeer.png"));
-
+
// Show it in the page
notif.show(Page.getCurrent());
----
@@ -170,8 +180,4 @@ The result is shown, with the icon set earlier in the customization example, in
[[figure.application.errors.notifications.css]]
.A Styled Notification
-image::img/notification-customization.png[]
-
-
-
-
+image::img/notification-customization.png[width=40%, scaledwidth=60%]
diff --git a/documentation/application/application-overview.asciidoc b/documentation/application/application-overview.asciidoc
index b70df520f9..f1a792a60e 100644
--- a/documentation/application/application-overview.asciidoc
+++ b/documentation/application/application-overview.asciidoc
@@ -19,7 +19,7 @@ by the application server or the application itself.
[[figure.application.architecture]]
.Server-Side Application Architecture
-image::img/application-architecture-hi.png[]
+image::img/application-architecture-hi.png[width=70%, scaledwidth=100%]
<<figure.application.architecture>> illustrates the basic architecture of an
application made with the Vaadin Framework, with all the major elements, which
@@ -151,8 +151,3 @@ component to an SQL query response. For a complete overview of data binding in
Vaadin, please refer to
<<dummy/../../../framework/datamodel/datamodel-overview.asciidoc#datamodel.overview,"Binding
Components to Data">>.
-
-
-
-
-
diff --git a/documentation/application/application-resources.asciidoc b/documentation/application/application-resources.asciidoc
index b5f5db91f2..ee1a8a7eb9 100644
--- a/documentation/application/application-resources.asciidoc
+++ b/documentation/application/application-resources.asciidoc
@@ -46,8 +46,7 @@ The resource classes in Vaadin are grouped under two interfaces: a generic
[[figure.resource.classdiagram]]
.Resource Interface and Class Diagram
-image::img/resource_classdiagram-hi.png[]
-
+image::img/resource_classdiagram-hi.png[width=70%, scaledwidth=90%]
[[application.resources.file]]
== File Resources
@@ -70,7 +69,6 @@ folder, which is a special folder that is never accessible using an URL, unlike
the other folders of a web application. This is a security solution - another
would be to store the resource elsewhere in the file system.
-
[source, java]
----
// Find the application directory
@@ -83,7 +81,7 @@ FileResource resource = new FileResource(new File(basepath +
// Show the image in the application
Image image = new Image("Image from file", resource);
-
+
// Let the user view the file in browser or download it
Link link = new Link("Link to the image file", resource);
----
@@ -95,7 +93,7 @@ regular Eclipse Vaadin project, is shown in
[[figure.application.resources.file]]
.File Resource
-image::img/resource-fileresource.png[]
+image::img/resource-fileresource.png[width=50%, scaledwidth=80%]
[[application.resources.class]]
@@ -145,7 +143,7 @@ the folder structure for the theme resource file in an Eclipse project.
[[figure.application.resources.theme]]
.Theme Resources
-image::img/resource-themeimage.png[]
+image::img/resource-themeimage.png[width=40%, scaledwidth=70%]
To use theme resources, you must set the theme for the UI. See
<<dummy/../../../framework/themes/themes-overview.asciidoc#themes.overview,"Themes">>
@@ -173,7 +171,7 @@ public class MyImageSource
implements StreamResource.StreamSource {
ByteArrayOutputStream imagebuffer = null;
int reloads = 0;
-
+
/* We need to implement this method that returns
* the resource as a stream. */
public InputStream getStream () {
@@ -195,7 +193,7 @@ public class MyImageSource
/* Write the image to a buffer. */
imagebuffer = new ByteArrayOutputStream();
ImageIO.write(image, "png", imagebuffer);
-
+
/* Return a stream from the buffer. */
return new ByteArrayInputStream(
imagebuffer.toByteArray());
@@ -218,13 +216,13 @@ Below we display the image with the [classname]#Image# component.
----
// Create an instance of our stream source.
StreamResource.StreamSource imagesource = new MyImageSource ();
-
+
// Create a resource that uses the stream source and give it a name.
// The constructor will automatically register the resource in
// the application.
StreamResource resource =
new StreamResource(imagesource, "myimage.png");
-
+
// Create an image component that gets its contents
// from the resource.
layout.addComponent(new Image("Image title", resource));
@@ -239,7 +237,3 @@ image::img/application_streamresource.png[]
Another way to create dynamic content is a request handler, described in
<<dummy/../../../framework/advanced/advanced-requesthandler#advanced.requesthandler,"Request
Handlers">>.
-
-
-
-
diff --git a/documentation/architecture/architecture-client-side.asciidoc b/documentation/architecture/architecture-client-side.asciidoc
index e16b003687..77e60a8940 100644
--- a/documentation/architecture/architecture-client-side.asciidoc
+++ b/documentation/architecture/architecture-client-side.asciidoc
@@ -17,7 +17,7 @@ The client-side engine is illustrated in <<figure.architecture.client-side>>.
[[figure.architecture.client-side]]
.Vaadin Client-Side Engine
-image::img/clientside-arch-hi.png[]
+image::img/clientside-arch-hi.png[width=60%, scaledwidth=90%]
The client-side framework includes two kinds of built-in widgets: GWT widgets
and Vaadin-specific widgets. The two widget collections have significant
@@ -38,6 +38,3 @@ between the two sides. Integration of widgets with their server-side counterpart
components is described in
<<dummy/../../../framework/gwt/gwt-overview.asciidoc#gwt.overview,"Integrating
with the Server-Side">>.
-
-
-
diff --git a/documentation/architecture/architecture-events.asciidoc b/documentation/architecture/architecture-events.asciidoc
index e832c581fe..e273a28e97 100644
--- a/documentation/architecture/architecture-events.asciidoc
+++ b/documentation/architecture/architecture-events.asciidoc
@@ -37,7 +37,6 @@ corresponding listener class. For example, the [classname]#Button# has
In the following, we handle button clicks with a listener implemented as an
anonymous class:
-
[source, java]
----
final Button button = new Button("Push it!");
@@ -60,15 +59,21 @@ in this case the [classname]#Button#.
[[figure.eventlistenerdiagram]]
.Class Diagram of a Button Click Listener
-image::img/events-classdiagram-hi.png[]
+image::img/events-classdiagram-hi.png[width=50%, scaledwidth=75%]
+
+In Java 8, you can implement such functional interfaces with a lambda expression:
+
+[source, java]
+----
+Button button = new Button("Push it!");
+
+button.addClickListener(event ->
+ button.setCaption("You pushed it!"));
+----
In the ancient times of C programming, __callback functions__ filled largely the
same need as listeners do now. In object-oriented languages, we usually only
have classes and methods, not functions, so the application has to give a class
interface instead of a callback function pointer to the framework.
-<<dummy/../../../framework/application/application-events#application.events,"Handling
-Events with Listeners">> goes into details of handling events in practice.
-
-
-
+<<dummy/../../../framework/application/application-events#application.events,"Handling Events with Listeners">> goes into details of handling events in practice.
diff --git a/documentation/architecture/architecture-overview.asciidoc b/documentation/architecture/architecture-overview.asciidoc
index 9307b7b72c..dee3a13fcf 100644
--- a/documentation/architecture/architecture-overview.asciidoc
+++ b/documentation/architecture/architecture-overview.asciidoc
@@ -18,7 +18,7 @@ code and services, and can be mixed together easily.
[[figure.architecture.detailed]]
.Vaadin Runtime Architecture
-image::img/architecture-detailed-hi.png[]
+image::img/architecture-detailed-hi.png[width=70%, scaledwidth=100%]
<<figure.architecture.detailed>> gives a basic illustration of the client-side
and server-side communications, in a running situation where the page with the
diff --git a/documentation/architecture/architecture-technology.asciidoc b/documentation/architecture/architecture-technology.asciidoc
index 39df9c3651..6924bba891 100644
--- a/documentation/architecture/architecture-technology.asciidoc
+++ b/documentation/architecture/architecture-technology.asciidoc
@@ -165,7 +165,7 @@ dynamic content. This is illustrated in
[[figure.architecture.technology.servlet]]
.Java Web Applications and Servlets
-image::img/java-servlet-hi.png[]
+image::img/java-servlet-hi.png[width=40%, scaledwidth=70%]
Web applications are usually packaged and deployed to a server as __WAR__ (
__Web application ARchive__) files, which are Java JAR packages, which in turn
@@ -196,13 +196,6 @@ in
a Server-Side Web Application">>. The class is given as a parameter to the
Vaadin Servlet in the [filename]#web.xml# deployment descriptor.
-The Vaadin Client-Side Engine as well as client-side Vaadin applications are
-loaded to the browser as static JavaScript files. The client-side engine, or
-widget set in technical terms, needs to be located under the
-[filename]#VAADIN/widgetsets# path in the web application. The precompiled
-default widget set is served from the [filename]#vaadin-client-compiled# JAR by
-the Vaadin Servlet.
-
-
-
-
+The Vaadin Client-Side Engine as well as client-side Vaadin applications are loaded to the browser as static JavaScript files.
+The client-side engine, or widget set in technical terms, needs to be located under the [filename]#VAADIN/widgetsets# path in the web application.
+It is normally automatically compiled to include the default widget set, as well as any installed add-ons and custom widgets.
diff --git a/documentation/clientside/clientside-compiling.asciidoc b/documentation/clientside/clientside-compiling.asciidoc
index 962ff76a6f..ac1c41bf5d 100644
--- a/documentation/clientside/clientside-compiling.asciidoc
+++ b/documentation/clientside/clientside-compiling.asciidoc
@@ -7,72 +7,172 @@ layout: page
[[clientside.compiling]]
= Compiling a Client-Side Module
-A client-side module, either a widget set or a pure client-side module, needs to
-be compiled to JavaScript using the Vaadin Client Compiler. During development,
-the Development Mode makes the compilation automatically when you reload the
-page, provided that the module has been initially compiled once with the
-compiler.
-
-As most Vaadin add-ons include widgets, widget set compilation is usually needed
-when using add-ons. In that case, the widget sets from different add-ons are
-compiled into a __project widget set__, as described in
-<<dummy/../../../framework/addons/addons-overview.asciidoc#addons.overview,"Using Vaadin Add-ons">>.
-
-////
-TODO Provide a link to a proper add-on compilation section when one is
-available.
-////
+A client-side module, either a Vaadin widget set or a pure client-side module, needs to be compiled to JavaScript using the Vaadin Client Compiler.
+
+Widget set compilation is most often needed when using add-ons.
+In that case, the widget sets from different add-ons are compiled into an _application widget set_, as described in <<dummy/../../../framework/addons/addons-overview.asciidoc#addons.overview, "Using Vaadin Add-ons">>.
+
+When doing client-side development, you need to compile the widget set every time you modify the client-side code.
[[clientside.compiling.overview]]
== Vaadin Compiler Overview
-The Vaadin Client Compiler compiles Java to JavaScript. It is provided as the
-[filename]#vaadin-client-compiler# JAR, which you can execute with the
-[literal]#++-jar++# parameter for the Java runtime. It requires the
-[filename]#vaadin-client# JAR, which contains the Vaadin client-side framework.
+The Vaadin Client Compiler compiles Java to JavaScript.
+It is provided as the executable [filename]#vaadin-client-compiler# JAR.
+// You can run it with the [literal]#++-jar++# parameter for the Java runtime.
+It requires the [filename]#vaadin-client# JAR, which contains the [classname]#DefaultWidgetSet#, Vaadin client-side framework.
+
+The compiler compiles a _client module_, which can either be a pure client-side module or a Vaadin widget set, that is, the Vaadin Client-Side Engine that includes the widgets used in the application.
+The client module is defined with a module descriptor, which was described in <<clientside-module#clientside.module, "Client-Side Module Descriptor">>.
+The module descriptor for application widget sets is automatically generated.
+
+While you can compile client modules individually, in Vaadin applications you normally combine them in one application widget set.
+The application widget set includes any add-on and custom widgets.
+The compiler scans the class path for any widget sets to include in the application widget set.
+
+=== Compilation Result
+
+The compiler writes the compilation result to a target folder that will include the compiled JavaScript with any static resources included in the module.
+
+[[clientside.compiling.maven]]
+== Compiling in Maven Projects
+
+The Vaadin Maven Plugin, which is enabled in all Vaadin archetypes, makes Maven to automatically compile the widget set when necessary.
+
+ifdef::web[]
+=== Plugin Configuration
+
+[source,xml]
+----
+<plugin>
+ <groupId>com.vaadin</groupId>
+ <artifactId>vaadin-maven-plugin</artifactId>
+ <version>${vaadin.plugin.version}</version>
+
+ <configuration>
+ <extraJvmArgs>-Xmx512M -Xss1024k</extraJvmArgs>
+ <webappDirectory>${basedir}/target/classes/VAADIN/widgetsets</webappDirectory>
+ <draftCompile>false</draftCompile>
+ <compileReport>false</compileReport>
+ <style>OBF</style>
+ <strict>true</strict>
+ </configuration>
+
+ <executions>
+ <execution>
+ <goals>
+ <goal>update-theme</goal>
+ <goal>update-widgetset</goal>
+ <goal>compile</goal>
+ <goal>compile-theme</goal>
+ </goals>
+ </execution>
+ </executions>
+</plugin>
+----
+endif::web[]
+
+[[clientside.compiling.maven.modes]]
+=== Compilation Modes
+
+The Vaadin Maven Plugin can compile widget sets either locally or online by using a cloud service.
+The online compilation requires that all the widget sets are available in certain public Maven repositories.
+As this is not the case when developing custom widgets, you must use the `local` mode.
+
+Local compilation is the default mode, so you only need to enable it if you have changed the mode to use the online service.
+
+See <<DUMMY/../../addons/addons-maven#addons.maven.modes, "Widget Set Modes">> for more information.
-The compiler compiles a __client module__, which can be either a pure
-client-side module or a Vaadin widget set, that is, the Vaadin Client-Side
-Engine that includes the widgets used in the application. The client module is
-defined with a module descriptor, which was described in
-<<dummy/../../../framework/clientside/clientside-module#clientside.module,"Client-Side
-Module Descriptor">>.
+[[clientside.compiling.maven.compiling]]
+=== Compiling
-The compiler writes the compilation result to a target folder that will include
-the compiled JavaScript with any static resources included in the module.
+You can explicitly compile the widget set with the [literal]#vaadin:compile# goal.
+On command-line:
+
+[subs="normal"]
+----
+[prompt]#$# [command]#mvn# [parameter]#vaadin:compile#
+----
+
+If there is no widget set defined, but you have add-on dependencies that need a
+custom widget set, the Vaadin Maven plugin will automatically generate a widget set definition for you.
[[clientside.compiling.eclipse]]
== Compiling in Eclipse
-When the Vaadin Plugin is installed in Eclipse, you can simply click the
-[guibutton]#Compile Vaadin widgets# button in the toolbar. It will compile the
-widget set it finds from the project. If the project has multiple widget sets,
-such as one for custom widgets and another one for the project, you need to
-select the module descriptor of the widget set to compile before clicking the
-button.
+When you have the Vaadin Plugin installed in Eclipse, you can simply click the *Compile Vaadin Widgetset* button in the toolbar.
+
+.Widget set compilation button in Eclipse
+image::img/widgetset-compiling-toolbar.png[width=50%, scaledwidth=60%]
+
+It will compile the widget set it finds from the project.
+If the project has multiple widget sets, such as one for custom widgets and another one for the project, you need to select the module descriptor of the widget set to compile before clicking the button.
-The compilation with Vaadin Plugin for Eclipse currently requires that the
-module descriptor has suffix [filename]#Widgetset.gwt.xml#, although you can use
-it to compile also other client-side modules than widget sets. The result is
-written under [filename]#WebContent/VAADIN/widgetsets# folder.
+Compiling with the Vaadin Plugin for Eclipse currently requires that the module descriptor has suffix [filename]#Widgetset.gwt.xml#, although you can use it to compile also other client-side modules than widget sets.
+The result is written under [filename]#WebContent/VAADIN/widgetsets# folder.
+ifdef::web[]
[[clientside.compiling.ant]]
== Compiling with Ant
-You can find a script template for compiling widget sets with Ant and Ivy at the
-link:http://vaadin.com/download/[Vaadin download page]. You can copy the build
-script to your project and, once configured, run it with Ant.
+Consider the following configuration:
+[source, xml, subs="normal"]
+----
+<target name="configure">
+ <!-- Where project source files are located -->
+ <property name="sources" value="[replaceable]#src#" />
-[[clientside.compiling.maven]]
-== Compiling with Maven
+ <!-- Path to root of web application folder -->
+ <property name="webroot" value="[replaceable]#WebContent#" />
-You can compile the widget set with the [literal]#++vaadin:compile++# goal as
-follows:
+ <!-- Compilation work directory -->
+ <property name="workdir" value="[replaceable]#build/work#"/>
+</target>
+----
-[subs="normal"]
+The script assumes the Eclipse project layout with [filename]#WebContent# folder.
+
+The `compile-widgetset` target invokes the Vaadin Compiler to compile the widget set.
+The class path includes source folder in case there are custom widgets, compiled server-side classes, and the dependencies resolved with Ivy.
+
+[source, xml]
----
-[prompt]#$# [command]#mvn# [parameter]#vaadin:compile#
+<target name="compile-widgetset" depends="init,resolve">
+ <java classname="com.google.gwt.dev.Compiler"
+ failonerror="yes" fork="yes">
+ <arg value="-war" />
+ <arg value="${webroot}/VAADIN/widgetsets" />
+ <arg value="${widgetset}" />
+ <arg value="-logLevel"/>
+ <arg value="INFO"/>
+ <!-- <arg value="-strict"/> -->
+ <jvmarg value="-Xmx1024M"/>
+ <jvmarg value="-Xss512M"/>
+ <jvmarg value="-Djava.awt.headless=true"/>
+
+ <classpath>
+ <!-- Location of source code -->
+ <pathelement path="${sources}" />
+
+ <!-- Compiled server-side classes -->
+ <pathelement path="${workdir}/WEB-INF/classes" />
+
+ <!-- Dependencies retrieved with Ivy -->
+ <path refid="ivy.deps.widgetset"/>
+ </classpath>
+ <sysproperty key="vFailIfNotSerializable" value="${failifnotserializable}" />
+ </java>
+
+ <!-- Cleanup -->
+ <delete dir="${webroot}/VAADIN/gwt-unitCache"/>
+ <delete dir="${webroot}/VAADIN/widgetsets/WEB-INF"/>
+</target>
----
+
+You can find the complete example build script for compiling widget sets with Ant and Ivy in the https://github.com/vaadin/book-examples/blob/master/build/build.xml[build.xml for the Book Examples].
+You can copy the build script to your project and, once configured, run it with Ant.
+You may need to do some configuration in the build targets, such as to exclude or include source or target paths.
+endif::web[]
diff --git a/documentation/clientside/img/widgetset-compiling-toolbar.png b/documentation/clientside/img/widgetset-compiling-toolbar.png
new file mode 100644
index 0000000000..8a77aaaf58
--- /dev/null
+++ b/documentation/clientside/img/widgetset-compiling-toolbar.png
Binary files differ
diff --git a/documentation/components/components-button.asciidoc b/documentation/components/components-button.asciidoc
index 59ab380348..9105aa5e9b 100644
--- a/documentation/components/components-button.asciidoc
+++ b/documentation/components/components-button.asciidoc
@@ -30,23 +30,27 @@ button.addClickListener(new Button.ClickListener() {
Notification.show("Do not press this button again");
}
});
+
+// Java 8
+button.addClickListener(click ->
+ Notification.show("Do not press this button again"));
----
See the http://demo.vaadin.com/book-examples-vaadin7/book#component.button.basic[on-line example, window="_blank"].
-The result is shown in <<figure.component.button.basic>>. The listener can also
-be given in the constructor, which is often perhaps simpler.
+The listener can also be given in the constructor, which is often perhaps simpler.
+
+The button component can be styled in many ways, as illustrated in <<figure.component.button.basic>>.
[[figure.component.button.basic]]
.Button in Different Styles of Valo Theme
-image::img/button-example1.png[]
+image::img/button-example1.png[width=70%, scaledwidth=100%]
If you handle several buttons in the same listener, you can differentiate
between them either by comparing the [classname]#Button# object reference
returned by the [methodname]#getButton()# method of
[classname]#Button.ClickEvent# to a kept reference. For a detailed description
of these patterns together with some examples, please see
-<<dummy/../../../framework/architecture/architecture-events#architecture.events,"Events
-and Listeners">>.
+<<dummy/../../../framework/architecture/architecture-events#architecture.events,"Events and Listeners">>.
== CSS Style Rules
@@ -65,7 +69,3 @@ element, which may help in styling in some cases.
Some built-in themes contain a small style, which you can enable by adding
[parameter]#Reindeer.BUTTON_SMALL#, etc. The [classname]#BaseTheme# also has a
[parameter]#BUTTON_LINK# style, which makes the button look like a hyperlink.
-
-
-
-
diff --git a/documentation/components/components-calendar.asciidoc b/documentation/components/components-calendar.asciidoc
index e682be2bb2..6b56483882 100644
--- a/documentation/components/components-calendar.asciidoc
+++ b/documentation/components/components-calendar.asciidoc
@@ -28,13 +28,9 @@ well as events, is handled with event listeners. Also date/time range
selections, event dragging, and event resizing can be listened by the server.
The weekly view has navigation buttons to navigate forward and backward in time.
These actions are also listened by the server. Custom navigation can be
-implemented using event handlers
-
-ifdef::web[]
-, as described in
-<<components.calendar.customizing>>
-endif::web[]
-.
+implemented using event
+ifdef::web[handlers, as described in <<components.calendar.customizing>>.]
+ifndef::web[handlers.]
The data source of a calendar can be practically anything, as its events are
queried dynamically by the component. You can bind the calendar to a Vaadin
@@ -67,7 +63,7 @@ always calculated in an accuracy of one millisecond.
[[figure.components.calendar.daterange.monthly]]
.Monthly view with All-Day and Normal Events
-image::img/calendar-monthly.png[]
+image::img/calendar-monthly.png[width=60%, scaledwidth=100%]
The monthly view, shown in <<figure.components.calendar.daterange.monthly>>, can
easily be used to control all types of events, but it is best suited for events
@@ -78,7 +74,7 @@ hours. These events can not be moved by dragging in the monthly view.
[[figure.components.calendar.daterange.weekly]]
.Weekly View
-image::img/calendar-weekly.png[]
+image::img/calendar-weekly.png[width=60%, scaledwidth=100%]
In <<figure.components.calendar.daterange.weekly>>, you can see four normal day
events and also all-day events at the top of the time line grid.
diff --git a/documentation/components/components-checkbox.asciidoc b/documentation/components/components-checkbox.asciidoc
index 4e84010b6a..570a3ee083 100644
--- a/documentation/components/components-checkbox.asciidoc
+++ b/documentation/components/components-checkbox.asciidoc
@@ -46,7 +46,7 @@ The result is shown in <<figure.components.checkbox.basic>>.
[[figure.components.checkbox.basic]]
.An Example of a Check Box
-image::img/checkbox-example1.png[]
+image::img/checkbox-example1.png[width=35%, scaledwidth=50%]
For an example on the use of check boxes in a table, see
<<dummy/../../../framework/components/components-table#components.table,"Table">>.
@@ -64,9 +64,4 @@ For an example on the use of check boxes in a table, see
The top-level element of a [classname]#CheckBox# has the
[literal]#++v-checkbox++# style. It contains two sub-elements: the actual check
box [literal]#++input++# element and the [literal]#++label++# element. If you
-want to have the label on the left, you can change the positions with "
-[literal]#++direction: rtl++#" for the top element.
-
-
-
-
+want to have the label on the left, you can change the positions with "[literal]#++direction: rtl++#" for the top element.
diff --git a/documentation/components/components-combobox.asciidoc b/documentation/components/components-combobox.asciidoc
index 67c890779a..f3fd6d9962 100644
--- a/documentation/components/components-combobox.asciidoc
+++ b/documentation/components/components-combobox.asciidoc
@@ -20,7 +20,7 @@ selection component features are described in
Components">>.
.The [classname]#ComboBox# Component
-image::img/combobox-basic.png[]
+image::img/combobox-basic.png[width=35%, scaledwidth=50%]
[classname]#ComboBox# supports adding new items when the user presses
kbd:[Enter].
@@ -36,7 +36,7 @@ drop-down list by the text entered in the input box.
[[figure.components.combobox.filter]]
.Filtered Selection in [classname]#ComboBox#
-image::img/combobox-filtering.png[]
+image::img/combobox-filtering.png[width=35%, scaledwidth=50%]
Pressing kbd:[Enter] will complete the item in the input box. Pressing kbd:[Up] and kbd:[Down] arrow keys can be used for selecting an item from the drop-down list. The
drop-down list is paged and clicking on the scroll buttons will change to the
@@ -62,7 +62,7 @@ component.
[parameter]#STARTSWITH#:: Matches only items that begin with the given string.
-[parameter]#OFF#(default):: Filtering is by default off and all items are shown all the time.
+[parameter]#OFF# (default):: Filtering is by default off and all items are shown all the time.
diff --git a/documentation/components/components-customcomponent.asciidoc b/documentation/components/components-customcomponent.asciidoc
index cce897daa9..f8e8f1ddff 100644
--- a/documentation/components/components-customcomponent.asciidoc
+++ b/documentation/components/components-customcomponent.asciidoc
@@ -27,7 +27,6 @@ is typically a layout component that contains other components.
For example:
-
[source, java]
----
class MyComposite extends CustomComponent {
@@ -37,7 +36,7 @@ class MyComposite extends CustomComponent {
VerticalLayout panelContent = new VerticalLayout();
panelContent.setMargin(true); // Very useful
panel.setContent(panelContent);
-
+
// Compose from multiple components
Label label = new Label(message);
label.setSizeUndefined(); // Shrink
@@ -62,7 +61,6 @@ separate.
You can use the component as follows:
-
[source, java]
----
MyComposite mycomposite = new MyComposite("Hello");
@@ -71,17 +69,14 @@ MyComposite mycomposite = new MyComposite("Hello");
The rendered component is shown in <<figure.components.customcomponent>>.
[[figure.components.customcomponent]]
-.A Custom Composite Component
-image::img/customcomponent-example1.png[]
+.A custom composite component
+image::img/customcomponent-example1.png[width=25%, scaledwidth=40%]
You can also inherit any other components, such as layouts, to attain similar
-composition. ((("Google Web
-Toolkit")))
+composition.
+((("Google Web Toolkit")))
Even further, you can create entirely new low-level components, by integrating
pure client-side components or by extending the client-side functionality of
built-in components. Development of new components is covered in
<<dummy/../../../framework/gwt/gwt-overview.asciidoc#gwt.overview,"Integrating
with the Server-Side">>.
-
-
-
diff --git a/documentation/components/components-customfield.asciidoc b/documentation/components/components-customfield.asciidoc
index f57eb2debf..9a05b4aa33 100644
--- a/documentation/components/components-customfield.asciidoc
+++ b/documentation/components/components-customfield.asciidoc
@@ -7,21 +7,13 @@ layout: page
[[components.customfield]]
= Composite Fields with [classname]#CustomField#
-The [classname]#CustomField# is a way to create composite components like with
-[classname]#CustomComponent#, except that it implements the
-[interfacename]#Field# interface and inherit [classname]#AbstractField#,
-described in
-<<dummy/../../../framework/components/components-fields#components.fields,"Field
-Components">>. A field allows editing a property value in the Vaadin data model,
-and can be bound to data with field groups, as described in
-<<dummy/../../../framework/datamodel/datamodel-itembinding#datamodel.itembinding,"Creating
-Forms by Binding Fields to Items">>. The field values are buffered and can be
-validated with validators.
-
-A composite field class must implement the [methodname]#getType()# and
-[methodname]#initContent()# methods. The latter should return the content
-composite of the field. It is typically a layout component, but can be any
-component.
+The [classname]#CustomField# is a way to create composite components as with [classname]#CustomComponent#, except that it implements the [interfacename]#Field# interface and inherits [classname]#AbstractField#, described in <<dummy/../../../framework/components/components-fields#components.fields,"Field Components">>.
+A field allows editing a property value in the Vaadin data model, and can be bound to data with field groups, as described in <<dummy/../../../framework/datamodel/datamodel-itembinding#datamodel.itembinding, "Creating Forms by Binding Fields to Items">>.
+The field values are buffered and can be validated with validators.
+
+A composite field class must implement the [methodname]#getType()# and [methodname]#initContent()# methods.
+The latter should return the content composite of the field.
+It is typically a layout component, but can be any component.
It is also possible to override [methodname]#validate()#,
[methodname]#setInternalValue()#, [methodname]#commit()#,
@@ -29,5 +21,70 @@ It is also possible to override [methodname]#validate()#,
to implement different functionalities in the field. Methods overriding
[methodname]#setInternalValue()# should call the superclass method.
+[[components.customfield.basic]]
+== Basic Use
+
+Let us consider a simple custom switch button component that allows you to click a button to switch it "on" and "off", as illustrated in <<figure.components.customfield.basic>>.
+
+[[figure.components.customfield.basic]]
+.A custom switch button field
+image::img/customfield-basic.png[width=25%, scaledwidth=40%]
+
+The field has [classname]#Boolean# value type, which the [methodname]#getType()# returns.
+In [methodname]#initContent()#, we initialize the button and the layout.
+Notice how we handle user interaction with the button to change the field value.
+We customize the [methodname]#setValue()# method to reflect the state back to the user.
+
+[source, Java]
+----
+public class BooleanField extends CustomField<Boolean> {
+ Button button = new Button();
+
+ public BooleanField() {
+ setValue(true); // On by default
+ }
+
+ @Override
+ protected Component initContent() {
+ // Flip the field value on click
+ button.addClickListener(click ->
+ setValue(! (Boolean) getValue()));
+
+ return new VerticalLayout(
+ new Label("Click the button"), button);
+ }
+
+ @Override
+ public Class<Boolean> getType() {
+ return Boolean.class;
+ }
+
+ @Override
+ public void setValue(Boolean newFieldValue)
+ throws com.vaadin.data.Property.ReadOnlyException,
+ ConversionException {
+ button.setCaption(newFieldValue? "On" : "Off");
+ super.setValue(newFieldValue);
+ }
+}
+----
+
+We can now use the field in all the normal ways for a field:
+
+[source, Java]
+----
+// Create it
+BooleanField field = new BooleanField();
+
+// It's a field so we can set its value
+field.setValue(new Boolean(true));
+// ...and read the value
+Label value = new Label(field.getValue()?
+ "Initially on" : "Initially off");
+// ...and handle value changes
+field.addValueChangeListener(event ->
+ value.setValue(field.getValue()?
+ "It's now on" : "It's now off"));
+----
diff --git a/documentation/components/components-datefield.asciidoc b/documentation/components/components-datefield.asciidoc
index 029b851947..f1fdd1e922 100644
--- a/documentation/components/components-datefield.asciidoc
+++ b/documentation/components/components-datefield.asciidoc
@@ -28,7 +28,7 @@ of the date field to current time by using the default constructor of the
----
// Create a DateField with the default style
DateField date = new DateField();
-
+
// Set the date and time to present
date.setValue(new Date());
----
@@ -37,7 +37,7 @@ The result is shown in <<figure.components.datefield.basic>>.
[[figure.components.datefield.basic]]
.[classname]#DateField# ([classname]#PopupDateField#) for Selecting Date and Time
-image::img/datefield-example1.png[]
+image::img/datefield-example1.png[width=35%, scaledwidth=60%]
[[components.datefield.popupdatefield]]
== [classname]#PopupDateField#
@@ -75,7 +75,7 @@ The result is shown in <<figure.components.datefield.popupdatefield.format>>.
[[figure.components.datefield.popupdatefield.format]]
.Custom Date Format for [classname]#PopupDateField#
-image::img/datefield-formatting.png[]
+image::img/datefield-formatting.png[width=35%, scaledwidth=60%]
The same format specification is also used for parsing user-input date and time,
as described later.
@@ -143,13 +143,13 @@ PopupDateField date = new PopupDateField("My Date") {
ConversionException("Not a number");
}
}
-
+
// Bad date
throw new Property.
ConversionException("Your date needs two slashes");
}
};
-
+
// Display only year, month, and day in slash-delimited format
date.setDateFormat("yyyy/MM/dd");
@@ -185,7 +185,7 @@ PopupDateField date = new PopupDateField("My Date") {
Notification.show(
"Your date needs two slashes",
Notification.TYPE_WARNING_MESSAGE);
-
+
// A failure must always also throw an exception
throw new Property.ConversionException("Bad date");
}
@@ -212,7 +212,7 @@ PopupDateField date = new PopupDateField();
// Set the prompt
date.setInputPrompt("Select a date");
-
+
// Set width explicitly to accommodate the prompt
date.setWidth("10em");
----
@@ -264,19 +264,16 @@ The top-level element of the floating popup calendar has
[literal]#++.v-datefield-popup++# style. Observe that the popup frame is outside
the HTML structure of the component, hence it is not enclosed in the
[literal]#++v-datefield++# element and does not include any custom styles.
-//NOTE: May be changed in
-#5752.
+// NOTE: May be changed in #5752.
The content in the [literal]#++v-datefield-calendarpanel++# is the same as in
[classname]#InlineDateField#, as described in <<components.datefield.calendar>>.
-
-
[[components.datefield.calendar]]
== [classname]#InlineDateField#
The [classname]#InlineDateField# provides a date picker component with a month
view. The user can navigate months and years by clicking the appropriate arrows.
-Unlike with the popup variant, the month view is always visible in the inline
+Unlike with the pop-up variant, the month view is always visible in the inline
field.
@@ -284,7 +281,7 @@ field.
----
// Create a DateField with the default style
InlineDateField date = new InlineDateField();
-
+
// Set the date and time to present
date.setValue(new java.util.Date());
----
@@ -293,7 +290,7 @@ The result is shown in <<figure.components.datefield.inlinedatefield>>.
[[figure.components.datefield.inlinedatefield]]
.Example of the [classname]#InlineDateField#
-image::img/datefield-inlinedatefield.png[]
+image::img/datefield-inlinedatefield.png[width=35%, scaledwidth=60%]
The user can also navigate the calendar using the cursor keys.
@@ -339,8 +336,6 @@ The other style names should be self-explanatory. For weekdays, the
[literal]#++v-first++# and [literal]#++v-last++# styles allow making rounded
endings for the weekday bar.
-
-
[[components.datefield.resolution]]
== Date and Time Resolution
@@ -386,6 +381,3 @@ Sunday, nor in some North African and Middle-Eastern countries, where the week
begins on Saturday. In such locales, the week numbers are not displayed.
endif::web[]
-
-
-
diff --git a/documentation/components/components-embedded.asciidoc b/documentation/components/components-embedded.asciidoc
index bea83971a8..cc89114413 100644
--- a/documentation/components/components-embedded.asciidoc
+++ b/documentation/components/components-embedded.asciidoc
@@ -10,15 +10,12 @@ layout: page
You can embed images in Vaadin UIs with the [classname]#Image# component, Adobe
Flash graphics with [classname]#Flash#, and other web content with
[classname]#BrowserFrame#. There is also a generic [classname]#Embedded#
-component for embedding other object types. The embedded content is referenced
-as __resources__, as described in
-<<dummy/../../../framework/application/application-resources#application.resources,"Images
-and Other Resources">>.
+component for embedding other object types.
+The embedded content is referenced as _resources_, as described in <<dummy/../../../framework/application/application-resources#application.resources,"Images and Other Resources">>.
The following example displays an image as a class resource loaded with the
class loader:
-
[source, java]
----
Image image = new Image("Yes, logo:",
@@ -30,7 +27,7 @@ The caption can be given as null to disable it. An empty string displays an
empty caption which takes a bit space. The caption is managed by the containing
layout.
-You can set an altenative text for an embedded resource with
+You can set an alternative text for an embedded resource with
[methodname]#setAlternateText()#, which can be shown if images are disabled in
the browser for some reason. The text can be used for accessibility purposes,
such as for text-to-speech generation.
@@ -77,8 +74,8 @@ resource is not enough. Because of how caching is handled in some browsers, you
can cause a reload easiest by renaming the filename of the resource with a
unique name, such as one including a timestamp. You should set cache time to
zero with [methodname]#setCacheTime()# for the resource object when you create
-it.//BUG
-#2470.
+it.
+// BUG #2470.
[source, java]
@@ -137,7 +134,7 @@ for the Flash object element in HTML.
== [classname]#BrowserFrame#
The [classname]#BrowserFrame# allows embedding web content inside an HTML
-&lt;iframe&gt; element. You can refer to an external URL with
+`&lt;iframe&gt;` element. You can refer to an external URL with
[classname]#ExternalResource#.
As the [classname]#BrowserFrame# has undefined size by default, it is critical
@@ -199,7 +196,3 @@ example above (where it was actually unnecessary).
Some embeddable object types may require special support in the browser. You
should make sure that there is a proper fallback mechanism if the browser does
not support the embedded type.
-
-
-
-
diff --git a/documentation/components/components-features.asciidoc b/documentation/components/components-features.asciidoc
index fd4e748c05..625d9b8820 100644
--- a/documentation/components/components-features.asciidoc
+++ b/documentation/components/components-features.asciidoc
@@ -27,7 +27,6 @@ caption.
The caption text can usually be given as the first parameter of a constructor of
a component or with [methodname]#setCaption()#.
-
[source, java]
----
// New text field with caption "Name"
@@ -47,7 +46,7 @@ rendered.
[[figure.components.features.caption.layoutmanaged]]
.Caption Management by [classname]#VerticalLayout# and [classname]#FormLayout#.
-image::img/features-caption-layoutmanaged.png[]
+image::img/features-caption-layoutmanaged.png[width=50%,scaledwidth=65%]
Some components, such as [classname]#Button# and [classname]#Panel#, manage the
caption themselves and display it inside the component.
@@ -111,15 +110,14 @@ The tooltip is shown in <<figure.components.tooltip.plain>>.
[[figure.components.tooltip.plain]]
.Component Description as a Tooltip
-image::img/tooltip-plain-withpointer-hi.png[]
+image::img/tooltip-plain-withpointer-hi.png[width=30%, scaledwidth=100%]
A description is rendered as a tooltip in most components.
When a component error has been set with [methodname]#setComponentError()#, the
error is usually also displayed in the tooltip, below the description.
Components that are in error state will also display the error indicator. See
-<<dummy/../../../framework/application/application-errors#application.errors.error-indicator,"Error
-Indicator and Message">>.
+<<dummy/../../../framework/application/application-errors#application.errors.error-indicator, "Error Indicator and Message">>.
The description is actually not plain text, but you can use HTML tags to format
it. Such a rich text description can contain any HTML elements, including
@@ -129,7 +127,8 @@ images.
[source, java]
----
button.setDescription(
- "<h2><img src=\"../VAADIN/themes/sampler/icons/comment_yellow.gif\"/>"+
+ "<h2><img src=\"../VAADIN/themes/sampler/"+
+ "icons/comment_yellow.gif\"/>"+
"A richtext tooltip</h2>"+
"<ul>"+
" <li>Use rich formatting with HTML</li>"+
@@ -143,7 +142,7 @@ The result is shown in <<figure.components.tooltip.richtext>>.
[[figure.components.tooltip.richtext]]
.A Rich Text Tooltip
-image::img/tooltip-richtext-withpointer-hi.png[]
+image::img/tooltip-richtext-withpointer-hi.png[width=40%, scaledwidth=75%]
Notice that the setter and getter are defined for all fields in the
[classname]#Field# interface, not for all components in the
@@ -179,7 +178,7 @@ buttons.
[[figure.components.features.enabled.simple]]
.An Enabled and Disabled [classname]#Button#
-image::img/features-enabled-simple.png[]
+image::img/features-enabled-simple.png[width=30%, scaledwidth=50%]
A disabled component is automatically put in read-only state. No client
interaction with such a component is sent to the server and, as an important
@@ -206,19 +205,11 @@ have to join the style class names with a dot as done in the example below.
This would make the border of all disabled text fields dotted.
-
-//TODO This may change to
-$v-button-disabled-opacity
-In Valo theme, the opacity of disabled components is specified with the
-$v-disabled-opacity parameter
-
-ifdef::web[]
-, as described in
-<<dummy/../../../framework/themes/themes-valo#themes.valo.variables,"Common
-Settings">>
-endif::web[]
-.
-
+// TODO This may change to $v-button-disabled-opacity
+In the Valo theme, the opacity of disabled components is specified with the
+`$v-disabled-opacity`
+ifndef::web[parameter.]
+ifdef::web[parameter, as described in <<dummy/../../../framework/themes/themes-valo#themes.valo.variables,"Common Settings">>]
[[components.features.icon]]
== Icon
@@ -260,7 +251,7 @@ so if the root component has an icon, it will not be rendered.
[[figure.components.features.icon]]
.Displaying an Icon from a Theme Resource.
-image::img/features-icon.png[]
+image::img/features-icon.png[width=40%, scaledwidth=60%]
Some components, such as [classname]#Button# and [classname]#Panel#, manage the
icon themselves and display it inside the component.
@@ -307,12 +298,11 @@ layout.addComponent(date);
----
See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.locale.simple[on-line example, window="_blank"].
-The resulting date field is shown in
-<<figure.components.features.locale.simple>>.
+The resulting date field is shown in <<figure.components.features.locale.simple>>.
[[figure.components.features.locale.simple]]
-.Set Locale for [classname]#InlineDateField#
-image::img/features-locale-simple.png[]
+.Set locale for [classname]#InlineDateField#
+image::img/features-locale-simple.png[width=40%, scaledwidth=60%]
ifdef::web[]
[[components.features.locale.get]]
@@ -330,7 +320,6 @@ to the UI, which is usually the case in most constructors, so it is a bit
awkward to use it for internationalization. You can get the locale in
[methodname]#attach()#, as shown in the following example:
-
[source, java]
----
Button cancel = new Button() {
@@ -349,7 +338,6 @@ See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.loc
However, it is normally a better practice to use the locale of the current UI to
get the localized resource right when the component is created.
-
[source, java]
----
// Captions are stored in MyAppCaptions resource bundle
@@ -364,7 +352,6 @@ Button cancel =
layout.addComponent(cancel);
----
See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.locale.get-ui[on-line example, window="_blank"].
-
endif::web[]
ifdef::web[]
@@ -435,7 +422,7 @@ See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.loc
The user interface is shown in <<figure.components.features.locale.selection>>.
[[figure.components.features.locale.selection]]
-.Selecting a Locale
+.Selecting a locale
image::img/features-locale-selection.png[]
endif::web[]
@@ -450,7 +437,6 @@ The property defines whether the value of a component can be changed. The
property is mainly applicable to [classname]#Field# components, as they have a
value that can be edited by the user.
-
[source, java]
----
TextField readwrite = new TextField("Read-Write");
@@ -468,8 +454,8 @@ The resulting read-only text field is shown in
<<figure.components.features.readonly.simple>>.
[[figure.components.features.readonly.simple]]
-.A Read-Only Component.
-image::img/features-readonly-simple.png[]
+.A read-only component
+image::img/features-readonly-simple.png[width=50%, scaledwidth=80%]
Setting a layout or some other component container as read-only does not usually
make the contained components read-only recursively. This is different from, for
@@ -559,7 +545,6 @@ a [classname]#Panel# component would conflict with the built-in
The following CSS rule would apply the style to any component that has the
[literal]#++mystyle++# style.
-
[source, css]
----
.mystyle {
@@ -571,13 +556,11 @@ The following CSS rule would apply the style to any component that has the
}
----
-The resulting styled component is shown in
-<<figure.components.features.stylename>>
+The resulting styled component is shown in <<figure.components.features.stylename>>
[[figure.components.features.stylename]]
-.Component with a Custom Style
-image::img/features-stylename-simple.png[]
-
+.Component with a custom style
+image::img/features-stylename-simple.png[width=50%, scaledwidth=75%]
[[components.features.visible]]
== Visible
@@ -592,7 +575,6 @@ rules. This feature is important for security if you have components that
contain security-critical information that must only be shown in specific
application states.
-
[source, java]
----
TextField invisible = new TextField("No-see-um");
@@ -605,7 +587,7 @@ The resulting invisible component is shown in
<<figure.components.features.visible.simple>>.
[[figure.components.features.visible.simple]]
-.An Invisible Component.
+.An invisible component
image::img/features-visible-simple.png[]
Beware that invisible beings can leave footprints. The containing layout cell
@@ -664,7 +646,7 @@ mycomponent.setWidth("100%");
mycomponent.setHeight("400px");
----
-The " [literal]#++100%++#" percentage value makes the component take all
+The "[literal]#++100%++#" percentage value makes the component take all
available size in the particular direction (see the description of
[parameter]#Sizeable.UNITS_PERCENTAGE# in the table below). You can also use the
shorthand method [methodname]#setSizeFull()# to set the size to 100% in both
@@ -677,39 +659,29 @@ can set the height or width as undefined with
[parameter]#Sizeable.SIZE_UNDEFINED# parameter for [methodname]#setWidth()# and
[methodname]#setHeight()#.
-You always need to keep in mind that __a layout with undefined size may not
-contain components with defined relative size__, such as "full size". See
-<<dummy/../../../framework/layout/layout-settings#layout.settings.size,"Layout
-Size">> for details.
+Always keep in mind that _a layout with undefined size may not contain components with defined relative size_, such as "full size", except in some special cases.
+See <<dummy/../../../framework/layout/layout-settings#layout.settings.size,"Layout Size">> for details.
-The <<components.features.sizeable.units.table>> lists the available units and
-their codes defined in the [classname]#Sizeable# interface.
+The <<components.features.sizeable.units.table>> table lists the available units and their codes defined in the [interfacename]#Sizeable# interface.
[[components.features.sizeable.units.table]]
-.Size Units
-
+.Size units
+[cols="5,2,10", options="header"]
|===============
-|[parameter]#Unit.PIXELS#|px|The__pixel__is the basic hardware-specific measure of one physical display pixel.
-|[parameter]#Unit.POINTS#|pt|The__point__is a typographical unit, which is usually defined as 1/72 inches or about 0.35 mm. However, on displays the size can vary significantly depending on display metrics.
-|[parameter]#Unit.PICAS#|pc|The__pica__is a typographical unit, defined as 12 points, or 1/7 inches or about 4.233 mm. On displays, the size can vary depending on display metrics.
+|Constant|Unit|Description
+|[parameter]#Unit.PIXELS#|px|The _pixel_ is the basic hardware-specific measure of one physical display pixel.
+|[parameter]#Unit.POINTS#|pt|The _point_ is a typographical unit, which is usually defined as 1/72 inches or about 0.35 mm. However, on displays the size can vary significantly depending on display metrics.
+|[parameter]#Unit.PICAS#|pc|The _pica_ is a typographical unit, defined as 12 points, or 1/7 inches or about 4.233 mm. On displays, the size can vary depending on display metrics.
|[parameter]#Unit.EM#|em|A unit relative to the used font, the width of the upper-case "M" letter.
|[parameter]#Unit.EX#|ex|A unit relative to the used font, the height of the lower-case "x" letter.
|[parameter]#Unit.MM#|mm|A physical length unit, millimeters on the surface of a display device. However, the actual size depends on the display, its metrics in the operating system, and the browser.
-|[parameter]#Unit.CM#|cm|A physical length unit,__centimeters__on the surface of a display device. However, the actual size depends on the display, its metrics in the operating system, and the browser.
-|[parameter]#Unit.INCH#|in|A physical length unit,__inches__on the surface of a display device. However, the actual size depends on the display, its metrics in the operating system, and the browser.
-|[parameter]#Unit.PERCENTAGE#|%|A relative percentage of the available size. For example, for the top-level layout[parameter]#100%#would be the full width or height of the browser window. The percentage value must be between 0 and 100.
-
+|[parameter]#Unit.CM#|cm|A physical length unit, _centimeters_ on the surface of a display device. However, the actual size depends on the display, its metrics in the operating system, and the browser.
+|[parameter]#Unit.INCH#|in|A physical length unit, _inches_ on the surface of a display device. However, the actual size depends on the display, its metrics in the operating system, and the browser.
+|[parameter]#Unit.PERCENTAGE#|%|A relative percentage of the available size. For example, for the top-level layout [parameter]#100%# would be the full width or height of the browser window. The percentage value must be between 0 and 100.
|===============
-
-
-If a component inside [classname]#HorizontalLayout# or
-[classname]#VerticalLayout# has full size in the namesake direction of the
-layout, the component will expand to take all available space not needed by the
-other components. See
-<<dummy/../../../framework/layout/layout-settings#layout.settings.size,"Layout
-Size">> for details.
-
+If a component inside [classname]#HorizontalLayout# or [classname]#VerticalLayout# has full size in the namesake direction of the layout, the component will expand to take all available space not needed by the other components.
+See <<dummy/../../../framework/layout/layout-settings#layout.settings.size,"Layout Size">> for details.
== Managing Input Focus
@@ -719,8 +691,7 @@ component allows inputting text, the focus and insertion point are indicated by
a cursor. Pressing the Tab key moves the focus to the component next in the
__focus order__.
-Focusing is supported by all [classname]#Field# components and also by
-[classname]#Upload#.
+Focusing is supported by all [classname]#Field# components and also by the [classname]#Upload# component.
The focus order or __tab index__ of a component is defined as a positive integer
value, which you can set with [methodname]#setTabIndex()# and get with
diff --git a/documentation/components/components-fields.asciidoc b/documentation/components/components-fields.asciidoc
index 229592c74e..3083e331ac 100644
--- a/documentation/components/components-fields.asciidoc
+++ b/documentation/components/components-fields.asciidoc
@@ -15,8 +15,8 @@ user interface. <<figure.components.fields>> illustrates the inheritance
relationships and the important interfaces and base classes.
[[figure.components.fields]]
-.Field Components
-image::img/field-diagram-hi.png[]
+.Field components
+image::img/field-diagram-hi.png[width=60%, scaledwidth=100%]
Field components are built upon the framework defined in the [classname]#Field#
interface and the [classname]#AbstractField# base class.
@@ -30,7 +30,7 @@ The description of the field interfaces and base classes is broken down in the
following sections.
[[components.fields.field]]
-== [classname]#Field# Interface
+== The [classname]#Field# Interface
The [classname]#Field# interface inherits the [classname]#Component#
superinterface and also the [classname]#Property# interface to have a value for
@@ -39,8 +39,8 @@ the field. [classname]#AbstractField# is the only class implementing the
<<figure.components.fields.field>>.
[[figure.components.fields.field]]
-.[classname]#Field# Interface Inheritance Diagram
-image::img/field-interface-hi.png[]
+.[classname]#Field# interface inheritance
+image::img/field-interface-hi.png[width=60%, scaledwidth=100%]
You can set the field value with the [methodname]#setValue()# and read with the
[methodname]#getValue()# method defined in the [classname]#Property# interface.
@@ -61,9 +61,6 @@ guide.
The error message is set as the component error for the field and is usually
displayed in a tooltip when the mouse pointer hovers over the error indicator.
-
-
-
[[components.fields.databinding]]
== Data Binding and Conversions
@@ -180,28 +177,30 @@ requires that the value type of the property data source is
Vaadin includes the following built-in validators. The property value type is
indicated.
-[classname]#BeanValidator#:: Validates a bean property according to annotations defined in the Bean
-Validation API 1.0 (JSR-303). This validator is usually not used explicitly, but
-they are created implicitly when binding fields in a
-[classname]#BeanFieldGroup#. Using bean validation requires an implementation
-library of the API. See
-<<dummy/../../../framework/datamodel/datamodel-itembinding#datamodel.itembinding.beanvalidation,"Bean
-Validation">> for details.
-
-[classname]#CompositeValidator#:: Combines validators using logical AND and OR operators.
+[classname]#BeanValidator#::
+Validates a bean property according to annotations defined in the Bean Validation API 1.0 (JSR-303).
+This validator is usually not used explicitly, but they are created implicitly when binding fields in a [classname]#BeanFieldGroup#.
+Using bean validation requires an implementation library of the API.
+See <<dummy/../../../framework/datamodel/datamodel-itembinding#datamodel.itembinding.beanvalidation,"Bean Validation">> for details.
-[classname]#DateRangeValidator#:[classname]#Date#:: Checks that the date value is within the range at or between two given
-dates/times.
+[classname]#CompositeValidator#::
+Combines validators using logical AND and OR operators.
-[classname]#DoubleRangeValidator#:[classname]#Double#:: Checks that the double value is at or between two given values.
+[classname]#DateRangeValidator#: [classname]#Date#::
+Checks that the date value is within the range at or between two given dates/times.
-[classname]#EmailValidator#:[classname]#String#:: Checks that the string value is a syntactically valid email address. The
-validated syntax is close to the RFC 822 standard regarding email addresses.
+[classname]#DoubleRangeValidator#: [classname]#Double#::
+Checks that the double value is at or between two given values.
-[classname]#IntegerRangeValidator#:[classname]#Integer#:: Checks that the integer value is at or between two given values.
+[classname]#EmailValidator#: [classname]#String#::
+Checks that the string value is a syntactically valid email address.
+The validated syntax is close to the RFC 822 standard regarding email addresses.
-[classname]#NullValidator#:: Checks that the value is or is not a null value.
+[classname]#IntegerRangeValidator#: [classname]#Integer#::
+Checks that the integer value is at or between two given values.
+[classname]#NullValidator#::
+Checks whether the value is or is not a null value.
+
For the validator to be meaningful, the component must support inputting null
values. For example, for selection components and [classname]#TextField#,
@@ -216,9 +215,11 @@ Setting field as __required__ can be used for similar effect, and it also
enables an indicator to indicate that a value is required.
endif::web[]
-[classname]#RegexpValidator#:[classname]#String#:: Checks that the value matches with the given regular expression.
+[classname]#RegexpValidator#: [classname]#String#::
+Checks that the value matches with the given regular expression.
-[classname]#StringLengthValidator#:[classname]#String#:: Checks that the length of the input string is at or between two given lengths.
+[classname]#StringLengthValidator#: [classname]#String#::
+Checks that the length of the input string is at or between two given lengths.
ifdef::web[]
+
@@ -228,16 +229,13 @@ length, so it will be invalid if the minimum length is greater than zero.
Allowing null value is meaningful only if inputting null values is enabled with
[methodname]#setNullSettingAllowed(true)#, and typically in such case, you want
to set the null representation to empty string with
-[methodname]#setNullRepresentation("")#. Note that __this parameter is
-deprecated__ and should normally be [parameter]#true#; then you can use
+[methodname]#setNullRepresentation("")#. Note that _this parameter is
+deprecated_ and should normally be [parameter]#true#; then you can use
[methodname]#setRequired()# (for the false case) or [classname]#NullValidator#.
endif::web[]
-
-
Please see the API documentation for more details.
-
[[components.fields.validation.automatic]]
=== Automatic Validation
@@ -275,12 +273,12 @@ final TextField field = new TextField("Name");
field.setNullRepresentation("");
field.setNullSettingAllowed(true);
layout.addComponent(field);
-
+
// Define validation as usual
field.addValidator(new StringLengthValidator(
"The name must be 1-10 letters (was {0})",
1, 10, true));
-
+
// Run validation explicitly
Button validate = new Button("Validate");
validate.addClickListener(new ClickListener() {
@@ -321,7 +319,7 @@ class MyValidator implements Validator {
}
}
-final TextField field = new TextField("Say hello");
+TextField field = new TextField("Say hello");
field.addValidator(new MyValidator());
field.setImmediate(true);
layout.addComponent(field);
@@ -338,8 +336,4 @@ Forms by Binding Fields to Items">>, calling [methodname]#commit()# for the
group runs the validation for all the fields in the group, and if successful,
writes the input values to the data source.
-
-
(((range="endofrange", startref="term.components.fields")))
-
-
diff --git a/documentation/components/components-grid.asciidoc b/documentation/components/components-grid.asciidoc
index 6cd064c4b7..9b465a71b0 100644
--- a/documentation/components/components-grid.asciidoc
+++ b/documentation/components/components-grid.asciidoc
@@ -30,8 +30,8 @@ easily. The grid data can be sorted by clicking on a column header;
shift-clicking a column header enables secondary sorting criteria.
[[figure.components.grid.features]]
-.A [classname]#Grid# Component
-image::img/grid-features.png[]
+.A [classname]#Grid#
+image::img/grid-features.png[width=70%, scaledwidth=100%]
The data area can be scrolled both vertically and horizontally. The leftmost
columns can be frozen, so that they are never scrolled out of the view. The data
@@ -263,7 +263,7 @@ Space bar is the default key for toggling the selection, but it can be customize
[[figure.components.grid.selection.multi]]
.Multiple Selection in [classname]#Grid#
-image::img/grid-selection-multi.png[]
+image::img/grid-selection-multi.png[width=50%, scaledwidth=75%]
The selection is managed through the [classname]#MultiSelectionMode# class. The
currently selected rows can be set with [methodname]#setSelected()# by a
@@ -296,7 +296,7 @@ Button delSelected = new Button("Delete Selected", e -> {
// Delete all selected data items
for (Object itemId: selection.getSelectedRows())
grid.getContainerDataSource().removeItem(itemId);
-
+
// Otherwise out of sync with container
grid.getSelectionModel().reset();
@@ -498,7 +498,6 @@ Note that, while [classname]#GeneratedPropertyContainer# implements
sorting on the generated properties requires special handling. In such cases,
generated properties or the entire container might not actually be sortable.
-
[[components.grid.renderer]]
== Column Renderers
@@ -506,12 +505,11 @@ A __renderer__ is a feature that draws the client-side representation of a data
value. This allows having images, HTML, and buttons in grid cells.
[[figure.components.grid.renderer]]
-.Column Renderers: Image, Date, HTML, and Button
-image::img/grid-renderers.png[]
-
-Renderers implement the [interfacename]#Renderer# interface. You set the column
-renderer in the [classname]#Grid.Column# object as follows:
+.Column renderers: image, date, HTML, and button
+image::img/grid-renderers.png[width=75%, scaledwidth=100%]
+Renderers implement the [interfacename]#Renderer# interface.
+You set the column renderer in the [classname]#Grid.Column# object as follows:
[source, java]
----
@@ -531,16 +529,14 @@ client-side to be rendered with the renderer.
The following renderers are available, as defined in the server-side
[package]#com.vaadin.ui.renderers# package:
-[classname]#ButtonRenderer#:: Renders the data value as the caption of a button. A
-[interfacename]#RendererClickListener# can be given to handle the button clicks.
+[classname]#ButtonRenderer#:: Renders the data value as the caption of a button. A [interfacename]#RendererClickListener# can be given to handle the button clicks.
ifdef::web[]
++
Typically, a button renderer is used to display buttons for operating on a data
item, such as edit, view, delete, etc. It is not meaningful to store the button
captions in the data source, rather you want to generate them, and they are
usually all identical.
-
-
+
[source, java]
----
@@ -579,15 +575,15 @@ grid.getColumn("delete")
.removeItem(e.getItemId())));
----
endif::web[]
-[classname]#ImageRenderer#:: Renders the cell as an image. The column type must be a
-[interfacename]#Resource#, as described in
-<<dummy/../../../framework/application/application-resources#application.resources,"Images
-and Other Resources">>; only [classname]#ThemeResource# and
+
+[classname]#ImageRenderer#:: Renders the cell as an image.
+The column type must be a [interfacename]#Resource#, as described in
+<<dummy/../../../framework/application/application-resources#application.resources,"Images and Other Resources">>; only [classname]#ThemeResource# and
[classname]#ExternalResource# are currently supported for images in
[classname]#Grid#.
ifdef::web[]
-
++
[source, java]
----
grid.addColumn("picture", Resource.class)
@@ -605,7 +601,6 @@ Instead of creating the resource objects explicitly, as was done above, you
could generate them dynamically from file name strings using a
[interfacename]#Converter# for the column.
-
+
[source, java]
----
@@ -678,13 +673,14 @@ endif::web[]
}
----
endif::web[]
+
[classname]#DateRenderer#:: Formats a column with a [classname]#Date# type using string formatter. The
format string is same as for [methodname]#String.format()# in Java API. The date
is passed in the parameter index 1, which can be omitted if there is only one
-format specifier, such as " [literal]#++%tF++#".
+format specifier, such as "[literal]#++%tF++#".
ifdef::web[]
-
++
[source, java]
----
Grid.Column bornColumn = grid.getColumn("born");
@@ -698,13 +694,13 @@ Optionally, a locale can be given. Otherwise, the default locale (in the
component tree) is used.
endif::web[]
+
[classname]#HTMLRenderer#:: Renders the cell as HTML. This allows formatting cell content, as well as using
HTML features such as hyperlinks.
ifdef::web[]
++
First, set the renderer in the [classname]#Grid.Column# object:
-
-
+
[source, java]
----
@@ -716,7 +712,6 @@ ifdef::web[]
Then, in the grid data, give the cell content:
endif::web[]
-
+
[source, java]
----
@@ -727,8 +722,8 @@ grid.addRow("Nicolaus Copernicus", 1543,
+
You could also use a [interfacename]#PropertyFormatter# or a generated column to
generate the HTML for the links.
-
endif::web[]
+
[classname]#NumberRenderer#:: Formats column values with a numeric type extending [classname]#Number#:
[classname]#Integer#, [classname]#Double#, etc. The format can be specified
either by the subclasses of [classname]#java.text.NumberFormat#, namely
@@ -736,9 +731,8 @@ either by the subclasses of [classname]#java.text.NumberFormat#, namely
[methodname]#String.format()#.
ifdef::web[]
++
For example:
-
-
+
[source, java]
----
@@ -770,9 +764,8 @@ endif::web[]
must be between 0.0 and 1.0.
ifdef::web[]
++
For example:
-
-
+
[source, java]
----
@@ -973,7 +966,7 @@ the container must be of type that implements
[[figure.components.grid.filtering]]
.Filtering Grid
-image::img/grid-filtering.png[]
+image::img/grid-filtering.png[width=50%, scaledwidth=80%]
The filtering illustrated in <<figure.components.grid.filtering>> can be created
as follows:
@@ -997,16 +990,16 @@ HeaderRow filterRow = grid.appendHeaderRow();
for (Object pid: grid.getContainerDataSource()
.getContainerPropertyIds()) {
HeaderCell cell = filterRow.getCell(pid);
-
+
// Have an input field to use for filter
TextField filterField = new TextField();
filterField.setColumns(8);
-
+
// Update filter When the filter input is changed
filterField.addTextChangeListener(change -> {
// Can't modify filters so need to replace
container.removeContainerFilters(pid);
-
+
// (Re)create the filter if necessary
if (! change.getText().isEmpty())
container.addContainerFilter(
@@ -1028,7 +1021,7 @@ secondary or more sort criteria.
[[figure.components.grid.sorting]]
.Sorting Grid on Multiple Columns
-image::img/grid-sorting.png[]
+image::img/grid-sorting.png[width=50%, scaledwidth=75%]
Defining sort criteria programmatically can be done with the various
alternatives of the [methodname]#sort()# method. You can sort on a specific
@@ -1052,7 +1045,7 @@ direction can be given with an optional parameter.
[source, java]
----
-// Sort first by city and then by name
+// Sort first by city and then by name
grid.sort(Sort.by("city", SortDirection.ASCENDING)
.then("name", SortDirection.DESCENDING));
----
@@ -1098,7 +1091,7 @@ A row under editing is illustrated in <<figure.components.grid.editing>>.
[[figure.components.grid.editing]]
.Editing a Grid Row
-image::img/grid-editor-basic.png[]
+image::img/grid-editor-basic.png[width=50%, scaledwidth=75%]
[[components.grid.editing.unbuffered]]
=== Unbuffered Mode
@@ -1196,9 +1189,9 @@ public class Person implements Serializable {
@NotNull
@Size(min=2, max=10)
private String name;
-
+
@Min(1)
- @Max(130)
+ @Max(130)
private int age;
...]
----
@@ -1241,7 +1234,7 @@ first error in the editor.
[[figure.components.grid.errors]]
.Editing a Grid Row
-image::img/grid-editor-errors.png[]
+image::img/grid-editor-errors.png[width=50%, scaledwidth=75%]
You can modify the error handling by implementing a custom
[interfacename]#EditorErrorHandler# or by extending the
@@ -1403,5 +1396,3 @@ element, as well as the buttons.
((()))
-
-
diff --git a/documentation/components/components-label.asciidoc b/documentation/components/components-label.asciidoc
index 4545d40924..424e5ae76c 100644
--- a/documentation/components/components-label.asciidoc
+++ b/documentation/components/components-label.asciidoc
@@ -21,7 +21,6 @@ You can give the label text most conviniently in the constructor, as is done in
the following. Label has 100% default width, so the containing layout must also
have defined width.
-
[source, java]
----
// A container that is 100% wide by default
@@ -36,13 +35,12 @@ See the http://demo.vaadin.com/book-examples-vaadin7/book#component.label.basic[
accessing the text value, so you can get and set the text with
[methodname]#getValue()# and [methodname]#setValue()#.
-
[source, java]
----
// Get the label's text to initialize a field
TextField editor = new TextField(null, // No caption
label.getValue());
-
+
// Change the label's text
editor.addValueChangeListener(event -> // Java 8
label.setValue(editor.getValue()));
@@ -91,7 +89,7 @@ width of [classname]#Label# is the default 100%, the text in the
[[figure.components.label]]
.The Label Component
-image::img/label-example1.png[]
+image::img/label-example1.png[width=50%, scaledwidth=75%]
Setting [classname]#Label# to undefined width will cause it to not wrap at the
end of the line, as the width of the content defines the width. If placed inside
@@ -162,7 +160,7 @@ Label textLabel = new Label(
Label preLabel = new Label(
"Preformatted text is shown in an HTML <pre> tag.\n" +
"Formatting such as\n" +
- " * newlines\n" +
+ " * newlines\n" +
" * whitespace\n" +
"and such are preserved. HTML tags, \n"+
"such as <b>bold</b>, are quoted.",
@@ -184,7 +182,7 @@ The rendering will look as shown in <<figure.components.label.content-mode>>.
[[figure.components.label.content-mode]]
.Label Content Modes
-image::img/label-modes.png[]
+image::img/label-modes.png[width=75%, scaledwidth=100%]
ifdef::web[]
@@ -266,7 +264,7 @@ You can specify the data source either in the constructor or by the
// Some property
ObjectProperty<String> property =
new ObjectProperty<String>("some value");
-
+
// Label that is bound to the property
Label label = new Label(property);
----
@@ -305,7 +303,3 @@ would be delegated through the label.
The [classname]#Label# component has a [literal]#++v-label++# overall style. In
the [parameter]#PREFORMATTED# content mode, the text is wrapped inside a
[literal]#++<pre>++# element.
-
-
-
-
diff --git a/documentation/components/components-link.asciidoc b/documentation/components/components-link.asciidoc
index ce45d91a46..591c407741 100644
--- a/documentation/components/components-link.asciidoc
+++ b/documentation/components/components-link.asciidoc
@@ -55,7 +55,10 @@ caption below it.
[[figure.components.link.basic]]
.[classname]#Link# Example
-image::img/link.png[]
+image::img/link.png[width=30%, scaledwidth=70%]
+
+[[components.link.new-window]]
+== Opening a New Window
With the simple constructor used in the above example, the resource is opened in
the current window. Using the constructor that takes the target window as a
@@ -66,7 +69,6 @@ browser, the target can be any window, including windows not managed by the
application itself. You can use the special underscored target names, such as
[literal]#++_blank++# to open the link to a new browser window or tab.
-
[source, java]
----
// Hyperlink to a given URL
@@ -75,35 +77,15 @@ Link link = new Link("Take me a away to a faraway land",
// Open the URL in a new window/tab
link.setTargetName("_blank");
-
+
// Indicate visually that it opens in a new window/tab
link.setIcon(new ThemeResource("icons/external-link.png"));
link.addStyleName("icon-after-caption");
----
See the http://demo.vaadin.com/book-examples-vaadin7/book#component.link.target[on-line example, window="_blank"].
-Normally, the link icon is before the caption. You can have it right of the
-caption by reversing the text direction in the containing element.
-
-
-[source, css]
-----
-/* Position icon right of the link caption. */
-.icon-after-caption {
- direction: rtl;
-}
-/* Add some padding around the icon. */
-.icon-after-caption .v-icon {
- padding: 0 3px;
-}
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#component.link.target[on-line example, window="_blank"].
-
-The resulting link is shown in <<figure.components.link.new-window>>.
-
-[[figure.components.link.new-window]]
-.Link That Opens a New Window
-image::img/link-new.png[]
+[[components.link.pop-up]]
+== Opening as a Pop-Up Window
With the [literal]#++_blank++# target, a normal new browser window is opened. If
you wish to open it in a popup window (or tab), you need to give a size for the
@@ -113,7 +95,6 @@ which takes any of the defined border styles [parameter]#TARGET_BORDER_DEFAULT#,
[parameter]#TARGET_BORDER_MINIMAL#, and [parameter]#TARGET_BORDER_NONE#. The
exact result depends on the browser.
-
[source, java]
----
// Open the URL in a popup
@@ -124,15 +105,16 @@ link.setTargetWidth(400);
----
See the http://demo.vaadin.com/book-examples-vaadin7/book#component.link.target[on-line example, window="_blank"].
-In addition to the [classname]#Link# component, Vaadin allows alternative ways
-to make hyperlinks. The [classname]#Button# component has a
-[parameter]#Reindeer.BUTTON_LINK# style name that makes it look like a
-hyperlink, while handling clicks in a server-side click listener instead of in
-the browser. Also, you can make hyperlinks (or any other HTML) in a
-[classname]#Label# in HTML content mode.
+== Alternatives
-== CSS Style Rules
+In addition to the [classname]#Link# component, Vaadin allows alternative ways to make hyperlinks.
+Also, you can make hyperlinks (or any other HTML) in a [classname]#Label# in HTML content mode.
+The [classname]#Button# component has a [parameter]#Reindeer.BUTTON_LINK# style name that makes it look like a hyperlink, while handling clicks in a server-side click listener instead of in the browser.
+However, browsers do not generally allow opening new windows from with browser code, so for such tasks you need to use the [classname]#BrowserWindowOpener# extension described in <<dummy/../../../framework/advanced/advanced-windows#advanced.windows.popup, "Opening Pop-up Windows">>
+
+
+== CSS Style Rules
[source, css]
----
@@ -156,6 +138,30 @@ please notice that [literal]#++a:hover++# must come after an
[literal]#++a:link++# and [literal]#++a:visited++#, and [literal]#++a:active++#
after the [literal]#++a:hover++#.
+ifdef::web[]
+=== Icon Position
+Normally, the link icon is before the caption.
+You can have it right of the caption by reversing the text direction in the containing element.
+[source, css]
+----
+/* Position icon right of the link caption. */
+.icon-after-caption {
+ direction: rtl;
+}
+/* Add some padding around the icon. */
+.icon-after-caption .v-icon {
+ padding: 0 3px;
+}
+----
+See the http://demo.vaadin.com/book-examples-vaadin7/book#component.link.target[on-line example, window="_blank"].
+
+The resulting link is shown in <<figure.components.link.new-window>>.
+
+[[figure.components.link.new-window]]
+.Link That Opens a New Window
+image::img/link-new.png[width=25%, scaledwidth=50%]
+
+endif::web[]
diff --git a/documentation/components/components-listselect.asciidoc b/documentation/components/components-listselect.asciidoc
index b67f678957..261b68db46 100644
--- a/documentation/components/components-listselect.asciidoc
+++ b/documentation/components/components-listselect.asciidoc
@@ -23,7 +23,7 @@ visually identical in both modes.
----
// Create the selection component
ListSelect select = new ListSelect("The List");
-
+
// Add some items (here by the item ID as the caption)
select.addItems("Mercury", "Venus", "Earth", ...);
@@ -37,11 +37,10 @@ The number of visible items is set with [methodname]#setRows()#.
[[figure.components.listselect.basic]]
.The [classname]#ListSelect# Component
-image::img/listselect-basic.png[]
+image::img/listselect-basic.png[width=35%, scaledwidth=50%]
Common selection component features are described in
-<<dummy/../../../framework/components/components-selection#components.selection,"Selection
-Components">>.
+<<dummy/../../../framework/components/components-selection#components.selection,"Selection Components">>.
== CSS Style Rules
@@ -56,7 +55,3 @@ Components">>.
The component has an overall [literal]#++v-select++# style. The native
[literal]#++<select>++# element has [literal]#++v-select-select++# style. The
items are represented as [literal]#++<option>++# elements.
-
-
-
-
diff --git a/documentation/components/components-menubar.asciidoc b/documentation/components/components-menubar.asciidoc
index b108bb6dec..921116909b 100644
--- a/documentation/components/components-menubar.asciidoc
+++ b/documentation/components/components-menubar.asciidoc
@@ -12,19 +12,22 @@ ifdef::web[]
image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/interaction/menu-bar"]
endif::web[]
-The [classname]#MenuBar# component allows creating horizontal dropdown menus,
-much like the main menu in desktop applications.
+The [classname]#MenuBar# component allows creating horizontal drop-down menus, much like the main menu in desktop applications.
[[figure.components.menubar]]
.Menu Bar
-image::img/menubar-example1.png[]
+image::img/menubar-example1.png[width=40%, scaledwidth=60%]
+
+The menu items open as the user navigates them by hovering or clicking with the mouse.
+Menus can have separators to divide items into sub-sections.
+Menu items can have an icon and styling.
+They can also be checkable, so that the user can click on them to toggle between checked and unchecked.
[[components.menubar.creation]]
== Creating a Menu
The actual menu bar component is first created as follows:
-
[source, java]
----
MenuBar barmenu = new MenuBar();
@@ -63,7 +66,7 @@ MenuItem snacks = barmenu.addItem("Snacks", null, null);
snacks.addItem("Weisswurst", null, mycommand);
snacks.addItem("Bratwurst", null, mycommand);
snacks.addItem("Currywurst", null, mycommand);
-
+
// Yet another top-level item
MenuItem servs = barmenu.addItem("Services", null, null);
servs.addItem("Car Service", null, mycommand);
@@ -90,7 +93,7 @@ MenuBar.Command mycommand = new MenuBar.Command() {
selection.setValue("Ordered a " +
selectedItem.getText() +
" from menu.");
- }
+ }
};
----
@@ -173,13 +176,12 @@ the previously selected item. However, beware that the [literal]#++selected++#
style for menu items, that is, [literal]#++v-menubar-menuitem-selected++#, is
reserved for mouse-hover indication.
-
[source, java]
----
MenuBar barmenu = new MenuBar();
barmenu.addStyleName("mybarmenu");
layout.addComponent(barmenu);
-
+
// A feedback component
final Label selection = new Label("-");
layout.addComponent(selection);
@@ -197,9 +199,9 @@ MenuBar.Command mycommand = new MenuBar.Command() {
previous.setStyleName(null);
selectedItem.setStyleName("highlight");
previous = selectedItem;
- }
+ }
};
-
+
// Put some items in the menu
barmenu.addItem("Beverages", null, mycommand);
barmenu.addItem("Snacks", null, mycommand);
@@ -208,7 +210,6 @@ barmenu.addItem("Services", null, mycommand);
You could then style the highlighting in CSS as follows:
-
[source, css]
----
.mybarmenu .v-menubar-menuitem-highlight {
@@ -217,7 +218,3 @@ You could then style the highlighting in CSS as follows:
----
endif::web[]
-
-
-
-
diff --git a/documentation/components/components-nativeselect.asciidoc b/documentation/components/components-nativeselect.asciidoc
index 7d3f95a054..af0b3c01e7 100644
--- a/documentation/components/components-nativeselect.asciidoc
+++ b/documentation/components/components-nativeselect.asciidoc
@@ -21,7 +21,7 @@ the native selection input of web browsers, using the HTML
----
// Create the selection component
NativeSelect select = new NativeSelect("Native Selection");
-
+
// Add some items
select.addItems("Mercury", "Venus", ...);
----
@@ -31,11 +31,10 @@ The [methodname]#setColumns()# allows setting the width of the list as
[[figure.components.nativeselect.basic]]
.The [classname]#NativeSelect# Component
-image::img/nativeselect-basic.png[]
+image::img/nativeselect-basic.png[width=20%, scaledwidth=40%]
Common selection component features are described in
-<<dummy/../../../framework/components/components-selection#components.selection,"Selection
-Components">>.
+<<dummy/../../../framework/components/components-selection#components.selection,"Selection Components">>.
== CSS Style Rules
@@ -48,7 +47,3 @@ Components">>.
The component has a [literal]#++v-select++# overall style. The native
[literal]#++select++# element has [literal]#++v-select-select++# style.
-
-
-
-
diff --git a/documentation/components/components-optiongroup.asciidoc b/documentation/components/components-optiongroup.asciidoc
index cb5096e818..90fbc80581 100644
--- a/documentation/components/components-optiongroup.asciidoc
+++ b/documentation/components/components-optiongroup.asciidoc
@@ -16,12 +16,11 @@ endif::web[]
group of radio buttons in single selection mode. In multiple selection mode, the
items show up as check boxes. The common selection component features are
described in
-<<dummy/../../../framework/components/components-selection#components.selection,"Selection
-Components">>.
+<<dummy/../../../framework/components/components-selection#components.selection,"Selection Components">>.
[[figure.components.optiongroup]]
.Option Button Group in Single and Multiple Selection Mode
-image::img/optiongroup-basic.png[]
+image::img/optiongroup-basic.png[width=45%, scaledwidth=70%]
Option group is by default in single selection mode. Multiple selection is
enabled with [methodname]#setMultiSelect()#.
@@ -50,6 +49,7 @@ maintains the individual check box objects, you can get an array of the
currently selected items easily, and that you can easily change the appearance
of a single component.
+ifdef::web[]
[[components.optiongroup.disabling]]
== Disabling Items
@@ -63,7 +63,6 @@ find out whether an item is enabled with [methodname]#isItemEnabled()#.
The [methodname]#setItemEnabled()# identifies the item to be disabled by its
item ID.
-
[source, java]
----
// Have an option group with some items
@@ -79,10 +78,10 @@ in <<figure.components.optiongroup.disabling>>.
[[figure.components.optiongroup.disabling]]
.[classname]#OptionGroup# with a Disabled Item
-image::img/optiongroup-disabling.png[]
+image::img/optiongroup-disabling.png[width=25%, scaledwidth=50%]
Setting an item as disabled turns on the [literal]#++v-disabled++# style for it.
-
+endif::web[]
[[components.optiongroup.css]]
== CSS Style Rules
@@ -103,6 +102,8 @@ also have the [literal]#++v-select-option++# style that allows styling
regardless of the option type. Disabled items have additionally the
[literal]#++v-disabled++# style.
+ifdef::web[]
+
[[components.optiongroup.css.horizontal]]
=== Horizontal Layout
@@ -138,9 +139,6 @@ name for the component. The result is shown in
[[figure.components.optiongroup.horizontal]]
.Horizontal [classname]#OptionGroup#
-image::img/optiongroup-horizontal.png[]
-
-
-
-
+image::img/optiongroup-horizontal.png[width=35%, scaledwidth=50%]
+endif::web[]
diff --git a/documentation/components/components-passwordfield.asciidoc b/documentation/components/components-passwordfield.asciidoc
index 1c1ae3bb6d..87f466da0c 100644
--- a/documentation/components/components-passwordfield.asciidoc
+++ b/documentation/components/components-passwordfield.asciidoc
@@ -26,7 +26,7 @@ The result is shown in <<figure.components.passwordfield.basic>>.
[[figure.components.passwordfield.basic]]
.[classname]#PasswordField#
-image::img/passwordfield-basic.png[]
+image::img/passwordfield-basic.png[width=40%, scaledwidth=50%]
You should note that the [classname]#PasswordField# hides the input only from
"over the shoulder" visual observation. Unless the server connection is
@@ -38,7 +38,6 @@ possible by exploiting JavaScript execution security holes in the browser.
[[components.passwordfield.css]]
== CSS Style Rules
-
[source, css]
----
.v-textfield { }
@@ -46,9 +45,4 @@ possible by exploiting JavaScript execution security holes in the browser.
The [classname]#PasswordField# does not have its own CSS style name but uses the
same [literal]#++v-textfield++# style as the regular [classname]#TextField#. See
-<<dummy/../../../framework/components/components-textfield#components.textfield.css,"CSS
-Style Rules">> for information on styling it.
-
-CSS Styling
-
-
+<<dummy/../../../framework/components/components-textfield#components.textfield.css,"CSS Style Rules">> for information on styling it.
diff --git a/documentation/components/components-progressbar.asciidoc b/documentation/components/components-progressbar.asciidoc
index c33b791dc2..202a48efb8 100644
--- a/documentation/components/components-progressbar.asciidoc
+++ b/documentation/components/components-progressbar.asciidoc
@@ -12,13 +12,12 @@ ifdef::web[]
image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/interaction/progress-bar"]
endif::web[]
-The [classname]#ProgressBar# component allows displaying the progress of a task
-graphically. The progress is specified as a floating-point value between 0.0 and
-1.0.
+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 Progress Bar Component
-image::img/progressbar-basic.png[]
+.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#.
@@ -32,15 +31,13 @@ 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">>.
-
+<<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
@@ -67,15 +64,14 @@ bar.setIndeterminate(true);
----
[[figure.components.progressbar.indeterminate]]
-.Indeterminate Progress Bar
-image::img/progressbar-indeterminate.png[]
-
+.Indeterminate progress bar
+image::img/progressbar-indeterminate.png[width=15%, scaledwidth=40%]
ifdef::web[]
[[components.progressbar.thread]]
== Doing Heavy Computation
-The progress indicator is often used to display the progress of a heavy
+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
@@ -94,12 +90,12 @@ is displayed automatically when the browser polls the server.
----
HorizontalLayout barbar = new HorizontalLayout();
layout.addComponent(barbar);
-
-// Create the indicator, disabled until progress is started
+
+// 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);
@@ -136,7 +132,7 @@ class WorkThread extends Thread {
}
});
}
-
+
// Show the "all done" for a while
try {
sleep(2000); // Sleep for 2 seconds
@@ -149,10 +145,10 @@ class WorkThread extends Thread {
// 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");
}
@@ -181,8 +177,8 @@ button.addClickListener(new Button.ClickListener() {
The example is illustrated in <<figure.components.progressbar.thread>>.
[[figure.components.progressbar.thread]]
-.Doing Heavy Work
-image::img/progressbar-thread.png[]
+.Doing heavy work
+image::img/progressbar-thread.png[width=40%, scaledwidth=70%]
endif::web[]
@@ -197,18 +193,13 @@ endif::web[]
.v-progressbar-indicator {}
----
-The progress bar has a [literal]#++v-progressbar++# base style. The animation is
-the background of the element with [literal]#++v-progressbar-wrapper++# style,
-by default an animated GIF image. 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.
-
-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.
-
-
+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.
diff --git a/documentation/components/components-richtextarea.asciidoc b/documentation/components/components-richtextarea.asciidoc
index 53abc3cc6e..485fefc73a 100644
--- a/documentation/components/components-richtextarea.asciidoc
+++ b/documentation/components/components-richtextarea.asciidoc
@@ -37,7 +37,7 @@ rtarea.setValue("<h1>Hello</h1>\n" +
----
.Rich Text Area Component
-image::img/richtextarea-example1.png[]
+image::img/richtextarea-example1.png[width=60%, scaledwidth=90%]
Above, we used context-specific tags such as [literal]#++<h1>++# in the initial
HTML content. The rich text area component does not allow creating such tags,
@@ -69,8 +69,6 @@ scripting vulnerabilities and sanitization of user input.
====
-
-
ifdef::web[]
[[components.richtextarea.localization]]
== Localizing RichTextArea Toolbars
@@ -122,7 +120,3 @@ buttons and drop-down list boxes with the following respective style names:
.gwt-ToggleButton { }
.gwt-ListBox { }
----
-
-
-
-
diff --git a/documentation/components/components-selection.asciidoc b/documentation/components/components-selection.asciidoc
index 4bf7528b9f..0dc65f4f19 100644
--- a/documentation/components/components-selection.asciidoc
+++ b/documentation/components/components-selection.asciidoc
@@ -11,16 +11,27 @@ Vaadin offers many alternative ways for selecting one or more items. The core
library includes the following selection components, all based on the
[classname]#AbstractSelect# class:
-[classname]#ComboBox# (Section <<dummy/../../../framework/components/components-combobox#components.combobox,"ComboBox">>):: A drop-down list with a text box, where the user can type text to find matching items. The component also provides an input prompt and the user can enter new items.
-[classname]#ListSelect# (Section <<dummy/../../../framework/components/components-listselect#components.listselect,"ListSelect">>):: A vertical list box for selecting items in either single or multiple selection mode.
-[classname]#NativeSelect# (Section<<dummy/../../../framework/components/components-nativeselect#components.nativeselect,"NativeSelect">>):: Provides selection using the native selection component of the browser, typically a drop-down list for single selection and a multi-line list in multiselect mode. This uses the [literal]#++<select>++# element in HTML.
-[classname]#OptionGroup# (Section <<dummy/../../../framework/components/components-optiongroup#components.optiongroup,"OptionGroup">>):: Shows the items as a vertically arranged group of radio buttons in the single selection mode and of check boxes in multiple selection mode.
-[classname]#TwinColSelect# (Section <<dummy/../../../framework/components/components-twincolselect#components.twincolselect,"TwinColSelect">>):: Shows two list boxes side by side where the user can select items from a list of available items and move them to a list of selected items using control buttons.
+// TODO Only use section numbers here, prefixed with "Section", not include section title
+[classname]#ComboBox# (<<components-combobox#components.combobox,"ComboBox">>)::
+A drop-down list with a text box, where the user can type text to find matching items.
+The component also provides an input prompt and the user can enter new items.
-In addition, the [classname]#Tree#, [classname]#Table#, and
-[classname]#TreeTable# components allow special forms of selection. They also
-inherit the [classname]#AbstractSelect#.
+[classname]#ListSelect# (<<components-listselect#components.listselect,"ListSelect">>)::
+A vertical list box for selecting items in either single or multiple selection mode.
+
+[classname]#NativeSelect# (<<components-nativeselect#components.nativeselect, "NativeSelect">>)::
+Provides selection using the native selection component of the browser, typically a drop-down list for single selection and a multi-line list in multiselect mode.
+This uses the [literal]#++<select>++# element in HTML.
+
+[classname]#OptionGroup# (<<components-optiongroup#components.optiongroup,"OptionGroup">>)::
+Shows the items as a vertically arranged group of radio buttons in the single selection mode and of check boxes in multiple selection mode.
+
+[classname]#TwinColSelect# (<<components-twincolselect#components.twincolselect, "TwinColSelect">>)::
+Shows two list boxes side by side where the user can select items from a list of available items and move them to a list of selected items using control buttons.
+
+In addition, the [classname]#Tree#, [classname]#Table#, and [classname]#TreeTable# components allow special forms of selection.
+They also inherit [classname]#AbstractSelect#.
[[components.selection.databinding]]
== Binding Selection Components to Data
@@ -153,9 +164,10 @@ identifier.
----
// Create a selection component
ComboBox select = new ComboBox("Moons of Mars");
-select.setItemCaptionMode(ItemCaptionMode.EXPLICIT_DEFAULTS_ID);
+select.setItemCaptionMode(
+ ItemCaptionMode.EXPLICIT_DEFAULTS_ID);
-// Use the item ID also as the caption of this item
+// The given item ID is also used as the caption
select.addItem(new Integer(1));
// Set item caption for this item explicitly
@@ -173,7 +185,6 @@ ID:: String representation of the item identifier object is used as caption. Thi
useful when the identifier is a string, and also when the identifier is an
complex object that has a string representation. For example:
-
+
[source, java]
----
@@ -181,7 +192,8 @@ ComboBox select = new ComboBox("Inner Planets");
select.setItemCaptionMode(ItemCaptionMode.ID);
// A class that implements toString()
-class PlanetId extends Object implements Serializable {
+class PlanetId extends Object
+ implements Serializable {
String planetName;
PlanetId (String name) {
@@ -193,16 +205,19 @@ class PlanetId extends Object implements Serializable {
}
// Use such objects as item identifiers
-String planets[] = {"Mercury", "Venus", "Earth", "Mars"};
+String planets[] = {"Mercury", "Venus",
+ "Earth", "Mars"};
for (int i=0; i<planets.length; i++)
select.addItem(new PlanetId(planets[i]));
----
-INDEX:: Index number of item is used as caption. This caption mode is applicable only to
-data sources that implement the [classname]#Container.Indexed# interface. If the
-interface is not available, the component will throw a
-[classname]#ClassCastException#. The [classname]#AbstractSelect# itself does not
-implement this interface, so the mode is not usable without a separate data
-source. An [classname]#IndexedContainer#, for example, would work.
+
+INDEX::
+Index number of item is used as caption.
+This caption mode is applicable only to data sources that implement the [interfacename]#Container.Indexed# interface.
+If the interface is not available, the component will throw a
+[classname]#ClassCastException#.
+The [classname]#AbstractSelect# itself does not implement this interface, so the mode is not usable without a separate data source.
+An [classname]#IndexedContainer#, for example, would work.
ITEM:: [classname]#String# representation of item, acquired with
[methodname]#toString()#, is used as the caption. This is applicable mainly when
@@ -220,7 +235,6 @@ and you want to use a specific property for caption.
In the example below, we bind a selection component to a bean container and use
a property of the bean as the caption.
-
+
[source, java]
----
@@ -237,30 +251,35 @@ public class Planet implements Serializable {
... setters and getters ...
}
-public void captionproperty(VerticalLayout layout) {
+public void captionproperty(
+ VerticalLayout layout) {
// Have a bean container to put the beans in
BeanItemContainer<Planet> container =
- new BeanItemContainer<Planet>(Planet.class);
+ new BeanItemContainer<Planet>(
+ Planet.class);
// Put some example data in it
- container.addItem(new Planet(1, "Mercury"));
+ container.addItem(
+ new Planet(1, "Mercury"));
container.addItem(new Planet(2, "Venus"));
container.addItem(new Planet(3, "Earth"));
container.addItem(new Planet(4, "Mars"));
- // Create a selection component bound to the container
- ComboBox select = new ComboBox("Planets", container);
+ // Create a selection component bound
+ // to the container
+ ComboBox select = new ComboBox("Planets",
+ container);
- // Set the caption mode to read the caption directly
- // from the 'name' property of the bean
- select.setItemCaptionMode(ItemCaptionMode.PROPERTY);
+ // Set the caption mode to read the
+ // caption directly from the 'name'
+ // property of the bean
+ select.setItemCaptionMode(
+ ItemCaptionMode.PROPERTY);
select.setItemCaptionPropertyId("name");
...
----
-
-
[[components.selection.getset]]
== Getting and Setting Selection
@@ -311,7 +330,7 @@ The result of user interaction is shown in
[[figure.components.selection.valuechange]]
.Selected Item
-image::img/select-selected1.png[]
+image::img/select-selected1.png[width=30%, scaledwidth=40%]
[[components.selection.newitems]]
diff --git a/documentation/components/components-slider.asciidoc b/documentation/components/components-slider.asciidoc
index bc36fea39d..eb88433729 100644
--- a/documentation/components/components-slider.asciidoc
+++ b/documentation/components/components-slider.asciidoc
@@ -16,15 +16,18 @@ The [classname]#Slider# is a vertical or horizontal bar that allows setting a
numeric value within a defined range by dragging a bar handle with the mouse.
The value is shown when dragging the handle.
-[classname]#Slider# has a number of different constructors that take a
-combination of the caption, __minimum__ and __maximum__ value, __resolution__,
-and the __orientation__ of the slider.
+[[figure.components.slider.example1]]
+.Vertical and horizontal [classname]#Slider# components
+image::img/slider-example1-hi.png[width=40%, scaledwidth=70%]
+[classname]#Slider# has a number of different constructors that take a
+combination of the caption, _minimum_ and _maximum_ value, _resolution_,
+and the _orientation_ of the slider.
[source, java]
----
// Create a vertical slider
-final Slider vertslider = new Slider(1, 100);
+Slider vertslider = new Slider(1, 100);
vertslider.setOrientation(SliderOrientation.VERTICAL);
----
@@ -34,17 +37,12 @@ __max__:: Maximum value of the slider range. The default is 100.0.
__resolution__:: The number of digits after the decimal point. The default is 0.
-__orientation__:: The orientation can be either horizontal (
-[parameter]#SliderOrientation.HORIZONTAL#) or vertical (
-[parameter]#SliderOrientation.VERTICAL#). The default is horizontal.
-
-
+__orientation__:: The orientation can be either horizontal ([parameter]#SliderOrientation.HORIZONTAL#) or vertical ([parameter]#SliderOrientation.VERTICAL#). The default is horizontal.
As the [classname]#Slider# is a field component, you can handle value changes
with a [classname]#ValueChangeListener#. The value of the [classname]#Slider#
field is a [classname]#Double# object.
-
[source, java]
----
// Shows the value of the vertical slider
@@ -72,14 +70,13 @@ You can set the value with the [methodname]#setValue()# method defined in
[classname]#Slider# that takes the value as a native double value. The setter
can throw a [classname]#ValueOutOfBoundsException#, which you must handle.
-
[source, java]
----
// Set the initial value. This has to be set after the
// listener is added if we want the listener to handle
// also this value change.
try {
- vertslider.setValue(50.0);
+ vertslider.setValue(50.0);
} catch (ValueOutOfBoundsException e) {
}
----
@@ -91,10 +88,6 @@ does not do bounds checking.
examples) and horizontal sliders that control the size of a box. The slider
values are displayed also in separate labels.
-[[figure.components.slider.example1]]
-.The [classname]#Slider# Component
-image::img/slider-example1-hi.png[]
-
== CSS Style Rules
@@ -111,7 +104,3 @@ higher (for horizontal slider) or wider (for vertical slider) than the bar, the
handle element is nevertheless contained within the slider bar element. The
appearance of the handle comes from a background image defined in the
__background__ CSS property.
-
-
-
-
diff --git a/documentation/components/components-table.asciidoc b/documentation/components/components-table.asciidoc
index 6b045ea78e..d1839a8ac0 100644
--- a/documentation/components/components-table.asciidoc
+++ b/documentation/components/components-table.asciidoc
@@ -21,12 +21,9 @@ versatile components in Vaadin. Table cells can include text or arbitrary UI
components. You can easily implement editing of the table data, for example
clicking on a cell could change it to a text field for editing.
-The data contained in a [classname]#Table# is managed using the Data Model of
-Vaadin (see
-<<dummy/../../../framework/datamodel/datamodel-overview.asciidoc#datamodel.overview,"Binding
-Components to Data">>), through the [classname]#Container# interface of the
-[classname]#Table#. This makes it possible to bind a table directly to a data
-source, such as a database query. Only the visible part of the table is loaded
+The data contained in a [classname]#Table# is managed using the Vaadin data model (see <<dummy/../../../framework/datamodel/datamodel-overview.asciidoc#datamodel.overview,"Binding Components to Data">>), through the [classname]#Container# interface of the [classname]#Table#.
+This makes it possible to bind a table directly to a data source, such as a database query.
+Only the visible part of the table is loaded
into the browser and moving the visible window with the scrollbar loads content
from the server. While the data is being loaded, a tooltip will be displayed
that shows the current range and total number of items in the table. The rows of
@@ -46,7 +43,6 @@ parameter is used when new properties (columns) are added to the table, to fill
in the missing values. (This default has no meaning in the usual case, such as
below, where we add items after defining the properties.)
-
[source, java]
----
Table table = new Table("The Brightest Stars");
@@ -77,7 +73,7 @@ properties were added. The objects must be of the correct class, as defined in
the [methodname]#addContainerProperty()# calls.
.Basic Table Example
-image::img/table-example1.png[]
+image::img/table-example1.png[width=35%, scaledwidth=50%]
Scalability of the [classname]#Table# is largely dictated by the container. The
default [classname]#IndexedContainer# is relatively heavy and can cause
@@ -88,8 +84,7 @@ with just a few. With the current implementation of scrolling, there is a limit
of around 500 000 rows, depending on the browser and the pixel height of rows.
Common selection component features are described in
-<<dummy/../../../framework/components/components-selection#components.selection,"Selection
-Components">>.
+<<dummy/../../../framework/components/components-selection#components.selection,"Selection Components">>.
[[components.table.selecting]]
== Selecting Items in a Table
@@ -127,8 +122,8 @@ table.addValueChangeListener(new Property.ValueChangeListener() {
});
----
-.Table Selection Example
-image::img/table-example2.png[]
+.Table selection example
+image::img/table-example2.png[width=35%, scaledwidth=80%]
If the user clicks on an already selected item, the selection will deselected
and the table property will have [parameter]#null# value. You can disable this
@@ -221,7 +216,7 @@ table has been resized.
[[figure.component.table.columnresize]]
.Resizing Columns
-image::img/table-column-resize.png[]
+image::img/table-column-resize.png[width=50%, scaledwidth=80%]
[[components.table.features.reordering]]
@@ -267,7 +262,7 @@ See <<figure.component.table.columncollapsing>>.
[[figure.component.table.columncollapsing]]
.Collapsing Columns
-image::img/table-column-collapsing.png[]
+image::img/table-column-collapsing.png[width=40%, scaledwidth=80%]
If the table has undefined width, it minimizes its width to fit the width of the
visible columns. If some columns are initially collapsed, the width of the table
@@ -301,8 +296,9 @@ mode, a multiline [classname]#TextField#, a [classname]#CheckBox#, and a
[source, java]
----
-// Create a table and add a style to allow setting the row height in theme.
-final Table table = new Table();
+// Create a table and add a style to
+// allow setting the row height in theme.
+Table table = new Table();
table.addStyleName("components-inside");
/* Define the names and data types of columns.
@@ -372,7 +368,7 @@ The table will look as shown in <<figure.components.table.components-inside>>.
[[figure.components.table.components-inside]]
.Components in a Table
-image::img/table-components.png[]
+image::img/table-components.png[width=70%, scaledwidth=100%]
[[components.table.features.iterating]]
@@ -443,7 +439,7 @@ fields, as shown in <<figure.component.table.editable>>.
[[figure.component.table.editable]]
.A Table in Normal and Editable Mode
-image::img/table-editable3.png[]
+image::img/table-editable3.png[width=100%, scaledwidth=100%]
[[components.table.editing.fieldfactories]]
=== Field Factories
@@ -454,13 +450,13 @@ table are defined in a field factory that implements the
[classname]#DefaultFieldFactory#, which offers the following crude mappings:
.Type to Field Mappings in [classname]#DefaultFieldFactory#
-[options="header"]
+[options="header",cols="2,5"]
|===============
|Property Type|Mapped to Field Class
-|[classname]#Date#|A[classname]#DateField#.
-|[classname]#Boolean#|A[classname]#CheckBox#.
-|[classname]#Item#|A[classname]#Form#(deprecated in Vaadin 7). The fields of the form are automatically created from the item's properties using a[classname]#FormFieldFactory#. The normal use for this property type is inside a[classname]#Form#and is less useful inside a[classname]#Table#.
-|__other__|A[classname]#TextField#. The text field manages conversions from the basic types, if possible.
+|[classname]#Date#|A [classname]#DateField#.
+|[classname]#Boolean#|A [classname]#CheckBox#.
+|[classname]#Item#|A [classname]#Form# (deprecated in Vaadin 7). The fields of the form are automatically created from the item's properties using a [classname]#FormFieldFactory#. The normal use for this property type is inside a [classname]#Form# and is less useful inside a [classname]#Table#.
+|__other__|A [classname]#TextField#. The text field manages conversions from the basic types, if possible.
|===============
@@ -683,7 +679,7 @@ The resulting table is shown in
[[figure.components.table.headersfooters.footer]]
.A Table with a Footer
-image::img/table-footer.png[]
+image::img/table-footer.png[width=25%, scaledwidth=40%]
[[components.table.headersfooters.clicks]]
@@ -940,8 +936,8 @@ normal and editable modes.
simply formatted (black) with column generators.
[[figure.ui.table.generated]]
-.Table with Generated Columns in Normal and Editable Mode
-image::img/table-generatedcolumns1.png[]
+.Table with generated columns
+image::img/table-generatedcolumns1.png[width=90%, scaledwidth=100%]
endif::web[]
@@ -1013,21 +1009,15 @@ A table with the formatted date and decimal value columns is shown in
<<figure.components.table.columnformatting>>.
[[figure.components.table.columnformatting]]
-.Formatted Table Columns
-image::img/table-columnformatting.png[]
-
-You can use CSS for further styling of table rows, columns, and individual cells
-by using a [classname]#CellStyleGenerator#. It is described in
-<<components.table.css>>.
+.Formatted Table columns
+image::img/table-columnformatting.png[width=40%, scaledwidth=50%]
+You can use CSS for further styling of table rows, columns, and individual cells by using a [classname]#CellStyleGenerator#.
+ifdef::web[It is described in <<components.table.css>>.]
[[components.table.css]]
== CSS Style Rules
-Styling the overall style of a [classname]#Table# can be done with the following
-CSS rules.
-
-
[source, css]
----
.v-table {}
@@ -1157,8 +1147,8 @@ You can then style the cells, for example, as follows:
The table will look as shown in <<figure.components.table.cell-style>>.
[[figure.components.table.cell-style]]
-.Cell Style Generator for a Table
-image::img/table-cellstylegenerator1.png[]
+.Cell style generator for a Table
+image::img/table-cellstylegenerator1.png[width=50%, scaledwidth=80%]
endif::web[]
diff --git a/documentation/components/components-textarea.asciidoc b/documentation/components/components-textarea.asciidoc
index bf5288ec5c..2f2047b7fe 100644
--- a/documentation/components/components-textarea.asciidoc
+++ b/documentation/components/components-textarea.asciidoc
@@ -23,7 +23,7 @@ The following example creates a simple text area:
----
// Create the area
TextArea area = new TextArea("Big Area");
-
+
// Put some content in it
area.setValue("A row\n"+
"Another row\n"+
@@ -35,7 +35,7 @@ The result is shown in <<figure.components.textarea>>.
[[figure.components.textarea]]
.[classname]#TextArea# Example
-image::img/textarea-basic.png[]
+image::img/textarea-basic.png[width=40%, scaledwidth=50%]
You can set the number of visible rows with [methodname]#setRows()# or use the
regular [methodname]#setHeight()# to define the height in other units. If the
@@ -76,7 +76,7 @@ The result is shown in <<figure.components.textarea.wordwrap>>.
[[figure.components.textarea.wordwrap]]
.Word Wrap in [classname]#TextArea#
-image::img/textarea-wordwrap.png[]
+image::img/textarea-wordwrap.png[width=60%, scaledwidth=100%]
[[components.textarea.css]]
@@ -90,7 +90,3 @@ image::img/textarea-wordwrap.png[]
The HTML structure of [classname]#TextArea# is extremely simple, consisting only
of an element with [literal]#++v-textarea++# style.
-
-CSS Styling
-
-
diff --git a/documentation/components/components-textfield.asciidoc b/documentation/components/components-textfield.asciidoc
index 296eefb71e..8cb0629232 100644
--- a/documentation/components/components-textfield.asciidoc
+++ b/documentation/components/components-textfield.asciidoc
@@ -14,9 +14,8 @@ endif::web[]
((("[classname]#TextField#", id="term.components.textfield", range="startofrange")))
-[classname]#TextField# is one of the most commonly used user interface
-components. It is a [classname]#Field# component that allows entering textual
-values using keyboard.
+[classname]#TextField# is one of the most commonly used user interface components.
+It is a [classname]#Field# component that allows entering textual values with keyboard.
The following example creates a simple text field:
@@ -24,7 +23,7 @@ The following example creates a simple text field:
----
// Create a text field
TextField tf = new TextField("A Field");
-
+
// Put some initial content in it
tf.setValue("Stuff in the field");
----
@@ -34,7 +33,7 @@ The result is shown in <<figure.components.textfield.basic>>.
[[figure.components.textfield.basic]]
.[classname]#TextField# Example
-image::img/textfield-example.png[]
+image::img/textfield-example.png[width=40%, scaledwidth=50%]
Value changes are handled with a [classname]#Property.ValueChangeListener#, as
in most other fields. The value can be acquired with [methodname]#getValue()#
@@ -69,7 +68,7 @@ single-line text fields.
[[figure.components.textfield.api]]
.Text Field Class Relationships
-image::img/textfield-diagram-hi.png[width=50%]
+image::img/textfield-diagram-hi.png[width=40%, scaledwidth=70%]
[[components.textfield.databinding]]
== Data Binding
@@ -85,11 +84,11 @@ Between Property Type and Representation">>.
// doesn't support assignment from String, the object is
// reconstructed in the wrapper when the value is changed.
Double trouble = 42.0;
-
+
// Wrap it in a property data source
final ObjectProperty<Double> property =
new ObjectProperty<Double>(trouble);
-
+
// Create a text field bound to it
// (StringToDoubleConverter is used automatically)
TextField tf = new TextField("The Answer", property);
@@ -146,8 +145,7 @@ values. In such case, you might want to show a special value that stands for the
null value. You can set the null representation with the
[methodname]#setNullRepresentation()# method. Most typically, you use an empty
string for the null representation, unless you want to differentiate from a
-string that is explicitly empty. The default null representation is "
-[literal]#++null++#", which essentially warns that you may have forgotten to
+string that is explicitly empty. The default null representation is "[literal]#null#", which essentially warns that you may have forgotten to
initialize your data objects properly.
((("[methodname]#setNullSettingAllowed()#")))
@@ -180,7 +178,7 @@ interface is shown in <<figure.components.textfield.nullvalues>>.
[[figure.components.textfield.nullvalues]]
.Null Value Representation
-image::img/textfield-nullrepresentation.png[]
+image::img/textfield-nullrepresentation.png[width=35%, scaledwidth=50%]
(((range="endofrange", startref="term.components.textfield.nullvalues")))
@@ -231,7 +229,7 @@ The result is shown in <<figure.components.textfield.textchangeevents>>.
[[figure.components.textfield.textchangeevents]]
.Text Change Events
-image::img/textfield-textchangeevents.png[]
+image::img/textfield-textchangeevents.png[width=35%, scaledwidth=50%]
The __text change event mode__ defines how quickly the changes are transmitted
to the server and cause a server-side event. Lazier change events allow sending
diff --git a/documentation/components/components-tree.asciidoc b/documentation/components/components-tree.asciidoc
index abeb652f92..864dbac5d6 100644
--- a/documentation/components/components-tree.asciidoc
+++ b/documentation/components/components-tree.asciidoc
@@ -12,87 +12,153 @@ ifdef::web[]
image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/grids-and-trees/tree"]
endif::web[]
-The [classname]#Tree# component allows a natural way to represent data that has
-hierarchical relationships, such as filesystems or message threads. The
-[classname]#Tree# component in Vaadin works much like the tree components of
-most modern desktop user interface toolkits, for example in directory browsing.
+The [classname]#Tree# component allows a natural way to represent data that has hierarchical relationships.
+The user can drill down in the hierarchy by expanding items by clicking on the expand arrow, and likewise collapse items.
+[classname]#Tree# is a selection component that allows selecting items.
+It also supports drag and drop, so you can drag items to and from a tree, and drop them in the hierarchy.
-The typical use of the [classname]#Tree# component is for displaying a
-hierachical menu, like a menu on the left side of the screen, as in
-<<figure.components.tree>>, or for displaying filesystems or other hierarchical
-datasets. The [parameter]#menu# style makes the appearance of the tree more
-suitable for this purpose.
+A typical use of the [classname]#Tree# component is for displaying a hierarchical menu, as illustrated in <<figure.components.tree>>, or for displaying file systems or hierarchical datasets.
+[[figure.components.tree]]
+.A [classname]#Tree# component as a menu
+image::img/tree-example1.png[width=25%, scaledwidth=50%]
+
+The data is managed in a container implementing the [interfacename]#Hierarchical# interface, such as [classname]#HierarchicalContainer# or [classname]#FilesystemContainer#.
+You can use [classname]#ContainerHierarchicalWrapper# to add hierarchical capability to any other container. [classname]#Tree# itself implements the interface and delegates operations to the underlying container.
[source, java]
----
-final Object[][] planets = new Object[][]{
- new Object[]{"Mercury"},
- new Object[]{"Venus"},
- new Object[]{"Earth", "The Moon"},
- new Object[]{"Mars", "Phobos", "Deimos"},
- new Object[]{"Jupiter", "Io", "Europa", "Ganymedes",
- "Callisto"},
- new Object[]{"Saturn", "Titan", "Tethys", "Dione",
- "Rhea", "Iapetus"},
- new Object[]{"Uranus", "Miranda", "Ariel", "Umbriel",
- "Titania", "Oberon"},
- new Object[]{"Neptune", "Triton", "Proteus", "Nereid",
- "Larissa"}};
-
-Tree tree = new Tree("The Planets and Major Moons");
-
-/* Add planets as root items in the tree. */
-for (int i=0; i<planets.length; i++) {
- String planet = (String) (planets[i][0]);
- tree.addItem(planet);
-
- if (planets[i].length == 1) {
- // The planet has no moons so make it a leaf.
- tree.setChildrenAllowed(planet, false);
- } else {
- // Add children (moons) under the planets.
- for (int j=1; j<planets[i].length; j++) {
- String moon = (String) planets[i][j];
-
- // Add the item as a regular item.
- tree.addItem(moon);
-
- // Set it to be a child.
- tree.setParent(moon, planet);
-
- // Make the moons look like leaves.
- tree.setChildrenAllowed(moon, false);
- }
-
- // Expand the subtree.
- tree.expandItemsRecursively(planet);
+// A menu tree
+Tree menu = new Tree();
+
+// Couple of childless root items
+menu.addItem("Mercury");
+menu.setChildrenAllowed("Mercury", false);
+menu.addItem("Venus");
+menu.setChildrenAllowed("Venus", false);
+
+// An item with hierarchy
+menu.addItem("Earth");
+menu.addItem("The Moon");
+menu.setChildrenAllowed("The Moon", false);
+menu.setParent("The Moon", "Earth");
+menu.expandItem("Earth"); // Expand programmatically
+...
+----
+
+The result was shown in <<figure.components.tree>> in a practical situation, with the [classname]`Tree` wrapped inside a [classname]`Panel`.
+[classname]`Tree` itself does not have scrollbar, but [classname]`Panel` can be used for the purpose.
+
+The caption of tree items is by default the item ID.
+You can define how the item captions are determined with [methodname]#setItemCaptionMode()#, as explained <<components-selection#components.selection.captions, "Selection Component Item Captions">>.
+
+[[components.tree.selection]]
+== Handling Selection and Clicks
+
+[classname]#Tree# is a selection component, which are described in <<components-selection#components.selection, "Selection Components">>.
+You can thereby get or set the currently selected item by the value property of the tree, that is, with [methodname]#getValue()# and [methodname]#setValue()#.
+When the user selects an item, the tree will receive an [classname]#ValueChangeEvent#, which you can catch with a [classname]#ValueChangeListener#.
+
+[source, Java]
+----
+// Handle selection changes
+menu.addValueChangeListener(event -> { // Java 8
+ if (event.getProperty() != null &&
+ event.getProperty().getValue() != null) {
+ location.setValue("The cat is in " +
+ event.getProperty().getValue());
}
-}
+});
+----
+
+[classname]#Tree# is selectable by default; you can disallow selection with [methodname]#setSelectable(false)#.
-main.addComponent(tree);
+[classname]#Tree# also emits [classname]##ItemClickEvent##s when items are clicked.
+This way you can handle item clicks also when selection is not enabled or you want special user interaction specifically on clicks.
+
+[source, Java]
+----
+tree.addItemClickListener(
+ new ItemClickEvent.ItemClickListener() {
+ public void itemClick(ItemClickEvent event) {
+ // Pick only left mouse clicks
+ if (event.getButton() == ItemClickEvent.BUTTON_LEFT)
+ Notification.show("Left click",
+ Notification.Type.HUMANIZED_MESSAGE);
+ }
+ });
----
-<<figure.components.tree>> below shows the tree from the code example in a
-practical situation.
+[[components.tree.expand-collapse]]
+== Expanding and Collapsing Items
-[[figure.components.tree]]
-.A [classname]#Tree# Component as a Menu
-image::img/tree-example1.png[]
+An item can have children only if the [propertyname]#childrenAllowed# property is set as true.
+The expand indicator is shown when and only when the property is true.
+The property is defined in the container and can be set with [methodname]#setChildrenAllowed()#.
+
+Expanding an item fires an [classname]#Tree.ExpandEvent# and collapsing an [classname]#Tree.CollapseEvent#, which you can handle with respective listeners.
+
+[source, Java]
+----
+tree.addExpandListener(new Tree.ExpandListener() {
+ public void nodeExpand(ExpandEvent event) {
+ Notification.show("Expand!");
+ }
+});
+----
+
+You can expand and collapse items programmatically with [methodname]#expandItem()# or [methodname]#expandItemRecursively()#.
+
+[source, Java]
+----
+// Expand all items that can be
+for (Object itemId: tree.getItemIds())
+ tree.expandItem(itemId);
+----
+
+TIP: [classname]#Tree# itself does not support lazy loading, which makes it impractical for huge hierarchies.
+You can implement one kind of lazy loading by adding items in an expand listener and removing them in a collapse listener.
+For more proper lazy loading, you can use [classname]#TreeTable# or hierarchical support extension for [classname]#Grid#.
+
+[[components.tree.css]]
+== CSS Style Rules
-You can read or set the currently selected item by the value property of the
-[classname]#Tree# component, that is, with [methodname]#getValue()# and
-[methodname]#setValue()#. When the user clicks an item on a tree, the tree will
-receive an [classname]#ValueChangeEvent#, which you can catch with a
-[classname]#ValueChangeListener#. To receive the event immediately after the
-click, you need to set the tree as [classname]#setImmediate(true)#.
+[source, css]
+----
+.v-tree {}
+ .v-tree-node {} /* A node (item) */
+ .v-tree-node-caption {} /* Caption of the node */
+ .v-tree-node-children {} /* Contains child nodes */
+ .v-tree-node-root {} /* If node is a root node */
+ .v-tree-node-leaf {} /* If node has no children */
+----
-The [classname]#Tree# component uses [classname]#Container# data sources much
-like the [classname]#Table# component, with the addition that it also utilizes
-hierarchy information maintained by a [classname]#HierarchicalContainer#. The
-contained items can be of any item type supported by the container. The default
-container and its [methodname]#addItem()# assume that the items are strings and
-the string value is used as the item ID.
+[[components.tree.css.itemstyles]]
+=== Generating Item Styles
+You can style each tree item individually by generating a style name for them with a [interfacename]#Tree.ItemStyleGenerator#, which you assign to a tree with [methodname]#setItemStyleGenerator()#.
+The generator should return a style name for each item or `null`.
+[source, Java]
+----
+// Show all leaf nodes as disabled
+tree.setItemStyleGenerator(new Tree.ItemStyleGenerator() {
+ @Override
+ public String getStyle(Tree source, Object itemId) {
+ if (! tree.hasChildren(itemId))
+ return "disabled";
+ return null;
+ }
+});
+----
+The style names are prefixed with `v-tree-node-caption-`.
+You could thereby define the item styling as follows:
+
+[source, CSS]
+----
+.v-tree-node-caption-disabled {
+ color: graytext;
+ font-style: italic;
+}
+----
diff --git a/documentation/components/components-treetable.asciidoc b/documentation/components/components-treetable.asciidoc
index a781568d2d..97dedd3e7c 100644
--- a/documentation/components/components-treetable.asciidoc
+++ b/documentation/components/components-treetable.asciidoc
@@ -20,20 +20,19 @@ The default container is [classname]#HierarchicalContainer#, but you can bind
[classname]#TreeTable# to any container implementing the interface.
[[figure.components.treetable.basic]]
-.[classname]#TreeTable# Component
-image::img/treetable-basic.png[]
+.The [classname]#TreeTable# component
+image::img/treetable-basic.png[width=40%, scaledwidth=60%]
As with [classname]#Tree#, you can define the parent-child relationships with
[methodname]#setParent()#, as is shown in the following example with numeric
item IDs:
-
[source, java]
----
TreeTable ttable = new TreeTable("My TreeTable");
ttable.addContainerProperty("Name", String.class, null);
ttable.addContainerProperty("Number", Integer.class, null);
-
+
// Create the tree nodes and set the hierarchy
ttable.addItem(new Object[]{"Menu", null}, 0);
ttable.addItem(new Object[]{"Beverages", null}, 1);
@@ -58,10 +57,10 @@ Unlike [classname]#Tree#, a [classname]#TreeTable# can have components in the
hierarchical column, both when the property type is a component type and when
the tree table is in editable mode.
-For other features, we refer you to documentation for [classname]#Table#, as
-given in
-<<dummy/../../../framework/components/components-table#components.table,"Table">>.
+For other features, we refer you to documentation for [classname]#Table# in
+<<dummy/../../../framework/components/components-table#components.table,"Table">> and [classname]#Tree# in <<dummy/../../../framework/components/components-tree#components.tree,"Tree">>.
+ifdef::web[]
[[components.treetable.collapsed]]
== Expanding and Collapsing Items
@@ -80,7 +79,7 @@ over all the items, but you need to get the IDs from the underlying container.
for (Object itemId: ttable.getContainerDataSource()
.getItemIds()) {
ttable.setCollapsed(itemId, false);
-
+
// As we're at it, also disallow children from
// the current leaves
if (! ttable.hasChildren(itemId))
@@ -96,6 +95,4 @@ the container, thereby avoiding the explicit settings and memory overhead. There
are no built-in collapsible containers in the Vaadin core framework, so you
either need to use an add-on container or implement it yourself.
-
-
-
+endif::web[]
diff --git a/documentation/components/components-twincolselect.asciidoc b/documentation/components/components-twincolselect.asciidoc
index 5ffb84b02e..08b83cc799 100644
--- a/documentation/components/components-twincolselect.asciidoc
+++ b/documentation/components/components-twincolselect.asciidoc
@@ -21,7 +21,7 @@ clicking on the "&lt;&lt;" button.
[[figure.components.twincolselect.basic]]
.Twin Column Selection
-image::img/twincolselect-basic.png[]
+image::img/twincolselect-basic.png[width=50%, scaledwidth=80%]
[classname]#TwinColSelect# is always in multi-select mode, so its property value
is always a collection of the item IDs of the selected items, that is, the items
@@ -94,7 +94,3 @@ button area, which has overall [literal]#++v-select-twincol-buttons++# style;
the actual buttons reuse the styles for the [classname]#Button# component.
Between the buttons is a divider element with
[literal]#++v-select-twincol-deco++# style.
-
-
-
-
diff --git a/documentation/components/components-upload.asciidoc b/documentation/components/components-upload.asciidoc
index bf5713943f..bb46228398 100644
--- a/documentation/components/components-upload.asciidoc
+++ b/documentation/components/components-upload.asciidoc
@@ -21,15 +21,14 @@ user sends the file by clicking the upload submit button.
Uploading requires a receiver that implements [interfacename]#Upload.Receiver#
to provide an output stream to which the upload is written by the server.
-
[source, java]
----
Upload upload = new Upload("Upload it here", receiver);
----
[[figure.ui.upload]]
-.Upload Component
-image::img/upload.png[]
+.The [classname]#Upload# component
+image::img/upload.png[width=60%, scaledwidth=80%]
You can set the text of the upload button with [methodname]#setButtonCaption()#.
Note that it is difficult to change the caption or look of the
@@ -38,7 +37,6 @@ language of the [guibutton]#Browse# button is determined by the browser, so if
you wish to have the language of the [classname]#Upload# component consistent,
you will have to use the same language in your application.
-
[source, java]
----
upload.setButtonCaption("Upload Now");
@@ -88,7 +86,6 @@ The following example uploads images to [filename]#/tmp/uploads# directory in
(UNIX) filesystem (the directory must exist or the upload fails). The component
displays the uploaded image in an [classname]#Image# component.
-
[source, java]
----
// Show uploaded file in this placeholder
@@ -99,7 +96,7 @@ image.setVisible(false);
// listener for successful upload
class ImageUploader implements Receiver, SucceededListener {
public File file;
-
+
public OutputStream receiveUpload(String filename,
String mimeType) {
// Create upload stream
@@ -124,13 +121,13 @@ class ImageUploader implements Receiver, SucceededListener {
image.setSource(new FileResource(file));
}
};
-ImageUploader receiver = new ImageUploader();
+ImageUploader receiver = new ImageUploader();
// Create the upload with a caption and set receiver later
Upload upload = new Upload("Upload Image Here", receiver);
upload.setButtonCaption("Start Upload");
upload.addSucceededListener(receiver);
-
+
// Put the components in a panel
Panel panel = new Panel("Cool Image Storage");
Layout panelContent = new VerticalLayout();
@@ -147,8 +144,7 @@ shown in <<figure.ui.upload.example>>.
[[figure.ui.upload.example]]
.Image Upload Example
-image::img/upload-example.png[]
-
+image::img/upload-example.png[width=60%, scaledwidth=80%]
[[components.upload.css]]
== CSS Style Rules
@@ -166,7 +162,3 @@ image::img/upload-example.png[]
The [classname]#Upload# component has an overall [literal]#++v-upload++# style.
The upload button has the same structure and style as a regular
[classname]#Button# component.
-
-
-
-
diff --git a/documentation/components/img/customfield-basic.png b/documentation/components/img/customfield-basic.png
new file mode 100644
index 0000000000..a89d9e05b5
--- /dev/null
+++ b/documentation/components/img/customfield-basic.png
Binary files differ
diff --git a/documentation/components/img/slider-example1-hi.png b/documentation/components/img/slider-example1-hi.png
index 2c4694f826..d2d6c495a4 100644
--- a/documentation/components/img/slider-example1-hi.png
+++ b/documentation/components/img/slider-example1-hi.png
Binary files differ
diff --git a/documentation/components/img/slider-orig.png b/documentation/components/img/slider-orig.png
index 2b135ce290..206edb995f 100644
--- a/documentation/components/img/slider-orig.png
+++ b/documentation/components/img/slider-orig.png
Binary files differ
diff --git a/documentation/components/img/table-columnformatting.png b/documentation/components/img/table-columnformatting.png
index 3367e49fb1..d5549b8b30 100644
--- a/documentation/components/img/table-columnformatting.png
+++ b/documentation/components/img/table-columnformatting.png
Binary files differ
diff --git a/documentation/components/img/tree-example1.png b/documentation/components/img/tree-example1.png
index 33a1b34291..509d9a5074 100644
--- a/documentation/components/img/tree-example1.png
+++ b/documentation/components/img/tree-example1.png
Binary files differ
diff --git a/documentation/components/original-drawings/slider-example1.svg b/documentation/components/original-drawings/slider-example1.svg
index a624789c13..f1c2e405cf 100644
--- a/documentation/components/original-drawings/slider-example1.svg
+++ b/documentation/components/original-drawings/slider-example1.svg
@@ -1,127 +1,134 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="210mm"
- height="297mm"
- id="svg1901"
- sodipodi:version="0.32"
- inkscape:version="0.48.4 r9939"
- sodipodi:docname="slider-example1.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- version="1.1">
- <defs
- id="defs1903">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- id="perspective7" />
- <inkscape:perspective
- id="perspective2461"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 526.18109 : 1"
- sodipodi:type="inkscape:persp3d" />
- <inkscape:perspective
- id="perspective2579"
- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
- inkscape:vp_z="744.09448 : 526.18109 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 526.18109 : 1"
- sodipodi:type="inkscape:persp3d" />
- <linearGradient
- id="linearGradient7607"
- y2="471.38"
- spreadMethod="reflect"
- gradientUnits="userSpaceOnUse"
- y1="45.132999"
- gradientTransform="matrix(0.75592,0,0,1.3229,-36,0)"
- x2="1370.6"
- x1="-526.85999"
- inkscape:collect="always">
- <stop
- id="stop7603"
- style="stop-color:#000000"
- offset="0" />
- <stop
- id="stop7605"
- style="stop-color:#000000;stop-opacity:0"
- offset="1" />
- </linearGradient>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1.979899"
- inkscape:cx="258.73755"
- inkscape:cy="889.25792"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- gridtolerance="10000"
- inkscape:window-width="877"
- inkscape:window-height="739"
- inkscape:window-x="1039"
- inkscape:window-y="153"
- showgrid="false"
- inkscape:window-maximized="0" />
- <metadata
- id="metadata1906">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Taso 1"
- inkscape:groupmode="layer"
- id="layer1"
- style="opacity:1">
- <image
- y="56.505013"
- x="74.071419"
- id="image2463"
- height="236"
- width="249"
- sodipodi:absref="/home/magi/itmill/book-7/manual/img/components/slider-orig.png"
- xlink:href="/home/magi/itmill/book-7/manual/img/components/slider-orig.png" />
- <g
- transform="matrix(0.04895833,0,0,0.04895833,85.307423,133.89853)"
- id="g1317">
- <path
- id="path6080"
- style="fill:url(#linearGradient7607)"
- inkscape:connector-curvature="0"
- d="m 70.29,24.826 v 602.34 h 35.44 v -35.44 h 35.44 v -35.4 h 35.4 v -35.44 h 70.88 v 70.84 h 35.43 v 70.88 h 35.44 v 70.87 h 35.44 v 35.44 h 70.84 v -35.44 h 35.44 v -70.87 H 424.6 v -70.88 h -35.4 v -70.84 h -35.44 v -70.88 h 141.72 v -35.43 h -35.44 v -35.44 H 424.6 v -35.44 h -35.4 v -35.41 h -35.44 v -35.43 h -35.44 v -35.44 h -35.44 v -35.44 h -35.43 v -35.44 h -35.44 v -35.43 h -35.44 v -35.44 h -35.4 V 60.256 H 105.73 V 24.818 H 70.29 z" />
- <path
- id="rect1430"
- style="fill:#000000;fill-rule:evenodd"
- inkscape:connector-curvature="0"
- d="m 35.438,24.812 v 602.35 h 35.437 v -35.44 h 35.435 v -35.41 H 70.875 V 95.662 L 106.31,95.66 V 60.254 H 70.875 V 24.816 H 35.438 z m 70.872,70.844 v 35.434 h 35.41 V 95.656 h -35.41 z m 35.41,35.434 v 35.44 h 35.44 v -35.44 h -35.44 z m 35.44,35.44 v 35.44 h 35.43 v -35.44 h -35.43 z m 35.43,35.44 v 35.44 h 35.44 v -35.44 h -35.44 z m 35.44,35.44 v 35.43 h 35.44 v -35.43 h -35.44 z m 35.44,35.43 v 35.44 h 35.44 v -35.44 h -35.44 z m 35.44,35.44 v 35.41 h 35.43 v -35.41 h -35.43 z m 35.43,35.41 v 35.43 h 35.41 v -35.43 h -35.41 z m 35.41,35.43 v 35.44 H 283.47 v 106.32 h 35.44 V 450 h 141.71 v -35.44 h -35.43 v -35.44 h -35.44 z m -70.84,141.76 v 70.84 h 35.43 v -70.84 h -35.43 z m 35.43,70.84 v 70.87 h 35.41 v -70.87 h -35.41 z m 35.41,70.87 v 70.88 h 35.44 v -70.88 h -35.44 z m 0,70.88 h -70.84 v 35.44 h 70.84 v -35.44 z m -70.84,0 v -70.88 h -35.44 v 70.88 h 35.44 z m -35.44,-70.88 v -70.87 h -35.44 v 70.87 h 35.44 z m -35.44,-70.87 v -70.84 h -35.44 v 70.84 h 35.44 z M 212.59,520.88 V 450 h -35.43 v 35.44 h -35.44 v 35.44 h 70.87 z m -70.87,0 h -35.41 v 35.43 h 35.41 v -35.43 z" />
- <path
- id="rect3779"
- style="fill:#ffffff"
- inkscape:connector-curvature="0"
- d="m 70.875,95.656 v 460.65 h 35.435 v -35.43 h 35.41 v -35.44 h 35.44 v -35.44 h 35.43 v 70.88 h 35.44 v 70.84 h 35.44 v 70.87 h 35.44 v 70.88 h 70.84 v -70.88 h -35.41 v -70.87 h -35.43 v -70.84 h -35.44 v -106.32 h 106.28 v -35.44 h -35.41 v -35.43 h -35.43 v -35.41 h -35.44 v -35.44 h -35.44 v -35.43 h -35.44 v -35.44 h -35.43 v -35.44 h -35.44 v -35.44 H 106.31 V 95.648 H 70.875 z" />
- </g>
- </g>
-</svg>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r"
+ sodipodi:docname="slider-example1.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.1">
+ <defs
+ id="defs1903">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective7" />
+ <inkscape:perspective
+ id="perspective2461"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective2579"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ id="linearGradient7607"
+ y2="471.38"
+ spreadMethod="reflect"
+ gradientUnits="userSpaceOnUse"
+ y1="45.132999"
+ gradientTransform="matrix(0.75592,0,0,1.3229,-36,0)"
+ x2="1370.6"
+ x1="-526.85999"
+ inkscape:collect="always">
+ <stop
+ id="stop7603"
+ style="stop-color:#000000"
+ offset="0" />
+ <stop
+ id="stop7605"
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="212.24603"
+ inkscape:cy="847.82098"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ gridtolerance="10000"
+ inkscape:window-width="1116"
+ inkscape:window-height="882"
+ inkscape:window-x="800"
+ inkscape:window-y="153"
+ showgrid="false"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata1906">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Taso 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="opacity:1">
+ <rect
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="rect3344"
+ width="249"
+ height="236"
+ x="67.505424"
+ y="64.081154" />
+ <image
+ sodipodi:absref="/home/magi/itmill/vaadin/documentation/components/original-drawings/../img/slider-orig.png"
+ xlink:href="../img/slider-orig.png"
+ y="64.081154"
+ x="67.505424"
+ id="image2463"
+ height="236"
+ width="249" />
+ <g
+ transform="matrix(0.04895833,0,0,0.04895833,85.307423,133.89853)"
+ id="g1317">
+ <path
+ id="path6080"
+ style="fill:url(#linearGradient7607)"
+ inkscape:connector-curvature="0"
+ d="m 70.29,24.826 v 602.34 h 35.44 v -35.44 h 35.44 v -35.4 h 35.4 v -35.44 h 70.88 v 70.84 h 35.43 v 70.88 h 35.44 v 70.87 h 35.44 v 35.44 h 70.84 v -35.44 h 35.44 v -70.87 H 424.6 v -70.88 h -35.4 v -70.84 h -35.44 v -70.88 h 141.72 v -35.43 h -35.44 v -35.44 H 424.6 v -35.44 h -35.4 v -35.41 h -35.44 v -35.43 h -35.44 v -35.44 h -35.44 v -35.44 h -35.43 v -35.44 h -35.44 v -35.43 h -35.44 v -35.44 h -35.4 V 60.256 H 105.73 V 24.818 H 70.29 z" />
+ <path
+ id="rect1430"
+ style="fill:#000000;fill-rule:evenodd"
+ inkscape:connector-curvature="0"
+ d="m 35.438,24.812 v 602.35 h 35.437 v -35.44 h 35.435 v -35.41 H 70.875 V 95.662 L 106.31,95.66 V 60.254 H 70.875 V 24.816 H 35.438 z m 70.872,70.844 v 35.434 h 35.41 V 95.656 h -35.41 z m 35.41,35.434 v 35.44 h 35.44 v -35.44 h -35.44 z m 35.44,35.44 v 35.44 h 35.43 v -35.44 h -35.43 z m 35.43,35.44 v 35.44 h 35.44 v -35.44 h -35.44 z m 35.44,35.44 v 35.43 h 35.44 v -35.43 h -35.44 z m 35.44,35.43 v 35.44 h 35.44 v -35.44 h -35.44 z m 35.44,35.44 v 35.41 h 35.43 v -35.41 h -35.43 z m 35.43,35.41 v 35.43 h 35.41 v -35.43 h -35.41 z m 35.41,35.43 v 35.44 H 283.47 v 106.32 h 35.44 V 450 h 141.71 v -35.44 h -35.43 v -35.44 h -35.44 z m -70.84,141.76 v 70.84 h 35.43 v -70.84 h -35.43 z m 35.43,70.84 v 70.87 h 35.41 v -70.87 h -35.41 z m 35.41,70.87 v 70.88 h 35.44 v -70.88 h -35.44 z m 0,70.88 h -70.84 v 35.44 h 70.84 v -35.44 z m -70.84,0 v -70.88 h -35.44 v 70.88 h 35.44 z m -35.44,-70.88 v -70.87 h -35.44 v 70.87 h 35.44 z m -35.44,-70.87 v -70.84 h -35.44 v 70.84 h 35.44 z M 212.59,520.88 V 450 h -35.43 v 35.44 h -35.44 v 35.44 h 70.87 z m -70.87,0 h -35.41 v 35.43 h 35.41 v -35.43 z" />
+ <path
+ id="rect3779"
+ style="fill:#ffffff"
+ inkscape:connector-curvature="0"
+ d="m 70.875,95.656 v 460.65 h 35.435 v -35.43 h 35.41 v -35.44 h 35.44 v -35.44 h 35.43 v 70.88 h 35.44 v 70.84 h 35.44 v 70.87 h 35.44 v 70.88 h 70.84 v -70.88 h -35.41 v -70.87 h -35.43 v -70.84 h -35.44 v -106.32 h 106.28 v -35.44 h -35.41 v -35.43 h -35.43 v -35.41 h -35.44 v -35.44 h -35.44 v -35.43 h -35.44 v -35.44 h -35.43 v -35.44 h -35.44 v -35.44 H 106.31 V 95.648 H 70.875 z" />
+ </g>
+ </g>
+</svg>
diff --git a/documentation/getting-started/chapter-getting-started.asciidoc b/documentation/getting-started/chapter-getting-started.asciidoc
index 22397eb352..687029adaa 100644
--- a/documentation/getting-started/chapter-getting-started.asciidoc
+++ b/documentation/getting-started/chapter-getting-started.asciidoc
@@ -5,7 +5,6 @@ This chapter gives practical instructions for creating a Vaadin application proj
The instructions are given separately for the Eclipse IDE, NetBeans, and IntelliJ IDEA.
-
include::getting-started-overview.adoc[leveloffset=+2]
include::getting-started-libraries.asciidoc[leveloffset=+2]
@@ -14,12 +13,12 @@ include::getting-started-archetypes.asciidoc[leveloffset=+2]
include::getting-started-first-project.asciidoc[leveloffset=+2]
-include::getting-started-maven.asciidoc[leveloffset=+2]
-
include::getting-started-netbeans.asciidoc[leveloffset=+2]
include::getting-started-idea.asciidoc[leveloffset=+2]
+include::getting-started-maven.asciidoc[leveloffset=+2]
+
include::getting-started-package.asciidoc[leveloffset=+2]
include::getting-started-scala.asciidoc[leveloffset=+2]
diff --git a/documentation/getting-started/getting-started-first-project.asciidoc b/documentation/getting-started/getting-started-first-project.asciidoc
index 0ec7ed9c58..bfc9ddf154 100644
--- a/documentation/getting-started/getting-started-first-project.asciidoc
+++ b/documentation/getting-started/getting-started-first-project.asciidoc
@@ -14,7 +14,7 @@ Vaadin Plugin. The task will include the following steps:
. Write the source code
-. Configure and start Tomcat (or some other web server)
+. Configure and start web server
. Open a web browser to use the web application
@@ -26,11 +26,11 @@ This walkthrough assumes that you have already installed the Eclipse IDE, the Va
ifdef::web[]
[[getting-started.first-project.ivy]]
-== Creating the Project
+== Creating an Ivy Project
endif::web[]
ifdef::web[]
-_The following describes the creation of an Ivy project. The upcoming version of the Eclipse plug-in creates Maven projects. For that, see <<getting-started.first-project.creation>>._
+NOTE: The following describes the creation of an Ivy project. The upcoming version of the Eclipse plug-in creates Maven projects. For that, see <<getting-started.first-project.creation>>.
endif::web[]
ifdef::web[]
@@ -41,13 +41,13 @@ previous section. First, launch Eclipse and follow the following steps:
. In the [guilabel]#New Project# window that opens, select "Vaadin > Vaadin 7
Project" and click [guibutton]#Next#.
+
-image::img/myproject-ivy-new-vaadin.png[width=70%]
+image::img/myproject-ivy-new-vaadin.png[width=70%, scaledwidth=100%]
. In the [guilabel]#Vaadin Project# step, you need to set the basic web project
settings. You need to give at least the __project name__ and the runtime; the
default values should be good for the other settings.
+
-image::img/myproject-ivy-settings.png[width=70%]
+image::img/myproject-ivy-settings.png[width=70%, scaledwidth=100%]
[guilabel]#Project name#:: Give the project a name. The name should be a valid identifier usable
cross-platform as a filename and inside a URL, so using only lower-case
@@ -110,7 +110,7 @@ settings, or click [guibutton]#Next#.
the settings are pre-filled, and you should normally accept them as they are.
+
-image::img/myproject-ivy-web.png[]
+image::img/myproject-ivy-web.png[scaledwidth=100%]
[guilabel]#Context Root#:: The context root (of the application) identifies the application in the URL used
for accessing it. For example, if the project has a [literal]#++myproject++#
@@ -131,7 +131,7 @@ If you are trying out Vaadin for the first time, you should not need
to change anything. You can set most of the settings afterwards, except the
creation of the portlet configuration.
+
-image::img/myproject-vaadin.png[]
+image::img/myproject-vaadin.png[scaledwidth=100%]
[guilabel]#Create project template#:: Make the wizard create an UI class stub.
@@ -162,7 +162,7 @@ project hierarchy shown in the Project Explorer is shown in
[[figure.getting-started.first-project.exploring]]
.A New Vaadin Project
-image::img/myproject-ivy-created.png[scaledwidth=60%]
+image::img/myproject-ivy-created.png[width=40%, scaledwidth=60%]
The Vaadin libraries and other dependencies are managed by Ivy. Notice that the
libraries are not stored under the project folder, even though they are listed
@@ -224,8 +224,8 @@ endif::web[]
== Creating a Maven Project
ifdef::web[]
-_The following describes project creation in the upcoming version of the Eclipse plug-in, which creates Maven rather than Ivy projects.
-To use it, you must have installed the experimental version of the plug-in._
+NOTE: The following describes project creation in the upcoming version of the Eclipse plug-in, which creates Maven rather than Ivy projects.
+To use it, you must have installed the experimental version of the plug-in.
endif::web[]
Let us create the first application project with the tools installed in the previous section.
@@ -236,17 +236,17 @@ First, launch Eclipse and follow the following steps:
. In the [guilabel]#New Project# window that opens, select "Vaadin > Vaadin 7
Project (Maven)" and click [guibutton]#Next#.
+
-image::img/myproject-new-vaadin.png[width=70%]
+image::img/myproject-new-vaadin.png[width=70%, scaledwidth=90%]
. In the [guilabel]#Select a Maven archetype# step, you need to select the project type.
To create a simple test project, select the [guilabel]#Single-module Application Project#.
+
-image::img/myproject-archetype-selection.png[width=70%]
+image::img/myproject-archetype-selection.png[width=70%, scaledwidth=90%]
. In the [guilabel]#Specify archetype parameters# step, you need to give at least the [guilabel]#Group Id# and the [guilabel]#Artifact Id#.
The default values should be good for the other settings.
+
-image::img/myproject-settings.png[width=70%]
+image::img/myproject-settings.png[width=70%, scaledwidth=90%]
[guilabel]#Group Id#::
Give the project an organization-level identifier, for example, [packagename]#com.example#.
@@ -272,12 +272,13 @@ Finally, click [guibutton]#Finish# to create the project.
[[getting-started.first-project.exploring]]
== Exploring the Project
-After the [guilabel]#New Project# wizard exits, it has done all the work for you: a UI class skeleton has been written to the [filename]#src# directory.
+After the [guilabel]#New Project# wizard exits, it has done all the work for you.
+A UI class skeleton has been written to the [filename]#src# directory.
The project hierarchy shown in the Project Explorer is shown in <<figure.getting-started.first-project.exploring>>.
[[figure.getting-started.first-project.exploring]]
-.A new Vaadin Project
-image::img/myproject-created-annotated-hi.png[width=80%]
+.A new Vaadin project
+image::img/myproject-created-annotated-hi.png[width=80%, scaledwidth=100%]
The Vaadin libraries and other dependencies are managed by Maven.
Notice that the libraries are not stored under the project folder, even though they are listed in the "Java Resources > Libraries > Maven Dependencies" virtual folder.
@@ -295,7 +296,6 @@ import com.vaadin.ui.UI;
...
@Theme("mytheme")
-@Widgetset("com.example.myproject.MyAppWidgetset")
public class MyUI extends UI {
@Override
@@ -325,18 +325,20 @@ public class MyUI extends UI {
}
----
-[[getting-started.first-project.widgetset]]
-== Compiling the Widget Set and Theme
+[[getting-started.first-project.theme]]
+== Compiling the Theme
-Before running the project for the first time, select [guilabel]#Compile Widgetset and Theme# from the menu shown in <<figure.getting-started.first-project.compilewidgetset>>.
+Before running the project for the first time, click the [guilabel]#Compile Vaadin Theme# button in the toolbar, as shown in <<figure.getting-started.first-project.compiletheme>>.
-[[figure.getting-started.first-project.compilewidgetset]]
-.Compile Widgetset and Theme Menu
-image::img/myproject-compilewidgetset.png[width=50%]
+[[figure.getting-started.first-project.compiletheme]]
+.Compile Vaadin Theme
+image::img/myproject-compiletheme.png[width=40%, scaledwidth=60%]
[[getting-started.first-project.coding]]
== Coding Tips for Eclipse
+=== Code Completion
+
One of the most useful features in Eclipse is __code completion__. Pressing
kbd:[Ctrl+Space] in the editor will display a pop-up list of possible class name and
method name completions, as shown in
@@ -345,21 +347,20 @@ context of the cursor position.
[[figure.getting-started.first-project.coding.codecompletion]]
.Java Code Completion in Eclipse
-image::img/codingtips-codecompletion.png[]
-
-To add an [literal]#++import++# statement for a class, such as
-[classname]#Button#, simply press kbd:[Ctrl+Shift+O] or click the red error indicator on
-the left side of the editor window. If the class is available in multiple
-packages, a list of the alternatives is displayed, as shown in
-<<figure.getting-started.first-project.coding.import>>. For server-side
-development, you should normally use the classes under the
-[package]#com.vaadin.ui# or [package]#com.vaadin.server# packages. You can not
-use client-side classes (under [package]#com.vaadin.client#) or GWT classes for
-server-side development.
+image::img/codingtips-codecompletion.png[scaledwidth=100%]
+
+=== Generating Imports
+
+To automatically add an [literal]#++import++# statement for a class, such as
+[classname]#Button#, simply press kbd:[Ctrl+Shift+O] or click the red error indicator on the left side of the editor window.
+If the class is available in multiple packages, a list of the alternatives is displayed, as shown in <<figure.getting-started.first-project.coding.import>>.
[[figure.getting-started.first-project.coding.import]]
-.Importing Classes Automatically
-image::img/codingtips-automaticimports.png[scaledwidth=80%]
+.Importing classes automatically
+image::img/codingtips-automaticimports.png[scaledwidth=70%]
+
+For server-side Vaadin development, you should generally use the classes under the [package]#com.vaadin.ui# or [package]#com.vaadin.server# packages.
+_You can not use client-side classes (under [package]#com.vaadin.client#) or GWT classes for server-side development._
[[getting-started.first-project.server]]
== Setting Up and Starting the Web Server
@@ -375,29 +376,39 @@ directory.
Follow the following steps:
-. Switch to the Servers tab in the lower panel in Eclipse. List of servers should be empty after Eclipse is installed. Right-click on the empty area in the panel and select "New > Server".
+. Switch to the [guilabel]#Servers# tab in the lower panel in Eclipse.
+List of servers should be empty after Eclipse is installed.
+Right-click on the empty area in the panel and select "New > Server".
+ifdef::web[]
+
-image::img/tomcat-startserver-1.png[]
-
+image::img/tomcat-startserver-1.png[width=60%, scaledwidth=100%]
+endif::web[]
. Select "Apache > Tomcat v7.0 Server" and set [guilabel]#Server's host name# as [literal]#++localhost++#, which should be the default. If you have only one Tomcat installed, [guilabel]#Server runtime# has only one choice. Click [guibutton]#Next#.
+ifdef::web[]
+
-image::img/tomcat-startserver-2.png[]
-
+image::img/tomcat-startserver-2.png[width=60%, scaledwidth=100%]
+endif::web[]
. Add your project to the server by selecting it on the left and clicking [guibutton]#Add# to add it to the configured projects on the right. Click [guibutton]#Finish#.
+ifdef::web[]
+
-image::img/tomcat-startserver-3.png[]
+image::img/tomcat-startserver-3.png[width=60%, scaledwidth=100%]
+endif::web[]
. The server and the project are now installed in Eclipse and are shown in the [guilabel]#Servers# tab.
To start the server, right-click on the server and select [guilabel]#Debug#.
To start the server in non-debug mode, select [guilabel]#Start#.
+ifdef::web[]
+
-image::img/tomcat-startserver-4.png[]
+image::img/tomcat-startserver-4.png[width=60%, scaledwidth=100%]
+endif::web[]
. The server starts and the WebContent directory of the project is published to the server on http://localhost:8080/myproject/.
+ifdef::web[]
+
-image::img/tomcat-startserver-5.png[]
+image::img/tomcat-startserver-5.png[width=60%, scaledwidth=100%]
+endif::web[]
[[getting-started.first-project.run]]
== Running and Debugging
@@ -406,8 +417,12 @@ Starting your application is as easy as selecting [guilabel]#myproject# from the
[guilabel]#Project Explorer# and then "Run > Debug As > Debug on Server".
Eclipse then opens the application in built-in web browser.
+////
+// This is rather irrelevant
+//
.Running a Vaadin Application
-image::img/runningMyProject.png[width=60%]
+image::img/runningMyProject.png[width=60%, scaledwidth=80%]
+////
You can insert break points in the Java code by double-clicking on the left
margin bar of the source code window. For example, if you insert a breakpoint in
@@ -418,14 +433,20 @@ examine and change the state of the application.
To continue execution, select [guilabel]#Resume# from [guilabel]#Run# menu.
.Debugging a Vaadin Application
-image::img/debuggingMyProject.png[]
+image::img/debuggingMyProject.png[scaledwidth=100%]
Above, we described how to debug a server-side application.
Debugging client-side applications and widgets is described in
<<dummy/../../../framework/clientside/clientside-debugging#clientside.debugging,"Debugging Client-Side Code">>.
[[getting-started.eclipse.mavenlibraryupdate]]
+ifdef::web[]
== Updating the Vaadin Libraries in Maven Projects
+endif::web[]
+// The book only describes Maven projects
+ifndef::web[]
+== Updating the Vaadin Libraries
+endif::web[]
Updating the Vaadin plugin does not update Vaadin libraries. The libraries are
project specific, as a different version might be required for different
@@ -439,8 +460,9 @@ Updating the libraries can take several minutes. You can see the progress in the
Eclipse status bar. You can get more details about the progress by clicking the
indicator.
-. If you have compiled the widget set for your project, recompile it by clicking
-the [guibutton]#Compile Vaadin widgets# button in Eclipse toolbar.
+. _In Vaadin 7.6 and older_: if you have compiled the widget set for your project, recompile it by clicking the *Compile Vaadin Widgetset* button in the Eclipse toolbar.
++
+image::img/myproject-compilewidgetset.png[width=50%, scaledwidth=60%]
. Stop the integrated Tomcat (or other server) in Eclipse, clear its caches by
right-clicking the server and selecting [guilabel]#Clean# as well as
@@ -449,6 +471,7 @@ right-clicking the server and selecting [guilabel]#Clean# as well as
If you experience problems after updating the libraries, you can try using
"Maven > Update Project".
+ifdef::web[]
[[getting-started.eclipse.libraryupdate]]
== Updating the Vaadin Libraries in Ivy Projects
@@ -475,8 +498,9 @@ Updating the libraries can take several minutes. You can see the progress in the
Eclipse status bar. You can get more details about the progress by clicking the
indicator.
-. If you have compiled the widget set for your project, recompile it by clicking
-the [guibutton]#Compile Vaadin widgets# button in Eclipse toolbar.
+. If you have compiled the widget set for your project, recompile it by clicking the *Compile Vaadin Widgetset* button in Eclipse toolbar.
++
+image::img/myproject-compilewidgetset.png[width=50%, scaledwidth=60%]
. Stop the integrated Tomcat (or other server) in Eclipse, clear its caches by
right-clicking the server and selecting Clean as well as Clean Tomcat Work
@@ -486,3 +510,5 @@ If you experience problems after updating the libraries, you can try clearing
the Ivy resolution caches by right-clicking the project and selecting "Ivy >
Clean all caches".
Then, do the "Ivy > Resolve" and other tasks again.
+
+endif::web[]
diff --git a/documentation/getting-started/getting-started-idea.asciidoc b/documentation/getting-started/getting-started-idea.asciidoc
index c573770755..74f155a6d8 100644
--- a/documentation/getting-started/getting-started-idea.asciidoc
+++ b/documentation/getting-started/getting-started-idea.asciidoc
@@ -35,7 +35,7 @@ the [guilabel]#Java SDK# to be used for the project.
Vaadin requires at least Java 6.
If you have not configured a Java SDK previously, you can configure it here.
+
-image::img/idea-newproject-1.png[]
+image::img/idea-newproject-1.png[scaledwidth=100%]
+
Click [guibutton]#Next#.
@@ -45,7 +45,7 @@ Click [guibutton]#Next#.
path. You probably also want an application stub, so select [guilabel]#Create
sample application# and give a name for the generated UI class.
+
-image::img/idea-newproject-2.png[]
+image::img/idea-newproject-2.png[scaledwidth=100%]
+
Do __not__ click [guibutton]#Finish# yet.
@@ -54,7 +54,7 @@ Set it as an integrated server that you have configured in IntelliJ IDEA, as des
ifdef::web[]
+
-image::img/idea-newproject-3.png[]
+image::img/idea-newproject-3.png[scaledwidth=100%]
endif::web[]
. Click [guibutton]#Finish#.
@@ -62,7 +62,7 @@ endif::web[]
The project is created with the UI class stub and a [filename]#web.xml#
deployment descriptor.
-image::img/idea-newproject-4.png[]
+image::img/idea-newproject-4.png[scaledwidth=100%]
The wizard does not currently create a servlet class automatically, and uses
Servlet 2.4 compatible deployment with a [filename]#web.xml# deployment
@@ -92,7 +92,7 @@ server using a run/debug configuration.
. Enter a project name, location, and the Java SDK to be used for the project.
Vaadin requires at least Java 6.
+
-image::img/idea-maven-newproject-1.png[]
+image::img/idea-maven-newproject-1.png[scaledwidth=100%]
+
Click [guibutton]#Next#.
//&lt;?dbfo-need height="6cm" ?&gt;
@@ -101,7 +101,7 @@ Click [guibutton]#Next#.
[guilabel]#Version# for the project, or use the defaults.
+
-image::img/idea-maven-newproject-2.png[]
+image::img/idea-maven-newproject-2.png[scaledwidth=100%]
. Check [guilabel]#Create from archetype#
//&lt;?dbfo-need height="6cm" ?&gt;
diff --git a/documentation/getting-started/getting-started-maven.asciidoc b/documentation/getting-started/getting-started-maven.asciidoc
index 5d4618cb94..501f072912 100644
--- a/documentation/getting-started/getting-started-maven.asciidoc
+++ b/documentation/getting-started/getting-started-maven.asciidoc
@@ -11,7 +11,7 @@ layout: page
In previous sections, we looked into creating a Vaadin Maven project in different IDEs.
In this section, we look how to create such a project on command-line.
-You can then import such a project to your IDE.
+You can then import such a project in your IDE.
In addition to regular Maven, you can use any Maven-compatible build or
dependency management system, such as Ivy or Gradle. For Gradle, see the
@@ -35,7 +35,7 @@ line):
-DarchetypeGroupId=com.vaadin \
-DarchetypeArtifactId=[replaceable]#vaadin-archetype-application# \
-DarchetypeVersion=[replaceable]#7.x.x# \
- -DgroupId=[replaceable]#your.company# \
+ -DgroupId=[replaceable]#com.pany# \
-DartifactId=[replaceable]#project-name# \
-Dversion=[replaceable]#0.1# \
-Dpackaging=war
@@ -96,13 +96,14 @@ WAR package. You can do this with the [literal]#++package++# goal as follows:
The location of the resulting WAR package should be displayed in the command
output. You can then deploy it to your favorite application server.
-The easiest way to run Vaadin applications with Maven is to use the light-weight
-Jetty web server. After compiling the package, all you need to do is type:
+The easiest way to run Vaadin applications with Maven is to use the light-weight Jetty web server.
+After compiling the package, all you need to do is type:
[subs="normal"]
----
[prompt]#$# [command]#mvn# jetty:run
----
+
The special goal starts the Jetty server in port 8080 and deploys the
application. You can then open it in a web browser at
http://localhost:8080/project-name.
@@ -110,17 +111,16 @@ http://localhost:8080/project-name.
(((range="endofrange", startref="term.maven.compiling")))
[[getting-started.maven.addons]]
-== Using Add-ons and Custom Widget Sets
+== Using Add-ons
((("Maven", "using add-ons", id="term.maven.addons", range="startofrange")))
-
-If you use Vaadin add-ons that include a widget set or make your custom widgets,
-you need to enable widget set compilation in the POM. The required configuration
-is described in
-<<dummy/../../../framework/addons/addons-maven#addons.maven,"Using Add-ons in a
+If you use Vaadin add-ons from the http://vaadin.com/directory[Vaadin Directory], you need to add them as dependencies in the project POM.
+The instructions are given in <<dummy/../../../framework/addons/addons-maven#addons.maven, "Using Add-ons in a
Maven Project">>.
+_In projects that use Vaadin 7.6 or older_, you need to compile the widget set manually.
+See the add-on usage instructions.
(((range="endofrange", startref="term.maven.addons")))
(((range="endofrange", startref="term.maven.creating")))
diff --git a/documentation/getting-started/getting-started-netbeans.asciidoc b/documentation/getting-started/getting-started-netbeans.asciidoc
index f5fa0afb14..64948471fe 100644
--- a/documentation/getting-started/getting-started-netbeans.asciidoc
+++ b/documentation/getting-started/getting-started-netbeans.asciidoc
@@ -24,13 +24,13 @@ theme, and so on.
. In the [guilabel]#New Project# window that opens, select the [guilabel]#Vaadin# category and one of the Vaadin archetypes from the right.
+
-image::img/netbeans-newproject-1.png[]
+image::img/netbeans-newproject-1.png[width=80%, scaledwidth=100%]
+
The archetypes are described in more detail in <<getting-started-archetypes#getting-started.archetypes, "Overview of Maven Archetypes">>.
. In the [guilabel]#Name and Location# step, enter the project parameters.
+
-image::img/netbeans-newproject-2.png[]
+image::img/netbeans-newproject-2.png[width=80%, scaledwidth=100%]
[guilabel]#Project Name#:: A project name.
The name must be a valid identifier that may only contains alphanumerics, minus, and underscore.
@@ -66,7 +66,7 @@ The project hierarchy shown in the Project Explorer is shown in <<figure.getting
[[figure.getting-started.netbeans.exploring]]
.A new Vaadin project in NetBeans
-image::img/netbeans-created-annotated-hi.png[width=80%]
+image::img/netbeans-created-annotated-hi.png[width=80%, scaledwidth=100%]
[filename]#mytheme#::
The theme of the UI.
@@ -89,12 +89,12 @@ Once created, you can run it in a server as follows.
. In the [guilabel]#Select deployment server# window, select a server from the [guilabel]#Server# list.
It should show either GlassFish or Apache Tomcat or both, depending on what you chose in NetBeans installation.
+
-image::img/netbeans-server.png[width=75%]
+image::img/netbeans-server.png[width=75%, scaledwidth=100%]
+
Also, select [guilabel]#Remember Permanently# if you want to use the same server also in future while developing applications.
+
Click [guibutton]#OK#.
-+
+
The widget set will be compiled at this point, which may take a while.
If all goes well, NetBeans starts the server in port 8080 and, depending on your
diff --git a/documentation/getting-started/getting-started-overview.adoc b/documentation/getting-started/getting-started-overview.adoc
index d9fa9d6fe6..6adde0a9b4 100644
--- a/documentation/getting-started/getting-started-overview.adoc
+++ b/documentation/getting-started/getting-started-overview.adoc
@@ -15,8 +15,8 @@ The recommended way to create a Vaadin application project is to use a Maven arc
The archetypes contain all the needed dependencies, which Maven takes care of.
The Eclipse IDE plugin currently also supports creating a normal Eclipse web project using the Ivy dependency manager.
-In this chapter, we give:
+In this chapter, we:
-. An overview of the Vaadin libraries
-. List the available Maven archetypes
-. Step-by-step instructions for creating a project in the Eclipse IDE, NetBeans IDE, and IntelliJ IDEA, as well as with command-line.
+* Give an overview of the Vaadin libraries
+* List the available Maven archetypes
+* Give step-by-step instructions for creating a project in the Eclipse IDE, NetBeans IDE, and IntelliJ IDEA, as well as with command-line.
diff --git a/documentation/getting-started/img/idea-maven-newproject-1.png b/documentation/getting-started/img/idea-maven-newproject-1.png
index 6a24a14ea8..6b078abd65 100644
--- a/documentation/getting-started/img/idea-maven-newproject-1.png
+++ b/documentation/getting-started/img/idea-maven-newproject-1.png
Binary files differ
diff --git a/documentation/getting-started/img/idea-newproject-1.png b/documentation/getting-started/img/idea-newproject-1.png
index 739b210fdc..4c78f9c390 100644
--- a/documentation/getting-started/img/idea-newproject-1.png
+++ b/documentation/getting-started/img/idea-newproject-1.png
Binary files differ
diff --git a/documentation/getting-started/img/idea-newproject-2.png b/documentation/getting-started/img/idea-newproject-2.png
index 882a4eed18..24c4d6f462 100644
--- a/documentation/getting-started/img/idea-newproject-2.png
+++ b/documentation/getting-started/img/idea-newproject-2.png
Binary files differ
diff --git a/documentation/getting-started/img/myproject-compiletheme.png b/documentation/getting-started/img/myproject-compiletheme.png
new file mode 100644
index 0000000000..ff8ae55519
--- /dev/null
+++ b/documentation/getting-started/img/myproject-compiletheme.png
Binary files differ
diff --git a/documentation/getting-started/img/myproject-compilewidgetset.png b/documentation/getting-started/img/myproject-compilewidgetset.png
index ae6791277b..8a77aaaf58 100644
--- a/documentation/getting-started/img/myproject-compilewidgetset.png
+++ b/documentation/getting-started/img/myproject-compilewidgetset.png
Binary files differ
diff --git a/documentation/getting-started/img/myproject-created-annotated-hi.png b/documentation/getting-started/img/myproject-created-annotated-hi.png
index 6927b883ed..4107110829 100644
--- a/documentation/getting-started/img/myproject-created-annotated-hi.png
+++ b/documentation/getting-started/img/myproject-created-annotated-hi.png
Binary files differ
diff --git a/documentation/getting-started/img/myproject-created.png b/documentation/getting-started/img/myproject-created.png
index c9cc605325..b995edfd5a 100644
--- a/documentation/getting-started/img/myproject-created.png
+++ b/documentation/getting-started/img/myproject-created.png
Binary files differ
diff --git a/documentation/getting-started/img/netbeans-created-annotated-hi.png b/documentation/getting-started/img/netbeans-created-annotated-hi.png
index 5abea08c58..7d2e737406 100644
--- a/documentation/getting-started/img/netbeans-created-annotated-hi.png
+++ b/documentation/getting-started/img/netbeans-created-annotated-hi.png
Binary files differ
diff --git a/documentation/getting-started/img/netbeans-newproject-1.png b/documentation/getting-started/img/netbeans-newproject-1.png
index 4100e315f8..39b3d749b2 100644
--- a/documentation/getting-started/img/netbeans-newproject-1.png
+++ b/documentation/getting-started/img/netbeans-newproject-1.png
Binary files differ
diff --git a/documentation/getting-started/img/netbeans-newproject-2.png b/documentation/getting-started/img/netbeans-newproject-2.png
index ee5711cfa8..930538c396 100644
--- a/documentation/getting-started/img/netbeans-newproject-2.png
+++ b/documentation/getting-started/img/netbeans-newproject-2.png
Binary files differ
diff --git a/documentation/getting-started/img/netbeans-newproject-created.png b/documentation/getting-started/img/netbeans-newproject-created.png
index 6fc0bd8978..30ad5600c3 100644
--- a/documentation/getting-started/img/netbeans-newproject-created.png
+++ b/documentation/getting-started/img/netbeans-newproject-created.png
Binary files differ
diff --git a/documentation/getting-started/img/netbeans-server.png b/documentation/getting-started/img/netbeans-server.png
index 026c70eac2..28f73da8cf 100644
--- a/documentation/getting-started/img/netbeans-server.png
+++ b/documentation/getting-started/img/netbeans-server.png
Binary files differ
diff --git a/documentation/getting-started/original-drawings/myproject-created-annotated.svg b/documentation/getting-started/original-drawings/myproject-created-annotated.svg
index 70fc378bdc..ca012a031a 100644
--- a/documentation/getting-started/original-drawings/myproject-created-annotated.svg
+++ b/documentation/getting-started/original-drawings/myproject-created-annotated.svg
@@ -14,7 +14,7 @@
height="744.09448"
id="svg1901"
sodipodi:version="0.32"
- inkscape:version="0.48.4 r9939"
+ inkscape:version="0.91 r"
sodipodi:docname="myproject-created-annotated.svg"
version="1.1">
<defs
@@ -71,9 +71,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="1.4"
- inkscape:cx="191.07987"
- inkscape:cy="356.49384"
+ inkscape:zoom="1.979899"
+ inkscape:cx="544.97755"
+ inkscape:cy="286.33054"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="1920"
@@ -122,21 +122,21 @@
id="layer1"
transform="translate(0,-308.2677)">
<rect
- style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
id="rect29725"
- width="480"
- height="455"
- x="95"
- y="164.09448"
- transform="translate(0,308.2677)"
- ry="3.7880721" />
+ width="490"
+ height="435"
+ x="70"
+ y="149.09448"
+ ry="3.7880721"
+ transform="translate(0,308.2677)" />
<image
- y="475.67679"
- x="97.162643"
+ y="459.67679"
+ x="73.162643"
id="image3215"
xlink:href="file:///home/magi/itmill/vaadin/documentation/getting-started/img/myproject-created.png"
- height="453.37076"
- width="305.67471" />
+ height="428.90781"
+ width="352.83734" />
<g
transform="translate(204.99999,-146.51524)"
id="g3822-4">
@@ -155,7 +155,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="9.1659365"
sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
+ d="M 34.165936,419.09448 A 9.1659365,9.1659365 0 0 1 25,428.26042 9.1659365,9.1659365 0 0 1 15.834064,419.09448 9.1659365,9.1659365 0 0 1 25,409.92855 a 9.1659365,9.1659365 0 0 1 9.165936,9.16593 z"
transform="matrix(0.54549827,0,0,0.54549827,36.362543,498.74687)" />
<path
sodipodi:type="arc"
@@ -165,12 +165,12 @@
sodipodi:cy="419.09448"
sodipodi:rx="9.1659365"
sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
+ d="M 34.165936,419.09448 A 9.1659365,9.1659365 0 0 1 25,428.26042 9.1659365,9.1659365 0 0 1 15.834064,419.09448 9.1659365,9.1659365 0 0 1 25,409.92855 a 9.1659365,9.1659365 0 0 1 9.165936,9.16593 z"
transform="matrix(0.54549827,0,0,0.54549827,156.36255,498.74687)" />
</g>
<text
xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ style="font-size:12.5px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:'Helvetica LT Std';-inkscape-font-specification:'Helvetica LT Std, Light';"
x="385"
y="584.474"
id="text13161"
@@ -180,184 +180,124 @@
x="385"
y="584.474">The UI class skeleton</tspan></text>
<g
- transform="translate(204.99999,-66.969547)"
- id="g3822-4-7">
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 150.00001,419.09448 24.99999,0"
- id="path3804-2-1"
- inkscape:connector-curvature="0"
- transform="translate(0,308.2677)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946000000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path3005-2-10-1"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 a 9.1659365,9.1659365 0 1 1 -18.331872,0 9.1659365,9.1659365 0 1 1 18.331872,0 z"
- transform="matrix(0.54549827,0,0,0.54549827,136.36255,498.74687)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946000000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path3005-2-10-5-4"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,156.36255,498.74687)" />
- </g>
- <g
- transform="translate(270,77.857138)"
+ transform="translate(270,28.285711)"
id="g3822-4-8">
<path
sodipodi:nodetypes="cccc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 25,762.36218 10,-5 0,-20 10,-10"
id="path3804-2-3-46-9"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="cccc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 25,692.36218 10,5 0,20 10,10"
id="path3804-2-3-46"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 45,419.09448 60,1e-5"
id="path3804-2-3"
inkscape:connector-curvature="0"
transform="translate(0,308.2677)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-8"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 a 9.1659365,9.1659365 0 1 1 -18.331872,0 9.1659365,9.1659365 0 1 1 18.331872,0 z"
- transform="matrix(0.54549827,0,0,0.54549827,31.362543,498.74687)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946000000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,31.362543,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-5-2"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,91.362543,498.74687)" />
+ transform="matrix(0.54549827,0,0,0.54549827,91.362543,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
</g>
<g
- transform="translate(270,169.99999)"
+ transform="translate(270,128.42856)"
id="g3822-4-8-5">
<path
sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -70,419.09449 175,0"
id="path3804-2-3-4"
inkscape:connector-curvature="0"
transform="translate(0,308.2677)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946000000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-8-2"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 a 9.1659365,9.1659365 0 1 1 -18.331872,0 9.1659365,9.1659365 0 1 1 18.331872,0 z"
- transform="matrix(0.54549827,0,0,0.54549827,-83.637457,498.74688)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946000000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,-83.637457,498.74688)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-5-2-3"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,91.362543,498.74687)" />
+ transform="matrix(0.54549827,0,0,0.54549827,91.362543,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
</g>
<g
- transform="translate(270,187.3214)"
+ transform="translate(270,145.74997)"
id="g3822-4-8-5-4">
<path
sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -45,419.09448 150,1e-5"
id="path3804-2-3-4-5"
inkscape:connector-curvature="0"
transform="translate(0,308.2677)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946000000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-8-2-3"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,-58.637457,498.74688)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946000000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,-58.637457,498.74688)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-5-2-3-8"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,91.362543,498.74687)" />
+ transform="matrix(0.54549827,0,0,0.54549827,91.362543,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
</g>
<text
xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- x="385"
- y="664.25208"
- id="text13161-0"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan13163-0"
- x="385"
- y="664.25208">The widget set</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:'Helvetica LT Std';-inkscape-font-specification:'Helvetica LT Std, Light';text-align:start;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;"
x="385"
- y="808.74548"
+ y="759.17407"
id="text13161-0-4"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan13163-0-8"
x="385"
- y="808.74548">The theme</tspan></text>
+ y="759.17407">The theme</tspan></text>
<text
xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:'Helvetica LT Std';-inkscape-font-specification:'Helvetica LT Std, Light';text-align:start;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;"
x="385"
- y="901.34863"
+ y="859.77722"
id="text13161-0-4-1"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan13163-0-8-3"
x="385"
- y="901.34863">Maven project configuration</tspan></text>
+ y="859.77722">Maven project configuration</tspan></text>
<text
xml:space="preserve"
- style="font-size:14px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:'Helvetica LT Std';-inkscape-font-specification:'Helvetica LT Std, Light';text-align:start;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;"
x="385"
- y="918.85156"
+ y="877.28015"
id="text13161-0-4-4"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan13163-0-8-2"
x="385"
- y="918.85156">Project README skeleton</tspan></text>
+ y="877.28015">Project README skeleton</tspan></text>
</g>
</svg>
diff --git a/documentation/getting-started/original-drawings/netbeans-created-annotated.svg b/documentation/getting-started/original-drawings/netbeans-created-annotated.svg
index ae0176f25b..b61f1549c8 100644
--- a/documentation/getting-started/original-drawings/netbeans-created-annotated.svg
+++ b/documentation/getting-started/original-drawings/netbeans-created-annotated.svg
@@ -14,7 +14,7 @@
height="744.09448"
id="svg1901"
sodipodi:version="0.32"
- inkscape:version="0.48.4 r9939"
+ inkscape:version="0.91 r"
sodipodi:docname="netbeans-created-annotated.svg"
version="1.1">
<defs
@@ -80,11 +80,11 @@
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
- inkscape:pageopacity="0.0"
+ inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:zoom="1.4"
- inkscape:cx="325.14306"
- inkscape:cy="308.11666"
+ inkscape:zoom="0.98994949"
+ inkscape:cx="427.53838"
+ inkscape:cy="397.85985"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="1920"
@@ -123,7 +123,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
+ <dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@@ -137,188 +137,129 @@
x="-12.462494"
id="image3215"
xlink:href="file:///home/magi/itmill/vaadin/documentation/getting-started/img/netbeans-newproject-created.png"
- width="587.46252"
- height="487.08057"
- mask="url(#mask3028)" />
+ width="312"
+ height="354"
+ mask="url(#mask3028)"
+ transform="matrix(1.1875352,0,0,1.1875352,2.3371561,-91.708359)" />
<g
- transform="translate(164.99999,24.999997)"
+ transform="translate(200,37.020301)"
id="g3822-4">
<path
sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 20.00001,419.09449 175,419.09448"
id="path3804-2"
inkscape:connector-curvature="0"
transform="translate(0,308.2677)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 a 9.1659365,9.1659365 0 1 1 -18.331872,0 9.1659365,9.1659365 0 1 1 18.331872,0 z"
- transform="matrix(0.54549827,0,0,0.54549827,6.3625532,498.74687)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,6.3625532,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-5"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,156.36255,498.74687)" />
+ transform="matrix(0.54549827,0,0,0.54549827,156.36255,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
</g>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- x="354.74399"
- y="756.59644"
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:16px;line-height:125%;font-family:'Helvetica LT Std';-inkscape-font-specification:'Helvetica LT Std Light';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ x="389.74399"
+ y="768.6167"
id="text13161"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan13163"
- x="354.74399"
- y="756.59644">The UI class skeleton</tspan></text>
- <g
- transform="translate(159.99999,107.5254)"
- id="g3822-4-7">
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 145.00001,419.09448 29.99999,0"
- id="path3804-2-1"
- inkscape:connector-curvature="0"
- transform="translate(0,308.2677)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path3005-2-10-1"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 a 9.1659365,9.1659365 0 1 1 -18.331872,0 9.1659365,9.1659365 0 1 1 18.331872,0 z"
- transform="matrix(0.54549827,0,0,0.54549827,131.36255,498.74687)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path3005-2-10-5-4"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 a 9.1659365,9.1659365 0 1 1 -18.331872,0 9.1659365,9.1659365 0 1 1 18.331872,0 z"
- transform="matrix(0.54549827,0,0,0.54549827,161.36255,498.74687)" />
- </g>
+ x="389.74399"
+ y="768.6167">The UI class skeleton</tspan></text>
<g
- transform="translate(235,-75.000003)"
+ transform="translate(270.00001,-67)"
id="g3822-4-8">
<path
sodipodi:nodetypes="cccc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 25,777.36219 10,-10 0,-30.00001 10,-10"
id="path3804-2-3-46-9"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="cccc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 25,677.36219 10,10 0,29.99999 10,10"
id="path3804-2-3-46"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 45,419.09448 55,1e-5"
id="path3804-2-3"
inkscape:connector-curvature="0"
transform="translate(0,308.2677)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-8"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,31.362543,498.74687)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,31.362543,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-5-2"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 a 9.1659365,9.1659365 0 1 1 -18.331872,0 9.1659365,9.1659365 0 1 1 18.331872,0 z"
- transform="matrix(0.54549827,0,0,0.54549827,86.362543,498.74687)" />
+ transform="matrix(0.54549827,0,0,0.54549827,86.362543,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
</g>
<g
- transform="translate(230,170)"
+ transform="translate(265.00001,98.00001)"
id="g3822-4-8-5">
<path
sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -70,419.09449 175,0"
id="path3804-2-3-4"
inkscape:connector-curvature="0"
transform="translate(0,308.2677)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffedd1;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-8-2"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,-83.637457,498.74688)" />
- <path
- sodipodi:type="arc"
- style="color:#000000;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,-83.637457,498.74688)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
+ <circle
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ecf3ff;fill-opacity:1;stroke:#000000;stroke-width:2.74977946;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path3005-2-10-5-2-3"
- sodipodi:cx="25"
- sodipodi:cy="419.09448"
- sodipodi:rx="9.1659365"
- sodipodi:ry="9.1659365"
- d="m 34.165936,419.09448 c 0,5.06221 -4.103729,9.16594 -9.165936,9.16594 -5.062207,0 -9.165936,-4.10373 -9.165936,-9.16594 0,-5.0622 4.103729,-9.16593 9.165936,-9.16593 5.062207,0 9.165936,4.10373 9.165936,9.16593 z"
- transform="matrix(0.54549827,0,0,0.54549827,91.362543,498.74687)" />
+ transform="matrix(0.54549827,0,0,0.54549827,91.362543,498.74687)"
+ cx="25"
+ cy="419.09448"
+ r="9.1659365" />
</g>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- x="354.74399"
- y="839.23932"
- id="text13161-0"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan13163-0"
- x="354.74399"
- y="839.23932">The widget set definition</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:16px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- x="354.74399"
- y="656.86194"
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:16px;line-height:125%;font-family:'Helvetica LT Std';-inkscape-font-specification:'Helvetica LT Std Light';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ x="389.74399"
+ y="664.86194"
id="text13161-0-4"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan13163-0-8"
- x="354.74399"
- y="656.86194">The theme</tspan></text>
+ x="389.74399"
+ y="664.86194">The application theme</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- x="353.75201"
- y="901.60632"
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:16px;line-height:125%;font-family:'Helvetica LT Std';-inkscape-font-specification:'Helvetica LT Std Light';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ x="388.75201"
+ y="829.60632"
id="text13161-0-4-1"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan13163-0-8-3"
- x="353.75201"
- y="901.60632">Maven project configuration</tspan></text>
+ x="388.75201"
+ y="829.60632">Maven project configuration</tspan></text>
</g>
</svg>
diff --git a/documentation/gwt/gwt-shared-state.asciidoc b/documentation/gwt/gwt-shared-state.asciidoc
index e0406fdf93..6e14b6c435 100644
--- a/documentation/gwt/gwt-shared-state.asciidoc
+++ b/documentation/gwt/gwt-shared-state.asciidoc
@@ -96,7 +96,7 @@ public MyComponentState getState() {
State changes made on the server-side are communicated transparently to the
client-side. When a state change occurs, the [methodname]#onStateChanged()#
-method in the connector is called. You should should always call the superclass
+method in the connector is called. You should always call the superclass
method before anything else to handle changes to common component properties.
diff --git a/documentation/installing/img/installation-steps.svg b/documentation/installing/img/installation-steps.svg
new file mode 100644
index 0000000000..a4dfaf49b5
--- /dev/null
+++ b/documentation/installing/img/installation-steps.svg
@@ -0,0 +1,1019 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ id="svg1901"
+ height="231"
+ width="561">
+ <defs
+ id="defs1903">
+ <font
+ id="font3118"
+ horiz-adv-x="1024">
+ <font-face
+ font-family="SVGFont 1"
+ id="font-face3120"
+ units-per-em="1024" />
+ <missing-glyph
+ id="missing-glyph3122"
+ d="M0,0h1000v1024h-1000z" />
+ </font>
+ </defs>
+ <metadata
+ id="metadata1906">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(-124.5,-526.86145)"
+ id="layer1">
+ <path
+ id="rect3115"
+ d="m 130,224.09448 550,0 0,220 -550,0 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:0.13524589;marker:none;enable-background:accumulate"
+ transform="translate(0,308.2677)" />
+ <path
+ id="path3003"
+ d="m 185,727.36221 50,0 350,0"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <g
+ transform="translate(160,2.7294197e-5)"
+ id="g3238">
+ <g
+ id="g3908-4-9"
+ transform="translate(50.125,-69.875)">
+ <path
+ id="rect3806-4-2-2"
+ d="m 16.740473,657.23718 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86548 l 0,36.26908 c 0,1.03347 -0.832001,1.86547 -1.865473,1.86547 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86547 l 0,-36.26908 c 0,-1.03348 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-7-2"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(0.74636894,298.81113)">
+ <path
+ id="path149"
+ style=""
+ d="m 17.025016,365.12887 c 0,2.398 1.166,4.246 4.004,4.246 2.706,0 4.004,-2.013 4.004,-4.246 0,-2.321 -1.408,-4.048 -4.004,-4.048 -2.596,0 -4.004,1.727 -4.004,4.048 z m 1.804,0 c 0,-1.518 0.726,-2.596 2.2,-2.596 1.474,0 2.2,1.078 2.2,2.596 0,1.518 -0.561,2.794 -2.2,2.794 -1.694,0 -2.2,-1.276 -2.2,-2.794 z" />
+ <path
+ id="path151"
+ style=""
+ d="m 26.159484,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.496,0.418 -1.947,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.22,-0.803 -0.726,-0.803 -0.506,0 -0.726,0.319 -0.726,0.803 l 0,4.433 z" />
+ <path
+ id="path153"
+ style=""
+ d="m 26.540016,372.35587 c 0.044,-0.165 0.088,-0.341 0.088,-0.517 0,-0.55 -0.451,-0.814 -0.869,-0.814 -0.429,0 -0.704,0.209 -0.814,0.737 l -1.078,5.258 -0.022,0 -1.199,-5.137 c -0.11,-0.495 -0.264,-0.858 -1.023,-0.858 -0.671,0 -0.847,0.231 -0.946,0.671 l -1.232,5.324 -0.022,0 -1.067,-5.258 c -0.11,-0.528 -0.385,-0.737 -0.847,-0.737 -0.418,0 -0.869,0.264 -0.869,0.814 0,0.176 0.044,0.352 0.088,0.517 l 1.551,6.017 c 0.165,0.627 0.429,0.858 1.089,0.858 0.682,0 0.935,-0.286 1.078,-0.891 l 1.177,-4.829 0.022,0 1.177,4.829 c 0.154,0.605 0.396,0.891 1.078,0.891 0.66,0 0.924,-0.231 1.089,-0.858 l 1.551,-6.017 z" />
+ <path
+ id="path155"
+ style=""
+ d="m 27.450609,378.42787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-4.433 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.803,0.374 -0.803,0.803 l 0,4.433 z m -0.033,-6.611 c 0,0.462 0.374,0.836 0.836,0.836 0.462,0 0.836,-0.374 0.836,-0.836 0,-0.462 -0.374,-0.836 -0.836,-0.836 -0.462,0 -0.836,0.374 -0.836,0.836 z" />
+ <path
+ id="path157"
+ style=""
+ d="m 30.413391,378.42787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.496,0.418 -1.947,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.22,-0.803 -0.726,-0.803 -0.506,0 -0.726,0.319 -0.726,0.803 l 0,4.433 z" />
+ <path
+ id="path159"
+ style=""
+ d="m 42.583,371.82787 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,2.178 -0.022,0 c -0.319,-0.517 -0.869,-0.814 -1.584,-0.814 -1.694,0 -2.475,1.441 -2.475,2.981 0,2.079 1.177,3.058 2.519,3.058 0.781,0 1.43,-0.33 1.694,-1.012 l 0.022,0 0,0.253 c 0,0.495 0.253,0.759 0.726,0.759 0.495,0 0.726,-0.264 0.726,-0.759 l 0,-6.644 z m -4.081,4.4 c 0,-0.748 0.253,-1.782 1.276,-1.782 0.979,-0.011 1.287,0.957 1.287,1.782 0,0.913 -0.352,1.749 -1.287,1.749 -0.858,-0.022 -1.276,-0.803 -1.276,-1.749 z" />
+ <path
+ id="path161"
+ style=""
+ d="m 45.226609,376.20587 c 0,-1.045 0.429,-1.826 1.364,-1.826 0.935,0 1.364,0.781 1.364,1.826 0,0.979 -0.407,1.837 -1.364,1.837 -0.957,0 -1.364,-0.858 -1.364,-1.837 z m -1.606,0 c 0,1.606 0.781,3.025 2.97,3.025 2.189,0 2.97,-1.419 2.97,-3.025 0,-1.694 -1.034,-3.014 -2.97,-3.014 -1.936,0 -2.97,1.32 -2.97,3.014 z" />
+ <path
+ id="path163"
+ style=""
+ d="m 51.314766,378.36187 c 0.231,0.759 0.407,0.869 1.045,0.869 0.671,0 0.836,-0.198 1.001,-0.836 l 0.792,-3.157 0.022,0 0.792,3.157 c 0.165,0.638 0.33,0.836 1.001,0.836 0.638,0 0.814,-0.11 1.045,-0.869 l 1.177,-3.828 c 0.055,-0.176 0.11,-0.352 0.11,-0.594 0,-0.418 -0.374,-0.748 -0.781,-0.748 -0.594,0 -0.693,0.319 -0.792,0.781 l -0.792,3.52 -0.022,0 -0.693,-3.201 c -0.143,-0.638 -0.297,-1.122 -1.056,-1.1 -0.748,-0.022 -0.88,0.473 -1.012,1.1 l -0.682,3.201 -0.022,0 -0.847,-3.52 c -0.11,-0.462 -0.198,-0.781 -0.792,-0.781 -0.407,0 -0.781,0.33 -0.781,0.748 0,0.242 0.055,0.418 0.11,0.594 l 1.177,3.828 z" />
+ <path
+ id="path165"
+ style=""
+ d="m 58.820547,374.98487 c 0,1.078 0.726,1.463 1.661,1.694 l 0.946,0.231 c 0.572,0.143 0.924,0.209 0.924,0.616 0,0.33 -0.363,0.583 -0.935,0.583 -1.188,0 -1.254,-0.99 -1.947,-0.99 -0.451,0 -0.649,0.319 -0.649,0.671 0,0.792 1.21,1.441 2.662,1.441 1.21,0 2.475,-0.605 2.475,-1.914 0,-1.122 -1.089,-1.507 -2.002,-1.716 l -0.671,-0.154 c -0.495,-0.11 -0.858,-0.198 -0.858,-0.572 0,-0.341 0.363,-0.495 0.924,-0.495 1.012,0 1.034,0.737 1.661,0.737 0.418,0 0.671,-0.33 0.671,-0.704 0,-0.737 -1.232,-1.221 -2.453,-1.221 -1.111,0 -2.409,0.484 -2.409,1.793 z" />
+ </g>
+ </g>
+ <g
+ id="g3908-4"
+ transform="translate(50.125,-49.875)">
+ <path
+ id="rect3806-4-2"
+ d="m 16.740473,662.23718 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86548 l 0,31.26908 c 0,1.03347 -0.832001,1.86547 -1.865473,1.86547 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86547 l 0,-31.26908 c 0,-1.03348 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-7"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(0.73921187,303.05351)">
+ <path
+ id="path169"
+ style="font-size:11px"
+ d="m 17.025016,365.12887 c 0,2.398 1.166,4.246 4.004,4.246 2.706,0 4.004,-2.013 4.004,-4.246 0,-2.321 -1.408,-4.048 -4.004,-4.048 -2.596,0 -4.004,1.727 -4.004,4.048 z m 1.804,0 c 0,-1.518 0.726,-2.596 2.2,-2.596 1.474,0 2.2,1.078 2.2,2.596 0,1.518 -0.561,2.794 -2.2,2.794 -1.694,0 -2.2,-1.276 -2.2,-2.794 z" />
+ <path
+ id="path171"
+ style="font-size:11px"
+ d="m 26.159484,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.496,0.418 -1.947,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.22,-0.803 -0.726,-0.803 -0.506,0 -0.726,0.319 -0.726,0.803 l 0,4.433 z" />
+ <path
+ id="path173"
+ style="font-size:11px"
+ d="m 17.025016,375.02887 c 0,2.398 1.166,4.246 4.004,4.246 2.706,0 4.004,-2.013 4.004,-4.246 0,-2.321 -1.408,-4.048 -4.004,-4.048 -2.596,0 -4.004,1.727 -4.004,4.048 z m 1.804,0 c 0,-1.518 0.726,-2.596 2.2,-2.596 1.474,0 2.2,1.078 2.2,2.596 0,1.518 -0.561,2.794 -2.2,2.794 -1.694,0 -2.2,-1.276 -2.2,-2.794 z" />
+ <path
+ id="path175"
+ style="font-size:11px"
+ d="m 28.997484,374.15987 c -0.572,-0.132 -1.232,-0.308 -1.232,-0.858 0,-0.55 0.462,-0.935 1.298,-0.935 1.683,0 1.529,1.177 2.365,1.177 0.44,0 0.825,-0.264 0.825,-0.715 0,-1.056 -1.661,-1.848 -3.069,-1.848 -1.529,0 -3.157,0.66 -3.157,2.42 0,0.847 0.297,1.749 1.936,2.167 l 2.035,0.517 c 0.616,0.154 0.77,0.506 0.77,0.825 0,0.528 -0.517,1.045 -1.452,1.045 -1.826,0 -1.573,-1.43 -2.552,-1.43 -0.44,0 -0.759,0.308 -0.759,0.748 0,0.858 1.023,2.002 3.311,2.002 2.178,0 3.256,-1.067 3.256,-2.497 0,-0.924 -0.418,-1.903 -2.068,-2.277 l -1.507,-0.341 z" />
+ <path
+ id="path177"
+ style="font-size:11px"
+ d="m 36.798547,377.76787 c -0.209,0.308 -0.242,0.506 -0.242,0.693 0,0.44 0.341,0.77 0.869,0.77 0.275,0 0.55,-0.099 0.704,-0.352 l 1.562,-2.497 1.452,2.431 c 0.209,0.352 0.462,0.418 0.759,0.418 0.506,0 0.924,-0.308 0.924,-0.891 0,-0.209 -0.11,-0.352 -0.297,-0.638 l -1.793,-2.695 1.837,-2.684 c 0.088,-0.121 0.165,-0.33 0.165,-0.484 0,-0.572 -0.429,-0.814 -0.869,-0.814 -0.396,0 -0.55,0.143 -0.737,0.44 l -1.397,2.255 -1.309,-2.255 c -0.11,-0.187 -0.319,-0.44 -0.748,-0.44 -0.517,0 -0.902,0.374 -0.902,0.847 0,0.209 0.077,0.385 0.187,0.55 l 1.727,2.585 -1.892,2.761 z" />
+ </g>
+ </g>
+ <g
+ id="g3908"
+ transform="translate(50.125,-29.875)">
+ <path
+ id="rect3806-4"
+ d="m 16.740473,667.23718 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86548 l 0,26.26908 c 0,1.03347 -0.832001,1.86547 -1.865473,1.86547 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86547 l 0,-26.26908 c 0,-1.03348 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(0.71890704,308.81113)">
+ <path
+ id="path181"
+ style="font-size:11px"
+ d="m 17.025016,365.12887 c 0,2.398 1.166,4.246 4.004,4.246 2.706,0 4.004,-2.013 4.004,-4.246 0,-2.321 -1.408,-4.048 -4.004,-4.048 -2.596,0 -4.004,1.727 -4.004,4.048 z m 1.804,0 c 0,-1.518 0.726,-2.596 2.2,-2.596 1.474,0 2.2,1.078 2.2,2.596 0,1.518 -0.561,2.794 -2.2,2.794 -1.694,0 -2.2,-1.276 -2.2,-2.794 z" />
+ <path
+ id="path183"
+ style="font-size:11px"
+ d="m 26.159484,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.496,0.418 -1.947,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.22,-0.803 -0.726,-0.803 -0.506,0 -0.726,0.319 -0.726,0.803 l 0,4.433 z" />
+ <path
+ id="path185"
+ style="font-size:11px"
+ d="m 17.377016,378.03187 c 0,0.803 0.418,1.056 1.056,1.056 l 3.762,0 c 0.517,0 0.935,-0.264 0.935,-0.759 0,-0.495 -0.418,-0.759 -0.935,-0.759 l -3.014,0 0,-5.643 c 0,-0.539 -0.352,-0.902 -0.902,-0.902 -0.55,0 -0.902,0.363 -0.902,0.902 l 0,6.105 z" />
+ <path
+ id="path187"
+ style="font-size:11px"
+ d="m 23.991625,378.42787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-4.433 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.803,0.374 -0.803,0.803 l 0,4.433 z m -0.033,-6.611 c 0,0.462 0.374,0.836 0.836,0.836 0.462,0 0.836,-0.374 0.836,-0.836 0,-0.462 -0.374,-0.836 -0.836,-0.836 -0.462,0 -0.836,0.374 -0.836,0.836 z" />
+ <path
+ id="path189"
+ style="font-size:11px"
+ d="m 26.954406,378.42787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.496,0.418 -1.947,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.22,-0.803 -0.726,-0.803 -0.506,0 -0.726,0.319 -0.726,0.803 l 0,4.433 z" />
+ <path
+ id="path191"
+ style="font-size:11px"
+ d="m 39.124016,373.99487 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.803,0.374 -0.803,0.803 l 0,2.651 c 0,0.803 -0.66,1.265 -1.221,1.265 -0.693,0 -1.012,-0.462 -1.012,-1.111 l 0,-2.805 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.803,0.374 -0.803,0.803 l 0,3.124 c 0,1.628 1.056,2.112 2.024,2.112 0.913,0 1.496,-0.418 1.947,-1.012 l 0.022,0 0,0.209 c 0,0.484 0.22,0.803 0.726,0.803 0.506,0 0.726,-0.319 0.726,-0.803 l 0,-4.433 z" />
+ <path
+ id="path193"
+ style="font-size:11px"
+ d="m 42.405625,377.22887 0.924,1.474 c 0.209,0.33 0.407,0.528 0.737,0.528 0.517,0 0.814,-0.363 0.814,-0.748 0,-0.231 -0.066,-0.363 -0.154,-0.484 l -1.243,-1.848 1.166,-1.727 c 0.099,-0.143 0.165,-0.308 0.165,-0.539 0,-0.363 -0.352,-0.693 -0.726,-0.693 -0.253,0 -0.495,0.066 -0.737,0.473 l -0.869,1.419 -0.902,-1.485 c -0.187,-0.308 -0.396,-0.407 -0.649,-0.407 -0.583,0 -0.858,0.462 -0.858,0.803 0,0.154 0.077,0.297 0.165,0.418 l 1.155,1.738 -1.232,1.815 c -0.143,0.209 -0.22,0.374 -0.22,0.517 0,0.44 0.396,0.748 0.781,0.748 0.297,0 0.517,-0.154 0.627,-0.319 l 1.056,-1.683 z" />
+ </g>
+ </g>
+ <g
+ id="g3822"
+ transform="translate(30,-2.7058031e-6)">
+ <path
+ id="path3005-2"
+ d="m 19.911936,426.71852 a 9.1659365,9.1659365 0 0 1 -2.53643,-12.71142 9.1659365,9.1659365 0 0 1 12.711199,-2.53756 9.1659365,9.1659365 0 0 1 2.538696,12.71097 9.1659365,9.1659365 0 0 1 -12.710747,2.53983 L 25,419.09448 Z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:0.13524589;marker:none;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,36.362543,498.74687)" />
+ <path
+ transform="translate(0,308.2677)"
+ id="path3804"
+ d="m 50,419.09448 c 0,-15 0,-25.36336 0,-25.36336"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g3868"
+ transform="translate(4.8113861,-12.853955)">
+ <path
+ id="rect3806"
+ d="m 33.219076,675.21613 83.939074,0 c 1.67888,0 3.03046,1.35158 3.03046,3.03046 l 0,33.93909 c 0,1.67887 -1.35158,3.03046 -3.03046,3.03046 l -83.939074,0 c -1.678876,0 -3.030462,-1.35159 -3.030462,-3.03046 l 0,-33.93909 c 0,-1.67888 1.351586,-3.03046 3.030462,-3.03046 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.369364,319.99189)">
+ <path
+ id="path198"
+ style=""
+ d="m 17.757016,370.83262 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-9.312 c 0,-0.784 -0.512,-1.312 -1.312,-1.312 -0.8,0 -1.312,0.528 -1.312,1.312 l 0,9.312 z" />
+ <path
+ id="path200"
+ style=""
+ d="m 22.531516,370.97662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-3.856 c 0,-1.168 0.96,-1.84 1.776,-1.84 1.008,0 1.472,0.672 1.472,1.616 l 0,4.08 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-4.544 c 0,-2.368 -1.536,-3.072 -2.944,-3.072 -1.328,0 -2.176,0.608 -2.832,1.472 l -0.032,0 0,-0.304 c 0,-0.704 -0.32,-1.168 -1.056,-1.168 -0.736,0 -1.056,0.464 -1.056,1.168 l 0,6.448 z" />
+ <path
+ id="path202"
+ style=""
+ d="m 31.944766,365.96862 c 0,1.568 1.056,2.128 2.416,2.464 l 1.376,0.336 c 0.832,0.208 1.344,0.304 1.344,0.896 0,0.48 -0.528,0.848 -1.36,0.848 -1.728,0 -1.824,-1.44 -2.832,-1.44 -0.656,0 -0.944,0.464 -0.944,0.976 0,1.152 1.76,2.096 3.872,2.096 1.76,0 3.6,-0.88 3.6,-2.784 0,-1.632 -1.584,-2.192 -2.912,-2.496 l -0.976,-0.224 c -0.72,-0.16 -1.248,-0.288 -1.248,-0.832 0,-0.496 0.528,-0.72 1.344,-0.72 1.472,0 1.504,1.072 2.416,1.072 0.608,0 0.976,-0.48 0.976,-1.024 0,-1.072 -1.792,-1.776 -3.568,-1.776 -1.616,0 -3.504,0.704 -3.504,2.608 z" />
+ <path
+ id="path204"
+ style=""
+ d="m 41.514516,370.06462 c 0,1.376 0.704,2.08 2.4,2.08 1.12,0 1.696,-0.368 1.696,-1.04 0,-0.496 -0.304,-0.784 -0.816,-0.784 l -0.336,0 c -0.416,0 -0.608,-0.192 -0.608,-0.544 l 0,-4.672 0.704,0 c 0.688,0 1.056,-0.208 1.056,-0.768 0,-0.56 -0.368,-0.768 -1.056,-0.768 l -0.704,0 0,-1.424 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,1.424 -0.4,0 c -0.656,0 -0.928,0.256 -0.928,0.768 0,0.512 0.272,0.768 0.928,0.768 l 0.4,0 0,4.96 z" />
+ <path
+ id="path206"
+ style=""
+ d="m 54.572766,365.76062 c 0,-1.68 -1.552,-2.4 -3.792,-2.4 -2.4,0 -3.712,1.184 -3.712,2.112 0,0.48 0.4,0.896 0.992,0.896 0.928,0 0.976,-1.28 2.704,-1.28 0.784,0 1.472,0.288 1.472,0.96 0,0.672 -0.448,0.8 -1.008,0.864 l -1.424,0.16 c -1.792,0.208 -3.264,0.752 -3.264,2.688 0,1.472 1.312,2.384 2.64,2.384 1.232,0 2.288,-0.352 3.2,-1.36 0.032,0.72 0.368,1.36 1.376,1.36 0.56,0 1.056,-0.368 1.056,-0.896 0,-0.368 -0.24,-0.592 -0.24,-1.568 l 0,-3.92 z m -2.336,3.152 c 0,0.864 -0.784,1.696 -2.064,1.696 -0.8,0 -1.296,-0.432 -1.296,-0.96 0,-0.704 0.528,-1.008 1.504,-1.152 l 0.848,-0.128 c 0.272,-0.048 0.752,-0.128 1.008,-0.368 l 0,0.912 z" />
+ <path
+ id="path208"
+ style=""
+ d="m 56.722016,370.97662 c 0,0.768 0.464,1.168 1.168,1.168 0.704,0 1.168,-0.4 1.168,-1.168 l 0,-9.6 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,9.6 z" />
+ <path
+ id="path210"
+ style=""
+ d="m 61.159516,370.97662 c 0,0.768 0.464,1.168 1.168,1.168 0.704,0 1.168,-0.4 1.168,-1.168 l 0,-9.6 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,9.6 z" />
+ <path
+ id="path212"
+ style=""
+ d="m 24.509016,375.92062 c 0,-0.784 -0.512,-1.312 -1.312,-1.312 -0.8,0 -1.312,0.528 -1.312,1.312 l 0,6.784 c 0,1.248 -0.48,1.888 -1.344,1.888 -0.928,0 -1.28,-0.544 -1.28,-1.296 0,-0.784 -0.24,-1.52 -1.184,-1.52 -0.8,0 -1.248,0.624 -1.248,1.6 0,1.136 0.592,3.232 3.744,3.232 2.592,0 3.936,-1.456 3.936,-3.872 l 0,-6.816 z" />
+ <path
+ id="path214"
+ style=""
+ d="m 26.944516,384.80062 c 0,1.168 0.608,1.536 1.536,1.536 l 3.152,0 c 3.504,0 5.536,-2.112 5.536,-5.76 0,-4.512 -2.624,-5.76 -5.488,-5.76 l -3.2,0 c -0.928,0 -1.536,0.368 -1.536,1.536 l 0,8.448 z m 2.624,-7.872 2.192,0 c 1.92,0 2.784,1.376 2.784,3.648 0,1.776 -0.672,3.648 -2.768,3.648 l -2.208,0 0,-7.296 z" />
+ <path
+ id="path216"
+ style=""
+ d="m 39.100766,385.23262 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-2.608 1.44,-1.44 3.024,4.672 c 0.352,0.56 0.64,0.688 1.168,0.688 0.624,0 1.344,-0.288 1.344,-1.264 0,-0.336 -0.256,-0.672 -0.496,-1.04 l -3.184,-4.848 2.688,-2.832 c 0.224,-0.224 0.432,-0.496 0.432,-0.896 0,-0.672 -0.624,-1.056 -1.248,-1.056 -0.464,0 -0.736,0.256 -1.04,0.576 l -4.128,4.544 0,-3.808 c 0,-0.784 -0.512,-1.312 -1.312,-1.312 -0.8,0 -1.312,0.528 -1.312,1.312 l 0,9.312 z" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="translate(160,2.7294197e-5)"
+ id="g3271">
+ <g
+ id="g3908-4-9-7"
+ transform="translate(150.125,-70.238342)">
+ <path
+ id="rect3806-4-2-2-0"
+ d="m 16.740473,657.60052 56.269054,0 c 1.033472,0 1.865473,0.83201 1.865473,1.86548 l 0,36.26902 c 0,1.03347 -0.832001,1.86547 -1.865473,1.86547 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86547 l 0,-36.26902 c 0,-1.03347 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-7-2-4"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(0.96798326,298.92194)">
+ <path
+ id="path220"
+ style=""
+ d="m 17.421016,368.13187 c 0,0.803 0.418,1.056 1.056,1.056 l 4.323,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -3.575,0 0,-1.914 3.058,0 c 0.473,0 0.847,-0.132 0.847,-0.693 0,-0.561 -0.374,-0.693 -0.847,-0.693 l -3.058,0 0,-1.716 3.487,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -4.235,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z" />
+ <path
+ id="path222"
+ style=""
+ d="m 24.412031,366.42687 c 0,1.683 0.935,2.904 2.915,2.904 1.65,0 2.442,-0.968 2.442,-1.672 0,-0.319 -0.264,-0.616 -0.671,-0.616 -0.847,0 -0.605,1.034 -1.727,1.034 -0.88,0 -1.353,-0.649 -1.353,-1.65 0,-1.452 0.737,-1.881 1.364,-1.881 1.155,0 0.88,0.946 1.639,0.946 0.407,0 0.748,-0.231 0.748,-0.693 0,-0.748 -1.001,-1.507 -2.343,-1.507 -1.969,0 -3.014,1.287 -3.014,3.135 z" />
+ <path
+ id="path224"
+ style=""
+ d="m 30.716234,368.52787 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-6.6 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ <path
+ id="path226"
+ style=""
+ d="m 33.767016,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-4.433 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.803,0.374 -0.803,0.803 l 0,4.433 z m -0.033,-6.611 c 0,0.462 0.374,0.836 0.836,0.836 0.462,0 0.836,-0.374 0.836,-0.836 0,-0.462 -0.374,-0.836 -0.836,-0.836 -0.462,0 -0.836,0.374 -0.836,0.836 z" />
+ <path
+ id="path228"
+ style=""
+ d="m 36.729797,370.66187 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-2.145 0.022,0 c 0.297,0.517 0.847,0.814 1.584,0.814 1.694,0 2.475,-1.441 2.475,-2.981 0,-2.079 -1.177,-3.058 -2.519,-3.058 -0.781,0 -1.43,0.33 -1.694,1.012 l -0.022,0 0,-0.253 c 0,-0.495 -0.253,-0.759 -0.726,-0.759 -0.495,0 -0.726,0.264 -0.726,0.759 l 0,6.611 z m 4.081,-4.367 c 0,0.748 -0.253,1.782 -1.276,1.782 -0.979,0.011 -1.287,-0.957 -1.287,-1.782 0,-0.913 0.352,-1.749 1.287,-1.749 0.858,0.022 1.276,0.803 1.276,1.749 z" />
+ <path
+ id="path230"
+ style=""
+ d="m 43.201406,365.08487 c 0,1.078 0.726,1.463 1.661,1.694 l 0.946,0.231 c 0.572,0.143 0.924,0.209 0.924,0.616 0,0.33 -0.363,0.583 -0.935,0.583 -1.188,0 -1.254,-0.99 -1.947,-0.99 -0.451,0 -0.649,0.319 -0.649,0.671 0,0.792 1.21,1.441 2.662,1.441 1.21,0 2.475,-0.605 2.475,-1.914 0,-1.122 -1.089,-1.507 -2.002,-1.716 l -0.671,-0.154 c -0.495,-0.11 -0.858,-0.198 -0.858,-0.572 0,-0.341 0.363,-0.495 0.924,-0.495 1.012,0 1.034,0.737 1.661,0.737 0.418,0 0.671,-0.33 0.671,-0.704 0,-0.737 -1.232,-1.221 -2.453,-1.221 -1.111,0 -2.409,0.484 -2.409,1.793 z" />
+ <path
+ id="path232"
+ style=""
+ d="m 54.356609,366.61387 c 0.539,0 0.704,-0.143 0.704,-0.693 0,-1.32 -1.056,-2.629 -2.904,-2.629 -1.903,0 -3.036,1.254 -3.036,3.124 0,1.397 0.847,2.915 3.091,2.915 0.968,0 2.519,-0.451 2.519,-1.419 0,-0.297 -0.275,-0.627 -0.66,-0.627 -0.649,0 -0.649,0.792 -1.859,0.792 -0.935,0 -1.485,-0.616 -1.485,-1.463 l 3.63,0 z m -3.63,-0.924 c 0.176,-0.781 0.66,-1.276 1.463,-1.276 0.715,0 1.265,0.539 1.353,1.276 l -2.816,0 z" />
+ <path
+ id="path234"
+ style=""
+ d="m 17.377016,378.32887 c 0,0.539 0.352,0.902 0.902,0.902 0.55,0 0.902,-0.363 0.902,-0.902 l 0,-6.402 c 0,-0.539 -0.352,-0.902 -0.902,-0.902 -0.55,0 -0.902,0.363 -0.902,0.902 l 0,6.402 z" />
+ <path
+ id="path236"
+ style=""
+ d="m 20.857484,378.03187 c 0,0.803 0.418,1.056 1.056,1.056 l 2.167,0 c 2.409,0 3.806,-1.452 3.806,-3.96 0,-3.102 -1.804,-3.96 -3.773,-3.96 l -2.2,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z m 1.804,-5.412 1.507,0 c 1.32,0 1.914,0.946 1.914,2.508 0,1.221 -0.462,2.508 -1.903,2.508 l -1.518,0 0,-5.016 z" />
+ <path
+ id="path238"
+ style=""
+ d="m 29.258906,378.03187 c 0,0.803 0.418,1.056 1.056,1.056 l 4.323,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -3.575,0 0,-1.914 3.058,0 c 0.473,0 0.847,-0.132 0.847,-0.693 0,-0.561 -0.374,-0.693 -0.847,-0.693 l -3.058,0 0,-1.716 3.487,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -4.235,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z" />
+ </g>
+ </g>
+ <g
+ id="g3908-4-1"
+ transform="translate(145.125,-49.874982)">
+ <path
+ id="rect3806-4-2-6"
+ d="m 21.740473,662.23712 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86547 l 0,31.2691 c 0,1.03348 -0.832001,1.86548 -1.865473,1.86548 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86548 l 0,-31.2691 c 0,-1.03347 0.832001,-1.86547 1.865473,-1.86547 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-7-0"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(5.79546,303.04687)">
+ <path
+ id="path242"
+ style=""
+ d="m 17.344016,368.46187 c 0,0.583 0.33,0.869 0.869,0.869 0.539,0 0.869,-0.286 0.869,-0.869 l 0,-4.565 0.022,0 3.135,4.95 c 0.231,0.363 0.418,0.484 0.99,0.484 0.759,0 1.067,-0.407 1.067,-1.122 l 0,-6.215 c 0,-0.583 -0.33,-0.869 -0.869,-0.869 -0.539,0 -0.869,0.286 -0.869,0.869 l 0,4.697 -0.022,0 -3.157,-5.093 c -0.198,-0.33 -0.528,-0.473 -0.902,-0.473 -0.77,0 -1.133,0.308 -1.133,1.056 l 0,6.281 z" />
+ <path
+ id="path244"
+ style=""
+ d="m 30.723797,366.61387 c 0.539,0 0.704,-0.143 0.704,-0.693 0,-1.32 -1.056,-2.629 -2.904,-2.629 -1.903,0 -3.036,1.254 -3.036,3.124 0,1.397 0.847,2.915 3.091,2.915 0.968,0 2.519,-0.451 2.519,-1.419 0,-0.297 -0.275,-0.627 -0.66,-0.627 -0.649,0 -0.649,0.792 -1.859,0.792 -0.935,0 -1.485,-0.616 -1.485,-1.463 l 3.63,0 z m -3.63,-0.924 c 0.176,-0.781 0.66,-1.276 1.463,-1.276 0.715,0 1.265,0.539 1.353,1.276 l -2.816,0 z" />
+ <path
+ id="path246"
+ style=""
+ d="m 32.872406,367.90087 c 0,0.946 0.484,1.43 1.65,1.43 0.77,0 1.166,-0.253 1.166,-0.715 0,-0.341 -0.209,-0.539 -0.561,-0.539 l -0.231,0 c -0.286,0 -0.418,-0.132 -0.418,-0.374 l 0,-3.212 0.484,0 c 0.473,0 0.726,-0.143 0.726,-0.528 0,-0.385 -0.253,-0.528 -0.726,-0.528 l -0.484,0 0,-0.979 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,0.979 -0.275,0 c -0.451,0 -0.638,0.176 -0.638,0.528 0,0.352 0.187,0.528 0.638,0.528 l 0.275,0 0,3.41 z" />
+ <path
+ id="path248"
+ style=""
+ d="m 36.712953,368.13187 c 0,0.803 0.418,1.056 1.056,1.056 l 2.651,0 c 1.562,0 2.915,-0.682 2.915,-2.343 0,-1.089 -0.55,-1.683 -1.386,-1.903 l 0,-0.022 c 0.748,-0.297 1.111,-0.935 1.111,-1.606 0,-1.749 -1.573,-2.046 -2.893,-2.046 l -2.398,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z m 1.804,-2.464 1.298,0 c 0.88,0 1.716,0.121 1.716,1.078 0,0.913 -0.792,1.056 -1.496,1.056 l -1.518,0 0,-2.134 z m 0,-3.08 1.43,0 c 0.671,0 1.309,0.209 1.309,0.968 0,0.627 -0.407,0.968 -1.254,0.968 l -1.485,0 0,-1.936 z" />
+ <path
+ id="path250"
+ style=""
+ d="m 49.458172,366.61387 c 0.539,0 0.704,-0.143 0.704,-0.693 0,-1.32 -1.056,-2.629 -2.904,-2.629 -1.903,0 -3.036,1.254 -3.036,3.124 0,1.397 0.847,2.915 3.091,2.915 0.968,0 2.519,-0.451 2.519,-1.419 0,-0.297 -0.275,-0.627 -0.66,-0.627 -0.649,0 -0.649,0.792 -1.859,0.792 -0.935,0 -1.485,-0.616 -1.485,-1.463 l 3.63,0 z m -3.63,-0.924 c 0.176,-0.781 0.66,-1.276 1.463,-1.276 0.715,0 1.265,0.539 1.353,1.276 l -2.816,0 z" />
+ <path
+ id="path252"
+ style=""
+ d="m 56.523781,364.94187 c 0,-1.155 -1.067,-1.65 -2.607,-1.65 -1.65,0 -2.552,0.814 -2.552,1.452 0,0.33 0.275,0.616 0.682,0.616 0.638,0 0.671,-0.88 1.859,-0.88 0.539,0 1.012,0.198 1.012,0.66 0,0.462 -0.308,0.55 -0.693,0.594 l -0.979,0.11 c -1.232,0.143 -2.244,0.517 -2.244,1.848 0,1.012 0.902,1.639 1.815,1.639 0.847,0 1.573,-0.242 2.2,-0.935 0.022,0.495 0.253,0.935 0.946,0.935 0.385,0 0.726,-0.253 0.726,-0.616 0,-0.253 -0.165,-0.407 -0.165,-1.078 l 0,-2.695 z m -1.606,2.167 c 0,0.594 -0.539,1.166 -1.419,1.166 -0.55,0 -0.891,-0.297 -0.891,-0.66 0,-0.484 0.363,-0.693 1.034,-0.792 l 0.583,-0.088 c 0.187,-0.033 0.517,-0.088 0.693,-0.253 l 0,0.627 z" />
+ <path
+ id="path254"
+ style=""
+ d="m 57.913391,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.496,0.418 -1.947,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.22,-0.803 -0.726,-0.803 -0.506,0 -0.726,0.319 -0.726,0.803 l 0,4.433 z" />
+ <path
+ id="path256"
+ style=""
+ d="m 64.385,365.08487 c 0,1.078 0.726,1.463 1.661,1.694 l 0.946,0.231 c 0.572,0.143 0.924,0.209 0.924,0.616 0,0.33 -0.363,0.583 -0.935,0.583 -1.188,0 -1.254,-0.99 -1.947,-0.99 -0.451,0 -0.649,0.319 -0.649,0.671 0,0.792 1.21,1.441 2.662,1.441 1.21,0 2.475,-0.605 2.475,-1.914 0,-1.122 -1.089,-1.507 -2.002,-1.716 l -0.671,-0.154 c -0.495,-0.11 -0.858,-0.198 -0.858,-0.572 0,-0.341 0.363,-0.495 0.924,-0.495 1.012,0 1.034,0.737 1.661,0.737 0.418,0 0.671,-0.33 0.671,-0.704 0,-0.737 -1.232,-1.221 -2.453,-1.221 -1.111,0 -2.409,0.484 -2.409,1.793 z" />
+ <path
+ id="path258"
+ style=""
+ d="m 17.377016,378.32887 c 0,0.539 0.352,0.902 0.902,0.902 0.55,0 0.902,-0.363 0.902,-0.902 l 0,-6.402 c 0,-0.539 -0.352,-0.902 -0.902,-0.902 -0.55,0 -0.902,0.363 -0.902,0.902 l 0,6.402 z" />
+ <path
+ id="path260"
+ style=""
+ d="m 20.857484,378.03187 c 0,0.803 0.418,1.056 1.056,1.056 l 2.167,0 c 2.409,0 3.806,-1.452 3.806,-3.96 0,-3.102 -1.804,-3.96 -3.773,-3.96 l -2.2,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z m 1.804,-5.412 1.507,0 c 1.32,0 1.914,0.946 1.914,2.508 0,1.221 -0.462,2.508 -1.903,2.508 l -1.518,0 0,-5.016 z" />
+ <path
+ id="path262"
+ style=""
+ d="m 29.258906,378.03187 c 0,0.803 0.418,1.056 1.056,1.056 l 4.323,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -3.575,0 0,-1.914 3.058,0 c 0.473,0 0.847,-0.132 0.847,-0.693 0,-0.561 -0.374,-0.693 -0.847,-0.693 l -3.058,0 0,-1.716 3.487,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -4.235,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z" />
+ </g>
+ </g>
+ <g
+ id="g3908-3"
+ transform="translate(145.125,-29.874982)">
+ <path
+ id="rect3806-4-0"
+ d="m 21.740473,667.23712 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86547 l 0,26.2691 c 0,1.03348 -0.832001,1.86548 -1.865473,1.86548 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86548 l 0,-26.2691 c 0,-1.03347 0.832001,-1.86547 1.865473,-1.86547 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-8"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(5.77146,308.61462)">
+ <path
+ id="path266"
+ style=""
+ d="m 17.377016,368.42887 c 0,0.539 0.352,0.902 0.902,0.902 0.55,0 0.902,-0.363 0.902,-0.902 l 0,-6.402 c 0,-0.539 -0.352,-0.902 -0.902,-0.902 -0.55,0 -0.902,0.363 -0.902,0.902 l 0,6.402 z" />
+ <path
+ id="path268"
+ style=""
+ d="m 20.659484,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.496,0.418 -1.947,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.22,-0.803 -0.726,-0.803 -0.506,0 -0.726,0.319 -0.726,0.803 l 0,4.433 z" />
+ <path
+ id="path270"
+ style=""
+ d="m 27.802094,367.90087 c 0,0.946 0.484,1.43 1.65,1.43 0.77,0 1.166,-0.253 1.166,-0.715 0,-0.341 -0.209,-0.539 -0.561,-0.539 l -0.231,0 c -0.286,0 -0.418,-0.132 -0.418,-0.374 l 0,-3.212 0.484,0 c 0.473,0 0.726,-0.143 0.726,-0.528 0,-0.385 -0.253,-0.528 -0.726,-0.528 l -0.484,0 0,-0.979 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,0.979 -0.275,0 c -0.451,0 -0.638,0.176 -0.638,0.528 0,0.352 0.187,0.528 0.638,0.528 l 0.275,0 0,3.41 z" />
+ <path
+ id="path272"
+ style=""
+ d="m 36.438641,366.61387 c 0.539,0 0.704,-0.143 0.704,-0.693 0,-1.32 -1.056,-2.629 -2.904,-2.629 -1.903,0 -3.036,1.254 -3.036,3.124 0,1.397 0.847,2.915 3.091,2.915 0.968,0 2.519,-0.451 2.519,-1.419 0,-0.297 -0.275,-0.627 -0.66,-0.627 -0.649,0 -0.649,0.792 -1.859,0.792 -0.935,0 -1.485,-0.616 -1.485,-1.463 l 3.63,0 z m -3.63,-0.924 c 0.176,-0.781 0.66,-1.276 1.463,-1.276 0.715,0 1.265,0.539 1.353,1.276 l -2.816,0 z" />
+ <path
+ id="path274"
+ style=""
+ d="m 38.25725,368.52787 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-6.6 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ <path
+ id="path276"
+ style=""
+ d="m 41.308031,368.52787 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-6.6 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ <path
+ id="path278"
+ style=""
+ d="m 44.358812,368.52787 c 0,0.429 0.176,0.803 0.803001,0.803 0.626999,0 0.802999,-0.374 0.802999,-0.803 l 0,-4.433 c 0,-0.429 -0.176,-0.803 -0.802999,-0.803 -0.627001,0 -0.803001,0.374 -0.803001,0.803 l 0,4.433 z m -0.033,-6.611 c 0,0.462 0.374,0.836 0.836001,0.836 0.461999,0 0.836,-0.374 0.836,-0.836 0,-0.462 -0.374001,-0.836 -0.836,-0.836 -0.462001,0 -0.836001,0.374 -0.836001,0.836 z" />
+ <path
+ id="path280"
+ style=""
+ d="m 52.161594,362.02687 c 0,-0.539 -0.352,-0.902 -0.902,-0.902 -0.55,0 -0.902,0.363 -0.902,0.902 l 0,4.664 c 0,0.858 -0.33,1.298 -0.924,1.298 -0.638,0 -0.88,-0.374 -0.88,-0.891 0,-0.539 -0.165,-1.045 -0.814,-1.045 -0.55,0 -0.858,0.429 -0.858,1.1 0,0.781 0.407,2.222 2.574,2.222 1.782,0 2.706,-1.001 2.706,-2.662 l 0,-4.686 z" />
+ <path
+ id="path282"
+ style=""
+ d="m 17.377016,378.32887 c 0,0.539 0.352,0.902 0.902,0.902 0.55,0 0.902,-0.363 0.902,-0.902 l 0,-6.402 c 0,-0.539 -0.352,-0.902 -0.902,-0.902 -0.55,0 -0.902,0.363 -0.902,0.902 l 0,6.402 z" />
+ <path
+ id="path284"
+ style=""
+ d="m 20.857484,378.03187 c 0,0.803 0.418,1.056 1.056,1.056 l 2.167,0 c 2.409,0 3.806,-1.452 3.806,-3.96 0,-3.102 -1.804,-3.96 -3.773,-3.96 l -2.2,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z m 1.804,-5.412 1.507,0 c 1.32,0 1.914,0.946 1.914,2.508 0,1.221 -0.462,2.508 -1.903,2.508 l -1.518,0 0,-5.016 z" />
+ <path
+ id="path286"
+ style=""
+ d="m 29.258906,378.03187 c 0,0.803 0.418,1.056 1.056,1.056 l 4.323,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -3.575,0 0,-1.914 3.058,0 c 0.473,0 0.847,-0.132 0.847,-0.693 0,-0.561 -0.374,-0.693 -0.847,-0.693 l -3.058,0 0,-1.716 3.487,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -4.235,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z" />
+ <path
+ id="path288"
+ style=""
+ d="m 36.194922,377.74587 c -0.066,0.176 -0.176,0.495 -0.176,0.693 0,0.484 0.341,0.792 0.836,0.792 0.429,0 0.682,-0.143 0.803,-0.495 l 0.473,-1.32 2.904,0 0.462,1.32 c 0.132,0.352 0.418,0.495 0.814,0.495 0.462,0 0.847,-0.352 0.847,-0.792 0,-0.198 -0.11,-0.517 -0.176,-0.693 l -2.178,-6.061 c -0.198,-0.561 -0.561,-0.66 -0.968,-0.66 l -0.429,0 c -0.44,0 -0.726,0.143 -0.88,0.55 l -2.332,6.171 z m 4.444,-1.584 -2.112,0 1.067,-3.179 0.022,0 1.023,3.179 z" />
+ </g>
+ </g>
+ <g
+ id="g3822-0"
+ transform="translate(130,2.421875e-6)">
+ <path
+ id="path3005-2-8"
+ d="m 19.911936,426.71852 a 9.1659365,9.1659365 0 0 1 -2.53643,-12.71142 9.1659365,9.1659365 0 0 1 12.711199,-2.53756 9.1659365,9.1659365 0 0 1 2.538696,12.71097 9.1659365,9.1659365 0 0 1 -12.710747,2.53983 L 25,419.09448 Z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:0.13524589;marker:none;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,36.362543,498.74687)" />
+ <path
+ transform="translate(0,308.2677)"
+ id="path3804-9"
+ d="m 50,419.09448 c 0,-15 0,-25.36336 0,-25.36336"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <path
+ id="rect3806-0"
+ d="m 138.03046,661.99884 83.93908,0 c 1.67887,0 3.03046,1.35159 3.03046,3.03046 l 0,34.30242 c 0,1.67888 -1.35159,3.03046 -3.03046,3.03046 l -83.93908,0 c -1.67887,0 -3.03046,-1.35158 -3.03046,-3.03046 l 0,-34.30242 c 0,-1.67887 1.35159,-3.03046 3.03046,-3.03046 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-3"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(123.18075,306.77458)">
+ <path
+ id="path293"
+ style=""
+ d="m 17.757016,370.83262 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-9.312 c 0,-0.784 -0.512,-1.312 -1.312,-1.312 -0.8,0 -1.312,0.528 -1.312,1.312 l 0,9.312 z" />
+ <path
+ id="path295"
+ style=""
+ d="m 22.531516,370.97662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-3.856 c 0,-1.168 0.96,-1.84 1.776,-1.84 1.008,0 1.472,0.672 1.472,1.616 l 0,4.08 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-4.544 c 0,-2.368 -1.536,-3.072 -2.944,-3.072 -1.328,0 -2.176,0.608 -2.832,1.472 l -0.032,0 0,-0.304 c 0,-0.704 -0.32,-1.168 -1.056,-1.168 -0.736,0 -1.056,0.464 -1.056,1.168 l 0,6.448 z" />
+ <path
+ id="path297"
+ style=""
+ d="m 31.944766,365.96862 c 0,1.568 1.056,2.128 2.416,2.464 l 1.376,0.336 c 0.832,0.208 1.344,0.304 1.344,0.896 0,0.48 -0.528,0.848 -1.36,0.848 -1.728,0 -1.824,-1.44 -2.832,-1.44 -0.656,0 -0.944,0.464 -0.944,0.976 0,1.152 1.76,2.096 3.872,2.096 1.76,0 3.6,-0.88 3.6,-2.784 0,-1.632 -1.584,-2.192 -2.912,-2.496 l -0.976,-0.224 c -0.72,-0.16 -1.248,-0.288 -1.248,-0.832 0,-0.496 0.528,-0.72 1.344,-0.72 1.472,0 1.504,1.072 2.416,1.072 0.608,0 0.976,-0.48 0.976,-1.024 0,-1.072 -1.792,-1.776 -3.568,-1.776 -1.616,0 -3.504,0.704 -3.504,2.608 z" />
+ <path
+ id="path299"
+ style=""
+ d="m 41.514516,370.06462 c 0,1.376 0.704,2.08 2.4,2.08 1.12,0 1.696,-0.368 1.696,-1.04 0,-0.496 -0.304,-0.784 -0.816,-0.784 l -0.336,0 c -0.416,0 -0.608,-0.192 -0.608,-0.544 l 0,-4.672 0.704,0 c 0.688,0 1.056,-0.208 1.056,-0.768 0,-0.56 -0.368,-0.768 -1.056,-0.768 l -0.704,0 0,-1.424 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,1.424 -0.4,0 c -0.656,0 -0.928,0.256 -0.928,0.768 0,0.512 0.272,0.768 0.928,0.768 l 0.4,0 0,4.96 z" />
+ <path
+ id="path301"
+ style=""
+ d="m 54.572766,365.76062 c 0,-1.68 -1.552,-2.4 -3.792,-2.4 -2.4,0 -3.712,1.184 -3.712,2.112 0,0.48 0.4,0.896 0.992,0.896 0.928,0 0.976,-1.28 2.704,-1.28 0.784,0 1.472,0.288 1.472,0.96 0,0.672 -0.448,0.8 -1.008,0.864 l -1.424,0.16 c -1.792,0.208 -3.264,0.752 -3.264,2.688 0,1.472 1.312,2.384 2.64,2.384 1.232,0 2.288,-0.352 3.2,-1.36 0.032,0.72 0.368,1.36 1.376,1.36 0.56,0 1.056,-0.368 1.056,-0.896 0,-0.368 -0.24,-0.592 -0.24,-1.568 l 0,-3.92 z m -2.336,3.152 c 0,0.864 -0.784,1.696 -2.064,1.696 -0.8,0 -1.296,-0.432 -1.296,-0.96 0,-0.704 0.528,-1.008 1.504,-1.152 l 0.848,-0.128 c 0.272,-0.048 0.752,-0.128 1.008,-0.368 l 0,0.912 z" />
+ <path
+ id="path303"
+ style=""
+ d="m 56.722016,370.97662 c 0,0.768 0.464,1.168 1.168,1.168 0.704,0 1.168,-0.4 1.168,-1.168 l 0,-9.6 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,9.6 z" />
+ <path
+ id="path305"
+ style=""
+ d="m 61.159516,370.97662 c 0,0.768 0.464,1.168 1.168,1.168 0.704,0 1.168,-0.4 1.168,-1.168 l 0,-9.6 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,9.6 z" />
+ <path
+ id="path307"
+ style=""
+ d="m 78.135266,365.76062 c 0,-1.68 -1.552,-2.4 -3.792,-2.4 -2.4,0 -3.712,1.184 -3.712,2.112 0,0.48 0.4,0.896 0.992,0.896 0.928,0 0.976,-1.28 2.704,-1.28 0.784,0 1.472,0.288 1.472,0.96 0,0.672 -0.448,0.8 -1.008,0.864 l -1.424,0.16 c -1.792,0.208 -3.264,0.752 -3.264,2.688 0,1.472 1.312,2.384 2.64,2.384 1.232,0 2.288,-0.352 3.2,-1.36 0.032,0.72 0.368,1.36 1.376,1.36 0.56,0 1.056,-0.368 1.056,-0.896 0,-0.368 -0.24,-0.592 -0.24,-1.568 l 0,-3.92 z m -2.336,3.152 c 0,0.864 -0.784,1.696 -2.064,1.696 -0.8,0 -1.296,-0.432 -1.296,-0.96 0,-0.704 0.528,-1.008 1.504,-1.152 l 0.848,-0.128 c 0.272,-0.048 0.752,-0.128 1.008,-0.368 l 0,0.912 z" />
+ <path
+ id="path309"
+ style=""
+ d="m 80.156516,370.97662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-3.856 c 0,-1.168 0.96,-1.84 1.776,-1.84 1.008,0 1.472,0.672 1.472,1.616 l 0,4.08 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-4.544 c 0,-2.368 -1.536,-3.072 -2.944,-3.072 -1.328,0 -2.176,0.608 -2.832,1.472 l -0.032,0 0,-0.304 c 0,-0.704 -0.32,-1.168 -1.056,-1.168 -0.736,0 -1.056,0.464 -1.056,1.168 l 0,6.448 z" />
+ <path
+ id="path311"
+ style=""
+ d="m 17.757016,385.23262 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-9.312 c 0,-0.784 -0.512,-1.312 -1.312,-1.312 -0.8,0 -1.312,0.528 -1.312,1.312 l 0,9.312 z" />
+ <path
+ id="path313"
+ style=""
+ d="m 22.819516,384.80062 c 0,1.168 0.608,1.536 1.536,1.536 l 3.152,0 c 3.504,0 5.536,-2.112 5.536,-5.76 0,-4.512 -2.624,-5.76 -5.488,-5.76 l -3.2,0 c -0.928,0 -1.536,0.368 -1.536,1.536 l 0,8.448 z m 2.624,-7.872 2.192,0 c 1.92,0 2.784,1.376 2.784,3.648 0,1.776 -0.672,3.648 -2.768,3.648 l -2.208,0 0,-7.296 z" />
+ <path
+ id="path315"
+ style=""
+ d="m 35.039766,384.80062 c 0,1.168 0.608,1.536 1.536,1.536 l 6.288,0 c 0.768,0 1.328,-0.224 1.328,-1.056 0,-0.832 -0.56,-1.056 -1.328,-1.056 l -5.2,0 0,-2.784 4.448,0 c 0.688,0 1.232,-0.192 1.232,-1.008 0,-0.816 -0.544,-1.008 -1.232,-1.008 l -4.448,0 0,-2.496 5.072,0 c 0.768,0 1.328,-0.224 1.328,-1.056 0,-0.832 -0.56,-1.056 -1.328,-1.056 l -6.16,0 c -0.928,0 -1.536,0.368 -1.536,1.536 l 0,8.448 z" />
+ </g>
+ </g>
+ <g
+ id="g3271-5"
+ transform="translate(260,2.7294197e-5)">
+ <g
+ id="g3908-4-9-7-8"
+ transform="translate(150.125,-110.23837)">
+ <path
+ id="rect3806-4-2-2-0-0"
+ d="m 16.740473,647.60052 56.269054,0 c 1.033472,0 1.865473,0.83201 1.865473,1.86548 l 0,46.26914 c 0,1.03348 -0.832001,1.86548 -1.865473,1.86548 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86548 l 0,-46.26914 c 0,-1.03347 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-7-2-4-0"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(1.0223215,288.61775)">
+ <path
+ id="path319"
+ style=""
+ d="m 16.816016,367.84587 c -0.066,0.176 -0.176,0.495 -0.176,0.693 0,0.484 0.341,0.792 0.836,0.792 0.429,0 0.682,-0.143 0.803,-0.495 l 0.473,-1.32 2.904,0 0.462,1.32 c 0.132,0.352 0.418,0.495 0.814,0.495 0.462,0 0.847,-0.352 0.847,-0.792 0,-0.198 -0.11,-0.517 -0.176,-0.693 l -2.178,-6.061 c -0.198,-0.561 -0.561,-0.66 -0.968,-0.66 l -0.429,0 c -0.44,0 -0.726,0.143 -0.88,0.55 l -2.332,6.171 z m 4.444,-1.584 -2.112,0 1.067,-3.179 0.022,0 1.023,3.179 z" />
+ <path
+ id="path321"
+ style=""
+ d="m 24.526672,370.66187 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-2.145 0.022,0 c 0.297,0.517 0.847,0.814 1.584,0.814 1.694,0 2.475,-1.441 2.475,-2.981 0,-2.079 -1.177,-3.058 -2.519,-3.058 -0.781,0 -1.43,0.33 -1.694,1.012 l -0.022,0 0,-0.253 c 0,-0.495 -0.253,-0.759 -0.726,-0.759 -0.495,0 -0.726,0.264 -0.726,0.759 l 0,6.611 z m 4.081,-4.367 c 0,0.748 -0.253,1.782 -1.276,1.782 -0.979,0.011 -1.287,-0.957 -1.287,-1.782 0,-0.913 0.352,-1.749 1.287,-1.749 0.858,0.022 1.276,0.803 1.276,1.749 z" />
+ <path
+ id="path323"
+ style=""
+ d="m 36.586281,364.94187 c 0,-1.155 -1.067,-1.65 -2.607,-1.65 -1.65,0 -2.552,0.814 -2.552,1.452 0,0.33 0.275,0.616 0.682,0.616 0.638,0 0.671,-0.88 1.859,-0.88 0.539,0 1.012,0.198 1.012,0.66 0,0.462 -0.308,0.55 -0.693,0.594 l -0.979,0.11 c -1.232,0.143 -2.244,0.517 -2.244,1.848 0,1.012 0.902,1.639 1.815,1.639 0.847,0 1.573,-0.242 2.2,-0.935 0.022,0.495 0.253,0.935 0.946,0.935 0.385,0 0.726,-0.253 0.726,-0.616 0,-0.253 -0.165,-0.407 -0.165,-1.078 l 0,-2.695 z m -1.606,2.167 c 0,0.594 -0.539,1.166 -1.419,1.166 -0.55,0 -0.891,-0.297 -0.891,-0.66 0,-0.484 0.363,-0.693 1.034,-0.792 l 0.583,-0.088 c 0.187,-0.033 0.517,-0.088 0.693,-0.253 l 0,0.627 z" />
+ <path
+ id="path325"
+ style=""
+ d="m 37.667891,366.42687 c 0,1.683 0.935,2.904 2.915,2.904 1.65,0 2.442,-0.968 2.442,-1.672 0,-0.319 -0.264,-0.616 -0.671,-0.616 -0.847,0 -0.605,1.034 -1.727,1.034 -0.88,0 -1.353,-0.649 -1.353,-1.65 0,-1.452 0.737,-1.881 1.364,-1.881 1.155,0 0.88,0.946 1.639,0.946 0.407,0 0.748,-0.231 0.748,-0.693 0,-0.748 -1.001,-1.507 -2.343,-1.507 -1.969,0 -3.014,1.287 -3.014,3.135 z" />
+ <path
+ id="path327"
+ style=""
+ d="m 43.884094,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.474,0.429 -1.793,0.847 l -0.022,0 0,-2.211 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ <path
+ id="path329"
+ style=""
+ d="m 55.602703,366.61387 c 0.539,0 0.704,-0.143 0.704,-0.693 0,-1.32 -1.056,-2.629 -2.904,-2.629 -1.903,0 -3.036,1.254 -3.036,3.124 0,1.397 0.847,2.915 3.091,2.915 0.968,0 2.519,-0.451 2.519,-1.419 0,-0.297 -0.275,-0.627 -0.66,-0.627 -0.649,0 -0.649,0.792 -1.859,0.792 -0.935,0 -1.485,-0.616 -1.485,-1.463 l 3.63,0 z m -3.63,-0.924 c 0.176,-0.781 0.66,-1.276 1.463,-1.276 0.715,0 1.265,0.539 1.353,1.276 l -2.816,0 z" />
+ <path
+ id="path331"
+ style=""
+ d="m 19.313016,378.32887 c 0,0.539 0.352,0.902 0.902,0.902 0.55,0 0.902,-0.363 0.902,-0.902 l 0,-5.643 1.705,0 c 0.517,0 0.935,-0.264 0.935,-0.759 0,-0.495 -0.418,-0.759 -0.935,-0.759 l -5.214,0 c -0.517,0 -0.935,0.264 -0.935,0.759 0,0.495 0.418,0.759 0.935,0.759 l 1.705,0 0,5.643 z" />
+ <path
+ id="path333"
+ style=""
+ d="m 24.386766,376.20587 c 0,-1.045 0.429,-1.826 1.364,-1.826 0.935,0 1.364,0.781 1.364,1.826 0,0.979 -0.407,1.837 -1.364,1.837 -0.957,0 -1.364,-0.858 -1.364,-1.837 z m -1.606,0 c 0,1.606 0.781,3.025 2.97,3.025 2.189,0 2.97,-1.419 2.97,-3.025 0,-1.694 -1.034,-3.014 -2.97,-3.014 -1.936,0 -2.97,1.32 -2.97,3.014 z" />
+ <path
+ id="path335"
+ style=""
+ d="m 29.747375,378.42787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.673 c 0,-0.748 0.55,-1.243 1.166,-1.243 0.627,0 0.88,0.462 0.88,1.034 l 0,2.882 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.673 c 0,-0.748 0.55,-1.243 1.166,-1.243 0.627,0 0.88,0.462 0.88,1.034 l 0,2.882 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.289 c 0,-1.441 -0.891,-1.947 -2.002,-1.947 -0.869,0 -1.441,0.385 -1.892,1.012 -0.297,-0.759 -0.99,-1.012 -1.54,-1.012 -0.814,0 -1.518,0.374 -1.936,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.286,-0.803 -0.759,-0.803 -0.473,0 -0.759,0.319 -0.759,0.803 l 0,4.433 z" />
+ <path
+ id="path337"
+ style=""
+ d="m 39.622969,376.32687 c 0,1.683 0.935,2.904 2.915,2.904 1.65,0 2.442,-0.968 2.442,-1.672 0,-0.319 -0.264,-0.616 -0.671,-0.616 -0.847,0 -0.605,1.034 -1.727,1.034 -0.88,0 -1.353,-0.649 -1.353,-1.65 0,-1.452 0.737,-1.881 1.364,-1.881 1.155,0 0.88,0.946 1.639,0.946 0.407,0 0.748,-0.231 0.748,-0.693 0,-0.748 -1.001,-1.507 -2.343,-1.507 -1.969,0 -3.014,1.287 -3.014,3.135 z" />
+ <path
+ id="path339"
+ style=""
+ d="m 51.174172,374.84187 c 0,-1.155 -1.067,-1.65 -2.607,-1.65 -1.65,0 -2.552,0.814 -2.552,1.452 0,0.33 0.275,0.616 0.682,0.616 0.638,0 0.671,-0.88 1.859,-0.88 0.539,0 1.012,0.198 1.012,0.66 0,0.462 -0.308,0.55 -0.693,0.594 l -0.979,0.11 c -1.232,0.143 -2.244,0.517 -2.244,1.848 0,1.012 0.902,1.639 1.815,1.639 0.847,0 1.573,-0.242 2.2,-0.935 0.022,0.495 0.253,0.935 0.946,0.935 0.385,0 0.726,-0.253 0.726,-0.616 0,-0.253 -0.165,-0.407 -0.165,-1.078 l 0,-2.695 z m -1.606,2.167 c 0,0.594 -0.539,1.166 -1.419,1.166 -0.55,0 -0.891,-0.297 -0.891,-0.66 0,-0.484 0.363,-0.693 1.034,-0.792 l 0.583,-0.088 c 0.187,-0.033 0.517,-0.088 0.693,-0.253 l 0,0.627 z" />
+ <path
+ id="path341"
+ style=""
+ d="m 52.981781,377.80087 c 0,0.946 0.484,1.43 1.65,1.43 0.77,0 1.166,-0.253 1.166,-0.715 0,-0.341 -0.209,-0.539 -0.561,-0.539 l -0.231,0 c -0.286,0 -0.418,-0.132 -0.418,-0.374 l 0,-3.212 0.484,0 c 0.473,0 0.726,-0.143 0.726,-0.528 0,-0.385 -0.253,-0.528 -0.726,-0.528 l -0.484,0 0,-0.979 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,0.979 -0.275,0 c -0.451,0 -0.638,0.176 -0.638,0.528 0,0.352 0.187,0.528 0.638,0.528 l 0.275,0 0,3.41 z" />
+ </g>
+ </g>
+ <g
+ id="g3908-4-1-3"
+ transform="translate(145.125,-89.874981)">
+ <path
+ id="rect3806-4-2-6-8"
+ d="m 21.740473,652.23712 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86547 l 0,41.2691 c 0,1.03348 -0.832001,1.86548 -1.865473,1.86548 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86548 l 0,-41.2691 c 0,-1.03347 0.832001,-1.86547 1.865473,-1.86547 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-7-0-0"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(5.7477504,293.01433)">
+ <path
+ id="path345"
+ style=""
+ d="m 19.313016,368.42887 c 0,0.539 0.352,0.902 0.902,0.902 0.55,0 0.902,-0.363 0.902,-0.902 l 0,-5.643 1.705,0 c 0.517,0 0.935,-0.264 0.935,-0.759 0,-0.495 -0.418,-0.759 -0.935,-0.759 l -5.214,0 c -0.517,0 -0.935,0.264 -0.935,0.759 0,0.495 0.418,0.759 0.935,0.759 l 1.705,0 0,5.643 z" />
+ <path
+ id="path347"
+ style=""
+ d="m 24.386766,366.30587 c 0,-1.045 0.429,-1.826 1.364,-1.826 0.935,0 1.364,0.781 1.364,1.826 0,0.979 -0.407,1.837 -1.364,1.837 -0.957,0 -1.364,-0.858 -1.364,-1.837 z m -1.606,0 c 0,1.606 0.781,3.025 2.97,3.025 2.189,0 2.97,-1.419 2.97,-3.025 0,-1.694 -1.034,-3.014 -2.97,-3.014 -1.936,0 -2.97,1.32 -2.97,3.014 z" />
+ <path
+ id="path349"
+ style=""
+ d="m 29.747375,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.673 c 0,-0.748 0.55,-1.243 1.166,-1.243 0.627,0 0.88,0.462 0.88,1.034 l 0,2.882 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.673 c 0,-0.748 0.55,-1.243 1.166,-1.243 0.627,0 0.88,0.462 0.88,1.034 l 0,2.882 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.289 c 0,-1.441 -0.891,-1.947 -2.002,-1.947 -0.869,0 -1.441,0.385 -1.892,1.012 -0.297,-0.759 -0.99,-1.012 -1.54,-1.012 -0.814,0 -1.518,0.374 -1.936,1.012 l -0.022,0 0,-0.209 c 0,-0.484 -0.286,-0.803 -0.759,-0.803 -0.473,0 -0.759,0.319 -0.759,0.803 l 0,4.433 z" />
+ <path
+ id="path351"
+ style=""
+ d="m 40.172969,368.13187 c 0,0.803 0.418,1.056 1.056,1.056 l 4.323,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -3.575,0 0,-1.914 3.058,0 c 0.473,0 0.847,-0.132 0.847,-0.693 0,-0.561 -0.374,-0.693 -0.847,-0.693 l -3.058,0 0,-1.716 3.487,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -4.235,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z" />
+ <path
+ id="path353"
+ style=""
+ d="m 47.713984,368.13187 c 0,0.803 0.418,1.056 1.056,1.056 l 4.323,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -3.575,0 0,-1.914 3.058,0 c 0.473,0 0.847,-0.132 0.847,-0.693 0,-0.561 -0.374,-0.693 -0.847,-0.693 l -3.058,0 0,-1.716 3.487,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -4.235,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,5.808 z" />
+ </g>
+ </g>
+ <g
+ id="g3908-4-1-3-3"
+ transform="translate(145.125,-69.875003)">
+ <path
+ id="rect3806-4-2-6-8-5"
+ d="m 21.740473,657.23718 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86548 l 0,36.26907 c 0,1.03347 -0.832001,1.86548 -1.865473,1.86548 l -56.269054,0 c -1.033472,0 -1.865473,-0.83201 -1.865473,-1.86548 l 0,-36.26907 c 0,-1.03348 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-7-0-0-9"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(6.486036,298.2575)">
+ <path
+ id="path357"
+ style=""
+ d="m 26.540016,362.45587 c 0.044,-0.165 0.088,-0.341 0.088,-0.517 0,-0.55 -0.451,-0.814 -0.869,-0.814 -0.429,0 -0.704,0.209 -0.814,0.737 l -1.078,5.258 -0.022,0 -1.199,-5.137 c -0.11,-0.495 -0.264,-0.858 -1.023,-0.858 -0.671,0 -0.847,0.231 -0.946,0.671 l -1.232,5.324 -0.022,0 -1.067,-5.258 c -0.11,-0.528 -0.385,-0.737 -0.847,-0.737 -0.418,0 -0.869,0.264 -0.869,0.814 0,0.176 0.044,0.352 0.088,0.517 l 1.551,6.017 c 0.165,0.627 0.429,0.858 1.089,0.858 0.682,0 0.935,-0.286 1.078,-0.891 l 1.177,-4.829 0.022,0 1.177,4.829 c 0.154,0.605 0.396,0.891 1.078,0.891 0.66,0 0.924,-0.231 1.089,-0.858 l 1.551,-6.017 z" />
+ <path
+ id="path359"
+ style=""
+ d="m 27.450609,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-4.433 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.803,0.374 -0.803,0.803 l 0,4.433 z m -0.033,-6.611 c 0,0.462 0.374,0.836 0.836,0.836 0.462,0 0.836,-0.374 0.836,-0.836 0,-0.462 -0.374,-0.836 -0.836,-0.836 -0.462,0 -0.836,0.374 -0.836,0.836 z" />
+ <path
+ id="path361"
+ style=""
+ d="m 30.501391,368.52787 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-6.6 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ <path
+ id="path363"
+ style=""
+ d="m 38.909172,361.92787 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,2.178 -0.022,0 c -0.319,-0.517 -0.869,-0.814 -1.584,-0.814 -1.694,0 -2.475,1.441 -2.475,2.981 0,2.079 1.177,3.058 2.519,3.058 0.781,0 1.43,-0.33 1.694,-1.012 l 0.022,0 0,0.253 c 0,0.495 0.253,0.759 0.726,0.759 0.495,0 0.726,-0.264 0.726,-0.759 l 0,-6.644 z m -4.081,4.4 c 0,-0.748 0.253,-1.782 1.276,-1.782 0.979,-0.011 1.287,0.957 1.287,1.782 0,0.913 -0.352,1.749 -1.287,1.749 -0.858,-0.022 -1.276,-0.803 -1.276,-1.749 z" />
+ <path
+ id="path365"
+ style=""
+ d="m 40.606781,368.52787 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-4.037 0.396,0 c 0.396,0 0.649,-0.143 0.649,-0.528 0,-0.385 -0.253,-0.528 -0.649,-0.528 l -0.396,0 0,-0.715 c 0,-0.242 0.077,-0.352 0.22,-0.352 0.099,0 0.187,0.033 0.286,0.033 0.286,0 0.539,-0.209 0.539,-0.594 0,-0.55 -0.473,-0.726 -0.968,-0.726 -1.199,0 -1.683,0.462 -1.683,1.551 l 0,0.803 -0.275,0 c -0.451,0 -0.638,0.176 -0.638,0.528 0,0.352 0.187,0.528 0.638,0.528 l 0.275,0 0,4.037 z m 3.333,0 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-6.6 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ <path
+ id="path367"
+ style=""
+ d="m 48.013391,363.89687 c -0.099,-0.363 -0.396,-0.605 -0.825,-0.605 -0.429,0 -0.781,0.33 -0.781,0.77 0,0.187 0.066,0.363 0.198,0.748 l 1.672,4.763 c -0.121,0.495 -0.352,0.506 -0.561,0.506 l -0.165,0 c -0.429,0 -0.737,0.22 -0.737,0.649 0,0.385 0.297,0.737 1.012,0.737 1.012,0 1.452,-0.572 1.837,-1.672 l 1.859,-5.269 c 0.077,-0.209 0.121,-0.374 0.121,-0.506 0,-0.198 -0.187,-0.726 -0.825,-0.726 -0.44,0 -0.66,0.308 -0.77,0.715 l -0.979,3.641 -0.022,0 -1.034,-3.751 z" />
+ </g>
+ </g>
+ <g
+ id="g3908-3-3"
+ transform="translate(145.125,-49.875)">
+ <path
+ id="rect3806-4-0-0"
+ d="m 21.740473,662.23718 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86548 l 0,31.26908 c 0,1.03347 -0.832001,1.86547 -1.865473,1.86547 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86547 l 0,-31.26908 c 0,-1.03348 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-8-5"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(5.5983218,303.07893)">
+ <path
+ id="path371"
+ style=""
+ d="m 24.725016,365.74487 c 0,-0.495 -0.209,-0.759 -0.737,-0.759 l -2.222,0 c -0.451,0 -0.704,0.253 -0.704,0.693 0,0.55 0.429,0.693 0.814,0.693 l 1.177,0 c -0.088,0.968 -0.924,1.617 -1.881,1.617 -1.474,0 -2.244,-1.078 -2.244,-2.64 0,-2.002 0.979,-2.816 2.222,-2.816 1.76,0 1.43,1.243 2.321,1.243 0.385,0 0.847,-0.165 0.847,-0.792 0,-0.704 -1.067,-1.903 -3.069,-1.903 -2.453,0 -4.125,1.474 -4.125,4.147 0,2.222 1.067,4.147 3.861,4.147 1.122,0 1.837,-0.418 2.354,-1.067 0.11,0.704 0.253,1.023 0.77,1.023 0.363,0 0.616,-0.275 0.616,-0.605 l 0,-2.981 z" />
+ <path
+ id="path373"
+ style=""
+ d="m 26.226,368.52787 c 0,0.528 0.319,0.803 0.803,0.803 0.484,0 0.803,-0.275 0.803,-0.803 l 0,-6.6 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ <path
+ id="path375"
+ style=""
+ d="m 34.523781,364.94187 c 0,-1.155 -1.067,-1.65 -2.607,-1.65 -1.65,0 -2.552,0.814 -2.552,1.452 0,0.33 0.275,0.616 0.682,0.616 0.638,0 0.671,-0.88 1.859,-0.88 0.539,0 1.012,0.198 1.012,0.66 0,0.462 -0.308,0.55 -0.693,0.594 l -0.979,0.11 c -1.232,0.143 -2.244,0.517 -2.244,1.848 0,1.012 0.902,1.639 1.815,1.639 0.847,0 1.573,-0.242 2.2,-0.935 0.022,0.495 0.253,0.935 0.946,0.935 0.385,0 0.726,-0.253 0.726,-0.616 0,-0.253 -0.165,-0.407 -0.165,-1.078 l 0,-2.695 z m -1.606,2.167 c 0,0.594 -0.539,1.166 -1.419,1.166 -0.55,0 -0.891,-0.297 -0.891,-0.66 0,-0.484 0.363,-0.693 1.034,-0.792 l 0.583,-0.088 c 0.187,-0.033 0.517,-0.088 0.693,-0.253 l 0,0.627 z" />
+ <path
+ id="path377"
+ style=""
+ d="m 35.660391,365.08487 c 0,1.078 0.726,1.463 1.661,1.694 l 0.946,0.231 c 0.572,0.143 0.924,0.209 0.924,0.616 0,0.33 -0.363,0.583 -0.935,0.583 -1.188,0 -1.254,-0.99 -1.947,-0.99 -0.451,0 -0.649,0.319 -0.649,0.671 0,0.792 1.21,1.441 2.662,1.441 1.21,0 2.475,-0.605 2.475,-1.914 0,-1.122 -1.089,-1.507 -2.002,-1.716 l -0.671,-0.154 c -0.495,-0.11 -0.858,-0.198 -0.858,-0.572 0,-0.341 0.363,-0.495 0.924,-0.495 1.012,0 1.034,0.737 1.661,0.737 0.418,0 0.671,-0.33 0.671,-0.704 0,-0.737 -1.232,-1.221 -2.453,-1.221 -1.111,0 -2.409,0.484 -2.409,1.793 z" />
+ <path
+ id="path379"
+ style=""
+ d="m 41.568594,365.08487 c 0,1.078 0.726,1.463 1.661,1.694 l 0.946,0.231 c 0.572,0.143 0.924,0.209 0.924,0.616 0,0.33 -0.363,0.583 -0.935,0.583 -1.188,0 -1.254,-0.99 -1.947,-0.99 -0.451,0 -0.649,0.319 -0.649,0.671 0,0.792 1.21,1.441 2.662,1.441 1.21,0 2.475,-0.605 2.475,-1.914 0,-1.122 -1.089,-1.507 -2.002,-1.716 l -0.671,-0.154 c -0.495,-0.11 -0.858,-0.198 -0.858,-0.572 0,-0.341 0.363,-0.495 0.924,-0.495 1.012,0 1.034,0.737 1.661,0.737 0.418,0 0.671,-0.33 0.671,-0.704 0,-0.737 -1.232,-1.221 -2.453,-1.221 -1.111,0 -2.409,0.484 -2.409,1.793 z" />
+ <path
+ id="path381"
+ style=""
+ d="m 47.971797,368.42887 c 0,0.539 0.352,0.902 0.902,0.902 0.55,0 0.902,-0.363 0.902,-0.902 l 0,-2.475 2.728,0 c 0.473,0 0.847,-0.132 0.847,-0.693 0,-0.561 -0.374,-0.693 -0.847,-0.693 l -2.728,0 0,-1.848 3.223,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -3.971,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,6.105 z" />
+ <path
+ id="path383"
+ style=""
+ d="m 54.75725,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-4.433 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.803,0.374 -0.803,0.803 l 0,4.433 z m -0.033,-6.611 c 0,0.462 0.374,0.836 0.836,0.836 0.462,0 0.836,-0.374 0.836,-0.836 0,-0.462 -0.374,-0.836 -0.836,-0.836 -0.462,0 -0.836,0.374 -0.836,0.836 z" />
+ <path
+ id="path385"
+ style=""
+ d="m 57.467031,365.08487 c 0,1.078 0.726,1.463 1.661,1.694 l 0.946,0.231 c 0.572,0.143 0.924,0.209 0.924,0.616 0,0.33 -0.363,0.583 -0.935,0.583 -1.188,0 -1.254,-0.99 -1.947,-0.99 -0.451,0 -0.649,0.319 -0.649,0.671 0,0.792 1.21,1.441 2.662,1.441 1.21,0 2.475,-0.605 2.475,-1.914 0,-1.122 -1.089,-1.507 -2.002,-1.716 l -0.671,-0.154 c -0.495,-0.11 -0.858,-0.198 -0.858,-0.572 0,-0.341 0.363,-0.495 0.924,-0.495 1.012,0 1.034,0.737 1.661,0.737 0.418,0 0.671,-0.33 0.671,-0.704 0,-0.737 -1.232,-1.221 -2.453,-1.221 -1.111,0 -2.409,0.484 -2.409,1.793 z" />
+ <path
+ id="path387"
+ style=""
+ d="m 63.628234,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.474,0.429 -1.793,0.847 l -0.022,0 0,-2.211 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ </g>
+ </g>
+ <g
+ id="g3908-3-3-7"
+ transform="translate(145.125,-29.875002)">
+ <path
+ id="rect3806-4-0-0-8"
+ d="m 21.740473,667.23718 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86548 l 0,26.26907 c 0,1.03348 -0.832001,1.86548 -1.865473,1.86548 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86548 l 0,-26.26907 c 0,-1.03348 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-8-5-5"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(5.4917504,307.90036)">
+ <path
+ id="path391"
+ style=""
+ d="m 17.025016,365.12887 c 0,2.398 1.166,4.246 4.004,4.246 2.706,0 4.004,-2.013 4.004,-4.246 0,-2.321 -1.408,-4.048 -4.004,-4.048 -2.596,0 -4.004,1.727 -4.004,4.048 z m 1.804,0 c 0,-1.518 0.726,-2.596 2.2,-2.596 1.474,0 2.2,1.078 2.2,2.596 0,1.518 -0.561,2.794 -2.2,2.794 -1.694,0 -2.2,-1.276 -2.2,-2.794 z" />
+ <path
+ id="path393"
+ style=""
+ d="m 26.577484,367.90087 c 0,0.946 0.484,1.43 1.65,1.43 0.77,0 1.166,-0.253 1.166,-0.715 0,-0.341 -0.209,-0.539 -0.561,-0.539 l -0.231,0 c -0.286,0 -0.418,-0.132 -0.418,-0.374 l 0,-3.212 0.484,0 c 0.473,0 0.726,-0.143 0.726,-0.528 0,-0.385 -0.253,-0.528 -0.726,-0.528 l -0.484,0 0,-0.979 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,0.979 -0.275,0 c -0.451,0 -0.638,0.176 -0.638,0.528 0,0.352 0.187,0.528 0.638,0.528 l 0.275,0 0,3.41 z" />
+ <path
+ id="path395"
+ style=""
+ d="m 30.220031,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-2.651 c 0,-0.803 0.66,-1.265 1.221,-1.265 0.693,0 1.012,0.462 1.012,1.111 l 0,2.805 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-3.124 c 0,-1.628 -1.056,-2.112 -2.024,-2.112 -0.913,0 -1.474,0.429 -1.793,0.847 l -0.022,0 0,-2.211 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.6 z" />
+ <path
+ id="path397"
+ style=""
+ d="m 41.938641,366.61387 c 0.539,0 0.704,-0.143 0.704,-0.693 0,-1.32 -1.056,-2.629 -2.904,-2.629 -1.903,0 -3.036,1.254 -3.036,3.124 0,1.397 0.847,2.915 3.091,2.915 0.968,0 2.519,-0.451 2.519,-1.419 0,-0.297 -0.275,-0.627 -0.66,-0.627 -0.649,0 -0.649,0.792 -1.859,0.792 -0.935,0 -1.485,-0.616 -1.485,-1.463 l 3.63,0 z m -3.63,-0.924 c 0.176,-0.781 0.66,-1.276 1.463,-1.276 0.715,0 1.265,0.539 1.353,1.276 l -2.816,0 z" />
+ <path
+ id="path399"
+ style=""
+ d="m 43.75725,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-1.87 c 0,-1.331 0.352,-1.782 1.001,-1.782 l 0.286,0 c 0.396,0 0.792,-0.209 0.792,-0.803 0,-0.451 -0.374,-0.781 -0.88,-0.781 -0.781,0 -1.144,0.693 -1.331,1.364 l -0.022,0 0,-0.616 c 0,-0.484 -0.319,-0.748 -0.726,-0.748 -0.407,0 -0.726,0.264 -0.726,0.748 l 0,4.488 z" />
+ </g>
+ </g>
+ <g
+ id="g3822-0-3"
+ transform="translate(130,2.421875e-6)">
+ <path
+ id="path3005-2-8-1"
+ d="m 19.911936,426.71852 a 9.1659365,9.1659365 0 0 1 -2.53643,-12.71142 9.1659365,9.1659365 0 0 1 12.711199,-2.53756 9.1659365,9.1659365 0 0 1 2.538696,12.71097 9.1659365,9.1659365 0 0 1 -12.710747,2.53983 L 25,419.09448 Z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:0.13524589;marker:none;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,36.362543,498.74687)" />
+ <path
+ transform="translate(0,308.2677)"
+ id="path3804-9-3"
+ d="m 50,419.09448 c 0,-15 0,-25.36336 0,-25.36336"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <path
+ id="rect3806-0-6"
+ d="m 138.03046,661.99884 83.93908,0 c 1.67887,0 3.03046,1.35159 3.03046,3.03046 l 0,34.30242 c 0,1.67888 -1.35159,3.03046 -3.03046,3.03046 l -83.93908,0 c -1.67887,0 -3.03046,-1.35158 -3.03046,-3.03046 l 0,-34.30242 c 0,-1.67887 1.35159,-3.03046 3.03046,-3.03046 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-3-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(122.76475,307.13793)">
+ <path
+ id="path404"
+ style=""
+ d="m 17.757016,370.83262 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-9.312 c 0,-0.784 -0.512,-1.312 -1.312,-1.312 -0.8,0 -1.312,0.528 -1.312,1.312 l 0,9.312 z" />
+ <path
+ id="path406"
+ style=""
+ d="m 22.531516,370.97662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-3.856 c 0,-1.168 0.96,-1.84 1.776,-1.84 1.008,0 1.472,0.672 1.472,1.616 l 0,4.08 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-4.544 c 0,-2.368 -1.536,-3.072 -2.944,-3.072 -1.328,0 -2.176,0.608 -2.832,1.472 l -0.032,0 0,-0.304 c 0,-0.704 -0.32,-1.168 -1.056,-1.168 -0.736,0 -1.056,0.464 -1.056,1.168 l 0,6.448 z" />
+ <path
+ id="path408"
+ style=""
+ d="m 31.944766,365.96862 c 0,1.568 1.056,2.128 2.416,2.464 l 1.376,0.336 c 0.832,0.208 1.344,0.304 1.344,0.896 0,0.48 -0.528,0.848 -1.36,0.848 -1.728,0 -1.824,-1.44 -2.832,-1.44 -0.656,0 -0.944,0.464 -0.944,0.976 0,1.152 1.76,2.096 3.872,2.096 1.76,0 3.6,-0.88 3.6,-2.784 0,-1.632 -1.584,-2.192 -2.912,-2.496 l -0.976,-0.224 c -0.72,-0.16 -1.248,-0.288 -1.248,-0.832 0,-0.496 0.528,-0.72 1.344,-0.72 1.472,0 1.504,1.072 2.416,1.072 0.608,0 0.976,-0.48 0.976,-1.024 0,-1.072 -1.792,-1.776 -3.568,-1.776 -1.616,0 -3.504,0.704 -3.504,2.608 z" />
+ <path
+ id="path410"
+ style=""
+ d="m 41.514516,370.06462 c 0,1.376 0.704,2.08 2.4,2.08 1.12,0 1.696,-0.368 1.696,-1.04 0,-0.496 -0.304,-0.784 -0.816,-0.784 l -0.336,0 c -0.416,0 -0.608,-0.192 -0.608,-0.544 l 0,-4.672 0.704,0 c 0.688,0 1.056,-0.208 1.056,-0.768 0,-0.56 -0.368,-0.768 -1.056,-0.768 l -0.704,0 0,-1.424 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,1.424 -0.4,0 c -0.656,0 -0.928,0.256 -0.928,0.768 0,0.512 0.272,0.768 0.928,0.768 l 0.4,0 0,4.96 z" />
+ <path
+ id="path412"
+ style=""
+ d="m 54.572766,365.76062 c 0,-1.68 -1.552,-2.4 -3.792,-2.4 -2.4,0 -3.712,1.184 -3.712,2.112 0,0.48 0.4,0.896 0.992,0.896 0.928,0 0.976,-1.28 2.704,-1.28 0.784,0 1.472,0.288 1.472,0.96 0,0.672 -0.448,0.8 -1.008,0.864 l -1.424,0.16 c -1.792,0.208 -3.264,0.752 -3.264,2.688 0,1.472 1.312,2.384 2.64,2.384 1.232,0 2.288,-0.352 3.2,-1.36 0.032,0.72 0.368,1.36 1.376,1.36 0.56,0 1.056,-0.368 1.056,-0.896 0,-0.368 -0.24,-0.592 -0.24,-1.568 l 0,-3.92 z m -2.336,3.152 c 0,0.864 -0.784,1.696 -2.064,1.696 -0.8,0 -1.296,-0.432 -1.296,-0.96 0,-0.704 0.528,-1.008 1.504,-1.152 l 0.848,-0.128 c 0.272,-0.048 0.752,-0.128 1.008,-0.368 l 0,0.912 z" />
+ <path
+ id="path414"
+ style=""
+ d="m 56.722016,370.97662 c 0,0.768 0.464,1.168 1.168,1.168 0.704,0 1.168,-0.4 1.168,-1.168 l 0,-9.6 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,9.6 z" />
+ <path
+ id="path416"
+ style=""
+ d="m 61.159516,370.97662 c 0,0.768 0.464,1.168 1.168,1.168 0.704,0 1.168,-0.4 1.168,-1.168 l 0,-9.6 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,9.6 z" />
+ <path
+ id="path418"
+ style=""
+ d="m 78.135266,365.76062 c 0,-1.68 -1.552,-2.4 -3.792,-2.4 -2.4,0 -3.712,1.184 -3.712,2.112 0,0.48 0.4,0.896 0.992,0.896 0.928,0 0.976,-1.28 2.704,-1.28 0.784,0 1.472,0.288 1.472,0.96 0,0.672 -0.448,0.8 -1.008,0.864 l -1.424,0.16 c -1.792,0.208 -3.264,0.752 -3.264,2.688 0,1.472 1.312,2.384 2.64,2.384 1.232,0 2.288,-0.352 3.2,-1.36 0.032,0.72 0.368,1.36 1.376,1.36 0.56,0 1.056,-0.368 1.056,-0.896 0,-0.368 -0.24,-0.592 -0.24,-1.568 l 0,-3.92 z m -2.336,3.152 c 0,0.864 -0.784,1.696 -2.064,1.696 -0.8,0 -1.296,-0.432 -1.296,-0.96 0,-0.704 0.528,-1.008 1.504,-1.152 l 0.848,-0.128 c 0.272,-0.048 0.752,-0.128 1.008,-0.368 l 0,0.912 z" />
+ <path
+ id="path420"
+ style=""
+ d="m 21.597016,379.16862 c -0.832,-0.192 -1.792,-0.448 -1.792,-1.248 0,-0.8 0.672,-1.36 1.888,-1.36 2.448,0 2.224,1.712 3.44,1.712 0.64,0 1.2,-0.384 1.2,-1.04 0,-1.536 -2.416,-2.688 -4.464,-2.688 -2.224,0 -4.592,0.96 -4.592,3.52 0,1.232 0.432,2.544 2.816,3.152 l 2.96,0.752 c 0.896,0.224 1.12,0.736 1.12,1.2 0,0.768 -0.752,1.52 -2.112,1.52 -2.656,0 -2.288,-2.08 -3.712,-2.08 -0.64,0 -1.104,0.448 -1.104,1.088 0,1.248 1.488,2.912 4.816,2.912 3.168,0 4.736,-1.552 4.736,-3.632 0,-1.344 -0.608,-2.768 -3.008,-3.312 l -2.192,-0.496 z" />
+ <path
+ id="path422"
+ style=""
+ d="m 35.701766,382.59262 c 0.784,0 1.024,-0.208 1.024,-1.008 0,-1.92 -1.536,-3.824 -4.224,-3.824 -2.768,0 -4.416,1.824 -4.416,4.544 0,2.032 1.232,4.24 4.496,4.24 1.408,0 3.664,-0.656 3.664,-2.064 0,-0.432 -0.4,-0.912 -0.96,-0.912 -0.944,0 -0.944,1.152 -2.704,1.152 -1.36,0 -2.16,-0.896 -2.16,-2.128 l 5.28,0 z m -5.28,-1.344 c 0.256,-1.136 0.96,-1.856 2.128,-1.856 1.04,0 1.84,0.784 1.968,1.856 l -4.096,0 z" />
+ <path
+ id="path424"
+ style=""
+ d="m 38.347016,385.37662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-2.72 c 0,-1.936 0.512,-2.592 1.456,-2.592 l 0.416,0 c 0.576,0 1.152,-0.304 1.152,-1.168 0,-0.656 -0.544,-1.136 -1.28,-1.136 -1.136,0 -1.664,1.008 -1.936,1.984 l -0.032,0 0,-0.896 c 0,-0.704 -0.464,-1.088 -1.056,-1.088 -0.592,0 -1.056,0.384 -1.056,1.088 l 0,6.528 z" />
+ <path
+ id="path426"
+ style=""
+ d="m 46.255016,385.71262 c 0.224,0.624 0.368,0.832 1.536,0.832 1.168,0 1.312,-0.208 1.536,-0.832 l 2.208,-6.144 c 0.064,-0.192 0.144,-0.448 0.144,-0.592 0,-0.832 -0.576,-1.216 -1.136,-1.216 -0.88,0 -1.104,0.736 -1.168,0.976 l -1.568,5.28 -0.032,0 -1.568,-5.28 c -0.064,-0.24 -0.288,-0.976 -1.168,-0.976 -0.56,0 -1.136,0.384 -1.136,1.216 0,0.144 0.08,0.4 0.144,0.592 l 2.208,6.144 z" />
+ <path
+ id="path428"
+ style=""
+ d="m 59.983016,382.59262 c 0.784,0 1.024,-0.208 1.024,-1.008 0,-1.92 -1.536,-3.824 -4.224,-3.824 -2.768,0 -4.416,1.824 -4.416,4.544 0,2.032 1.232,4.24 4.496,4.24 1.408,0 3.664,-0.656 3.664,-2.064 0,-0.432 -0.4,-0.912 -0.96,-0.912 -0.944,0 -0.944,1.152 -2.704,1.152 -1.36,0 -2.16,-0.896 -2.16,-2.128 l 5.28,0 z m -5.28,-1.344 c 0.256,-1.136 0.96,-1.856 2.128,-1.856 1.04,0 1.84,0.784 1.968,1.856 l -4.096,0 z" />
+ <path
+ id="path430"
+ style=""
+ d="m 62.628266,385.37662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-2.72 c 0,-1.936 0.512,-2.592 1.456,-2.592 l 0.416,0 c 0.576,0 1.152,-0.304 1.152,-1.168 0,-0.656 -0.544,-1.136 -1.28,-1.136 -1.136,0 -1.664,1.008 -1.936,1.984 l -0.032,0 0,-0.896 c 0,-0.704 -0.464,-1.088 -1.056,-1.088 -0.592,0 -1.056,0.384 -1.056,1.088 l 0,6.528 z" />
+ </g>
+ </g>
+ <g
+ id="g3238-6"
+ transform="translate(460,-0.36332963)">
+ <g
+ id="g3908-0"
+ transform="translate(50.125,-29.511643)">
+ <path
+ id="rect3806-4-6"
+ d="m 16.740473,667.23718 56.269054,0 c 1.033472,0 1.865473,0.832 1.865473,1.86548 l 0,26.26908 c 0,1.03347 -0.832001,1.86547 -1.865473,1.86547 l -56.269054,0 c -1.033472,0 -1.865473,-0.832 -1.865473,-1.86547 l 0,-26.26908 c 0,-1.03348 0.832001,-1.86548 1.865473,-1.86548 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1, 2;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-5-9"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:11px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(-0.038706,307.54845)">
+ <path
+ id="path434"
+ style=""
+ d="m 17.421016,368.42887 c 0,0.539 0.352,0.902 0.902,0.902 0.55,0 0.902,-0.363 0.902,-0.902 l 0,-2.475 2.728,0 c 0.473,0 0.847,-0.132 0.847,-0.693 0,-0.561 -0.374,-0.693 -0.847,-0.693 l -2.728,0 0,-1.848 3.223,0 c 0.528,0 0.913,-0.154 0.913,-0.726 0,-0.572 -0.385,-0.726 -0.913,-0.726 l -3.971,0 c -0.638,0 -1.056,0.253 -1.056,1.056 l 0,6.105 z" />
+ <path
+ id="path436"
+ style=""
+ d="m 24.206469,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-4.433 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.803,0.374 -0.803,0.803 l 0,4.433 z m -0.033,-6.611 c 0,0.462 0.374,0.836 0.836,0.836 0.462,0 0.836,-0.374 0.836,-0.836 0,-0.462 -0.374,-0.836 -0.836,-0.836 -0.462,0 -0.836,0.374 -0.836,0.836 z" />
+ <path
+ id="path438"
+ style=""
+ d="m 27.25725,368.52787 c 0,0.429 0.176,0.803 0.803,0.803 0.627,0 0.803,-0.374 0.803,-0.803 l 0,-1.87 c 0,-1.331 0.352,-1.782 1.001,-1.782 l 0.286,0 c 0.396,0 0.792,-0.209 0.792,-0.803 0,-0.451 -0.374,-0.781 -0.88,-0.781 -0.781,0 -1.144,0.693 -1.331,1.364 l -0.022,0 0,-0.616 c 0,-0.484 -0.319,-0.748 -0.726,-0.748 -0.407,0 -0.726,0.264 -0.726,0.748 l 0,4.488 z" />
+ <path
+ id="path440"
+ style=""
+ d="m 36.503094,366.61387 c 0.539,0 0.704,-0.143 0.704,-0.693 0,-1.32 -1.056,-2.629 -2.904,-2.629 -1.903,0 -3.036,1.254 -3.036,3.124 0,1.397 0.847,2.915 3.091,2.915 0.968,0 2.519,-0.451 2.519,-1.419 0,-0.297 -0.275,-0.627 -0.66,-0.627 -0.649,0 -0.649,0.792 -1.859,0.792 -0.935,0 -1.485,-0.616 -1.485,-1.463 l 3.63,0 z m -3.63,-0.924 c 0.176,-0.781 0.66,-1.276 1.463,-1.276 0.715,0 1.265,0.539 1.353,1.276 l -2.816,0 z" />
+ <path
+ id="path442"
+ style=""
+ d="m 38.233703,368.57187 c 0,0.495 0.231,0.759 0.726,0.759 0.473,0 0.726,-0.264 0.726,-0.759 l 0,-0.253 0.022,0 c 0.264,0.682 0.913,1.012 1.694,1.012 1.342,0 2.519,-0.979 2.519,-3.058 0,-1.54 -0.781,-2.981 -2.475,-2.981 -0.715,0 -1.265,0.297 -1.584,0.814 l -0.022,0 0,-2.178 c 0,-0.528 -0.319,-0.803 -0.803,-0.803 -0.484,0 -0.803,0.275 -0.803,0.803 l 0,6.644 z m 4.081,-2.244 c 0,0.946 -0.418,1.727 -1.276,1.749 -0.935,0 -1.287,-0.836 -1.287,-1.749 0,-0.825 0.308,-1.793 1.287,-1.782 1.023,0 1.276,1.034 1.276,1.782 z" />
+ <path
+ id="path444"
+ style=""
+ d="m 50.403312,364.09487 c 0,-0.429 -0.176,-0.803 -0.803,-0.803 -0.627,0 -0.802999,0.374 -0.802999,0.803 l 0,2.651 c 0,0.803 -0.660001,1.265 -1.221001,1.265 -0.692999,0 -1.012,-0.462 -1.012,-1.111 l 0,-2.805 c 0,-0.429 -0.176,-0.803 -0.802999,-0.803 -0.627001,0 -0.803001,0.374 -0.803001,0.803 l 0,3.124 c 0,1.628 1.056001,2.112 2.024,2.112 0.913001,0 1.496,-0.418 1.947001,-1.012 l 0.022,0 0,0.209 c 0,0.484 0.22,0.803 0.726,0.803 0.506,0 0.726,-0.319 0.726,-0.803 l 0,-4.433 z" />
+ <path
+ id="path446"
+ style=""
+ d="m 53.046922,366.29487 c 0,-0.99 0.319,-1.749 1.353,-1.749 0.748,0 1.188,0.517 1.188,1.683 0,1.144 -0.55,1.617 -1.265,1.617 -0.913,0 -1.276,-0.814 -1.276,-1.551 z m 4.081,-2.244 c 0,-0.495 -0.231,-0.759 -0.726,-0.759 -0.473,0 -0.726,0.264 -0.726,0.759 l 0,0.198 -0.022,0 c -0.297,-0.594 -0.913,-0.957 -1.694,-0.957 -1.353,0 -2.519,0.979 -2.519,3.058 0,1.584 0.88,2.684 2.574,2.684 0.638,0 1.265,-0.352 1.551,-0.77 l 0.022,0 0,0.33 c 0,1.265 -0.396,1.76 -1.375,1.76 -0.902,0 -1.034,-0.825 -1.705,-0.825 -0.352,0 -0.66,0.286 -0.66,0.682 0,0.781 1.199,1.331 2.42,1.331 1.672,0 2.86,-0.891 2.86,-2.827 l 0,-4.664 z" />
+ </g>
+ </g>
+ <g
+ id="g3822-1"
+ transform="translate(30,0.3633567)">
+ <path
+ id="path3005-2-1"
+ d="m 19.911936,426.71852 a 9.1659365,9.1659365 0 0 1 -2.602258,-12.61135 9.1659365,9.1659365 0 0 1 12.576029,-2.76796 9.1659365,9.1659365 0 0 1 2.933174,12.53852 9.1659365,9.1659365 0 0 1 -12.498848,3.09789"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.66637278;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,36.362543,498.74687)" />
+ <path
+ transform="translate(0,308.2677)"
+ id="path3804-4"
+ d="m 50,414.09448 c 0,-15 0,-20.36336 0,-20.36336"
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="g3868-8"
+ transform="translate(4.8113861,-12.853955)">
+ <path
+ id="rect3806-8"
+ d="m 33.219076,675.57947 83.939074,0 c 1.67888,0 3.03046,1.35158 3.03046,3.03046 l 0,33.93905 c 0,1.67888 -1.35158,3.03046 -3.03046,3.03046 l -83.939074,0 c -1.678876,0 -3.030462,-1.35158 -3.030462,-3.03046 l 0,-33.93905 c 0,-1.67888 1.351586,-3.03046 3.030462,-3.03046 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <g
+ id="flowRoot3808-4"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(18.369364,319.99189)">
+ <path
+ id="path451"
+ style=""
+ d="m 17.245016,366.03262 c 0,3.488 1.696,6.176 5.824,6.176 3.936,0 5.824,-2.928 5.824,-6.176 0,-3.376 -2.048,-5.888 -5.824,-5.888 -3.776,0 -5.824,2.512 -5.824,5.888 z m 2.624,0 c 0,-2.208 1.056,-3.776 3.2,-3.776 2.144,0 3.2,1.568 3.2,3.776 0,2.208 -0.816,4.064 -3.2,4.064 -2.464,0 -3.2,-1.856 -3.2,-4.064 z" />
+ <path
+ id="path453"
+ style=""
+ d="m 31.139516,370.06462 c 0,1.376 0.704,2.08 2.4,2.08 1.12,0 1.696,-0.368 1.696,-1.04 0,-0.496 -0.304,-0.784 -0.816,-0.784 l -0.336,0 c -0.416,0 -0.608,-0.192 -0.608,-0.544 l 0,-4.672 0.704,0 c 0.688,0 1.056,-0.208 1.056,-0.768 0,-0.56 -0.368,-0.768 -1.056,-0.768 l -0.704,0 0,-1.424 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,1.424 -0.4,0 c -0.656,0 -0.928,0.256 -0.928,0.768 0,0.512 0.272,0.768 0.928,0.768 l 0.4,0 0,4.96 z" />
+ <path
+ id="path455"
+ style=""
+ d="m 36.437766,370.97662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-3.856 c 0,-1.168 0.96,-1.84 1.776,-1.84 1.008,0 1.472,0.672 1.472,1.616 l 0,4.08 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-4.544 c 0,-2.368 -1.536,-3.072 -2.944,-3.072 -1.328,0 -2.144,0.624 -2.608,1.232 l -0.032,0 0,-3.216 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,9.6 z" />
+ <path
+ id="path457"
+ style=""
+ d="m 53.483016,368.19262 c 0.784,0 1.024,-0.208 1.024,-1.008 0,-1.92 -1.536,-3.824 -4.224,-3.824 -2.768,0 -4.416,1.824 -4.416,4.544 0,2.032 1.232,4.24 4.496,4.24 1.408,0 3.664,-0.656 3.664,-2.064 0,-0.432 -0.4,-0.912 -0.96,-0.912 -0.944,0 -0.944,1.152 -2.704,1.152 -1.36,0 -2.16,-0.896 -2.16,-2.128 l 5.28,0 z m -5.28,-1.344 c 0.256,-1.136 0.96,-1.856 2.128,-1.856 1.04,0 1.84,0.784 1.968,1.856 l -4.096,0 z" />
+ <path
+ id="path459"
+ style=""
+ d="m 56.128266,370.97662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-2.72 c 0,-1.936 0.512,-2.592 1.456,-2.592 l 0.416,0 c 0.576,0 1.152,-0.304 1.152,-1.168 0,-0.656 -0.544,-1.136 -1.28,-1.136 -1.136,0 -1.664,1.008 -1.936,1.984 l -0.032,0 0,-0.896 c 0,-0.704 -0.464,-1.088 -1.056,-1.088 -0.592,0 -1.056,0.384 -1.056,1.088 l 0,6.528 z" />
+ <path
+ id="path461"
+ style=""
+ d="m 20.573016,385.23262 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-8.208 2.48,0 c 0.752,0 1.36,-0.384 1.36,-1.104 0,-0.72 -0.608,-1.104 -1.36,-1.104 l -7.584,0 c -0.752,0 -1.36,0.384 -1.36,1.104 0,0.72 0.608,1.104 1.36,1.104 l 2.48,0 0,8.208 z" />
+ <path
+ id="path463"
+ style=""
+ d="m 27.953016,382.14462 c 0,-1.52 0.624,-2.656 1.984,-2.656 1.36,0 1.984,1.136 1.984,2.656 0,1.424 -0.592,2.672 -1.984,2.672 -1.392,0 -1.984,-1.248 -1.984,-2.672 z m -2.336,0 c 0,2.336 1.136,4.4 4.32,4.4 3.184,0 4.32,-2.064 4.32,-4.4 0,-2.464 -1.504,-4.384 -4.32,-4.384 -2.816,0 -4.32,1.92 -4.32,4.384 z" />
+ <path
+ id="path465"
+ style=""
+ d="m 37.734266,382.14462 c 0,-1.52 0.624,-2.656 1.984,-2.656 1.36,0 1.984,1.136 1.984,2.656 0,1.424 -0.592,2.672 -1.984,2.672 -1.392,0 -1.984,-1.248 -1.984,-2.672 z m -2.336,0 c 0,2.336 1.136,4.4 4.32,4.4 3.184,0 4.32,-2.064 4.32,-4.4 0,-2.464 -1.504,-4.384 -4.32,-4.384 -2.816,0 -4.32,1.92 -4.32,4.384 z" />
+ <path
+ id="path467"
+ style=""
+ d="m 45.659516,385.37662 c 0,0.768 0.464,1.168 1.168,1.168 0.704,0 1.168,-0.4 1.168,-1.168 l 0,-9.6 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,9.6 z" />
+ <path
+ id="path469"
+ style=""
+ d="m 49.601016,380.36862 c 0,1.568 1.056,2.128 2.416,2.464 l 1.376,0.336 c 0.832,0.208 1.344,0.304 1.344,0.896 0,0.48 -0.528,0.848 -1.36,0.848 -1.728,0 -1.824,-1.44 -2.832,-1.44 -0.656,0 -0.944,0.464 -0.944,0.976 0,1.152 1.76,2.096 3.872,2.096 1.76,0 3.6,-0.88 3.6,-2.784 0,-1.632 -1.584,-2.192 -2.912,-2.496 l -0.976,-0.224 c -0.72,-0.16 -1.248,-0.288 -1.248,-0.832 0,-0.496 0.528,-0.72 1.344,-0.72 1.472,0 1.504,1.072 2.416,1.072 0.608,0 0.976,-0.48 0.976,-1.024 0,-1.072 -1.792,-1.776 -3.568,-1.776 -1.616,0 -3.504,0.704 -3.504,2.608 z" />
+ </g>
+ </g>
+ </g>
+ <path
+ id="path3005-2-1-8-2"
+ d="m 14.823881,434.34255 a 18.331858,18.331858 0 0 1 -5.2045132,-25.22269 18.331858,18.331858 0 0 1 25.1520382,-5.53591 18.331858,18.331858 0 0 1 5.866343,25.07703 18.331858,18.331858 0 0 1 -24.997676,6.19576"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.66637278;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,581.36254,498.74687)" />
+ <g
+ id="flowRoot3808-4-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(590.48907,346.65234)">
+ <path
+ id="path473"
+ style=""
+ d="m 28.445016,366.92862 c 0,-0.72 -0.304,-1.104 -1.072,-1.104 l -3.232,0 c -0.656,0 -1.024,0.368 -1.024,1.008 0,0.8 0.624,1.008 1.184,1.008 l 1.712,0 c -0.128,1.408 -1.344,2.352 -2.736,2.352 -2.144,0 -3.264,-1.568 -3.264,-3.84 0,-2.912 1.424,-4.096 3.232,-4.096 2.56,0 2.08,1.808 3.376,1.808 0.56,0 1.232,-0.24 1.232,-1.152 0,-1.024 -1.552,-2.768 -4.464,-2.768 -3.568,0 -6,2.144 -6,6.032 0,3.232 1.552,6.032 5.616,6.032 1.632,0 2.672,-0.608 3.424,-1.552 0.16,1.024 0.368,1.488 1.12,1.488 0.528,0 0.896,-0.4 0.896,-0.88 l 0,-4.336 z" />
+ <path
+ id="path475"
+ style=""
+ d="m 32.484266,367.74462 c 0,-1.52 0.624,-2.656 1.984,-2.656 1.36,0 1.984,1.136 1.984,2.656 0,1.424 -0.592,2.672 -1.984,2.672 -1.392,0 -1.984,-1.248 -1.984,-2.672 z m -2.336,0 c 0,2.336 1.136,4.4 4.32,4.4 3.184,0 4.32,-2.064 4.32,-4.4 0,-2.464 -1.504,-4.384 -4.32,-4.384 -2.816,0 -4.32,1.92 -4.32,4.384 z" />
+ <path
+ id="path477"
+ style=""
+ d="m 17.389016,380.57662 c 0,3.968 2.128,6.032 5.728,6.032 2.544,0 4.56,-1.648 4.56,-3.312 0,-0.64 -0.64,-1.008 -1.28,-1.008 -1.264,0 -1.216,2.208 -3.28,2.208 -2.272,0 -3.104,-1.824 -3.104,-3.92 0,-2.496 1.36,-3.92 3.008,-3.92 2.4,0 1.952,2.08 3.472,2.08 0.784,0 1.184,-0.448 1.184,-1.184 0,-1.12 -1.648,-3.008 -4.656,-3.008 -3.712,0 -5.632,2.784 -5.632,6.032 z" />
+ <path
+ id="path479"
+ style=""
+ d="m 29.159516,385.37662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-2.72 c 0,-1.936 0.512,-2.592 1.456,-2.592 l 0.416,0 c 0.576,0 1.152,-0.304 1.152,-1.168 0,-0.656 -0.544,-1.136 -1.28,-1.136 -1.136,0 -1.664,1.008 -1.936,1.984 l -0.032,0 0,-0.896 c 0,-0.704 -0.464,-1.088 -1.056,-1.088 -0.592,0 -1.056,0.384 -1.056,1.088 l 0,6.528 z" />
+ <path
+ id="path481"
+ style=""
+ d="m 42.608016,382.59262 c 0.784,0 1.024,-0.208 1.024,-1.008 0,-1.92 -1.536,-3.824 -4.224,-3.824 -2.768,0 -4.416,1.824 -4.416,4.544 0,2.032 1.232,4.24 4.496,4.24 1.408,0 3.664,-0.656 3.664,-2.064 0,-0.432 -0.4,-0.912 -0.96,-0.912 -0.944,0 -0.944,1.152 -2.704,1.152 -1.36,0 -2.16,-0.896 -2.16,-2.128 l 5.28,0 z m -5.28,-1.344 c 0.256,-1.136 0.96,-1.856 2.128,-1.856 1.04,0 1.84,0.784 1.968,1.856 l -4.096,0 z" />
+ <path
+ id="path483"
+ style=""
+ d="m 52.885266,380.16062 c 0,-1.68 -1.552,-2.4 -3.792,-2.4 -2.4,0 -3.712,1.184 -3.712,2.112 0,0.48 0.4,0.896 0.992,0.896 0.928,0 0.976,-1.28 2.704,-1.28 0.784,0 1.472,0.288 1.472,0.96 0,0.672 -0.448,0.8 -1.008,0.864 l -1.424,0.16 c -1.792,0.208 -3.264,0.752 -3.264,2.688 0,1.472 1.312,2.384 2.64,2.384 1.232,0 2.288,-0.352 3.2,-1.36 0.032,0.72 0.368,1.36 1.376,1.36 0.56,0 1.056,-0.368 1.056,-0.896 0,-0.368 -0.24,-0.592 -0.24,-1.568 l 0,-3.92 z m -2.336,3.152 c 0,0.864 -0.784,1.696 -2.064,1.696 -0.8,0 -1.296,-0.432 -1.296,-0.96 0,-0.704 0.528,-1.008 1.504,-1.152 l 0.848,-0.128 c 0.272,-0.048 0.752,-0.128 1.008,-0.368 l 0,0.912 z" />
+ <path
+ id="path485"
+ style=""
+ d="m 55.514516,384.46462 c 0,1.376 0.704,2.08 2.4,2.08 1.12,0 1.696,-0.368 1.696,-1.04 0,-0.496 -0.304,-0.784 -0.816,-0.784 l -0.336,0 c -0.416,0 -0.608,-0.192 -0.608,-0.544 l 0,-4.672 0.704,0 c 0.688,0 1.056,-0.208 1.056,-0.768 0,-0.56 -0.368,-0.768 -1.056,-0.768 l -0.704,0 0,-1.424 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,1.424 -0.4,0 c -0.656,0 -0.928,0.256 -0.928,0.768 0,0.512 0.272,0.768 0.928,0.768 l 0.4,0 0,4.96 z" />
+ <path
+ id="path487"
+ style=""
+ d="m 68.076766,382.59262 c 0.784,0 1.024,-0.208 1.024,-1.008 0,-1.92 -1.536,-3.824 -4.224,-3.824 -2.768,0 -4.416,1.824 -4.416,4.544 0,2.032 1.232,4.24 4.496,4.24 1.408,0 3.664,-0.656 3.664,-2.064 0,-0.432 -0.4,-0.912 -0.96,-0.912 -0.944,0 -0.944,1.152 -2.704,1.152 -1.36,0 -2.16,-0.896 -2.16,-2.128 l 5.28,0 z m -5.28,-1.344 c 0.256,-1.136 0.96,-1.856 2.128,-1.856 1.04,0 1.84,0.784 1.968,1.856 l -4.096,0 z" />
+ <path
+ id="path489"
+ style=""
+ d="m 83.260266,380.16062 c 0,-1.68 -1.552,-2.4 -3.792,-2.4 -2.4,0 -3.712,1.184 -3.712,2.112 0,0.48 0.4,0.896 0.992,0.896 0.928,0 0.976,-1.28 2.704,-1.28 0.784,0 1.472,0.288 1.472,0.96 0,0.672 -0.448,0.8 -1.008,0.864 l -1.424,0.16 c -1.792,0.208 -3.264,0.752 -3.264,2.688 0,1.472 1.312,2.384 2.64,2.384 1.232,0 2.288,-0.352 3.2,-1.36 0.032,0.72 0.368,1.36 1.376,1.36 0.56,0 1.056,-0.368 1.056,-0.896 0,-0.368 -0.24,-0.592 -0.24,-1.568 l 0,-3.92 z m -2.336,3.152 c 0,0.864 -0.784,1.696 -2.064,1.696 -0.8,0 -1.296,-0.432 -1.296,-0.96 0,-0.704 0.528,-1.008 1.504,-1.152 l 0.848,-0.128 c 0.272,-0.048 0.752,-0.128 1.008,-0.368 l 0,0.912 z" />
+ <path
+ id="path491"
+ style=""
+ d="m 17.757016,399.63261 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-3.12 2.912,0 c 2.544,0 4,-1.552 4,-3.648 0,-2.56 -1.776,-3.648 -3.984,-3.648 l -4.016,0 c -0.928,0 -1.536,0.368 -1.536,1.536 l 0,8.88 z m 2.624,-8.4 2.176,0 c 1.296,0 2.112,0.48 2.112,1.632 0,0.992 -0.784,1.632 -1.84,1.632 l -2.448,0 0,-3.264 z" />
+ <path
+ id="path493"
+ style=""
+ d="m 28.847016,399.77661 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-2.72 c 0,-1.936 0.512,-2.592 1.456,-2.592 l 0.416,0 c 0.576,0 1.152,-0.304 1.152,-1.168 0,-0.656 -0.544,-1.136 -1.28,-1.136 -1.136,0 -1.664,1.008 -1.936,1.984 l -0.032,0 0,-0.896 c 0,-0.704 -0.464,-1.088 -1.056,-1.088 -0.592,0 -1.056,0.384 -1.056,1.088 l 0,6.528 z" />
+ <path
+ id="path495"
+ style=""
+ d="m 37.015516,396.54461 c 0,-1.52 0.624,-2.656 1.984,-2.656 1.36,0 1.984,1.136 1.984,2.656 0,1.424 -0.592,2.672 -1.984,2.672 -1.392,0 -1.984,-1.248 -1.984,-2.672 z m -2.336,0 c 0,2.336 1.136,4.4 4.32,4.4 3.184,0 4.32,-2.064 4.32,-4.4 0,-2.464 -1.504,-4.384 -4.32,-4.384 -2.816,0 -4.32,1.92 -4.32,4.384 z" />
+ <path
+ id="path497"
+ style=""
+ d="m 44.940766,401.80861 c 0,0.224 -0.112,0.416 -0.336,0.416 l -0.256,0 c -0.496,0 -0.736,0.224 -0.736,0.816 0,0.672 0.384,1.008 1.28,1.008 1.744,0 2.384,-0.8 2.384,-2.48 l 0,-8.24 c 0,-0.624 -0.256,-1.168 -1.168,-1.168 -0.912,0 -1.168,0.544 -1.168,1.168 l 0,8.48 z m -0.048,-11.648 c 0,0.672 0.544,1.216 1.216,1.216 0.672,0 1.216,-0.544 1.216,-1.216 0,-0.672 -0.544,-1.216 -1.216,-1.216 -0.672,0 -1.216,0.544 -1.216,1.216 z" />
+ <path
+ id="path499"
+ style=""
+ d="m 56.514266,396.99261 c 0.784,0 1.024,-0.208 1.024,-1.008 0,-1.92 -1.536,-3.824 -4.224,-3.824 -2.768,0 -4.416,1.824 -4.416,4.544 0,2.032 1.232,4.24 4.496,4.24 1.408,0 3.664,-0.656 3.664,-2.064 0,-0.432 -0.4,-0.912 -0.96,-0.912 -0.944,0 -0.944,1.152 -2.704,1.152 -1.36,0 -2.16,-0.896 -2.16,-2.128 l 5.28,0 z m -5.28,-1.344 c 0.256,-1.136 0.96,-1.856 2.128,-1.856 1.04,0 1.84,0.784 1.968,1.856 l -4.096,0 z" />
+ <path
+ id="path501"
+ style=""
+ d="m 58.583516,396.72061 c 0,2.448 1.36,4.224 4.24,4.224 2.4,0 3.552,-1.408 3.552,-2.432 0,-0.464 -0.384,-0.896 -0.976,-0.896 -1.232,0 -0.88,1.504 -2.512,1.504 -1.28,0 -1.968,-0.944 -1.968,-2.4 0,-2.112 1.072,-2.736 1.984,-2.736 1.68,0 1.28,1.376 2.384,1.376 0.592,0 1.088,-0.336 1.088,-1.008 0,-1.088 -1.456,-2.192 -3.408,-2.192 -2.864,0 -4.384,1.872 -4.384,4.56 z" />
+ <path
+ id="path503"
+ style=""
+ d="m 68.233266,398.86461 c 0,1.376 0.704,2.08 2.4,2.08 1.12,0 1.696,-0.368 1.696,-1.04 0,-0.496 -0.304,-0.784 -0.816,-0.784 l -0.336,0 c -0.416,0 -0.608,-0.192 -0.608,-0.544 l 0,-4.672 0.704,0 c 0.688,0 1.056,-0.208 1.056,-0.768 0,-0.56 -0.368,-0.768 -1.056,-0.768 l -0.704,0 0,-1.424 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,1.424 -0.4,0 c -0.656,0 -0.928,0.256 -0.928,0.768 0,0.512 0.272,0.768 0.928,0.768 l 0.4,0 0,4.96 z" />
+ </g>
+ <path
+ id="path3005-2-1-8-2-7"
+ d="m 14.823881,434.34255 a 18.331858,18.331858 0 0 1 -5.2045132,-25.22269 18.331858,18.331858 0 0 1 25.1520382,-5.53591 18.331858,18.331858 0 0 1 5.866343,25.07703 18.331858,18.331858 0 0 1 -24.997676,6.19576"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.66637278;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ transform="matrix(0.54549827,0,0,0.54549827,171.36254,498.74687)" />
+ <g
+ id="flowRoot3808-4-1-8"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;line-height:89.99999762%;font-family:'Helvetica Rounded LT Std';-inkscape-font-specification:'Helvetica Rounded LT Std Bold';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(69.45294,353.63285)">
+ <path
+ id="path507"
+ style=""
+ d="m 68.372406,364.76862 c -0.832,-0.192 -1.792,-0.448 -1.792,-1.248 0,-0.8 0.672,-1.36 1.888,-1.36 2.448,0 2.224,1.712 3.44,1.712 0.64,0 1.2,-0.384 1.2,-1.04 0,-1.536 -2.416,-2.688 -4.464,-2.688 -2.224,0 -4.592,0.96 -4.592,3.52 0,1.232 0.432,2.544 2.816,3.152 l 2.96,0.752 c 0.896,0.224 1.12,0.736 1.12,1.2 0,0.768 -0.752,1.52 -2.112,1.52 -2.656,0 -2.288,-2.08 -3.712,-2.08 -0.64,0 -1.104,0.448 -1.104,1.088 0,1.248 1.488,2.912 4.816,2.912 3.168,0 4.736,-1.552 4.736,-3.632 0,-1.344 -0.608,-2.768 -3.008,-3.312 l -2.192,-0.496 z" />
+ <path
+ id="path509"
+ style=""
+ d="m 75.821156,370.06462 c 0,1.376 0.704,2.08 2.4,2.08 1.12,0 1.696,-0.368 1.696,-1.04 0,-0.496 -0.304,-0.784 -0.816,-0.784 l -0.336,0 c -0.416,0 -0.608,-0.192 -0.608,-0.544 l 0,-4.672 0.704,0 c 0.688,0 1.056,-0.208 1.056,-0.768 0,-0.56 -0.368,-0.768 -1.056,-0.768 l -0.704,0 0,-1.424 c 0,-0.768 -0.464,-1.168 -1.168,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,1.424 -0.4,0 c -0.656,0 -0.928,0.256 -0.928,0.768 0,0.512 0.272,0.768 0.928,0.768 l 0.4,0 0,4.96 z" />
+ <path
+ id="path511"
+ style=""
+ d="m 88.879406,365.76062 c 0,-1.68 -1.552,-2.4 -3.792,-2.4 -2.4,0 -3.712,1.184 -3.712,2.112 0,0.48 0.4,0.896 0.992,0.896 0.928,0 0.976,-1.28 2.704,-1.28 0.784,0 1.472,0.288 1.472,0.96 0,0.672 -0.448,0.8 -1.008,0.864 l -1.424,0.16 c -1.792,0.208 -3.264,0.752 -3.264,2.688 0,1.472 1.312,2.384 2.64,2.384 1.232,0 2.288,-0.352 3.2,-1.36 0.032,0.72 0.368,1.36 1.376,1.36 0.56,0 1.056,-0.368 1.056,-0.896 0,-0.368 -0.24,-0.592 -0.24,-1.568 l 0,-3.92 z m -2.336,3.152 c 0,0.864 -0.784,1.696 -2.064,1.696 -0.8,0 -1.296,-0.432 -1.296,-0.96 0,-0.704 0.528,-1.008 1.504,-1.152 l 0.848,-0.128 c 0.272,-0.048 0.752,-0.128 1.008,-0.368 l 0,0.912 z" />
+ <path
+ id="path513"
+ style=""
+ d="m 91.028656,370.97662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-2.72 c 0,-1.936 0.512,-2.592 1.456,-2.592 l 0.416,0 c 0.576,0 1.152,-0.304 1.152,-1.168 0,-0.656 -0.544,-1.136 -1.28,-1.136 -1.136,0 -1.664,1.008 -1.936,1.984 l -0.032,0 0,-0.896 c 0,-0.704 -0.464,-1.088 -1.056,-1.088 -0.592,0 -1.056,0.384 -1.056,1.088 l 0,6.528 z" />
+ <path
+ id="path515"
+ style=""
+ d="m 98.008656,370.06462 c 0,1.376 0.704,2.08 2.400004,2.08 1.12,0 1.696,-0.368 1.696,-1.04 0,-0.496 -0.304,-0.784 -0.816,-0.784 l -0.336,0 c -0.416,0 -0.608,-0.192 -0.608,-0.544 l 0,-4.672 0.704,0 c 0.688,0 1.056,-0.208 1.056,-0.768 0,-0.56 -0.368,-0.768 -1.056,-0.768 l -0.704,0 0,-1.424 c 0,-0.768 -0.464004,-1.168 -1.168004,-1.168 -0.704,0 -1.168,0.4 -1.168,1.168 l 0,1.424 -0.4,0 c -0.656,0 -0.928,0.256 -0.928,0.768 0,0.512 0.272,0.768 0.928,0.768 l 0.4,0 0,4.96 z" />
+ <path
+ id="path517"
+ style=""
+ d="m 65.282406,385.23262 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-3.84 4.768,0 0,3.84 c 0,0.784 0.512,1.312 1.312,1.312 0.8,0 1.312,-0.528 1.312,-1.312 l 0,-9.312 c 0,-0.784 -0.512,-1.312 -1.312,-1.312 -0.8,0 -1.312,0.528 -1.312,1.312 l 0,3.264 -4.768,0 0,-3.264 c 0,-0.784 -0.512,-1.312 -1.312,-1.312 -0.8,0 -1.312,0.528 -1.312,1.312 l 0,9.312 z" />
+ <path
+ id="path519"
+ style=""
+ d="m 84.695906,382.59262 c 0.784,0 1.024,-0.208 1.024,-1.008 0,-1.92 -1.536,-3.824 -4.224,-3.824 -2.768,0 -4.416,1.824 -4.416,4.544 0,2.032 1.232,4.24 4.496,4.24 1.408,0 3.664,-0.656 3.664,-2.064 0,-0.432 -0.4,-0.912 -0.96,-0.912 -0.944,0 -0.944,1.152 -2.704,1.152 -1.36,0 -2.16,-0.896 -2.16,-2.128 l 5.28,0 z m -5.28,-1.344 c 0.256,-1.136 0.96,-1.856 2.128,-1.856 1.04,0 1.84,0.784 1.968,1.856 l -4.096,0 z" />
+ <path
+ id="path521"
+ style=""
+ d="m 87.341156,385.37662 c 0,0.624 0.256,1.168 1.168,1.168 0.912,0 1.168,-0.544 1.168,-1.168 l 0,-2.72 c 0,-1.936 0.512,-2.592 1.456,-2.592 l 0.416,0 c 0.576,0 1.152,-0.304 1.152,-1.168 0,-0.656 -0.544,-1.136 -1.28,-1.136 -1.136,0 -1.664,1.008 -1.936,1.984 l -0.032,0 0,-0.896 c 0,-0.704 -0.464,-1.088 -1.056,-1.088 -0.592,0 -1.056,0.384 -1.056,1.088 l 0,6.528 z" />
+ <path
+ id="path523"
+ style=""
+ d="m 100.78966,382.59262 c 0.784,0 1.024,-0.208 1.024,-1.008 0,-1.92 -1.536,-3.824 -4.224004,-3.824 -2.768,0 -4.416,1.824 -4.416,4.544 0,2.032 1.232,4.24 4.496,4.24 1.408,0 3.664004,-0.656 3.664004,-2.064 0,-0.432 -0.4,-0.912 -0.96,-0.912 -0.944004,0 -0.944004,1.152 -2.704004,1.152 -1.36,0 -2.16,-0.896 -2.16,-2.128 l 5.280004,0 z m -5.280004,-1.344 c 0.256,-1.136 0.96,-1.856 2.128,-1.856 1.04,0 1.84,0.784 1.968,1.856 l -4.096,0 z" />
+ </g>
+ </g>
+</svg>
diff --git a/documentation/installing/img/sign-in-form.png b/documentation/installing/img/sign-in-form.png
index 3efd40dc2e..b22e040077 100644
--- a/documentation/installing/img/sign-in-form.png
+++ b/documentation/installing/img/sign-in-form.png
Binary files differ
diff --git a/documentation/installing/img/signin-via-website.png b/documentation/installing/img/signin-via-website.png
index e6ac32ba89..38a798c976 100644
--- a/documentation/installing/img/signin-via-website.png
+++ b/documentation/installing/img/signin-via-website.png
Binary files differ
diff --git a/documentation/installing/installing-eclipse.adoc b/documentation/installing/installing-eclipse.adoc
index 9a11fbc672..b68644a35d 100644
--- a/documentation/installing/installing-eclipse.adoc
+++ b/documentation/installing/installing-eclipse.adoc
@@ -133,13 +133,15 @@ in <<figure.getting-started.eclipse.notification-center.overview>>.
[[figure.getting-started.eclipse.notification-center.overview]]
.Overview of the notification center
-image::img/notification-center-overview.png[]
+image::img/notification-center-overview.png[scaledwidth=60%]
By clicking a notification in the list, you can open it up.
+ifdef::web[]
.Detailed view of a notification
-image::img/webinar-trainings-sneakpeek.png[]
+image::img/webinar-trainings-sneakpeek.png[scaledwidth=75%]
+endif::web[]
Clicking on the [guilabel]#Clear All# icon in the main pop-up clears all notifications and marks them all as read.
[[getting-started.eclipse.notification.signin]]
@@ -155,57 +157,56 @@ When you are not signed in, the top-most notification will be a
notification that asks you to sign in.
.The sign-in notification
-image::img/signin-icon.png[]
+image::img/signin-icon.png[scaledwidth=75%]
When you click the sign-in item, a dialog opens for signing in.
-.The sign-in dialog.
-image::img/sign-in-form.png[]
+.The sign-in dialog
+image::img/sign-in-form.png[scaledwidth=60%]
-You can then sign in with your Vaadin
-account. If you do not have one, you can sign in using a Google,
-Facebook, or Twitter account instead. First, click on the sign-in link. It opens a second dialog, as shown
+You can then sign in with your Vaadin account.
+
+If you do not have one, you can sign in using a Google, Facebook, or Twitter account instead.
+
+First, click on the sign-in link. It opens a second dialog, as shown
in <<figure.getting-started.eclipse.notification-center.complex-signin>>.
[[figure.getting-started.eclipse.notification-center.complex-signin]]
.Sign-in authentication dialog
-image::img/signin-via-website.png[]
+image::img/signin-via-website.png[scaledwidth=60%]
-By following the [url]#vaadin.com# link and logging in to the Vaadin website using your preferred
-account, you can then copy the authentication token from the resulting page.
-After that, you can paste the authorization token into the dialog and
-click [guibutton]#Submit# to log in.
+By following the [url]#vaadin.com# link and logging in to the Vaadin website using your preferred account, you can then copy the authentication token from the resulting page.
+After that, you can paste the authorization token into the dialog and click [guibutton]#Submit# to log in.
[[getting-started.eclipse.notification.settings]]
=== Notification Settings
You can open the settings by selecting "Eclipse... > Preferences".
+ifdef::web[]
.The settings pane
-image::img/preferences.png[]
+image::img/preferences.png[scaledwidth=100%]
+endif::web[]
The options are as follows:
-[guilabel]#Enable automatic widgetset compilation# :: Compiles the widgetset
-of Maven-based projects whenever there are changes and the project is rebuilt.
+[guilabel]#Enable automatic widgetset compilation#::
+Compiles the widgetset of Maven-based projects whenever there are changes and the project is rebuilt.
-[guilabel]#Enable Vaadin pre-release archetypes# :: Adds pre-release
-(alpha/beta) archetypes to the archetype selection list when creating a new
-Vaadin project.
+[guilabel]#Enable Vaadin pre-release archetypes#::
+Adds pre-release (alpha/beta) archetypes to the archetype selection list when creating a new Vaadin project.
[guilabel]#Enable# :: Disabling this disables all notifications.
-[guilabel]#Show popups# :: Disabling this stops
-pop-ups from appearing. The notifications can still be viewed by opening
-the notification center window.
+[guilabel]#Show popups# ::
+Disabling this stops pop-ups from appearing.
+The notifications can still be viewed by opening the notification center window.
[guilabel]#Check for new Vaadin versions# ::
-Polls for new Vaadin versions once every 24h and gives a notification if there
-are new versions available.
-
-[guilabel]#Check for new notifications from vaadin.com# :: Polls the Vaadin site
-for notifications once every 4 hours.
+Polls for new Vaadin versions once every 24h and gives a notification if there are new versions available.
+[guilabel]#Check for new notifications from vaadin.com#::
+Polls the Vaadin site for notifications once every 4 hours.
[[installing.eclipse.update]]
== Updating the Plugins
diff --git a/documentation/installing/installing-idea.asciidoc b/documentation/installing/installing-idea.asciidoc
index 95779dab55..3533a3feb1 100644
--- a/documentation/installing/installing-idea.asciidoc
+++ b/documentation/installing/installing-idea.asciidoc
@@ -43,12 +43,12 @@ A WebSocket-enabled server, such as Glassfish or TomEE, is required for server p
. In the Tomcat Server dialog, specify the home directory for the server.
+
-image::img/idea-server-1.png[]
+image::img/idea-server-1.png[scaledwidth=80%]
+
Click [guibutton]#OK#.
. Review the application server settings page to check that it is OK.
+
-image::img/idea-server-2.png[]
+image::img/idea-server-2.png[scaledwidth=100%]
+
Then, click [guibutton]#OK#.
diff --git a/documentation/installing/installing-netbeans.asciidoc b/documentation/installing/installing-netbeans.asciidoc
index 35d7b96c16..bee2d02979 100644
--- a/documentation/installing/installing-netbeans.asciidoc
+++ b/documentation/installing/installing-netbeans.asciidoc
@@ -12,7 +12,7 @@ The Vaadin Plug-in for NetBeans supports creating Vaadin projects, updating Vaad
It also allows directly downloading Vaadin add-ons from the Vaadin Directory.
.Installation of the NetBeans IDE toolchain
-image::img/installation-netbeans-hi.png[width=60%]
+image::img/installation-netbeans-hi.png[width=80%, scaledwidth=80%]
The installation bundle includes a web server, so you do not need that.
diff --git a/documentation/installing/installing-other.adoc b/documentation/installing/installing-other.adoc
index b7ff51dfea..4101509673 100644
--- a/documentation/installing/installing-other.adoc
+++ b/documentation/installing/installing-other.adoc
@@ -29,7 +29,7 @@ toolbar. <<figure.firebug.calc>> shows Firebug in action.
[[figure.firebug.calc]]
.Firebug Debugger for Firefox
-image::img/firebug.png[]
+image::img/firebug.png[scaledwidth=100%]
The most important feature in Firebug is inspecting HTML elements. Right-click
on an element and select [guilabel]#Inspect Element with Firebug# to inspect it.
diff --git a/documentation/installing/installing-overview.adoc b/documentation/installing/installing-overview.adoc
index 7075c10172..3b2a60f767 100644
--- a/documentation/installing/installing-overview.adoc
+++ b/documentation/installing/installing-overview.adoc
@@ -13,7 +13,7 @@ You can use Vaadin with any Java IDE or no IDE at all.
Vaadin has special support for the Eclipse and NetBeans IDEs, as well as for IntelliJ IDEA.
.Vaadin installation steps
-image::img/installation-steps-hi.png[]
+image::img/installation-steps.svg[scaledwidth=100%]
Managing Vaadin and other Java libraries can get tedious to do manually, so using a build system that manages dependencies automatically is adviced.
Vaadin is distributed in the Maven central repository, and can be used with any build or dependency management system that can access Maven repositories, such as Ivy or Gradle, in addition to Maven.
diff --git a/documentation/installing/installing-toolchain.adoc b/documentation/installing/installing-toolchain.adoc
index 08ad190a8d..414bc8033f 100644
--- a/documentation/installing/installing-toolchain.adoc
+++ b/documentation/installing/installing-toolchain.adoc
@@ -28,7 +28,7 @@ your entire toolchain supports it.
[[figure.toolchain]]
.Development Toolchain and Process
-image::img/toolchain-hi.png[width=70%]
+image::img/toolchain-hi.png[width=70%, scaledwidth=100%]
<<figure.toolchain>> illustrates the development toolchain. You develop your
application as an Eclipse project. The project must include, in addition to your
diff --git a/documentation/installing/original-drawings/installation-steps-constellation.svg b/documentation/installing/original-drawings/installation-steps-constellation.svg
index 7716b64f6c..a59a3edb80 100644
--- a/documentation/installing/original-drawings/installation-steps-constellation.svg
+++ b/documentation/installing/original-drawings/installation-steps-constellation.svg
@@ -14,9 +14,12 @@
height="744.09448"
id="svg1901"
sodipodi:version="0.32"
- inkscape:version="0.48.3.1 r9886"
- sodipodi:docname="steps-constellation-2.svg"
- version="1.1">
+ inkscape:version="0.91 r"
+ sodipodi:docname="installation-steps-constellation.svg"
+ version="1.1"
+ inkscape:export-filename="/home/magi/itmill/vaadin/documentation/installing/original-drawings/installation-steps-constellation.png"
+ inkscape:export-xdpi="183"
+ inkscape:export-ydpi="183">
<defs
id="defs1903">
<g
@@ -5877,14 +5880,14 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="2.2743067"
- inkscape:cx="596.69243"
- inkscape:cy="336.80876"
+ inkscape:zoom="1.1371534"
+ inkscape:cx="438.05434"
+ inkscape:cy="283.40355"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="1920"
inkscape:window-height="1060"
- inkscape:window-x="-3"
+ inkscape:window-x="-2"
inkscape:window-y="-3"
showgrid="true"
inkscape:window-maximized="1"
@@ -5912,7 +5915,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
+ <dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -5921,18 +5924,6 @@
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-308.2677)">
- <g
- id="surface0"
- transform="matrix(2.4204743,0,0,2.4204743,-57.788206,141.01257)"
- style="opacity:0">
- <use
- id="use15470"
- xlink:href="#surface1"
- x="0"
- y="0"
- width="1"
- height="1" />
- </g>
<path
style="fill:none;stroke:#acacac;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 458.93578,684.66906 -23.94945,18.58377"
@@ -5986,7 +5977,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="14.258381"
sodipodi:ry="14.258381"
- d="m 17.085091,430.95432 a 14.258381,14.258381 0 1 1 0.03124,0.0208"
+ d="m 17.085091,430.95432 a 14.258381,14.258381 0 0 1 -3.950129,-19.76694 14.258381,14.258381 0 0 1 19.764334,-3.96314 14.258381,14.258381 0 0 1 3.976137,19.76173 14.258381,14.258381 0 0 1 -19.759102,3.98913"
transform="matrix(0.54549827,0,0,0.54549827,426.83523,443.91326)"
sodipodi:start="2.1592864"
sodipodi:end="8.4398399"
@@ -6047,7 +6038,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="14.258381"
sodipodi:ry="14.258381"
- d="m 17.085091,430.95432 c -6.550005,-4.37129 -8.3162076,-13.22474 -3.944924,-19.77475 4.371283,-6.55 13.224737,-8.3162 19.774742,-3.94492 6.550005,4.37128 8.316208,13.22474 3.944924,19.77474 -4.370182,6.54836 -13.220603,8.31559 -19.770514,3.94775 L 25,419.09448 z"
+ d="m 17.085091,430.95432 a 14.258381,14.258381 0 0 1 -3.945629,-19.77369 14.258381,14.258381 0 0 1 19.773333,-3.94739 14.258381,14.258381 0 0 1 3.949153,19.77298 14.258381,14.258381 0 0 1 -19.772629,3.95092 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,445.27941,456.04902)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6062,7 +6053,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="9.9760981"
sodipodi:ry="9.9760981"
- d="m 19.462211,427.3924 c -4.582813,-3.05844 -5.818564,-9.25289 -2.760128,-13.83571 3.058437,-4.58281 9.252893,-5.81856 13.835706,-2.76012 4.582813,3.05843 5.818564,9.25289 2.760128,13.8357 -3.057666,4.58166 -9.250001,5.81814 -13.832748,2.7621 L 25,419.09448 z"
+ d="m 19.462211,427.3924 a 9.9760981,9.9760981 0 0 1 -2.760621,-13.83497 9.9760981,9.9760981 0 0 1 13.83472,-2.76185 9.9760981,9.9760981 0 0 1 2.763087,13.83447 9.9760981,9.9760981 0 0 1 -13.834228,2.76432 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,521.47235,449.18471)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6086,7 +6077,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="16.573128"
sodipodi:ry="16.573128"
- d="M 15.800162,432.87968 C 8.1868101,427.79874 6.1338769,417.508 11.214807,409.89464 c 5.080931,-7.61335 15.371679,-9.66628 22.985031,-4.58535 7.613352,5.08093 9.666285,15.37168 4.585355,22.98503 -5.07965,7.61143 -15.366874,9.66557 -22.980117,4.58863 L 25,419.09448 z"
+ d="m 15.800162,432.87968 a 16.573128,16.573128 0 0 1 -4.586174,-22.98381 16.573128,16.573128 0 0 1 22.983393,-4.58822 16.573128,16.573128 0 0 1 4.59027,22.98299 16.573128,16.573128 0 0 1 -22.982575,4.59231 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,569.95275,535.48029)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6110,7 +6101,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="16.45739"
sodipodi:ry="16.45739"
- d="m 15.864409,432.78341 c -7.5601846,-5.04545 -9.5987812,-15.26433 -4.553333,-22.82452 5.045447,-7.56018 15.264331,-9.59878 22.824515,-4.55333 7.560185,5.04545 9.598781,15.26433 4.553333,22.82451 -5.044176,7.55828 -15.25956,9.59807 -22.819636,4.55659 L 25,419.09448 z"
+ d="m 15.864409,432.78341 a 16.45739,16.45739 0 0 1 -4.554147,-22.8233 16.45739,16.45739 0 0 1 22.82289,-4.55618 16.45739,16.45739 0 0 1 4.558214,22.82248 16.45739,16.45739 0 0 1 -22.822078,4.56025 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,650.04587,468.90306)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6125,7 +6116,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="6.6197143"
sodipodi:ry="6.6197143"
- d="m 21.325359,424.60063 c -3.04096,-2.02945 -3.860952,-6.13983 -1.831504,-9.18079 2.029449,-3.04096 6.139827,-3.86095 9.180786,-1.8315 3.04096,2.02945 3.860952,6.13982 1.831504,9.18078 -2.028937,3.0402 -6.137907,3.86067 -9.178824,1.83282 L 25,419.09448 z"
+ d="m 21.325359,424.60063 a 6.6197143,6.6197143 0 0 1 -1.831831,-9.1803 6.6197143,6.6197143 0 0 1 9.180132,-1.83265 6.6197143,6.6197143 0 0 1 1.833467,9.17997 6.6197143,6.6197143 0 0 1 -9.179806,1.83429 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,693.69477,532.83762)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6140,7 +6131,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="11.133471"
sodipodi:ry="11.133471"
- d="m 18.819747,428.35508 c -5.114486,-3.41326 -6.493602,-10.32636 -3.080343,-15.44085 3.41326,-5.11449 10.326363,-6.4936 15.440849,-3.08034 5.114486,3.41326 6.493602,10.32636 3.080343,15.44085 -3.4124,5.11319 -10.323136,6.49312 -15.437548,3.08254 L 25,419.09448 z"
+ d="m 18.819747,428.35508 a 11.133471,11.133471 0 0 1 -3.080893,-15.44003 11.133471,11.133471 0 0 1 15.439749,-3.08226 11.133471,11.133471 0 0 1 3.083645,15.43947 11.133471,11.133471 0 0 1 -15.4392,3.08502 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,543.84048,509.96824)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6155,7 +6146,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="9.1659365"
sodipodi:ry="9.1659365"
- d="m 19.911936,426.71852 c -4.210641,-2.81006 -5.346037,-8.50146 -2.535977,-12.7121 2.81006,-4.21064 8.501463,-5.34604 12.712105,-2.53598 4.210641,2.81006 5.346037,8.50146 2.535977,12.71211 -2.809352,4.20958 -8.498806,5.34564 -12.709387,2.53779 L 25,419.09448 z"
+ d="m 19.911936,426.71852 a 9.1659365,9.1659365 0 0 1 -2.53643,-12.71142 9.1659365,9.1659365 0 0 1 12.711199,-2.53756 9.1659365,9.1659365 0 0 1 2.538696,12.71097 9.1659365,9.1659365 0 0 1 -12.710747,2.53983 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,558.10888,564.13766)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6170,7 +6161,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="10.148001"
sodipodi:ry="10.148001"
- d="m 19.366787,427.53538 c -4.661782,-3.11113 -5.918827,-9.41233 -2.807689,-14.07411 3.111138,-4.66178 9.412334,-5.91883 14.074115,-2.80769 4.661782,3.11114 5.918827,9.41233 2.807689,14.07412 -3.110354,4.6606 -9.409392,5.91838 -14.071107,2.80969 L 25,419.09448 z"
+ d="m 19.366787,427.53538 a 10.148001,10.148001 0 0 1 -2.808191,-14.07336 10.148001,10.148001 0 0 1 14.073113,-2.80944 10.148001,10.148001 0 0 1 2.810698,14.07286 10.148001,10.148001 0 0 1 -14.072612,2.81195 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,585.22254,590.25297)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6185,7 +6176,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="7.0381308"
sodipodi:ry="7.0381308"
- d="m 21.093093,424.94866 c -3.233171,-2.15773 -4.104993,-6.52791 -1.947268,-9.76108 2.157725,-3.23318 6.52791,-4.105 9.761082,-1.94727 3.233171,2.15772 4.104993,6.52791 1.947268,9.76108 -2.157181,3.23236 -6.52587,4.10469 -9.758995,1.94866 L 25,419.09448 z"
+ d="m 21.093093,424.94866 a 7.0381308,7.0381308 0 0 1 -1.947616,-9.76056 7.0381308,7.0381308 0 0 1 9.760386,-1.94849 7.0381308,7.0381308 0 0 1 1.949356,9.76021 7.0381308,7.0381308 0 0 1 -9.760039,1.95023 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,600.04322,575.49375)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6200,7 +6191,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="7.0545816"
sodipodi:ry="7.0545816"
- d="m 21.083961,424.96234 a 7.0545816,7.0545816 0 1 1 0.0021,0.001 L 25,419.09448 z"
+ d="m 21.083961,424.96234 a 7.0545816,7.0545816 0 0 1 -1.952168,-9.78337 7.0545816,7.0545816 0 0 1 9.7832,-1.95304 7.0545816,7.0545816 0 0 1 1.953912,9.78302 7.0545816,7.0545816 0 0 1 -9.782852,1.95479 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,457.00359,499.62701)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6215,7 +6206,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="6.0560665"
sodipodi:ry="6.0560665"
- d="m 21.638243,424.1318 a 6.0560665,6.0560665 0 1 1 0.0018,0.001 L 25,419.09448 z"
+ d="m 21.638243,424.1318 a 6.0560665,6.0560665 0 0 1 -1.675856,-8.39863 6.0560665,6.0560665 0 0 1 8.398472,-1.6766 6.0560665,6.0560665 0 0 1 1.677353,8.39832 6.0560665,6.0560665 0 0 1 -8.398174,1.6781 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,534.87537,373.72391)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6230,7 +6221,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="7.0381308"
sodipodi:ry="7.0381308"
- d="m 21.093093,424.94866 a 7.0381308,7.0381308 0 1 1 0.0021,0.001 L 25,419.09448 z"
+ d="m 21.093093,424.94866 a 7.0381308,7.0381308 0 0 1 -1.947616,-9.76056 7.0381308,7.0381308 0 0 1 9.760386,-1.94849 7.0381308,7.0381308 0 0 1 1.949356,9.76021 7.0381308,7.0381308 0 0 1 -9.760039,1.95023 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,421.34887,474.63751)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6245,7 +6236,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="7.3141384"
sodipodi:ry="7.3141384"
- d="m 20.93988,425.17823 a 7.3141384,7.3141384 0 1 1 0.0022,0.001 L 25,419.09448 z"
+ d="m 20.93988,425.17823 a 7.3141384,7.3141384 0 0 1 -2.023994,-10.14333 7.3141384,7.3141384 0 0 1 10.14315,-2.02489 7.3141384,7.3141384 0 0 1 2.025802,10.14297 7.3141384,7.3141384 0 0 1 -10.14279,2.0267 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,405.3085,269.06738)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6260,7 +6251,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="6.8368459"
sodipodi:ry="6.8368459"
- d="m 21.204828,424.78123 a 6.8368459,6.8368459 0 1 1 0.002,0.001 L 25,419.09448 z"
+ d="m 21.204828,424.78123 a 6.8368459,6.8368459 0 0 1 -1.891916,-9.48141 6.8368459,6.8368459 0 0 1 9.481247,-1.89276 6.8368459,6.8368459 0 0 1 1.893606,9.48107 6.8368459,6.8368459 0 0 1 -9.48091,1.89445 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,461.6318,289.90142)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6275,7 +6266,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="9.1659365"
sodipodi:ry="9.1659365"
- d="m 19.911936,426.71852 a 9.1659365,9.1659365 0 1 1 0.0027,0.002 L 25,419.09448 z"
+ d="m 19.911936,426.71852 a 9.1659365,9.1659365 0 0 1 -2.53643,-12.71142 9.1659365,9.1659365 0 0 1 12.711199,-2.53756 9.1659365,9.1659365 0 0 1 2.538696,12.71097 9.1659365,9.1659365 0 0 1 -12.710747,2.53983 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,334.64672,276.96229)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6290,7 +6281,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="14.142643"
sodipodi:ry="14.142643"
- d="m 17.149338,430.85805 c -6.496838,-4.3358 -8.2487037,-13.11739 -3.912903,-19.61423 4.335801,-6.49684 13.11739,-8.2487 19.614227,-3.9129 6.496838,4.3358 8.248704,13.11739 3.912903,19.61422 -4.216961,6.31877 -12.672539,8.17737 -19.150591,4.20945"
+ d="m 17.149338,430.85805 a 14.142643,14.142643 0 0 1 -3.988727,-19.49941 14.142643,14.142643 0 0 1 19.459676,-4.17825 14.142643,14.142643 0 0 1 4.36738,19.4181 14.142643,14.142643 0 0 1 -19.374693,4.5561"
transform="matrix(0.54549827,0,0,0.54549827,521.47235,449.18471)"
sodipodi:start="2.1592864"
sodipodi:end="8.4035543"
@@ -6306,7 +6297,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="7.5456133"
sodipodi:ry="7.5456133"
- d="m 20.811387,425.37077 c -3.466299,-2.31331 -4.400983,-6.9986 -2.087676,-10.4649 2.313307,-3.4663 6.998604,-4.40098 10.464902,-2.08768 3.466299,2.31331 4.400983,6.99861 2.087676,10.46491 -2.312725,3.46542 -6.996416,4.40065 -10.462665,2.08916 L 25,419.09448 z"
+ d="m 20.811387,425.37077 a 7.5456133,7.5456133 0 0 1 -2.088049,-10.46434 7.5456133,7.5456133 0 0 1 10.464157,-2.08898 7.5456133,7.5456133 0 0 1 2.089913,10.46397 7.5456133,7.5456133 0 0 1 -10.463784,2.09084 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,530.58222,440.52024)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6660,7 +6651,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="14.258381"
sodipodi:ry="14.258381"
- d="m 17.085091,430.95432 a 14.258381,14.258381 0 1 1 0.03124,0.0208"
+ d="m 17.085091,430.95432 a 14.258381,14.258381 0 0 1 -3.950129,-19.76694 14.258381,14.258381 0 0 1 19.764334,-3.96314 14.258381,14.258381 0 0 1 3.976137,19.76173 14.258381,14.258381 0 0 1 -19.759102,3.98913"
transform="matrix(0.54549827,0,0,0.54549827,748.55255,386.93313)"
sodipodi:start="2.1592864"
sodipodi:end="8.4398399"
@@ -6706,7 +6697,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="11.457419"
sodipodi:ry="11.457419"
- d="M 18.639921,428.62453 C 13.37662,425.11196 11.957375,417.9977 15.46995,412.7344 c 3.512575,-5.2633 10.626828,-6.68254 15.890129,-3.16997 5.263301,3.51258 6.682546,10.62683 3.169971,15.89013 -3.51169,5.26198 -10.623506,6.68205 -15.886732,3.17224 L 25,419.09448 z"
+ d="m 18.639921,428.62453 a 11.457419,11.457419 0 0 1 -3.170538,-15.88928 11.457419,11.457419 0 0 1 15.888998,-3.17195 11.457419,11.457419 0 0 1 3.173369,15.88871 11.457419,11.457419 0 0 1 -15.888432,3.17479 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,386.28035,373.45979)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6721,7 +6712,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="8.0366459"
sodipodi:ry="8.0366459"
- d="m 20.538812,425.7792 a 8.0366459,8.0366459 0 1 1 0.0024,0.002 L 25,419.09448 z"
+ d="m 20.538812,425.7792 a 8.0366459,8.0366459 0 0 1 -2.223929,-11.14531 8.0366459,8.0366459 0 0 1 11.145114,-2.22492 8.0366459,8.0366459 0 0 1 2.225915,11.14491 8.0366459,8.0366459 0 0 1 -11.144717,2.22691 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,479.22751,566.24206)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6736,7 +6727,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="6.2361951"
sodipodi:ry="6.2361951"
- d="m 21.538252,424.28162 a 6.2361951,6.2361951 0 1 1 0.0018,0.001 L 25,419.09448 z"
+ d="m 21.538252,424.28162 a 6.2361951,6.2361951 0 0 1 -1.725702,-8.64842 6.2361951,6.2361951 0 0 1 8.648273,-1.72648 6.2361951,6.2361951 0 0 1 1.727243,8.64812 6.2361951,6.2361951 0 0 1 -8.647965,1.72802 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,487.83627,571.33356)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6751,7 +6742,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="8.0366459"
sodipodi:ry="8.0366459"
- d="m 20.538812,425.7792 a 8.0366459,8.0366459 0 1 1 0.0024,0.002 L 25,419.09448 z"
+ d="m 20.538812,425.7792 a 8.0366459,8.0366459 0 0 1 -2.223929,-11.14531 8.0366459,8.0366459 0 0 1 11.145114,-2.22492 8.0366459,8.0366459 0 0 1 2.225915,11.14491 8.0366459,8.0366459 0 0 1 -11.144717,2.22691 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,577.80511,399.02132)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6766,7 +6757,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="7.4637752"
sodipodi:ry="7.4637752"
- d="m 20.856816,425.3027 a 7.4637752,7.4637752 0 1 1 0.0022,0.001 L 25,419.09448 z"
+ d="m 20.856816,425.3027 a 7.4637752,7.4637752 0 0 1 -2.065403,-10.35085 7.4637752,7.4637752 0 0 1 10.350665,-2.06632 7.4637752,7.4637752 0 0 1 2.067247,10.35048 7.4637752,7.4637752 0 0 1 -10.350296,2.06817 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,521.99238,481.6531)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6781,7 +6772,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,486.60346,375.03871)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6796,7 +6787,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,486.95467,357.60974)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6811,7 +6802,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,636.67061,362.9471)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6826,7 +6817,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,649.86144,401.20052)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6841,7 +6832,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,601.05536,420.10738)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6856,7 +6847,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,620.40192,422.30585)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6871,7 +6862,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,650.30114,420.54707)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6886,7 +6877,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,661.73319,422.30585)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6901,7 +6892,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,718.01408,489.5791)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6916,7 +6907,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,661.73319,482.54399)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6931,7 +6922,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,594.89964,567.40501)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6946,7 +6937,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,421.22034,494.41574)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6961,7 +6952,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.4486704"
sodipodi:ry="5.4486704"
- d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 21.975412,423.62658 a 5.4486704,5.4486704 0 0 1 -1.507775,-7.55628 5.4486704,5.4486704 0 0 1 7.556143,-1.50845 5.4486704,5.4486704 0 0 1 1.509122,7.55601 5.4486704,5.4486704 0 0 1 -7.555875,1.50979 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,406.27073,500.57146)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6976,7 +6967,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7433839"
sodipodi:ry="4.7433839"
- d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 1 1 0.0014,9.4e-4 L 25,419.09448 z"
+ d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 0 1 -1.312605,-6.57818 4.7433839,4.7433839 0 0 1 6.578061,-1.31319 4.7433839,4.7433839 0 0 1 1.313779,6.57795 4.7433839,4.7433839 0 0 1 -6.577828,1.31436 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,516.11611,330.06144)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -6991,7 +6982,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7433839"
sodipodi:ry="4.7433839"
- d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 1 1 0.0014,9.4e-4 L 25,419.09448 z"
+ d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 0 1 -1.312605,-6.57818 4.7433839,4.7433839 0 0 1 6.578061,-1.31319 4.7433839,4.7433839 0 0 1 1.313779,6.57795 4.7433839,4.7433839 0 0 1 -6.577828,1.31436 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,551.42485,333.21276)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7006,7 +6997,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7433839"
sodipodi:ry="4.7433839"
- d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 1 1 0.0014,9.4e-4 L 25,419.09448 z"
+ d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 0 1 -1.312605,-6.57818 4.7433839,4.7433839 0 0 1 6.578061,-1.31319 4.7433839,4.7433839 0 0 1 1.313779,6.57795 4.7433839,4.7433839 0 0 1 -6.577828,1.31436 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,635.38908,321.93665)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7021,7 +7012,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7433839"
sodipodi:ry="4.7433839"
- d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 1 1 0.0014,9.4e-4 L 25,419.09448 z"
+ d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 0 1 -1.312605,-6.57818 4.7433839,4.7433839 0 0 1 6.578061,-1.31319 4.7433839,4.7433839 0 0 1 1.313779,6.57795 4.7433839,4.7433839 0 0 1 -6.577828,1.31436 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,626.06175,300.4838)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7036,7 +7027,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7433839"
sodipodi:ry="4.7433839"
- d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 1 1 0.0014,9.4e-4 L 25,419.09448 z"
+ d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 0 1 -1.312605,-6.57818 4.7433839,4.7433839 0 0 1 6.578061,-1.31319 4.7433839,4.7433839 0 0 1 1.313779,6.57795 4.7433839,4.7433839 0 0 1 -6.577828,1.31436 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,664.3038,299.24015)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7051,7 +7042,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7433839"
sodipodi:ry="4.7433839"
- d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 1 1 0.0014,9.4e-4 L 25,419.09448 z"
+ d="m 22.36692,423.03993 a 4.7433839,4.7433839 0 0 1 -1.312605,-6.57818 4.7433839,4.7433839 0 0 1 6.578061,-1.31319 4.7433839,4.7433839 0 0 1 1.313779,6.57795 4.7433839,4.7433839 0 0 1 -6.577828,1.31436 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,685.91639,393.50586)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7066,7 +7057,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.3479152"
sodipodi:ry="5.3479152"
- d="m 22.031342,423.54277 a 5.3479152,5.3479152 0 1 1 0.0016,0.001 L 25,419.09448 z"
+ d="m 22.031342,423.54277 a 5.3479152,5.3479152 0 0 1 -1.479894,-7.41655 5.3479152,5.3479152 0 0 1 7.416418,-1.48055 5.3479152,5.3479152 0 0 1 1.481215,7.41628 5.3479152,5.3479152 0 0 1 -7.416154,1.48188 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,355.92571,551.57601)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7081,7 +7072,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.8441391"
sodipodi:ry="4.8441391"
- d="m 22.310991,423.12374 a 4.8441391,4.8441391 0 1 1 0.0014,9.6e-4 L 25,419.09448 z"
+ d="m 22.310991,423.12374 a 4.8441391,4.8441391 0 0 1 -1.340488,-6.71791 4.8441391,4.8441391 0 0 1 6.717788,-1.34108 4.8441391,4.8441391 0 0 1 1.341685,6.71766 4.8441391,4.8441391 0 0 1 -6.717549,1.34229 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,489.15313,501.01115)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7096,7 +7087,7 @@
sodipodi:cy="505.69778"
sodipodi:rx="4.0302472"
sodipodi:ry="4.2794442"
- d="m 598.09317,509.25734 a 4.0302472,4.2794442 0 1 1 0.0789,0.0545"
+ d="m 598.09317,509.25734 a 4.0302472,4.2794442 0 0 1 -1.12807,-5.91428 4.0302472,4.2794442 0 0 1 5.56321,-1.23232 4.0302472,4.2794442 0 0 1 1.19301,5.89989 4.0302472,4.2794442 0 0 1 -5.54927,1.3012"
transform="translate(0.7145034,307.7181)"
sodipodi:start="2.1592864"
sodipodi:end="8.4191227"
@@ -7112,7 +7103,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.0456495"
sodipodi:ry="5.0456495"
- d="m 22.199131,423.29135 a 5.0456495,5.0456495 0 1 1 0.0015,10e-4 L 25,419.09448 z"
+ d="m 22.199131,423.29135 a 5.0456495,5.0456495 0 0 1 -1.39625,-6.99736 5.0456495,5.0456495 0 0 1 6.99724,-1.39688 5.0456495,5.0456495 0 0 1 1.397497,6.99712 5.0456495,5.0456495 0 0 1 -6.996991,1.39812 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,503.60808,441.59744)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7127,7 +7118,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="5.0456495"
sodipodi:ry="5.0456495"
- d="m 22.199131,423.29135 a 5.0456495,5.0456495 0 1 1 0.0015,10e-4 L 25,419.09448 z"
+ d="m 22.199131,423.29135 a 5.0456495,5.0456495 0 0 1 -1.39625,-6.99736 5.0456495,5.0456495 0 0 1 6.99724,-1.39688 5.0456495,5.0456495 0 0 1 1.397497,6.99712 5.0456495,5.0456495 0 0 1 -6.996991,1.39812 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,502.07547,430.88932)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7142,7 +7133,7 @@
sodipodi:cy="505.69778"
sodipodi:rx="4.0302472"
sodipodi:ry="4.2794442"
- d="m 598.09317,509.25734 a 4.0302472,4.2794442 0 1 1 0.0789,0.0545"
+ d="m 598.09317,509.25734 a 4.0302472,4.2794442 0 0 1 -1.12807,-5.91428 4.0302472,4.2794442 0 0 1 5.56321,-1.23232 4.0302472,4.2794442 0 0 1 1.19301,5.89989 4.0302472,4.2794442 0 0 1 -5.54927,1.3012"
transform="translate(-60.10543,208.90573)"
sodipodi:start="2.1592864"
sodipodi:end="8.4191227"
@@ -7158,7 +7149,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="6.8735647"
sodipodi:ry="6.8735647"
- d="m 21.184445,424.81177 a 6.8735647,6.8735647 0 1 1 0.002,0.001 L 25,419.09448 z"
+ d="m 21.184445,424.81177 a 6.8735647,6.8735647 0 0 1 -1.902077,-9.53233 6.8735647,6.8735647 0 0 1 9.532168,-1.90293 6.8735647,6.8735647 0 0 1 1.903776,9.532 6.8735647,6.8735647 0 0 1 -9.531829,1.90462 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,711.09589,465.11113)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7173,7 +7164,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7362232"
sodipodi:ry="4.7362232"
- d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 1 1 0.0014,9.3e-4 L 25,419.09448 z"
+ d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 0 1 -1.310624,-6.56825 4.7362232,4.7362232 0 0 1 6.568132,-1.31121 4.7362232,4.7362232 0 0 1 1.311794,6.56801 4.7362232,4.7362232 0 0 1 -6.567897,1.31238 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,402.31127,372.70812)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7188,7 +7179,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7362232"
sodipodi:ry="4.7362232"
- d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 1 1 0.0014,9.3e-4 L 25,419.09448 z"
+ d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 0 1 -1.310624,-6.56825 4.7362232,4.7362232 0 0 1 6.568132,-1.31121 4.7362232,4.7362232 0 0 1 1.311794,6.56801 4.7362232,4.7362232 0 0 1 -6.567897,1.31238 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,370.18207,354.27138)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7203,7 +7194,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="6.7310748"
sodipodi:ry="6.7310748"
- d="m 21.263542,424.69325 a 6.7310748,6.7310748 0 1 1 0.002,0.001 L 25,419.09448 z"
+ d="m 21.263542,424.69325 a 6.7310748,6.7310748 0 0 1 -1.862647,-9.33473 6.7310748,6.7310748 0 0 1 9.334565,-1.86348 6.7310748,6.7310748 0 0 1 1.864311,9.3344 6.7310748,6.7310748 0 0 1 -9.334234,1.86515 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,379.35394,351.31773)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7218,7 +7209,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7362232"
sodipodi:ry="4.7362232"
- d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 1 1 0.0014,9.3e-4 L 25,419.09448 z"
+ d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 0 1 -1.310624,-6.56825 4.7362232,4.7362232 0 0 1 6.568132,-1.31121 4.7362232,4.7362232 0 0 1 1.311794,6.56801 4.7362232,4.7362232 0 0 1 -6.567897,1.31238 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,373.29118,344.16678)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7233,7 +7224,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7362232"
sodipodi:ry="4.7362232"
- d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 1 1 0.0014,9.3e-4 L 25,419.09448 z"
+ d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 0 1 -1.310624,-6.56825 4.7362232,4.7362232 0 0 1 6.568132,-1.31121 4.7362232,4.7362232 0 0 1 1.311794,6.56801 4.7362232,4.7362232 0 0 1 -6.567897,1.31238 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,429.72151,287.42554)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
@@ -7248,7 +7239,7 @@
sodipodi:cy="419.09448"
sodipodi:rx="4.7362232"
sodipodi:ry="4.7362232"
- d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 1 1 0.0014,9.3e-4 L 25,419.09448 z"
+ d="m 22.370895,423.03398 a 4.7362232,4.7362232 0 0 1 -1.310624,-6.56825 4.7362232,4.7362232 0 0 1 6.568132,-1.31121 4.7362232,4.7362232 0 0 1 1.311794,6.56801 4.7362232,4.7362232 0 0 1 -6.567897,1.31238 L 25,419.09448 Z"
transform="matrix(0.54549827,0,0,0.54549827,492.83642,279.03094)"
sodipodi:start="2.1592864"
sodipodi:end="8.4421153"
diff --git a/documentation/installing/original-drawings/installation-steps.svg b/documentation/installing/original-drawings/installation-steps.svg
index 2af7752bd3..713f4d5877 100644
--- a/documentation/installing/original-drawings/installation-steps.svg
+++ b/documentation/installing/original-drawings/installation-steps.svg
@@ -9,15 +9,28 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="1052.3622"
- height="744.09448"
+ width="561"
+ height="231"
id="svg1901"
sodipodi:version="0.32"
inkscape:version="0.48.4 r9939"
sodipodi:docname="installation-steps.svg"
version="1.1">
<defs
- id="defs1903" />
+ id="defs1903">
+ <font
+ horiz-adv-x="1024"
+ id="font3118"
+ inkscape:label="fontti 1">
+ <font-face
+ units-per-em="1024"
+ id="font-face3120"
+ font-family="SVGFont 1" />
+ <missing-glyph
+ d="M0,0h1000v1024h-1000z"
+ id="missing-glyph3122" />
+ </font>
+ </defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
@@ -25,9 +38,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="2.8"
- inkscape:cx="402.01814"
- inkscape:cy="409.01233"
+ inkscape:zoom="1.979899"
+ inkscape:cx="247.15191"
+ inkscape:cy="62.440392"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="1920"
@@ -43,7 +56,11 @@
inkscape:object-nodes="true"
inkscape:snap-object-midpoints="true"
showguides="true"
- inkscape:guide-bbox="true">
+ inkscape:guide-bbox="true"
+ fit-margin-top="5"
+ fit-margin-left="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5">
<inkscape:grid
type="xygrid"
id="grid2982"
@@ -52,14 +69,16 @@
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="5px"
- spacingy="5px" />
+ spacingy="5px"
+ originx="-124.5px"
+ originy="-294.50073px" />
<sodipodi:guide
orientation="1,0"
- position="227.32143,468.92857"
+ position="102.82143,174.42784"
id="guide3116" />
<sodipodi:guide
orientation="1,0"
- position="328.03571,468.03571"
+ position="203.53571,173.53498"
id="guide3120" />
</sodipodi:namedview>
<metadata
@@ -78,7 +97,7 @@
inkscape:label="Taso 1"
inkscape:groupmode="layer"
id="layer1"
- transform="translate(0,-308.2677)">
+ transform="translate(-124.5,-526.86145)">
<rect
style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.13524589;stroke-dasharray:2, 1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3115"
@@ -111,7 +130,7 @@
rx="1.8654728" />
<flowRoot
transform="translate(0.74636894,298.81113)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-7-2"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-6-3"><rect
@@ -246,7 +265,7 @@
rx="1.8654728" />
<flowRoot
transform="translate(0.96798326,298.92194)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-7-2-4"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-6-3-2"><rect
@@ -272,7 +291,7 @@
rx="1.8654728" />
<flowRoot
transform="translate(5.79546,303.04687)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-7-0"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-6-6"><rect
@@ -298,7 +317,7 @@
rx="1.8654728" />
<flowRoot
transform="translate(5.77146,308.61462)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-8"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-3"><rect
@@ -372,7 +391,7 @@
rx="1.8654728" />
<flowRoot
transform="translate(1.0223215,288.61775)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-7-2-4-0"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-6-3-2-1"><rect
@@ -398,7 +417,7 @@
rx="1.8654728" />
<flowRoot
transform="translate(5.7477504,293.01433)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-7-0-0"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-6-6-0"><rect
@@ -423,11 +442,11 @@
rx="1.8654728" />
<flowRoot
transform="translate(6.486036,298.2575)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-7-0-0-9"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-6-6-0-5"><rect
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;writing-mode:lr;text-anchor:start;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
y="363.14072"
x="16.541248"
height="25.127552"
@@ -448,7 +467,7 @@
rx="1.8654728" />
<flowRoot
transform="translate(5.5983218,303.07893)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-8-5"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-3-9"><rect
@@ -473,11 +492,11 @@
rx="1.8654728" />
<flowRoot
transform="translate(5.4917504,307.90036)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-8-5-5"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-3-9-6"><rect
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;writing-mode:lr;text-anchor:start;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
y="363.14072"
x="16.541248"
height="25.127552"
@@ -547,7 +566,7 @@
rx="1.8654728" />
<flowRoot
transform="translate(-0.038706,307.54845)"
- style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:90%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
id="flowRoot3808-5-9"
xml:space="preserve"><flowRegion
id="flowRegion3810-5-65"><rect
diff --git a/documentation/introduction/intro-overview.asciidoc b/documentation/introduction/intro-overview.asciidoc
index fb46e6fac6..22ccc06c10 100644
--- a/documentation/introduction/intro-overview.asciidoc
+++ b/documentation/introduction/intro-overview.asciidoc
@@ -24,7 +24,7 @@ deal directly with browser technologies, such as HTML or JavaScript.
[[figure.intro.architecture]]
.Vaadin Application Architecture
-image::img/architecture-vaadin7-hi.png[]
+image::img/architecture-vaadin7-hi.png[scaledwidth=100%]
<<figure.intro.architecture>> illustrates the basic architectures of web
applications made with Vaadin. The server-side application architecture consists
@@ -84,6 +84,3 @@ for now. You can read more about it later in
or jump straight to more practical things in
<<dummy/../../../framework/application/application-overview.asciidoc#application.overview,"Writing
a Server-Side Web Application">>.
-
-
-
diff --git a/documentation/jpacontainer/jpacontainer-overview.asciidoc b/documentation/jpacontainer/jpacontainer-overview.asciidoc
index a622c0509d..44f33b5a09 100644
--- a/documentation/jpacontainer/jpacontainer-overview.asciidoc
+++ b/documentation/jpacontainer/jpacontainer-overview.asciidoc
@@ -7,6 +7,12 @@ layout: page
[[jpacontainer.overview]]
= Overview
+NOTE: Using JPAContainer is no longer recommended.
+While it works for simple data models, it is not as easy to use as it should be.
+It also has architectural weaknesses and performance issues that cause problems in building more complex applications.
+Instead, we recommend using JPA directly, while hiding it from your UI logic behind a DAO or service class.
+In UI code, you should mainly handle beans and collections of beans, bound to a [classname]#BeanItemContainer#. You should also note the https://vaadin.com/directory#!addon/viritin[Viritin] add-on, which provides data binding features that help with JPA.
+
Vaadin JPAContainer add-on makes it possible to bind user interface components
to a database easily using the Java Persistence API (JPA). It is an
implementation of the [interfacename]#Container# interface described in
@@ -116,8 +122,3 @@ following documentation about JPAContainer:
* JPAContainer AddressBook Demo
* JPAContainer Demo
-
-
-
-
-
diff --git a/documentation/layout/img/layout-intro-example-1.png b/documentation/layout/img/layout-intro-example-1.png
index e69ffb1ba1..1829a4feb7 100644
--- a/documentation/layout/img/layout-intro-example-1.png
+++ b/documentation/layout/img/layout-intro-example-1.png
Binary files differ
diff --git a/documentation/layout/img/layout-schematic-hi.png b/documentation/layout/img/layout-schematic-hi.png
new file mode 100644
index 0000000000..f64e5bb482
--- /dev/null
+++ b/documentation/layout/img/layout-schematic-hi.png
Binary files differ
diff --git a/documentation/layout/layout-gridlayout.asciidoc b/documentation/layout/layout-gridlayout.asciidoc
index 4ffabfb318..e96aa8e2bd 100644
--- a/documentation/layout/layout-gridlayout.asciidoc
+++ b/documentation/layout/layout-gridlayout.asciidoc
@@ -54,12 +54,12 @@ date.setResolution(DateField.RESOLUTION_DAY);
grid.addComponent(date, 2, 2, 3, 3);
----
-The resulting layout will look as follows. The borders have been made visible to
-illustrate the layout cells.
+The resulting layout is shown in <<figure.layout.gridlayout>>.
+The borders have been made visible to illustrate the layout cells.
-[[figure.ui.gridlayout]]
-.The Grid Layout Component
-image::img/gridlayout.png[]
+[[figure.layout.gridlayout]]
+.The [classname]#GridLayout# component
+image::img/gridlayout.png[width=50%, scaledwidth=75%]
A component to be placed on the grid must not overlap with existing components.
A conflict causes throwing a [classname]#GridLayout.OverlapsException#.
@@ -103,8 +103,6 @@ the Debug Mode">>.
====
-
-
Often, you want to have one or more rows or columns that take all the available
space left over from non-expanding rows or columns. You need to set the rows or
columns as __expanding__ with [methodname]#setRowExpandRatio()# and
@@ -116,7 +114,6 @@ multiple expanding rows or columns, the ratio parameter sets the relative
portion how much a specific row/column will take in relation with the other
expanding rows/columns.
-
[source, java]
----
GridLayout grid = new GridLayout(3,2);
@@ -153,7 +150,7 @@ for (int col=0; col<grid.getColumns(); col++) {
for (int row=0; row<grid.getRows(); row++) {
Component c = grid.getComponent(col, row);
grid.setComponentAlignment(c, Alignment.TOP_CENTER);
-
+
// Make the labels high to illustrate the empty
// horizontal space.
if (col != 0 || row != 0)
@@ -163,8 +160,8 @@ for (int col=0; col<grid.getColumns(); col++) {
----
[[figure.ui.gridlayout.sizing.expanding]]
-.Expanding Rows and Columns in [classname]#GridLayout#
-image::img/gridlayout_sizing_expanding.png[]
+.Expanding rows and columns in [classname]#GridLayout#
+image::img/gridlayout_sizing_expanding.png[width=75%, scaledwidth=100%]
If the size of the contained components is undefined or fixed, the expansion
ratio is of the __excess__ space, as in
@@ -177,68 +174,18 @@ example, if we had a 100 pixels wide grid layout with two columns with 1.0 and
[methodname]#setWidth("100%")#, the columns would have respective widths of 20
and 80 pixels, regardless of the minimum size of their contained components.
-
+[[layout.gridlayout.css]]
== CSS Style Rules
-
[source, css]
----
.v-gridlayout {}
.v-gridlayout-margin {}
----
-The v-gridlayout is the root element of the [classname]#GridLayout# component.
-The v-gridlayout-margin is a simple element inside it that allows setting a
-padding between the outer element and the cells.
-
-For styling the individual grid cells, you should style the components inserted
-in the cells. The implementation structure of the grid can change, so depending
-on it, as is done in the example below, is not generally recommended. Normally,
-if you want to have, for example, a different color for a certain cell, just
-make set the component inside it [methodname]#setSizeFull()#, and add a style
-name for it. Sometimes you may need to use a layout component between a cell and
-its actual component just for styling.
-
-The following example shows how to make the grid borders visible, as in
-<<figure.ui.gridlayout.sizing.expanding>>.
-
-
-[source, java]
-----
-.v-gridlayout-gridexpandratio {
- background: blue; /* Creates a "border" around the grid. */
- margin: 10px; /* Empty space around the layout. */
-}
-
-/* Add padding through which the background color shows. */
-.v-gridlayout-gridexpandratio .v-gridlayout-margin {
- padding: 2px;
-}
-
-/* Add cell borders and make the cell backgrounds white.
- * Warning: This depends heavily on the HTML structure. */
-.v-gridlayout-gridexpandratio > div > div > div {
- padding: 2px; /* Layout background will show through. */
- background: white; /* The cells will be colored white. */
-}
-
-/* Components inside the layout are a safe way to style cells. */
-.v-gridlayout-gridexpandratio .v-label {
- text-align: left;
- background: #ffffc0; /* Pale yellow */
-}
-----
-
-You should beware of [literal]#++margin++#, [literal]#++padding++#, and
-[literal]#++border++# settings in CSS as they can mess up the layout. The
-dimensions of layouts are calculated in the Client-Side Engine of Vaadin and
-some settings can interfere with these calculations. For more information, on
-margins and spacing, see
-<<dummy/../../../framework/layout/layout-settings#layout.settings.spacing,"Layout
-Cell Spacing">> and
-<<dummy/../../../framework/layout/layout-settings#layout.settings.margins,"Layout
-Margins">>
-
-
-
+The `v-gridlayout` is the root element of the [classname]#GridLayout# component.
+The `v-gridlayout-margin` is a simple element inside it that allows setting a padding between the outer element and the cells.
+For styling the individual grid cells, you should style the components inserted in the cells.
+Normally, if you want to have, for example, a different color for a certain cell, just make set the component inside it [methodname]#setSizeFull()#, and add a style name for it.
+Sometimes, you may need to wrap a component inside a layout component just for styling the cell.
diff --git a/documentation/layout/layout-orderedlayout.asciidoc b/documentation/layout/layout-orderedlayout.asciidoc
index 7cd2c7772d..4e0d53bbed 100644
--- a/documentation/layout/layout-orderedlayout.asciidoc
+++ b/documentation/layout/layout-orderedlayout.asciidoc
@@ -31,14 +31,13 @@ layout.addComponent(vertical);
----
See the http://demo.vaadin.com/book-examples-vaadin7/book#layout.orderedlayout.basic[on-line example, window="_blank"].
-The component captions are placed above the component, so the layout will look
-as follows:
+In [classname]#VerticalLayout#, the captions of child components are placed above each component, so the layout would look as follows:
-image::img/orderedlayout_vertical.png[]
+image::img/orderedlayout_vertical.png[width=30%, scaledwidth=65%]
-Using [classname]#HorizontalLayout# gives the following layout:
+[classname]#HorizontalLayout# gives the following layout:
-image::img/orderedlayout_horizontal.png[]
+image::img/orderedlayout_horizontal.png[width=80%, scaledwidth=100%]
[[layout.orderedlayout.properties]]
== Properties or Attributes
@@ -48,18 +47,16 @@ Ordered layouts have the following properties:
[[layout.orderedlayout.properties.table]]
.Properties and Declarative Attributes
+[cols="1,2"]
|===============
|Property|Declarative Attribute
-|[parameter]#componentAlignment#|In child components:[literal]#++:left++#(default),[literal]#++:center++#,[literal]#++:right++#,[literal]#++:top++#(default),[literal]#++:middle++#,[literal]#++:bottom++#
-|[parameter]#spacing#|[parameter]#spacing#[replaceable]#[=&lt;boolean&gt;]#
-|[parameter]#margin#|[parameter]#margin#[replaceable]#[=&lt;boolean&gt;]#
-|[parameter]#expandRatio#|In child components:[parameter]#:expand#=[replaceable]#&lt;integer&gt;#or[parameter]#:expand#(implies ratio 1)
+|[parameter]#componentAlignment#|Alignment of a child component is specified in the child with: [literal]#++:left++# (default), [literal]#++:center++#, [literal]#++:right++#, [literal]#++:top++# (default), [literal]##++:middle++##, [literal]##++:bottom++##
+|[parameter]#spacing#|[parameter]##spacing##++[=++[replaceable]##&lt;boolean&gt;##++]++
+|[parameter]#margin#|[parameter]##margin##++[=++[replaceable]##&lt;boolean&gt;##++]++
+|[parameter]#expandRatio#|Expand ratio of a child component is specified in the child with: [parameter]#:expand#++[=++[replaceable]##&lt;integer&gt;##++]++ or [parameter]#:expand# (implies ratio 1)
|===============
-
-
-
[[layout.orderedlayout.spacing]]
== Spacing in Ordered Layouts
@@ -76,9 +73,7 @@ element in a CSS selector, such as [literal]#++v-verticallayout++# for a
[literal]#++v-horizontal++# for all vertically or horizontally ordered layouts,
such as [classname]#FormLayout#.
-For example, the following sets the amount of spacing for all
-[classname]#VerticalLayout#s, as well as [classname]#FormLayout#, in the UI:
-
+For example, the following sets the amount of spacing for all [classname]##VerticalLayout##s (as well as [classname]##FormLayout##s) in the UI:
[source, css]
----
@@ -89,7 +84,6 @@ For example, the following sets the amount of spacing for all
Or for [classname]#HorizontalLayout#:
-
[source, css]
----
.v-horizontal > .v-spacing {
@@ -97,7 +91,6 @@ Or for [classname]#HorizontalLayout#:
}
----
-
[[layout.orderedlayout.sizing]]
== Sizing Contained Components
@@ -106,8 +99,8 @@ different ways depending on how you specify their height or width in the primary
direction of the layout component.
[[figure.layout.orderedlayout.size.summary]]
-.Component Widths in [classname]#HorizontalLayout#
-image::img/horizontallayout_sizing.png[]
+.Component widths in [classname]#HorizontalLayout#
+image::img/horizontallayout_sizing.png[width=75%, scaledwidth=100%]
<<figure.layout.orderedlayout.size.summary>> gives a summary of the sizing
options for a [classname]#HorizontalLayout#. The figure is broken down in the
@@ -154,8 +147,6 @@ Component Hierarchy">>.
====
-
-
An exception to the above rule is a case where you have a layout with undefined
size that contains a component with a fixed or undefined size together with one
or more components with relative size. In this case, the contained component
@@ -163,6 +154,7 @@ with fixed (or undefined) size in a sense defines the size of the containing
layout, removing the paradox. That size is then used for the relatively sized
components.
+ifdef::web[]
The technique can be used to define the width of a [classname]#VerticalLayout#
or the height of a [classname]#HorizontalLayout#.
@@ -171,10 +163,10 @@ or the height of a [classname]#HorizontalLayout#.
----
// Vertical layout would normally have 100% width
VerticalLayout vertical = new VerticalLayout();
-
+
// Shrink to fit the width of contained components
vertical.setWidth(Sizeable.SIZE_UNDEFINED, 0);
-
+
// Label has normally 100% width, but we set it as
// undefined so that it will take only the needed space
Label label =
@@ -182,7 +174,7 @@ Label label =
"the width of this Label \u2192");
label.setWidth(Sizeable.SIZE_UNDEFINED, 0);
vertical.addComponent(label);
-
+
// Button has undefined width by default
Button butt = new Button("\u2190 This Button takes 100% "+
"of the width \u2192");
@@ -193,8 +185,9 @@ See the http://demo.vaadin.com/book-examples-vaadin7/book#layout.orderedlayout.s
[[figure.layout.orderedlayout.sizing.undefined.defining]]
.Defining the Size with a Component
-image::img/orderedlayout-sizing-undefined.png[]
+image::img/orderedlayout-sizing-undefined.png[width=50%, scaledwidth=75%]
+endif::web[]
=== Layout with Defined Size
@@ -310,7 +303,7 @@ excess space that expands, not the components.
for (int i = 1; i <= 3; i++) {
// Button with undefined size.
Button button = new Button(captions[i - 1]);
-
+
layout4.addComponent(button);
// Expand ratios are 1:2:3.
@@ -349,8 +342,3 @@ for (int i = 1; i <= 3; i++) {
}
parentLayout.addComponent(layout50);
----
-
-
-
-
-
diff --git a/documentation/layout/layout-overview.asciidoc b/documentation/layout/layout-overview.asciidoc
index 6481db6229..7a57e2a518 100644
--- a/documentation/layout/layout-overview.asciidoc
+++ b/documentation/layout/layout-overview.asciidoc
@@ -9,15 +9,23 @@ layout: page
The user interface components in Vaadin can roughly be divided in two groups:
components that the user can interact with and layout components for placing the
-other components to specific places in the user interface. The layout components
-are identical in their purpose to layout managers in regular desktop frameworks
-for Java and you can use plain Java to accomplish sophisticated component
-layouting.
+other components to specific places in the user interface.
+The layout components are identical in their purpose to layout managers in regular desktop frameworks for Java.
+You can use plain Java to accomplish sophisticated component layouts.
+
+[[figure.layout.intro.simple]]
+.Layout example
+image::img/layout-intro-example-1.png[width=75%, scaledwidth=100%]
You start by creating a content layout for the UI and then add other layout
components hierarchically, and finally the interaction components as the leaves
of the component tree.
+[[figure.layout.intro.schematic]]
+.Layout schematic
+image::img/layout-schematic-hi.png[width=100%, scaledwidth=100%]
+
+Let us look at building a bit simplified version of the layout in <<figure.layout.intro.simple>>:
[source, java]
----
@@ -25,20 +33,22 @@ of the component tree.
VerticalLayout content = new VerticalLayout();
setContent(content);
-// Add the topmost component.
-content.addComponent(new Label("The Ultimate Cat Finder"));
+HorizontalLayout titleBar = new HorizontalLayout();
+titleBar.setWidth("100%");
+root.addComponent(titleBar);
-// Add a horizontal layout for the bottom part.
-HorizontalLayout bottom = new HorizontalLayout();
-content.addComponent(bottom);
+Label title = new Label("The Ultimate Cat Finder");
+titleBar.addComponent(title);
+titleBar.setExpandRatio(title, 1.0f); // Expand
-bottom.addComponent(new Tree("Major Planets and Their Moons"));
-bottom.addComponent(new Panel());
-...
-----
+Label titleComment = new Label("for Vaadin");
+titleComment.setSizeUndefined(); // Take minimum space
+titleBar.addComponent(titleComment);
-Or in the declarative format:
+... build rest of the layout ...
+----
+Or in the declarative format (roughly):
[source, html]
----
@@ -46,8 +56,9 @@ Or in the declarative format:
<vaadin-label>The Ultimate Cat Finder</vaadin-label>
<vaadin-horizontal-layout>
- <vaadin-tree caption="Major Planets and Their Moons"/>
+ <vaadin-tree caption="Possible Places"/>
<vaadin-panel/>
+ ...
</vaadin-horizontal-layout>
</vaadin-vertical-layout>
----
@@ -65,10 +76,3 @@ described in
You can see a finished version of the above example in
<<figure.layout.intro.simple>>.
-
-[[figure.layout.intro.simple]]
-.Layout Example
-image::img/layout-intro-example-1.png[]
-
-
-
diff --git a/documentation/layout/original-drawings/Makefile b/documentation/layout/original-drawings/Makefile
new file mode 100644
index 0000000000..7e9434de9c
--- /dev/null
+++ b/documentation/layout/original-drawings/Makefile
@@ -0,0 +1,17 @@
+SVG =
+RASTERIMAGES = layout-schematic
+
+RASTERSRCIMAGES := $(foreach file, $(RASTERIMAGES), $(file).svg)
+RASTERIMAGES_HI := $(foreach file, $(RASTERIMAGES), ../img/$(file)-hi.png)
+SVGTRGIMAGES := $(foreach file, $(SVG), ../img/$(file).svg)
+
+images: $(RASTERIMAGES_HI) $(SVGTRGIMAGES) FORCE
+# Just do low now $(TRGIMAGES_LO)
+
+$(RASTERIMAGES_HI): ../img/%-hi.png: %.svg
+ inkscape --export-png $@ --export-dpi=300 --export-area-drawing $<
+
+$(SVGTRGIMAGES): ../img/%.svg: %.svg FORCE
+ inkscape $< --export-text-to-path -l $@
+
+FORCE:
diff --git a/documentation/layout/original-drawings/layout-schematic.svg b/documentation/layout/original-drawings/layout-schematic.svg
new file mode 100644
index 0000000000..ec1b9240a5
--- /dev/null
+++ b/documentation/layout/original-drawings/layout-schematic.svg
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="82mm"
+ height="41mm"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.91 r"
+ sodipodi:docname="layout-schematic.svg"
+ version="1.1">
+ <defs
+ id="defs1903" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="148.02363"
+ inkscape:cy="70.790343"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1920"
+ inkscape:window-height="1060"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ showgrid="true"
+ inkscape:window-maximized="1"
+ inkscape:snap-center="true"
+ inkscape:snap-grids="true"
+ inkscape:snap-bbox="true"
+ inkscape:object-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-object-midpoints="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ units="mm"
+ fit-margin-top="2"
+ fit-margin-left="2"
+ fit-margin-right="2"
+ fit-margin-bottom="2">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2982"
+ empspacing="10"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="3.5433071"
+ spacingy="3.5433071"
+ units="mm"
+ originx="18.581643"
+ originy="0.35428181" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata1906">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Taso 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(18.581643,-907.44094)">
+ <rect
+ y="910.62994"
+ x="46.062992"
+ height="138.189"
+ width="162.99213"
+ id="rect4347-0-2-5-5-9-59"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#e61e6d;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot4349"
+ style="font-style:normal;font-weight:normal;font-size:10px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ transform="translate(7.0866142,882.28351)"><flowRegion
+ id="flowRegion4351"><rect
+ id="rect4353"
+ width="67.322838"
+ height="42.519684"
+ x="49.6063"
+ y="56.692909"
+ style="font-size:10px" /></flowRegion><flowPara
+ id="flowPara4355" /></flowRoot> <g
+ id="g4392-0-4-6-8"
+ transform="translate(216.14174,42.519773)" />
+ <rect
+ y="914.17328"
+ x="49.6063"
+ height="131.10236"
+ width="155.90552"
+ id="rect4347-0-2-5-5-9"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#e61e6d;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="917.71655"
+ x="53.149605"
+ height="21.259869"
+ width="148.81889"
+ id="rect4347-0-2-5-5-9-5"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#e61e6d;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="921.25989"
+ x="56.692913"
+ height="14.17316"
+ width="102.7559"
+ id="rect4347-0-2-5-5-9-5-8"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffc13f;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="921.25983"
+ x="162.99213"
+ height="14.173287"
+ width="35.433075"
+ id="rect4347-0-2-5-5-9-5-8-5"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffc13f;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="942.51971"
+ x="53.149605"
+ height="88.582695"
+ width="148.81889"
+ id="rect4347-0-2-5-5-9-5-84"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#e61e6d;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="1034.6458"
+ x="53.149605"
+ height="7.0865755"
+ width="148.81889"
+ id="rect4347-0-2-5-5-9-5-9"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffc13f;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="946.06305"
+ x="56.692913"
+ height="81.496048"
+ width="46.062984"
+ id="rect4347-0-2-5-5-9-5-8-0"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#e61e6d;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="956.69293"
+ x="60.236221"
+ height="67.322792"
+ width="38.976372"
+ id="rect4347-0-2-5-5-9-5-8-0-5"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffc13f;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="946.06293"
+ x="106.29922"
+ height="81.49617"
+ width="92.125977"
+ id="rect4347-0-2-5-5-9-5-8-0-8"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#e61e6d;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="956.69287"
+ x="109.84253"
+ height="67.322922"
+ width="85.03936"
+ id="rect4347-0-2-5-5-9-5-8-0-5-4"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#e61e6d;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 49.606297,921.25994 -10.629919,-5e-5"
+ id="path3003-6-5-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="921.25989"
+ cx="49.606293"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6"
+ r="2.1259842" />
+ <circle
+ cy="921.25989"
+ cx="38.976379"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 53.149601,1038.1893 -14.17322,0"
+ id="path3003-6-5-1-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="1038.1891"
+ cx="53.149601"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-7"
+ r="2.1259842" />
+ <circle
+ cy="1038.189"
+ cx="38.976379"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-4"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 56.69291,953.14967 -17.716532,-2e-5"
+ id="path3003-6-5-1-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="953.14966"
+ cx="56.692902"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13"
+ r="2.1259842" />
+ <circle
+ cy="953.14966"
+ cx="38.976376"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 53.1496,946.06308 -14.173222,-4e-5"
+ id="path3003-6-5-1-5-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="946.06299"
+ cx="53.149601"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-9"
+ r="2.1259842" />
+ <circle
+ cy="946.06305"
+ cx="38.976379"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-8"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 216.14174,931.8898 -17.71654,0"
+ id="path3003-6-5-1-5-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="931.88983"
+ cx="198.42522"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-3"
+ r="2.1259842" />
+ <circle
+ cy="931.88983"
+ cx="216.14174"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-7"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 56.692911,928.34655 -17.716533,-5e-5"
+ id="path3003-6-5-1-5-78"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="928.3465"
+ cx="56.692902"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-7"
+ r="2.1259842" />
+ <circle
+ cy="928.3465"
+ cx="38.976379"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-0"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 60.236217,960.23629 -21.259839,-3e-5"
+ id="path3003-6-5-1-5-13"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="960.23627"
+ cx="60.236206"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-39"
+ r="2.1259842" />
+ <circle
+ cy="960.23627"
+ cx="38.976376"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-9"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 216.14174,949.60637 -17.71653,0"
+ id="path3003-6-5-1-5-7-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="949.60632"
+ cx="198.42522"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-3-2"
+ r="2.1259842" />
+ <circle
+ cy="949.60638"
+ cx="216.14175"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-7-4"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 216.14174,921.25991 -14.17323,0"
+ id="path3003-6-5-1-5-7-1-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="921.25989"
+ cx="201.96854"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-3-2-6"
+ r="2.1259842" />
+ <circle
+ cy="921.26001"
+ cx="216.14175"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-7-4-2"
+ r="2.1259842" />
+ <rect
+ y="970.86621"
+ x="120.47243"
+ height="38.976353"
+ width="63.77953"
+ id="rect4347-0-2-5-5-9-5-8-0-5-4-1"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#e61e6d;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="974.40948"
+ x="124.01573"
+ height="14.173236"
+ width="56.692928"
+ id="rect4347-0-2-5-5-9-5-8-0-5-4-1-7"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffc13f;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <rect
+ y="992.12604"
+ x="124.01573"
+ height="14.173219"
+ width="56.692928"
+ id="rect4347-0-2-5-5-9-5-8-0-5-4-1-7-8"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffc13f;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 216.14173,985.03941 -35.43307,2e-5"
+ id="path3003-6-5-1-5-7-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="985.03943"
+ cx="180.70866"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-3-5"
+ r="2.1259842" />
+ <circle
+ cy="985.03943"
+ cx="216.14174"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-7-0"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 216.14173,1002.7559 -35.43307,0"
+ id="path3003-6-5-1-5-7-7-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="1002.7559"
+ cx="180.70866"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-3-5-3"
+ r="2.1259842" />
+ <circle
+ cy="1002.7559"
+ cx="216.14174"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-7-0-3"
+ r="2.1259842" />
+ <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 216.14173,974.40949 -31.88976,2e-5"
+ id="path3003-6-5-1-5-7-1-1-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="974.40948"
+ cx="184.25197"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-3-2-6-9"
+ r="2.1259842" />
+ <circle
+ cy="974.40955"
+ cx="216.14177"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-7-4-2-4"
+ r="2.1259842" />
+ <flowRoot
+ transform="translate(34.181781,923.10248)"
+ id="flowRoot4367-0-7-2-4-4-43-5-2"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-6-6-7" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;writing-mode:lr;text-anchor:end;"
+ id="flowPara4783-7-2-8-1-0-0">VerticalLayout</flowPara></flowRoot> <flowRoot
+ transform="translate(34.055515,1040.0315)"
+ id="flowRoot4367-0-7-2-4-4-4"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-8" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;writing-mode:lr;text-anchor:end;"
+ id="flowPara4783-7-2-8-5">Label</flowPara></flowRoot> <flowRoot
+ transform="translate(34.055511,955.26005)"
+ id="flowRoot4367-0-7-2-4-4-43"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-6" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;writing-mode:lr;text-anchor:end;"
+ id="flowPara4783-7-2-8-1">Panel</flowPara></flowRoot> <flowRoot
+ transform="translate(34.176406,947.90968)"
+ id="flowRoot4367-0-7-2-4-4-43-3"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-6-1" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;letter-spacing:0px;writing-mode:lr;text-anchor:end;"
+ id="flowPara4684">HorizontalLayout</flowPara></flowRoot> <flowRoot
+ transform="translate(220.06236,933.6273)"
+ id="flowRoot4367-0-7-2-4-4-8"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill-rule:nonzero;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-7" /><flowPara
+ style="font-size:6.25px;text-align:start;text-anchor:start;color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;-inkscape-font-specification:'Montserrat, Normal';font-family:Montserrat;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;writing-mode:lr;line-height:58%;"
+ id="flowPara4783-7-2-8-7">Label</flowPara></flowRoot> <flowRoot
+ transform="translate(34.055512,930.18906)"
+ id="flowRoot4367-0-7-2-4-4-43-5"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-6-6" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;writing-mode:lr;text-anchor:end;"
+ id="flowPara4783-7-2-8-1-0">Label</flowPara></flowRoot> <flowRoot
+ transform="translate(33.772237,962.0788)"
+ id="flowRoot4367-0-7-2-4-4-43-8"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-6-7" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;writing-mode:lr;text-anchor:end;"
+ id="flowPara4783-7-2-8-1-1">Tree</flowPara></flowRoot> <flowRoot
+ transform="translate(220.06237,951.34394)"
+ id="flowRoot4367-0-7-2-4-4-8-4"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-7-7" /><flowPara
+ style="font-size:6.25px;text-align:start;text-anchor:start;-inkscape-font-specification:'Montserrat, Normal';font-family:Montserrat;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;writing-mode:lr;line-height:58%;"
+ id="flowPara4783-7-2-8-7-1">Panel</flowPara></flowRoot> <flowRoot
+ transform="translate(219.88965,923.13155)"
+ id="flowRoot4367-0-7-2-4-4-8-4-8"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-7-7-1" /><flowPara
+ style="font-size:6.25px;line-height:58%;text-align:start;text-anchor:start;-inkscape-font-specification:'Montserrat, Normal';font-family:Montserrat;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;writing-mode:lr;"
+ id="flowPara4865">HorizontalLayout</flowPara></flowRoot> <flowRoot
+ transform="translate(220.25102,986.77706)"
+ id="flowRoot4367-0-7-2-4-4-8-9"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-7-6" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;writing-mode:lr;text-anchor:start;"
+ id="flowPara4783-7-2-8-7-4">Label</flowPara></flowRoot> <flowRoot
+ transform="translate(220.25102,1004.4936)"
+ id="flowRoot4367-0-7-2-4-4-8-9-7"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-7-6-6" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;writing-mode:lr;text-anchor:start;"
+ id="flowPara4783-7-2-8-7-4-8">Label</flowPara></flowRoot> <flowRoot
+ transform="translate(219.88712,976.25205)"
+ id="flowRoot4367-0-7-2-4-4-8-4-8-2"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-7-7-1-6" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:58%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;writing-mode:lr;text-anchor:start;"
+ id="flowPara4865-9">VerticalLayout</flowPara></flowRoot> <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 46.06299,914.17332 -7.086612,-5e-5"
+ id="path3003-6-5-1-86"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="914.17328"
+ cx="46.062992"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-8"
+ r="2.1259842" />
+ <circle
+ cy="914.17328"
+ cx="38.976379"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-6"
+ r="2.1259842" />
+ <flowRoot
+ transform="translate(34.181782,916.01583)"
+ id="flowRoot4367-0-7-2-4-4-43-5-2-5"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-6-6-7-3" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:121%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:end;writing-mode:lr;text-anchor:end;"
+ id="flowPara4783-7-2-8-1-0-0-9">UI</flowPara></flowRoot> <path
+ style="fill:none;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 216.1417,960.23626 -21.25981,0"
+ id="path3003-6-5-1-5-7-1-1-7-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <circle
+ cy="960.23627"
+ cx="194.8819"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-13-3-2-6-9-1"
+ r="2.1259842" />
+ <circle
+ cy="960.23627"
+ cx="216.14174"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#33383a;stroke-width:0.70866144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path2997-7-6-1-7-7-4-2-4-9"
+ r="2.1259842" />
+ <flowRoot
+ transform="translate(219.88709,962.07882)"
+ id="flowRoot4367-0-7-2-4-4-8-4-8-2-0"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:57.99999833%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4369-0-6-7-7-5-7-7-1-6-7" /><flowPara
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.25px;line-height:57.99999833%;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="flowPara4865-9-0">VerticalLayout</flowPara></flowRoot> </g>
+</svg>
diff --git a/documentation/themes/themes-fonts.asciidoc b/documentation/themes/themes-fonts.asciidoc
index 741fb00a72..8bb2bfef67 100644
--- a/documentation/themes/themes-fonts.asciidoc
+++ b/documentation/themes/themes-fonts.asciidoc
@@ -19,7 +19,7 @@ follows:
----
@include font(MyFontFamily,
- '../../mytheme/fonts/myfontfamily');
+ '../../../../mytheme/fonts/myfontfamily');
----
The statement must be given in the [filename]#styles.scss# file __outside__ the
diff --git a/documentation/tutorial.adoc b/documentation/tutorial.adoc
index 37e23f6268..b888d6118d 100644
--- a/documentation/tutorial.adoc
+++ b/documentation/tutorial.adoc
@@ -47,6 +47,10 @@ No extensive knowledge of Java is needed, only basic programming skills are requ
[[framework.tutorial.overview]]
== Overview
+You need about 20 to 60 minutes to complete the tutorial, depending on your existing experience.
+Naturally, you can just do the beginning of the exercise or pick any of the steps you want.
+To start from a specific step, we have prepared the example code after each step to be downloaded as a zip file.
+
In this tutorial, we build a simple customer management system.
It is not a real application; we use an in-memory "back-end", so that you can understand how to hook it to an existing Java based back-end.
We cover the basic Vaadin development and you can use the result as a basis for more experiments with Vaadin, such as using add-ons, your own custom look-and- feel (aka. theme), adding new views, or optimizing the result for mobile support.
@@ -55,11 +59,10 @@ We cover the basic Vaadin development and you can use the result as a basis for
.UI to be built in the tutorial
image::img/finalUI.jpg[]
-You need about 20 to 60 minutes to complete the tutorial, depending on your existing experience.
-Naturally, you can just do the beginning of the exercise or pick any of the steps you want.
-To start from a specific step, we have prepared the example code after each step to be downloaded as a zip file.
If you do not want to do the exercise at all, you can also just https://github.com/vaadin/tutorial/[download the final application] and play around with it.
+TIP: In addition to this written tutorial, we have recorded the steps as https://www.youtube.com/playlist?list=PLcRrh9hGNalkIgvImLRO9u3D0YpmEWuqo[a series of videos]. You can just watch all the videos or watch the video of each step before you do the same step yourself.
+
[[framework.tutorial.overview.tools]]
=== Installing the Development Tools
@@ -71,11 +74,15 @@ SE site].
Also make sure you have the latest version of your IDE.
Eclipse is available in various packages; be sure to download the *Eclipse IDE for Java EE Developers* from http://www.eclipse.org/downloads/[eclipse.org].
-Please refer to <<getting-started/getting-started-environment#getting-started.environment, "Setting up the Development Environment">> for information regarding installing the tools.
+Please refer to <<getting-started/getting-started-environment#getting-started.environment, "Setting up the Development Environment">> for more information regarding installing the tools or watch the video of the next step.
[[framework.tutorial.archetype]]
== Creating a Project from an Archetype
+You can get an overview of this step with the following video, which first shows how to install Eclipse, then how to create a Vaadin application using Maven, and finally how to run it:
+
+video::jhgasF5euxg[youtube, width="640", height="400"]
+
As the starting point for the application, we use a Maven archetype called `vaadin-archetype-application`.
Archetypes are project stubs that have some example code and a basic Maven build script.
@@ -233,12 +240,20 @@ history/Debug history > Run in Jetty".
To get back to the _Java EE Perspective_, an Eclipse mode designed for editing Java web app code, click the [guibutton]#Java EE# button in the toolbar.
+The following video shows how to implement a _Hello World_ application from scratch:
+
+video::9-qwPfpSHWc[youtube, width="640", height="400"]
+
[[framework.tutorial.backend]]
== Adding a demo "backend"
Before getting more into real Vaadin development, let us introduce some domain objects and a "fake backend".
In a real-world application, you will most likely have something similar, implemented with, for example, JPA and EJB or a Spring-based service.
+The following video covers steps 3 and 4 (<<framework.tutorial.grid>>) of this tutorial:
+
+video::0W0frepDKWI[youtube, width="640", height="400"]
+
Copy the following three classes from github to your project.
Class names point to the classes hosted in Github.
Copying classes can be done in many ways.
@@ -382,14 +397,18 @@ A search functionality is expected in every modern application and it is
also a nice Vaadin development exercise. Let's add a filtering functionality to
the Customer listing we created in the previous step.
-We'll start by introducing a TextField component as a field to our UI class:
+The following video shows how to do this step of the tutorial:
+
+video::fAeC_mZH_7w[youtube, width="640", height="400"]
+
+We'll start by introducing a [classname]#TextField# component as a field to our [classname]#UI# class:
[source,java]
----
private TextField filterText = new TextField();
----
-In the _init_ method, configure the text field to contain a helpful input prompt
+In the [methodname]#init()# method, configure the text field to contain a helpful input prompt
and add a text change listener to the field. The exact place of these lines is
not important, but add them, for example, after you have introduced the _layout_
object.
@@ -690,6 +709,10 @@ where you'll build the form UI programmatically in plain Java. If you already
completed the step using Vaadin Designer, you can proceed to
<<Connecting the form to the application>>.
+The following video shows how to create a form using plain Java:
+
+video::OA6-lSxiXO0[youtube, width="640", height="400"]
+
Start by creating a new Java class with the name CustomerForm. In Eclipse right
click on the "my.vaadin.app" package and choose menu:New[Class]. Type in the
name _CustomerForm_, define the superclass as _com.vaadin.ui.FormLayout_ and
@@ -863,6 +886,10 @@ In this part, we'll use the CustomerForm class, which we created in the
previous step, from the MyUI class. We will use it for both editing the existing
customers and creating new ones.
+The following video shows how to do this step of the tutorial:
+
+video::HuhhsI0GJNc[youtube, width="640", height="400"]
+
In the previous part, we already added the form to the _MyUI_ to see what it looks
like. By default, we want it to be invisible, so let's first hide it
by adding this line to the _init_ method of MyUI class:
diff --git a/pom.xml b/pom.xml
index 9d9f4d5738..c6059ad8af 100644
--- a/pom.xml
+++ b/pom.xml
@@ -185,6 +185,7 @@
<configuration>
<configLocation>../checkstyle/vaadin-checkstyle.xml</configLocation>
<headerLocation>../checkstyle/header</headerLocation>
+ <suppressionsLocation>../checkstyle/suppressions.xml</suppressionsLocation>
<encoding>UTF-8</encoding>
<consoleOutput>false</consoleOutput>
<failsOnError>false</failsOnError>
diff --git a/server/pom.xml b/server/pom.xml
index 6ea5ab87fc..fcd11f3a47 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -147,49 +147,10 @@
<!-- For manual testing with PostgreSQL (see SQLTestConstants) -->
<!-- <dependency><groupId>postgresql</groupId><artifactId>postgresql</artifactId><version>9.1-901.jdbc3</version></dependency> -->
-
- <!-- Needed GWT dependencies. Required parts are packaged to jar -->
- <dependency>
- <groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-user</artifactId>
- <version>${vaadin.gwt.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-elemental</artifactId>
- <version>${vaadin.gwt.version}</version>
- <scope>provided</scope>
- </dependency>
</dependencies>
<build>
<plugins>
- <!-- Copy needed GWT dependencies to package -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>unpack-dependencies</id>
- <phase>generate-resources</phase>
- <goals>
- <goal>unpack</goal>
- </goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-user</artifactId>
- </artifactItem>
- </artifactItems>
- <includes>com/google/gwt/*/server/**</includes>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
-
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
@@ -260,7 +221,7 @@
<configuration>
<instructions>
<Bundle-RequiredExecutionEnvironment>JavaSE-1.6</Bundle-RequiredExecutionEnvironment>
- <Export-Package>com.vaadin.*;version="${project.version}",com.google.*;version="${project.version}"</Export-Package>
+ <Export-Package>com.vaadin.*;version="${project.version}"</Export-Package>
<Import-Package>javax.servlet;version="${javax.servlet.version}",
javax.servlet.http;version="${javax.servlet.version}",
javax.validation;version="${javax.validation.version}";resolution:=optional,
diff --git a/server/src/main/java/com/vaadin/data/util/GeneratedPropertyContainer.java b/server/src/main/java/com/vaadin/data/util/GeneratedPropertyContainer.java
index ca33f8098d..1fbca5f817 100644
--- a/server/src/main/java/com/vaadin/data/util/GeneratedPropertyContainer.java
+++ b/server/src/main/java/com/vaadin/data/util/GeneratedPropertyContainer.java
@@ -122,9 +122,11 @@ public class GeneratedPropertyContainer extends AbstractContainer implements
}
/**
- * Item implementation for generated properties.
+ * Item implementation for generated properties, used to wrap the Item that
+ * belongs to the wrapped container. To reach that Item use
+ * {@link #getWrappedItem()}
*/
- protected class GeneratedPropertyItem implements Item {
+ public class GeneratedPropertyItem implements Item {
private Item wrappedItem;
private Object itemId;
@@ -198,6 +200,16 @@ public class GeneratedPropertyContainer extends AbstractContainer implements
private GeneratedPropertyContainer getContainer() {
return GeneratedPropertyContainer.this;
}
+
+ /**
+ * Returns the wrapped Item that belongs to the wrapped container
+ *
+ * @return wrapped item.
+ * @since 7.6.8
+ */
+ public Item getWrappedItem() {
+ return wrappedItem;
+ }
};
/**
diff --git a/server/src/main/java/com/vaadin/navigator/Navigator.java b/server/src/main/java/com/vaadin/navigator/Navigator.java
index 82e8de920a..1fb18adde1 100644
--- a/server/src/main/java/com/vaadin/navigator/Navigator.java
+++ b/server/src/main/java/com/vaadin/navigator/Navigator.java
@@ -41,6 +41,7 @@ import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.Page;
import com.vaadin.server.Page.UriFragmentChangedEvent;
import com.vaadin.server.Page.UriFragmentChangedListener;
+import com.vaadin.shared.util.SharedUtil;
import com.vaadin.ui.Component;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.CssLayout;
@@ -543,18 +544,11 @@ public class Navigator implements Serializable {
* and no error view is registered
*/
public void navigateTo(String navigationState) {
- String longestViewName = null;
- ViewProvider longestViewNameProvider = null;
+ ViewProvider longestViewNameProvider = getViewProvider(navigationState);
+ String longestViewName = longestViewNameProvider == null ? null
+ : longestViewNameProvider.getViewName(navigationState);
View viewWithLongestName = null;
- for (ViewProvider provider : providers) {
- String viewName = provider.getViewName(navigationState);
- if (null != viewName
- && (longestViewName == null || viewName.length() > longestViewName
- .length())) {
- longestViewName = viewName;
- longestViewNameProvider = provider;
- }
- }
+
if (longestViewName != null) {
viewWithLongestName = longestViewNameProvider
.getView(longestViewName);
@@ -564,19 +558,30 @@ public class Navigator implements Serializable {
longestViewName = errorProvider.getViewName(navigationState);
viewWithLongestName = errorProvider.getView(longestViewName);
}
- if (viewWithLongestName != null) {
- String parameters = "";
- if (navigationState.length() > longestViewName.length() + 1) {
- parameters = navigationState
- .substring(longestViewName.length() + 1);
- }
- navigateTo(viewWithLongestName, longestViewName, parameters);
- } else {
+
+ if (viewWithLongestName == null) {
throw new IllegalArgumentException(
"Trying to navigate to an unknown state '"
+ navigationState
+ "' and an error view provider not present");
}
+
+ String parameters = "";
+ if (navigationState.length() > longestViewName.length() + 1) {
+ parameters = navigationState
+ .substring(longestViewName.length() + 1);
+ } else if (navigationState.endsWith("/")) {
+ navigationState = navigationState.substring(0,
+ navigationState.length() - 1);
+ }
+ if (getCurrentView() == null
+ || !SharedUtil.equals(getCurrentView(), viewWithLongestName)
+ || !SharedUtil.equals(currentNavigationState, navigationState)) {
+ navigateTo(viewWithLongestName, longestViewName, parameters);
+ } else {
+ updateNavigationState(new ViewChangeEvent(this, getCurrentView(),
+ viewWithLongestName, longestViewName, parameters));
+ }
}
/**
@@ -675,8 +680,8 @@ public class Navigator implements Serializable {
}
if (!navigationState.equals(getStateManager().getState())) {
getStateManager().setState(navigationState);
- currentNavigationState = navigationState;
}
+ currentNavigationState = navigationState;
}
}
@@ -986,8 +991,33 @@ public class Navigator implements Serializable {
}
/**
- * Destroys the navigator and cleans it up. The method detaches the
- * navigator from UI and removes all view change listeners.
+ * Get view provider that handles the given {@code state}.
+ *
+ * @param state
+ * state string
+ * @return suitable provider
+ */
+ private ViewProvider getViewProvider(String state) {
+ String longestViewName = null;
+ ViewProvider longestViewNameProvider = null;
+ for (ViewProvider provider : providers) {
+ String viewName = provider.getViewName(state);
+ if (null != viewName
+ && (longestViewName == null || viewName.length() > longestViewName
+ .length())) {
+ longestViewName = viewName;
+ longestViewNameProvider = provider;
+ }
+ }
+ return longestViewNameProvider;
+ }
+
+ /**
+ * Creates view change event for given {@code view}, {@code viewName} and
+ * {@code parameters}.
+ *
+ * @since 7.6.7
+ * @return view change event
*/
public void destroy() {
stateManager.setNavigator(null);
diff --git a/server/src/main/java/com/vaadin/server/JsonPaintTarget.java b/server/src/main/java/com/vaadin/server/JsonPaintTarget.java
index 47c69f1a30..a885acccbc 100644
--- a/server/src/main/java/com/vaadin/server/JsonPaintTarget.java
+++ b/server/src/main/java/com/vaadin/server/JsonPaintTarget.java
@@ -158,7 +158,7 @@ public class JsonPaintTarget implements PaintTarget {
*
* @param tag
* the name of the end tag.
- * @throws Paintexception
+ * @throws PaintException
* if the paint operation failed.
*/
diff --git a/server/src/main/java/com/vaadin/server/KeyMapper.java b/server/src/main/java/com/vaadin/server/KeyMapper.java
index 709c3e0c2d..b858660b4b 100644
--- a/server/src/main/java/com/vaadin/server/KeyMapper.java
+++ b/server/src/main/java/com/vaadin/server/KeyMapper.java
@@ -97,7 +97,7 @@ public class KeyMapper<V> implements Serializable {
/**
* Checks if the given key is mapped to an object.
*
- * @since
+ * @since 7.7
*
* @param key
* the key to check
diff --git a/server/src/main/java/com/vaadin/server/VaadinServlet.java b/server/src/main/java/com/vaadin/server/VaadinServlet.java
index 75976f9c6e..eef3bcd8ee 100644
--- a/server/src/main/java/com/vaadin/server/VaadinServlet.java
+++ b/server/src/main/java/com/vaadin/server/VaadinServlet.java
@@ -979,7 +979,7 @@ public class VaadinServlet extends HttpServlet implements Constants {
* Finds the given resource from the web content folder or using the class
* loader.
*
- * @since
+ * @since 7.7
* @param filename
* The file to find, starting with a "/"
* @return The URL to the given file, or null if the file was not found
diff --git a/server/src/main/java/com/vaadin/server/communication/JSR356WebsocketInitializer.java b/server/src/main/java/com/vaadin/server/communication/JSR356WebsocketInitializer.java
index 6d2843a4fc..fc4dc53714 100644
--- a/server/src/main/java/com/vaadin/server/communication/JSR356WebsocketInitializer.java
+++ b/server/src/main/java/com/vaadin/server/communication/JSR356WebsocketInitializer.java
@@ -171,6 +171,20 @@ public class JSR356WebsocketInitializer implements ServletContextListener {
}
/**
+ * Checks if the given attribute name matches the convention used for
+ * storing AtmosphereFramework references.
+ *
+ * @param attributeName
+ * the attribute name to check
+ * @return <code>true</code> if the attribute name matches the convention,
+ * <code>false</code> otherwise
+ */
+ private static boolean isAtmosphereFrameworkAttribute(String attributeName) {
+ return attributeName.startsWith(JSR356WebsocketInitializer.class
+ .getName() + ".");
+ }
+
+ /**
* Tries to determine if the given servlet registration refers to a Vaadin
* servlet.
*
@@ -202,7 +216,23 @@ public class JSR356WebsocketInitializer implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
- // Nothing to do here
+ // Destroy any AtmosphereFramework instance we have initialized.
+ // This must be done here to ensure that we cleanup Atmosphere instances
+ // related to servlets which are never initialized
+ ServletContext servletContext = sce.getServletContext();
+ Enumeration<String> attributeNames = servletContext.getAttributeNames();
+ while (attributeNames.hasMoreElements()) {
+ String attributeName = attributeNames.nextElement();
+ if (isAtmosphereFrameworkAttribute(attributeName)) {
+ Object value = servletContext.getAttribute(attributeName);
+ if (value instanceof AtmosphereFramework) {
+ // This might result in calling destroy() twice, once from
+ // here and once from PushRequestHandler but
+ // AtmosphereFramework.destroy() deals with that
+ ((AtmosphereFramework) value).destroy();
+ }
+ }
+ }
}
}
diff --git a/server/src/main/java/com/vaadin/server/communication/data/RpcDataProviderExtension.java b/server/src/main/java/com/vaadin/server/communication/data/RpcDataProviderExtension.java
index 1b78ca4518..08c70c14cf 100644
--- a/server/src/main/java/com/vaadin/server/communication/data/RpcDataProviderExtension.java
+++ b/server/src/main/java/com/vaadin/server/communication/data/RpcDataProviderExtension.java
@@ -261,13 +261,13 @@ public class RpcDataProviderExtension extends AbstractExtension {
private boolean refreshCache = false;
/** Set of updated item ids */
- private Set<Object> updatedItemIds = new LinkedHashSet<Object>();
+ private transient Set<Object> updatedItemIds;
/**
* Queued RPC calls for adding and removing rows. Queue will be handled in
* {@link beforeClientResponse}
*/
- private List<Runnable> rowChanges = new ArrayList<Runnable>();
+ private transient List<Runnable> rowChanges;
/** Size possibly changed with a bare ItemSetChangeEvent */
private boolean bareItemSetTriggeredSizeChange = false;
@@ -334,22 +334,30 @@ public class RpcDataProviderExtension extends AbstractExtension {
pushRowData(0, numberOfRows, 0, 0);
} else {
// Only do row changes if not initial response.
- for (Runnable r : rowChanges) {
- r.run();
+ if (rowChanges != null) {
+ for (Runnable r : rowChanges) {
+ r.run();
+ }
}
// Send current rows again if needed.
if (refreshCache) {
- updatedItemIds.addAll(activeItemHandler.getActiveItemIds());
+ for (Object itemId : activeItemHandler.getActiveItemIds()) {
+ updateRowData(itemId);
+ }
}
}
internalUpdateRows(updatedItemIds);
// Clear all changes.
- rowChanges.clear();
+ if (rowChanges != null) {
+ rowChanges.clear();
+ }
+ if (updatedItemIds != null) {
+ updatedItemIds.clear();
+ }
refreshCache = false;
- updatedItemIds.clear();
bareItemSetTriggeredSizeChange = false;
super.beforeClientResponse(initial);
@@ -446,6 +454,10 @@ public class RpcDataProviderExtension extends AbstractExtension {
* the number of rows inserted at <code>index</code>
*/
private void insertRowData(final int index, final int count) {
+ if (rowChanges == null) {
+ rowChanges = new ArrayList<Runnable>();
+ }
+
if (rowChanges.isEmpty()) {
markAsDirty();
}
@@ -475,6 +487,10 @@ public class RpcDataProviderExtension extends AbstractExtension {
* the item id of the first removed item
*/
private void removeRowData(final int index, final int count) {
+ if (rowChanges == null) {
+ rowChanges = new ArrayList<Runnable>();
+ }
+
if (rowChanges.isEmpty()) {
markAsDirty();
}
@@ -496,6 +512,10 @@ public class RpcDataProviderExtension extends AbstractExtension {
* the item Id the row that was updated
*/
public void updateRowData(Object itemId) {
+ if (updatedItemIds == null) {
+ updatedItemIds = new LinkedHashSet<Object>();
+ }
+
if (updatedItemIds.isEmpty()) {
// At least one new item will be updated. Mark as dirty to actually
// update before response to client.
@@ -506,7 +526,7 @@ public class RpcDataProviderExtension extends AbstractExtension {
}
private void internalUpdateRows(Set<Object> itemIds) {
- if (itemIds.isEmpty()) {
+ if (itemIds == null || itemIds.isEmpty()) {
return;
}
diff --git a/server/src/main/java/com/vaadin/ui/AbstractField.java b/server/src/main/java/com/vaadin/ui/AbstractField.java
index e69322b1cc..49eb5b050f 100644
--- a/server/src/main/java/com/vaadin/ui/AbstractField.java
+++ b/server/src/main/java/com/vaadin/ui/AbstractField.java
@@ -507,7 +507,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements
// Repaint is needed even when the client thinks that it knows the
// new state if validity of the component may change
if (repaintIsNotNeeded
- && (isRequired() || getValidators() != null || getConverter() != null)) {
+ && (isRequired() || hasValidators() || getConverter() != null)) {
repaintIsNotNeeded = false;
}
@@ -885,6 +885,10 @@ public abstract class AbstractField<T> extends AbstractComponent implements
}
}
+ private boolean hasValidators() {
+ return validators != null && !validators.isEmpty();
+ }
+
/**
* Removes the validator from the field.
*
diff --git a/server/src/main/java/com/vaadin/ui/ComboBox.java b/server/src/main/java/com/vaadin/ui/ComboBox.java
index b632cb0d8d..562173a9bf 100644
--- a/server/src/main/java/com/vaadin/ui/ComboBox.java
+++ b/server/src/main/java/com/vaadin/ui/ComboBox.java
@@ -121,6 +121,8 @@ public class ComboBox extends AbstractSelect implements
*/
private boolean scrollToSelectedItem = true;
+ private String suggestionPopupWidth = null;
+
/**
* If text input is not allowed, the ComboBox behaves like a pretty
* NativeSelect - the user can not enter any text and clicking the text
@@ -170,7 +172,7 @@ public class ComboBox extends AbstractSelect implements
/**
* Sets the input prompt - a textual prompt that is displayed when the
* select would otherwise be empty, to prompt the user for input.
- *
+ *
* @param inputPrompt
* the desired input prompt, or null to disable
*/
@@ -230,6 +232,11 @@ public class ComboBox extends AbstractSelect implements
target.addAttribute("pagelength", pageLength);
+ if (suggestionPopupWidth != null) {
+ target.addAttribute("suggestionPopupWidth",
+ suggestionPopupWidth);
+ }
+
target.addAttribute("filteringmode", getFilteringMode().toString());
// Paints the options and create array of selected id keys
@@ -875,6 +882,16 @@ public class ComboBox extends AbstractSelect implements
}
/**
+ * Returns the suggestion pop-up's width as a CSS string.
+ *
+ * @see #setPopupWidth
+ * @since 7.7
+ */
+ public String getPopupWidth() {
+ return suggestionPopupWidth;
+ }
+
+ /**
* Sets the page length for the suggestion popup. Setting the page length to
* 0 will disable suggestion popup paging (all items visible).
*
@@ -887,6 +904,20 @@ public class ComboBox extends AbstractSelect implements
}
/**
+ * Sets the suggestion pop-up's width as a CSS string. By using relative
+ * units (e.g. "50%") it's possible to set the popup's width relative to the
+ * ComboBox itself.
+ *
+ * @see #getPopupWidth()
+ * @since 7.7
+ * @param width the width
+ */
+ public void setPopupWidth(String width) {
+ suggestionPopupWidth = width;
+ markAsDirty();
+ }
+
+ /**
* Sets whether to scroll the selected item visible (directly open the page
* on which it is) when opening the combo box popup or not. Only applies to
* single select mode.
diff --git a/server/src/main/java/com/vaadin/ui/LoginForm.java b/server/src/main/java/com/vaadin/ui/LoginForm.java
index 1f0e3fc3b3..9df5f7343e 100644
--- a/server/src/main/java/com/vaadin/ui/LoginForm.java
+++ b/server/src/main/java/com/vaadin/ui/LoginForm.java
@@ -13,181 +13,48 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.vaadin.ui;
-import java.io.IOException;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
-import com.vaadin.server.ConnectorResource;
-import com.vaadin.server.ExternalResource;
-import com.vaadin.server.VaadinRequest;
-import com.vaadin.server.VaadinResponse;
-import com.vaadin.server.VaadinService;
-import com.vaadin.server.VaadinServletService;
-import com.vaadin.shared.ApplicationConstants;
+import com.vaadin.server.StreamResource;
+import com.vaadin.shared.ui.loginform.LoginFormConstants;
+import com.vaadin.shared.ui.loginform.LoginFormRpc;
+import com.vaadin.shared.ui.loginform.LoginFormState;
/**
- * LoginForm is a Vaadin component to handle common problem among Ajax
- * applications: browsers password managers don't fill dynamically created forms
- * like all those UI elements created by Vaadin.
+ * Login form with auto-completion and auto-fill for all major browsers. You can
+ * derive from this class and implement the
+ * {@link #createContent(com.vaadin.ui.TextField, com.vaadin.ui.PasswordField, com.vaadin.ui.Button)}
+ * method to build the layout using the text fields and login button that are
+ * passed to that method. The supplied components are specially treated so that
+ * they work with password managers.
* <p>
- * For developer it is easy to use: add component to a desired place in you UI
- * and add LoginListener to validate form input. Behind the curtain LoginForm
- * creates an iframe with static html that browsers detect.
+ * If you need to change the URL as part of the login procedure, call
+ * {@link #setLoginMode(LoginMode)} with the argument {@link LoginMode#DEFERRED}
+ * in your implementation of
+ * {@link #createContent(com.vaadin.ui.TextField, com.vaadin.ui.PasswordField, com.vaadin.ui.Button)
+ * createContent}.
* <p>
- * Login form is by default 100% width and height, so consider using it inside a
- * sized {@link Panel} or {@link Window}.
+ * To customize the fields or to replace them with your own implementations, you
+ * can override {@link #createUsernameField()}, {@link #createPasswordField()}
+ * and {@link #createLoginButton()}. These methods are called automatically and
+ * cannot be called by your code. Captions can be reset by overriding
+ * {@link #getUsernameFieldCaption()}, {@link #getPasswordFieldCaption()} and
+ * {@link #getLoginButtonCaption()}.
* <p>
- * Login page html can be overridden by replacing protected getLoginHTML method.
- * As the login page is actually an iframe, styles must be handled manually. By
- * default component tries to guess the right place for theme css.
- *
+ * Note that the API of LoginForm changed significantly in Vaadin 7.7.
+ *
* @since 5.3
- * @deprecated As of 7.0. This component no longer fulfills its duty reliably in
- * the supported browsers and a {@link VerticalLayout} with two
- * {@link TextField}s can be used instead.
*/
-@Deprecated
-public class LoginForm extends CustomComponent {
-
- private String usernameCaption = "Username";
- private String passwordCaption = "Password";
- private String loginButtonCaption = "Login";
-
- private Embedded iframe = new Embedded();
-
- @Override
- public boolean handleConnectorRequest(final VaadinRequest request,
- final VaadinResponse response, String path) throws IOException {
- if (!path.equals("login")) {
- return super.handleConnectorRequest(request, response, path);
- }
- final StringBuilder responseBuilder = new StringBuilder();
-
- getUI().accessSynchronously(new Runnable() {
- @Override
- public void run() {
- String method = VaadinServletService.getCurrentServletRequest()
- .getMethod();
- if (method.equalsIgnoreCase("post")) {
- responseBuilder.append(handleLogin(request));
- } else {
- responseBuilder.append(getLoginHTML());
- }
- }
- });
-
- if (responseBuilder.length() > 0) {
- response.setContentType("text/html; charset=utf-8");
- response.setCacheTime(-1);
- response.getWriter().write(responseBuilder.toString());
- return true;
- } else {
- return false;
- }
- }
-
- private String handleLogin(VaadinRequest request) {
- // Ensure UI.getCurrent() works in listeners
-
- Map<String, String[]> parameters = VaadinService.getCurrentRequest()
- .getParameterMap();
-
- HashMap<String, String> params = new HashMap<String, String>();
- // expecting single params
- for (Iterator<String> it = parameters.keySet().iterator(); it.hasNext();) {
- String key = it.next();
- String value = (parameters.get(key))[0];
- params.put(key, value);
- }
- LoginEvent event = new LoginEvent(LoginForm.this, params);
- fireEvent(event);
-
- return "<html><body>Login form handled."
- + "<script type='text/javascript'>parent.parent.vaadin.forceSync();"
- + "</script></body></html>";
- }
-
- public LoginForm() {
- iframe.setType(Embedded.TYPE_BROWSER);
- iframe.setSizeFull();
- setSizeFull();
- setCompositionRoot(iframe);
- addStyleName("v-loginform");
- }
-
- @Override
- public void beforeClientResponse(boolean initial) {
- // Generate magic URL now when UI id and connectorId are known
- iframe.setSource(new ExternalResource(
- ApplicationConstants.APP_PROTOCOL_PREFIX
- + ApplicationConstants.APP_PATH + '/'
- + ConnectorResource.CONNECTOR_PATH + '/'
- + getUI().getUIId() + '/' + getConnectorId() + "/login"));
- super.beforeClientResponse(initial);
- }
-
- /**
- * Returns byte array containing login page html. If you need to override
- * the login html, use the default html as basis. Login page sets its target
- * with javascript.
- *
- * @return byte array containing login page html
- */
- protected String getLoginHTML() {
- return "<!DOCTYPE html>\n"
- + "<html>"
- + "<head><script type='text/javascript'>"
- + "var setTarget = function() {"
- + "var uri = window.location;"
- + "var f = document.getElementById('loginf');"
- + "document.forms[0].action = uri;document.forms[0].username.focus();};"
- + ""
- + "var styles = window.parent.document.styleSheets;"
- + "for(var j = 0; j < styles.length; j++) {\n"
- + "if(styles[j].href) {"
- + "var stylesheet = document.createElement('link');\n"
- + "stylesheet.setAttribute('rel', 'stylesheet');\n"
- + "stylesheet.setAttribute('type', 'text/css');\n"
- + "stylesheet.setAttribute('href', styles[j].href);\n"
- + "document.getElementsByTagName('head')[0].appendChild(stylesheet);\n"
- + "}"
- + "}\n"
- + "function submitOnEnter(e) { var keycode = e.keyCode || e.which;"
- + " if (keycode == 13) {document.forms[0].submit();} } \n"
- + "</script>"
- + "</head><body onload='setTarget();' style='margin:0;padding:0; background:transparent;' class=\""
- + ApplicationConstants.GENERATED_BODY_CLASSNAME
- + "\">"
- + "<div class='v-app v-app-loginpage "
- + getUIThemeClassName()
- + "' style=\"background:transparent;\">"
- + "<iframe name='logintarget' style='width:0;height:0;"
- + "border:0;margin:0;padding:0;display:block'></iframe>"
- + "<form id='loginf' target='logintarget' onkeypress=\"submitOnEnter(event)\" method=\"post\">"
- + "<div>"
- + usernameCaption
- + "</div><div >"
- + "<input class='v-textfield v-widget' style='display:block;' type='text' name='username'></div>"
- + "<div>"
- + passwordCaption
- + "</div>"
- + "<div><input class='v-textfield v-widget' style='display:block;' type='password' name='password'></div>"
- + "<div><div onclick=\"document.forms[0].submit();\" tabindex=\"0\" class=\"v-button\" role=\"button\" ><span class=\"v-button-wrap\"><span class=\"v-button-caption\">"
- + loginButtonCaption
- + "</span></span></div></div></form></div>" + "</body></html>";
- }
-
- private String getUIThemeClassName() {
- if (getUI() != null) {
- return getUI().getTheme();
- }
- return "";
- }
+public class LoginForm extends AbstractSingleComponentContainer {
/**
* This event is sent when login form is submitted.
@@ -225,14 +92,28 @@ public class LoginForm extends CustomComponent {
* This method is fired on each login form post.
*
* @param event
+ * Login event
*/
- public void onLogin(LoginForm.LoginEvent event);
+ public void onLogin(LoginEvent event);
}
- private static final Method ON_LOGIN_METHOD;
+ /**
+ * Internal stream source for the login URL - always returns "Success" and
+ * ignores the values received.
+ */
+ private static class LoginStreamSource implements StreamResource.StreamSource {
+ @Override
+ public InputStream getStream() {
+ try {
+ return new ByteArrayInputStream("<html>Success</html>".toString().getBytes(
+ "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ return null;
+ }
+
+ }
+ }
- private static final String UNDEFINED_HEIGHT = "140px";
- private static final String UNDEFINED_WIDTH = "200px";
static {
try {
@@ -245,121 +126,268 @@ public class LoginForm extends CustomComponent {
}
}
+ private static final Method ON_LOGIN_METHOD;
+
+ private boolean initialized;
+
+ private String usernameCaption = "Username";
+ private String passwordCaption = "Password";
+ private String loginButtonCaption = "Login";
+
/**
- * Adds LoginListener to handle login logic
+ * Customize the user name field. Only for overriding, do not call.
*
- * @param listener
+ * @return the user name field
+ * @since 7.7
*/
- public void addLoginListener(LoginListener listener) {
- addListener(LoginEvent.class, listener, ON_LOGIN_METHOD);
+ protected TextField createUsernameField() {
+ checkInitialized();
+ TextField field = new TextField(getUsernameCaption());
+ field.focus();
+ return field;
}
/**
- * @deprecated As of 7.0, replaced by
- * {@link #addLoginListener(LoginListener)}
- **/
- @Deprecated
- public void addListener(LoginListener listener) {
- addLoginListener(listener);
+ * Returns the caption set with {@link #setUsernameCaption(String)}. Note
+ * that this method might not match what is shown to the user if
+ * {@link #createUsernameField()} has been overridden.
+ *
+ * @return user name field caption
+ */
+ public String getUsernameCaption() {
+ return usernameCaption;
}
/**
- * Removes LoginListener
+ * Set the caption of the user name field. Note that the caption can only be
+ * set with this method before the login form has been initialized
+ * (attached).
+ * <p>
+ * As an alternative to calling this method, the method
+ * {@link #createUsernameField()} can be overridden.
*
- * @param listener
+ * @param cap
+ * new caption
*/
- public void removeLoginListener(LoginListener listener) {
- removeListener(LoginEvent.class, listener, ON_LOGIN_METHOD);
+ public void setUsernameCaption(String cap) {
+ usernameCaption = cap;
}
/**
- * @deprecated As of 7.0, replaced by
- * {@link #removeLoginListener(LoginListener)}
- **/
- @Deprecated
- public void removeListener(LoginListener listener) {
- removeLoginListener(listener);
+ * Customize the password field. Only for overriding, do not call.
+ *
+ * @return the password field
+ * @since 7.7
+ */
+ protected PasswordField createPasswordField() {
+ checkInitialized();
+ return new PasswordField(getPasswordCaption());
}
- @Override
- public void setWidth(float width, Unit unit) {
- super.setWidth(width, unit);
- if (iframe != null) {
- if (width < 0) {
- iframe.setWidth(UNDEFINED_WIDTH);
- } else {
- iframe.setWidth("100%");
- }
- }
+ /**
+ * Returns the caption set with {@link #setPasswordCaption(String)}. Note
+ * that this method might not match what is shown to the user if
+ * {@link #createPasswordField()} has been overridden.
+ *
+ * @return password field caption
+ */
+ public String getPasswordCaption() {
+ return passwordCaption;
}
- @Override
- public void setHeight(float height, Unit unit) {
- super.setHeight(height, unit);
- if (iframe != null) {
- if (height < 0) {
- iframe.setHeight(UNDEFINED_HEIGHT);
- } else {
- iframe.setHeight("100%");
- }
- }
+ /**
+ * Set the caption of the password field. Note that the caption can only be
+ * set with this method before the login form has been initialized
+ * (attached).
+ * <p>
+ * As an alternative to calling this method, the method
+ * {@link #createPasswordField()} can be overridden.
+ *
+ * @param cap new caption
+ */
+ public void setPasswordCaption(String cap) {
+ passwordCaption = cap;
+ ;
}
/**
- * Returns the caption for the user name field.
+ * Customize the login button. Only for overriding, do not call.
*
- * @return String
+ * @return the login button
+ * @since 7.7
*/
- public String getUsernameCaption() {
- return usernameCaption;
+ protected Button createLoginButton() {
+ checkInitialized();
+ return new Button(getLoginButtonCaption());
}
/**
- * Sets the caption to show for the user name field. The caption cannot be
- * changed after the form has been shown to the user.
+ * Returns the caption set with {@link #setLoginButtonCaption(String)}. Note
+ * that this method might not match what is shown to the user if
+ * {@link #createLoginButton()} has been overridden.
*
- * @param usernameCaption
+ * @return login button caption
*/
- public void setUsernameCaption(String usernameCaption) {
- this.usernameCaption = usernameCaption;
+ public String getLoginButtonCaption() {
+ return loginButtonCaption;
}
/**
- * Returns the caption for the password field.
+ * Set the caption of the login button. Note that the caption can only be
+ * set with this method before the login form has been initialized
+ * (attached).
+ * <p>
+ * As an alternative to calling this method, the method
+ * {@link #createLoginButton()} can be overridden.
*
- * @return String
+ * @param cap new caption
*/
- public String getPasswordCaption() {
- return passwordCaption;
+ public void setLoginButtonCaption(String cap) {
+ loginButtonCaption = cap;
+ }
+
+ @Override
+ protected LoginFormState getState() {
+ return (LoginFormState) super.getState();
+ }
+
+ @Override
+ public void attach() {
+ super.attach();
+ init();
+ }
+
+ private void checkInitialized() {
+ if (initialized) {
+ throw new IllegalStateException(
+ "Already initialized. The create methods may not be called explicitly.");
+ }
}
/**
- * Sets the caption to show for the password field. The caption cannot be
- * changed after the form has been shown to the user.
+ * Create the content for the login form with the supplied user name field,
+ * password field and the login button. You cannot use any other text fields
+ * or buttons for this purpose. To replace these components with your own
+ * implementations, override {@link #createUsernameField()},
+ * {@link #createPasswordField()} and {@link #createLoginButton()}. If you
+ * only want to change the default captions, override
+ * {@link #getUsernameFieldCaption()}, {@link #getPasswordFieldCaption()}
+ * and {@link #getLoginButtonCaption()}. You do not have to use the login
+ * button in your layout.
*
- * @param passwordCaption
+ * @param userNameField
+ * the user name text field
+ * @param passwordField
+ * the password field
+ * @param loginButton
+ * the login button
+ * @return content component
+ * @since 7.7
*/
- public void setPasswordCaption(String passwordCaption) {
- this.passwordCaption = passwordCaption;
+ protected Component createContent(TextField userNameField,
+ PasswordField passwordField, Button loginButton) {
+ VerticalLayout layout = new VerticalLayout();
+ layout.setSpacing(true);
+ layout.setMargin(true);
+ layout.addComponent(userNameField);
+ layout.addComponent(passwordField);
+ layout.addComponent(loginButton);
+ return layout;
+ }
+
+ private void init() {
+ if (initialized) {
+ return;
+ }
+
+ LoginFormState state = getState();
+ state.userNameFieldConnector = createUsernameField();
+ state.passwordFieldConnector = createPasswordField();
+ state.loginButtonConnector = createLoginButton();
+
+ StreamResource resource = new StreamResource(new LoginStreamSource(),
+ LoginFormConstants.LOGIN_RESOURCE_NAME);
+ resource.setMIMEType("text/html; charset=utf-8");
+ resource.setCacheTime(-1);
+ setResource(LoginFormConstants.LOGIN_RESOURCE_NAME, resource);
+
+ registerRpc(new LoginFormRpc() {
+ @Override
+ public void submitCompleted() {
+ login();
+ }
+ });
+
+ initialized = true;
+
+ setContent(createContent(getUsernameField(), getPasswordField(),
+ getLoginButton()));
+ }
+
+ private TextField getUsernameField() {
+ return (TextField) getState().userNameFieldConnector;
+ }
+
+ private PasswordField getPasswordField() {
+ return (PasswordField) getState().passwordFieldConnector;
+ }
+
+ private Button getLoginButton() {
+ return (Button) getState().loginButtonConnector;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * Handle the login. In deferred mode, this method is called after the dummy
+ * POST request that triggers the password manager has been completed. In
+ * direct mode (the default setting), it is called directly when the user
+ * hits the enter key or clicks on the login button. In the latter case, you
+ * cannot change the URL in the method or the password manager will not be
+ * triggered.
+ */
+ private void login() {
+ HashMap<String, String> params = new HashMap<String, String>();
+ params.put("username", getUsernameField().getValue());
+ params.put("password", getPasswordField().getValue());
+ LoginEvent event = new LoginEvent(LoginForm.this, params);
+ fireEvent(event);
}
/**
- * Returns the caption for the login button.
+ * Adds LoginListener to handle login logic
*
- * @return String
+ * @param listener
*/
- public String getLoginButtonCaption() {
- return loginButtonCaption;
+ public void addLoginListener(LoginListener listener) {
+ addListener(LoginEvent.class, listener, ON_LOGIN_METHOD);
+ }
+
+ /**
+ * @deprecated As of 7.0, replaced by
+ * {@link #addLoginListener(LoginListener)}
+ **/
+ @Deprecated
+ public void addListener(LoginListener listener) {
+ addLoginListener(listener);
}
/**
- * Sets the caption (button text) to show for the login button. The caption
- * cannot be changed after the form has been shown to the user.
+ * Removes LoginListener
*
- * @param loginButtonCaption
+ * @param listener
*/
- public void setLoginButtonCaption(String loginButtonCaption) {
- this.loginButtonCaption = loginButtonCaption;
+ public void removeLoginListener(LoginListener listener) {
+ removeListener(LoginEvent.class, listener, ON_LOGIN_METHOD);
+ }
+
+ /**
+ * @deprecated As of 7.0, replaced by
+ * {@link #removeLoginListener(LoginListener)}
+ **/
+ @Deprecated
+ public void removeListener(LoginListener listener) {
+ removeLoginListener(listener);
}
}
diff --git a/server/src/main/java/com/vaadin/ui/UI.java b/server/src/main/java/com/vaadin/ui/UI.java
index c429b64491..0a0cd46816 100644
--- a/server/src/main/java/com/vaadin/ui/UI.java
+++ b/server/src/main/java/com/vaadin/ui/UI.java
@@ -179,6 +179,11 @@ public abstract class UI extends AbstractSingleComponentContainer implements
public void poll() {
fireEvent(new PollEvent(UI.this));
}
+
+ @Override
+ public void acknowledge() {
+ // Nothing to do, just need the message to be sent and processed
+ }
};
private DebugWindowServerRpc debugRpc = new DebugWindowServerRpc() {
@Override
diff --git a/server/src/main/java/com/vaadin/ui/declarative/Design.java b/server/src/main/java/com/vaadin/ui/declarative/Design.java
index 5ce1f5dc60..a12cd65557 100644
--- a/server/src/main/java/com/vaadin/ui/declarative/Design.java
+++ b/server/src/main/java/com/vaadin/ui/declarative/Design.java
@@ -22,6 +22,7 @@ import java.io.OutputStream;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.util.Collection;
+import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -146,9 +147,24 @@ public class Design implements Serializable {
@Override
public Component createComponent(String fullyQualifiedClassName,
DesignContext context) {
- Class<? extends Component> componentClass = resolveComponentClass(
- fullyQualifiedClassName, context);
+ Class<? extends Component> componentClass;
+ try {
+ componentClass = resolveComponentClass(fullyQualifiedClassName,
+ context);
+ } catch (DesignException e) {
+ // Try with an inner class.
+ int lastDot = fullyQualifiedClassName.lastIndexOf('.');
+ if (lastDot != -1) {
+ String qualifiedInnerClassName = fullyQualifiedClassName
+ .substring(0, lastDot)
+ + "$"
+ + fullyQualifiedClassName.substring(lastDot + 1);
+ return createComponent(qualifiedInnerClassName, context);
+ } else {
+ throw e;
+ }
+ }
assert Component.class.isAssignableFrom(componentClass) : "resolveComponentClass returned "
+ componentClass + " which is not a Vaadin Component class";
@@ -234,10 +250,11 @@ public class Design implements Serializable {
@Override
public String componentToTag(Component component, DesignContext context) {
Class<?> componentClass = component.getClass();
- String packageName = componentClass.getPackage().getName();
+ String packageName = getPackageName(componentClass);
String prefix = context.getPackagePrefix(packageName);
if (prefix == null) {
- prefix = packageName.replace('.', '_');
+ prefix = packageName.replace('.', '_').toLowerCase(
+ Locale.ENGLISH);
context.addPackagePrefix(prefix, packageName);
}
prefix = prefix + "-";
@@ -248,6 +265,16 @@ public class Design implements Serializable {
return tagName;
}
+ private String getPackageName(Class<?> componentClass) {
+ if (componentClass.isMemberClass()) {
+ Class<?> enclosingClass = componentClass.getEnclosingClass();
+ return getPackageName(enclosingClass) + "."
+ + enclosingClass.getSimpleName();
+ } else {
+ return componentClass.getPackage().getName();
+ }
+ }
+
/**
* Creates the name of the html tag corresponding to the given class
* name. The name is derived by converting each uppercase letter to
diff --git a/server/src/test/java/com/vaadin/data/util/GeneratedPropertyContainerTest.java b/server/src/test/java/com/vaadin/data/util/GeneratedPropertyContainerTest.java
index bfa77eab52..b08437a953 100644
--- a/server/src/test/java/com/vaadin/data/util/GeneratedPropertyContainerTest.java
+++ b/server/src/test/java/com/vaadin/data/util/GeneratedPropertyContainerTest.java
@@ -31,6 +31,7 @@ import com.vaadin.data.Container.PropertySetChangeEvent;
import com.vaadin.data.Container.PropertySetChangeListener;
import com.vaadin.data.Item;
import com.vaadin.data.sort.SortOrder;
+import com.vaadin.data.util.GeneratedPropertyContainer.GeneratedPropertyItem;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.UnsupportedFilterException;
@@ -285,6 +286,15 @@ public class GeneratedPropertyContainerTest {
.getContainerPropertyIds().contains("foo"));
}
+ @Test
+ public void testGetWrappedItem() {
+ Object itemId = wrappedContainer.getItemIds().iterator().next();
+ Item wrappedItem = wrappedContainer.getItem(itemId);
+ GeneratedPropertyItem generatedPropertyItem = (GeneratedPropertyItem) container
+ .getItem(itemId);
+ assertEquals(wrappedItem, generatedPropertyItem.getWrappedItem());
+ }
+
private Indexed createContainer() {
wrappedContainer = new IndexedContainer();
wrappedContainer.addContainerProperty("foo", String.class, "foo");
diff --git a/server/src/test/java/com/vaadin/tests/design/DesignFormatterTest.java b/server/src/test/java/com/vaadin/tests/design/DesignFormatterTest.java
index e62d5c17c8..2086e2ffeb 100644
--- a/server/src/test/java/com/vaadin/tests/design/DesignFormatterTest.java
+++ b/server/src/test/java/com/vaadin/tests/design/DesignFormatterTest.java
@@ -193,7 +193,8 @@ public class DesignFormatterTest {
Date result = formatter.parse(formatted, Date.class);
// writing will always give full date string
- assertEquals("2012-02-17 00:00:00+0200", formatted);
+ String timeZone = new SimpleDateFormat("Z").format(date);
+ assertEquals("2012-02-17 00:00:00" + timeZone, formatted);
assertEquals(date, result);
// try short date as well
diff --git a/server/src/test/java/com/vaadin/tests/design/InnerClassDesignReadWriteTest.java b/server/src/test/java/com/vaadin/tests/design/InnerClassDesignReadWriteTest.java
new file mode 100644
index 0000000000..e42a89e98d
--- /dev/null
+++ b/server/src/test/java/com/vaadin/tests/design/InnerClassDesignReadWriteTest.java
@@ -0,0 +1,38 @@
+package com.vaadin.tests.design;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.vaadin.tests.design.InnerClassDesignReadWriteTest.Foo.StaticInnerInner;
+import com.vaadin.tests.design.UPPERCASE.InUpperCasePackage;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.declarative.Design;
+
+public class InnerClassDesignReadWriteTest {
+ @Test
+ public void testWritingAndReadingBackInnerClass() throws IOException {
+ VerticalLayout vl = new VerticalLayout();
+ vl.addComponent(new StaticInner());
+ vl.addComponent(new StaticInnerInner());
+ vl.addComponent(new InUpperCasePackage());
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ Design.write(vl, baos);
+ Design.read(new ByteArrayInputStream(baos.toByteArray()));
+ }
+
+ public static class StaticInner extends GridLayout {
+ }
+
+ public static class Foo {
+ public static class StaticInnerInner extends HorizontalLayout {
+
+ }
+ }
+
+}
diff --git a/server/src/test/java/com/vaadin/tests/design/UPPERCASE/InUpperCasePackage.java b/server/src/test/java/com/vaadin/tests/design/UPPERCASE/InUpperCasePackage.java
new file mode 100644
index 0000000000..255581d9f3
--- /dev/null
+++ b/server/src/test/java/com/vaadin/tests/design/UPPERCASE/InUpperCasePackage.java
@@ -0,0 +1,7 @@
+package com.vaadin.tests.design.UPPERCASE;
+
+import com.vaadin.ui.VerticalLayout;
+
+public class InUpperCasePackage extends VerticalLayout {
+
+} \ No newline at end of file
diff --git a/server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java b/server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java
index 54ac9a3a4b..dc6db3bfe6 100644
--- a/server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java
+++ b/server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java
@@ -15,6 +15,7 @@
*/
package com.vaadin.tests.server.component.datefield;
+import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
@@ -26,9 +27,9 @@ import com.vaadin.ui.DateField;
/**
* Tests the declarative support for implementations of {@link DateField}.
- *
- * @since 7.4
+ *
* @author Vaadin Ltd
+ * @since 7.4
*/
public class DateFieldDeclarativeTest extends DeclarativeTestBase<DateField> {
@@ -44,7 +45,8 @@ public class DateFieldDeclarativeTest extends DeclarativeTestBase<DateField> {
}
private String getTimezoneDesign() {
- return "<vaadin-date-field range-start=\"2014-05-05 00:00:00+0300\" range-end=\"2014-06-05 00:00:00+0300\" date-out-of-range-message=\"Please select a sensible date\" date-format=\"yyyy-MM-dd\" lenient show-iso-week-numbers parse-error-message=\"You are doing it wrong\" time-zone=\"GMT+05:00\" value=\"2014-05-15 00:00:00+0300\"/>";
+ String timeZone = new SimpleDateFormat("Z").format(new Date());
+ return String.format("<vaadin-date-field range-start=\"2014-05-05 00:00:00%1$s\" range-end=\"2014-06-05 00:00:00%1$s\" date-out-of-range-message=\"Please select a sensible date\" date-format=\"yyyy-MM-dd\" lenient show-iso-week-numbers parse-error-message=\"You are doing it wrong\" time-zone=\"GMT+05:00\" value=\"2014-05-15 00:00:00%1$s\"/>" ,timeZone);
}
private DateField getTimezoneExpected() {
@@ -82,18 +84,21 @@ public class DateFieldDeclarativeTest extends DeclarativeTestBase<DateField> {
@Test
public void writeYearResolution() {
// Writing is always done in full resolution..
+ String timeZone = new SimpleDateFormat("Z").format(new Date(2020 - 1900, 1 - 1, 1));
testWrite(
- getYearResolutionDesign().replace("2020",
- "2020-01-01 00:00:00+0200"),
- getYearResolutionExpected());
+ getYearResolutionDesign().replace("2020",
+ "2020-01-01 00:00:00" + timeZone),
+ getYearResolutionExpected());
}
@Test
public void testReadOnlyValue() {
- String design = "<vaadin-date-field readonly resolution='year' value='2020-01-01 00:00:00+0200'/>";
+ Date date = new Date(2020 - 1900, 1 - 1, 1);
+ String timeZone = new SimpleDateFormat("Z").format(date);
+ String design = "<vaadin-date-field readonly resolution='year' value='2020-01-01 00:00:00" + timeZone + "'/>";
DateField df = new DateField();
df.setResolution(Resolution.YEAR);
- df.setValue(new Date(2020 - 1900, 1 - 1, 1));
+ df.setValue(date);
df.setReadOnly(true);
testRead(design, df);
diff --git a/server/src/test/java/com/vaadin/tests/server/component/grid/GridContainerTest.java b/server/src/test/java/com/vaadin/tests/server/component/grid/GridContainerTest.java
index 079487d01f..c5747e4073 100644
--- a/server/src/test/java/com/vaadin/tests/server/component/grid/GridContainerTest.java
+++ b/server/src/test/java/com/vaadin/tests/server/component/grid/GridContainerTest.java
@@ -15,18 +15,36 @@
*/
package com.vaadin.tests.server.component.grid;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+
import org.junit.Assert;
import org.junit.Test;
import com.vaadin.data.util.IndexedContainer;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.server.communication.data.RpcDataProviderExtension;
import com.vaadin.ui.Component;
+import com.vaadin.ui.ConnectorTracker;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Grid.DetailsGenerator;
import com.vaadin.ui.Grid.RowReference;
import com.vaadin.ui.Label;
+import com.vaadin.ui.UI;
public class GridContainerTest {
+ /**
+ * Null Stream used with serialization tests
+ */
+ protected static OutputStream NULLSTREAM = new OutputStream() {
+ @Override
+ public void write(int b) {
+ }
+ };
+
@Test
public void testDetailsGeneratorDoesNotResetOnContainerChange() {
Grid grid = new Grid();
@@ -119,4 +137,25 @@ public class GridContainerTest {
grid.addColumn("foo");
grid.addColumn("foo");
}
+
+ @Test
+ public void testSerializeRpcDataProviderWithRowChanges() throws IOException {
+ Grid grid = new Grid();
+ IndexedContainer container = new IndexedContainer();
+ grid.setContainerDataSource(container);
+ container.addItem();
+ serializeComponent(grid);
+ }
+
+ protected void serializeComponent(Component component) throws IOException {
+ ObjectOutputStream stream = null;
+ try {
+ stream = new ObjectOutputStream(NULLSTREAM);
+ stream.writeObject(component);
+ } finally {
+ if (stream != null) {
+ stream.close();
+ }
+ }
+ }
}
diff --git a/server/src/test/java/com/vaadin/tests/server/navigator/NavigatorTest.java b/server/src/test/java/com/vaadin/tests/server/navigator/NavigatorTest.java
index 0eda1ed045..3b7ad0ae00 100644
--- a/server/src/test/java/com/vaadin/tests/server/navigator/NavigatorTest.java
+++ b/server/src/test/java/com/vaadin/tests/server/navigator/NavigatorTest.java
@@ -318,7 +318,8 @@ public class NavigatorTest {
// prepare mocks: what to expect
manager.setNavigator(EasyMock.anyObject(Navigator.class));
- EasyMock.expect(provider.getViewName("test1")).andReturn("test1");
+ EasyMock.expect(provider.getViewName("test1")).andReturn("test1")
+ .times(2);
EasyMock.expect(provider.getView("test1")).andReturn(view1);
EasyMock.expect(manager.getState()).andReturn("");
view1.enter(eventParametersEqual(""));
@@ -326,7 +327,8 @@ public class NavigatorTest {
manager.setState("test1");
EasyMock.expect(manager.getState()).andReturn("test1");
- EasyMock.expect(provider.getViewName("test2/")).andReturn("test2");
+ EasyMock.expect(provider.getViewName("test2/")).andReturn("test2")
+ .times(2);
EasyMock.expect(provider.getView("test2")).andReturn(view2);
EasyMock.expect(manager.getState()).andReturn("test1");
view2.enter(eventParametersEqual(""));
@@ -335,7 +337,7 @@ public class NavigatorTest {
EasyMock.expect(manager.getState()).andReturn("test2");
EasyMock.expect(provider.getViewName("test1/params"))
- .andReturn("test1");
+ .andReturn("test1").times(2);
EasyMock.expect(provider.getView("test1")).andReturn(view1);
EasyMock.expect(manager.getState()).andReturn("test2");
view1.enter(eventParametersEqual("params"));
@@ -372,14 +374,15 @@ public class NavigatorTest {
// prepare mocks: what to expect
manager.setNavigator(EasyMock.anyObject(Navigator.class));
- EasyMock.expect(provider.getViewName("test2")).andReturn("test2");
+ EasyMock.expect(provider.getViewName("test2")).andReturn("test2")
+ .times(2);
EasyMock.expect(provider.getView("test2")).andReturn(view2);
EasyMock.expect(manager.getState()).andReturn("view1");
view2.enter(eventParametersEqual(""));
display.showView(view2);
manager.setState("test2");
- EasyMock.expect(provider.getViewName("")).andReturn("test1");
+ EasyMock.expect(provider.getViewName("")).andReturn("test1").times(2);
EasyMock.expect(provider.getView("test1")).andReturn(view1);
EasyMock.expect(manager.getState()).andReturn("");
view1.enter(eventParametersEqual(""));
@@ -387,7 +390,7 @@ public class NavigatorTest {
manager.setState("test1");
EasyMock.expect(provider.getViewName("test1/params"))
- .andReturn("test1");
+ .andReturn("test1").times(2);
EasyMock.expect(provider.getView("test1")).andReturn(view1);
EasyMock.expect(manager.getState()).andReturn("test2");
view1.enter(eventParametersEqual("params"));
@@ -420,7 +423,8 @@ public class NavigatorTest {
Navigator navigator = createNavigator(manager, display);
// prepare mocks: what to expect
- EasyMock.expect(provider.getViewName("test1")).andReturn("test1");
+ EasyMock.expect(provider.getViewName("test1")).andReturn("test1")
+ .times(2);
EasyMock.expect(provider.getView("test1")).andReturn(view1);
ViewChangeEvent event1 = new ViewChangeEvent(navigator, null, view1,
"test1", "");
@@ -431,7 +435,8 @@ public class NavigatorTest {
manager.setState("test1");
listener.addExpectedNavigatorViewChange(event1);
- EasyMock.expect(provider.getViewName("test2")).andReturn("test2");
+ EasyMock.expect(provider.getViewName("test2")).andReturn("test2")
+ .times(2);
EasyMock.expect(provider.getView("test2")).andReturn(view2);
ViewChangeEvent event2 = new ViewChangeEvent(navigator, view1, view2,
"test2", "");
@@ -501,7 +506,8 @@ public class NavigatorTest {
// prepare mocks: what to expect
// first listener blocks first view change
- EasyMock.expect(provider.getViewName("test1")).andReturn("test1");
+ EasyMock.expect(provider.getViewName("test1")).andReturn("test1")
+ .times(2);
EasyMock.expect(provider.getView("test1")).andReturn(view1);
EasyMock.expect(manager.getState()).andReturn("");
ViewChangeEvent event1 = new ViewChangeEvent(navigator, null, view1,
@@ -509,7 +515,8 @@ public class NavigatorTest {
listener1.addExpectedIsViewChangeAllowed(event1, false);
// second listener blocks second view change
- EasyMock.expect(provider.getViewName("test1/test")).andReturn("test1");
+ EasyMock.expect(provider.getViewName("test1/test")).andReturn("test1")
+ .times(2);
EasyMock.expect(provider.getView("test1")).andReturn(view1);
EasyMock.expect(manager.getState()).andReturn("");
ViewChangeEvent event2 = new ViewChangeEvent(navigator, null, view1,
@@ -518,7 +525,8 @@ public class NavigatorTest {
listener2.addExpectedIsViewChangeAllowed(event2, false);
// both listeners allow view change
- EasyMock.expect(provider.getViewName("test1/bar")).andReturn("test1");
+ EasyMock.expect(provider.getViewName("test1/bar")).andReturn("test1")
+ .times(2);
EasyMock.expect(provider.getView("test1")).andReturn(view1);
EasyMock.expect(manager.getState()).andReturn("");
ViewChangeEvent event3 = new ViewChangeEvent(navigator, null, view1,
@@ -532,7 +540,8 @@ public class NavigatorTest {
listener2.addExpectedNavigatorViewChange(event3);
// both listeners allow view change from non-null view
- EasyMock.expect(provider.getViewName("test2")).andReturn("test2");
+ EasyMock.expect(provider.getViewName("test2")).andReturn("test2")
+ .times(2);
EasyMock.expect(provider.getView("test2")).andReturn(view2);
EasyMock.expect(manager.getState()).andReturn("view1");
ViewChangeEvent event4 = new ViewChangeEvent(navigator, view1, view2,
@@ -837,4 +846,63 @@ public class NavigatorTest {
fail("Should not be allowed to add a null view provider");
}
+
+ @Test
+ public void testNavigateTo_navigateSameUriTwice_secondNavigationDoesNothing() {
+ NavigationStateManager manager = new NavigationStateManager() {
+
+ private String state;
+
+ @Override
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ @Override
+ public void setNavigator(Navigator navigator) {
+ }
+
+ @Override
+ public String getState() {
+ return state;
+ }
+ };
+
+ final String viewName = "view";
+
+ final View view = EasyMock.createMock(View.class);
+ ViewProvider provider = new ViewProvider() {
+
+ @Override
+ public String getViewName(String viewAndParameters) {
+ return viewName;
+ }
+
+ @Override
+ public View getView(String viewName) {
+ return view;
+ }
+
+ };
+
+ final int[] count = new int[] { 0 };
+ Navigator navigator = new Navigator(createMockUI(), manager,
+ EasyMock.createMock(ViewDisplay.class)) {
+ @Override
+ protected void navigateTo(View view, String viewName,
+ String parameters) {
+ count[0] = count[0] + 1;
+ super.navigateTo(view, viewName, parameters);
+ }
+ };
+ navigator.addProvider(provider);
+
+ // First time navigation
+ navigator.navigateTo(viewName);
+ Assert.assertEquals(1, count[0]);
+
+ // Second time navigation to the same view
+ navigator.navigateTo(viewName);
+ Assert.assertEquals(1, count[0]);
+ }
}
diff --git a/shared/pom.xml b/shared/pom.xml
index b94cfd7475..f8bff03e6b 100644
--- a/shared/pom.xml
+++ b/shared/pom.xml
@@ -20,19 +20,6 @@
<description>Vaadin shared</description>
<dependencies>
- <!-- Actual dependencies -->
- <dependency>
- <groupId>com.vaadin.external.flute</groupId>
- <artifactId>flute</artifactId>
- <version>${flute.version}</version>
- </dependency>
- <dependency>
- <groupId>com.vaadin.external.streamhtmlparser</groupId>
- <artifactId>streamhtmlparser-jsilver</artifactId>
- <version>${streamhtmlparser.version}</version>
- </dependency>
-
-
<!-- Needed GWT dependencies. Required parts are packaged to jar -->
<dependency>
<groupId>com.vaadin.external.gwt</groupId>
@@ -40,12 +27,6 @@
<version>${vaadin.gwt.version}</version>
<scope>provided</scope>
</dependency>
- <dependency>
- <groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-user</artifactId>
- <version>${vaadin.gwt.version}</version>
- <scope>provided</scope>
- </dependency>
<dependency>
<groupId>junit</groupId>
@@ -94,21 +75,12 @@
elemental/util/Map*
</includes>
</artifactItem>
- <artifactItem>
- <groupId>com.vaadin.external.gwt</groupId>
- <artifactId>gwt-user</artifactId>
- <includes>
- com/google/gwt/*/shared/**,
- com/google/gwt/*/*/shared/**,
- com/google/web/bindery/*/shared/**,
- com/google/gwt/user/client/rpc/IsSerializable.*
- </includes>
- </artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
+
<plugin>
<artifactId>maven-resources-plugin</artifactId>
@@ -145,7 +117,7 @@
<configuration>
<instructions>
<Bundle-RequiredExecutionEnvironment>JavaSE-1.6</Bundle-RequiredExecutionEnvironment>
- <Export-Package>com.vaadin.*;version="${project.version}",com.google.*;version="${project.version}",elemental.*;version="${project.version}"</Export-Package>
+ <Export-Package>com.vaadin.*;version="${project.version}",elemental.*;version="${project.version}"</Export-Package>
<Import-Package>com.google.gwt.thirdparty.streamhtmlparser;version="${streamhtmlparser.version}",
com.google.gwt.thirdparty.streamhtmlparser.impl;version="${streamhtmlparser.version}",
com.google.gwt.thirdparty.streamhtmlparser.util;version="${streamhtmlparser.version}",
diff --git a/shared/src/main/java/com/vaadin/shared/ui/grid/HeightMode.java b/shared/src/main/java/com/vaadin/shared/ui/grid/HeightMode.java
index 4cd19a01b1..7fc992566f 100644
--- a/shared/src/main/java/com/vaadin/shared/ui/grid/HeightMode.java
+++ b/shared/src/main/java/com/vaadin/shared/ui/grid/HeightMode.java
@@ -38,5 +38,11 @@ public enum HeightMode {
* The height of the Component or Widget in question is defined by a number
* of rows.
*/
- ROW;
+ ROW,
+
+ /**
+ * The height of the Component or Widget in question is defined by its
+ * contents.
+ */
+ UNDEFINED;
}
diff --git a/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormConstants.java b/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormConstants.java
new file mode 100644
index 0000000000..9f0c256881
--- /dev/null
+++ b/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormConstants.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.shared.ui.loginform;
+
+import java.io.Serializable;
+
+/**
+ * Constants for LoginForm
+ *
+ * @since 7.7
+ * @author Vaadin Ltd
+ */
+public class LoginFormConstants implements Serializable {
+
+ public static final String LOGIN_RESOURCE_NAME = "loginForm";
+
+}
+
diff --git a/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormRpc.java b/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormRpc.java
new file mode 100644
index 0000000000..76f88170a5
--- /dev/null
+++ b/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormRpc.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.shared.ui.loginform;
+
+import com.vaadin.shared.communication.ServerRpc;
+
+public interface LoginFormRpc extends ServerRpc {
+ void submitCompleted();
+}
diff --git a/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormState.java b/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormState.java
new file mode 100644
index 0000000000..1dee06a12d
--- /dev/null
+++ b/shared/src/main/java/com/vaadin/shared/ui/loginform/LoginFormState.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.shared.ui.loginform;
+
+import com.vaadin.shared.AbstractComponentState;
+import com.vaadin.shared.Connector;
+import com.vaadin.shared.communication.URLReference;
+
+public class LoginFormState extends AbstractComponentState {
+ public Connector userNameFieldConnector;
+ public Connector passwordFieldConnector;
+ public Connector loginButtonConnector;
+ public URLReference loginResource;
+}
diff --git a/shared/src/main/java/com/vaadin/shared/ui/ui/UIServerRpc.java b/shared/src/main/java/com/vaadin/shared/ui/ui/UIServerRpc.java
index 887ea760b3..554feaac76 100644
--- a/shared/src/main/java/com/vaadin/shared/ui/ui/UIServerRpc.java
+++ b/shared/src/main/java/com/vaadin/shared/ui/ui/UIServerRpc.java
@@ -35,4 +35,7 @@ public interface UIServerRpc extends ClickRpc, ServerRpc {
* should always be called to ensure the message is flushed right away.
*/
public void poll();
+
+ @NoLoadingIndicator
+ public void acknowledge();
}
diff --git a/themes/src/main/themes/VAADIN/themes/base/select/select.scss b/themes/src/main/themes/VAADIN/themes/base/select/select.scss
index 69d3c07272..fc097405b7 100644
--- a/themes/src/main/themes/VAADIN/themes/base/select/select.scss
+++ b/themes/src/main/themes/VAADIN/themes/base/select/select.scss
@@ -104,9 +104,33 @@ $select-button-negative-width : -1em;
border-collapse: collapse;
border: none;
vertical-align:top;
+ display: block;
+ width: 100%;
+
+ // float & clear needs to be set so that IE 8 & 9 displays the elements as block
+ float: left;
+ clear: both;
+
+ & > tbody,
+ & > tbody > tr,
+ & > tbody > tr > td {
+ display: block;
+ width: 100%;
+ // float & clear needs to be set so that IE 8 & 9 displays the elements as block
+ float: left;
+ clear: both;
+ overflow-y: hidden;
+ }
}
.v-filterselect-suggestmenu .gwt-MenuItem {
white-space: nowrap;
+ padding-left: 1px;
+ padding-right: 0;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
}
.v-filterselect-suggestmenu .gwt-MenuItem .v-icon {
margin-right: 3px;
diff --git a/themes/src/main/themes/VAADIN/themes/chameleon/common/common.scss b/themes/src/main/themes/VAADIN/themes/chameleon/common/common.scss
index 82e0810bc2..86b65f70fb 100644
--- a/themes/src/main/themes/VAADIN/themes/chameleon/common/common.scss
+++ b/themes/src/main/themes/VAADIN/themes/chameleon/common/common.scss
@@ -126,7 +126,10 @@ $chameleon-line-height: 1.4;
-moz-user-select: none;
-ms-user-select: none;
cursor: default;
- }
+ }
+ .v-filterselect-suggestpopup .gwt-MenuItem {
+ padding: 0 .7em;
+ }
.v-contextmenu td.gwt-MenuItem-selected div,
.v-filterselect-suggestpopup td.gwt-MenuItem-selected,
diff --git a/themes/src/main/themes/VAADIN/themes/liferay/select/select.scss b/themes/src/main/themes/VAADIN/themes/liferay/select/select.scss
index 5ae302be9a..9d14b02982 100644
--- a/themes/src/main/themes/VAADIN/themes/liferay/select/select.scss
+++ b/themes/src/main/themes/VAADIN/themes/liferay/select/select.scss
@@ -61,18 +61,16 @@ select {
background-position: -65px -4px;
}
.v-filterselect-suggestmenu .gwt-MenuItem span {
- display: block;
- width: 100%;
height: 18px;
- border: 1px solid #fff;
- border-style: solid none;
-
}
-.v-filterselect-suggestmenu .gwt-MenuItem-selected span {
- color: #000;
- background: #dfe8f6;
- border-color: #a3bae9;
+.v-filterselect-suggestmenu .gwt-MenuItem {
+ border: 1px solid transparent;
+ &.gwt-MenuItem-selected {
+ background-color: #dfe8f6;
+ border: 1px solid #333;
+ color: #000;
+ }
}
.v-filterselect-suggestmenu .gwt-MenuItem .v-icon {
diff --git a/themes/src/main/themes/VAADIN/themes/reindeer/select/select.scss b/themes/src/main/themes/VAADIN/themes/reindeer/select/select.scss
index a15ba4ab87..818c33b460 100644
--- a/themes/src/main/themes/VAADIN/themes/reindeer/select/select.scss
+++ b/themes/src/main/themes/VAADIN/themes/reindeer/select/select.scss
@@ -81,7 +81,7 @@ $select-button-negative-width : -25px;
}
.#{$primaryStyleName}-suggestmenu .gwt-MenuItem {
padding: 1px 8px;
- height: 16px;
+ min-height: 18px;
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
diff --git a/themes/src/main/themes/VAADIN/themes/runo/select/select.scss b/themes/src/main/themes/VAADIN/themes/runo/select/select.scss
index 39eb0c9bde..ac8e22b429 100644
--- a/themes/src/main/themes/VAADIN/themes/runo/select/select.scss
+++ b/themes/src/main/themes/VAADIN/themes/runo/select/select.scss
@@ -77,7 +77,7 @@ $select-button-negative-width: -25px;
.#{$primaryStyleName}-suggestmenu .gwt-MenuItem {
padding: 1px 6px;
cursor: pointer;
- height: 18px;
+ min-height: 21px;
}
.#{$primaryStyleName}-suggestmenu .gwt-MenuItem .v-icon {
margin-right: 3px;
diff --git a/themes/src/main/themes/VAADIN/themes/valo/components/_combobox.scss b/themes/src/main/themes/VAADIN/themes/valo/components/_combobox.scss
index d240be56b8..e9056ef17a 100644
--- a/themes/src/main/themes/VAADIN/themes/valo/components/_combobox.scss
+++ b/themes/src/main/themes/VAADIN/themes/valo/components/_combobox.scss
@@ -358,26 +358,30 @@
[class$="suggestmenu"] {
@include valo-selection-overlay-style($animate-in: false, $animate-out: false);
- @include box-sizing(border-box);
+ @include box-sizing(content-box);
position: relative;
z-index: 1;
-
- &[style*="height"] {
- @include box-sizing(content-box);
- }
+ display: block;
}
- margin-top: ceil($v-unit-size/8) !important;
+ margin-top: ceil($v-unit-size/8) !important;
- table,
- tbody,
- tr,
- td {
+ table, tbody, tr, td {
display: block;
+ width: 100%;
+ overflow-y: hidden;
+
+ // float & clear needs to be set so that IE 8 & 9 displays the elements as block
+ float: left;
+ clear: both;
}
.gwt-MenuItem {
@include valo-selection-item-style;
+ height: $v-selection-item-height;
+ box-sizing: border-box;
+ text-overflow: ellipsis;
+ overflow-x: hidden;
}
.gwt-MenuItem-selected {
diff --git a/uitest/pom.xml b/uitest/pom.xml
index 374600b196..866c45a273 100644
--- a/uitest/pom.xml
+++ b/uitest/pom.xml
@@ -54,6 +54,45 @@
<scope>provided</scope>
</dependency>
+ <!-- jetty-servlets needed by ProxyTest, but not by jetty-runner -->
+ <!-- Jetty before vaadin-* on the classpath to make Eclipse use the right version -->
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-server</artifactId>
+ <version>${jetty.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlets</artifactId>
+ <version>${jetty.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-server</artifactId>
+ <version>${jetty.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-webapp</artifactId>
+ <version>${jetty.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ <version>${jetty.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-proxy</artifactId>
+ <version>${jetty.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
<!-- LIBRARY DEPENDENCIES (compile time) -->
<!-- Project modules -->
<dependency>
@@ -67,6 +106,7 @@
</exclusion>
</exclusions>
</dependency>
+
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-client</artifactId>
@@ -78,6 +118,19 @@
</exclusion>
</exclusions>
</dependency>
+
+ <dependency>
+ <groupId>com.vaadin.external.gwt</groupId>
+ <artifactId>gwt-elemental</artifactId>
+ <version>${vaadin.gwt.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.vaadin.external.gwt</groupId>
+ <artifactId>gwt-servlet</artifactId>
+ <version>${vaadin.gwt.version}</version>
+ </dependency>
+
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-client-compiled</artifactId>
@@ -116,43 +169,6 @@
<scope>provided</scope>
</dependency>
<dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-server</artifactId>
- <version>${jetty.version}</version>
- <scope>provided</scope>
- </dependency>
- <!-- jetty-servlets needed by ProxyTest, but not by jetty-runner -->
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-servlets</artifactId>
- <version>${jetty.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty.websocket</groupId>
- <artifactId>websocket-server</artifactId>
- <version>${jetty.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-webapp</artifactId>
- <version>${jetty.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- <version>${jetty.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-proxy</artifactId>
- <version>${jetty.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
diff --git a/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidth.java b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidth.java
new file mode 100644
index 0000000000..86e5b54cb6
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidth.java
@@ -0,0 +1,47 @@
+package com.vaadin.tests.components.combobox;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.ComboBox;
+
+public class ComboBoxSuggestionPopupWidth extends AbstractTestUI {
+
+ private static List<String> items = Arrays
+ .asList("abc",
+ "cde",
+ "efg",
+ "ghi",
+ "ijk",
+ "more items 1",
+ "more items 2",
+ "more items 3",
+ "Ridicilously long item caption so we can see how the ComboBox displays ridicilously long captions in the suggestion pop-up",
+ "more items 4", "more items 5", "more items 6",
+ "more items 7");
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ ComboBox cb = new ComboBox(
+ "200px wide ComboBox with 100% wide suggestion popup",
+ items);
+ cb.setPopupWidth("100%");
+ cb.setWidth("200px");
+ cb.addStyleName("width-as-percentage");
+ addComponent(cb);
+
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Suggestion pop-up's width should be the same width as the ComboBox itself";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 19685;
+ }
+
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthLegacy.java b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthLegacy.java
new file mode 100644
index 0000000000..091b5f9aab
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthLegacy.java
@@ -0,0 +1,47 @@
+package com.vaadin.tests.components.combobox;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.ComboBox;
+
+public class ComboBoxSuggestionPopupWidthLegacy extends AbstractTestUI {
+
+ private static List<String> items = Arrays
+ .asList("abc",
+ "cde",
+ "efg",
+ "ghi",
+ "ijk",
+ "more items 1",
+ "more items 2",
+ "more items 3",
+ "Ridicilously long item caption so we can see how the ComboBox displays ridicilously long captions in the suggestion pop-up",
+ "more items 4", "more items 5", "more items 6",
+ "more items 7");
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ ComboBox legacy = new ComboBox(
+ "200px wide ComboBox with legacy mode suggestion popup setPopupWidth(null)",
+ items);
+ legacy.addStyleName("legacy");
+ legacy.setWidth("200px");
+ legacy.setPopupWidth(null);
+ addComponent(legacy);
+
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Suggestion pop-up's width should respect the item captions width";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 19685;
+ }
+
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPercentage.java b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPercentage.java
new file mode 100644
index 0000000000..1ddc666a44
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPercentage.java
@@ -0,0 +1,46 @@
+package com.vaadin.tests.components.combobox;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.ComboBox;
+
+public class ComboBoxSuggestionPopupWidthPercentage extends AbstractTestUI {
+
+ private static List<String> items = Arrays
+ .asList("abc",
+ "cde",
+ "efg",
+ "ghi",
+ "ijk",
+ "more items 1",
+ "more items 2",
+ "more items 3",
+ "Ridicilously long item caption so we can see how the ComboBox displays ridicilously long captions in the suggestion pop-up",
+ "more items 4", "more items 5", "more items 6",
+ "more items 7");
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ ComboBox percentage = new ComboBox(
+ "200px wide ComboBox with 200% wide suggestion popup", items);
+ percentage.addStyleName("percentage");
+ percentage.setWidth("200px");
+ percentage.setPopupWidth("200%");
+ addComponent(percentage);
+
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Suggestion pop-up's width should be 200% of the ComboBox itself (400px)";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 19685;
+ }
+
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPixels.java b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPixels.java
new file mode 100644
index 0000000000..623f4c904f
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPixels.java
@@ -0,0 +1,46 @@
+package com.vaadin.tests.components.combobox;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.ComboBox;
+
+public class ComboBoxSuggestionPopupWidthPixels extends AbstractTestUI {
+
+ private static List<String> items = Arrays
+ .asList("abc",
+ "cde",
+ "efg",
+ "ghi",
+ "ijk",
+ "more items 1",
+ "more items 2",
+ "more items 3",
+ "Ridicilously long item caption so we can see how the ComboBox displays ridicilously long captions in the suggestion pop-up",
+ "more items 4", "more items 5", "more items 6",
+ "more items 7");
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ ComboBox pixels = new ComboBox(
+ "200px wide ComboBox with 300px wide suggestion popup", items);
+ pixels.addStyleName("pixels");
+ pixels.setWidth("200px");
+ pixels.setPopupWidth("300px");
+ addComponent(pixels);
+
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Suggestion pop-up's width should 300px";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 19685;
+ }
+
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridHeight.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridHeight.java
new file mode 100644
index 0000000000..c22bc56103
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridHeight.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2000-2016 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.grid;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.event.ItemClickEvent;
+import com.vaadin.event.ItemClickEvent.ItemClickListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.grid.HeightMode;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Grid.DetailsGenerator;
+import com.vaadin.ui.Grid.RowReference;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.OptionGroup;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ * Tests that Grid gets correct height based on height mode, and resizes
+ * properly with details row if height is undefined.
+ *
+ * @author Vaadin Ltd
+ */
+public class GridHeight extends AbstractTestUI {
+
+ static final String FULL = "Full";
+ static final String UNDEFINED = "Undefined";
+ static final String PX100 = "100px";
+ static final Integer ROW3 = 3;
+
+ static final Object[] gridHeights = { FULL, UNDEFINED, ROW3 };
+ static final String[] gridWidths = { FULL, UNDEFINED };
+ static final String[] detailsRowHeights = { FULL, UNDEFINED, PX100 };
+
+ private Grid grid;
+ private Map<Object, VerticalLayout> detailsLayouts = new HashMap<Object, VerticalLayout>();
+ private OptionGroup detailsHeightSelector;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ grid = new Grid();
+ grid.addColumn("name", String.class);
+ grid.addColumn("born", Integer.class);
+
+ grid.addRow("Nicolaus Copernicus", 1543);
+ grid.addRow("Galileo Galilei", 1564);
+ for (int i = 0; i < 1; ++i) {
+ grid.addRow("Johannes Kepler", 1571);
+ }
+
+ grid.setDetailsGenerator(new DetailsGenerator() {
+ @Override
+ public Component getDetails(final RowReference rowReference) {
+ if (!detailsLayouts.containsKey(rowReference.getItemId())) {
+ createDetailsLayout(rowReference.getItemId());
+ }
+ return detailsLayouts.get(rowReference.getItemId());
+ }
+ });
+
+ grid.addItemClickListener(new ItemClickListener() {
+ @Override
+ public void itemClick(final ItemClickEvent event) {
+ final Object itemId = event.getItemId();
+ grid.setDetailsVisible(itemId, !grid.isDetailsVisible(itemId));
+ }
+ });
+
+ addComponent(createOptionLayout());
+ addComponent(grid);
+ }
+
+ private void createDetailsLayout(Object itemId) {
+ VerticalLayout detailsLayout = new VerticalLayout();
+ setDetailsHeight(detailsLayout, detailsHeightSelector.getValue());
+ detailsLayout.setWidth("100%");
+
+ Label lbl1 = new Label("details row");
+ lbl1.setId("lbl1");
+ lbl1.setSizeUndefined();
+ detailsLayout.addComponent(lbl1);
+ detailsLayout.setComponentAlignment(lbl1, Alignment.MIDDLE_CENTER);
+
+ detailsLayouts.put(itemId, detailsLayout);
+ }
+
+ private Component createOptionLayout() {
+ HorizontalLayout optionLayout = new HorizontalLayout();
+ OptionGroup gridHeightSelector = new OptionGroup("Grid height",
+ Arrays.<Object> asList(gridHeights));
+ gridHeightSelector.setId("gridHeightSelector");
+ gridHeightSelector.setItemCaption(ROW3, ROW3 + " rows");
+ gridHeightSelector.addValueChangeListener(new ValueChangeListener() {
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ Object value = event.getProperty().getValue();
+ if (UNDEFINED.equals(value)) {
+ grid.setHeightUndefined();
+ grid.setHeightMode(HeightMode.UNDEFINED);
+ } else if (FULL.equals(value)) {
+ grid.setHeight("100%");
+ grid.setHeightMode(HeightMode.CSS);
+ } else if (ROW3.equals(value)) {
+ grid.setHeightByRows(ROW3);
+ grid.setHeightMode(HeightMode.ROW);
+ }
+ }
+ });
+ gridHeightSelector.setValue(UNDEFINED);
+ optionLayout.addComponent(gridHeightSelector);
+
+ OptionGroup gridWidthSelector = new OptionGroup("Grid width",
+ Arrays.asList(gridWidths));
+ gridWidthSelector.setId("gridWidthSelector");
+ gridWidthSelector.addValueChangeListener(new ValueChangeListener() {
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ Object value = event.getProperty().getValue();
+ if (UNDEFINED.equals(value)) {
+ grid.setWidthUndefined();
+ } else if (FULL.equals(value)) {
+ grid.setWidth("100%");
+ }
+ }
+ });
+ gridWidthSelector.setValue(UNDEFINED);
+ optionLayout.addComponent(gridWidthSelector);
+
+ detailsHeightSelector = new OptionGroup("Details row height",
+ Arrays.asList(detailsRowHeights));
+ detailsHeightSelector.setId("detailsHeightSelector");
+ detailsHeightSelector.addValueChangeListener(new ValueChangeListener() {
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ Object value = event.getProperty().getValue();
+ for (VerticalLayout detailsLayout : detailsLayouts.values()) {
+ setDetailsHeight(detailsLayout, value);
+ }
+ }
+ });
+ detailsHeightSelector.setValue(PX100);
+ optionLayout.addComponent(detailsHeightSelector);
+ return optionLayout;
+ }
+
+ private void setDetailsHeight(VerticalLayout detailsLayout, Object value) {
+ if (UNDEFINED.equals(value)) {
+ detailsLayout.setHeightUndefined();
+ } else if (FULL.equals(value)) {
+ detailsLayout.setHeight("100%");
+ } else if (PX100.equals(value)) {
+ detailsLayout.setHeight(PX100);
+ }
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Grid with undefined height should display all rows and resize when details row is opened."
+ + "<br>Grid with full height is always 400px high regardless or details row."
+ + "<br>Grid with row height should always be the height of those rows regardless of details row.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 19690;
+ }
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridResizeHiddenColumn.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridResizeHiddenColumn.java
new file mode 100644
index 0000000000..c970f97500
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridResizeHiddenColumn.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.grid;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.tests.fieldgroup.ComplexPerson;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Grid.ColumnResizeEvent;
+import com.vaadin.ui.Grid.ColumnResizeListener;
+
+@SuppressWarnings("serial")
+public class GridResizeHiddenColumn extends AbstractTestUIWithLog {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Grid grid = new Grid();
+ grid.setContainerDataSource(ComplexPerson.createContainer(100));
+ grid.setColumns("firstName", "lastName", "gender", "birthDate");
+ grid.getColumn("firstName").setHidable(true);
+ grid.getColumn("lastName").setHidable(true).setHidden(true);
+ grid.getColumn("gender").setHidable(true).setHidden(true);
+ grid.getColumn("birthDate").setHidable(true);
+
+ addComponent(grid);
+
+ grid.addColumnResizeListener(new ColumnResizeListener() {
+ @Override
+ public void columnResize(ColumnResizeEvent event) {
+ log(String.format("Column resized: id=%s, width=%s",
+ event.getColumn().getPropertyId(),
+ event.getColumn().getWidth()));
+ }
+ });
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Resize columns and then make hidden column visible. The originally hidden column should have an extended width.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 19826;
+ }
+
+ @Override
+ public String getDescription() {
+ return "Tests resize when columns with undefined width (-1) are hidden";
+ }
+}
diff --git a/uitest/src/main/java/com/vaadin/tests/push/PushRemoveConnectors.java b/uitest/src/main/java/com/vaadin/tests/push/PushRemoveConnectors.java
new file mode 100644
index 0000000000..528492c33a
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/push/PushRemoveConnectors.java
@@ -0,0 +1,92 @@
+package com.vaadin.tests.push;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang.SerializationUtils;
+
+import com.vaadin.annotations.Push;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.ui.AbstractOrderedLayout;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+
+@Push
+public class PushRemoveConnectors extends AbstractTestUIWithLog {
+
+ private transient final ScheduledExecutorService threadPool = Executors
+ .newScheduledThreadPool(5);
+ static final String START = "start";
+ static final String STOP = "stop";
+ private AbstractOrderedLayout verticalLayout;
+ private transient ScheduledFuture<?> task = null;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final CheckBox pollingEnabled = new CheckBox("Polling enabled");
+ pollingEnabled.addValueChangeListener(new ValueChangeListener() {
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ setPollInterval(pollingEnabled.getValue() ? 1000 : -1);
+ }
+ });
+
+ Button start = new Button("start");
+ start.setId(START);
+ start.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ task = threadPool.scheduleAtFixedRate(new Runnable() {
+ @Override
+ public void run() {
+ access(new Runnable() {
+ public void run() {
+ populate();
+ log("Serialized session size: "
+ + getSessionSize());
+ }
+ });
+ }
+ }, 1, 1, TimeUnit.SECONDS);
+ }
+ });
+ Button stop = new Button("stop");
+ stop.setId(STOP);
+ stop.addClickListener(new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ if (task != null) {
+ task.cancel(true);
+ task = null;
+ }
+
+ }
+ });
+ verticalLayout = new HorizontalLayout();
+ populate();
+ addComponents(pollingEnabled, start, stop, verticalLayout);
+ }
+
+ private void populate() {
+ verticalLayout.removeAllComponents();
+ for (int i = 0; i < 500; i++) {
+ Label l = new Label(".");
+ l.setSizeUndefined();
+ verticalLayout.addComponent(l);
+ }
+ }
+
+ private int getSessionSize() {
+ return SerializationUtils.serialize(getSession()).length;
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/VerifyBrowserVersionTest.java b/uitest/src/test/java/com/vaadin/tests/VerifyBrowserVersionTest.java
index 176c58c26c..da708c78d1 100644
--- a/uitest/src/test/java/com/vaadin/tests/VerifyBrowserVersionTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/VerifyBrowserVersionTest.java
@@ -40,7 +40,7 @@ public class VerifyBrowserVersionTest extends MultiBrowserTest {
// Chrome version does not necessarily match the desired version
// because of auto updates...
browserIdentifier = getExpectedUserAgentString(getDesiredCapabilities())
- + "50";
+ + "51";
} else {
browserIdentifier = getExpectedUserAgentString(desiredCapabilities)
+ desiredCapabilities.getVersion();
diff --git a/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthLegacyTest.java b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthLegacyTest.java
new file mode 100644
index 0000000000..d18dd68bd5
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthLegacyTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.combobox;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * @author Vaadin Ltd
+ */
+public class ComboBoxSuggestionPopupWidthLegacyTest extends MultiBrowserTest {
+
+ @Test
+ public void suggestionPopupLegacyWidthTest() throws Exception {
+ openTestURL();
+
+ waitForElementVisible(By.className("legacy"));
+
+ WebElement selectTextbox = $(ComboBoxElement.class).first()
+ .findElement(By.vaadin("#textbox"));
+ selectTextbox.click();
+
+ CustomComboBoxElement cb = $(CustomComboBoxElement.class).first();
+ cb.openPopup();
+ WebElement popup = cb.getSuggestionPopup();
+
+ int width = popup.getSize().getWidth();
+ assertGreater("Legacy mode popup should be quite wide", width, 600);
+ assertLessThan(
+ "Even legacy mode popup should not be over 1000px wide with the set item captions ",
+ width, 1000);
+
+ }
+
+};
diff --git a/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPercentageTest.java b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPercentageTest.java
new file mode 100644
index 0000000000..2e5dcb380e
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPercentageTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.combobox;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * @author Vaadin Ltd
+ */
+public class ComboBoxSuggestionPopupWidthPercentageTest extends
+ MultiBrowserTest {
+
+ @Test
+ public void suggestionPopupPersentageWidthTest() throws Exception {
+ openTestURL();
+
+ waitForElementVisible(By.className("percentage"));
+
+ WebElement selectTextbox = $(ComboBoxElement.class).first()
+ .findElement(By.vaadin("#textbox"));
+ selectTextbox.click();
+
+ CustomComboBoxElement cb = $(CustomComboBoxElement.class).first();
+ cb.openPopup();
+ WebElement popup = cb.getSuggestionPopup();
+
+ int width = popup.getSize().getWidth();
+ assertTrue(width == 400);
+
+ }
+
+};
diff --git a/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPixelsTest.java b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPixelsTest.java
new file mode 100644
index 0000000000..f5a0d9dc52
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthPixelsTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.combobox;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * @author Vaadin Ltd
+ */
+public class ComboBoxSuggestionPopupWidthPixelsTest extends MultiBrowserTest {
+
+ @Test
+ public void suggestionPopupFixedWidthTest() throws Exception {
+ openTestURL();
+
+ waitForElementVisible(By.className("pixels"));
+
+ WebElement selectTextbox = $(ComboBoxElement.class).first()
+ .findElement(By.vaadin("#textbox"));
+ selectTextbox.click();
+
+ CustomComboBoxElement cb = $(CustomComboBoxElement.class).first();
+ cb.openPopup();
+ WebElement popup = cb.getSuggestionPopup();
+
+ int width = popup.getSize().getWidth();
+ assertTrue(width == 300);
+
+ }
+
+};
diff --git a/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthTest.java b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthTest.java
new file mode 100644
index 0000000000..11e7629b2d
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxSuggestionPopupWidthTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.combobox;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * @author Vaadin Ltd
+ */
+public class ComboBoxSuggestionPopupWidthTest extends MultiBrowserTest {
+
+ @Test
+ public void suggestionPopupWidthTest() throws Exception {
+ openTestURL();
+
+ waitForElementVisible(By
+ .className("width-as-percentage"));
+
+ WebElement selectTextbox = $(ComboBoxElement.class).first()
+ .findElement(By.vaadin("#textbox"));
+ selectTextbox.click();
+
+ CustomComboBoxElement cb = $(CustomComboBoxElement.class).first();
+ cb.openPopup();
+ WebElement popup = cb.getSuggestionPopup();
+
+ int width = popup.getSize().getWidth();
+ assertTrue(width == 200);
+
+ }
+
+};
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridHeightTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridHeightTest.java
new file mode 100644
index 0000000000..14ad0224d6
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridHeightTest.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2000-2016 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.grid;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.number.IsCloseTo.closeTo;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.elements.OptionGroupElement;
+import com.vaadin.testbench.parallel.BrowserUtil;
+import com.vaadin.testbench.parallel.TestCategory;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Tests that Grid gets correct height based on height mode, and resizes
+ * properly with details row if height is undefined.
+ *
+ * @author Vaadin Ltd
+ */
+@TestCategory("grid")
+public class GridHeightTest extends MultiBrowserTest {
+
+ @Override
+ public void setup() throws Exception {
+ super.setup();
+ openTestURL();
+ waitForElementPresent(By.className("v-grid"));
+ }
+
+ @Test
+ public void testGridHeightAndResizingUndefined()
+ throws InterruptedException {
+ assertNoErrors(testGridHeightAndResizing(GridHeight.UNDEFINED));
+ }
+
+ @Test
+ public void testGridHeightAndResizingRow() throws InterruptedException {
+ if (isIE8orIE9()) {
+ /*
+ * with IE8 and IE9 and this height mode grid resizes when it
+ * shouldn't and doesn't resize when it should, pre-existing problem
+ * that isn't within the scope of this ticket
+ */
+ return;
+ }
+ assertNoErrors(testGridHeightAndResizing(GridHeight.ROW3));
+ }
+
+ @Test
+ public void testGridHeightAndResizingFull() throws InterruptedException {
+ assertNoErrors(testGridHeightAndResizing(GridHeight.FULL));
+ }
+
+ private Map<AssertionError, Object[]> testGridHeightAndResizing(
+ Object gridHeight) throws InterruptedException {
+ Map<AssertionError, Object[]> errors = new HashMap<AssertionError, Object[]>();
+ String caption;
+ if (GridHeight.ROW3.equals(gridHeight)) {
+ caption = gridHeight + " rows";
+ } else {
+ caption = (String) gridHeight;
+ }
+ $(OptionGroupElement.class).id("gridHeightSelector").selectByText(
+ caption);
+ for (String gridWidth : GridHeight.gridWidths) {
+ $(OptionGroupElement.class).id("gridWidthSelector").selectByText(
+ gridWidth);
+ for (String detailsRowHeight : GridHeight.detailsRowHeights) {
+ $(OptionGroupElement.class).id("detailsHeightSelector")
+ .selectByText(detailsRowHeight);
+ sleep(500);
+
+ GridElement grid = $(GridElement.class).first();
+ int initialHeight = grid.getSize().getHeight();
+ try {
+ // check default height
+ assertGridHeight(getExpectedInitialHeight(gridHeight),
+ initialHeight);
+ } catch (AssertionError e) {
+ errors.put(e, new Object[] { gridHeight, gridWidth,
+ detailsRowHeight, "initial" });
+ }
+
+ grid.getRow(2).click(5, 5);
+ waitForElementPresent(By.id("lbl1"));
+
+ int openHeight = grid.getSize().getHeight();
+ try {
+ // check height with details row opened
+ assertGridHeight(
+ getExpectedOpenedHeight(gridHeight,
+ detailsRowHeight), openHeight);
+ } catch (AssertionError e) {
+ errors.put(e, new Object[] { gridHeight, gridWidth,
+ detailsRowHeight, "opened" });
+ }
+
+ grid.getRow(2).click(5, 5);
+ waitForElementNotPresent(By.id("lbl1"));
+
+ int afterHeight = grid.getSize().getHeight();
+ try {
+ // check height with details row closed again
+ assertThat("Unexpected Grid Height", afterHeight,
+ is(initialHeight));
+ } catch (AssertionError e) {
+ errors.put(e, new Object[] { gridHeight, gridWidth,
+ detailsRowHeight, "closed" });
+ }
+ }
+ }
+ return errors;
+ }
+
+ private void assertNoErrors(Map<AssertionError, Object[]> errors) {
+ if (!errors.isEmpty()) {
+ StringBuilder sb = new StringBuilder("Exceptions: ");
+ for (Entry<AssertionError, Object[]> entry : errors.entrySet()) {
+ sb.append("\n");
+ for (Object value : entry.getValue()) {
+ sb.append(value);
+ sb.append(" - ");
+ }
+ sb.append(entry.getKey().getMessage());
+ }
+ Assert.fail(sb.toString());
+ }
+ }
+
+ private int getExpectedInitialHeight(Object gridHeight) {
+ int result = 0;
+ if (GridHeight.UNDEFINED.equals(gridHeight)
+ || GridHeight.ROW3.equals(gridHeight)) {
+ result = 81;
+ } else if (GridHeight.FULL.equals(gridHeight)) {
+ // pre-existing issue
+ result = 400;
+ }
+ return result;
+ }
+
+ private int getExpectedOpenedHeight(Object gridHeight,
+ Object detailsRowHeight) {
+ int result = 0;
+ if (GridHeight.UNDEFINED.equals(gridHeight)) {
+ if (GridHeight.PX100.equals(detailsRowHeight)) {
+ result = 182;
+ } else if (GridHeight.FULL.equals(detailsRowHeight)) {
+ if (isIE8orIE9()) {
+ // pre-existing bug in IE8 & IE9, details row doesn't layout
+ // itself properly
+ result = 100;
+ } else {
+ result = 131;
+ }
+ } else if (GridHeight.UNDEFINED.equals(detailsRowHeight)) {
+ result = 100;
+ }
+ } else if (GridHeight.ROW3.equals(gridHeight)
+ || GridHeight.FULL.equals(gridHeight)) {
+ result = getExpectedInitialHeight(gridHeight);
+ }
+ return result;
+ }
+
+ private boolean isIE8orIE9() {
+ DesiredCapabilities desiredCapabilities = getDesiredCapabilities();
+ return BrowserUtil.isIE8(desiredCapabilities)
+ || BrowserUtil.isIE(desiredCapabilities, 9);
+ }
+
+ private void assertGridHeight(int expected, int actual) {
+ assertThat("Unexpected Grid Height", (double) actual,
+ closeTo(expected, 1));
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridResizeHiddenColumnTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridResizeHiddenColumnTest.java
new file mode 100644
index 0000000000..ab9b90856c
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridResizeHiddenColumnTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.grid;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Dimension;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.elements.GridElement.GridCellElement;
+import com.vaadin.testbench.parallel.BrowserUtil;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class GridResizeHiddenColumnTest extends MultiBrowserTest {
+
+ @Before
+ public void before() {
+ openTestURL();
+ }
+
+ @Test
+ public void testDragResizeHiddenColumnSize() {
+ GridElement grid = $(GridElement.class).first();
+ Actions action = new Actions(getDriver());
+
+ // Check if column 'Gender' hidden
+ List<GridCellElement> headerCells = grid.getHeaderCells(0);
+ Assert.assertEquals("There should be two visible columns", 2,
+ headerCells.size());
+ Assert.assertFalse("Gender column should be hidden",
+ containsText("Gender", headerCells));
+
+ // Resize first column
+ int dragOffset = -100;
+ int headerCellWidth = headerCells.get(0).getSize().getWidth();
+ dragResizeColumn(headerCells.get(0), 1, dragOffset);
+
+ // When dragging the resizer on IE8, the final offset will be smaller
+ // (might be an issue with the feature that doesn't start resizing until
+ // the cursor moved a few pixels)
+ double delta = BrowserUtil.isIE8(getDesiredCapabilities()) ? 5d : 0;
+ Assert.assertEquals(
+ "Column width should've changed by " + dragOffset + "px",
+ headerCellWidth + dragOffset,
+ headerCells.get(0).getSize().getWidth(), delta);
+
+ // Make column 'Gender' visible
+ WebElement menuButton = grid.findElement(By.className("v-contextmenu"))
+ .findElement(By.tagName("button"));
+ action.click(menuButton).perform(); // Click on menu button
+
+ WebElement sidebarPopup = findElement(
+ By.className("v-grid-sidebar-popup"));
+ WebElement visibilityToggle = findElementByText("Gender",
+ sidebarPopup.findElements(By.className("gwt-MenuItem")));
+ action.click(visibilityToggle).perform(); // Click on 'Gender' menu item
+
+ // Check if column 'Gender' is visible
+ headerCells = grid.getHeaderCells(0);
+ Assert.assertEquals("There should be three visible columns", 3,
+ headerCells.size());
+ Assert.assertTrue("Gender column should be visible",
+ containsText("Gender", headerCells));
+
+ // Check if column 'Gender' has expanded width
+ int widthSum = 0;
+ for (GridCellElement e : headerCells) {
+ widthSum += e.getSize().getWidth();
+ }
+ Assert.assertEquals("Gender column should take up the remaining space",
+ grid.getHeader().getSize().getWidth(), widthSum, 1d);
+ }
+
+ private WebElement findElementByText(String text,
+ List<? extends WebElement> elements) {
+ for (WebElement e : elements) {
+ if (text.equalsIgnoreCase(e.getText())) {
+ return e;
+ }
+ }
+ return null;
+ }
+
+ private boolean containsText(String text,
+ List<? extends WebElement> elements) {
+ return !(findElementByText(text, elements) == null);
+ }
+
+ private void dragResizeColumn(GridCellElement headerCell, int posX,
+ int offset) {
+ Dimension size = headerCell.getSize();
+ new Actions(getDriver())
+ .moveToElement(headerCell, size.getWidth() + posX,
+ size.getHeight() / 2)
+ .clickAndHold().moveByOffset(offset, 0).release().perform();
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/GridDescriptionGeneratorTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/GridDescriptionGeneratorTest.java
index ed712361a6..ac494efc2c 100644
--- a/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/GridDescriptionGeneratorTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/GridDescriptionGeneratorTest.java
@@ -18,8 +18,11 @@ package com.vaadin.tests.components.grid.basicfeatures;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import java.util.List;
+
import org.junit.Test;
import org.openqa.selenium.By;
+import org.openqa.selenium.remote.DesiredCapabilities;
public class GridDescriptionGeneratorTest extends GridBasicFeaturesTest {
@@ -71,4 +74,9 @@ public class GridDescriptionGeneratorTest extends GridBasicFeaturesTest {
assertEquals("Tooltip text", "Row tooltip for row 5", tooltipText);
}
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ return getBrowsersExcludingFirefox();
+ }
+
}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/label/LabelTooltipTest.java b/uitest/src/test/java/com/vaadin/tests/components/label/LabelTooltipTest.java
index 600cc4231a..36606b9972 100644
--- a/uitest/src/test/java/com/vaadin/tests/components/label/LabelTooltipTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/components/label/LabelTooltipTest.java
@@ -16,10 +16,12 @@
package com.vaadin.tests.components.label;
import java.io.IOException;
+import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.interactions.Actions;
+import org.openqa.selenium.remote.DesiredCapabilities;
import com.vaadin.testbench.elements.LabelElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
@@ -69,4 +71,11 @@ public class LabelTooltipTest extends MultiBrowserTest {
/* Visual comparison */
compareScreen("tooltipVisible");
}
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // this test also works on IEs, but Firefox has problems with tooltips
+ return getBrowsersExcludingFirefox();
+ }
+
}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/window/ToolTipInWindowTest.java b/uitest/src/test/java/com/vaadin/tests/components/window/ToolTipInWindowTest.java
index 40332e7730..abe2bcbe36 100644
--- a/uitest/src/test/java/com/vaadin/tests/components/window/ToolTipInWindowTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/components/window/ToolTipInWindowTest.java
@@ -71,7 +71,7 @@ public class ToolTipInWindowTest extends MultiBrowserTest {
@Override
public List<DesiredCapabilities> getBrowsersToTest() {
// Test with the same browsers as in the other tooltip tests
- return getBrowsersExcludingIE();
+ return getBrowsersSupportingTooltip();
}
}
diff --git a/uitest/src/test/java/com/vaadin/tests/fieldgroup/BooleanTextFieldTest.java b/uitest/src/test/java/com/vaadin/tests/fieldgroup/BooleanTextFieldTest.java
index 7a74deb2e0..abbe4128dd 100644
--- a/uitest/src/test/java/com/vaadin/tests/fieldgroup/BooleanTextFieldTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/fieldgroup/BooleanTextFieldTest.java
@@ -1,9 +1,12 @@
package com.vaadin.tests.fieldgroup;
+import java.util.List;
+
import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
+import org.openqa.selenium.remote.DesiredCapabilities;
public class BooleanTextFieldTest extends BasicPersonFormTest {
@@ -57,4 +60,11 @@ public class BooleanTextFieldTest extends BasicPersonFormTest {
"4. Person [firstName=John, lastName=Dover, email=john@doe.com, age=64, sex=Male, address=Address [streetAddress=John street, postalCode=11223, city=John's town, country=USA], deceased=true, salary=null, salaryDouble=null, rent=null]",
getLogRow(0));
}
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // this test also works on IEs, but Firefox has problems with tooltips
+ return getBrowsersExcludingFirefox();
+ }
+
}
diff --git a/uitest/src/test/java/com/vaadin/tests/navigator/NavigationTest.java b/uitest/src/test/java/com/vaadin/tests/navigator/NavigationTest.java
new file mode 100644
index 0000000000..59f71f3724
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/navigator/NavigationTest.java
@@ -0,0 +1,54 @@
+package com.vaadin.tests.navigator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.TableElement;
+import com.vaadin.testbench.elements.TableRowElement;
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class NavigationTest extends SingleBrowserTest {
+
+ @Override
+ protected Class<?> getUIClass() {
+ return NavigatorTest.class;
+ }
+
+ @Test
+ public void testNavigateToSameViewWithDifferentParameters() {
+ openTestURL();
+
+ ButtonElement listButton = $(ButtonElement.class).caption(
+ "Navigate to list").first();
+ listButton.click();
+
+ TableElement table = $(TableElement.class).first();
+ assertEquals("Unexpected navigation message",
+ "2. Navigated to ListView without params", getLogRow(0));
+
+ assertFalse("Table should not have contents",
+ table.isElementPresent(By.vaadin("#row[0]")));
+
+ listButton.click();
+ assertEquals("Should not navigate to same view again.",
+ "2. Navigated to ListView without params", getLogRow(0));
+
+ $(TextFieldElement.class).first().sendKeys("foo=1");
+ listButton.click();
+
+ assertEquals("Should not navigate to same view again.",
+ "3. Navigated to ListView with params foo=1", getLogRow(0));
+
+ assertTrue("Table should have content",
+ table.isElementPresent(By.vaadin("#row[0]")));
+ TableRowElement row = table.getRow(0);
+ assertEquals("Unexpected row content", "foo", row.getCell(0).getText());
+ assertEquals("Unexpected row content", "1", row.getCell(1).getText());
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/push/PushRemoveConnectorsTest.java b/uitest/src/test/java/com/vaadin/tests/push/PushRemoveConnectorsTest.java
new file mode 100644
index 0000000000..bcf93b0aa9
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/push/PushRemoveConnectorsTest.java
@@ -0,0 +1,36 @@
+package com.vaadin.tests.push;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class PushRemoveConnectorsTest extends SingleBrowserTest {
+
+ @Test
+ public void testNoMemoryLeak() throws InterruptedException {
+ openTestURL();
+ $(ButtonElement.class).id(PushRemoveConnectors.START).click();
+ Thread.sleep(5000);
+ int last = getMemoryUsage();
+ int i = 0;
+ while (i++ < 10) {
+ Thread.sleep(5000);
+ int now = getMemoryUsage();
+ System.out.println("Memory usage: "+now);
+ if (last == now)
+ break;
+
+ last = now;
+ }
+ $(ButtonElement.class).id(PushRemoveConnectors.STOP).click();
+
+ Assert.assertNotEquals(10, i);
+ }
+
+ private int getMemoryUsage() {
+ return Integer.parseInt(getLogRow(0).replaceFirst(
+ ".*Serialized session size: ", ""));
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTest.java b/uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTest.java
index 9bb146b8e4..ec40510d96 100644
--- a/uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTest.java
@@ -57,6 +57,13 @@ public abstract class MultiBrowserTest extends PrivateTB3Configuration {
Browser.PHANTOMJS);
}
+ protected List<DesiredCapabilities> getBrowsersExcludingFirefox() {
+ // this is sometimes needed as the Firefox driver causes extra mouseOut
+ // events that make tooltips disappear etc.
+ return getBrowserCapabilities(Browser.IE8, Browser.IE9, Browser.IE10,
+ Browser.IE11, Browser.CHROME, Browser.PHANTOMJS);
+ }
+
protected List<DesiredCapabilities> getBrowsersExcludingIE8() {
return getBrowserCapabilities(Browser.IE9, Browser.IE10, Browser.IE11,
Browser.FIREFOX, Browser.CHROME, Browser.PHANTOMJS);
@@ -79,6 +86,17 @@ public abstract class MultiBrowserTest extends PrivateTB3Configuration {
Browser.FIREFOX, Browser.CHROME);
}
+ protected List<DesiredCapabilities> getBrowsersSupportingTooltip() {
+ // With IEDriver, the cursor seems to jump to default position after the
+ // mouse move, so we are not able to test the tooltip behaviour properly
+ // unless using requireWindowFocusForIE() { return true; } .
+ // See #13854.
+ // On Firefox, the driver causes additional mouseOut events causing the
+ // tooltip to disappear immediately. Tooltips may work in some
+ // particular cases, but not in general.
+ return getBrowserCapabilities(Browser.CHROME, Browser.PHANTOMJS);
+ }
+
@Override
public List<DesiredCapabilities> getBrowsersToTest() {
// Uncomment Safari and Opera if those become tested browsers again.
diff --git a/uitest/src/test/java/com/vaadin/tests/tb3/TooltipTest.java b/uitest/src/test/java/com/vaadin/tests/tb3/TooltipTest.java
index 86ea44287a..e455abc9f0 100644
--- a/uitest/src/test/java/com/vaadin/tests/tb3/TooltipTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/tb3/TooltipTest.java
@@ -110,8 +110,6 @@ public abstract class TooltipTest extends MultiBrowserTest {
@Override
public List<DesiredCapabilities> getBrowsersToTest() {
- // TODO Once we figure out how to get mouse hovering work with the IE
- // webdriver, exclude them from these tests (#13854)
- return getBrowsersExcludingIE();
+ return getBrowsersSupportingTooltip();
}
}
diff --git a/uitest/src/test/java/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java b/uitest/src/test/java/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java
index af7a303629..555168f155 100644
--- a/uitest/src/test/java/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/tooltip/AdjacentElementsWithTooltipsTest.java
@@ -23,10 +23,8 @@ import static org.junit.Assert.assertThat;
import java.util.List;
import org.junit.Test;
-import org.openqa.selenium.interactions.HasInputDevices;
import org.openqa.selenium.interactions.Mouse;
import org.openqa.selenium.interactions.internal.Coordinates;
-import org.openqa.selenium.internal.Locatable;
import org.openqa.selenium.remote.DesiredCapabilities;
import com.vaadin.testbench.elements.ButtonElement;
@@ -42,7 +40,7 @@ public class AdjacentElementsWithTooltipsTest extends MultiBrowserTest {
@Override
public List<DesiredCapabilities> getBrowsersToTest() {
- return getBrowsersExcludingIE();
+ return getBrowsersSupportingTooltip();
}
@Test
diff --git a/uitest/src/test/java/com/vaadin/tests/tooltip/StationaryTooltipTest.java b/uitest/src/test/java/com/vaadin/tests/tooltip/StationaryTooltipTest.java
index 6b751e7a6b..b4ce5ff903 100644
--- a/uitest/src/test/java/com/vaadin/tests/tooltip/StationaryTooltipTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/tooltip/StationaryTooltipTest.java
@@ -19,10 +19,7 @@ public class StationaryTooltipTest extends MultiBrowserTest {
@Override
public List<DesiredCapabilities> getBrowsersToTest() {
- // With IEDriver, the cursor seems to jump to default position after the
- // mouse move,
- // so we are not able to test the tooltip behaviour properly.
- return getBrowsersExcludingIE();
+ return getBrowsersSupportingTooltip();
}
@Test
diff --git a/uitest/src/test/java/com/vaadin/tests/validation/ValidationOfRequiredEmptyFieldsTest.java b/uitest/src/test/java/com/vaadin/tests/validation/ValidationOfRequiredEmptyFieldsTest.java
index ab77ba6b26..f8c1025975 100644
--- a/uitest/src/test/java/com/vaadin/tests/validation/ValidationOfRequiredEmptyFieldsTest.java
+++ b/uitest/src/test/java/com/vaadin/tests/validation/ValidationOfRequiredEmptyFieldsTest.java
@@ -1,10 +1,13 @@
package com.vaadin.tests.validation;
+import java.util.List;
+
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedCondition;
import com.vaadin.testbench.elements.CheckBoxElement;
@@ -19,6 +22,12 @@ public class ValidationOfRequiredEmptyFieldsTest extends MultiBrowserTest {
return true;
}
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // Firefox causes extra mouseOut events breaking tooltips.
+ return getBrowsersExcludingFirefox();
+ }
+
@Test
public void requiredErrorMessage() throws Exception {
openTestURL();
diff --git a/widgets/src/main/java/com/vaadin/themes/valoutil/BodyStyleName.java b/widgets/src/main/java/com/vaadin/themes/valoutil/BodyStyleName.java
index 73a01b6fd2..7bffc73703 100644
--- a/widgets/src/main/java/com/vaadin/themes/valoutil/BodyStyleName.java
+++ b/widgets/src/main/java/com/vaadin/themes/valoutil/BodyStyleName.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
package com.vaadin.themes.valoutil;
import com.google.gwt.core.client.EntryPoint;