diff options
author | Ilia Motornyi <elmot@vaadin.com> | 2017-05-04 09:00:14 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-04 09:00:14 +0300 |
commit | bb358e50ddd19a8de6e495a0b58a5244ceed6440 (patch) | |
tree | 0c8430835bce92e55b6968f880b9875a7d279578 /documentation | |
parent | 0a8079a9b87285d73f1d81f3b20d4f5492e4cc99 (diff) | |
download | vaadin-framework-bb358e50ddd19a8de6e495a0b58a5244ceed6440.tar.gz vaadin-framework-bb358e50ddd19a8de6e495a0b58a5244ceed6440.zip |
Tree documentation
Diffstat (limited to 'documentation')
-rw-r--r-- | documentation/components/chapter-components.asciidoc | 2 | ||||
-rw-r--r-- | documentation/components/components-customcomponent.asciidoc | 2 | ||||
-rw-r--r-- | documentation/components/components-customfield.asciidoc | 2 | ||||
-rw-r--r-- | documentation/components/components-embedded.asciidoc | 2 | ||||
-rw-r--r-- | documentation/components/components-menubar.asciidoc | 2 | ||||
-rw-r--r-- | documentation/components/components-popupview.asciidoc | 2 | ||||
-rw-r--r-- | documentation/components/components-progressbar.asciidoc | 2 | ||||
-rw-r--r-- | documentation/components/components-slider.asciidoc | 2 | ||||
-rw-r--r-- | documentation/components/components-tree.asciidoc | 211 | ||||
-rw-r--r-- | documentation/components/components-upload.asciidoc | 2 | ||||
-rw-r--r-- | documentation/datamodel/datamodel-hierarchical.asciidoc | 6 | ||||
-rw-r--r-- | documentation/img/tree-basic.png | bin | 0 -> 4397 bytes |
12 files changed, 225 insertions, 10 deletions
diff --git a/documentation/components/chapter-components.asciidoc b/documentation/components/chapter-components.asciidoc index e1093ba03e..e53752f26c 100644 --- a/documentation/components/chapter-components.asciidoc +++ b/documentation/components/chapter-components.asciidoc @@ -48,6 +48,8 @@ include::components-grid.asciidoc[leveloffset=+2] include::components-treegrid.asciidoc[leveloffset=+2] +include::components-tree.asciidoc[leveloffset=+2] + include::components-menubar.asciidoc[leveloffset=+2] include::components-upload.asciidoc[leveloffset=+2] diff --git a/documentation/components/components-customcomponent.asciidoc b/documentation/components/components-customcomponent.asciidoc index 01679a3f9b..cf898ebf17 100644 --- a/documentation/components/components-customcomponent.asciidoc +++ b/documentation/components/components-customcomponent.asciidoc @@ -1,6 +1,6 @@ --- title: Composition with Composite and CustomComponent -order: 32 +order: 33 layout: page --- diff --git a/documentation/components/components-customfield.asciidoc b/documentation/components/components-customfield.asciidoc index a369f390a2..95f949da01 100644 --- a/documentation/components/components-customfield.asciidoc +++ b/documentation/components/components-customfield.asciidoc @@ -1,6 +1,6 @@ --- title: Composite Fields with CustomField -order: 33 +order: 34 layout: page --- diff --git a/documentation/components/components-embedded.asciidoc b/documentation/components/components-embedded.asciidoc index 84a7971500..1c1a6c90ae 100644 --- a/documentation/components/components-embedded.asciidoc +++ b/documentation/components/components-embedded.asciidoc @@ -1,6 +1,6 @@ --- title: Embedded Resources -order: 34 +order: 35 layout: page --- diff --git a/documentation/components/components-menubar.asciidoc b/documentation/components/components-menubar.asciidoc index 0c54196b87..a2c22b6b75 100644 --- a/documentation/components/components-menubar.asciidoc +++ b/documentation/components/components-menubar.asciidoc @@ -1,6 +1,6 @@ --- title: MenuBar -order: 26 +order: 27 layout: page --- diff --git a/documentation/components/components-popupview.asciidoc b/documentation/components/components-popupview.asciidoc index bc58fe6b19..c16411f420 100644 --- a/documentation/components/components-popupview.asciidoc +++ b/documentation/components/components-popupview.asciidoc @@ -1,6 +1,6 @@ --- title: PopupView -order: 30 +order: 31 layout: page --- diff --git a/documentation/components/components-progressbar.asciidoc b/documentation/components/components-progressbar.asciidoc index b6337ff3ad..54940799b3 100644 --- a/documentation/components/components-progressbar.asciidoc +++ b/documentation/components/components-progressbar.asciidoc @@ -1,6 +1,6 @@ --- title: ProgressBar -order: 28 +order: 29 layout: page --- diff --git a/documentation/components/components-slider.asciidoc b/documentation/components/components-slider.asciidoc index 7ae972ae77..a35b60b668 100644 --- a/documentation/components/components-slider.asciidoc +++ b/documentation/components/components-slider.asciidoc @@ -1,6 +1,6 @@ --- title: Slider -order: 29 +order: 30 layout: page --- diff --git a/documentation/components/components-tree.asciidoc b/documentation/components/components-tree.asciidoc new file mode 100644 index 0000000000..dd957a0308 --- /dev/null +++ b/documentation/components/components-tree.asciidoc @@ -0,0 +1,211 @@ +--- +title: Tree +order: 26 +layout: page +--- + +[[components.tree]] += Tree + +ifdef::web[] +[.sampler] +image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/grids-and-trees/tree"] +endif::web[] + +IMPORTANT: The [classname]#Tree# component is currently being developed and only available in the Framework 8.1 prerelease versions, starting from 8.1.0.beta1. + +[[components.tree.overview]] +== Overview + +The [classname]#Tree# component allows a natural way to represent data that has hierarchical relationships. +The user can drill down in the hierarchy by expanding items by clicking on the expand arrow, and likewise collapse items. +[classname]#Tree# is a selection component that allows selecting items. +It also supports drag and drop, so you can drag items to and from a tree, and drop them in the hierarchy. + +A typical use of the [classname]#Tree# component is for displaying a hierarchical menu, as illustrated in <<figure.components.tree>>, or for displaying file systems or hierarchical datasets. + +[[figure.components.tree]] +.A [classname]#Tree# component +image::img/tree-basic.png[width=70%, scaledwidth=100%] + +[[components.tree.data]] +== Binding to Data + +[classname]#Tree# is used by binding it to a hierarchical data provider. The data provider can be based on in-memory or back end data. For in-memory data, the [classname]#InMemoryHierarchicalDataProvider# can be used, and for loading data from a back end, you need to implement three methods from the [interfacename]#HierarchicalDataProvider# interface. Usage of both data providers is described in +<<dummy/../../../framework/datamodel/datamodel-hierarchical.asciidoc#datamodel.hierarchical,"Hierarchical Data">>. + + +The [classname]#HierarchyData# class can be used to build the hierarchical data structure, +and it can then be passed on to [classname]#InMemoryHierarchicalDataProvider#. It is simply a hierarchical +collection, that the data provider uses to populate the [classname]#Tree#. + +The [methodname]#setItems# method in [classname]#Tree# can be used to set the root level items. Internally +an [classname]#InMemoryHierarchicalDataProvider# with [classname]#HierarchyData# is used. + +[source, java] +---- +// An initial planet tree +Tree<String> tree = new Tree<>(); +HierarchyData<String> hierarchyData = new HierarchyData<>(); + +// Couple of childless root items +hierarchyData.addItem(null,"Mercury"); +hierarchyData.addItem(null,"Venus"); + +// Items with hierarchy +hierarchyData.addItem(null,"Earth"); +hierarchyData.addItem("Earth","The Moon"); + +inMemoryDataProvider = new InMemoryHierarchicalDataProvider<>(hierarchyData); +tree.setDataProvider(inMemoryDataProvider); +tree.expand("Earth"); // Expand programmatically +---- + +If at any time you want to modify +the in-memory data in the tree, you may do it as follows: + +[source, java] +---- +// Add Mars with satellites +hierarchyData.addItem(null, "Mars"); +hierarchyData.addItem("Mars", "Phobos"); +hierarchyData.addItem("Mars", "Deimos"); +inMemoryDataProvider.refreshAll(); + +---- + + +The result was shown in <<figure.components.tree>>. + +The caption and the icon of tree items is generated by the [classname]#ItemCaptionGenerator# and the +[classname]#IconGenerator#, set with [methodname]#setItemCaptionGenerator()# and [methodname]#setItemIconGenerator()# respectively. + +[[components.tree.selection]] +== Handling Selection and Clicks + +[classname]#Tree# supports single selection mode, you can use [methodname]#asSingleSelect()# to access the selection +object, which supports selection listeners and data binding. For more details, see link:<<dummy/../../../framework/datamodel/datamodel-selection.asciidoc#datamodel.selection,"Selecting Items">>. +The [classname]#Tree# also supports the shortcut method [methodname]#addSelectionListener()#. + +//// +todo not implemented yet. +[classname]#Tree# also emits [classname]##ItemClickEvent##s when items are clicked. +This way you can handle item clicks also when selection is not enabled or you want special user interaction specifically on clicks. + + +[source, Java] +---- +tree.addItemClickListener( + new ItemClickEvent.ItemClickListener() { + public void itemClick(ItemClickEvent event) { + // Pick only left mouse clicks + if (event.getButton() == ItemClickEvent.BUTTON_LEFT) + Notification.show("Left click", + Notification.Type.HUMANIZED_MESSAGE); + } + }); +---- +//// + +[[components.tree.expandcollapse]] +== Expanding and Collapsing Nodes + +[classname]#Tree# nodes that have children can be expanded and collapsed by either user interaction or through the server-side API: + +[source, java] +---- +// Expands a child project. If the child project is not yet +// in the visible hierarchy, nothing will be shown. +tree.expand(childProject); +// Expands the root project. If child project now becomes +// visible it is also expanded into view. +tree.expand(rootProject); +// Collapses the child project. +tree.collapse(childProject); +---- + +To use the server-side API with a backend data provider the [methodname]#hashCode# and [methodname]#equals# methods for the node's type must be implemented so that when the desired node is retrieved from the backend it can be correctly matched with the object passed to either [methodname]#expand# or [methodname]#collapse#. + +The [classname]#Tree# component supports listening to the expansion and collapsing of items in its hierarchy. +The expand and collapse listeners can be added as follows: + +[source, java] +---- +tree.addExpandListener(event -> log("Item expanded: " + event.getExpandedItem())); +tree.addCollapseListener(event -> log("Item collapsed: " + event.getCollapsedItem())); +---- + +The return types of the methods `getExpandedItem` and `getCollapsedItem` are the same as the type of the [classname]#Tree# the events originated from. +Note that collapse listeners will not be triggered for any expanded subtrees of the collapsed item. + +//// +todo not implemented yet +[[components.tree.node.collapsing]] +== Prevent Node Collapsing + +[classname]#Tree# supports setting a callback method that can allow or prevent the user from collapsing an expanded node. +It can be set with [methodname]#setItemCollapseAllowedProvider# method, that takes a [interfacename]#SerializablePredicate#. +For nodes that cannot be collapsed, the [literal]#++collapse-disabled++# class name is applied to the expansion element + +Avoid doing any heavy operations in the method, since it is called for each item when it is being sent to the client. + +Example using a predefined set of persons that can not be collapsed: +[source, java] +---- +Set<Person> alwaysExpanded; +personTree.setItemCollapseAllowedProvider(person -> + !alwaysExpanded.contains(person)); +---- +//// + +[[components.treegrid.keyboard]] +== Keyboard Navigation and Focus Handling in TreeGrid + +The user can navigate through rows with kbd:[Up] and kbd:[Down], collapse rows with kbd:[Left], +and expand them with kbd:[Right]. + +//// +todo styling documentation +[[components.tree.css]] +== CSS Style Rules + +[source, css] +---- +.v-tree {} + .v-tree-node {} /* A node (item) */ + .v-tree-node-caption {} /* Caption of the node */ + .v-tree-node-children {} /* Contains child nodes */ + .v-tree-node-root {} /* If node is a root node */ + .v-tree-node-leaf {} /* If node has no children */ +---- + +[[components.tree.css.itemstyles]] +=== Generating Item Styles + +You can style each tree item individually by generating a style name for them with a [interfacename]#Tree.ItemStyleGenerator#, which you assign to a tree with [methodname]#setItemStyleGenerator()#. +The generator should return a style name for each item or `null`. + +[source, Java] +---- +// Show all leaf nodes as disabled +tree.setItemStyleGenerator(new Tree.ItemStyleGenerator() { + @Override + public String getStyle(Tree source, Object itemId) { + if (! tree.hasChildren(itemId)) + return "disabled"; + return null; + } +}); +---- + +The style names are prefixed with `v-tree-node-caption-`. +You could thereby define the item styling as follows: + +[source, CSS] +---- +.v-tree-node-caption-disabled { + color: graytext; + font-style: italic; +} +---- +////
\ No newline at end of file diff --git a/documentation/components/components-upload.asciidoc b/documentation/components/components-upload.asciidoc index cde631d148..cb26663c7b 100644 --- a/documentation/components/components-upload.asciidoc +++ b/documentation/components/components-upload.asciidoc @@ -1,6 +1,6 @@ --- title: Upload -order: 27 +order: 28 layout: page --- diff --git a/documentation/datamodel/datamodel-hierarchical.asciidoc b/documentation/datamodel/datamodel-hierarchical.asciidoc index 24d023acd9..735317c519 100644 --- a/documentation/datamodel/datamodel-hierarchical.asciidoc +++ b/documentation/datamodel/datamodel-hierarchical.asciidoc @@ -9,9 +9,11 @@ layout: page IMPORTANT: The [interfacename]#HierarchicalDataProvider# is currently being developed and only available in the Framework 8.1 prerelease versions, starting from 8.1.0.alpha1. -The [classname]#TreeGrid# component allows you to show data with hierarchical relationships between items. +The [classname]#Tree# and the [classname]#TreeGrid# components allow you to show data with hierarchical relationships between items. That data can be populated by on-demand from a back end by implementing the [interfacename]#HierarchicalDataProvider# interface. If you have the data available in-memory on the server, -you use the collection style API of [classname]#HierarchyData# and then pass it to a [classname]#InMemoryHierarchicalDataProvider#. This chapter introduces the hierarchical data providers and how they work. For using them with the [classname]#TreeGrid# component you should see <<dummy/../../../framework/components/components-treegrid.asciidoc#components.treegrid,"its documentation">>. +you use the collection style API of [classname]#HierarchyData# and then pass it to a [classname]#InMemoryHierarchicalDataProvider#. This chapter introduces the hierarchical data providers and how they work. +For using them with the components you should see <<dummy/../../../framework/components/components-tree.asciidoc#components.tree,"Tree">> +and <<dummy/../../../framework/components/components-treegrid.asciidoc#components.treegrid,"TreeGrid">> documentation. == In-memory Hierarchical Data diff --git a/documentation/img/tree-basic.png b/documentation/img/tree-basic.png Binary files differnew file mode 100644 index 0000000000..260dd94413 --- /dev/null +++ b/documentation/img/tree-basic.png |