diff options
Diffstat (limited to 'documentation/components/components-features.asciidoc')
-rw-r--r-- | documentation/components/components-features.asciidoc | 757 |
1 files changed, 0 insertions, 757 deletions
diff --git a/documentation/components/components-features.asciidoc b/documentation/components/components-features.asciidoc deleted file mode 100644 index 9374b93bc1..0000000000 --- a/documentation/components/components-features.asciidoc +++ /dev/null @@ -1,757 +0,0 @@ ---- -title: Common Component Features -order: 3 -layout: page ---- - -[[components.features]] -= Common Component Features - -The component base classes and interfaces provide a large number of features. -Let us look at some of the most commonly needed features. Features not -documented here can be found from the Java API Reference. - -The interface defines a number of properties, which you can retrieve or -manipulate with the corresponding setters and getters. - -[[components.features.caption]] -== Caption - -((("caption property"))) -((("Component interface", "caption"))) -A caption is an explanatory textual label accompanying a user interface -component, usually shown above, left of, or inside the component. The contents -of a caption are automatically quoted, so no raw HTML can be rendered in a -caption. - -The caption text can usually be given as the first parameter of a constructor of -a component or with [methodname]#setCaption()#. - - -[source, java] ----- -// New text field with caption "Name" -TextField name = new TextField("Name"); -layout.addComponent(name); ----- - -The caption of a component is, by default, managed and displayed by the layout -component or component container inside which the component is placed. For -example, the [classname]#VerticalLayout# component shows the captions -left-aligned above the contained components, while the [classname]#FormLayout# -component shows the captions on the left side of the vertically laid components, -with the captions and their associated components left-aligned in their own -columns. The [classname]#CustomComponent# does not manage the caption of its -composition root, so if the root component has a caption, it will not be -rendered. - -[[figure.components.features.caption.layoutmanaged]] -.Caption Management by [classname]#VerticalLayout# and [classname]#FormLayout#. -image::img/features-caption-layoutmanaged.png[] - -Some components, such as [classname]#Button# and [classname]#Panel#, manage the -caption themselves and display it inside the component. - -Icon (see <<components.features.icon>>) is closely related to caption and is -usually displayed horizontally before or after it, depending on the component -and the containing layout. Also the required indicator in field components is -usually shown before or after the caption. - -An alternative way to implement a caption is to use another component as the -caption, typically a [classname]#Label#, a [classname]#TextField#, or a -[classname]#Panel#. A [classname]#Label#, for example, allows highlighting a -shortcut key with HTML markup or to bind the caption to a data source. The -[classname]#Panel# provides an easy way to add both a caption and a border -around a component. - -=== CSS Style Rules - - -[source, css] ----- -.v-caption {} - .v-captiontext {} - .v-caption-clearelem {} - .v-required-field-indicator {} ----- - -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 -[literal]#++v-required-field-indicator++# style. - - - -[[components.features.description]] -== Description and Tooltips - -((("description property"))) -((("Component interface", "description"))) -((("tooltips"))) -All components (that inherit [classname]#AbstractComponent#) have a description -separate from their caption. The description is usually shown as a tooltip that -appears when the mouse pointer hovers over the component for a short time. - -You can set the description with [methodname]#setDescription()# and retrieve -with [methodname]#getDescription()#. - - -[source, java] ----- -Button button = new Button("A Button"); -button.setDescription("This is the tooltip"); ----- - -The tooltip is shown in <<figure.components.tooltip.plain>>. - -[[figure.components.tooltip.plain]] -.Component Description as a Tooltip -image::img/tooltip-plain-withpointer-hi.png[] - -A description is rendered as a tooltip in most components. - -When a component error has been set with [methodname]#setComponentError()#, the -error is usually also displayed in the tooltip, below the description. -Components that are in error state will also display the error indicator. See -<<dummy/../../../framework/application/application-errors#application.errors.error-indicator,"Error -Indicator and Message">>. - -The description is actually not plain text, but you can use HTML tags to format -it. Such a rich text description can contain any HTML elements, including -images. - - -[source, java] ----- -button.setDescription( - "<h2><img src=\"../VAADIN/themes/sampler/icons/comment_yellow.gif\"/>"+ - "A richtext tooltip</h2>"+ - "<ul>"+ - " <li>Use rich formatting with HTML</li>"+ - " <li>Include images from themes</li>"+ - " <li>etc.</li>"+ - "</ul>"); ----- -See the http://demo.vaadin.com/book-examples-vaadin7/book#component.features.description.richtext[on-line example, window="_blank"]. - -The result is shown in <<figure.components.tooltip.richtext>>. - -[[figure.components.tooltip.richtext]] -.A Rich Text Tooltip -image::img/tooltip-richtext-withpointer-hi.png[] - -Notice that the setter and getter are defined for all fields in the -[classname]#Field# interface, not for all components in the -[classname]#Component# interface. - - -[[components.features.enabled]] -== Enabled - -((("enabled property"))) -((("Component interface", "enabled"))) -The __enabled__ property controls whether the user can actually use the -component. A disabled component is visible, but grayed to indicate the disabled -state. - -Components are always enabled by default. You can disable a component with -[methodname]#setEnabled(false)#. - - -[source, java] ----- -Button enabled = new Button("Enabled"); -enabled.setEnabled(true); // The default -layout.addComponent(enabled); - -Button disabled = new Button("Disabled"); -disabled.setEnabled(false); -layout.addComponent(disabled); ----- - -<<figure.components.features.enabled.simple>> shows the enabled and disabled -buttons. - -[[figure.components.features.enabled.simple]] -.An Enabled and Disabled [classname]#Button# -image::img/features-enabled-simple.png[] - -A disabled component is automatically put in read-only state. No client -interaction with such a component is sent to the server and, as an important -security feature, the server-side components do not receive state updates from -the client in the read-only state. This feature exists in all built-in -components in Vaadin and is automatically handled for all [classname]#Field# -components for the field property value. For custom widgets, you need to make -sure that the read-only state is checked on the server-side for all -safety-critical variables. - -=== CSS Style Rules - -Disabled components have the [literal]#++v-disabled++# CSS style in addition to -the component-specific style. To match a component with both the styles, you -have to join the style class names with a dot as done in the example below. - - -[source, css] ----- -.v-textfield.v-disabled { - border: dotted; -} ----- - -This would make the border of all disabled text fields dotted. - - -//TODO This may change to -$v-button-disabled-opacity -In Valo theme, the opacity of disabled components is specified with the -$v-disabled-opacity parameter - -ifdef::web[] -, as described in -<<dummy/../../../framework/themes/themes-valo#themes.valo.variables,"Common -Settings">> -endif::web[] -. - - -[[components.features.icon]] -== Icon - -((("icon property"))) -((("Component interface", "icon"))) -An icon is an explanatory graphical label accompanying a user interface -component, usually shown above, left of, or inside the component. Icon is -closely related to caption (see <<components.features.caption>>) and is usually -displayed horizontally before or after it, depending on the component and the -containing layout. - -The icon of a component can be set with the [methodname]#setIcon()# method. The -image is provided as a resource, perhaps most typically a -[classname]#ThemeResource#. - - -[source, java] ----- -// Component with an icon from a custom theme -TextField name = new TextField("Name"); -name.setIcon(new ThemeResource("icons/user.png")); -layout.addComponent(name); - -// Component with an icon from another theme ('runo') -Button ok = new Button("OK"); -ok.setIcon(new ThemeResource("../runo/icons/16/ok.png")); -layout.addComponent(ok); ----- - -The icon of a component is, by default, managed and displayed by the layout -component or component container in which the component is placed. For example, -the [classname]#VerticalLayout# component shows the icons left-aligned above the -contained components, while the [classname]#FormLayout# component shows the -icons on the left side of the vertically laid components, with the icons and -their associated components left-aligned in their own columns. The -[classname]#CustomComponent# does not manage the icon of its composition root, -so if the root component has an icon, it will not be rendered. - -[[figure.components.features.icon]] -.Displaying an Icon from a Theme Resource. -image::img/features-icon.png[] - -Some components, such as [classname]#Button# and [classname]#Panel#, manage the -icon themselves and display it inside the component. - -In addition to image resources, you can use __font icons__, which are icons -included in special fonts, but which are handled as special resources. See -<<dummy/../../../framework/themes/themes-fonticon#themes.fonticon,"Font Icons">> -for more details. - -=== CSS Style Rules - -An icon will be rendered inside an HTML element that has the -[literal]#++v-icon++# CSS style class. The containing layout may enclose an icon -and a caption inside elements related to the caption, such as -[literal]#++v-caption++#. - - - -[[components.features.locale]] -== Locale - -((("locale property", "in [classname]#Component#"))) -((("Component interface", "locale"))) -The locale property defines the country and language used in a component. You -can use the locale information in conjunction with an internationalization -scheme to acquire localized resources. Some components, such as -[classname]#DateField#, use the locale for component localization. - -You can set the locale of a component (or the application) with -[methodname]#setLocale()# as follows: - - -[source, java] ----- -// Component for which the locale is meaningful -InlineDateField date = new InlineDateField("Datum"); - -// German language specified with ISO 639-1 language -// code and ISO 3166-1 alpha-2 country code. -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>>. - -[[figure.components.features.locale.simple]] -.Set Locale for [classname]#InlineDateField# -image::img/features-locale-simple.png[] - -ifdef::web[] -[[components.features.locale.get]] -=== Getting the Locale - -((("[methodname]#getLocale()#"))) -You can get the locale of a component with [methodname]#getLocale()#. If the -locale is undefined for a component, that is, not explicitly set, the locale of -the parent component is used. If none of the parent components have a locale -set, the locale of the UI is used, and if that is not set, the default system -locale is set, as given by [methodname]#Locale.getDefault()#. - -The [methodname]#getLocale()# returns null if the component is not yet attached -to the UI, which is usually the case in most constructors, so it is a bit -awkward to use it for internationalization. You can get the locale in -[methodname]#attach()#, as shown in the following example: - - -[source, java] ----- -Button cancel = new Button() { - @Override - public void attach() { - super.attach(); - ResourceBundle bundle = ResourceBundle.getBundle( - MyAppCaptions.class.getName(), getLocale()); - setCaption(bundle.getString(MyAppCaptions.CancelKey)); - } -}; -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. - - -[source, java] ----- -// Captions are stored in MyAppCaptions resource bundle -// and the UI object is known in this context. -ResourceBundle bundle = - ResourceBundle.getBundle(MyAppCaptions.class.getName(), - UI.getCurrent().getLocale()); - -// Get a localized resource from the bundle -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. -final ComboBox select = new ComboBox("Select a language") { - @Override - public void attach() { - super.attach(); - setValue(getLocale()); - } -}; -for (int i=0; i<locales.length; i++) { - select.addItem(locales[i]); - select.setItemCaption(locales[i], - locales[i].getDisplayName(displayLocale)); - - // Automatically select the current locale - if (locales[i].equals(getLocale())) - select.setValue(locales[i]); -} -layout.addComponent(select); - -// Locale code of the selected locale -final Label localeCode = new Label(""); -layout.addComponent(localeCode); - -// A date field which language the selection will change -final InlineDateField date = - new InlineDateField("Calendar in the selected language"); -date.setResolution(Resolution.DAY); -layout.addComponent(date); - -// Handle language selection -select.addValueChangeListener(new Property.ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - Locale locale = (Locale) select.getValue(); - date.setLocale(locale); - localeCode.setValue("Locale code: " + - locale.getLanguage() + "_" + - locale.getCountry()); - } -}); -select.setImmediate(true); ----- -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[] - - -[[components.features.readonly]] -== Read-Only - -((("read-only property"))) -((("Component interface", "read-only"))) -The property defines whether the value of a component can be changed. The -property is mainly applicable to [classname]#Field# components, as they have a -value that can be edited by the user. - - -[source, java] ----- -TextField readwrite = new TextField("Read-Write"); -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 -<<figure.components.features.readonly.simple>>. - -[[figure.components.features.readonly.simple]] -.A Read-Only Component. -image::img/features-readonly-simple.png[] - -Setting a layout or some other component container as read-only does not usually -make the contained components read-only recursively. This is different from, for -example, the disabled state, which is usually applied recursively. - -Notice that the value of a selection component is the selection, not its items. -A read-only selection component doesn't therefore allow its selection to be -changed, but other changes are possible. For example, if you have a read-only -[classname]#Table# in editable mode, its contained fields and the underlying -data model can still be edited, and the user could sort it or reorder the -columns. - -Client-side state modifications will not be communicated to the server-side and, -more importantly, server-side field components will not accept changes to the -value of a read-only [classname]#Field# component. The latter is an important -security feature, because a malicious user can not fabricate state changes in a -read-only field. This is handled at the level of [classname]#AbstractField# in -[methodname]#setValue()#, so you can not change the value programmatically -either. Calling [methodname]#setValue()# on a read-only field results in -[classname]#Property.ReadOnlyException#. - -Also notice that while the read-only status applies automatically to the -property value of a field, it does not apply to other component variables. A -read-only component can accept some other variable changes from the client-side -and some of such changes could be acceptable, such as change in the scroll bar -position of a [classname]#Table#. Custom widgets should check the read-only -state for variables bound to business -data.//// -TODO: Note this also in the Advanced: Security section and possibly also in the -GWT -chapter. -//// - -=== CSS Style Rules - -Setting a normally editable component to read-only state can change its -appearance to disallow editing the value. In addition to CSS styling, also the -HTML structure can change. For example, [classname]#TextField# loses the edit -box and appears much like a [classname]#Label#. - -A read-only component will have the [literal]#++v-readonly++# style. The -following CSS rule would make the text in all read-only [classname]#TextField# -components appear in italic. - - -[source, css] ----- -.v-textfield.v-readonly { - font-style: italic; -} ----- - - - -[[components.features.stylename]] -== Style Name - -((("style name property"))) -((("Component interface", "style name"))) -The __style name__ property defines one or more custom CSS style class names for -the component. The [methodname]#getStyleName()# returns the current style names -as a space-separated list. The [methodname]#setStyleName()# replaces all the -styles with the given style name or a space-separated list of style names. You -can also add and remove individual style names with [methodname]#addStylename()# -and [methodname]#removeStyleName()#. A style name must be a valid CSS style -name. - - -[source, java] ----- -Label label = new Label("This text has a lot of style"); -label.addStyleName("mystyle"); -layout.addComponent(label); ----- - -The style name will appear in the component's HTML element in two forms: -literally as given and prefixed with the component-specific style name. For -example, if you add a style name [literal]#++mystyle++# to a -[classname]#Button#, the component would get both [literal]#++mystyle++# and -[literal]#++v-button-mystyle++# styles. Neither form may conflict with built-in -style names of Vaadin. For example, [literal]#++focus++# style would conflict -with a built-in style of the same name, and an [literal]#++content++# style for -a [classname]#Panel# component would conflict with the built-in -[literal]#++v-panel-content++# style. - -The following CSS rule would apply the style to any component that has the -[literal]#++mystyle++# style. - - -[source, css] ----- -.mystyle { - font-family: fantasy; - font-style: italic; - font-size: 25px; - font-weight: bolder; - line-height: 30px; -} ----- - -The resulting styled component is shown in -<<figure.components.features.stylename>> - -[[figure.components.features.stylename]] -.Component with a Custom Style -image::img/features-stylename-simple.png[] - - -[[components.features.visible]] -== Visible - -((("visible property"))) -((("Component interface", "visible"))) -Components can be hidden by setting the __visible__ property to __false__. Also -the caption, icon and any other component features are made hidden. Hidden -components are not just invisible, but their content is not communicated to the -browser at all. That is, they are not made invisible cosmetically with only CSS -rules. This feature is important for security if you have components that -contain security-critical information that must only be shown in specific -application states. - - -[source, java] ----- -TextField invisible = new TextField("No-see-um"); -invisible.setValue("You can't see this!"); -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[] - -Beware that invisible beings can leave footprints. The containing layout cell -that holds the invisible component will not go away, but will show in the layout -as extra empty space. Also expand ratios work just like if the component was -visible - it is the layout cell that expands, not the component. - -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. -If the hidden component has undefined size and is enclosed in a layout that also -has undefined size, the containing layout will collapse when the component -disappears. If you want to have the component keep its size, you have to make it -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 - -((("[classname]#Sizeable# interface"))) -Vaadin components are sizeable; not in the sense that they were fairly large or -that the number of the components and their features are sizeable, but in the -sense that you can make them fairly large on the screen if you like, or small or -whatever size. - -The [classname]#Sizeable# interface, shared by all components, provides a number -of manipulation methods and constants for setting the height and width of a -component in absolute or relative units, or for leaving the size undefined. - -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. The available units are listed in -<<components.features.sizeable.units.table>> below. - - -[source, java] ----- -mycomponent.setWidth(100, Sizeable.UNITS_PERCENTAGE); -mycomponent.setWidth(400, Sizeable.UNITS_PIXELS); ----- - -Alternatively, you can speficy the size as a string. The format of such a string -must follow the HTML/CSS standards for specifying measures. - - -[source, java] ----- -mycomponent.setWidth("100%"); -mycomponent.setHeight("400px"); ----- - -The " [literal]#++100%++#" percentage value makes the component take all -available size in the particular direction (see the description of -[parameter]#Sizeable.UNITS_PERCENTAGE# in the table below). You can also use the -shorthand method [methodname]#setSizeFull()# to set the size to 100% in both -directions. - -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 or width as undefined with -[parameter]#Sizeable.SIZE_UNDEFINED# parameter for [methodname]#setWidth()# and -[methodname]#setHeight()#. - -You always need to keep in mind that __a layout with undefined size may not -contain components with defined relative size__, such as "full size". See -<<dummy/../../../framework/layout/layout-settings#layout.settings.size,"Layout -Size">> for details. - -The <<components.features.sizeable.units.table>> lists the available units and -their codes defined in the [classname]#Sizeable# interface. - -[[components.features.sizeable.units.table]] -.Size Units - -|=============== -|[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. - -|=============== - - - -If a component inside [classname]#HorizontalLayout# or -[classname]#VerticalLayout# has full size in the namesake direction of the -layout, the component will expand to take all available space not needed by the -other components. See -<<dummy/../../../framework/layout/layout-settings#layout.settings.size,"Layout -Size">> for details. - - -== Managing Input Focus - -When the user clicks on a component, the component gets the __input focus__, -which is indicated by highlighting according to style definitions. If the -component allows inputting text, the focus and insertion point are indicated by -a cursor. Pressing the Tab key moves the focus to the component next in the -__focus order__. - -Focusing is supported by all [classname]#Field# components and also by -[classname]#Upload#. - -The focus order or __tab index__ of a component is defined as a positive integer -value, which you can set with [methodname]#setTabIndex()# and get with -[methodname]#getTabIndex()#. The tab index is managed in the context of the page -in which the components are contained. The focus order can therefore jump -between two any lower-level component containers, such as sub-windows or panels. - -The default focus order is determined by the natural hierarchical order of -components in the order in which they were added under their parents. The -default tab index is 0 (zero). - -Giving a negative integer as the tab index removes the component from the focus -order entirely. - -=== CSS Style Rules - -The component having the focus will have an additional style class with the -[literal]#++-focus++# suffix. For example, a [classname]#TextField#, which -normally has the [literal]#++v-textfield++# style, would additionally have the -[literal]#++v-textfield-focus++# style. - -For example, the following would make a text field blue when it has focus. - - -[source, css] ----- -.v-textfield-focus { - background: lightblue; -} ----- - - - - - |