diff options
author | Pekka Hyvönen <pekka@vaadin.com> | 2017-01-04 11:48:45 +0200 |
---|---|---|
committer | Ilia Motornyi <elmot@vaadin.com> | 2017-01-04 11:48:45 +0200 |
commit | 6ef75bda79099953f85e1c48a0e833a6ed258acf (patch) | |
tree | 9098676e92e779bcd0a470f2363007efa0b7941c /documentation | |
parent | 7b9c6bd5d13cf9c004d1cb2d544683ed3e7b17e5 (diff) | |
download | vaadin-framework-6ef75bda79099953f85e1c48a0e833a6ed258acf.tar.gz vaadin-framework-6ef75bda79099953f85e1c48a0e833a6ed258acf.zip |
Update general Component documentation
Part of vaadin/framework8-issues#538
Diffstat (limited to 'documentation')
30 files changed, 139 insertions, 1589 deletions
diff --git a/documentation/addons/addons-overview.asciidoc b/documentation/addons/addons-overview.asciidoc index 8e3a3d7761..a2c36d8784 100644 --- a/documentation/addons/addons-overview.asciidoc +++ b/documentation/addons/addons-overview.asciidoc @@ -27,8 +27,8 @@ The _widget set_ needs to be compiled into the application widget set. Adding the dependency in Maven projects and compiling the widget set is described in <<addons-maven#addons.maven, "Using Add-ons in a Maven Project">>. The section also describes how to use the online compilation and CDN services during development. -For Eclipse projects that use Ivy for dependency management, see <<addons-eclipse#addons.eclipse, "Installing Add-ons in Eclipse with Ivy">>. -You can also download and install add-ons from a ZIP-package, as described in <<addons-downloading#addons.downloading, "Downloading Add-ons from Vaadin Directory">>. +For Eclipse projects that use Ivy for dependency management, see <<dummy/../../../framework/addons/addons-eclipse.asciidoc#addons.eclipse, "Installing Add-ons in Eclipse with Ivy">>. +You can also download and install add-ons from a ZIP-package, as described in <<dummy/../../../framework/addons/addons-downloading.asciidoc#addons.downloading, "Downloading Add-ons from Vaadin Directory">>. == Add-on Licenses diff --git a/documentation/application/application-lifecycle.asciidoc b/documentation/application/application-lifecycle.asciidoc index 614b0db589..657198f71b 100644 --- a/documentation/application/application-lifecycle.asciidoc +++ b/documentation/application/application-lifecycle.asciidoc @@ -235,10 +235,6 @@ one returns a UI (otherwise they return null). You can add a UI provider to a session most conveniently by implementing a custom servlet and adding the UI provider to sessions in a [interfacename]#SessionInitListener#. -You can find an example of custom UI providers in -<<dummy/../../../mobile/mobile-features#mobile.features.fallback,"Providing a -Fallback UI">>. - [[application.lifecycle.ui.preserving]] === Preserving UI on Refresh diff --git a/documentation/components/components-checkbox.asciidoc b/documentation/components/components-checkbox.asciidoc index 186f4c5338..6cbb46f893 100644 --- a/documentation/components/components-checkbox.asciidoc +++ b/documentation/components/components-checkbox.asciidoc @@ -45,8 +45,6 @@ The result is shown in <<figure.components.checkbox.basic>>. .An Example of a Check Box image::img/checkbox-example1.png[width=35%, scaledwidth=50%] -For an example on the use of check boxes in a table, see -<<dummy/../../../framework/components/components-table#components.table,"Table">>. == CSS Style Rules diff --git a/documentation/components/components-combobox.asciidoc b/documentation/components/components-combobox.asciidoc index b5eb92de7e..ccd75a3dc5 100644 --- a/documentation/components/components-combobox.asciidoc +++ b/documentation/components/components-combobox.asciidoc @@ -24,12 +24,6 @@ Components">>. .The [classname]#ComboBox# Component image::img/combobox-basic.png[width=35%, scaledwidth=50%] -[classname]#ComboBox# supports adding new items when the user presses -kbd:[Enter]. -ifdef::web[] -See <<dummy/../../../framework/components/components-selection#components.selection.newitems,"Allowing Adding New Items">>. -endif::web[] - [[components.combobox.filtering]] == Filtered Selection @@ -73,6 +67,57 @@ containing the input string. As shown in <<figure.components.combobox.filter>> below, when we type some text in the input area, the drop-down list will show all the matching items. +[[components.combobox.newitems]] +== Allowing Adding New Items + +[classname]#ComboBox# allows the user to add new items, when the user types +in a value and presses kbd:[Enter]. You need to enable this with +[methodname]#setNewItemHandler()#. + +Adding new items is not possible if the selection component is read-only. An +attempt to do so may result in an exception. + + +=== Handling New Items + +Adding new items is handled by a [interfacename]#NewItemHandler#, which gets the +item caption string as parameter for the [methodname]#accept(String)# method. + + +[source, java] +---- +// List of planets +List<Planet> planets = new ArrayList<>(); +planets.add(new Planet(1, "Mercury")); +planets.add(new Planet(2, "Venus")); +planets.add(new Planet(3, "Earth")); +planets.add(new Planet(4, "Mars")); + +ComboBox<Planet> select = + new ComboBox<>("Select or Add a Planet"); +select.setItems(planets); + +// Use the name property for item captions +select.setItemCaptionGenerator(Planet::getName); + +// Allow adding new items and add +// handling for new items +select.setNewItemHandler(inputString -> { + + // Create a new bean - can't set all properties + Planet newPlanet = new Planet(planets.size(), inputString); + planets.add(newPlanet); + + // Update combobox content + select.setItems(planets); + + // Remember to set the selection to the new item + select.select(newPlanet); + + Notification.show("Added new planet called " + + inputString); +}); +---- [[components.combobox.css]] == CSS Style Rules diff --git a/documentation/components/components-customfield.asciidoc b/documentation/components/components-customfield.asciidoc index 9a05b4aa33..589f4446c3 100644 --- a/documentation/components/components-customfield.asciidoc +++ b/documentation/components/components-customfield.asciidoc @@ -8,7 +8,7 @@ layout: page = Composite Fields with [classname]#CustomField# The [classname]#CustomField# is a way to create composite components as with [classname]#CustomComponent#, except that it implements the [interfacename]#Field# interface and inherits [classname]#AbstractField#, described in <<dummy/../../../framework/components/components-fields#components.fields,"Field Components">>. -A field allows editing a property value in the Vaadin data model, and can be bound to data with field groups, as described in <<dummy/../../../framework/datamodel/datamodel-itembinding#datamodel.itembinding, "Creating Forms by Binding Fields to Items">>. +A field allows editing a property value in the Vaadin data model, and can be bound to data with field groups, as described in <<dummy/../../../framework/datamodel/datamodel-forms#datamodel.forms, "Binding Data to Forms">>. The field values are buffered and can be validated with validators. A composite field class must implement the [methodname]#getType()# and [methodname]#initContent()# methods. diff --git a/documentation/components/components-features.asciidoc b/documentation/components/components-features.asciidoc index 28b7ea2093..e72ee2179e 100644 --- a/documentation/components/components-features.asciidoc +++ b/documentation/components/components-features.asciidoc @@ -70,7 +70,6 @@ around a component. ---- .v-caption {} .v-captiontext {} - .v-caption-clearelem {} .v-required-field-indicator {} ---- @@ -78,10 +77,8 @@ A caption is be rendered inside an HTML element that has the [literal]#++v-caption++# CSS style class. The containing layout may enclose a caption inside other caption-related elements. -Some layouts put the caption text in a [literal]#++v-captiontext++# element. A -[literal]#++v-caption-clearelem++# is used in some layouts to clear a CSS -[literal]#++float++# property in captions. An optional required indicator in -field components is contained in a separate element with +Some layouts put the caption text in a [literal]#++v-captiontext++# element. +An optional required indicator in field components is contained in a separate element with [literal]#++v-required-field-indicator++# style. @@ -143,9 +140,6 @@ The result is shown in <<figure.components.tooltip.richtext>>. .A Rich Text Tooltip image::img/tooltip-richtext-withpointer-hi.png[width=40%, scaledwidth=75%] -Notice that the setter and getter are defined for all field components implementing the -[classname]#HasValue# interface, not for all components. - [[components.features.enabled]] == Enabled @@ -182,10 +176,8 @@ A disabled component is automatically put in read-only like state. No client interaction with a disabled component is sent to the server and, as an important security feature, the server-side components do not receive state updates from the client in the disabled state. This feature exists in all built-in -components in Vaadin and is automatically handled for all [classname]#HasValue# -components that have a value. For custom widgets, you need to make -sure that the disabled state is checked on the server-side for all -safety-critical variables. +components in the Framework meaning all client to server RPC calls are ignored +for disabled components. === CSS Style Rules @@ -203,11 +195,8 @@ have to join the style class names with a dot as done in the example below. This would make the border of all disabled text fields dotted. -// TODO This may change to $v-button-disabled-opacity In the Valo theme, the opacity of disabled components is specified with the -`$v-disabled-opacity` -ifndef::web[parameter.] -ifdef::web[parameter, as described in <<dummy/../../../framework/themes/themes-valo#themes.valo.variables,"Common Settings">>] +`$v-disabled-opacity` parameter. [[components.features.icon]] == Icon @@ -294,7 +283,6 @@ date.setLocale(new Locale("de", "DE")); date.setResolution(Resolution.DAY); layout.addComponent(date); ---- -See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.locale.simple[on-line example, window="_blank"]. The resulting date field is shown in <<figure.components.features.locale.simple>>. @@ -302,7 +290,7 @@ The resulting date field is shown in <<figure.components.features.locale.simple> .Set locale for [classname]#InlineDateField# image::img/features-locale-simple.png[width=40%, scaledwidth=60%] -ifdef::web[] + [[components.features.locale.get]] === Getting the Locale @@ -331,7 +319,6 @@ Button cancel = new Button() { }; layout.addComponent(cancel); ---- -See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.locale.get-attach[on-line example, window="_blank"]. However, it is normally a better practice to use the locale of the current UI to get the localized resource right when the component is created. @@ -349,73 +336,17 @@ Button cancel = new Button(bundle.getString(MyAppCaptions.CancelKey)); layout.addComponent(cancel); ---- -See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.locale.get-ui[on-line example, window="_blank"]. -endif::web[] -ifdef::web[] + [[component.features.locale.selecting]] === Selecting a Locale -A common task in many applications is selecting a locale. This is done in the -following example with a [classname]#ComboBox#, which gets the available locales -in Java. - - -[source, java] ----- -// The locale in which we want to have the language -// selection list -Locale displayLocale = Locale.ENGLISH; - -// All known locales -final Locale[] locales = Locale.getAvailableLocales(); - -// Allow selecting a language. We are in a constructor of a -// CustomComponent, so preselecting the current -// language of the application can not be done before -// this (and the selection) component are attached to -// the application. -ComboBox<Locale> select = new ComboBox<>("Select a language") { - @Override - public void attach() { - super.attach(); - setValue(getLocale()); - } -}; - -select.setItems(Arrays.asList(locales)); -select.setCaptionGenerator(locale -> locale.getDisplayName(displayLocale)); -select.setValue(getLocale()); - -layout.addComponent(select); - -// Locale code of the selected locale -Label localeCode = new Label(""); -layout.addComponent(localeCode); - -// A date field which language the selection will change -InlineDateField date = - new InlineDateField("Calendar in the selected language"); -date.setResolution(Resolution.DAY); -layout.addComponent(date); - -// Handle language selection -select.onValueChange(locale -> { - date.setLocale(locale); - localeCode.setValue("Locale code: " + - locale.getLanguage() + "_" + - locale.getCountry()); -}); ----- -See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.locale.selection[on-line example, window="_blank"]. - -The user interface is shown in <<figure.components.features.locale.selection>>. - -[[figure.components.features.locale.selection]] -.Selecting a locale -image::img/features-locale-selection.png[] - -endif::web[] +A common task in many applications is selecting a locale. +The locale can be set for the [classname]#UI# or single [classname]#Component#. +By default each component uses the locale from the [classname]#UI# it has been +attached to. Setting a locale to a [classname]#Component# only applies the locale +to that component and its children. Note, that updating the locale for a component +does not update its children, thus any child component that uses the locale should be updated manually. [[components.features.readonly]] @@ -424,20 +355,17 @@ endif::web[] ((("read-only property"))) ((("Component interface", "read-only"))) The property defines whether the value of a component can be changed. The -property is only applicable to [classname]#HasValue# components implementing the `HasValue` interface, as they have a -value that can be edited by the user. +property is only applicable to components implementing the [interfacename]#HasValue# interface. [source, java] ---- TextField readwrite = new TextField("Read-Write"); readwrite.setValue("You can change this"); readwrite.setReadOnly(false); // The default -layout.addComponent(readwrite); TextField readonly = new TextField("Read-Only"); readonly.setValue("You can't touch this!"); readonly.setReadOnly(true); -layout.addComponent(readonly); ---- The resulting read-only text field is shown in @@ -467,10 +395,6 @@ and some of such changes could be acceptable, such as change in the scroll bar position of a [classname]#ListSelect#. Custom components should check the read-only state for variables bound to business data. -//// -TODO: Note this also in the Advanced: Security section. -Possibly also in the GWT chapter. -//// === CSS Style Rules @@ -562,13 +486,6 @@ invisible.setVisible(false); layout.addComponent(invisible); ---- -The resulting invisible component is shown in -<<figure.components.features.visible.simple>>. - -[[figure.components.features.visible.simple]] -.An invisible component -image::img/features-visible-simple.png[] - If you need to make a component only cosmetically invisible, you should use a custom theme to set it [literal]#++display: none++# style. This is mainly useful for some special components that have effects even when made invisible in CSS. @@ -579,10 +496,6 @@ invisible by setting all its font and other attributes to be transparent. In such cases, the invisible content of the component can be made visible easily in the browser. -A component made invisible with the __visible__ property has no particular CSS -style class to indicate that it is hidden. The element does exist though, but -has [literal]#++display: none++# style, which overrides any CSS styling. - [[components.features.sizeable]] == Sizing Components @@ -601,9 +514,6 @@ The size of a component can be set with [methodname]#setWidth()# and [methodname]#setHeight()# methods. The methods take the size as a floating-point value. You need to give the unit of the measure as the second parameter for the above methods. -ifdef::web[] -The available units are listed in <<components.features.sizeable.units.table>>. -endif::web[] [source, java] ---- @@ -622,8 +532,7 @@ mycomponent.setHeight("400px"); ---- The "[literal]#++100%++#" percentage value makes the component take all -available size in the particular direction (see the description of -[parameter]#Unit.PERCENTAGE# in the table below). You can also use the +available size in the particular direction. You can also use the shorthand method [methodname]#setSizeFull()# to set the size to 100% in both directions. @@ -631,31 +540,11 @@ The size can be __undefined__ in either or both dimensions, which means that the component will take the minimum necessary space. Most components have undefined size by default, but some layouts have full size in horizontal direction. You can set the height, width, or both as undefined with the methods [methodname]#setWidthUndefined()#, -[methodname]#setHeightUndefined()#, and [methodname]#setHeightUndefined()#, respectively. +[methodname]#setHeightUndefined()#, and [methodname]#setSizeUndefined()#, respectively. Always keep in mind that _a layout with undefined size may not contain components with defined relative size_, such as "full size", except in some special cases. See <<dummy/../../../framework/layout/layout-settings#layout.settings.size,"Layout Size">> for details. -ifdef::web[] -The <<components.features.sizeable.units.table>> table lists the available units and their codes defined in the [interfacename]#Sizeable# interface. - -[[components.features.sizeable.units.table]] -.Size units -[cols="5,2,10", options="header"] -|=============== -|Constant|Unit|Description -|[parameter]#Unit.PIXELS#|px|The _pixel_ is the basic hardware-specific measure of one physical display pixel. -|[parameter]#Unit.POINTS#|pt|The _point_ is a typographical unit, which is usually defined as 1/72 inches or about 0.35 mm. However, on displays the size can vary significantly depending on display metrics. -|[parameter]#Unit.PICAS#|pc|The _pica_ is a typographical unit, defined as 12 points, or 1/7 inches or about 4.233 mm. On displays, the size can vary depending on display metrics. -|[parameter]#Unit.EM#|em|A unit relative to the used font, the width of the upper-case "M" letter. -|[parameter]#Unit.EX#|ex|A unit relative to the used font, the height of the lower-case "x" letter. -|[parameter]#Unit.MM#|mm|A physical length unit, millimeters on the surface of a display device. However, the actual size depends on the display, its metrics in the operating system, and the browser. -|[parameter]#Unit.CM#|cm|A physical length unit, _centimeters_ on the surface of a display device. However, the actual size depends on the display, its metrics in the operating system, and the browser. -|[parameter]#Unit.INCH#|in|A physical length unit, _inches_ on the surface of a display device. However, the actual size depends on the display, its metrics in the operating system, and the browser. -|[parameter]#Unit.PERCENTAGE#|%|A relative percentage of the available size. For example, for the top-level layout [parameter]#100%# would be the full width or height of the browser window. The percentage value must be between 0 and 100. -|=============== -endif::web[] - If a component inside [classname]#HorizontalLayout# or [classname]#VerticalLayout# has full size in the namesake direction of the layout, the component will expand to take all available space not needed by the other components. See <<dummy/../../../framework/layout/layout-settings#layout.settings.size,"Layout Size">> for details. diff --git a/documentation/components/components-fields.asciidoc b/documentation/components/components-fields.asciidoc index 45325b9146..e1075fc6cf 100644 --- a/documentation/components/components-fields.asciidoc +++ b/documentation/components/components-fields.asciidoc @@ -19,59 +19,54 @@ and the important interfaces and base classes. .Field components image::img/field-diagram-hi.png[width=80%, scaledwidth=100%] -Field components are built upon the framework defined in the [classname]#Field# -interface and the [classname]#AbstractField# base class. -[classname]#AbstractField# is the base class for all field components. In -addition to the component features inherited from +Field components are built upon the framework defined in the [classname]#HasValue# +interface. +[classname]#AbstractField# is the base class for all field components, +except those components that allow the user to select a value. +(see <<dummy/../../../framework/components/components-selection.asciidoc#components.selection,"Selection Components">>). + +In addition to the component features inherited from [classname]#AbstractComponent#, it implements the features defined in the -[classname]#HasValue# and [classname]#Component.Focusable# interfaces. +[interfacename]#HasValue# and [classname]#Component.Focusable# interfaces. [[figure.components.fields.hasvalue]] .Field components having values image::img/field-interface-v8-hi.png[width=60%, scaledwidth=100%] -The description of the field interfaces and base classes is broken down in the -following sections. +The description of the [interfacename]#HasValue# interface and field components extending [classname]#AbstractField] is broken down in the following sections. [[components.fields.field]] -== The [classname]#Field# Interface - -The [classname]#Field# interface inherits the [classname]#Component# -superinterface and also the [classname]#HasValue# interface to have a value for -the field. [classname]#AbstractField# is the only class implementing the -[classname]#Field# interface directly. The relationships are illustrated in -<<figure.components.fields.field>>. +== The [interfacename]#HasValue# Interface -[[figure.components.fields.field]] -.[classname]#Field# interface inheritance -image::img/field-interface-hi.png[width=60%, scaledwidth=100%] +The [interfacename]#HasValue# interface marks a component that has a user editable value. +The type parameter in the interface is the type of the value that the component is editing. -You can set the field value with the [methodname]#setValue()# and read with the +You can set the value with the [methodname]#setValue()# and read it with the [methodname]#getValue()# method defined in the [classname]#HasValue# interface. -The actual value type depends on the component. -The [classname]#Field# interface defines a number of properties, which you can +The [classname]#HasValue# interface defines a number of properties, which you can access with the corresponding setters and getters. -[methodname]#required#:: When enabled, a required indicator (usually the asterisk * character) is -displayed on the left, above, or right the field, depending on the containing -layout and whether the field has a caption. If such fields are validated but are -empty and the [methodname]#requiredError# property (see below) is set, an error -indicator is shown and the component error is set to the text defined with the -error property. Without validation, the required indicator is merely a visual -guide. -[methodname]#requiredError#:: Defines the error message to show when a value is required, but none is entered. -The error message is set as the component error for the field and is usually -displayed in a tooltip when the mouse pointer hovers over the error indicator. +[methodname]#readOnly#:: Set the component to be read-only, meaning that the value is not editable. -[[components.fields.valuechanges]] -== Handling Field Value Changes +[methodname]#requiredIndicatorVisible#:: When enabled, a required indicator +(the asterisk * character) is displayed on the left, above, or right the field, +depending on the containing layout and whether the field has a caption. +When the component is used in a form (see <<dummy/../../../framework/datamodel/datamodel-forms.asciidoc#datamodel.forms.validation,"Validation">>), +it can be set to be required, which will automatically show the required indicator, +and validate that the value is not empty. Without validation, the required indicator +is merely a visual guide. + +[methodname]#emptyValue#:: The initial empty value of the component. + +[methodname]#clear#:: Clears the value to the empty value. -[classname]#Field# provides [methodname]#addValueChangeListener# method for listening to changes to the field value. This method takes a [interfacename]#EventListener# that gets -a [classname]#ValueChange# event instance containing information about the event. -This method returns a [classname]#Registration# object that can be used to later +[[components.fields.valuechanges]] +== Handling Value Changes + +[interfacename]#HasValue# provides [methodname]#addValueChangeListener# method for listening to changes to the field value. This method returns a [classname]#Registration# object that can be used to later remove the added listener if necessary. [source, java] @@ -79,7 +74,6 @@ remove the added listener if necessary. TextField textField = new TextField(); Label echo = new Label(); -// Add a more complex listener textField.addValueChangeListener(event -> { String origin = event.isUserOriginated() ? "user" @@ -91,6 +85,7 @@ textField.addValueChangeListener(event -> { }); ---- + [[components.fields.databinding]] == Binding Fields to Data @@ -114,16 +109,18 @@ Binder<Person> binder = new Binder<>(); // Bind nameField to the Person.name property // by specifying its getter and setter -binder.forField(nameField) - .bind(Person::getName, Person::setName); +binder.bind(nameField, Person::getName, Person::setName); // Bind an actual concrete Person instance. // After this, whenever the user changes the value // of nameField, p.setName is automatically called. Person p = new Person(); -binder.bind(p; +binder.bind(p); ---- +For more information on data binding, see <<dummy/../../../framework/datamodel/datamodel-forms.asciidoc#datamodel.forms,"Binding Data to Forms">> + + == Validating Field Values User input may be syntactically or semantically invalid. @@ -131,40 +128,24 @@ User input may be syntactically or semantically invalid. automatically checking the validity of the input before storing it to the data object. You can add validators to fields by calling the [methodname]#withValidator# method on the [interfacename]#Binding# object returned by [methodname]#Binder.forField#. +There are several built-in validators in the Framework, such as the [classname]#StringLengthValidator# used below. [source, java] ---- binder.forField(nameField) - .withValidator(new StringLengthValidator(2, 20, - "Name must be between 2 and 20 characters long")) + .withValidator(new StringLengthValidator( + "Name must be between 2 and 20 characters long", + 2, 20)) .bind(Person::getName, Person::setName); ---- -Failed validation is indicated with the error indicator of the field, described in +Failed validation is by default indicated with the error indicator of the field, described in <<dummy/../../../framework/application/application-errors#application.errors.error-indicator,"Error Indicator and Message">>. Hovering mouse on the field displays the error message returned by the validator. If any value in a set of bound fields fails validation, none of the field values are saved into the bound property until the validation passes. -[[components.fields.validation.builtin]] -=== Built-in Validators - -Vaadin includes the following built-in validators. The property value type is -indicated. - -[classname]#RangeValidator#: [classname]#Comparable#:: -Checks that the given [interfacename]#Comparable# value is at or between two given values. - -[classname]#StringLengthValidator#: [classname]#String#:: -Checks that the length of the input string is at or between two given lengths. - -[classname]#RegexpValidator#: [classname]#String#:: -Checks that the value matches the given regular expression. - -[classname]#EmailValidator#: [classname]#String#:: -Checks that the string value is a syntactically valid email address. -The validated syntax is close to the RFC 822 standard regarding email addresses. === Implementing Custom Validators @@ -177,7 +158,7 @@ whether or not the given input was valid. ---- class MyValidator implements Validator<String> { @Override - public Result<String> apply(String input) { + public Result<String> apply(String value, ValueContext context) { if(input.length() == 6) { return Result.ok(input); } else { @@ -211,8 +192,7 @@ Field values are always of some particular type. For example, a data source, the type of the source property can be something different, say an [classname]#Integer#. __Converters__ are used for converting the values between the presentation and the model. Their usage is described in -<<dummy/../../../framework/datamodel/datamodel-properties#datamodel.properties.converter,"Converting -Between Model and Presentation Types">>. +<<dummy/../../../framework/datamodel/datamodel-forms.asciidoc#datamodel.forms.conversion,"Conversion">>. (((range="endofrange", startref="term.components.fields"))) diff --git a/documentation/components/components-grid.asciidoc b/documentation/components/components-grid.asciidoc index 2366961e03..c379584e01 100644 --- a/documentation/components/components-grid.asciidoc +++ b/documentation/components/components-grid.asciidoc @@ -924,8 +924,7 @@ grid.setEditorBinder(binder); To use bean validation as in the example above, you need to include an implementation of the Bean Validation API in the classpath, as described in -<<dummy/../../../framework/datamodel/datamodel-itembinding#datamodel.itembinding.beanvalidation,"Bean -Validation">>. +<<dummy/../../../framework/datamodel/datamodel-forms.asciidoc#datamodel.forms.beans,"Binding Beans to Forms">>. ifdef::web[] diff --git a/documentation/components/components-interfaces.asciidoc b/documentation/components/components-interfaces.asciidoc index 263366b944..c183d77c8b 100644 --- a/documentation/components/components-interfaces.asciidoc +++ b/documentation/components/components-interfaces.asciidoc @@ -92,15 +92,8 @@ described in <<components.interfaces.abstractcomponent>>. [classname]#AbstractComponent# is the base class for all user interface components. It is the (only) implementation of the [classname]#Component# -interface, implementing all the methods defined in the interface. - -[classname]#AbstractComponent# has a single abstract method, -[methodname]#getTag()#, which returns the serialization identifier of a -particular component class. It needs to be implemented when (and only when) -creating entirely new components. [classname]#AbstractComponent# manages much of -the serialization of component states between the client and the server. -Creation of new components and serialization is described in -<<dummy/../../../framework/gwt/gwt-overview.asciidoc#gwt.overview,"Integrating -with the Server-Side">>. +interface, implementing all the methods defined in the interface. When +creating a new component, you should extend [classname]#AbstractComponent# or +one of its subclasses. (((range="endofrange", startref="term.components.interfaces.abstractcomponent"))) diff --git a/documentation/components/components-label.asciidoc b/documentation/components/components-label.asciidoc index ee2113fa84..71efc6bf9e 100644 --- a/documentation/components/components-label.asciidoc +++ b/documentation/components/components-label.asciidoc @@ -72,7 +72,7 @@ panel.setContent( As the size of the [classname]#Panel# in the above example is fixed and the width of [classname]#Label# is the default undefined, the [classname]#Label# will overflow the layout horizontally and be truncated. -<<figure.components.label>>. +//<<figure.components.label>>. //// // TODO update figure to match new label settings in Vaadin Framwork 8 diff --git a/documentation/components/components-selection.asciidoc b/documentation/components/components-selection.asciidoc index 0b42116a82..2e7b8859e6 100644 --- a/documentation/components/components-selection.asciidoc +++ b/documentation/components/components-selection.asciidoc @@ -11,9 +11,7 @@ For a better overview on how selection works, see link:../datamodel/datamodel-se Vaadin offers many alternative ways for selecting one or more items. The core library includes the following selection components, all based on either -`AbstractSingleSelect` or `AbstractMultiSelect` class: - -// TODO Only use section numbers here, prefixed with "Section", not include section title +[classname]#AbstractSingleSelect# or [classname]#AbstractMultiSelect# class: [classname]#ComboBox# (<<components-combobox#components.combobox,"ComboBox">>):: A drop-down list with a text box, where the user can type text to find matching items. @@ -74,13 +72,12 @@ ComboBox<Planet> select = new ComboBox<>("My Select"); // Add an items to the ComboBox select.setItems(planets); -select.setItemCaptionGenerator(planet -> planet.getName()); -// or even select.setItemCaptionGenerator(Planet::getName); +select.setItemCaptionGenerator(Planet::getName); // Select the first select.setSelectedItem(planets.get(0)); // or -select.setValue(planets.get(0)); +// select.setValue(planets.get(0)); ---- In addition to a caption, an item can have an icon. The icon is set with @@ -93,78 +90,8 @@ retrieved with [methodname]#toString()# method from the item. This is useful for simple objects like String or Integers, but also for objects that have human readable output for [methodname]#toString()# . -[source, java] ----- -ComboBox<Planet> select = new ComboBox<>("Inner Planets"); - -// A class that implements toString() -class Planet implements Serializable { - String planetName; - - Planet(String name) { - planetName = name; - } - - public String toString () { - return "The Planet " + planetName; - } -} - -// Use such objects as items -List<Planet> planets = new ArrayList<>(); -planets.add(new Planet("Mercury")); -planets.add(new Planet("Venus")); -planets.add(new Planet("Earth")); - -select.setItems(planets); ----- - Using a field of a item as caption: the caption is retrieved using the -[interfacename]#ItemCaptionGenerator# typically given as Java 8 lambda. - -[source, java] ----- -// A class that implements toString() -class Planet implements Serializable { - Integer id; - String planetName; - - Planet(Integer id, String name) { - this.id = id - this.planetName = name; - } - - public String toString () { - return "The Planet " + planetName; - } - - public Integer getId () { - return id; - } - - - public String getName () { - return planetName; - } - -} - -// Put some example data -List<Planet> planets = new ArrayList<>(); -planets.add(new Planet(1, "Mercury")); -planets.add(new Planet(2, "Venus")); -planets.add(new Planet(3, "Earth")); -planets.add(new Planet(4, "Mars")); - -// Create a selection component -ComboBox<Planet> select = - new ComboBox<>("Planets"); - -// Set the caption generator to read the -// caption directly from the 'name' -// property of the bean -select.setItemCaptionGenerator(Planet::getName); ----- +[interfacename]#ItemCaptionGenerator# typically given as a lambda or a method reference. [[components.selection.item-icons]] @@ -178,67 +105,14 @@ support images inside the native [literal]#++select++# elements. -[[components.selection.newitems]] -== Allowing Adding New Items - -[classname]#ComboBox# allows the user to add new items, when the user types -in a value and presses kbd:[Enter]. You need to enable this with -[methodname]#setNewItemHandler()#. - -Adding new items is not possible if the selection component is read-only. An -attempt to do so may result in an exception. - -[[components.selection.newitems.handling]] -=== Handling New Items - -Adding new items is handled by a [interfacename]#NewItemHandler#, which gets the -item caption string as parameter for the [methodname]#accept(String)# method. - -ifdef::web[] - -[source, java] ----- -// List of planets -List<Planet> planets = new ArrayList<>(); -planets.add(new Planet(1, "Mercury")); -planets.add(new Planet(2, "Venus")); -planets.add(new Planet(3, "Earth")); -planets.add(new Planet(4, "Mars")); - -ComboBox<Planet> select = - new ComboBox<>("Select or Add a Planet"); -select.setItems(planets); - -// Use the name property for item captions -select.setItemCaptionGenerator(Planet::getName); - -// Allow adding new items and add -// handling for new items -select.setNewItemHandler(inputString -> { - - // Create a new bean - can't set all properties - Planet newPlanet = new Planet(0, inputString); - planets.add(newPlanet); - - // Update combobox content - select.setItems(planets); - - // Remember to set the selection to the new item - select.select(newPlanet); - - Notification.show("Added new planet called " + - inputString); -}); - - [[components.selection.getset]] == Getting and Setting Selection For a better overview on how selection works, see link:../datamodel/datamodel-selection.asciidoc[Selecting items] You can get selected the item with [methodname]#getValue()# of the -[classname]#HasValue# interface that returns either a single selected item -(case of `SingleSelect`) or a collection of selected items (case of `MultiSelect`). +[interfacename]#HasValue# interface that returns either a single selected item +(case of [interfacename]#SingleSelect#) or a collection of selected items (case of [interfacename]#MultiSelect#). You can select an item with the corresponding [methodname]#setValue()# method. The [classname]#ComboBox# and [classname]#NativeSelect# will show empty @@ -246,14 +120,14 @@ selection when no actual item is selected. [[components.selection.valuechange]] -== Handling Selection Changes +== Handling Selection Events -You can access the currently selected item with the [methodname]#getValue()# (`SingleSelect`) or -[methodname]#getSelectedItems()# (`MultiSelect`) method of the component. Also, when -handling selection changes with a +You can access the currently selected item with the [methodname]#getValue()# ([interfacename]#SingleSelect#) or +[methodname]#getSelectedItems()# ([interfacename]#MultiSelect#) method of the component. Also, when +handling selection events with a [classname]#SelectionListener#, the [classname]#SelectionEvent# will have the selected items of the event. Single- and Multiselect -components have their own more specific listener and event types, `SingleSelectionListener` for `SingleSelectionEvent` and `MultiSelectionListener` for `MultiSelectionEvent` respectively. Both can be added with the `addSelectionListener` method. +components have their own more specific listener and event types, [interfacename]#SingleSelectionListener# for [classname]#SingleSelectionEvent# and [interfacename]#MultiSelectionListener# for [classname]#MultiSelectionEvent# respectively. Both can be added with the [methodname]#addSelectionListener# method. [source, java] @@ -262,7 +136,7 @@ components have their own more specific listener and event types, `SingleSelecti ComboBox<String> select = new ComboBox<>("My Select"); select.setItems("Io", "Europa", "Ganymedes", "Callisto"); -// Handle selection change +// Handle selection event select.addSelectionListener(event -> layout.addComponent(new Label("Selected " + event.getSelectedItem().orElse("none"))); @@ -276,10 +150,6 @@ The result of user interaction is shown in image::img/select-selected1.png[width=30%, scaledwidth=40%] ----- -endif::web[] - - [[components.selection.multiple]] == Multiple Selection @@ -290,12 +160,12 @@ Some selection components, such as [classname]#CheckBoxGroup#, they extend [classname]#AbstractMultiSelect# class. -Multiselect components use the `MultiSelect` interface which extends `HasValue`. -This provides more fine grained API for selection. You can get and set the selection with the [methodname]#MultiSelect.getSelectedItems()# and -[methodname]#SelectionModel.Multi.selectItems()# methods. +Multiselect components use the [interfacename]#MultiSelect# interface which extends [interfacename]#HasValue#. +This provides more fine grained API for selection. You can get and set the selection with the [methodname]#getSelectedItems()# and +[methodname]#select()# methods. -A change in the selection will trigger a [classname]#SelectionChange#, which -you can handle with a [classname]#SelectionChangeListener#. The +A change in the selection will trigger a [classname]#SelectionEvent#, which +you can handle with a [classname]#SelectionListener#. The following example shows how to handle selection changes with a listener. diff --git a/documentation/components/components-textfield.asciidoc b/documentation/components/components-textfield.asciidoc index 1b543ed2ff..b0f00368db 100644 --- a/documentation/components/components-textfield.asciidoc +++ b/documentation/components/components-textfield.asciidoc @@ -49,8 +49,7 @@ See the http://demo.vaadin.com/book-examples-vaadin7/book#component.textfield.in [classname]#TextField# edits [classname]#String# values, but you can use [classname]#Binder# to bind it to any property type that has a proper converter, as described in -<<dummy/../../../framework/datamodel/datamodel-properties#datamodel.properties.converter,"Converting -Between Property Type and Representation">>. +<<dummy/../../../framework/datamodel/datamodel-forms.asciidoc#datamodel.forms.conversion,"Conversion">>. Much of the API of [classname]#TextField# is defined in [classname]#AbstractTextField#, which allows different kinds of text input diff --git a/documentation/components/img/features-locale-selection.png b/documentation/components/img/features-locale-selection.png Binary files differdeleted file mode 100644 index c791aa2cd8..0000000000 --- a/documentation/components/img/features-locale-selection.png +++ /dev/null diff --git a/documentation/components/img/features-visible-simple.png b/documentation/components/img/features-visible-simple.png Binary files differdeleted file mode 100644 index bb4efaf261..0000000000 --- a/documentation/components/img/features-visible-simple.png +++ /dev/null diff --git a/documentation/components/img/field-interface-hi.png b/documentation/components/img/field-interface-hi.png Binary files differdeleted file mode 100644 index 1b6579b846..0000000000 --- a/documentation/components/img/field-interface-hi.png +++ /dev/null diff --git a/documentation/components/img/field-interface-lo.png b/documentation/components/img/field-interface-lo.png Binary files differdeleted file mode 100644 index 906dab7769..0000000000 --- a/documentation/components/img/field-interface-lo.png +++ /dev/null diff --git a/documentation/components/img/table-cellstylegenerator1.png b/documentation/components/img/table-cellstylegenerator1.png Binary files differdeleted file mode 100644 index a23bc6d38a..0000000000 --- a/documentation/components/img/table-cellstylegenerator1.png +++ /dev/null diff --git a/documentation/components/img/table-column-collapsing.png b/documentation/components/img/table-column-collapsing.png Binary files differdeleted file mode 100644 index 5142fe0b93..0000000000 --- a/documentation/components/img/table-column-collapsing.png +++ /dev/null diff --git a/documentation/components/img/table-column-resize.png b/documentation/components/img/table-column-resize.png Binary files differdeleted file mode 100644 index 86af196ae8..0000000000 --- a/documentation/components/img/table-column-resize.png +++ /dev/null diff --git a/documentation/components/img/table-columnformatting.png b/documentation/components/img/table-columnformatting.png Binary files differdeleted file mode 100644 index d5549b8b30..0000000000 --- a/documentation/components/img/table-columnformatting.png +++ /dev/null diff --git a/documentation/components/img/table-components.png b/documentation/components/img/table-components.png Binary files differdeleted file mode 100644 index e0071f9ddc..0000000000 --- a/documentation/components/img/table-components.png +++ /dev/null diff --git a/documentation/components/img/table-editable3.png b/documentation/components/img/table-editable3.png Binary files differdeleted file mode 100644 index 610699e491..0000000000 --- a/documentation/components/img/table-editable3.png +++ /dev/null diff --git a/documentation/components/img/table-example1.png b/documentation/components/img/table-example1.png Binary files differdeleted file mode 100644 index 3d091cfacb..0000000000 --- a/documentation/components/img/table-example1.png +++ /dev/null diff --git a/documentation/components/img/table-example2.png b/documentation/components/img/table-example2.png Binary files differdeleted file mode 100644 index f6830ff67c..0000000000 --- a/documentation/components/img/table-example2.png +++ /dev/null diff --git a/documentation/components/img/table-footer.png b/documentation/components/img/table-footer.png Binary files differdeleted file mode 100644 index fdc2c09674..0000000000 --- a/documentation/components/img/table-footer.png +++ /dev/null diff --git a/documentation/components/img/table-generatedcolumns1.png b/documentation/components/img/table-generatedcolumns1.png Binary files differdeleted file mode 100644 index 11e7931624..0000000000 --- a/documentation/components/img/table-generatedcolumns1.png +++ /dev/null diff --git a/documentation/components/img/table-generatedcolumns2.png b/documentation/components/img/table-generatedcolumns2.png Binary files differdeleted file mode 100644 index 0e0b42e665..0000000000 --- a/documentation/components/img/table-generatedcolumns2.png +++ /dev/null diff --git a/documentation/components/img/treetable-basic.png b/documentation/components/img/treetable-basic.png Binary files differdeleted file mode 100644 index 36caa81fcb..0000000000 --- a/documentation/components/img/treetable-basic.png +++ /dev/null diff --git a/documentation/components/original-drawings/field-interface.svg b/documentation/components/original-drawings/field-interface.svg deleted file mode 100644 index 205bbe11b0..0000000000 --- a/documentation/components/original-drawings/field-interface.svg +++ /dev/null @@ -1,1222 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448"
- height="1052.3622"
- id="svg2475"
- sodipodi:version="0.32"
- inkscape:version="0.46"
- sodipodi:docname="field-interface.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="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1.6970563"
- inkscape:cx="543.70494"
- inkscape:cy="597.63673"
- 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:grid
- spacingy="1mm"
- spacingx="1mm"
- empspacing="5"
- units="mm"
- enabled="true"
- visible="true"
- id="grid4674"
- type="xygrid"
- dotted="false" />
- </sodipodi:namedview>
- <defs
- id="defs2477">
- <linearGradient
- id="linearGradient4410">
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="0"
- id="stop4412" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop4414" />
- </linearGradient>
- <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>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4410"
- id="radialGradient4181"
- cx="-61.679379"
- cy="-342.53549"
- fx="-61.679379"
- fy="-342.53549"
- r="240.94489"
- gradientTransform="matrix(1,-3.7478987e-8,1.1023234e-8,0.2941177,5.335063e-6,-121.8624)"
- gradientUnits="userSpaceOnUse" />
- </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="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.83464575;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.83464575, 2.83464575;stroke-dashoffset:3.68503947;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect4436"
- width="499.60629"
- height="237.40158"
- x="198.4252"
- y="322.44092"
- ry="3.7880721" />
- <g
- transform="translate(204.60668,263.00299)"
- id="g2802">
- <rect
- ry="3.7880721"
- y="208.55002"
- x="172.42705"
- height="35.93816"
- width="110.42418"
- id="rect2804"
- style="opacity:1;fill:#f39300;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
- transform="translate(227.07111,229.7651)"
- 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;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 Italic"
- xml:space="preserve"><flowRegion
- id="flowRegion2808" /><flowPara
- id="flowPara2812">AbstractField</flowPara></flowRoot> </g>
- <path
- 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(#marker18095);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 502.24448,489.52209 L 487.45791,489.52209"
- id="path3832"
- inkscape:connector-type="polyline"
- inkscape:connection-end="#g2802"
- inkscape:connection-start="#g3808" />
- <g
- transform="translate(488.07123,234.404)"
- id="g3808">
- <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="rect3810"
- width="77.952736"
- height="35.433075"
- x="14.173247"
- y="237.40155"
- ry="3.7880721" />
- <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:#ffffff;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="flowRoot3812"
- transform="translate(52.923584,259.59409)"><flowRegion
- id="flowRegion3814" /><flowPara
- id="flowPara3818">Button</flowPara></flowRoot> </g>
- <path
- 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(#marker18095);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 594.37048,489.58243 L 580.19721,489.56634"
- id="path3834"
- inkscape:connector-type="polyline"
- inkscape:connection-start="#g3820"
- inkscape:connection-end="#g3808" />
- <g
- transform="translate(580.19723,234.5086)"
- id="g3820">
- <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="rect3822"
- width="77.952736"
- height="35.433075"
- x="14.173247"
- y="237.40155"
- ry="3.7880721" />
- <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:#ffffff;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="flowRoot3824"
- transform="translate(54.586428,258.88009)"><flowRegion
- id="flowRegion3826" /><flowPara
- id="flowPara3830">CheckBox</flowPara></flowRoot> </g>
- <g
- transform="translate(488.57632,283.75775)"
- id="g3836">
- <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="rect3838"
- width="77.952736"
- height="35.433075"
- x="14.173247"
- y="237.40155"
- ry="3.7880721" />
- <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:#ffffff;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="flowRoot3840"
- transform="translate(53.349584,258.36409)"><flowRegion
- id="flowRegion3842" /><flowPara
- id="flowPara3846">TextField</flowPara></flowRoot> </g>
- <path
- 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(#marker18095);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 594.16798,539.05919 L 580.7023,539.01211"
- id="path3866"
- inkscape:connector-type="polyline"
- inkscape:connection-start="#g3848"
- inkscape:connection-end="#g3836" />
- <g
- transform="translate(583.33557,296.5446)"
- id="g3848">
- <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="rect3850"
- width="99.41507"
- height="35.433071"
- x="10.832414"
- y="224.97185"
- ry="3.7880721" />
- <text
- 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:#ffffff;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"
- x="59.819889"
- y="246.23169"
- id="text3860"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan3862"
- x="59.819889"
- y="246.23169">RichTextArea</tspan></text>
- </g>
- <path
- inkscape:connection-end="#g2802"
- inkscape:connector-type="polyline"
- id="path2641"
- d="M 432.28346,552.75588 L 432.22373,507.49117"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker52016);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- sodipodi:nodetypes="cc" />
- <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(#marker18095);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 460.62992,552.75588 L 460.82677,506.98608"
- id="path2679"
- inkscape:connector-type="polyline" />
- <g
- id="g5008"
- transform="translate(316.15294,225.23928)">
- <rect
- ry="3.7880721"
- y="238.7607"
- x="204.7132"
- height="14.173233"
- width="67.322838"
- id="rect5010"
- style="opacity:1;fill:#49c2f1;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:#ffffff;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="flowRoot5012"
- transform="translate(24.523539,102.7123)"><flowRegion
- id="flowRegion5014"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use5016"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara5018">ClickEvent</flowPara></flowRoot> </g>
- <g
- id="g5020"
- transform="translate(316.46063,210.7839)">
- <rect
- ry="3.7880721"
- y="238.7607"
- x="204.7132"
- height="14.173233"
- width="67.322838"
- id="rect5022"
- style="opacity:1;fill:#49c2f1;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:#ffffff;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="flowRoot5024"
- transform="translate(24.523539,102.7123)"><flowRegion
- id="flowRegion5026"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use5028"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara5030">ClickListener</flowPara></flowRoot> </g>
- <path
- 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(#marker18095);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 407.48031,552.75588 L 406.8395,508.04991"
- id="path8616"
- inkscape:connector-type="polyline"
- sodipodi:nodetypes="cc" />
- <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:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
- d="M 503.34646,538.87584 L 460.82677,538.87584"
- id="path49768"
- inkscape:connector-type="polyline" />
- <g
- transform="translate(486.87623,708.04121)"
- id="g6776"
- style="fill-opacity:1;fill:url(#radialGradient4181)">
- <rect
- style="opacity:1;fill:url(#radialGradient4181);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.83464575;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.83464575, 2.83464575;stroke-dashoffset:3.68503947;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect3392"
- width="481.88977"
- height="127.55907"
- x="-274.2778"
- y="-275.75778"
- ry="3.7880721" />
- </g>
- <g
- id="g2870"
- transform="translate(177.07986,143.37191)">
- <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;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="flowRoot2874"
- transform="translate(41.217308,55.775189)"><flowRegion
- id="flowRegion2876"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use2878"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara2880">Property</flowPara></flowRoot> </g>
- <g
- id="g2886"
- transform="translate(157.67586,119.82696)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect2888"
- 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;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="flowRoot2890"
- transform="translate(-7.1061187,101.2329)"><flowRegion
- id="flowRegion2892"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use2894"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara2896">Editor</flowPara></flowRoot> </g>
- <g
- id="g3740"
- transform="translate(292.32154,119.82696)">
- <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;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="flowRoot3744"
- transform="translate(19.725317,101.70214)"><flowRegion
- id="flowRegion3746"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use3748"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara3750">ValueChangeListener</flowPara></flowRoot> </g>
- <path
- inkscape:connector-type="polyline"
- id="path3776"
- d="M 411.42023,403.72853 L 376.4354,374.02028"
- 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"
- inkscape:connection-end="#g2886"
- 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"><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(-3.5714286,23.214286)"
- id="g3178" />
- <g
- id="g2492"
- transform="translate(77.952761,177.16534)">
- <rect
- ry="3.7880721"
- y="230.31496"
- x="163.1725"
- height="35.433071"
- width="99.032219"
- id="rect4654"
- 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;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="flowRoot4664"
- transform="translate(-2.7125132,103.67242)"><flowRegion
- id="flowRegion4666"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use4668"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara4670">Component</flowPara></flowRoot> </g>
- <path
- inkscape:connector-type="polyline"
- id="path2866"
- d="M 389.76378,422.57131 L 340.15748,423.88527"
- 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"
- inkscape:connection-start="#g2854"
- inkscape:connection-end="#g2492" />
- <path
- inkscape:connection-end="#g2870"
- inkscape:connector-type="polyline"
- id="path2882"
- d="M 432.34049,403.72853 L 432.47899,360.70187"
- 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"
- inkscape:connection-start="#g2854" />
- <path
- inkscape:connection-start="#g2854"
- inkscape:connection-end="#g3740"
- inkscape:connector-type="polyline"
- id="path5048"
- d="M 461.38218,403.72853 L 510.17682,374.02028"
- 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" />
- <g
- id="g5034"
- transform="translate(123.70837,158.11296)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716537"
- width="62.31395"
- id="rect5036"
- 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;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="flowRoot5038"
- transform="translate(-0.8622551,101.2329)"><flowRegion
- id="flowRegion5040"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use5042"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara5044">Focusable</flowPara></flowRoot> </g>
- <path
- inkscape:connection-end="#g5034"
- inkscape:connection-start="#g2854"
- sodipodi:nodetypes="cc"
- inkscape:connector-type="polyline"
- id="path5050"
- d="M 389.76378,412.9879 L 369.38976,408.9355"
- 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" />
- <g
- id="g2854"
- transform="translate(223.64137,170.66298)">
- <rect
- ry="3.7880721"
- y="233.06555"
- x="166.12241"
- height="35.433075"
- width="85.039375"
- id="rect2856"
- 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;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="flowRoot2858"
- transform="translate(-6.2480473,106.19782)"><flowRegion
- id="flowRegion2860"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use2862"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara2864">Field</flowPara></flowRoot> </g>
- <path
- inkscape:connection-end="#g2854"
- inkscape:connection-start="#g2802"
- inkscape:connector-type="polyline"
- id="path2868"
- d="M 432.25575,471.55301 L 432.27367,439.16161"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker52016);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
- <g
- id="g3752"
- transform="translate(292.32154,100.30776)">
- <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;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="flowRoot3756"
- transform="translate(19.725317,101.70214)"><flowRegion
- id="flowRegion3758"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use3760"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara3762">ValueChangeEvent</flowPara></flowRoot> </g>
- <g
- id="g3764"
- transform="translate(157.67587,100.30776)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect3766"
- 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;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="flowRoot3768"
- transform="translate(-7.1061187,101.2329)"><flowRegion
- id="flowRegion3770"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use3772"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara3774">Viewer</flowPara></flowRoot> </g>
- <g
- id="g8538"
- transform="translate(18.028345,180.41896)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect8540"
- 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;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="flowRoot8542"
- transform="translate(-7.1061187,101.2329)"><flowRegion
- id="flowRegion8544"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use8546"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara8548">Event</flowPara></flowRoot> </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"><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> <g
- transform="matrix(0.5,0,0,0.5,103.34299,0.7940752)"
- id="g18053" />
- <g
- id="g80473"
- transform="translate(18.601067,201.51847)">
- <rect
- ry="3.7880721"
- y="235.59096"
- x="182.48161"
- height="17.716534"
- width="49.6063"
- id="rect80475"
- 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;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="flowRoot80477"
- transform="translate(-7.1061187,101.2329)"><flowRegion
- id="flowRegion80479"><use
- transform="translate(1.467046,-91.03536)"
- x="0"
- y="0"
- xlink:href="#rect4654"
- id="use80481"
- width="744.09448"
- height="1052.3622" /></flowRegion><flowPara
- id="flowPara80483">Listener</flowPara></flowRoot> </g>
- </g>
-</svg>
diff --git a/documentation/datamodel/datamodel-forms.asciidoc b/documentation/datamodel/datamodel-forms.asciidoc index 47974986d7..7d3301ae4c 100644 --- a/documentation/datamodel/datamodel-forms.asciidoc +++ b/documentation/datamodel/datamodel-forms.asciidoc @@ -97,6 +97,7 @@ binder.bind(nameField, `Binder` supports checking the validity of the user's input and converting the values between the type used in business objects and the bound UI components. These to concepts go hand in hand since validation can be based on a converted value, and being able to convert a value is a kind of validation. +[[datamodel.forms.validation]] === Validation An application typically has some restrictions on exactly what kinds of values the user is allowed to enter into different fields. @@ -198,6 +199,7 @@ returnBinding.bind(Trip::getReturnDate, Trip::setReturnDate); departing.addValueChangeListener(event -> returnBinding.validate()); ---- +[[datamodel.forms.conversion]] === Conversion You can also bind application data to a UI field component even though the types do not match. @@ -411,6 +413,7 @@ Button saveButton = new Button("Save", event -> { When using the `setBean` 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. +[[datamodel.forms.beans]] == Binding Beans to Forms The business objects used in an application are in most cases implemented as Java beans or POJOs. |