summaryrefslogtreecommitdiffstats
path: root/documentation/datamodel
diff options
context:
space:
mode:
authorLeif Åstrand <leif@vaadin.com>2016-07-18 11:01:45 +0300
committerArtur Signell <artur@vaadin.com>2016-08-04 17:17:02 +0300
commit7a3ba5b563e742c800c0d0c58695bbed88381578 (patch)
tree7e988364815442431c3b75d9694cdc2cdb03cbc7 /documentation/datamodel
parent3abd26bf5a763e480266da7bffa17b64a38cb2ab (diff)
downloadvaadin-framework-7a3ba5b563e742c800c0d0c58695bbed88381578.tar.gz
vaadin-framework-7a3ba5b563e742c800c0d0c58695bbed88381578.zip
Replace old data binding chapters with updated ones
* Add documentation about Fields for the data binding chapter * Add documentation about form binding for the data binding chapter * Add documentation about data sources for the data binding chapter Change-Id: I99297f2ebd3d874bd78569fd8d05bc649654c91d
Diffstat (limited to 'documentation/datamodel')
-rw-r--r--documentation/datamodel/chapter-datamodel.asciidoc8
-rw-r--r--documentation/datamodel/datamodel-container.asciidoc831
-rw-r--r--documentation/datamodel/datamodel-datasources.asciidoc533
-rw-r--r--documentation/datamodel/datamodel-fields.asciidoc68
-rw-r--r--documentation/datamodel/datamodel-forms.asciidoc679
-rw-r--r--documentation/datamodel/datamodel-itembinding.asciidoc377
-rw-r--r--documentation/datamodel/datamodel-items.asciidoc194
-rw-r--r--documentation/datamodel/datamodel-overview.asciidoc73
-rw-r--r--documentation/datamodel/datamodel-properties.asciidoc394
-rw-r--r--documentation/datamodel/datamodel-selection.asciidoc20
-rw-r--r--documentation/datamodel/img/beanitem-nested-beans.pngbin3142 -> 0 bytes
-rw-r--r--documentation/datamodel/img/beanitemcontainer-nested-beans.pngbin18032 -> 0 bytes
-rw-r--r--documentation/datamodel/img/datamodel-interfaces-hi.pngbin170869 -> 0 bytes
-rw-r--r--documentation/datamodel/img/datamodel-interfaces-lo.pngbin41890 -> 0 bytes
-rw-r--r--documentation/datamodel/img/datamodel-whitebg.pngbin287119 -> 0 bytes
-rw-r--r--documentation/datamodel/original-drawings/beanitem-doublebinding.svg1026
-rw-r--r--documentation/datamodel/original-drawings/datamodel-interfaces.svg1321
17 files changed, 1320 insertions, 4204 deletions
diff --git a/documentation/datamodel/chapter-datamodel.asciidoc b/documentation/datamodel/chapter-datamodel.asciidoc
index c28e5b716b..5fa29a6957 100644
--- a/documentation/datamodel/chapter-datamodel.asciidoc
+++ b/documentation/datamodel/chapter-datamodel.asciidoc
@@ -10,11 +10,11 @@ bind components directly to data sources, such as database queries.
include::datamodel-overview.asciidoc[leveloffset=+2]
-include::datamodel-properties.asciidoc[leveloffset=+2]
+include::datamodel-fields.asciidoc[leveloffset=+2]
-include::datamodel-items.asciidoc[leveloffset=+2]
+include::datamodel-forms.asciidoc[leveloffset=+2]
-include::datamodel-itembinding.asciidoc[leveloffset=+2]
+include::datamodel-datasources.asciidoc[leveloffset=+2]
-include::datamodel-container.asciidoc[leveloffset=+2]
+include::datamodel-selection.asciidoc[leveloffset=+2]
(((range="endofrange", startref="term.datamodel")))
diff --git a/documentation/datamodel/datamodel-container.asciidoc b/documentation/datamodel/datamodel-container.asciidoc
deleted file mode 100644
index 5e610cd671..0000000000
--- a/documentation/datamodel/datamodel-container.asciidoc
+++ /dev/null
@@ -1,831 +0,0 @@
----
-title: Collecting Items in Containers
-order: 5
-layout: page
----
-
-[[datamodel.container]]
-= Collecting Items in Containers
-
-((("[classname]#Container#", id="term.datamodel.container", range="startofrange")))
-
-
-The [classname]#Container# interface is the highest containment level of the
-Vaadin data model, for containing items (rows) which in turn contain properties
-(columns). Containers can therefore represent tabular data, which can be viewed
-in a [classname]#Table# or some other selection component, as well as
-hierarchical data.
-
-The items contained in a container are identified by an __item identifier__ or
-__IID__, and the properties by a __property identifier__ or __PID__.
-
-[[datamodel.container.intro]]
-== Basic Use of Containers
-
-The basic use of containers involves creating one, adding items to it, and
-binding it as a container data source of a component.
-
-[[datamodel.container.intro.default]]
-=== Default Containers and Delegation
-
-Before saying anything about creation of containers, it should be noted that all
-components that can be bound to a container data source are by default bound to
-a default container. For example, [classname]#Table# is bound to a
-[classname]#IndexedContainer#, [classname]#Tree# to a
-[classname]#HierarchicalContainer#, and so forth.
-
-All of the user interface components using containers also implement the
-relevant container interfaces themselves, so that the access to the underlying
-data source is delegated through the component.
-
-
-----
-// Create a table with one column
-Table table = new Table("My Table");
-table.addContainerProperty("col1", String.class, null);
-
-// Access items and properties through the component
-table.addItem("row1"); // Create item by explicit ID
-Item item1 = table.getItem("row1");
-Property property1 = item1.getItemProperty("col1");
-property1.setValue("some given value");
-
-// Equivalent access through the container
-Container container = table.getContainerDataSource();
-container.addItem("row2");
-Item item2 = container.getItem("row2");
-Property property2 = item2.getItemProperty("col1");
-property2.setValue("another given value");
-----
-
-
-[[datamodel.container.intro.creating]]
-=== Creating and Binding a Container
-
-A container is created and bound to a component as follows:
-
-
-----
-// Create a container of some type
-Container container = new IndexedContainer();
-
-// Initialize the container as required by the container type
-container.addContainerProperty("name", String.class, "none");
-container.addContainerProperty("volume", Double.class, 0.0);
-
-... add items ...
-
-// Bind it to a component
-Table table = new Table("My Table");
-table.setContainerDataSource(container);
-----
-
-Most components that can be bound to a container allow passing it also in the
-constructor, in addition to using [methodname]#setContainerDataSource()#.
-Creation of the container depends on its type. For some containers, such as the
-[classname]#IndexedContainer#, you need to define the contained properties
-(columns) as was done above, while some others determine them otherwise. The
-definition of a property with [methodname]#addContainerProperty()# requires a
-unique property ID, type, and a default value. You can also give
-[parameter]#null#. If the container of a component is replaced and the new container
-contains a different set of columns, such as a property with the same ID but a
-different data type, the component should be reinitialized. For a table or grid,
-it means redefining their columns.
-
-Vaadin has a several built-in in-memory container implementations, such as
-[classname]#IndexedContainer# and [classname]#BeanItemContainer#, which are easy
-to use for setting up nonpersistent data storages. For persistent data, either
-the built-in [classname]#SQLContainer# or the [classname]#JPAContainer# add-on
-container can be used.
-
-
-[[datamodel.container.intro.adding]]
-=== Adding Items and Accessing Properties
-
-Items can be added to a container with the [methodname]#addItem()# method. The
-parameterless version of the method automatically generates the item ID.
-
-
-----
-// Create an item
-Object itemId = container.addItem();
-----
-
-Properties can be requested from container by first requesting an item with
-[methodname]#getItem()# and then getting the properties from the item with
-[methodname]#getItemProperty()#.
-
-
-----
-// Get the item object
-Item item = container.getItem(itemId);
-
-// Access a property in the item
-Property<String> nameProperty =
- item.getItemProperty("name");
-
-// Do something with the property
-nameProperty.setValue("box");
-----
-
-You can also get a property directly by the item and property ids with
-[methodname]#getContainerProperty()#.
-
-
-----
-container.getContainerProperty(itemId, "volume").setValue(5.0);
-----
-
-
-[[datamodel.container.intro.givenid]]
-=== Adding Items by Given ID
-
-Some containers, such as [classname]#IndexedContainer# and
-[classname]#HierarchicalContainer#, allow adding items by a given ID, which can
-be any [classname]#Object#.
-
-
-----
-Item item = container.addItem("agivenid");
-item.getItemProperty("name").setValue("barrel");
-Item.getItemProperty("volume").setValue(119.2);
-----
-
-Notice that the actual item __is not__ given as a parameter to the method, only
-its ID, as the interface assumes that the container itself creates all the items
-it contains. Some container implementations can provide methods to add
-externally created items, and they can even assume that the item ID object is
-also the item itself. Lazy containers might not create the item immediately, but
-lazily when it is accessed by its ID.
-
-
-
-[[datamodel.container.inner]]
-== Container Subinterfaces
-
-The [classname]#Container# interface contains inner interfaces that container
-implementations can implement to fulfill different features required by
-components that present container data.
-
-[interfacename]#Container.Filterable#:: Filterable containers allow filtering the contained items by filters, as
-described in <<datamodel.container.filtered>>.
-
-[interfacename]#Container.Hierarchical#:: Hierarchical containers allow representing hierarchical relationships between
-items and are required by the [classname]#Tree# and [classname]#TreeTable#
-components. The [classname]#HierarchicalContainer# is a built-in in-memory
-container for hierarchical data, and is used as the default container for the
-tree components. The [classname]#FilesystemContainer# provides access to
-browsing the content of a file system. Also [classname]#JPAContainer# is
-hierarchical, as described in
-<<dummy/../../../framework/jpacontainer/jpacontainer-usage#jpacontainer.usage.hierarchical,"Hierarchical
-Container">>.
-
-[interfacename]#Container.Indexed#:: An indexed container allows accessing items by an index number, not just their
-item ID. This feature is required by some components, especially
-[classname]#Table#, which needs to provide lazy access to large containers. The
-[classname]#IndexedContainer# is a basic in-memory implementation, as described
-in <<datamodel.container.indexedcontainer>>.
-
-[interfacename]#Container.Ordered#:: An ordered container allows traversing the items in successive order in either
-direction. Most built-in containers are ordered.
-
-[interfacename]#Container.SimpleFilterable#:: This interface enables filtering a container by string matching with
-[methodname]#addContainerFilter()#. The filtering is done by either searching
-the given string anywhere in a property value, or as its prefix.
-
-[interfacename]#Container.Sortable#:: A sortable container is required by some components that allow sorting the
-content, such as [classname]#Table#, where the user can click a column header to
-sort the table by the column. Some other components, such as
-[classname]#Calendar#, may require that the content is sorted to be able to
-display it properly. Depending on the implementation, sorting can be done only
-when the [methodname]#sort()# method is called, or the container is
-automatically kept in order according to the last call of the method.
-
-
-
-See the API documentation for a detailed description of the interfaces.
-
-
-[[datamodel.container.indexedcontainer]]
-== [classname]#IndexedContainer#
-
-The [classname]#IndexedContainer# is an in-memory container that implements the
-[interfacename]#Indexed# interface to allow referencing the items by an index.
-[classname]#IndexedContainer# is used as the default container in most selection
-components in Vaadin.
-
-The properties need to be defined with [methodname]#addContainerProperty()#,
-which takes the property ID, type, and a default value. This must be done before
-any items are added to the container.
-
-
-----
-// Create the container
-IndexedContainer container = new IndexedContainer();
-
-// Define the properties (columns)
-container.addContainerProperty("name", String.class, "noname");
-container.addContainerProperty("volume", Double.class, -1.0d);
-
-// Add some items
-Object content[][] = { {"jar", 2.0}, {"bottle", 0.75},
- {"can", 1.5}};
-for (Object[] row: content) {
- Item newItem = container.getItem(container.addItem());
- newItem.getItemProperty("name").setValue(row[0]);
- newItem.getItemProperty("volume").setValue(row[1]);
-}
-----
-
-New items are added with [methodname]#addItem()#, which returns the item ID of
-the new item, or by giving the item ID as a parameter as was described earlier.
-Note that the [classname]#Table# component, which has
-[classname]#IndexedContainer# as its default container, has a conveniency
-[methodname]#addItem()# method that allows adding items as object vectors
-containing the property values.
-
-The container implements the [interfacename]#Container.Indexed# feature to allow
-accessing the item IDs by their index number, with [methodname]#getIdByIndex()#,
-etc. The feature is required mainly for internal purposes of some components,
-such as [classname]#Table#, which uses it to enable lazy transmission of table
-data to the client-side.
-
-
-[[datamodel.container.beancontainer]]
-== [classname]#BeanContainer#
-
-The [classname]#BeanContainer# is an in-memory container for JavaBean objects.
-Each contained bean is wrapped inside a [classname]#BeanItem# wrapper. The item
-properties are determined automatically by inspecting the getter and setter
-methods of the class. This requires that the bean class has public visibility,
-local classes for example are not allowed. Only beans of the same type can be
-added to the container.
-
-The generic has two parameters: a bean type and an item identifier type. The
-item identifiers can be obtained by defining a custom resolver, using a specific
-item property for the IDs, or by giving item IDs explicitly. As such, it is more
-general than the [classname]#BeanItemContainer#, which uses the bean object
-itself as the item identifier, making the use usually simpler. Managing the item
-IDs makes [classname]#BeanContainer# more complex to use, but it is necessary in
-some cases where the [methodname]#equals()# or [methodname]#hashCode()# methods
-have been reimplemented in the bean.
-
-
-----
-// Here is a JavaBean
-public class Bean implements Serializable {
- String name;
- double energy; // Energy content in kJ/100g
-
- public Bean(String name, double energy) {
- this.name = name;
- this.energy = energy;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public double getEnergy() {
- return energy;
- }
-
- public void setEnergy(double energy) {
- this.energy = energy;
- }
-}
-
-void basic(VerticalLayout layout) {
- // Create a container for such beans with
- // strings as item IDs.
- BeanContainer<String, Bean> beans =
- new BeanContainer<String, Bean>(Bean.class);
-
- // Use the name property as the item ID of the bean
- beans.setBeanIdProperty("name");
-
- // Add some beans to it
- beans.addBean(new Bean("Mung bean", 1452.0));
- beans.addBean(new Bean("Chickpea", 686.0));
- beans.addBean(new Bean("Lentil", 1477.0));
- beans.addBean(new Bean("Common bean", 129.0));
- beans.addBean(new Bean("Soybean", 1866.0));
-
- // Bind a table to it
- Table table = new Table("Beans of All Sorts", beans);
- layout.addComponent(table);
-}
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beancontainer.basic[on-line example, window="_blank"].
-
-To use explicit item IDs, use the methods [methodname]#addItem(Object, Object)#,
-[methodname]#addItemAfter(Object, Object, Object)#, and
-[methodname]#addItemAt(int, Object, Object)#.
-
-It is not possible to add additional properties to the container, except
-properties in a nested bean.
-
-[[datamodel.container.beancontainer.nestedproperties]]
-=== Nested Properties
-
-((("nested bean properties", id="term.datamodel.container.beancontainer.nestedproperties", range="startofrange")))
-
-
-If you have a nested bean with an 1:1 relationship inside a bean type contained
-in a [classname]#BeanContainer# or [classname]#BeanItemContainer#, you can add
-its properties to the container by specifying them with
-[methodname]#addNestedContainerProperty()#. The feature is defined at the level
-of [classname]#AbstractBeanContainer#.
-((("[methodname]#addNestedContainerProperty()#")))
-
-As with the bean in a bean container, also a nested bean must have public
-visibility or otherwise an access exception is thrown. An intermediate reference
-from a bean in the bean container to a nested bean may have a null value.
-
-For example, let us assume that we have the following two beans with the first
-one nested inside the second one.
-
-
-----
-/** Bean to be nested */
-public class EqCoord implements Serializable {
- double rightAscension; /* In angle hours */
- double declination; /* In degrees */
-
- ... setters and getters for the properties ...
-}
-
-/** Bean referencing a nested bean */
-public class Star implements Serializable {
- String name;
- EqCoord equatorial; /* Nested bean */
-
- ... setters and getters for the properties ...
-}
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beanitemcontainer.nestedbean[on-line example, window="_blank"].
-
-After creating the container, you can declare the nested properties by
-specifying their property identifiers with the
-[methodname]#addNestedContainerProperty()# in dot notation.
-
-
-----
-// Create a container for beans
-BeanItemContainer<Star> stars =
- new BeanItemContainer<Star>(Star.class);
-
-// Declare the nested properties to be used in the container
-stars.addNestedContainerProperty("equatorial.rightAscension");
-stars.addNestedContainerProperty("equatorial.declination");
-
-// Add some items
-stars.addBean(new Star("Sirius", new EqCoord(6.75, 16.71611)));
-stars.addBean(new Star("Polaris", new EqCoord(2.52, 89.26417)));
-
-// Here the nested bean reference is null
-stars.addBean(new Star("Vega", null));
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beanitemcontainer.nestedbean[on-line example, window="_blank"].
-
-If you bind such a container to a [classname]#Table#, you probably also need to
-set the column headers. Notice that the entire nested bean itself is still a
-property in the container and would be displayed in its own column. The
-[methodname]#toString()# method is used for obtaining the displayed value, which
-is by default an object reference. You normally do not want this, so you can
-hide the column with [methodname]#setVisibleColumns()#.
-((("[methodname]#setVisibleColumns()#")))
-
-
-----
-// Put them in a table
-Table table = new Table("Stars", stars);
-table.setColumnHeader("equatorial.rightAscension", "RA");
-table.setColumnHeader("equatorial.declination", "Decl");
-table.setPageLength(table.size());
-
-// Have to set explicitly to hide the "equatorial" property
-table.setVisibleColumns("name",
- "equatorial.rightAscension", "equatorial.declination");
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beanitemcontainer.nestedbean[on-line example, window="_blank"].
-
-The resulting table is shown in
-<<figure.datamodel.container.beancontainer.nestedproperties>>.
-
-[[figure.datamodel.container.beancontainer.nestedproperties]]
-.[classname]#Table# Bound to a [classname]#BeanContainer# with Nested Properties
-image::img/beanitemcontainer-nested-beans.png[]
-
-The bean binding in [classname]#AbstractBeanContainer# normally uses the
-[classname]#MethodProperty# implementation of the [classname]#Property#
-interface to access the bean properties using the setter and getter methods. For
-nested properties, the [classname]#NestedMethodProperty# implementation is used.
-((("[classname]#MethodProperty#")))
-((("[classname]#NestedMethodProperty#")))
-
-(((range="endofrange", startref="term.datamodel.container.beancontainer.nestedproperties")))
-
-ifdef::web[]
-[[datamodel.container.beancontainer.idresolver]]
-=== Defining a Bean ID Resolver
-
-If a bean ID resolver is set using [methodname]#setBeanIdResolver()# or
-[methodname]#setBeanIdProperty()#, the methods [methodname]#addBean()#,
-[methodname]#addBeanAfter()#, [methodname]#addBeanAt()# and
-[methodname]#addAll()# can be used to add items to the container. If one of
-these methods is called, the resolver is used to generate an identifier for the
-item (must not return [parameter]#null#).
-
-Note that explicit item identifiers can also be used when a resolver has been
-set by calling the [methodname]#addItem*()# methods - the resolver is only used
-when adding beans using the [methodname]#addBean*()# or
-[methodname]#addAll(Collection)# methods.
-
-endif::web[]
-
-
-[[datamodel.container.beanitemcontainer]]
-== [classname]#BeanItemContainer#
-
-[classname]#BeanItemContainer# is a container for JavaBean objects where each
-bean is wrapped inside a [classname]#BeanItem# wrapper. The item properties are
-determined automatically by inspecting the getter and setter methods of the
-class. This requires that the bean class has public visibility, local classes
-for example are not allowed. Only beans of the same type can be added to the
-container.
-
-[classname]#BeanItemContainer# is a specialized version of the
-[classname]#BeanContainer# described in <<datamodel.container.beancontainer>>.
-It uses the bean itself as the item identifier, which makes it a bit easier to
-use than [classname]#BeanContainer# in many cases. The latter is, however,
-needed if the bean has reimplemented the [methodname]#equals()# or
-[methodname]#hashCode()# methods.
-
-Let us revisit the example given in <<datamodel.container.beancontainer>> using
-the [classname]#BeanItemContainer#.
-
-
-----
-// Create a container for the beans
-BeanItemContainer<Bean> beans =
- new BeanItemContainer<Bean>(Bean.class);
-
-// Add some beans to it
-beans.addBean(new Bean("Mung bean", 1452.0));
-beans.addBean(new Bean("Chickpea", 686.0));
-beans.addBean(new Bean("Lentil", 1477.0));
-beans.addBean(new Bean("Common bean", 129.0));
-beans.addBean(new Bean("Soybean", 1866.0));
-
-// Bind a table to it
-Table table = new Table("Beans of All Sorts", beans);
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beanitemcontainer.basic[on-line example, window="_blank"].
-
-It is not possible to add additional properties to a
-[classname]#BeanItemContainer#, except properties in a nested bean, as described
-in <<datamodel.container.beancontainer>>. ((("nested bean
-properties")))
-
-
-ifdef::web[]
-[[datamodel.container.iterating]]
-== Iterating Over a Container
-
-As the items in a [classname]#Container# are not necessarily indexed, iterating
-over the items has to be done using an [classname]#Iterator#. The
-[methodname]#getItemIds()# method of [classname]#Container# returns a
-[classname]#Collection# of item identifiers over which you can iterate. The
-following example demonstrates a typical case where you iterate over the values
-of check boxes in a column of a [classname]#Table# component. The context of the
-example is the example used in
-<<dummy/../../../framework/components/components-table#components.table,"Table">>.
-
-
-----
-// Collect the results of the iteration into this string.
-String items = "";
-
-// Iterate over the item identifiers of the table.
-for (Iterator i = table.getItemIds().iterator(); i.hasNext();) {
- // Get the current item identifier, which is an integer.
- int iid = (Integer) i.next();
-
- // Now get the actual item from the table.
- Item item = table.getItem(iid);
-
- // And now we can get to the actual checkbox object.
- Button button = (Button)
- (item.getItemProperty("ismember").getValue());
-
- // If the checkbox is selected.
- if ((Boolean)button.getValue() == true) {
- // Do something with the selected item; collect the
- // first names in a string.
- items += item.getItemProperty("First Name")
- .getValue() + " ";
- }
-}
-
-// Do something with the results; display the selected items.
-layout.addComponent (new Label("Selected items: " + items));
-----
-
-Notice that the [methodname]#getItemIds()# returns an __unmodifiable
-collection__, so the [classname]#Container# may not be modified during
-iteration. You can not, for example, remove items from the
-[classname]#Container# during iteration. The modification includes modification
-in another thread. If the [classname]#Container# is modified during iteration, a
-[classname]#ConcurrentModificationException# is thrown and the iterator may be
-left in an undefined state.
-
-endif::web[]
-
-[[datamodel.container.gpc]]
-== [classname]#GeneratedPropertyContainer#
-
-[classname]#GeneratedPropertyContainer# is a container wrapper that allows
-defining generated values for properties (columns). The generated properties can
-shadow properties with the same IDs in the wrapped container. Removing a
-property from the wrapper hides it.
-
-The container is especially useful with [classname]#Grid#, which does not
-support generated columns or hiding columns like [classname]#Table# does.
-
-[[datamodel.container.gpc.wrapping]]
-=== Wrapping a Container
-
-A container to be wrapped must be a [interfacename]#Container.Indexed#. It can
-optionally also implement [interfacename]#Container.Sortable# or
-[interfacename]#Container.Filterable# to enable sorting and filtering the
-container, respectively.
-
-For example, let us consider the following container with some regular columns:
-
-
-----
-IndexedContainer container = new IndexedContainer();
-container.addContainerProperty("firstname", String.class, null);
-container.addContainerProperty("lastname", String.class, null);
-container.addContainerProperty("born", Integer.class, null);
-container.addContainerProperty("died", Integer.class, null);
-
-// Wrap it
-GeneratedPropertyContainer gpcontainer =
- new GeneratedPropertyContainer(container);
-----
-
-
-[[datamodel.container.gpc.properties]]
-=== Generated Properties
-
-Now, you can add generated properties in the container with
-[methodname]#addGeneratedProperty()# by specifying a property ID and a
-[interfacename]#PropertyValueGenerator#. The method takes the ID of the
-generated property as first parameter; you can use a same ID as in the wrapped
-container to shadow its properties.
-
-You need to implement [methodname]#getType()#, which must return the class
-object of the value type of the property, and [methodname]#getValue()#, which
-returns the property value for the given item. The item ID and the property ID
-of the generated property are also given in case they are needed. You can access
-other properties of the item to compute the property value.
-
-
-----
-gpcontainer.addGeneratedProperty("lived",
- new PropertyValueGenerator<Integer>() {
- @Override
- public Integer getValue(Item item, Object itemId,
- Object propertyId) {
- int born = (Integer)
- item.getItemProperty("born").getValue();
- int died = (Integer)
- item.getItemProperty("died").getValue();
- return Integer.valueOf(died - born);
- }
-
- @Override
- public Class<Integer> getType() {
- return Integer.class;
- }
-});
-----
-
-You can access other items in the container, also their generated properties,
-although you should beware of accidental recursion.
-
-
-[[datamodel.container.gpc.using]]
-=== Using [classname]#GeneratedPropertyContainer#
-
-Finally, you need to bind the [classname]#GeneratedPropertyContainer# to the
-component instead of the wrapped container.
-
-
-----
-Grid grid = new Grid(gpcontainer);
-----
-
-When using [classname]#GeneratedPropertyContainer# in [classname]#Grid#, notice
-that generated columns are read-only, so you can not add grid rows with
-[methodname]#addRow()#. In editable mode, editor fields are not generated for
-generated columns.
-
-
-[[datamodel.container.gpc.sorting]]
-=== Sorting
-
-Even though the [classname]#GeneratedPropertyContainer# implements
-[interfacename]#Container.Sortable#, the wrapped container must also support it
-or otherwise sorting is disabled. Also, the generated properties are not
-normally sortable, but require special handling to enable sorting.
-
-
-
-[[datamodel.container.filtered]]
-== [classname]#Filterable# Containers
-
-((("Container", "Filterable", id="term.datamodel.container.filtered.filterable", range="startofrange")))
-
-
-((("[classname]#Filter# (in [classname]#Container#)", id="term.datamodel.container.filtered.filters", range="startofrange")))
-
-
-Containers that implement the [classname]#Container.Filterable# interface can be
-filtered. For example, the built-in [classname]#IndexedContainer# and the bean
-item containers implement it. Filtering is typically used for filtering the
-content of a [classname]#Table#.
-((("[classname]#IndexedContainer#")))
-((("[classname]#Table#")))
-
-Filters implement the [classname]#Filter# interface and you add them to a
-filterable container with the [methodname]#addContainerFilter()# method.
-Container items that pass the filter condition are kept and shown in the
-filterable component.
-((("[methodname]#addContainerFilter()#")))
-
-
-----
-Filter filter = new SimpleStringFilter("name",
- "Douglas", true, false);
-table.addContainerFilter(filter);
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.filter.basic[on-line example, window="_blank"].
-
-If multiple filters are added to a container, they are evaluated using the
-logical AND operator so that only items that are passed by all the filters are
-kept.
-
-[[datamodel.container.filtered.composite]]
-=== Atomic and Composite Filters
-
-Filters can be classified as __atomic__ and __composite__. Atomic filters, such
-as [classname]#SimpleStringFilter#, define a single condition, usually for a
-specific container property. Composite filters make filtering decisions based on
-the result of one or more other filters. The built-in composite filters
-implement the logical operators AND, OR, or NOT.
-
-For example, the following composite filter would filter out items where the
-[literal]#++name++# property contains the name "Douglas" somewhere __or__ where
-the [literal]#++age++# property has value less than 42. The properties must have
-[classname]#String# and [classname]#Integer# types, respectively.
-
-
-----
-
-filter = new Or(new SimpleStringFilter("name",
- "Douglas", true, false),
- new Compare.Less("age", 42));
-----
-
-
-[[datamodel.container.filtered.builtin]]
-=== Built-In Filter Types
-
-The built-in filter types are the following:
-
-[classname]#SimpleStringFilter#:: ((("[classname]#SimpleStringFilter#")))
-+
-Passes items where the specified property, that must be of [classname]#String#
-type, contains the given [parameter]#filterString# as a substring. If
-[parameter]#ignoreCase# is [parameter]#true#, the search is case insensitive. If
-the [parameter]#onlyMatchPrefix# is [parameter]#true#, the substring may only be
-in the beginning of the string, otherwise it may be elsewhere as well.
-
-[classname]#IsNull#:: ((("[classname]#IsNull# (filter)")))
-+
-Passes items where the specified property has null value. For in-memory
-filtering, a simple [literal]#++==++# check is performed. For other containers,
-the comparison implementation is container dependent, but should correspond to
-the in-memory null check.
-
-[classname]#Equal#, [classname]#Greater#, [classname]#Less#, [classname]#GreaterOrEqual#, and [classname]#LessOrEqual#:: ((("[classname]#Equal# (filter)")))
-((("[classname]#Greater# (filter)")))
-((("[classname]#Less# (filter)")))
-((("[classname]#GreaterOrEqual# (filter)")))
-((("[classname]#LessOrEqual# (filter)")))
-The comparison filter implementations compare the specified property value to
-the given constant and pass items for which the comparison result is true. The
-comparison operators are included in the abstract [classname]#Compare# class.
-
-+
-For the [classname]#Equal# filter, the [methodname]#equals()# method for the
-property is used in built-in in-memory containers. In other types of containers,
-the comparison is container dependent and may use, for example, database
-comparison operations.
-
-+
-For the other filters, the property value type must implement the
-[classname]#Comparable# interface to work with the built-in in-memory
-containers. Again for the other types of containers, the comparison is container
-dependent.
-
-[classname]#And# and [classname]#Or#:: ((("[classname]#And# (filter)")))
-((("[classname]#Or# (filter)")))
-+
-These logical operator filters are composite filters that combine multiple other
-filters.
-
-[classname]#Not#:: ((("[classname]#Not# (filter)")))
-+
-The logical unary operator filter negates which items are passed by the filter
-given as the parameter.
-
-[[datamodel.container.filtered.custom]]
-=== Implementing Custom Filters
-
-A custom filter needs to implement the [classname]#Container.Filter# interface.
-
-A filter can use a single or multiple properties for the filtering logic. The
-properties used by the filter must be returned with the
-[methodname]#appliesToProperty()# method. If the filter applies to a
-user-defined property or properties, it is customary to give the properties as
-the first argument for the constructor of the filter.
-
-
-----
-class MyCustomFilter implements Container.Filter {
- protected String propertyId;
- protected String regex;
-
- public MyCustomFilter(String propertyId, String regex) {
- this.propertyId = propertyId;
- this.regex = regex;
- }
-
- /** Tells if this filter works on the given property. */
- @Override
- public boolean appliesToProperty(Object propertyId) {
- return propertyId != null &&
- propertyId.equals(this.propertyId);
- }
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.filter.custom[on-line example, window="_blank"].
-
-The actual filtering logic is done in the [methodname]#passesFilter()# method,
-which simply returns [literal]#++true++# if the item should pass the filter and
-[literal]#++false++# if it should be filtered out.
-
-
-----
- /** Apply the filter on an item to check if it passes. */
- @Override
- public boolean passesFilter(Object itemId, Item item)
- throws UnsupportedOperationException {
- // Acquire the relevant property from the item object
- Property p = item.getItemProperty(propertyId);
-
- // Should always check validity
- if (p == null || !p.getType().equals(String.class))
- return false;
- String value = (String) p.getValue();
-
- // The actual filter logic
- return value.matches(regex);
- }
-}
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.filter.custom[on-line example, window="_blank"].
-
-You can use such a custom filter just like any other:
-
-
-----
-c.addContainerFilter(
- new MyCustomFilter("Name", (String) tf.getValue()));
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.filter.custom[on-line example, window="_blank"].
-
-
-(((range="endofrange", startref="term.datamodel.container.filtered.filters")))
-(((range="endofrange", startref="term.datamodel.container.filtered.filterable")))
-
-(((range="endofrange", startref="term.datamodel.container")))
-
-
diff --git a/documentation/datamodel/datamodel-datasources.asciidoc b/documentation/datamodel/datamodel-datasources.asciidoc
new file mode 100644
index 0000000000..9c657d7ffe
--- /dev/null
+++ b/documentation/datamodel/datamodel-datasources.asciidoc
@@ -0,0 +1,533 @@
+---
+title: Showing Many Items in a Listing
+order: 4
+layout: page
+---
+
+[[datamodel.datasources]]
+= Showing Many Items in a Listing
+
+A common pattern in applications is that the user is first presented with a list of items, from which she selects one or several items to continue working with.
+These items could be inventory records to survey, messages to respond to or blog drafts to edit or publish.
+
+A [interfacename]#Listing# is a component that displays one or several properties from a list of item, allowing the user to inspect the data, mark items as selected and in some cases even edit the item directly through the component.
+While each listing component has it's own API for configuring exactly how the data is represented and how it can be manipulated, they all share the same mechanisms for receiving data to show.
+
+The items are generally either loaded directly from memory or lazy loaded from some kind of backend.
+Regardless of how the items are loaded, the component is configured with one or several callbacks or JavaBean property names that define how the item should be displayed.
+
+In the following example, a [classname]#ComboBox# that lists status items is configured to use the [classname]#Status#.[methodname]#getCaption()# method to represent each status.
+There is also a [classname]#Grid#, which is configured with one column from the person's name and another column that converts the year of birth to a string for displaying.
+
+[source, java]
+----
+ComboBox<Status> comboBox = new ComboBox<>();
+comboBox.setItemCaptionProvider(Status::getCaption);
+
+Grid<Person> grid = new Grid<>();
+grid.addColumn("Name", Person::getName);
+grid.addColumn("Year of birth",
+ person -> Integer.toString(person.getYearOfBirth()));
+----
+
+[NOTE]
+In this example, it would not even be necessary to define any item caption provider for the combo box if [classname]#Status#.[methodname]#toString()# would be implemented to return a suitable text. [classname]#ComboBox# is by default configured to use [methodname]#toString()# for finding a caption to show.
+
+[NOTE]
+The `Year of birth` column will use [classname]#Grid#'s default [classname]#TextRenderer# which requires the column value to be a [classname]#String#. We could for instance use a [classname]#NumberRenderer# instead, and then the renderer would take care of converting the the number according to its configuration.
+
+After we have told the component how the data should be shown, we only need to give it some data to actually show. The easiest way of doing that is as a [interfacename]#java.util.Collection# of item instances.
+
+[source, java]
+----
+comboBox.setItems(EnumSet.allOf(Status.class));
+
+List<Person> persons = Arrays.asList(
+ new Person("George Washington", 1732),
+ new Person("John Adams", 1735),
+ new Person("Thomas Jefferson", 1743),
+ new Person("James Madison", 1751));
+
+grid.setItems(persons);
+----
+
+Listing components that allow the user to control in which order the items are displayed is automatically able to sort data by any property as long as the property type implements [classname]#Comparable#.
+
+We can also define a custom [classname]#Comparator# if we want to customize the way a specific column is sorted. The comparator can either be based on the item instances or on the values of the property that is being shown.
+
+[source, java]
+----
+grid.addColumn("Name", Person::getName)
+ // Override default natural sorting
+ .setValueComparator(
+ Comparator.comparing(String::toLowerCase));
+
+grid.addColumn("Year of birth",
+ person -> Integer.toString(person.getYearOfBirth()))
+ // Sort numerically instead of alphabetically by the string
+ .setItemComparator(
+ Comparator.comparing(Person::getYearOfBirth));
+----
+
+With listing components that let the user filter items, we can in the same way define our own [interfacename]#BiPredicate# that is used to decide whether a specific item should be shown when the user has entered a specific text into the text field.
+
+[source, java]
+----
+comboBox.setFilter((filterText, item) ->
+ item.getCaption().equalsIgnoreCase(filterText));
+----
+
+Instead of directly assigning the item collection as the items that a component should be using, we can instead create a [classname]#ListDataSource# that contains the items.
+The list data source can be shared between different components in the same [classname]#VaadinSession# since it is stateless.
+We can also apply different sorting options for each component, without affecting how data is shown in the other components.
+
+[source, java]
+----
+ListDataSource<Person> dataSource =
+ new ListDataSource<>(persons);
+
+ComboBox<Person> comboBox = new ComboBox<>();
+// The combo box shows the person sorted by name
+comboBox.setDataSource(
+ dataSource.sortedBy(Person::getName));
+
+Grid<Person> grid = new Grid<>();
+// The grid shows the same persons sorted by year of birth
+grid.setDataSource(
+ dataSource.sortedBy(Person::getYearOfBirth));
+----
+
+The [classname]#Listing# component cannot automatically know about changes to the list of items or to any individual item.
+We must notify the data source when items are changed, added or removed so that components using the data will show the new values.
+
+[source, java]
+----
+ListDataSource<Person> dataSource =
+ new ListDataSource<>(persons);
+
+Button addPersonButton = new Button("Add person",
+ clickEvent -> {
+ // Keep track of the index where the person will be added
+ int addIndex = persons.size();
+
+ persons.add(new Person("James Monroe", 1758));
+
+ dataSource.notifyAdd(addIndex);
+});
+
+Button modifyPersonButton = new Button("Modify person",
+ clickEvent -> {
+ Person personToChange = persons.get(0);
+
+ personToChange.setName("Changed person");
+
+ dataSource.refresh(0);
+});
+----
+
+[TIP]
+There might be situations where we cannot tell exactly how the data has changed, but only that some parts might have been modified. We can then use the [methodname]#refreshAll()# method, which will make the components reload all the data.
+
+== Lazy Loading Data to a Listing
+
+All the previous examples have shown cases with a limited amount of data that can be loaded as item instances in memory.
+There are also situations where it is more efficient to only load the items that will currently be displayed.
+This includes situations where all available data would use lots of memory or when it would take a long time to load all the items.
+
+[NOTE]
+Regardless of how we make the items available to the listing component on the server, components like [classname]#Grid# will always take care of only sending the currently needed items to the browser.
+
+For example, if we have the following existing backend service that fetches items from a database or a REST service .
+
+[source, java]
+----
+public interface PersonService {
+ List<Person> fetchPersons(int offset, int limit);
+ int getPersonCount();
+}
+----
+
+To use this service with a listing component, we need to define one callback for loading specific items and one callback for finding how many items are currently available.
+Information about which items to fetch as well as some additional details are made available in a [interfacename]#Query# object that is passed to both callbacks.
+
+[source, java]
+----
+DataSource<Person> dataSource = new DataSource<>(
+ // First callback fetches items based on a query
+ query -> {
+ // The index of the first item to load
+ int offset = query.getOffset();
+
+ // The number of items to load
+ int limit = query.getLimit();
+
+ List<Person> persons = getPersonService().fetchPersons(offset, limit);
+
+ return persons.stream();
+ },
+ // Second callback fetches the number of items for a query
+ query -> getPersonService().getPersonCount()
+);
+
+Grid<Person> grid = new Grid<>();
+grid.setDataSource(dataSource);
+
+// Columns are configured in the same way as before
+...
+----
+
+[NOTE]
+The results of the first and second callback must be symmetric so that fetching all available items using the first callback returns the number of items indicated by the second callback. Thus if you impose any restrictions on e.g. a database query in the first callback, you must also add the same restrictions for the second callback.
+
+=== Sorting
+
+It is not practical to order items based on a [interfacename]#Comparator# when the items are loaded on demand, since it would require all items to be loaded and inspected.
+
+Each backend has its own way of defining how the fetched items should be ordered, but they are in general based on a list of property names and information on whether ordering should be ascending or descending.
+
+As an example, there could be a service interface which looks like the following.
+
+[source, java]
+----
+public interface PersonService {
+ List<Person> fetchPersons(
+ int offset,
+ int limit,
+ List<PersonSort> sortOrders);
+
+ int getPersonCount();
+
+ static PersonSort createSort(
+ String propertyName,
+ boolean descending);
+}
+----
+
+With the above service interface, our data source can be enhanced to convert the provided sorting options into a format expected by the service.
+The sorting options set through the component will be available through [interfacename]#Query#.[methodname]#getSortOrders()#.
+
+[source, java]
+----
+DataSource<Person> dataSource = new DataSource<>(
+ query -> {
+ List<PersonSort> sortOrders = new ArrayList<>();
+ for(SortOrder<String> queryOrder : query.getSortOrders()) {
+ PersonSort sort = PersonService.createSort(
+ // The name of the sorted property
+ queryOrder.getSorted(),
+ // The sort direction for this property
+ queryOrder.getDirection() == SortDirection.DESCENDING);
+ sortOrders.add(sort);
+ }
+
+ return service.fetchPersons(
+ query.getOffset(),
+ query.getLimit(),
+ sortOrders
+ ).stream();
+ },
+ // The number of persons is the same regardless of ordering
+ query -> persons.getPersonCount()
+);
+----
+
+We also need to configure our grid so that it can know what property name should be included in the query when the user wants to sort by a specific column.
+When a data source that does lazy loading is used, [classname]#Grid# and other similar components will only let the user sort by columns for which a sort property name is provided.
+
+[source, java]
+----
+Grid<Person> grid = new Grid<>();
+
+grid.setDataSource(dataSource);
+
+// Will be sortable by the user
+// When sorting by this column, the query will have a SortOrder
+// where getSorted() returns "name"
+grid.addColumn("Name", Person::getName)
+ .setSortProperty("name");
+
+// Will not be sortable since no sorting info is given
+grid.addColumn("Year of birth",
+ person -> Integer.toString(person.getYearOfBirth()));
+----
+
+There might also be cases where a single property name is not enough for sorting.
+This might be the case if the backend needs to sort by multiple properties for one column in the user interface or if the backend sort order should be inverted compared to the sort order defined by the user.
+In such cases, we can define a callback that generates suitable [classname]#SortOrder# values for the given column.
+
+[source, java]
+----
+grid.addColumn("Name",
+ person -> person.getFirstName() + " " + person.getLastName())
+ .setSortBuilder(
+ // Sort according to last name, then first name
+ direction -> Stream.of(
+ new SortOrder("lastName", direction),
+ new SortOrder("firstName", direction)
+ ));
+----
+
+=== Filtering
+
+A similar approach is also needed with filtering in cases such as [classname]#ComboBox# where the user can control how items are filtered.
+
+The filtering of a data source query is represented as a [interfacename]#BackendFilter# instance. There are existing implementations for some common filtering cases, such as requiring a named property to not be null or a SQL `LIKE` comparison.
+
+[source, java]
+----
+ComboBox<Person> comboBox = new ComboBox<>();
+
+comboBox.setItemCaptionProvider(Person::getName);
+
+comboBox.setFilter(
+ // corresponds to this SQL: WHERE name LIKE [filterText]
+ filterText -> new Like("name", filterText));
+----
+
+If we have a service interface that only supports some specific filtering option, the implementation might become simpler if we define our own [interfacename]#BackendFilter# instead of implementing our backend to use the generic built-in filter types.
+
+As an example, our service interface with support for filtering could look like this. Ordering support has been omitted in these examples to keep focus on filtering.
+
+[source, java]
+----
+public interface PersonService {
+ List<Person> fetchPersons(
+ int offset,
+ int limit,
+ String namePrefix);
+ int getPersonCount(String namePrefix);
+}
+----
+
+For the filtering needs of this service, we could define a [classname]#NamePrefixFilter# that corresponds to the only filtering option available.
+
+[source, java]
+----
+public class NamePrefixFilter implements BackendFilter {
+ private final String prefix;
+
+ public NamePrefixFilter(String prefix) {
+ this.prefix = prefix;
+ }
+
+ public String getPrefix() {
+ return prefix;
+ }
+}
+----
+
+In the case of [classname]#ComboBox#, we have to define what kind of [interfacename]#BackendFilter# to use when the user has entered some text that should be used for filtering the displayed items.
+
+[source, java]
+----
+comboBox.setFilter(
+ filterText -> new NamePrefixFilter(filterText));
+----
+
+We can then implement our data source to look for this special filter implementation and pass the name prefix to the service.
+We can create a helper method for handling the filter since the same logic is needed both for fetching and counting items.
+
+[source, java]
+----
+DataSource<Person> dataSource = new DataSource<>(
+ query -> {
+
+ BackendFilter filter = query.getFilter();
+
+ String namePrefix = filterToNamePrefix(filter);
+
+ return service.fetchPersons(
+ query.getOffset(),
+ query.getLimit(),
+ namePrefix
+ ).stream();
+ },
+ query -> persons.getPersonCount(
+ filterToNamePrefix(query.getFilter))
+);
+
+public static String filterToNamePrefix(BackendFilter filter) {
+ if (filter == null) {
+ return null;
+ }
+
+ if (filter instanceof NamePrefixFilter)) {
+ return ((NamePrefixFilter) filter).getPrefix();
+ } else {
+ throw new UnsupportedOperationException(
+ "This data source only supports NamePrefixFilter");
+ }
+}
+----
+
+[TIP]
+If the amount of data in the backend is small enough, it might be better to load all the items into a list and use a [classname]#ListDataSource# instead of implementing filtering or sorting support in a custom [classname]#DataSource# class and configuring the components accordingly.
+
+We can also create a base data source and then use different variations for different components, similarly to the previous examples with [classname]#ListDataSource#.
+
+[source, java]
+----
+DataSource<Person> dataSource = ...
+
+grid.setDataSource(dataSource
+ .filteredBy(new Like("name", "Ge%"))
+ .sortedBy(new SortOrder(
+ "yearOfBirth", SortDirection.ASCENDING)));
+
+comboBox.setDataSource(dataSource
+ .sortedBy(new SortOrder(
+ "name", SortOrder.DESCENDING)));
+
+----
+
+=== Special Fetching Cases
+
+In some cases it might be necessary directly extend [classname]#BackendDataSource# instead of constructing an instance based the two simple callback methods shown above.
+
+One such case is if the backend loads items based on a page index and a page size so that the start index in the query always needs to be a multiple of the page size. As an example, our service interface made for paging could look like this.
+
+[source, java]
+----
+public interface PersonService {
+ List<Person> fetchPersons(
+ int pageIndex,
+ int pageSize);
+ int getPersonCount();
+}
+----
+
+We can use this kind of backend service as long as we also make the data source declare that queries should always be done for whole pages.
+Components using this data source will take the information into account when querying for data.
+
+[source, java]
+----
+public class PersonDataSource
+ extends BackendDataSource<Person> {
+
+ @Override
+ public boolean alignQueries() {
+ // Informs the part that fetches items that the query offset
+ // must be a multiple of the query limit, i.e. that only full
+ // pages should be requested
+ return true;
+ }
+
+ @Override
+ public void fetch(Query<Person> query,
+ FetchResult<Person> result) {
+ int pageSize = query.getLimit();
+
+ // Caller guarantees that query.getOffset() % pageSize == 0
+ int pageIndex = query.getOffset() / pageSize;
+
+ result.setItems(getPersonService().fetchPersons(pageIndex, pageSize));
+ }
+
+ @Override
+ public int getCount(Query<Person> query) {
+ return getPersonService().getPersonCount();
+ }
+}
+----
+
+Some backends may also have limitations on how many (or few) items can be fetched at once.
+While our data source implementation could deal with that limitation internally by sending multiple requests to the backend and then assembling the results together before returning the result, we can also make the data source indicate that the responsibility for splitting up the query is on the caller instead.
+
+[source, java]
+----
+public class PersonDataSource
+ extends BackendDataSource<Person> {
+
+ @Override
+ public int getMaxLimit() {
+ // Informs the part that fetches items that the maximum
+ // supported query limit size is 30
+ return 30;
+ }
+
+ @Override
+ public void fetch(Query<Person> query,
+ FetchResult<Person> result) {
+ List<Person> persons = getPersonService().fetchPersons(
+ query.getOffset(),
+ query.getLimit());
+ result.setItems(persons);
+ }
+
+ @Override
+ public int getCount(Query<Person> query) {
+ return getPersonService().getPersonCount();
+ }
+}
+----
+
+[TIP]
+You can set the max limit and the min limit to the same value if you are using a backend that has a hardcoded page size. You can also combine this with aligned queries.
+
+Yet another case that benefits from custom querying options is backends that perform better if items are fetched relative to a previously executed query instead of by skipping items based on an absolute offset.
+
+To help with this, the provided query object will automatically contain a reference to the item immediately before the start of the first new item to fetch if available.
+The item immediately after the end of the range to fetch might also be available in some cases if the user is scrolling through the data backwards. There are, however, no guarantees that either item will be available in all queries, so the implementation should always also support fetching by offset.
+
+Some backends may also use a "cursor" object that encapsulates exactly where the next page of data would continue if continuing from where the previous query ended.
+The data provider implementation can pass such instances to the [interfacename]#FetchResult# object so that the framework can include the appropriate cursor in a query that continues from where the previous query ended.
+
+As an example, a backend with such functionality could look like this:
+
+[source, java]
+----
+public interface PersonService {
+ PersonFetchResult fetchPersons(
+ int pageIndex,
+ int pageSize);
+
+ PersonFetchResult fetchPersons(
+ PersonFetchCursor cursor,
+ int pageSize);
+
+ int getPersonCount();
+}
+
+public interface PersonFetchResult {
+ List<Person> getPersons();
+ PersonFetchCursor getCursor();
+}
+----
+
+A data source utilizing the cursor could look like this:
+[source, java]
+----
+public class PersonDataSource
+ extends BackendDataSource<Person> {
+
+ @Override
+ public void fetch(Query<Person> query,
+ FetchResult<Person> result) {
+ PersonFetchResult personResult;
+
+ Optional<?> maybeCursor = query.getNextCursor();
+ if (maybeCursor.isPresent()) {
+ PersonFetchCursor cursor =
+ (PersonFetchCursor) maybeCursor.get();
+ personResult = getPersonService().fetchPersons(
+ cursor, query.getLimit());
+ } else {
+ personResult = getPersonService().fetchPersons(
+ query.getOffset(), query.getLimit());
+ }
+
+ result.setNextCursor(personResult.getCursor());
+ result.setItems(personResult.getPersons());
+ }
+
+ @Override
+ public int getCount(Query<Person> query) {
+ return getPersonService().getPersonCount();
+ }
+}
+----
+
+The framework will automatically take care of the cursor instance stored in its [interfacename]#FetchResult# and make it available through the next query if it continues from the end offset of the query for which the cursor was stored.
+
+[NOTE]
+This simple example only uses a cursor for continuing from a previous result if going forward. A real service would also support cursors for continuing backwards. There are corresponding methods for defining a cursor in that direction; [interfacename]#FetchResult#.[methodname]#setPreviousCursor# and [interfacename]#Query#.[methodname]#getPreviousCoursor#.
diff --git a/documentation/datamodel/datamodel-fields.asciidoc b/documentation/datamodel/datamodel-fields.asciidoc
new file mode 100644
index 0000000000..f6d1530420
--- /dev/null
+++ b/documentation/datamodel/datamodel-fields.asciidoc
@@ -0,0 +1,68 @@
+---
+title: Editing Values in Fields
+order: 2
+layout: page
+---
+
+[[datamodel.fields]]
+= Editing Values in Fields
+
+The [interfacename]#Field# interface is in a very central role for handling data in an application since different types of fields are the main user interface controls used for entering data into the application.
+
+While each field implementation has its own functionality, all fields also have some common core functionality.
+By using these common building blocks, the data binding part of the framework can help simplify the code we need to write for many common data entry cases.
+
+At the very core, each field has a value that the user can see and edit through the user interface.
+The value can also be read and set through code.
+
+[source,java]
+----
+TextField nameField = new TextField("Enter your name");
+
+Button sayHelloButton = new Button("Say hello", clickEvent -> {
+ String name = nameField.getValue();
+ Notification.show("Hello " + name);
+});
+----
+
+Each field implementation has its own specific value type – the type of a [classname]#TextField# is [classname]#String#, the type of a [classname]#Slider# is [classname]#Double#, the type of a [classname]#PopupDateField# is [classname]#LocalDate#, and so on.
+
+== Reacting to Value Changes
+
+When the value of a field changes, it fires a value change event.
+By listening to the event, we can find out the new value of the field and whether the value was changed by the user through the user interface or by code through the [methodname]#setValue# method.
+
+[source,java]
+----
+TextField nameField = new TextField("Enter your name");
+nameField.addValueChangeListener(clickEvent -> {
+ String origin = event.isUserOriginated()
+ ? "by the user"
+ : "from code";
+ String message = "Name is " + event.getValue()
+ + " as set " + origin;
+ Notification.show(message);
+});
+
+Button button = new Button("Set name", event -> {
+ // Will show "Name is Zaphod as set from code"
+ nameField.setValue("Zaphod");
+});
+----
+
+If we only need to get the new value whenever it changes, we can use the [methodname]#onChange# method.
+This kind of listener directly receives the new value, which makes it convenient if we want to directly pass on the value to some other part of the application.
+It is often practical to use a method reference for defining where the new value should be delivered.
+
+[source,java]
+----
+Person person = new Person("Douglas Adams", 49);
+
+TextField nameField = new TextField("Name");
+nameField.setValue(person.getName());
+nameField.onChange(person::setName);
+
+Button button = new Button("Show name", event -> {
+ Notification.show("Person name: " + person.getName());
+})
+----
diff --git a/documentation/datamodel/datamodel-forms.asciidoc b/documentation/datamodel/datamodel-forms.asciidoc
new file mode 100644
index 0000000000..cbb50d1743
--- /dev/null
+++ b/documentation/datamodel/datamodel-forms.asciidoc
@@ -0,0 +1,679 @@
+---
+title: Binding Data to Forms
+order: 3
+layout: page
+---
+
+[[datamodel.forms]]
+= Binding Data to Forms
+
+A typical application lets the user fill out structured data and maybe also browse previously entered data.
+The data that is being entered is typically represented in code as an instance of a business object (bean), for instance a [classname]#Person# in an HR application.
+
+Vaadin Framework provides a [classname]#Binder# class that the developer can use to define how the values in a business object should be bound to the fields shown in the user interface.
+[classname]#Binder# takes care of reading values from the business object, validating the user's input, and converting the user's data between the format expected by the business object and the format expected by the field.
+
+The first step to binding fields for a form is to create a [classname]#Binder# and bind some [classname]#Field# instances to it. You only need one [classname]#Binder# instance per form and use it for all fields in the form.
+
+[source, java]
+----
+Binder<Person> binder = new Binder<>();
+
+TextField titleField = new TextField();
+
+// Start by defining the Field instance to use
+binder.forField(titleField)
+ // Finalize by doing the actual binding to the Person class
+ .bind(
+ // Callback that loads the title from a person instance
+ Person::getTitle,
+ // Callback that saves the title in a person instance
+ Person::setTitle));
+
+TextField nameField = new TextField();
+
+// Shorthand for cases without extra configuration
+binder.bind(nameField, Person::getName, Person::setName);
+----
+
+When we have bound field components using our binder, we can use the binder to load values from a person into the field, let the user edit the values and finally save the values back into a person instance.
+
+[source, java]
+----
+// The person to edit
+// Would be loaded from the backend in a real application
+Person person = new Person("John Doe", 1957);
+
+// Updates the value in each bound field component
+binder.load(person);
+
+Button saveButton = new Button("Save",
+ event -> {
+ try {
+ binder.save(person);
+ // A real application would also save the updated person
+ // using the application's backend
+ } catch (BindingException e) {
+ Notification.show("Person could not be saved, " +
+ "please check error messages for each field.");
+ }
+});
+
+// Updates the fields again with the previously saved values
+Button resetButton = new Button("Reset",
+ event -> binder.load(person));
+----
+
+With these basic steps, we have defined everything that is needed for loading, editing and saving values for a form.
+
+The above example uses Java 8 method references for defining how field values are loaded and saved. It is also possible to use a lambda expression or an explicit instance of the callback interface instead of a method reference.
+
+[source, java]
+----
+// With lambda expressions
+binder.bind(titleField,
+ person -> person.getTitle(),
+ (person, title) -> person.setTitle(title));
+
+// With explicit callback interface instances
+binder.bind(nameField,
+ new Function<Person, String>() {
+ @Override
+ public String apply(Person person) {
+ return person.getName();
+ }
+ },
+ new BiConsumer<Person, String>() {
+ @Override
+ public void accept(Person person, String name) {
+ person.setName(name);
+ }
+ });
+----
+
+== Validating User Input
+
+An application typically has some restrictions on exactly what kinds of values the user is allowed to enter into different fields.
+[classname]#Binder# lets us define validators for each field that we are binding.
+The validator is by default run whenever the user changes the value of a field, and the validation status is also checked again when saving.
+
+Validators for a field are defined between the [methodname]#forField# and [methodname]#bind# steps when a binding is created.
+A validator can be defined using an [classname]#Validator# instance or inline using a lambda expression.
+
+[source, java]
+----
+binder.forField(emailField)
+ // Explicit validator instance
+ .withValidator(new EmailValidator(
+ "This doesn't look like a valid email address"))
+ .bind(Person::getEmail, Person::setEmail);
+
+binder.forField(nameField)
+ // Validator defined based on a lambda and an error message
+ .withValidator(
+ name -> name.length() >= 3,
+ "Full name must contain at least three characters")
+ .bind(Person::getName, Person::setName);
+
+binder.forField(titleField)
+ // Shorthand for requiring the field to be non-empty
+ .setRequired("Every employee must have a title")
+ .bind(Person::getTitle, Person::setTitle);
+----
+
+[NOTE] [classname]#Binder#.[methodname]#forField# works like a builder where [methodname]#forField# starts the process, is followed by various configuration calls for the field and [methodname]#bind# acts as the finalizing method which applies the configuration.
+
+The validation state of each field is updated whenever the user modifies the value of that field.
+The validation state is by default shown using [classname]#Component#.[methodname]#setComponentError# which is used by the layout that the field is shown in. Whenever an error is set, the component will also get a `v-<component>-error` class name, e.g. `v-textfield-error`. This error class will by default add a red border on the component. Most built-in layouts will show the error state as a red exclamation mark icon next to the component, so that hovering or tapping the icon shows a tooltip with the message text.
+
+We can also customize the way a binder displays error messages to get more flexibility than what [methodname]#setComponentError# provides.
+The easiest way of customizing this is to configure each binding to use its own [classname]#Label# that is used to show the status for each field.
+
+[NOTE] The status label is not only used for validation errors but also for showing confirmation and helper messages.
+
+[source, java]
+----
+Label emailStatus = new Label();
+
+binder.forField(emailField)
+ .withValidator(new EmailValidator(
+ "This doesn't look like a valid email address"))
+ // Shorthand that updates the label based on the status
+ .withStatusLabel(emailStatus)
+ .bind(Person::getEmail, Person::setEmail);
+
+Label nameStatus = new Label();
+
+binder.forField(nameField)
+ .withValidator(
+ name -> name.length() >= 3,
+ "Full name must contain at least three characters")
+ .withStatusChangeHandler(statusChange -> {
+ nameStatus.setValue(statusChange.getMessage());
+ // Only show the label when validation has failed
+ boolean error = statusChange.getStatus() == Status.ERROR;
+ nameStatus.setVisible(error);
+ })
+ .bind(Person::getName, Person::setName);
+----
+
+In addition to showing a validation errors, [classname]#Binder# can also be configured to show a positive confirmation message when validation has passed or a neutral helper message when there is no other message to show for that field.
+
+[source, java]
+----
+binder.forField(titleField)
+ .setRequired("Every employee must have a title")
+ .withHelperMessage("The title is printed on business cards")
+ .bind(Person::getTitle, Person::setTitle);
+
+binder.forField(emailField)
+ .withValidator(new EmailValidator(
+ "This doesn't look like a valid email address"))
+ .withConfirmationMessage(
+ email -> email + " looks like a valid email address");
+ .bind(Person::getEmail, Person::setEmail);
+
+----
+
+The previous example also shows that the message to show can be generated dynamically based on the field value using a lambda expression or an explicit [classname]#Function# instance.
+The same way of defining the message is also available for other messages, such as any validation message.
+Just as other messages, the confirmation message can also be set as a static [classname]#String#.
+
+It is possible to add multiple validators for the same binding.
+In such cases, each validator will be run in the defined order until encountering one validator that doesn't accept the input value.
+The following example will first validate that the entered text looks like an email address, and only for seemingly valid email addresses it will continue checking that the email address is for the expected domain.
+
+[source, java]
+----
+binder.setForField(emailField)
+ .withValidator(new EmailValidator(
+ "This doesn't look like a valid email address"))
+ .withValidator(
+ email -> email.endsWith("@acme.com"),
+ "Only acme.com email addresses are allowed")
+ .bind(Person::getEmail, Person::setEmail);
+----
+
+In some cases, the validation of one field depends on the value of some other field.
+We can save the binding to a local variable and trigger a revalidation when another field fires a value change event.
+
+[source, java]
+----
+PopupDateField departing = new PopupDateField("Departing");
+PopupDateField returning = new PopupDateField("Returning");
+
+// Store return date binding so we can revalidate it later
+FieldBinding<Trip, LocalDate> returnBinding = binder
+ .forField(returning)
+ .withValidator(
+ returnDate -> !returnDate.isBefore(departing.getValue()),
+ "Cannot return before departing")
+ .bind(Trip::getReturnDate, Trip::setReturnDate);
+
+// Revalidate return date when departure date changes
+departing.onChange(newValue -> returnBinding.validate());
+----
+
+== Converting User Input
+
+The data type of the used UI field component might not always match the type used by the application for the same data.
+In some cases, there might be types specific for the application, such as custom type that encapsulates a postal code that the user enters through a [classname]#TextField#.
+Another quite typical case is for entering integer numbers using a [classname]#TextField# or a [classname]#Slider#.
+Similarly to validators, we can define a converter using a [classname]#Converter instance or inline using lambda expressions. We can optionally specify also an error message.
+
+[source, java]
+----
+TextField yearOfBirthField = new TextField("Year of birth");
+
+binder.forField(yearOfBirthField)
+ .withConverter(
+ new StringToIntegerConverter("Must enter a number"))
+ .bind(Person::getYearOfBirth, Person::setYearOfBirth);
+
+// Slider for integers between 1 and 10
+Slider salaryLevelField = new Slider("Salary level", 1, 10);
+
+binder.forField(salaryLevelField)
+ .withConverter(Integer::doubleValue, Double::intValue)
+ .bind(Person::getSalaryLevel, Person::setSalaryLevel);
+
+----
+
+We can freely mix validators and converters when defining a binding.
+Any validator defined before a converter will be run using the unconverted value whereas a validator defined after a converter will be run using the converted value.
+Correspondingly, the converter will only be run if all previous validators accept the user's value, and any validators defined after a converter will only be run if the conversion succeeded.
+
+[NOTE] A converter can be used as a validator but for code clarity and to avoid boilerplate code, you should use a validator when checking the contents and a converter when modifying the value.
+
+[source, java]
+----
+binder.forField(yearOfBirthField)
+ // Validator will be run with the String value of the field
+ .withValidator(text -> text.length() == 4,
+ "Doesn't look like a year")
+ // Converter will only be run for strings with 4 characters
+ .withConverter(
+ new StringToIntegerConverter("Must enter a number"))
+ // Validator will be run with the converted value
+ .withValidator(year -> year >= 1900 && year < 2000,
+ "Person must be born in the 20th century")
+ .bind(Person::getYearOfBirth, Person::setYearOfBirth);
+----
+
+If the lambda expression used for converting the user-provided value throws an unchecked exception, then the field will be marked as invalid and the message of the exception will be used as the validation error message.
+Messages in Java runtime exceptions are typically written with developers in mind and might not be suitable to show to end users.
+We can provide a custom error message that is used whenever the conversion throws an unchecked exception.
+
+[source, java]
+----
+binder.forField(yearOfBirthField)
+ .withConverter(
+ Integer::valueOf,
+ String::valueOf,
+ // Text to use instead of the NumberFormatException message
+ "Please enter a number")
+ .bind(Person::getYearOfBirth, Person::setYearOfBirth);
+----
+
+Another option is to directly implement the [interfacename]#Converter# interface where the conversion method returns a [interfacename]#Result# that can either be a converted value or an error message.
+
+[source, java]
+----
+class MyConverter implements Converter<String, Integer> {
+ @Override
+ public Result<Integer> fromField(String fieldValue) {
+ // Produces a converted value or an error
+ try {
+ // ok is a static helper method that creates a Result
+ return ok(Integer.valueOf(fieldValue));
+ } catch (NumberFormatException e) {
+ // error is a static helper method that creates a Result
+ return error("Please enter a number");
+ }
+ }
+
+ @Override
+ public String toField(Integer integer) {
+ // Converting to the field type should always succeed,
+ // so there is no support for returning an error Result.
+ return String.valueOf(integer);
+ }
+}
+
+// Using the converter
+binder.forField(yearOfBirthField)
+ .withConverter(new MyConverter())
+ .bind(Person::getYearOfBirth, Person::setYearOfBirth);
+----
+
+== Loading from and Saving to Business Objects
+
+As shown in the introduction, the [classname]#Binder#.[methodname]#load# method is used for populating field values based on a business object and the [methodname]#save# method is used for writing values from the fields into a business object, provided validation and conversion passes.
+
+A new form is often shown with empty default values.
+To avoid showing lots of errors to the user, the validation error is not shown until the user edits each field after the form has been bound or loaded.
+Helper and confirmation messages will still be shown right away when appropriate.
+
+Even if the user has not edited a field, all validation error will be shown if we explicitly validate the form or try to save the values to a business object.
+
+[source, java]
+----
+// Resets the form to show default values by populating the fields with the default values from the bean
+binder.load(new Person());
+
+// This will make all current validation errors visible
+Set<BinderResult> validationErrors = binder.validate();
+
+if (!validationErrors.isEmpty()) {
+ Notification.show("Validation error count: "
+ + validationErrors.size());
+}
+----
+
+Trying to save the field values to a business object will fail if any of the bound fields has an invalid value.
+There are different save methods that let us choose how to structure the code for dealing with invalid values.
+
+Handling a checked exception::
++
+--
+[source, java]
+----
+try {
+ binder.save(person);
+} catch (BindingException e) {
+ Notification.show("Validation error count: "
+ + e.getValidationErrors().size());
+}
+----
+--
+
+Defining an error handler when saving::
++
+--
+[source, java]
+----
+binder.save(person,
+ // Callback invoked if there is an error
+ errors -> {
+ Notification.show("Validation error count: "
+ + errors.size())
+ }
+);
+----
+--
+
+Checking a return value::
++
+--
+[source, java]
+----
+boolean saved = binder.saveIfValid(person);
+if (!saved) {
+ Notification.show("Validation error count: "
+ + binder.getValidationErrors().size());
+}
+----
+--
+
+Binder keeps track of which bindings have been updated by the user and which bindings are in an invalid state.
+It also fires an event when this status changes.
+We can use that event to make the save and reset buttons of our forms become enabled or disabled depending on the current status of the form.
+
+[source, java]
+----
+binder.addStatusChangeListener(event -> {
+ // isValid() only checks the status, but doesn't make all
+ // validation errors visible in the way that validate() does
+ boolean isValid = binder.isValid();
+ boolean hasChanges = binder.hasChanges();
+
+ saveButton.setEnabled(hasChanges && isValid);
+ resetButton.setEnable(hasChanges);
+});
+----
+
+We can also listen for any change to any of the bound fields.
+This is useful for creating a user interface where changes are saved immediately without any save button.
+
+[source, java]
+----
+// Invoked when the value of any bound field component changes
+binder.addFieldValueChangeListener(event -> {
+ if (binder.saveIfValid(person)) {
+ // We only get here if there are no validation errors
+
+ // TODO: Do something with the updated person instance
+ }
+});
+----
+
+In the previous example, a validation error in one field will prevent changes to other fields from being saved.
+If we want all the fields to work independently of each other, we can instead save the value of each binding separately.
+
+[source, java]
+----
+binder.addFieldValueChangeListener(event -> {
+ Binding<Person, ?> binding = event.getBinding();
+ if (binding.saveIfValid(person)) {
+ // We get here if the updated binding had no validation errors
+
+ // TODO: Do something with the updated person instance
+ }
+});
+----
+
+=== Automatic Saving
+
+Instead of manually saving field values to a business object instance, we can also bind the values directly to an instance.
+In this way, the binder takes care of automatically saving values from the fields.
+
+[source, java]
+----
+Binder<Person> binder = new Binder<>();
+
+// Field binding configuration omitted, it should be done here
+
+Person person = new Person("John Doe", 1957);
+
+// Loads the values from the person instance
+// Sets person to be updated when any bound field is updated
+binder.bind(person);
+
+Button saveButton = new Button("Save", event -> {
+ if (binder.isValid()) {
+ // person is always up-to-date as long as there are no
+ // validation errors
+
+ // TODO: Do something with the updated person instance
+ }
+});
+----
+
+[WARNING]
+When using the [methodname]#bind# method, the business object instance will be updated whenever the user changes the value in any bound field.
+If some other part of the application is also using the same instance, then that part might show changes before the user has clicked the save button.
+
+The [methodname]#bind# method returns an [interfacename]#ItemBinding# instance that we can use to further configure the binding.
+We can change the binding to use a different business object, cancel the binding, or change whether a validation error prevents other values from being saved.
+
+[source, java]
+----
+ItemBinding<Person> binding = binder.bind(person);
+
+// Makes the binding save new values for valid fields even if
+// other fields are invalid
+binding.setSaveWhenInvalid(true);
+
+// Field changes will update anotherPerson instead of person
+binding.bind(anotherPerson);
+
+// Field changes will no longer update any person instance
+binding.cancel();
+----
+
+== Binding Beans to Forms
+
+The business objects used in an application are in most cases implemented as Java beans.
+There is special support for that kind of business object in [classname]#BeanBinder#.
+It can use reflection based on bean property names to bind values. This reduces the amount of code you have to write when binding to fields in the bean.
+
+[source, java]
+----
+BeanBinder<Person> binder = new BeanBinder<>(Person.class);
+
+// Bind based on property name
+binder.bind(nameField, "name");
+// Bind based on sub property path
+binder.bind(streetAddressField, "address.street");
+// Bind using forField for additional configuration
+binder.forField(yearOfBirthField)
+ .withConverter(
+ new StringToIntegerConverter("Please enter a number"))
+ .bind("yearOfBirth");
+----
+
+[NOTE]
+[classname]#BeanBinder# uses strings to identify the properties so it is not refactor safe.
+
+[classname]#BeanBinder# will automatically use JSR 303 Bean Validation annotations from the bean class if a Bean Validation implementation is available.
+Constraints defined for properties in the bean will work in the same way as if configured when the binding is created.
+
+[source, java]
+----
+public class Person {
+ @Min(2000)
+ private int yearOfBirth;
+
+ //Non-standard constraint provided by Hibernate Validator
+ @NotEmpty
+ private String name;
+
+ // + other fields, constructors, setters, and getters
+ ...
+}
+----
+
+It can sometimes be necessary to restrict when certain constraint annotations are active.
+One such case is if administrator users are allowed to bypass some restrictions or if the backend should also perform validation, but with less strict constraints.
+
+
+We can define a marker class for configuring a constraint to belong to a specific group and then configure [classname]#BeanBinder# to only use constraints from specific groups.
+
+[source, java]
+----
+// Constraint defined for the default group
+@Size(min = 3, groups = FrontendValidation.class)
+private String title;
+
+// Constraint defined for a specific group
+@NotEmpty
+private String name;
+----
+
+We can now set our binder to use the frontend validation group in addition to the default group, leaving the backend to only validate based on the constraints defined for the default group.
+
+[source, java]
+----
+binder.setConstraintGroups(
+ FrontendValidation.class,
+ javax.validation.groups.Default.class);
+----
+
+[TIP]
+We can also configure our binder to not use the default group but only use a group that is not used for any of the constraint annotations on the bean.
+By doing so, all annotations on the bean will be ignored so that we can define our own validation for the user interface even though Bean Validation is used by the application's backend.
+
+Constraint annotations can also be defined on the bean level instead of being defined for any specific property.
+Validation errors caused by that kind of validation might not be directly associated with any field component shown in the user interface, so [classname]#BeanBinder# cannot know where such messages should be displayed.
+
+Similarly to how the [methodname]#withStatusLabel# method can be used for defining where messages for a specific binding should be showed, we can also define a [classname]#Label# that is used for showing status messages that are not related to any specific field.
+
+[source, java]
+----
+Label formStatusLabel = new Label();
+
+BeanBinder<Person> binder = new BeanBinder<>(Person.class);
+
+binder.setStatusLabel(formStatusLabel);
+
+// Continue by binding fields
+----
+
+We can also define our own status handler to provide a custom way of handling statuses.
+
+[source, java]
+----
+BinderStatusHandler defaultHandler = binder.getStatusHandler();
+
+binder.setStatusHandler((List<BinderResult> results) -> {
+ String errorMessage = results.stream()
+ // Ignore helper and confirmation messages
+ .filter(BinderResult::isError)
+ // Ignore messages that belong to a specific field
+ .filter(error -> !error.getField().isPresent())
+ // Create a string out of the remaining messages
+ .map(BinderResult::getMessage)
+ .collect(Collectors.joining("\n"));
+
+ formStatusLabel.setValue(errorMessage);
+ formStatusLabel.setVisible(!errorMessage.isEmpty());
+
+ // Let the default handler show messages for each field
+ defaultHandler.handleStatus(results);
+});
+----
+
+[classname]#BeanBinder# will automatically run bean-level validation based on the used bean instance if it has been bound using the [methodname]#bind# method.
+
+If we are using the [methodname]#load# and [methodname]#save# methods, then the binder will not have any bean instance to use for bean-level validation.
+We must use a copy of the bean for running bean-level validation if we want to make sure no changes are done to the original bean before we know that validation passes.
+
+[source, java]
+----
+Button saveButton = new Button("Save", event -> {
+ // Create non-shared copy to use for validation
+ Person copy = new Person(person);
+
+ Set<BinderResult> errors = binder.validateWithBean(copy);
+ if (errors.isEmpty()) {
+ // Write new values to the actual bean
+
+ // Using saveIfValid to avoid the try-catch block that is
+ // needed if using the regular save method
+ binder.saveIfValid(person);
+
+ // TODO: Do something with the updated person instance
+ }
+})
+----
+
+== Using Binder with Vaadin Designer
+We can use [classname]#Binder# to connect data to a form that is designed using Vaadin Designer.
+
+This is the design HTML file that we create using Vaadin Designer:
+[source, html]
+----
+<vaadin-form-layout size-full>
+ <vaadin-text-field _id="name"
+ caption="Name"></vaadin-text-field>
+ <vaadin-text-field _id="yearOfBirth"
+ caption="Year of birth"></vaadin-text-field>
+ <vaadin-button _id="save">
+ Save
+ </vaadin-button>
+</vaadin-form-layout>
+----
+
+This is the companion Java file that Vaadin Designer creates for us based on the design.
+[source, java]
+----
+@DesignRoot
+@AutoGenerated
+public class PersonFormDesign extends FormLayout {
+ protected TextField name;
+ protected TextField yearOfBirth;
+ protected Button save;
+
+ public MyFormDesign() {
+ Design.read(this);
+ }
+}
+----
+
+Based on those files, we can create a subclass of the design that uses a [classname]#BeanBinder# to automatically connect bean properties to field instances.
+This will look at all instance fields that are of a Field type in the class and try to find a bean property with the same name.
+The binder will automatically use a [interfacename]#ConverterFactory# to find a converter in case the type of the field component doesn't match the type of the bean property.
+
+[source, java]
+----
+public class PersonForm extends PersonFormDesign {
+ private BeanBinder<Person> binder
+ = new BeanBinder<>(Person.class);
+
+ public PersonForm(Person person) {
+ binder.bindInstanceFields(this);
+
+ binder.load(person);
+
+ save.addClickListener(event -> {
+ if (binder.saveIfValid(person)) {
+ // TODO: Do something with the updated person instance
+ }
+ });
+ }
+
+}
+----
+
+We can also bind some of the fields before calling [methodname]#bindInstanceFields#.
+In this way, fields that require special configuration can still be configured manually while regular fields can be configured automatically.
+
+[source,java]
+----
+binder.forField(yearOfBirth)
+ .withConverter(
+ new StringToIntegerConverter("Please enter a number"))
+ .bind(Person::getYearOfBirth, Person::setYearOfBirth));
+
+binder.bindInstanceFields(this);
+----
diff --git a/documentation/datamodel/datamodel-itembinding.asciidoc b/documentation/datamodel/datamodel-itembinding.asciidoc
deleted file mode 100644
index fd21b72267..0000000000
--- a/documentation/datamodel/datamodel-itembinding.asciidoc
+++ /dev/null
@@ -1,377 +0,0 @@
----
-title: Creating Forms by Binding Fields to Items
-order: 4
-layout: page
----
-
-[[datamodel.itembinding]]
-= Creating Forms by Binding Fields to Items
-
-Most applications in existence have forms of some sort. Forms contain fields,
-which you want to bind to a data source, an item in the Vaadin data model.
-[classname]#FieldGroup# provides an easy way to bind fields to the properties of
-an item. You can use it by first creating a layout with some fields, and then
-call it to bind the fields to the data source. You can also let the
-[classname]#FieldGroup# create the fields using a field factory. It can also
-handle commits. Notice that [classname]#FieldGroup# is not a user interface
-component, so you can not add it to a layout.
-
-[[datamodel.itembinding.simple]]
-== Simple Binding
-
-Let us start with a data model that has an item with a couple of properties. The
-item could be any item type, as described earlier.
-
-
-----
-// Have an item
-PropertysetItem item = new PropertysetItem();
-item.addItemProperty("name", new ObjectProperty<String>("Zaphod"));
-item.addItemProperty("age", new ObjectProperty<Integer>(42));
-----
-
-Next, you would design a form for editing the data. The [classname]#FormLayout#
-(
-<<dummy/../../../framework/layout/layout-formlayout#layout.formlayout,"FormLayout">>
-is ideal for forms, but you could use any other layout as well.
-
-
-----
-// Have some layout and create the fields
-FormLayout form = new FormLayout();
-
-TextField nameField = new TextField("Name");
-form.addComponent(nameField);
-
-TextField ageField = new TextField("Age");
-form.addComponent(ageField);
-----
-
-Then, we can bind the fields to the data as follows:
-
-
-----
-// Now create the binder and bind the fields
-FieldGroup binder = new FieldGroup(item);
-binder.bind(nameField, "name");
-binder.bind(ageField, "age");
-----
-
-The above way of binding is not different from simply calling
-[methodname]#setPropertyDataSource()# for the fields. It does, however, register
-the fields in the field group, which for example enables buffering or validation
-of the fields using the field group, as described in
-<<datamodel.itembinding.buffering>>.
-
-Next, we consider more practical uses for a [classname]#FieldGroup#.
-
-
-[[datamodel.itembinding.fieldfactory]]
-== Using a [interfacename]#FieldFactory# to Build and Bind Fields
-
-Using the [methodname]#buildAndBind()# methods, [classname]#FieldGroup# can
-create fields for you using a [interfacename]#FieldGroupFieldFactory#, but you
-still have to add them to the correct position in your layout.
-
-
-----
-// Have some layout
-FormLayout form = new FormLayout();
-
-// Now create a binder that can also create the fields
-// using the default field factory
-FieldGroup binder = new FieldGroup(item);
-form.addComponent(binder.buildAndBind("Name", "name"));
-form.addComponent(binder.buildAndBind("Age", "age"));
-----
-
-
-[[datamodel.itembinding.formclass]]
-== Binding Member Fields
-
-The [methodname]#bindMemberFields()# method in [classname]#FieldGroup# uses
-reflection to bind the properties of an item to field components that are member
-variables of a class. Hence, if you implement a form as a class with the fields
-stored as member variables, you can use this method to bind them super-easy.
-
-The item properties are mapped to the members by the property ID and the name of
-the member variable. If you want to map a property with a different ID to a
-member, you can use the [literal]#++@PropertyId++# annotation for the member,
-with the property ID as the parameter.
-
-For example:
-
-
-----
-// Have an item
-PropertysetItem item = new PropertysetItem();
-item.addItemProperty("name", new ObjectProperty<String>("Zaphod"));
-item.addItemProperty("age", new ObjectProperty<Integer>(42));
-
-// Define a form as a class that extends some layout
-class MyForm extends FormLayout {
- // Member that will bind to the "name" property
- TextField name = new TextField("Name");
-
- // Member that will bind to the "age" property
- @PropertyId("age")
- TextField ageField = new TextField("Age");
-
- public MyForm() {
- // Customize the layout a bit
- setSpacing(true);
-
- // Add the fields
- addComponent(name);
- addComponent(ageField);
- }
-}
-
-// Create one
-MyForm form = new MyForm();
-
-// Now create a binder that can also creates the fields
-// using the default field factory
-FieldGroup binder = new FieldGroup(item);
-binder.bindMemberFields(form);
-
-// And the form can be used in an higher-level layout
-layout.addComponent(form);
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.itembinding.formclass.extended[on-line example, window="_blank"].
-
-[[datamodel.itembinding.formclass.customcomponent]]
-=== Encapsulating in [classname]#CustomComponent#
-
-Using a [classname]#CustomComponent# can be better for hiding the implementation
-details than extending a layout. Also, the use of the [classname]#FieldGroup#
-can be encapsulated in the form class.
-
-Consider the following as an alternative for the form implementation presented
-earlier:
-
-
-----
-// A form component that allows editing an item
-class MyForm extends CustomComponent {
- // Member that will bind to the "name" property
- TextField name = new TextField("Name");
-
- // Member that will bind to the "age" property
- @PropertyId("age")
- TextField ageField = new TextField("Age");
-
- public MyForm(Item item) {
- FormLayout layout = new FormLayout();
- layout.addComponent(name);
- layout.addComponent(ageField);
-
- // Now use a binder to bind the members
- FieldGroup binder = new FieldGroup(item);
- binder.bindMemberFields(this);
-
- setCompositionRoot(layout);
- }
-}
-
-// And the form can be used as a component
-layout.addComponent(new MyForm(item));
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.itembinding.formclass.customcomponent[on-line example, window="_blank"].
-
-
-
-[[datamodel.itembinding.buffering]]
-== Buffering Forms
-
-Just like for individual fields, as described in
-<<dummy/../../../framework/components/components-fields#components.fields.buffering,"Field
-Buffering">>, a [classname]#FieldGroup# can handle buffering the form content so
-that it is written to the item data source only when [methodname]#commit()# is
-called for the group. It runs validation for all fields in the group and writes
-their values to the item data source only if all fields pass the validation.
-Edits can be discarded, so that the field values are reloaded from the data
-source, by calling [methodname]#discard()#. Buffering is enabled by default, but
-can be disabled by calling [methodname]#setBuffered(false)# for the
-[classname]#FieldGroup#.
-
-
-----
-// Have an item of some sort
-final PropertysetItem item = new PropertysetItem();
-item.addItemProperty("name", new ObjectProperty<String>("Q"));
-item.addItemProperty("age", new ObjectProperty<Integer>(42));
-
-// Have some layout and create the fields
-Panel form = new Panel("Buffered Form");
-form.setContent(new FormLayout());
-
-// Build and bind the fields using the default field factory
-final FieldGroup binder = new FieldGroup(item);
-form.addComponent(binder.buildAndBind("Name", "name"));
-form.addComponent(binder.buildAndBind("Age", "age"));
-
-// Enable buffering (actually enabled by default)
-binder.setBuffered(true);
-
-// A button to commit the buffer
-form.addComponent(new Button("OK", new ClickListener() {
- @Override
- public void buttonClick(ClickEvent event) {
- try {
- binder.commit();
- Notification.show("Thanks!");
- } catch (CommitException e) {
- Notification.show("You fail!");
- }
- }
-}));
-
-// A button to discard the buffer
-form.addComponent(new Button("Discard", new ClickListener() {
- @Override
- public void buttonClick(ClickEvent event) {
- binder.discard();
- Notification.show("Discarded!");
- }
-}));
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.itembinding.formclass.customcomponent[on-line example, window="_blank"].
-
-
-[[datamodel.itembinding.beans]]
-== Binding Fields to a Bean
-
-The [classname]#BeanFieldGroup# makes it easier to bind fields to a bean. It
-also handles binding to nested beans properties. The build a field bound to a
-nested bean property, identify the property with dot notation. For example, if a
-[classname]#Person# bean has a [literal]#++address++# property with an
-[classname]#Address# type, which in turn has a [literal]#++street++# property,
-you could build a field bound to the property with
-[methodname]#buildAndBind("Street", "address.street")#.
-
-The input to fields bound to a bean can be validated using the Java Bean
-Validation API, as described in <<datamodel.itembinding.beanvalidation>>. The
-[classname]#BeanFieldGroup# automatically adds a [classname]#BeanValidator# to
-every field if a bean validation implementation is included in the classpath.
-
-
-[[datamodel.itembinding.beanvalidation]]
-== Bean Validation
-
-Vaadin allows using the Java Bean Validation API 1.0 (JSR-303) for validating
-input from fields bound to bean properties before the values are committed to
-the bean. The validation is done based on annotations on the bean properties,
-which are used for creating the actual validators automatically. See
-<<dummy/../../../framework/components/components-fields#components.fields.validation,"Field
-Validation">> for general information about validation.
-
-Using bean validation requires an implementation of the Bean Validation API,
-such as Hibernate Validator ( [filename]#hibernate-validator-4.2.0.Final.jar# or
-later) or Apache Bean Validation. The implementation JAR must be included in the
-project classpath when using the bean validation, or otherwise an internal error
-is thrown.
-
-Bean validation is especially useful when persisting entity beans with the
-Vaadin JPAContainer, described in
-<<dummy/../../../framework/jpacontainer/jpacontainer-overview.asciidoc#jpacontainer.overview,"Vaadin
-JPAContainer">>.
-
-[[datamodel.itembinding.beanvalidation.annotations]]
-=== Annotations
-
-The validation constraints are defined as annotations. For example, consider the
-following bean:
-
-
-----
-// Here is a bean
-public class Person implements Serializable {
- @NotNull
- @javax.validation.constraints.Size(min=2, max=10)
- String name;
-
- @Min(1)
- @Max(130)
- int age;
-
- // ... setters and getters ...
-}
-----
-
-For a complete list of allowed constraints for different data types, please see
-the link:http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html[Bean Validation
-API documentation].
-
-
-[[datamodel.itembinding.beanvalidation.validating]]
-=== Validating the Beans
-
-Validating a bean is done with a [classname]#BeanValidator#, which you
-initialize with the name of the bean property it should validate and add it the
-the editor field.
-
-In the following example, we validate a single unbuffered field:
-
-
-----
-Person bean = new Person("Mung bean", 100);
-BeanItem<Person> item = new BeanItem<Person> (bean);
-
-// Create an editor bound to a bean field
-TextField firstName = new TextField("First Name",
- item.getItemProperty("name"));
-
-// Add the bean validator
-firstName.addValidator(new BeanValidator(Person.class, "name"));
-
-firstName.setImmediate(true);
-layout.addComponent(firstName);
-----
-
-In this case, the validation is done immediately after focus leaves the field.
-You could do the same for the other field as well.
-
-Bean validators are automatically created when using a
-[classname]#BeanFieldGroup#.
-
-
-----
-// Have a bean
-Person bean = new Person("Mung bean", 100);
-
-// Form for editing the bean
-final BeanFieldGroup<Person> binder =
- new BeanFieldGroup<Person>(Person.class);
-binder.setItemDataSource(bean);
-layout.addComponent(binder.buildAndBind("Name", "name"));
-layout.addComponent(binder.buildAndBind("Age", "age"));
-
-// Buffer the form content
-binder.setBuffered(true);
-layout.addComponent(new Button("OK", new ClickListener() {
- @Override
- public void buttonClick(ClickEvent event) {
- try {
- binder.commit();
- } catch (CommitException e) {
- }
- }
-}));
-----
-
-
-[[datamodel.itembinding.beanvalidation.locale]]
-=== Locale Setting for Bean Validation
-
-The validation error messages are defined in the bean validation implementation,
-in a [filename]#ValidationMessages.properties# file. The message is shown in the
-language specified with the locale setting for the form. The default language is
-English, but for example Hibernate Validator contains translations of the
-messages for a number of languages. If other languages are needed, you need to
-provide a translation of the properties file.
-
-
-
-
-
diff --git a/documentation/datamodel/datamodel-items.asciidoc b/documentation/datamodel/datamodel-items.asciidoc
deleted file mode 100644
index 75a7c1ecf8..0000000000
--- a/documentation/datamodel/datamodel-items.asciidoc
+++ /dev/null
@@ -1,194 +0,0 @@
----
-title: Holding properties in Items
-order: 3
-layout: page
----
-
-[[datamodel.items]]
-= Holding properties in Items
-
-The [classname]#Item# interface provides access to a set of named properties.
-Each property is identified by a __property identifier__ (PID) and a reference
-to such a property can be queried from an [classname]#Item# with
-[methodname]#getItemProperty()# using the identifier.
-
-Examples on the use of items include rows in a [classname]#Table#, with the
-properties corresponding to table columns, nodes in a [classname]#Tree#, and the
-the data bound to a [classname]#Form#, with item's properties bound to
-individual form fields.
-
-Items are generally equivalent to objects in the object-oriented model, but with
-the exception that they are configurable and provide an event handling
-mechanism. The simplest way to utilize [classname]#Item# interface is to use
-existing implementations. Provided utility classes include a configurable
-property set ( [classname]#PropertysetItem#) and a bean-to-item adapter (
-[classname]#BeanItem#). Also, a [classname]#Form# implements the interface and
-can therefore be used directly as an item.
-
-In addition to being used indirectly by many user interface components, items
-provide the basic data model underlying the [classname]#Form# component. In
-simple cases, forms can even be generated automatically from items. The
-properties of the item correspond to the fields of the form.
-
-The [classname]#Item# interface defines inner interfaces for maintaining the
-item property set and listening changes made to it.
-[classname]#PropertySetChangeEvent# events can be emitted by a class
-implementing the [classname]#PropertySetChangeNotifier# interface. They can be
-received through the [classname]#PropertySetChangeListener# interface.
-
-ifdef::web[]
-[[datamodel.items.propertysetitem]]
-== The [classname]#PropertysetItem# Implementation
-
-The [classname]#PropertysetItem# is a generic implementation of the
-[classname]#Item# interface that allows storing properties. The properties are
-added with [methodname]#addItemProperty()#, which takes a name and the property
-as parameters.
-
-The following example demonstrates a typical case of collecting
-[classname]#ObjectProperty# properties in an item:
-
-
-----
-PropertysetItem item = new PropertysetItem();
-item.addItemProperty("name", new ObjectProperty("Zaphod"));
-item.addItemProperty("age", new ObjectProperty(42));
-
-// Bind it to a component
-Form form = new Form();
-form.setItemDataSource(item);
-----
-
-endif::web[]
-
-[[datamodel.items.beanitem]]
-== Wrapping a Bean in a [classname]#BeanItem#
-
-The [classname]#BeanItem# implementation of the [classname]#Item# interface is a
-wrapper for Java Bean objects. In fact, only the setters and getters are
-required while serialization and other bean features are not, so you can wrap
-almost any POJOs with minimal requirements.
-
-
-----
-// Here is a bean (or more exactly a POJO)
-class Person {
- String name;
- int age;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age.intValue();
- }
-}
-
-// Create an instance of the bean
-Person bean = new Person();
-
-// Wrap it in a BeanItem
-BeanItem<Person> item = new BeanItem<Person>(bean);
-
-// Bind it to a component
-Form form = new Form();
-form.setItemDataSource(item);
-----
-
-You can use the [methodname]#getBean()# method to get a reference to the
-underlying bean.
-
-[[datamodel.items.beanitem.nested]]
-=== Nested Beans
-
-You may often have composite classes where one class "has a" another class. For
-example, consider the following [classname]#Planet# class which "has a"
-discoverer:
-
-
-----
-// Here is a bean with two nested beans
-public class Planet implements Serializable {
- String name;
- Person discoverer;
-
- public Planet(String name, Person discoverer) {
- this.name = name;
- this.discoverer = discoverer;
- }
-
- ... getters and setters ...
-}
-
-...
-// Create an instance of the bean
-Planet planet = new Planet("Uranus",
- new Person("William Herschel", 1738));
-----
-
-When shown in a [classname]#Form#, for example, you would want to list the
-properties of the nested bean along the properties of the composite bean. You
-can do that by binding the properties of the nested bean individually with a
-[classname]#MethodProperty# or [classname]#NestedMethodProperty#. You should
-usually hide the nested bean from binding as a property by listing only the
-bound properties in the constructor.
-
-
-----
-// Wrap it in a BeanItem and hide the nested bean property
-BeanItem<Planet> item = new BeanItem<Planet>(planet,
- new String[]{"name"});
-
-// Bind the nested properties.
-// Use NestedMethodProperty to bind using dot notation.
-item.addItemProperty("discoverername",
- new NestedMethodProperty(planet, "discoverer.name"));
-
-// The other way is to use regular MethodProperty.
-item.addItemProperty("discovererborn",
- new MethodProperty<Person>(planet.getDiscoverer(),
- "born"));
-----
-
-The difference is that [classname]#NestedMethodProperty# does not access the
-nested bean immediately but only when accessing the property values, while when
-using [classname]#MethodProperty# the nested bean is accessed when creating the
-method property. The difference is only significant if the nested bean can be
-null or be changed later.
-
-You can use such a bean item for example in a [classname]#Form# as follows:
-
-
-----
-// Bind it to a component
-Form form = new Form();
-form.setItemDataSource(item);
-
-// Nicer captions
-form.getField("discoverername").setCaption("Discoverer");
-form.getField("discovererborn").setCaption("Born");
-----
-
-[[figure.datamodel.items.beanitem.nested]]
-.A [classname]#Form# with Nested Bean Properties
-image::img/beanitem-nested-beans.png[]
-
-The [classname]#BeanContainer# and [classname]#BeanItemContainer# allow easy
-definition of nested bean properties with
-[methodname]#addNestedContainerProperty()#, as described in
-<<dummy/../../../framework/datamodel/datamodel-container#datamodel.container.beancontainer.nestedproperties,"Nested
-Properties">>.
-
-
-
-
-
diff --git a/documentation/datamodel/datamodel-overview.asciidoc b/documentation/datamodel/datamodel-overview.asciidoc
index 95209e0b76..a98762fd23 100644
--- a/documentation/datamodel/datamodel-overview.asciidoc
+++ b/documentation/datamodel/datamodel-overview.asciidoc
@@ -7,66 +7,25 @@ layout: page
[[datamodel.overview]]
= Overview
-The Vaadin Data Model is one of the core concepts of the library. To allow the
-view (user interface components) to access the data model of an application
-directly, we have introduced a standard data interface.
+////
+TODO
-The model allows binding user interface components directly to the data that
-they display and possibly allow to edit. There are three nested levels of
-hierarchy in the data model: __property__, __item__, and __container__. Using a
-spreadsheet application as an analogy, these would correspond to a cell, a row,
-and a table, respectively.
+ * Item: typically a Java Bean, but can also be any other Java type
+ * Individual values in an item: callback or bean property name
+ * Collections of items: In-memory list or explicitly fetched on demand from a backend
+////
-.Vaadin Data Model
-image::img/datamodel-whitebg.png[]
+The Vaadin Data Model is one of the core concepts of the library.
+To allow the view (user interface components) to access the data model of an application directly, we have introduced a standard data interface.
-The Data Model is realized as a set of interfaces in the
-[classname]#com.vaadin.data# package. The package contains the
-[classname]#Property#, [classname]#Item#, and [classname]#Container# interfaces,
-along with a number of more specialized interfaces and classes.
+The model allows binding user interface components directly to data that can be viewed and possibly also edited.
-Notice that the Data Model does not define data representation, but only
-interfaces. This leaves the representation fully to the implementation of the
-containers. The representation can be almost anything, such as a plain old Java
-object (POJO) structure, a filesystem, or a database query.
+Notice that the Data Model does not define data representation, but only how components access the data.
+This leaves the representation fully to the implementation of the containers.
+The representation can be almost anything, such as a plain old Java object (POJO) structure, a filesystem, or a database query.
-The Data Model is used heavily in the core user interface components of Vaadin,
-especially the field components, that is, components that implement the
-[classname]#Field# interface or more typically extend
-[classname]#AbstractField#, which defines many common features. A key feature of
-all the built-in field components is that they can either maintain their data by
-themselves or be bound to an external data source. The value of a field is
-always available through the [classname]#Property# interface. As more than one
-component can be bound to the same data source, it is easy to implement various
-viewer-editor patterns.
-
-The relationships of the various interfaces are shown in
-<<figure.datamodel.overview.relationships>>; the value change event and listener
-interfaces are shown only for the [classname]#Property# interface, while the
-notifier interfaces are omitted altogether.
-
-[[figure.datamodel.overview.relationships]]
-.Interface Relationships in Vaadin Data Model
-image::img/datamodel-interfaces-hi.png[]
-
-The Data Model has many important and useful features, such as support for
-change notification. Especially containers have many helper interfaces,
-including ones that allow indexing, ordering, sorting, and filtering the data.
-Also [classname]#Field# components provide a number of features involving the
-data model, such as buffering, validation, and lazy loading.
-
-Vaadin provides a number of built-in implementations of the data model
-interfaces. The built-in implementations are used as the default data models in
-many field components.
-
-In addition to the built-in implementations, many data model implementations,
-such as containers, are available as add-ons, either from the Vaadin Directory
-or from independent sources. Both commercial and free implementations exist. The
-JPAContainer, described in
-<<dummy/../../../framework/jpacontainer/jpacontainer-overview.asciidoc#jpacontainer.overview,"Vaadin
-JPAContainer">>, is the most often used conmmercial container add-on. The
-installation of add-ons is described in
+Many data model implementations, such as data sources, are available as add-ons, either from the Vaadin Directory or from independent sources.
+Installation of add-ons is described in
<<dummy/../../../framework/addons/addons-overview.asciidoc#addons.overview,"Using
-Vaadin Add-ons">>. Notice that unlike with most regular add-on components, you
-do not need to compile a widget set for add-ons that include just data model
-implementations.
+Vaadin Add-ons">>.
+Notice that unlike with most regular add-on components, you do not need to compile a widget set for add-ons that include just data model implementations.
diff --git a/documentation/datamodel/datamodel-properties.asciidoc b/documentation/datamodel/datamodel-properties.asciidoc
deleted file mode 100644
index ed7bb44c35..0000000000
--- a/documentation/datamodel/datamodel-properties.asciidoc
+++ /dev/null
@@ -1,394 +0,0 @@
----
-title: Properties
-order: 2
-layout: page
----
-
-[[datamodel.properties]]
-= Properties
-
-The [interfacename]#Property# interface is the base of the Vaadin Data Model. It
-provides a standardized API for a single data value object that can be read
-(get) and written (set). A property is always typed, but can optionally support
-data type conversions. The type of a property can be any Java class. Optionally,
-properties can provide value change events for following their changes.
-
-You can set the value of a property with [methodname]#setValue()# and read with
-[methodname]#getValue()#.
-
-In the following, we set and read the property value from a
-[classname]#TextField# component, which implements the [interfacename]#Property#
-interface to allow accessing the field value.
-
-[source, java]
-----
-final TextField tf = new TextField("Name");
-
-// Set the value
-tf.setValue("The text field value");
-
-// When the field value is edited by the user
-tf.addValueChangeListener(
- new Property.ValueChangeListener() {
- public void valueChange(ValueChangeEvent event) {
- // Do something with the new value
- layout.addComponent(new Label(tf.getValue()));
- }
-});
-----
-See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.properties.basic[on-line example, window="_blank"].
-
-Changes in the property value usually fire a [classname]#ValueChangeEvent#,
-which can be handled with a [classname]#ValueChangeListener#. The event object
-provides reference to the property with [methodname]#getProperty()#. Note that
-its [methodname]#getValue()# method returns the value with [classname]#Object#
-type, so you need to cast it to the proper type.
-
-Properties are in themselves unnamed. They are collected in __items__, which
-associate the properties with names: the __Property Identifiers__ or __PID__s.
-Items can be further contained in containers and are identified with __Item
-Identifiers__ or __IID__s. In the spreadsheet analogy, __Property Identifiers__
-would correspond to column names and __Item Identifiers__ to row names. The
-identifiers can be arbitrary objects, but must implement the
-[methodname]#equals(Object)# and [methodname]#hashCode()# methods so that they
-can be used in any standard Java [classname]#Collection#.
-
-The [classname]#Property# interface can be utilized either by implementing the
-interface or by using some of the built-in property implementations. Vaadin
-includes a [classname]#Property# interface implementation for arbitrary function
-pairs and bean properties, with the [classname]#MethodProperty# class, and for
-simple object properties, with the [classname]#ObjectProperty# class, as
-described later.
-
-In addition to the simple components, selection components provide their current
-selection as the property value. In single selection mode, the property is a
-single item identifier, while in multiple selection mode it is a set of item
-identifiers. See the documentation of the selection components for further
-details.
-
-Components that can be bound to a property have an internal default data source
-object, typically a [classname]#ObjectProperty#, which is described later. As
-all such components are viewers or editors, also described later, so you can
-rebind a component to any data source with
-[methodname]#setPropertyDataSource()#.
-
-[[datamodel.properties.viewers]]
-== Property Viewers and Editors
-
-The most important function of the [classname]#Property# as well as of the other
-data model interfaces is to connect classes implementing the interface directly
-to editor and viewer classes. This means connecting a data source (model) to a
-user interface component (views) to allow editing or viewing the data model.
-
-A property can be bound to a component implementing the [classname]#Viewer#
-interface with [methodname]#setPropertyDataSource()#.
-
-[source, java]
-----
-// Have a data model
-ObjectProperty property =
- new ObjectProperty("Hello", String.class);
-
-// Have a component that implements Viewer
-Label viewer = new Label();
-
-// Bind it to the data
-viewer.setPropertyDataSource(property);
-----
-
-You can use the same method in the [classname]#Editor# interface to bind a
-component that allows editing a particular property type to a property.
-
-[source, java]
-----
-// Have a data model
-ObjectProperty property =
- new ObjectProperty("Hello", String.class);
-
-// Have a component that implements Viewer
-TextField editor = new TextField("Edit Greeting");
-
-// Bind it to the data
-editor.setPropertyDataSource(property);
-----
-
-As all field components implement the [classname]#Property# interface, you can
-bind any component implementing the [classname]#Viewer# interface to any field,
-assuming that the viewer is able the view the object type of the field.
-Continuing from the above example, we can bind a [classname]#Label# to the
-[classname]#TextField# value:
-
-[source, java]
-----
-Label viewer = new Label();
-viewer.setPropertyDataSource(editor);
-
-// The value shown in the viewer is updated immediately
-// after editing the value in the editor (once it
-// loses the focus)
-editor.setImmediate(true);
-----
-
-If a field has validators, as described in
-<<dummy/../../../framework/components/components-fields#components.fields.validation,"Field
-Validation">>, the validators are executed before writing the value to the
-property data source, or by calling the [methodname]#validate()# or
-[methodname]#commit()# for the field.
-
-
-[[datamodel.properties.objectproperty]]
-== [classname]#ObjectProperty# Implementation
-
-The [classname]#ObjectProperty# class is a simple implementation of the
-[classname]#Property# interface that allows storing an arbitrary Java object.
-
-[source, java]
-----
-// Have a component that implements Viewer interface
-final TextField tf = new TextField("Name");
-
-// Have a data model with some data
-String myObject = "Hello";
-
-// Wrap it in an ObjectProperty
-ObjectProperty property =
- new ObjectProperty(myObject, String.class);
-
-// Bind the property to the component
-tf.setPropertyDataSource(property);
-----
-
-[[datamodel.properties.converter]]
-== Converting Between Property Type and Representation
-
-Fields allow editing a certain type, such as a [classname]#String# or
-[classname]#Date#. The bound property, on the other hand, could have some
-entirely different type. Conversion between a representation edited by the field
-and the model defined in the property is handler with a converter that
-implements the [interfacename]#Converter# interface.
-
-Most common type conversions, such as between string and integer, are handled by
-the default converters. They are created in a converter factory global in the
-application.
-
-[[datamodel.properties.converter.basic]]
-=== Basic Use of Converters
-
-The [methodname]#setConverter([interfacename]#Converter#)# method sets the
-converter for a field. The method is defined in [classname]#AbstractField#.
-
-[source, java]
-----
-// Have an integer property
-final ObjectProperty<Integer> property =
- new ObjectProperty<Integer>(42);
-
-// Create a TextField, which edits Strings
-final TextField tf = new TextField("Name");
-
-// Use a converter between String and Integer
-tf.setConverter(new StringToIntegerConverter());
-
-// And bind the field
-tf.setPropertyDataSource(property);
-----
-
-The built-in converters are the following:
-
-[[datamodel.properties.converter.basic.built-in]]
-.Built-in Converters
-[options="header"]
-|===============
-|Converter|Representation|Model
-|[classname]#StringToIntegerConverter#|[classname]#String#|[classname]#Integer#
-|[classname]#StringToDoubleConverter#|[classname]#String#|[classname]#Double#
-|[classname]#StringToNumberConverter#|[classname]#String#|[classname]#Number#
-|[classname]#StringToBooleanConverter#|[classname]#String#|[classname]#Boolean#
-|[classname]#StringToDateConverter#|[classname]#String#|[classname]#Date#
-|[classname]#DateToLongConverter#|[classname]#Date#|[classname]#Long#
-
-|===============
-
-
-
-In addition, there is a [classname]#ReverseConverter# that takes a converter as
-a parameter and reverses the conversion direction.
-
-If a converter already exists for a type, the
-[methodname]#setConverter([interfacename]#Class#)# retrieves the converter for
-the given type from the converter factory, and then sets it for the field. This
-method is used implicitly when binding field to a property data source.
-
-
-[[datamodel.properties.converter.custom]]
-=== Implementing a Converter
-
-A conversion always occurs between a __representation type__, edited by the
-field component, and a __model type__, that is, the type of the property data
-source. Converters implement the [interfacename]#Converter# interface defined in
-the [package]#com.vaadin.data.util.converter# package.
-
-For example, let us assume that we have a simple [classname]#Complex# type for
-storing complex values.
-
-[source, java]
-----
-public class ComplexConverter
- implements Converter<String, Complex> {
- @Override
- public Complex convertToModel(String value, Locale locale)
- throws ConversionException {
- String parts[] =
- value.replaceAll("[\\(\\)]", "").split(",");
- if (parts.length != 2)
- throw new ConversionException(
- "Unable to parse String to Complex");
- return new Complex(Double.parseDouble(parts[0]),
- Double.parseDouble(parts[1]));
- }
-
- @Override
- public String convertToPresentation(Complex value,
- Locale locale)
- throws ConversionException {
- return "("+value.getReal()+","+value.getImag()+")";
- }
-
- @Override
- public Class<Complex> getModelType() {
- return Complex.class;
- }
-
- @Override
- public Class<String> getPresentationType() {
- return String.class;
- }
-}
-----
-
-The conversion methods get the locale for the conversion as a parameter.
-
-
-[[datamodel.properties.converter.converterfactory]]
-=== Converter Factory
-
-If a field does not directly allow editing a property type, a default converter
-is attempted to create using an application-global converter factory. If you
-define your own converters that you wish to include in the converter factory,
-you need to implement one yourself. While you could implement the
-[interfacename]#ConverterFactory# interface, it is usually easier to just extend
-[classname]#DefaultConverterFactory#.
-
-[source, java]
-----
-class MyConverterFactory extends DefaultConverterFactory {
- @Override
- public <PRESENTATION, MODEL> Converter<PRESENTATION, MODEL>
- createConverter(Class<PRESENTATION> presentationType,
- Class<MODEL> modelType) {
- // Handle one particular type conversion
- if (String.class == presentationType &&
- Complex.class == modelType)
- return (Converter<PRESENTATION, MODEL>)
- new ComplexConverter();
-
- // Default to the supertype
- return super.createConverter(presentationType,
- modelType);
- }
-}
-
-// Use the factory globally in the application
-Application.getCurrentApplication().setConverterFactory(
- new MyConverterFactory());
-----
-
-
-
-ifdef::web[]
-[[datamodel.properties.implementing]]
-== Implementing the [classname]#Property# Interface
-
-Implementation of the [classname]#Property# interface requires defining setters
-and getters for the value and the __read-only__ mode. Only a getter is needed
-for the property type, as the type is often fixed in property implementations.
-
-The following example shows a simple implementation of the [classname]#Property#
-interface:
-
-[source, java]
-----
-class MyProperty implements Property {
- Integer data = 0;
- boolean readOnly = false;
-
- // Return the data type of the model
- public Class<?> getType() {
- return Integer.class;
- }
-
- public Object getValue() {
- return data;
- }
-
- // Override the default implementation in Object
- @Override
- public String toString() {
- return Integer.toHexString(data);
- }
-
- public boolean isReadOnly() {
- return readOnly;
- }
-
- public void setReadOnly(boolean newStatus) {
- readOnly = newStatus;
- }
-
- public void setValue(Object newValue)
- throws ReadOnlyException, ConversionException {
- if (readOnly)
- throw new ReadOnlyException();
-
- // Already the same type as the internal representation
- if (newValue instanceof Integer)
- data = (Integer) newValue;
-
- // Conversion from a string is required
- else if (newValue instanceof String)
- try {
- data = Integer.parseInt((String) newValue, 16);
- } catch (NumberFormatException e) {
- throw new ConversionException();
- }
- else
- // Don't know how to convert any other types
- throw new ConversionException();
-
- // Reverse decode the hexadecimal value
- }
-}
-
-// Instantiate the property and set its data
-MyProperty property = new MyProperty();
-property.setValue(42);
-
-// Bind it to a component
-final TextField tf = new TextField("Name", property);
-----
-
-The components get the displayed value by the [methodname]#toString()# method,
-so it is necessary to override it. To allow editing the value, value returned in
-the [methodname]#toString()# must be in a format that is accepted by the
-[methodname]#setValue()# method, unless the property is read-only. The
-[methodname]#toString()# can perform any type conversion necessary to make the
-internal type a string, and the [methodname]#setValue()# must be able to make a
-reverse conversion.
-
-The implementation example does not notify about changes in the property value
-or in the read-only mode. You should normally also implement at least the
-[classname]#Property.ValueChangeNotifier# and
-[classname]#Property.ReadOnlyStatusChangeNotifier#. See the
-[classname]#ObjectProperty# class for an example of the implementation.
-
-endif::web[]
diff --git a/documentation/datamodel/datamodel-selection.asciidoc b/documentation/datamodel/datamodel-selection.asciidoc
new file mode 100644
index 0000000000..3d01bb92c1
--- /dev/null
+++ b/documentation/datamodel/datamodel-selection.asciidoc
@@ -0,0 +1,20 @@
+---
+title: Selecting items
+order: 5
+layout: page
+---
+
+[[datamodel.selection]]
+= Selecting items
+
+////
+TODO
+
+* A Listing may let the user mark one or several of its items as selected.
+* Some listings only support having one item selected at a time
+** Code example: Setting, getting and reacting to events from a NativeSelect
+** Design question: Is nullSelectionAllowed a feature of each component or a feature of the selection model?
+* Other listings can be configured to allow selecting one or many items. Depending on how it is configured, it uses a different selection model type for working with the selection.
+** Code example: OptionGroup in single / multi mode. Using different selection model types to access the selection.
+** Code example: Using each selection model type with a Binder
+////
diff --git a/documentation/datamodel/img/beanitem-nested-beans.png b/documentation/datamodel/img/beanitem-nested-beans.png
deleted file mode 100644
index ea8c51ccd4..0000000000
--- a/documentation/datamodel/img/beanitem-nested-beans.png
+++ /dev/null
Binary files differ
diff --git a/documentation/datamodel/img/beanitemcontainer-nested-beans.png b/documentation/datamodel/img/beanitemcontainer-nested-beans.png
deleted file mode 100644
index fbd5fa155a..0000000000
--- a/documentation/datamodel/img/beanitemcontainer-nested-beans.png
+++ /dev/null
Binary files differ
diff --git a/documentation/datamodel/img/datamodel-interfaces-hi.png b/documentation/datamodel/img/datamodel-interfaces-hi.png
deleted file mode 100644
index 9bebdb0ac0..0000000000
--- a/documentation/datamodel/img/datamodel-interfaces-hi.png
+++ /dev/null
Binary files differ
diff --git a/documentation/datamodel/img/datamodel-interfaces-lo.png b/documentation/datamodel/img/datamodel-interfaces-lo.png
deleted file mode 100644
index 2139cf9f08..0000000000
--- a/documentation/datamodel/img/datamodel-interfaces-lo.png
+++ /dev/null
Binary files differ
diff --git a/documentation/datamodel/img/datamodel-whitebg.png b/documentation/datamodel/img/datamodel-whitebg.png
deleted file mode 100644
index 803dd70c08..0000000000
--- a/documentation/datamodel/img/datamodel-whitebg.png
+++ /dev/null
Binary files differ
diff --git a/documentation/datamodel/original-drawings/beanitem-doublebinding.svg b/documentation/datamodel/original-drawings/beanitem-doublebinding.svg
deleted file mode 100644
index 509013ab07..0000000000
--- a/documentation/datamodel/original-drawings/beanitem-doublebinding.svg
+++ /dev/null
@@ -1,1026 +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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448"
- height="1052.3622"
- id="svg2475"
- sodipodi:version="0.32"
- inkscape:version="0.46"
- sodipodi:docname="beanitem-doublebinding.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- inkscape:export-filename="/home/magi/itmill/doc/cheatsheet/vaadin-cheatsheet.png"
- inkscape:export-xdpi="300.01001"
- inkscape:export-ydpi="300.01001"
- version="1.0">
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="4"
- objecttolerance="4"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1.2"
- inkscape:cx="458.26878"
- inkscape:cy="757.29383"
- inkscape:document-units="mm"
- inkscape:current-layer="layer1"
- showgrid="true"
- inkscape:window-width="1680"
- inkscape:window-height="1026"
- inkscape:window-x="1280"
- inkscape:window-y="0"
- inkscape:snap-nodes="true"
- inkscape:snap-bbox="true"
- units="mm"
- inkscape:snap-global="true"
- inkscape:window-maximized="1">
- <inkscape:grid
- snapvisiblegridlinesonly="true"
- dotted="false"
- type="xygrid"
- id="grid4674"
- visible="true"
- enabled="true"
- units="mm"
- empspacing="5"
- spacingx="1mm"
- spacingy="1mm" />
- </sodipodi:namedview>
- <defs
- id="defs2477">
- <marker
- style="overflow:visible"
- id="Arrow1Lstart"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="Arrow1Lstart">
- <path
- transform="matrix(0.8,0,0,0.8,10,0)"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
- d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
- id="path5210" />
- </marker>
- <marker
- inkscape:stockid="DotS"
- orient="auto"
- refY="0"
- refX="0"
- id="DotS"
- style="overflow:visible">
- <path
- id="path3636"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
- transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutS"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutS">
- <path
- transform="scale(0.2,0.2)"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path3717" />
- </marker>
- <inkscape:path-effect
- effect="skeletal"
- id="path-effect2503"
- prop_scale="1"
- pattern="M 349.202,225.086 L 405.895,331.386 L 370.462,338.472 "
- copytype="single_stretched" />
- <inkscape:path-effect
- effect="skeletal"
- id="path-effect2499"
- prop_scale="1" />
- <inkscape:path-effect
- effect="skeletal"
- id="path-effect2497"
- prop_scale="1"
- pattern="M 432.28346,272.83462 L 403.93701,216.14171"
- pattern-nodetypes="cc" />
- <marker
- inkscape:stockid="Arrow1Send"
- orient="auto"
- refY="0"
- refX="0"
- id="Arrow1Send"
- style="overflow:visible">
- <path
- id="path3641"
- d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
- transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
- </marker>
- <marker
- inkscape:stockid="Arrow1Lend"
- orient="auto"
- refY="0"
- refX="0"
- id="Arrow1Lend"
- style="overflow:visible">
- <path
- id="path3629"
- d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
- transform="matrix(-0.8,0,0,-0.8,-10,0)" />
- </marker>
- <inkscape:perspective
- id="perspective3487"
- 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" />
- <marker
- inkscape:stockid="Arrow2Sendp"
- orient="auto"
- refY="0"
- refX="0"
- id="Arrow2Sendp"
- style="overflow:visible">
- <path
- id="path28139"
- style="font-size:12px;fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:0.625;stroke-linejoin:round"
- d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
- transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSK"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSK"
- style="overflow:visible">
- <path
- id="path36611"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSH"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSH"
- style="overflow:visible">
- <path
- id="path36614"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSA"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSA"
- style="overflow:visible">
- <path
- id="path36617"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSKF"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSKF"
- style="overflow:visible">
- <path
- id="path36620"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutS9"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutS9"
- style="overflow:visible">
- <path
- id="path36623"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="Arrow2SendpA"
- orient="auto"
- refY="0"
- refX="0"
- id="Arrow2SendpA"
- style="overflow:visible">
- <path
- id="path3396"
- style="font-size:12px;fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:0.625;stroke-linejoin:round"
- d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
- transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
- </marker>
- <marker
- inkscape:stockid="Arrow2Sendpg"
- orient="auto"
- refY="0"
- refX="0"
- id="Arrow2Sendpg"
- style="overflow:visible">
- <path
- id="path3360"
- style="font-size:12px;fill:#fcc988;fill-rule:evenodd;stroke:#fcc988;stroke-width:0.625;stroke-linejoin:round"
- d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
- transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
- </marker>
- <filter
- height="1.1"
- width="1.1"
- inkscape:label="White Halo"
- id="filter2780">
- <feMorphology
- result="result0"
- radius="3"
- operator="dilate"
- id="feMorphology2782" />
- <feFlood
- result="result3"
- in="result0"
- flood-opacity="1"
- flood-color="rgb(255,255,255)"
- id="feFlood2786" />
- <feComposite
- result="result4"
- operator="in"
- in2="result0"
- in="result3"
- id="feComposite2623" />
- <feMerge
- id="feMerge2629">
- <feMergeNode
- in="result4"
- id="feMergeNode2631"
- inkscape:collect="always" />
- <feMergeNode
- in="SourceGraphic"
- id="feMergeNode2633"
- inkscape:collect="always" />
- </feMerge>
- </filter>
- <marker
- style="overflow:visible"
- id="TriangleOutSn"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSn">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path4441" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutS9F"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutS9F">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path4444" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSI"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSI">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path4447" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSO"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSO">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path4450" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSW"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSW">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path4453" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSB"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSB">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path4456" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSZ"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSZ">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path4459" />
- </marker>
- <marker
- inkscape:stockid="DotSq"
- orient="auto"
- refY="0"
- refX="0"
- id="DotSq"
- style="overflow:visible">
- <path
- id="path5853"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none;marker-end:none"
- transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSBO"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSBO">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path7501" />
- </marker>
- <marker
- inkscape:stockid="DotSu"
- orient="auto"
- refY="0"
- refX="0"
- id="DotSu"
- style="overflow:visible">
- <path
- id="path9463"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
- transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
- </marker>
- <filter
- id="filter10694"
- inkscape:label="Black Halo"
- width="1.1"
- height="1.1">
- <feMorphology
- id="feMorphology10696"
- operator="dilate"
- radius="3"
- result="result0" />
- <feFlood
- id="feFlood10698"
- flood-color="rgb(0,0,0)"
- flood-opacity="1"
- in="result0"
- result="result3" />
- <feComposite
- id="feComposite10700"
- in="result3"
- in2="result0"
- operator="in"
- result="result4" />
- <feMerge
- id="feMerge10702">
- <feMergeNode
- inkscape:collect="always"
- id="feMergeNode10704"
- in="result4" />
- <feMergeNode
- inkscape:collect="always"
- id="feMergeNode10706"
- in="SourceGraphic" />
- </feMerge>
- </filter>
- <marker
- style="overflow:visible"
- id="TriangleOutSu"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSu">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path8127" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSI8"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSI8">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path8130" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSr"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSr">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path8133" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSM"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSM">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path8136" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSb"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSb">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path8139" />
- </marker>
- <marker
- markerWidth="4.6297302"
- markerHeight="5.7450776"
- orient="auto"
- id="marker18095">
- <g
- transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)"
- id="g11064">
- <path
- 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"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
- id="path11050"
- sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
- <path
- 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"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- id="path11035"
- sodipodi:nodetypes="cccscccsssssssscccsccc" />
- </g>
- </marker>
- <marker
- markerWidth="4.6297355"
- markerHeight="5.7450781"
- orient="auto"
- id="marker44971">
- <g
- transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
- id="g18059">
- <path
- 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"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
- id="path18061"
- sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
- <path
- style="fill:#d9d9cd;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"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- id="path18063"
- sodipodi:nodetypes="cccscccsssssssscccsccc" />
- </g>
- </marker>
- <marker
- markerWidth="4.6297302"
- markerHeight="5.7450786"
- orient="auto"
- id="marker52016">
- <g
- transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
- id="g52010">
- <path
- 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"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
- id="path52012"
- sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
- <path
- style="fill:#f39300;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"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- id="path52014"
- sodipodi:nodetypes="cccscccsssssssscccsccc" />
- </g>
- </marker>
- <marker
- markerWidth="4.6297255"
- markerHeight="5.745079"
- orient="auto"
- id="marker64887">
- <g
- transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
- id="g64855">
- <path
- 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"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
- id="path64857"
- sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
- <path
- style="fill:#000000;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"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- id="path64859"
- sodipodi:nodetypes="cccscccsssssssscccsccc" />
- </g>
- </marker>
- <marker
- markerWidth="4.6297302"
- markerHeight="5.745079"
- orient="auto"
- id="marker4057">
- <g
- transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
- id="g51986">
- <path
- 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"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
- id="path51988"
- sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
- <path
- 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"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- id="path51990"
- sodipodi:nodetypes="cccscccsssssssscccsccc" />
- </g>
- </marker>
- <marker
- markerWidth="4.0334239"
- markerHeight="4.5568175"
- orient="auto"
- id="marker72805">
- <path
- style="fill:#f39300;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"
- d="M -2.0167119,0.50456824 L 0.29578813,0.50456824 L -0.61046187,1.4108182 C -0.80893187,1.6092982 -0.80893187,1.9310982 -0.61046187,2.1295682 C -0.41198187,2.3280482 -0.090181874,2.3280482 0.10828813,2.1295682 L 1.8270381,0.39519824 L 1.8739181,0.36394824 C 1.8768781,0.36103824 1.8710181,0.35130824 1.8739181,0.34831824 C 1.9016181,0.31973824 1.9314681,0.28982824 1.9520381,0.25456824 C 1.9663581,0.23002824 1.9734781,0.20252824 1.9832881,0.17644824 C 1.9894681,0.16108824 1.9943181,0.14535824 1.9989181,0.12956824 C 2.0144781,0.07151824 2.0202881,0.01710824 2.0145381,-0.04230176 C 2.0126081,-0.07122176 2.0058581,-0.09213176 1.9989181,-0.12043176 C 1.9934681,-0.14075176 1.9913481,-0.16326176 1.9832881,-0.18293176 C 1.9750781,-0.20334176 1.9630581,-0.22603176 1.9520381,-0.24543176 C 1.9293181,-0.28436176 1.9052381,-0.32406176 1.8739181,-0.35480176 L 0.10828813,-2.1204318 C 0.003838126,-2.2318118 -0.14579187,-2.2893518 -0.29796187,-2.2766818 C -0.49535187,-2.2632018 -0.66784187,-2.1344918 -0.73546187,-1.9485518 C -0.80308187,-1.7626218 -0.75309187,-1.5544218 -0.61046187,-1.4173018 L 0.32703813,-0.49543176 L -2.0167119,-0.49543176"
- id="path18057"
- sodipodi:nodetypes="cccscccsssssssscccsccc" />
- </marker>
- <marker
- markerWidth="4.0334177"
- markerHeight="4.5568123"
- orient="auto"
- id="marker72808">
- <path
- style="fill:#d9d9cd;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"
- d="M -2.016709,0.50457301 L 0.29579105,0.50457301 L -0.61045895,1.410823 C -0.80893895,1.609293 -0.80893895,1.931093 -0.61045895,2.129573 C -0.41198895,2.328043 -0.090188953,2.328043 0.10829105,2.129573 L 1.827041,0.39519301 L 1.873911,0.36394301 C 1.876881,0.36103301 1.871021,0.35130301 1.873911,0.34832301 C 1.901621,0.31974301 1.931461,0.28982301 1.952041,0.25457301 C 1.966361,0.23003301 1.973481,0.20252301 1.983291,0.17644301 C 1.989471,0.16108301 1.994321,0.14536301 1.998911,0.12957301 C 2.014471,0.071523013 2.020281,0.017103013 2.014541,-0.042306987 C 2.012611,-0.071226987 2.005851,-0.092126987 1.998911,-0.12042699 C 1.993461,-0.14075699 1.991351,-0.16325699 1.983291,-0.18292699 C 1.975071,-0.20334699 1.963051,-0.22602699 1.952041,-0.24542699 C 1.929311,-0.28436699 1.905241,-0.32405699 1.873911,-0.35480699 L 0.10829105,-2.120427 C 0.003831047,-2.231807 -0.14578895,-2.289357 -0.29795895,-2.276677 C -0.49534895,-2.263207 -0.66784895,-2.134487 -0.73545895,-1.948557 C -0.80307895,-1.762617 -0.75308895,-1.554427 -0.61045895,-1.417307 L 0.32704105,-0.49542699 L -2.016709,-0.49542699"
- id="path72801"
- sodipodi:nodetypes="cccscccsssssssscccsccc" />
- </marker>
- <marker
- inkscape:stockid="DotSuN"
- orient="auto"
- refY="0"
- refX="0"
- id="DotSuN"
- style="overflow:visible">
- <path
- id="path81580"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
- transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
- </marker>
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective3071" />
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- id="perspective3071-3" />
- <marker
- inkscape:stockid="DotSqn"
- orient="auto"
- refY="0"
- refX="0"
- id="DotSqn"
- style="overflow:visible">
- <path
- id="path3825"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#49c2f1;stroke-width:1pt;fill:#49c2f1"
- transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
- </marker>
- </defs>
- <metadata
- id="metadata2480">
- <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="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <flowRoot
- transform="translate(-0.8858472,0)"
- xml:space="preserve"
- id="flowRoot2485"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"><flowRegion
- id="flowRegion2487"><rect
- id="rect2489"
- width="184.28572"
- height="120"
- x="262.85715"
- y="238.07646"
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold" /></flowRegion><flowPara
- id="flowPara2491" /></flowRoot> <g
- id="g3178"
- transform="translate(-4.4572759,23.214286)" />
- <flowRoot
- transform="translate(-0.8858472,0)"
- xml:space="preserve"
- id="flowRoot8724"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"><flowRegion
- id="flowRegion8726"><rect
- id="rect8728"
- width="29.904507"
- height="22.868153"
- x="39.286312"
- y="752.14441"
- style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light" /></flowRegion><flowPara
- id="flowPara8730" /></flowRoot> <g
- id="g18053"
- transform="matrix(0.5,0,0,0.5,102.45714,0.7940752)" />
- <g
- transform="translate(-166.83345,55.50466)"
- id="g2630">
- <rect
- style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect2632"
- width="134.64566"
- height="35.433067"
- x="205.84985"
- y="181.8969"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot2634"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion2636" /><flowPara
- id="flowPara2638">BeanItem&lt;DaBean&gt;</flowPara></flowRoot> <path
- sodipodi:type="arc"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path4306"
- sodipodi:cx="487.20471"
- sodipodi:cy="228.54329"
- sodipodi:rx="7.0740213"
- sodipodi:ry="7.0907817"
- d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
- sodipodi:start="0"
- sodipodi:end="6.2827149"
- transform="translate(-214.12137,-46.769087)"
- sodipodi:open="true" />
- </g>
- <g
- transform="translate(-165.25597,-21.834568)"
- id="g3696">
- <rect
- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect3698"
- width="74.409447"
- height="35.43306"
- x="234.86888"
- y="181.8969"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot3700"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion3702" /><flowPara
- id="flowPara3704">DaBean</flowPara></flowRoot> </g>
- <g
- transform="translate(-208.41219,126.37676)"
- id="g3706">
- <rect
- style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect3708"
- width="74.409447"
- height="35.43306"
- x="234.86888"
- y="181.8969"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot3710"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion3712" /><flowPara
- id="flowPara3714">Form</flowPara></flowRoot> <path
- sodipodi:type="arc"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path4287"
- sodipodi:cx="487.20471"
- sodipodi:cy="228.54329"
- sodipodi:rx="7.0740213"
- sodipodi:ry="7.0907817"
- d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
- sodipodi:start="0"
- sodipodi:end="6.2827149"
- transform="translate(-215.0244,-46.226947)"
- sodipodi:open="true" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 97.827294,272.83462 L 63.779528,308.26769"
- id="path4290"
- inkscape:connector-type="polyline"
- inkscape:connection-start="#g2630" />
- <g
- transform="translate(-123.81342,126.37858)"
- id="g4292">
- <rect
- style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect4294"
- width="74.409447"
- height="35.43306"
- x="234.86888"
- y="181.8969"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot4296"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion4298" /><flowPara
- id="flowPara4300">Form</flowPara></flowRoot> <path
- sodipodi:type="arc"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path4302"
- sodipodi:cx="487.20471"
- sodipodi:cy="228.54329"
- sodipodi:rx="7.0740213"
- sodipodi:ry="7.0907817"
- d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
- sodipodi:start="0"
- sodipodi:end="6.2827149"
- transform="translate(-215.0244,-46.226947)"
- sodipodi:open="true" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 114.83517,272.83462 L 148.8189,308.26769"
- id="path3716"
- inkscape:connector-type="polyline"
- inkscape:connection-start="#g2630" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 106.66359,195.49539 L 106.29921,237.40155"
- id="path4304"
- inkscape:connector-type="polyline"
- inkscape:connection-start="#g3696" />
- <g
- transform="translate(24.465107,55.919946)"
- id="g4308">
- <rect
- style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect4310"
- width="134.64566"
- height="35.433067"
- x="205.84985"
- y="181.8969"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot4312"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion4314" /><flowPara
- id="flowPara4316">BeanItem&lt;DaBean&gt;</flowPara></flowRoot> <path
- sodipodi:type="arc"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path4318"
- sodipodi:cx="487.20471"
- sodipodi:cy="228.54329"
- sodipodi:rx="7.0740213"
- sodipodi:ry="7.0907817"
- d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
- sodipodi:start="0"
- sodipodi:end="6.2827149"
- transform="translate(-214.12137,-46.769087)"
- sodipodi:open="true" />
- </g>
- <g
- transform="translate(96.43882,-21.681466)"
- id="g4320">
- <rect
- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect4322"
- width="74.409447"
- height="35.43306"
- x="234.86888"
- y="181.8969"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot4324"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion4326" /><flowPara
- id="flowPara4328">DaBean</flowPara></flowRoot> </g>
- <g
- transform="translate(25.457474,125.80388)"
- id="g4330">
- <rect
- style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect4332"
- width="74.409447"
- height="35.43306"
- x="234.86888"
- y="182.48613"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot4334"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion4336" /><flowPara
- id="flowPara4338">Form</flowPara></flowRoot> <path
- sodipodi:type="arc"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path4340"
- sodipodi:cx="487.20471"
- sodipodi:cy="228.54329"
- sodipodi:rx="7.0740213"
- sodipodi:ry="7.0907817"
- d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
- sodipodi:start="0"
- sodipodi:end="6.2827149"
- transform="translate(-215.0244,-46.226947)"
- sodipodi:open="true" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 297.63779,273.24991 L 297.6378,308.26769"
- id="path4342"
- inkscape:connector-type="polyline" />
- <g
- transform="translate(167.18976,126.38479)"
- id="g4344">
- <rect
- style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect4346"
- width="74.409447"
- height="35.43306"
- x="234.86888"
- y="181.8969"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot4348"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion4350" /><flowPara
- id="flowPara4352">Form</flowPara></flowRoot> <path
- sodipodi:type="arc"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path4354"
- sodipodi:cx="487.20471"
- sodipodi:cy="228.54329"
- sodipodi:rx="7.0740213"
- sodipodi:ry="7.0907817"
- d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
- sodipodi:start="0"
- sodipodi:end="6.2827149"
- transform="translate(-215.0244,-46.226947)"
- sodipodi:open="true" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 439.37007,273.24991 L 439.37008,308.26769"
- id="path4356"
- inkscape:connector-type="polyline"
- inkscape:connection-start="#g4360" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 345.76938,197.14849 L 297.63779,237.81684"
- id="path4358"
- inkscape:connector-type="polyline"
- inkscape:connection-start="#g4320" />
- <g
- transform="translate(166.19738,55.91995)"
- id="g4360">
- <rect
- style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect4362"
- width="134.64566"
- height="35.433067"
- x="205.84985"
- y="181.8969"
- ry="3.7880721" />
- <flowRoot
- transform="translate(273.91267,204.25271)"
- id="flowRoot4364"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><flowRegion
- id="flowRegion4366" /><flowPara
- id="flowPara4368">BeanItem&lt;DaBean&gt;</flowPara></flowRoot> <path
- sodipodi:type="arc"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path4370"
- sodipodi:cx="487.20471"
- sodipodi:cy="228.54329"
- sodipodi:rx="7.0740213"
- sodipodi:ry="7.0907817"
- d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
- sodipodi:start="0"
- sodipodi:end="6.2827149"
- transform="translate(-214.12137,-46.769087)"
- sodipodi:open="true" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 391.25002,197.14849 L 439.37007,237.81684"
- id="path4372"
- inkscape:connector-type="polyline"
- inkscape:connection-start="#g4320" />
- </g>
-</svg>
diff --git a/documentation/datamodel/original-drawings/datamodel-interfaces.svg b/documentation/datamodel/original-drawings/datamodel-interfaces.svg
deleted file mode 100644
index 051f60c48d..0000000000
--- a/documentation/datamodel/original-drawings/datamodel-interfaces.svg
+++ /dev/null
@@ -1,1321 +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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448"
- height="1052.3622"
- id="svg2475"
- sodipodi:version="0.32"
- inkscape:version="0.47pre4 r22446"
- sodipodi:docname="datamodel-interfaces.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- inkscape:export-filename="/home/magi/itmill/doc/cheatsheet/vaadin-cheatsheet.png"
- inkscape:export-xdpi="300.01001"
- inkscape:export-ydpi="300.01001"
- version="1.0">
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="4"
- objecttolerance="4"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1.6970563"
- inkscape:cx="429.28864"
- inkscape:cy="730.78696"
- inkscape:document-units="mm"
- inkscape:current-layer="layer1"
- showgrid="true"
- inkscape:window-width="1680"
- inkscape:window-height="1030"
- inkscape:window-x="-4"
- inkscape:window-y="-3"
- inkscape:snap-nodes="true"
- inkscape:snap-bbox="true"
- units="mm"
- inkscape:snap-global="true"
- inkscape:window-maximized="1">
- <inkscape:grid
- spacingy="1mm"
- spacingx="1mm"
- empspacing="5"
- units="mm"
- enabled="true"
- visible="true"
- id="grid4674"
- type="xygrid"
- dotted="false"
- snapvisiblegridlinesonly="true" />
- </sodipodi:namedview>
- <defs
- id="defs2477">
- <marker
- inkscape:stockid="Arrow1Lstart"
- orient="auto"
- refY="0"
- refX="0"
- id="Arrow1Lstart"
- style="overflow:visible">
- <path
- id="path5210"
- d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
- transform="matrix(0.8,0,0,0.8,10,0)" />
- </marker>
- <marker
- style="overflow:visible"
- id="DotS"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="DotS">
- <path
- transform="matrix(0.2,0,0,0.2,1.48,0.2)"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- id="path3636" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutS"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutS"
- style="overflow:visible">
- <path
- id="path3717"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <inkscape:path-effect
- copytype="single_stretched"
- pattern="M 349.202,225.086 L 405.895,331.386 L 370.462,338.472 "
- prop_scale="1"
- id="path-effect2503"
- effect="skeletal" />
- <inkscape:path-effect
- prop_scale="1"
- id="path-effect2499"
- effect="skeletal" />
- <inkscape:path-effect
- pattern-nodetypes="cc"
- pattern="M 432.28346,272.83462 L 403.93701,216.14171"
- prop_scale="1"
- id="path-effect2497"
- effect="skeletal" />
- <marker
- style="overflow:visible"
- id="Arrow1Send"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="Arrow1Send">
- <path
- transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
- d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
- id="path3641" />
- </marker>
- <marker
- style="overflow:visible"
- id="Arrow1Lend"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="Arrow1Lend">
- <path
- transform="matrix(-0.8,0,0,-0.8,-10,0)"
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
- d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
- id="path3629" />
- </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="perspective3487" />
- <marker
- style="overflow:visible"
- id="Arrow2Sendp"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="Arrow2Sendp">
- <path
- transform="matrix(-0.3,0,0,-0.3,0.69,0)"
- d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
- style="font-size:12px;fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:0.625;stroke-linejoin:round"
- id="path28139" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSK"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSK">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path36611" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSH"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSH">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path36614" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSA"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSA">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path36617" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutSKF"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutSKF">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path36620" />
- </marker>
- <marker
- style="overflow:visible"
- id="TriangleOutS9"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="TriangleOutS9">
- <path
- transform="scale(0.2,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- id="path36623" />
- </marker>
- <marker
- style="overflow:visible"
- id="Arrow2SendpA"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="Arrow2SendpA">
- <path
- transform="matrix(-0.3,0,0,-0.3,0.69,0)"
- d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
- style="font-size:12px;fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:0.625;stroke-linejoin:round"
- id="path3396" />
- </marker>
- <marker
- style="overflow:visible"
- id="Arrow2Sendpg"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="Arrow2Sendpg">
- <path
- transform="matrix(-0.3,0,0,-0.3,0.69,0)"
- d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
- style="font-size:12px;fill:#fcc988;fill-rule:evenodd;stroke:#fcc988;stroke-width:0.625;stroke-linejoin:round"
- id="path3360" />
- </marker>
- <filter
- id="filter2780"
- inkscape:label="White Halo"
- width="1.1"
- height="1.1">
- <feMorphology
- id="feMorphology2782"
- operator="dilate"
- radius="3"
- result="result0" />
- <feFlood
- id="feFlood2786"
- flood-color="rgb(255,255,255)"
- flood-opacity="1"
- in="result0"
- result="result3" />
- <feComposite
- id="feComposite2623"
- in="result3"
- in2="result0"
- operator="in"
- result="result4" />
- <feMerge
- id="feMerge2629">
- <feMergeNode
- inkscape:collect="always"
- id="feMergeNode2631"
- in="result4" />
- <feMergeNode
- inkscape:collect="always"
- id="feMergeNode2633"
- in="SourceGraphic" />
- </feMerge>
- </filter>
- <marker
- inkscape:stockid="TriangleOutSn"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSn"
- style="overflow:visible">
- <path
- id="path4441"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutS9F"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutS9F"
- style="overflow:visible">
- <path
- id="path4444"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSI"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSI"
- style="overflow:visible">
- <path
- id="path4447"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSO"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSO"
- style="overflow:visible">
- <path
- id="path4450"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSW"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSW"
- style="overflow:visible">
- <path
- id="path4453"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSB"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSB"
- style="overflow:visible">
- <path
- id="path4456"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSZ"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSZ"
- style="overflow:visible">
- <path
- id="path4459"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- style="overflow:visible"
- id="DotSq"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="DotSq">
- <path
- transform="matrix(0.2,0,0,0.2,1.48,0.2)"
- style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none;marker-end:none"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- id="path5853" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSBO"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSBO"
- style="overflow:visible">
- <path
- id="path7501"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- style="overflow:visible"
- id="DotSu"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="DotSu">
- <path
- transform="matrix(0.2,0,0,0.2,1.48,0.2)"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- id="path9463" />
- </marker>
- <filter
- height="1.1"
- width="1.1"
- inkscape:label="Black Halo"
- id="filter10694">
- <feMorphology
- result="result0"
- radius="3"
- operator="dilate"
- id="feMorphology10696" />
- <feFlood
- result="result3"
- in="result0"
- flood-opacity="1"
- flood-color="rgb(0,0,0)"
- id="feFlood10698" />
- <feComposite
- result="result4"
- operator="in"
- in2="result0"
- in="result3"
- id="feComposite10700" />
- <feMerge
- id="feMerge10702">
- <feMergeNode
- in="result4"
- id="feMergeNode10704"
- inkscape:collect="always" />
- <feMergeNode
- in="SourceGraphic"
- id="feMergeNode10706"
- inkscape:collect="always" />
- </feMerge>
- </filter>
- <marker
- inkscape:stockid="TriangleOutSu"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSu"
- style="overflow:visible">
- <path
- id="path8127"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSI8"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSI8"
- style="overflow:visible">
- <path
- id="path8130"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSr"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSr"
- style="overflow:visible">
- <path
- id="path8133"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSM"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSM"
- style="overflow:visible">
- <path
- id="path8136"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <marker
- inkscape:stockid="TriangleOutSb"
- orient="auto"
- refY="0"
- refX="0"
- id="TriangleOutSb"
- style="overflow:visible">
- <path
- id="path8139"
- d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
- style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
- transform="scale(0.2,0.2)" />
- </marker>
- <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 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.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" />
- <path
- sodipodi:nodetypes="cccscccsssssssscccsccc"
- id="path11035"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- 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" />
- </g>
- </marker>
- <marker
- id="marker44971"
- orient="auto"
- markerHeight="5.7450781"
- markerWidth="4.6297355">
- <g
- id="g18059"
- transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
- <path
- sodipodi:nodetypes="csccccccsccssssssssssssssccc"
- id="path18061"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.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" />
- <path
- sodipodi:nodetypes="cccscccsssssssscccsccc"
- id="path18063"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- style="fill:#d9d9cd;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" />
- </g>
- </marker>
- <marker
- id="marker52016"
- orient="auto"
- markerHeight="5.7450786"
- markerWidth="4.6297302">
- <g
- id="g52010"
- transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
- <path
- sodipodi:nodetypes="csccccccsccssssssssssssssccc"
- id="path52012"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.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" />
- <path
- sodipodi:nodetypes="cccscccsssssssscccsccc"
- id="path52014"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- style="fill:#f39300;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" />
- </g>
- </marker>
- <marker
- id="marker64887"
- orient="auto"
- markerHeight="5.745079"
- markerWidth="4.6297255">
- <g
- id="g64855"
- transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
- <path
- sodipodi:nodetypes="csccccccsccssssssssssssssccc"
- id="path64857"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.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" />
- <path
- sodipodi:nodetypes="cccscccsssssssscccsccc"
- id="path64859"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- style="fill:#000000;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" />
- </g>
- </marker>
- <marker
- id="marker4057"
- orient="auto"
- markerHeight="5.745079"
- markerWidth="4.6297302">
- <g
- id="g51986"
- transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
- <path
- sodipodi:nodetypes="csccccccsccssssssssssssssccc"
- id="path51988"
- d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.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" />
- <path
- sodipodi:nodetypes="cccscccsssssssscccsccc"
- id="path51990"
- d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
- 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" />
- </g>
- </marker>
- <marker
- id="marker72805"
- orient="auto"
- markerHeight="4.5568175"
- markerWidth="4.0334239">
- <path
- sodipodi:nodetypes="cccscccsssssssscccsccc"
- id="path18057"
- d="M -2.0167119,0.50456824 L 0.29578813,0.50456824 L -0.61046187,1.4108182 C -0.80893187,1.6092982 -0.80893187,1.9310982 -0.61046187,2.1295682 C -0.41198187,2.3280482 -0.090181874,2.3280482 0.10828813,2.1295682 L 1.8270381,0.39519824 L 1.8739181,0.36394824 C 1.8768781,0.36103824 1.8710181,0.35130824 1.8739181,0.34831824 C 1.9016181,0.31973824 1.9314681,0.28982824 1.9520381,0.25456824 C 1.9663581,0.23002824 1.9734781,0.20252824 1.9832881,0.17644824 C 1.9894681,0.16108824 1.9943181,0.14535824 1.9989181,0.12956824 C 2.0144781,0.07151824 2.0202881,0.01710824 2.0145381,-0.04230176 C 2.0126081,-0.07122176 2.0058581,-0.09213176 1.9989181,-0.12043176 C 1.9934681,-0.14075176 1.9913481,-0.16326176 1.9832881,-0.18293176 C 1.9750781,-0.20334176 1.9630581,-0.22603176 1.9520381,-0.24543176 C 1.9293181,-0.28436176 1.9052381,-0.32406176 1.8739181,-0.35480176 L 0.10828813,-2.1204318 C 0.003838126,-2.2318118 -0.14579187,-2.2893518 -0.29796187,-2.2766818 C -0.49535187,-2.2632018 -0.66784187,-2.1344918 -0.73546187,-1.9485518 C -0.80308187,-1.7626218 -0.75309187,-1.5544218 -0.61046187,-1.4173018 L 0.32703813,-0.49543176 L -2.0167119,-0.49543176"
- style="fill:#f39300;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" />
- </marker>
- <marker
- id="marker72808"
- orient="auto"
- markerHeight="4.5568123"
- markerWidth="4.0334177">
- <path
- sodipodi:nodetypes="cccscccsssssssscccsccc"
- id="path72801"
- d="M -2.016709,0.50457301 L 0.29579105,0.50457301 L -0.61045895,1.410823 C -0.80893895,1.609293 -0.80893895,1.931093 -0.61045895,2.129573 C -0.41198895,2.328043 -0.090188953,2.328043 0.10829105,2.129573 L 1.827041,0.39519301 L 1.873911,0.36394301 C 1.876881,0.36103301 1.871021,0.35130301 1.873911,0.34832301 C 1.901621,0.31974301 1.931461,0.28982301 1.952041,0.25457301 C 1.966361,0.23003301 1.973481,0.20252301 1.983291,0.17644301 C 1.989471,0.16108301 1.994321,0.14536301 1.998911,0.12957301 C 2.014471,0.071523013 2.020281,0.017103013 2.014541,-0.042306987 C 2.012611,-0.071226987 2.005851,-0.092126987 1.998911,-0.12042699 C 1.993461,-0.14075699 1.991351,-0.16325699 1.983291,-0.18292699 C 1.975071,-0.20334699 1.963051,-0.22602699 1.952041,-0.24542699 C 1.929311,-0.28436699 1.905241,-0.32405699 1.873911,-0.35480699 L 0.10829105,-2.120427 C 0.003831047,-2.231807 -0.14578895,-2.289357 -0.29795895,-2.276677 C -0.49534895,-2.263207 -0.66784895,-2.134487 -0.73545895,-1.948557 C -0.80307895,-1.762617 -0.75308895,-1.554427 -0.61045895,-1.417307 L 0.32704105,-0.49542699 L -2.016709,-0.49542699"
- style="fill:#d9d9cd;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" />
- </marker>
- <marker
- style="overflow:visible"
- id="DotSuN"
- refX="0"
- refY="0"
- orient="auto"
- inkscape:stockid="DotSuN">
- <path
- transform="matrix(0.2,0,0,0.2,1.48,0.2)"
- style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
- d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
- id="path81580" />
- </marker>
- <inkscape:perspective
- id="perspective3071"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 0.5 : 1"
- sodipodi:type="inkscape:persp3d" />
- <inkscape:perspective
- id="perspective3071-3"
- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
- inkscape:vp_z="1 : 0.5 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_x="0 : 0.5 : 1"
- sodipodi:type="inkscape:persp3d" />
- </defs>
- <metadata
- id="metadata2480">
- <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
- id="layer1"
- inkscape:groupmode="layer"
- inkscape:label="Layer 1">
- <rect
- style="fill:#ffffff;fill-opacity:1;stroke:none"
- id="rect3139"
- width="393.30707"
- height="322.44095"
- x="322.44095"
- y="134.64565"
- ry="3.7880721" />
- <rect
- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.77165353;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect6642"
- width="387.10629"
- height="205.51181"
- x="325.09842"
- y="138.18895"
- ry="3.7880721" />
- <g
- id="g2870"
- transform="translate(176.19402,101.81896)">
- <rect
- ry="3.7880721"
- y="181.8969"
- x="205.84985"
- height="35.433067"
- width="99.212601"
- id="rect2872"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot2874"
- transform="translate(255.02722,204.55399)"><flowRegion
- id="flowRegion2876" /><flowPara
- id="flowPara2880">Property</flowPara></flowRoot> </g>
- <g
- id="g5098"
- transform="translate(175.94148,45.126049)">
- <rect
- ry="3.7880721"
- y="181.8969"
- x="205.84985"
- height="35.433067"
- width="99.212601"
- id="rect5100"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot5102"
- transform="translate(254.32934,203.83604)"><flowRegion
- id="flowRegion5104" /><flowPara
- id="flowPara5108">Item</flowPara></flowRoot> </g>
- <g
- id="g3740"
- transform="translate(291.4357,78.274004)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716536"
- width="102.75591"
- id="rect3742"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot3744"
- transform="translate(234.16765,246.96275)"><flowRegion
- id="flowRegion3746" /><flowPara
- id="flowPara3750">ValueChangeListener</flowPara></flowRoot> </g>
- <path
- inkscape:connector-type="polyline"
- id="path3776"
- d="M 410.32826,365.0986 371.52155,332.46732"
- style="fill:none;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
- inkscape:connection-start="#g2854" />
- <flowRoot
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot2485"
- xml:space="preserve"
- transform="translate(-0.8858472,0)"><flowRegion
- id="flowRegion2487"><rect
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- y="238.07646"
- x="262.85715"
- height="120"
- width="184.28572"
- id="rect2489" /></flowRegion><flowPara
- id="flowPara2491" /></flowRoot> <g
- transform="translate(-4.4572759,23.214286)"
- id="g3178" />
- <path
- inkscape:connection-end="#g2870"
- inkscape:connector-type="polyline"
- id="path2882"
- d="m 431.4526,365.0986 0.1426,-45.94968"
- style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
- inkscape:connection-start="#g2854" />
- <path
- inkscape:connection-start="#g2854"
- inkscape:connection-end="#g3740"
- inkscape:connector-type="polyline"
- id="path5048"
- d="m 459.0809,365.0986 52.37273,-33.5171"
- style="fill:none;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline" />
- <g
- id="g2854"
- transform="translate(222.75553,132.03305)">
- <rect
- ry="3.7880721"
- y="233.06555"
- x="166.12241"
- height="35.433075"
- width="85.039375"
- id="rect2856"
- style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot2858"
- transform="translate(207.58709,255.55638)"><flowRegion
- id="flowRegion2860" /><flowPara
- id="flowPara2864">Field</flowPara></flowRoot> </g>
- <path
- inkscape:connection-end="#g2854"
- inkscape:connection-start="#g2802"
- inkscape:connector-type="polyline"
- id="path2868"
- d="m 431.37248,418.96375 0.0128,-18.43207"
- style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker52016);display:inline" />
- <g
- id="g3752"
- transform="translate(291.4357,58.754809)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716536"
- width="102.75591"
- id="rect3754"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot3756"
- transform="translate(233.81083,246.99763)"><flowRegion
- id="flowRegion3758" /><flowPara
- id="flowPara3762">ValueChangeEvent</flowPara></flowRoot> </g>
- <g
- transform="translate(203.72084,210.41373)"
- id="g2802">
- <rect
- ry="3.7880721"
- y="208.55002"
- x="172.42705"
- height="35.93816"
- width="110.42418"
- id="rect2804"
- style="fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- transform="translate(226.79094,230.27406)"
- id="flowRoot2806"
- style="font-size:12px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold Italic"
- xml:space="preserve"><flowRegion
- id="flowRegion2808" /><flowPara
- id="flowPara2812">AbstractField</flowPara></flowRoot> </g>
- <g
- id="g5110"
- transform="translate(176.19402,-15.110183)">
- <rect
- ry="3.7880721"
- y="181.8969"
- x="205.84985"
- height="35.433067"
- width="99.212601"
- id="rect5112"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot5114"
- transform="translate(255.50671,204.20613)"><flowRegion
- id="flowRegion5116" /><flowPara
- id="flowPara5120">Container</flowPara></flowRoot> </g>
- <g
- id="g5146"
- transform="translate(152.8407,-40.751695)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect5148"
- style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;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" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot5150"
- transform="translate(205.92958,247.90652)"><flowRegion
- id="flowRegion5152" /><flowPara
- id="flowPara5156">Editor</flowPara></flowRoot> </g>
- <g
- id="g5158"
- transform="translate(152.8407,-60.67148)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect5160"
- style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;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" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot5162"
- transform="translate(205.46539,247.16347)"><flowRegion
- id="flowRegion5164" /><flowPara
- id="flowPara5168">Viewer</flowPara></flowRoot> </g>
- <flowRoot
- transform="translate(31.312673,-134.1482)"
- style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot6644"
- xml:space="preserve"><flowRegion
- id="flowRegion6646"><rect
- style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- y="280.93362"
- x="202.85715"
- height="99.581009"
- width="204.28046"
- id="rect6648" /></flowRegion><flowPara
- id="flowPara6650">Data Model</flowPara></flowRoot> <path
- inkscape:connector-type="polyline"
- id="path6692"
- d="M 491.6841,213.79089 L 491.89141,158.02434"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-type="polyline"
- id="path6694"
- d="M 502.26376,185.75889 L 481.25647,185.38534"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc"
- inkscape:connection-end="#g5110"
- inkscape:connection-start="#g6678" />
- <g
- id="g6618"
- transform="translate(319.78215,-86.772082)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect6620"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot6622"
- transform="translate(207.97695,247.32124)"><flowRegion
- id="flowRegion6624" /><flowPara
- id="flowPara6628">Ordered</flowPara></flowRoot> </g>
- <g
- id="g6666"
- transform="translate(318.4375,-30.492633)">
- <rect
- ry="3.7880721"
- y="236.25572"
- x="183.82626"
- height="17.716536"
- width="58.037571"
- id="rect6668"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot6670"
- transform="translate(213.13426,248.56061)"><flowRegion
- id="flowRegion6672" /><flowPara
- id="flowPara6676">Hierarchical</flowPara></flowRoot> </g>
- <path
- inkscape:connector-type="polyline"
- id="path6664"
- d="M 587.09005,157.43667 L 551.87006,157.57777"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc"
- inkscape:connection-end="#g6618"
- inkscape:connection-start="#g6606" />
- <g
- id="g6594"
- transform="translate(404.82152,-58.425625)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect6596"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot6598"
- transform="translate(206.96566,247.31617)"><flowRegion
- id="flowRegion6600" /><flowPara
- id="flowPara6604">Sortable</flowPara></flowRoot> </g>
- <g
- id="g6606"
- transform="translate(404.60844,-87.111921)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect6608"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot6610"
- transform="translate(207.61263,247.53033)"><flowRegion
- id="flowRegion6612" /><flowPara
- id="flowPara6616">Indexed</flowPara></flowRoot> </g>
- <g
- id="g6678"
- transform="translate(318.4375,-58.83909)">
- <rect
- ry="3.7880721"
- y="236.25572"
- x="183.82626"
- height="17.716536"
- width="58.037571"
- id="rect6680"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot6682"
- transform="translate(212.17928,248.64068)"><flowRegion
- id="flowRegion6684" /><flowPara
- id="flowPara6688">Filterable</flowPara></flowRoot> </g>
- <path
- inkscape:connection-end="#g6594"
- inkscape:connector-type="polyline"
- id="path8412"
- d="M 654.63021,185.80396 L 636.90943,185.89549"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connection-end="#g6606"
- inkscape:connector-type="polyline"
- id="path8414"
- d="M 654.63021,156.98779 L 636.69635,157.13446"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connection-end="#g6666"
- inkscape:connector-type="polyline"
- id="path8416"
- d="M 570.52478,251.85959 L 540.61753,223.47962"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connection-end="#g6678"
- inkscape:connection-start="#g8396"
- inkscape:connector-type="polyline"
- id="path8418"
- d="M 591.82037,209.3064 L 554.56632,195.13317"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc" />
- <g
- id="g8396"
- transform="translate(374.07349,27.409503)">
- <rect
- ry="3.7880721"
- y="181.8969"
- x="205.84985"
- height="35.433071"
- width="116.92914"
- id="rect8398"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <text
- sodipodi:linespacing="125%"
- id="text8408"
- y="203.15674"
- x="265.04974"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><tspan
- y="203.15674"
- x="265.04974"
- id="tspan8410"
- sodipodi:role="line">IndexedContainer</tspan></text>
- </g>
- <path
- inkscape:connection-start="#g8420"
- inkscape:connection-end="#g8396"
- inkscape:connector-type="polyline"
- id="path8430"
- d="M 638.55893,251.82608 L 638.51007,244.73947"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
- <g
- id="g8420"
- transform="translate(452.31943,69.929187)">
- <rect
- ry="3.7880721"
- y="181.8969"
- x="117.26717"
- height="35.433071"
- width="138.18898"
- id="rect8422"
- style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;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:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <text
- sodipodi:linespacing="125%"
- id="text8424"
- y="203.15674"
- x="185.59758"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- xml:space="preserve"><tspan
- y="203.15674"
- x="185.59758"
- id="tspan8426"
- sodipodi:role="line">HierarchicalContainer</tspan></text>
- </g>
- <flowRoot
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- id="flowRoot8724"
- xml:space="preserve"
- transform="translate(-0.8858472,0)"><flowRegion
- id="flowRegion8726"><rect
- style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- y="752.14441"
- x="39.286312"
- height="22.868153"
- width="29.904507"
- id="rect8728" /></flowRegion><flowPara
- id="flowPara8730" /></flowRoot> <path
- sodipodi:open="true"
- transform="translate(-55.807094,-1.7674908)"
- sodipodi:end="6.2827149"
- sodipodi:start="0"
- d="M 494.29133,228.54329 A 7.0866146,7.0907812 0 1 1 494.29133,228.53995"
- sodipodi:ry="7.0907812"
- sodipodi:rx="7.0866146"
- sodipodi:cy="228.54329"
- sodipodi:cx="487.20471"
- id="path54937"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:type="arc" />
- <path
- inkscape:connector-type="polyline"
- id="path5172"
- d="M 431.5759,202.21978 L 431.47191,227.02295"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSq);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- inkscape:connection-start="#g5110"
- inkscape:connection-end="#g5098" />
- <path
- sodipodi:open="true"
- transform="translate(-55.612376,55.132734)"
- sodipodi:end="6.2827149"
- sodipodi:start="0"
- d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
- sodipodi:ry="7.0907817"
- sodipodi:rx="7.0740213"
- sodipodi:cy="228.54329"
- sodipodi:cx="487.20471"
- id="path54939"
- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:type="arc" />
- <path
- inkscape:connector-type="polyline"
- id="path6576"
- d="M 431.47655,262.45601 L 431.57126,283.71586"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSq);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- inkscape:connection-start="#g5098"
- inkscape:connection-end="#g2870" />
- <path
- inkscape:connection-start="#g6618"
- inkscape:connector-type="polyline"
- id="path55678"
- d="M 502.26376,157.92341 L 492.09872,158.02434"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connection-start="#g6666"
- inkscape:connector-type="polyline"
- id="path55680"
- d="M 502.26376,213.86481 L 491.47679,213.58358"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc" />
- <path
- id="path55688"
- d="M 587.30314,184.25195 L 576.67322,184.25195 L 576.67322,155.90549"
- style="fill:none;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- id="path55690"
- d="M 654.62597,209.0551 L 654.62597,155.90549"
- style="fill:none;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <flowRoot
- xml:space="preserve"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#d9d9cd;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot59412"
- transform="translate(439.65072,221.68981)"><flowRegion
- id="flowRegion59414" /><flowPara
- id="flowPara59418">n</flowPara></flowRoot> <flowRoot
- xml:space="preserve"
- style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#d9d9cd;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot59420"
- transform="translate(439.65072,278.97199)"><flowRegion
- id="flowRegion59422" /><flowPara
- id="flowPara59426">n</flowPara></flowRoot> <g
- transform="matrix(0.5,0,0,0.5,102.45714,0.7940752)"
- id="g18053" />
- <text
- id="text80346"
- y="324.81149"
- x="393.58478"
- style="font-size:6px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- xml:space="preserve"><tspan
- id="tspan80354"
- y="324.81149"
- x="393.58478"
- sodipodi:role="line">setValue()</tspan><tspan
- id="tspan80365"
- y="332.31149"
- x="393.58478"
- sodipodi:role="line">getValue()</tspan></text>
- <text
- id="text116490"
- y="209.0551"
- x="439.94095"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- xml:space="preserve"
- sodipodi:linespacing="125%"><tspan
- y="209.0551"
- x="439.94095"
- id="tspan116492"
- sodipodi:role="line"
- style="font-size:8px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:FreeSans;-inkscape-font-specification:FreeSans Oblique">addItem()</tspan></text>
- <text
- id="text116494"
- y="269.43359"
- x="440.29276"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- xml:space="preserve"
- sodipodi:linespacing="125%"><tspan
- y="269.43359"
- x="440.29276"
- id="tspan116496"
- sodipodi:role="line"
- style="font-size:8px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:FreeSans;-inkscape-font-specification:FreeSans Oblique">addItemProperty()</tspan></text>
- <text
- id="text5081"
- y="337.70709"
- x="523.63373"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
- xml:space="preserve"
- sodipodi:linespacing="125%"><tspan
- y="337.70709"
- x="523.63373"
- id="tspan5083"
- sodipodi:role="line"
- style="font-size:8px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:FreeSans;-inkscape-font-specification:FreeSans Oblique">valueChange()</tspan></text>
- <g
- id="g5146-3"
- transform="translate(152.8407,19.844568)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect5148-7"
- style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;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" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot5150-4"
- transform="translate(205.92958,247.90652)"><flowRegion
- id="flowRegion5152-5" /><flowPara
- id="flowPara5156-2">Editor</flowPara></flowRoot> </g>
- <g
- id="g5158-5"
- transform="translate(152.8407,-0.0752115)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect5160-4"
- style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;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" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot5162-7"
- transform="translate(205.46539,247.16347)"><flowRegion
- id="flowRegion5164-4" /><flowPara
- id="flowPara5168-4">Viewer</flowPara></flowRoot> </g>
- <g
- id="g5146-0"
- transform="translate(152.8407,79.657004)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect5148-78"
- style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;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" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot5150-6"
- transform="translate(205.92958,247.90652)"><flowRegion
- id="flowRegion5152-8" /><flowPara
- id="flowPara5156-8">Editor</flowPara></flowRoot> </g>
- <g
- id="g5158-4"
- transform="translate(152.8407,59.737224)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect5160-3"
- style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;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" />
- <flowRoot
- xml:space="preserve"
- style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
- id="flowRoot5162-1"
- transform="translate(205.46539,247.16347)"><flowRegion
- id="flowRegion5164-49" /><flowPara
- id="flowPara5168-2">Viewer</flowPara></flowRoot> </g>
- </g>
-</svg>