Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

GridBasics.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package com.vaadin.tests.components.grid.basics;
  2. import java.text.DecimalFormat;
  3. import java.util.HashMap;
  4. import java.util.LinkedHashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.function.Consumer;
  8. import java.util.stream.Stream;
  9. import com.vaadin.annotations.Widgetset;
  10. import com.vaadin.server.VaadinRequest;
  11. import com.vaadin.shared.Registration;
  12. import com.vaadin.shared.ui.grid.HeightMode;
  13. import com.vaadin.tests.components.AbstractTestUIWithLog;
  14. import com.vaadin.ui.Button;
  15. import com.vaadin.ui.Component;
  16. import com.vaadin.ui.Grid;
  17. import com.vaadin.ui.Grid.DetailsGenerator;
  18. import com.vaadin.ui.Label;
  19. import com.vaadin.ui.MenuBar;
  20. import com.vaadin.ui.MenuBar.Command;
  21. import com.vaadin.ui.MenuBar.MenuItem;
  22. import com.vaadin.ui.Notification;
  23. import com.vaadin.ui.Panel;
  24. import com.vaadin.ui.StyleGenerator;
  25. import com.vaadin.ui.VerticalLayout;
  26. import com.vaadin.ui.renderers.DateRenderer;
  27. import com.vaadin.ui.renderers.HtmlRenderer;
  28. import com.vaadin.ui.renderers.NumberRenderer;
  29. import com.vaadin.ui.renderers.ProgressBarRenderer;
  30. @Widgetset("com.vaadin.DefaultWidgetSet")
  31. public class GridBasics extends AbstractTestUIWithLog {
  32. public static final String[] COLUMN_CAPTIONS = { "Column 0", "Column 1", "Column 2", "Row Number", "Date", "HTML String", "Big Random", "Small Random" };
  33. public static final String ROW_STYLE_GENERATOR_ROW_NUMBERS_FOR_3_OF_4 = "Row numbers for 3/4";
  34. public static final String ROW_STYLE_GENERATOR_NONE = "None";
  35. public static final String ROW_STYLE_GENERATOR_ROW_NUMBERS = "Row numbers";
  36. public static final String ROW_STYLE_GENERATOR_EMPTY = "Empty string";
  37. public static final String ROW_STYLE_GENERATOR_NULL = "Null";
  38. public static final String CELL_STYLE_GENERATOR_NONE = "None";
  39. public static final String CELL_STYLE_GENERATOR_PROPERTY_TO_STRING = "Property to string";
  40. public static final String CELL_STYLE_GENERATOR_SPECIAL = "Special for 1/4 Column 1";
  41. public static final String CELL_STYLE_GENERATOR_EMPTY = "Empty string";
  42. public static final String CELL_STYLE_GENERATOR_NULL = "Null";
  43. private static class DetailedDetailsGenerator
  44. implements DetailsGenerator<DataObject> {
  45. @Override
  46. public Component apply(DataObject dataObj) {
  47. VerticalLayout cssLayout = new VerticalLayout();
  48. cssLayout.setHeight("200px");
  49. cssLayout.setWidth("100%");
  50. cssLayout.addComponent(
  51. new Label("Row Number: " + dataObj.getRowNumber()));
  52. cssLayout.addComponent(new Label("Date: " + dataObj.getDate()));
  53. cssLayout.addComponent(
  54. new Label("Big Random: " + dataObj.getBigRandom()));
  55. cssLayout.addComponent(
  56. new Label("Small Random: " + dataObj.getSmallRandom()));
  57. cssLayout
  58. .addComponent(new Button("Press me",
  59. e -> Notification.show("You clicked on the "
  60. + "button in the details for " + "row "
  61. + dataObj.getRowNumber())));
  62. return cssLayout;
  63. }
  64. }
  65. private static class PersistingDetailsGenerator
  66. implements DetailsGenerator<DataObject> {
  67. private Map<DataObject, Panel> detailsMap = new HashMap<>();
  68. @Override
  69. public Component apply(DataObject dataObj) {
  70. if (!detailsMap.containsKey(dataObj)) {
  71. Panel panel = new Panel();
  72. panel.setContent(new Label("One"));
  73. detailsMap.put(dataObj, panel);
  74. }
  75. return detailsMap.get(dataObj);
  76. }
  77. public void changeDetailsComponent(MenuItem item) {
  78. for (DataObject id : detailsMap.keySet()) {
  79. Panel panel = detailsMap.get(id);
  80. Label label = (Label) panel.getContent();
  81. if (label.getValue().equals("One")) {
  82. panel.setContent(new Label("Two"));
  83. } else {
  84. panel.setContent(new Label("One"));
  85. }
  86. }
  87. }
  88. }
  89. private Grid<DataObject> grid;
  90. private Map<String, DetailsGenerator<DataObject>> generators = new LinkedHashMap<>();
  91. private List<DataObject> data;
  92. private int watchingCount = 0;
  93. private PersistingDetailsGenerator persistingDetails;
  94. public GridBasics() {
  95. generators.put("NULL", null);
  96. generators.put("Detailed", new DetailedDetailsGenerator());
  97. generators
  98. .put("\"Watching\"",
  99. dataObj -> new Label("You are watching item id "
  100. + dataObj.getRowNumber() + " ("
  101. + (watchingCount++) + ")"));
  102. persistingDetails = new PersistingDetailsGenerator();
  103. generators.put("Persisting", persistingDetails);
  104. }
  105. @Override
  106. protected void setup(VaadinRequest request) {
  107. data = DataObject.generateObjects();
  108. VerticalLayout layout = new VerticalLayout();
  109. layout.setSpacing(true);
  110. layout.setSizeFull();
  111. // Create grid
  112. grid = new Grid<>();
  113. grid.setItems(data);
  114. grid.addColumn(COLUMN_CAPTIONS[0],
  115. dataObj -> "(" + dataObj.getRowNumber() + ", 0)");
  116. grid.addColumn(COLUMN_CAPTIONS[1],
  117. dataObj -> "(" + dataObj.getRowNumber() + ", 1)");
  118. grid.addColumn(COLUMN_CAPTIONS[2],
  119. dataObj -> "(" + dataObj.getRowNumber() + ", 2)");
  120. grid.addColumn(COLUMN_CAPTIONS[3], DataObject::getRowNumber,
  121. new NumberRenderer());
  122. grid.addColumn(COLUMN_CAPTIONS[4], DataObject::getDate, new DateRenderer());
  123. grid.addColumn(COLUMN_CAPTIONS[5], DataObject::getHtmlString,
  124. new HtmlRenderer());
  125. grid.addColumn(COLUMN_CAPTIONS[6], DataObject::getBigRandom,
  126. new NumberRenderer());
  127. grid.addColumn(COLUMN_CAPTIONS[7], data -> data.getSmallRandom() / 5d,
  128. new ProgressBarRenderer());
  129. grid.addSelectionListener(e -> log("Selected: " + e.getValue()));
  130. layout.addComponent(createMenu());
  131. layout.addComponent(grid);
  132. addComponent(layout);
  133. }
  134. private Component createMenu() {
  135. MenuBar menu = new MenuBar();
  136. MenuItem componentMenu = menu.addItem("Component", null);
  137. createStateMenu(componentMenu.addItem("State", null));
  138. createSizeMenu(componentMenu.addItem("Size", null));
  139. createDetailsMenu(componentMenu.addItem("Details", null));
  140. createBodyMenu(componentMenu.addItem("Body rows", null));
  141. createHeaderMenu(componentMenu.addItem("Header", null));
  142. return menu;
  143. }
  144. private void createSizeMenu(MenuItem sizeMenu) {
  145. MenuItem heightByRows = sizeMenu.addItem("Height by Rows", null);
  146. DecimalFormat df = new DecimalFormat("0.00");
  147. Stream.of(0.33, 0.67, 1.00, 1.33, 1.67, 2.00, 2.33, 2.67, 3.00, 3.33,
  148. 3.67, 4.00, 4.33, 4.67)
  149. .forEach(d -> addGridMethodMenu(heightByRows,
  150. df.format(d) + " rows", d, grid::setHeightByRows));
  151. sizeMenu.addItem("HeightMode Row", item -> {
  152. grid.setHeightMode(
  153. item.isChecked() ? HeightMode.ROW : HeightMode.CSS);
  154. }).setCheckable(true);
  155. MenuItem heightMenu = sizeMenu.addItem("Height", null);
  156. Stream.of(50, 100, 200, 400).map(i -> i + "px").forEach(
  157. i -> addGridMethodMenu(heightMenu, i, i, grid::setHeight));
  158. }
  159. private void createStateMenu(MenuItem stateMenu) {
  160. MenuItem frozenColMenu = stateMenu.addItem("Frozen column count", null);
  161. for (int i = -1; i < 3; ++i) {
  162. addGridMethodMenu(frozenColMenu, "" + i, i,
  163. grid::setFrozenColumnCount);
  164. }
  165. createRowStyleMenu(stateMenu.addItem("Row style generator", null));
  166. createCellStyleMenu(stateMenu.addItem("Cell style generator", null));
  167. stateMenu.addItem("Row description generator",
  168. item -> grid.setDescriptionGenerator(item.isChecked()
  169. ? t -> "Row tooltip for row " + t.getRowNumber()
  170. : null))
  171. .setCheckable(true);
  172. stateMenu
  173. .addItem("Cell description generator",
  174. item -> grid.getColumns().stream().findFirst()
  175. .ifPresent(
  176. c -> c.setDescriptionGenerator(
  177. item.isChecked()
  178. ? t -> "Cell tooltip for row "
  179. + t.getRowNumber()
  180. + ", Column 0"
  181. : null)))
  182. .setCheckable(true);
  183. stateMenu.addItem("Item click listener", new Command() {
  184. private Registration registration = null;
  185. @Override
  186. public void menuSelected(MenuItem selectedItem) {
  187. removeRegistration();
  188. if (selectedItem.isChecked()) {
  189. registration = grid.addItemClickListener(e -> {
  190. grid.setDetailsVisible(e.getItem(),
  191. !grid.isDetailsVisible(e.getItem()));
  192. log("Item click on row " + e.getItem().getRowNumber()
  193. + ", Column '" + e.getColumn().getCaption()
  194. + "'");
  195. });
  196. log("Registered an item click listener.");
  197. }
  198. }
  199. private void removeRegistration() {
  200. if (registration != null) {
  201. registration.remove();
  202. registration = null;
  203. log("Removed an item click listener.");
  204. }
  205. }
  206. }).setCheckable(true);
  207. }
  208. private void createRowStyleMenu(MenuItem rowStyleMenu) {
  209. addGridMethodMenu(rowStyleMenu, ROW_STYLE_GENERATOR_NONE,
  210. (StyleGenerator<DataObject>) t -> null,
  211. grid::setStyleGenerator);
  212. addGridMethodMenu(rowStyleMenu, ROW_STYLE_GENERATOR_ROW_NUMBERS,
  213. t -> "row" + t.getRowNumber(), grid::setStyleGenerator);
  214. addGridMethodMenu(rowStyleMenu,
  215. ROW_STYLE_GENERATOR_ROW_NUMBERS_FOR_3_OF_4,
  216. t -> t.getRowNumber() % 4 != 0 ? "row" + t.getRowNumber()
  217. : null,
  218. grid::setStyleGenerator);
  219. addGridMethodMenu(rowStyleMenu, ROW_STYLE_GENERATOR_EMPTY, t -> "",
  220. grid::setStyleGenerator);
  221. addGridMethodMenu(rowStyleMenu, ROW_STYLE_GENERATOR_NULL, t -> null,
  222. grid::setStyleGenerator);
  223. }
  224. private void createCellStyleMenu(MenuItem cellStyleMenu) {
  225. addGridMethodMenu(cellStyleMenu, CELL_STYLE_GENERATOR_NONE,
  226. (StyleGenerator<DataObject>) t -> null,
  227. sg -> grid.getColumns().forEach(c -> c.setStyleGenerator(sg)));
  228. addGridMethodMenu(cellStyleMenu, CELL_STYLE_GENERATOR_EMPTY,
  229. (StyleGenerator<DataObject>) t -> "",
  230. sg -> grid.getColumns().forEach(c -> c.setStyleGenerator(sg)));
  231. addGridMethodMenu(cellStyleMenu,
  232. CELL_STYLE_GENERATOR_PROPERTY_TO_STRING,
  233. (StyleGenerator<DataObject>) t -> null,
  234. sg -> grid.getColumns().forEach(c -> c.setStyleGenerator(
  235. t -> c.getCaption().replaceAll(" ", "-"))));
  236. addGridMethodMenu(cellStyleMenu, CELL_STYLE_GENERATOR_SPECIAL,
  237. (StyleGenerator<DataObject>) t -> null,
  238. sg -> grid.getColumns().forEach(c -> c.setStyleGenerator(t -> {
  239. if (t.getRowNumber() % 4 == 1) {
  240. return null;
  241. } else if (t.getRowNumber() % 4 == 3
  242. && c.getCaption().equals("Column 1")) {
  243. return null;
  244. }
  245. return c.getCaption().replaceAll(" ", "_");
  246. })));
  247. addGridMethodMenu(cellStyleMenu, CELL_STYLE_GENERATOR_NULL,
  248. (StyleGenerator<DataObject>) t -> null,
  249. sg -> grid.getColumns().forEach(c -> c.setStyleGenerator(sg)));
  250. }
  251. private <T> void addGridMethodMenu(MenuItem parent, String name, T value,
  252. Consumer<T> method) {
  253. parent.addItem(name, menuItem -> method.accept(value));
  254. }
  255. private void createBodyMenu(MenuItem rowMenu) {
  256. rowMenu.addItem("Toggle first row selection", menuItem -> {
  257. DataObject item = data.get(0);
  258. if (grid.isSelected(item)) {
  259. grid.deselect(item);
  260. } else {
  261. grid.select(item);
  262. }
  263. });
  264. }
  265. private void createHeaderMenu(MenuItem headerMenu) {
  266. headerMenu.addItem("Append header row", menuItem -> {
  267. grid.appendHeaderRow();
  268. });
  269. headerMenu.addItem("Prepend header row", menuItem -> {
  270. grid.prependHeaderRow();
  271. });
  272. headerMenu.addItem("Remove first header row", menuItem -> {
  273. grid.removeHeaderRow(0);
  274. });
  275. }
  276. /* DetailsGenerator related things */
  277. private void createDetailsMenu(MenuItem detailsMenu) {
  278. MenuItem generatorsMenu = detailsMenu.addItem("Generators", null);
  279. generators.forEach((name, gen) -> generatorsMenu.addItem(name,
  280. item -> grid.setDetailsGenerator(gen)));
  281. generatorsMenu.addItem("- Change Component",
  282. persistingDetails::changeDetailsComponent);
  283. detailsMenu.addItem("Toggle First", item -> {
  284. DataObject first = data.get(0);
  285. openOrCloseDetails(first);
  286. openOrCloseDetails(first);
  287. });
  288. detailsMenu.addItem("Open First", item -> {
  289. DataObject object = data.get(0);
  290. openOrCloseDetails(object);
  291. });
  292. detailsMenu.addItem("Open 1", item -> {
  293. DataObject object = data.get(1);
  294. openOrCloseDetails(object);
  295. });
  296. detailsMenu.addItem("Open 995", item -> {
  297. DataObject object = data.get(995);
  298. openOrCloseDetails(object);
  299. });
  300. }
  301. private void openOrCloseDetails(DataObject dataObj) {
  302. grid.setDetailsVisible(dataObj, !grid.isDetailsVisible(dataObj));
  303. }
  304. }