You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TreeBasicFeatures.java 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package com.vaadin.tests.components.tree;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.stream.Stream;
  5. import com.vaadin.annotations.Theme;
  6. import com.vaadin.annotations.Widgetset;
  7. import com.vaadin.data.TreeData;
  8. import com.vaadin.data.provider.TreeDataProvider;
  9. import com.vaadin.icons.VaadinIcons;
  10. import com.vaadin.server.ClassResource;
  11. import com.vaadin.server.ThemeResource;
  12. import com.vaadin.server.VaadinRequest;
  13. import com.vaadin.shared.Registration;
  14. import com.vaadin.shared.ui.ContentMode;
  15. import com.vaadin.tests.components.AbstractTestUIWithLog;
  16. import com.vaadin.tests.data.bean.HierarchicalTestBean;
  17. import com.vaadin.ui.Component;
  18. import com.vaadin.ui.Grid.SelectionMode;
  19. import com.vaadin.ui.IconGenerator;
  20. import com.vaadin.ui.MenuBar;
  21. import com.vaadin.ui.MenuBar.Command;
  22. import com.vaadin.ui.MenuBar.MenuItem;
  23. import com.vaadin.ui.Tree;
  24. import com.vaadin.ui.VerticalLayout;
  25. @Theme("tests-valo-disabled-animations")
  26. @Widgetset("com.vaadin.DefaultWidgetSet")
  27. public class TreeBasicFeatures extends AbstractTestUIWithLog {
  28. public static final double[] ROW_HEIGHTS = { 35.5d, 72.78d };
  29. private Tree<HierarchicalTestBean> tree;
  30. private TreeDataProvider<HierarchicalTestBean> inMemoryDataProvider;
  31. private IconGenerator<HierarchicalTestBean> iconGenerator = i -> {
  32. switch (i.getDepth()) {
  33. case 0:
  34. return new ThemeResource("../reindeer/common/icons/bullet.png");
  35. case 1:
  36. return VaadinIcons.FLIGHT_TAKEOFF;
  37. case 2:
  38. return new ClassResource("/com/vaadin/tests/m.gif");
  39. default:
  40. return null;
  41. }
  42. };
  43. @Override
  44. protected void setup(VaadinRequest request) {
  45. VerticalLayout layout = new VerticalLayout();
  46. tree = new Tree<>();
  47. setupDataProvider();
  48. tree.setDataProvider(inMemoryDataProvider);
  49. tree.addSelectionListener(
  50. event -> log("SelectionEvent: " + event.getAllSelectedItems()));
  51. tree.addExpandListener(
  52. event -> log("ExpandEvent: " + event.getExpandedItem()));
  53. tree.addCollapseListener(
  54. event -> log("ExpandEvent: " + event.getCollapsedItem()));
  55. layout.addComponents(createMenu(), tree);
  56. addComponent(layout);
  57. }
  58. private Component createMenu() {
  59. MenuBar menu = new MenuBar();
  60. menu.setErrorHandler(error -> log("Exception occurred, "
  61. + error.getThrowable().getClass().getName() + ": "
  62. + error.getThrowable().getMessage()));
  63. MenuItem componentMenu = menu.addItem("Component", null);
  64. createIconMenu(componentMenu.addItem("Icons", null));
  65. createCaptionMenu(componentMenu.addItem("Captions", null));
  66. createDescriptionMenu(componentMenu.addItem("Descriptions", null));
  67. createContentModeMenu(componentMenu.addItem("ContentMode", null));
  68. createSelectionModeMenu(componentMenu.addItem("Selection Mode", null));
  69. createRowHeightMenu(componentMenu.addItem("Row Height", null));
  70. componentMenu.addItem("Item Click Listener", new Command() {
  71. private Registration registration;
  72. @Override
  73. public void menuSelected(MenuItem selectedItem) {
  74. removeRegistration();
  75. if (selectedItem.isChecked()) {
  76. registration = tree.addItemClickListener(
  77. event -> log("ItemClick: " + event.getItem()));
  78. }
  79. }
  80. private void removeRegistration() {
  81. if (registration != null) {
  82. registration.remove();
  83. registration = null;
  84. }
  85. }
  86. }).setCheckable(true);
  87. MenuItem collapseAllowed = componentMenu.addItem("Collapse Allowed",
  88. menuItem -> tree.setItemCollapseAllowedProvider(
  89. t -> menuItem.isChecked()));
  90. collapseAllowed.setCheckable(true);
  91. // Simulate the first click
  92. collapseAllowed.setChecked(true);
  93. collapseAllowed.getCommand().menuSelected(collapseAllowed);
  94. componentMenu
  95. .addItem("Style Generator",
  96. menuItem -> tree.setStyleGenerator(menuItem.isChecked()
  97. ? t -> "level" + t.getDepth()
  98. : t -> null))
  99. .setCheckable(true);
  100. MenuItem enabled = componentMenu.addItem("Enabled",
  101. menuItem -> tree.setEnabled(!tree.isEnabled()));
  102. enabled.setCheckable(true);
  103. enabled.setChecked(true);
  104. componentMenu.addItem("Expand 0 | 0",
  105. menuItem -> tree.expand(new HierarchicalTestBean(null, 0, 0)));
  106. componentMenu.addItem("Collapse 0 | 0", menuItem -> tree
  107. .collapse(new HierarchicalTestBean(null, 0, 0)));
  108. return menu;
  109. }
  110. private void createRowHeightMenu(MenuItem rowHeightMenu) {
  111. Stream.concat(Stream.of(-1d), Arrays.stream(ROW_HEIGHTS).boxed())
  112. .forEach(height -> rowHeightMenu.addItem(String.valueOf(height),
  113. item -> tree.setRowHeight(height)));
  114. }
  115. private void createSelectionModeMenu(MenuItem modeMenu) {
  116. for (SelectionMode mode : SelectionMode.values()) {
  117. modeMenu.addItem(mode.name(), item -> tree.setSelectionMode(mode));
  118. }
  119. }
  120. private void createCaptionMenu(MenuItem captionMenu) {
  121. captionMenu.addItem("String.valueOf", menu -> {
  122. tree.setItemCaptionGenerator(String::valueOf);
  123. tree.setContentMode(ContentMode.TEXT);
  124. });
  125. captionMenu.addItem("Custom caption", menu -> {
  126. tree.setItemCaptionGenerator(i -> "Id: " + i.getId() + "\nDepth: "
  127. + i.getDepth() + ", Index: " + i.getIndex());
  128. tree.setContentMode(ContentMode.PREFORMATTED);
  129. });
  130. captionMenu.addItem("HTML caption", menu -> {
  131. tree.setItemCaptionGenerator(
  132. i -> "Id: " + i.getId() + "<br/>Depth: " + i.getDepth()
  133. + "<br/>Index: " + i.getIndex());
  134. tree.setContentMode(ContentMode.HTML);
  135. });
  136. }
  137. private void createDescriptionMenu(MenuItem descriptionMenu) {
  138. descriptionMenu.addItem("No Description",
  139. menu -> tree.setItemDescriptionGenerator(t -> null));
  140. descriptionMenu.addItem("String.valueOf",
  141. menu -> tree.setItemDescriptionGenerator(String::valueOf));
  142. }
  143. private void createContentModeMenu(MenuItem contentModeMenu) {
  144. Arrays.stream(ContentMode.values()).forEach(mode -> contentModeMenu
  145. .addItem(mode.toString(), item -> tree.setContentMode(mode)));
  146. }
  147. private void createIconMenu(MenuItem iconMenu) {
  148. iconMenu.addItem("No icons",
  149. menu -> tree.setItemIconGenerator(t -> null));
  150. iconMenu.addItem("By Depth",
  151. menu -> tree.setItemIconGenerator(iconGenerator));
  152. }
  153. private void setupDataProvider() {
  154. TreeData<HierarchicalTestBean> data = new TreeData<>();
  155. List<Integer> ints = Arrays.asList(0, 1, 2);
  156. ints.stream().forEach(index -> {
  157. HierarchicalTestBean bean = new HierarchicalTestBean(null, 0,
  158. index);
  159. data.addItem(null, bean);
  160. ints.stream().forEach(childIndex -> {
  161. HierarchicalTestBean childBean = new HierarchicalTestBean(
  162. bean.getId(), 1, childIndex);
  163. data.addItem(bean, childBean);
  164. ints.stream()
  165. .forEach(grandChildIndex -> data.addItem(childBean,
  166. new HierarchicalTestBean(childBean.getId(), 2,
  167. grandChildIndex)));
  168. });
  169. });
  170. inMemoryDataProvider = new TreeDataProvider<>(data);
  171. }
  172. }