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.

GridClientColumnRendererConnector.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. /*
  2. * Copyright 2000-2016 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.tests.widgetset.client.v7.grid;
  17. import java.util.ArrayList;
  18. import java.util.Comparator;
  19. import java.util.Date;
  20. import java.util.List;
  21. import com.google.gwt.dom.client.Document;
  22. import com.google.gwt.dom.client.Element;
  23. import com.google.gwt.user.client.Timer;
  24. import com.google.gwt.user.client.Window.Location;
  25. import com.google.gwt.user.client.ui.Button;
  26. import com.google.gwt.user.client.ui.HasWidgets;
  27. import com.vaadin.client.data.DataChangeHandler;
  28. import com.vaadin.client.data.DataSource;
  29. import com.vaadin.shared.Registration;
  30. import com.vaadin.shared.ui.Connect;
  31. import com.vaadin.tests.widgetset.server.v7.grid.GridClientColumnRenderers;
  32. import com.vaadin.v7.client.renderers.ComplexRenderer;
  33. import com.vaadin.v7.client.renderers.DateRenderer;
  34. import com.vaadin.v7.client.renderers.HtmlRenderer;
  35. import com.vaadin.v7.client.renderers.NumberRenderer;
  36. import com.vaadin.v7.client.renderers.Renderer;
  37. import com.vaadin.v7.client.renderers.TextRenderer;
  38. import com.vaadin.v7.client.renderers.WidgetRenderer;
  39. import com.vaadin.v7.client.ui.AbstractLegacyComponentConnector;
  40. import com.vaadin.v7.client.widget.grid.CellReference;
  41. import com.vaadin.v7.client.widget.grid.RendererCellReference;
  42. import com.vaadin.v7.client.widget.grid.datasources.ListDataSource;
  43. import com.vaadin.v7.client.widget.grid.datasources.ListSorter;
  44. import com.vaadin.v7.client.widget.grid.sort.Sort;
  45. import com.vaadin.v7.client.widget.grid.sort.SortEvent;
  46. import com.vaadin.v7.client.widget.grid.sort.SortHandler;
  47. import com.vaadin.v7.client.widget.grid.sort.SortOrder;
  48. import com.vaadin.v7.client.widgets.Grid;
  49. @Connect(GridClientColumnRenderers.GridController.class)
  50. public class GridClientColumnRendererConnector
  51. extends AbstractLegacyComponentConnector {
  52. public static enum Renderers {
  53. TEXT_RENDERER, WIDGET_RENDERER, HTML_RENDERER, NUMBER_RENDERER, DATE_RENDERER, CPLX_RENDERER;
  54. }
  55. /**
  56. * Datasource for simulating network latency
  57. */
  58. private class DelayedDataSource implements DataSource<String> {
  59. private DataSource<String> ds;
  60. private int firstRowIndex = -1;
  61. private int numberOfRows;
  62. private DataChangeHandler dataChangeHandler;
  63. private int latency;
  64. private Timer timer;
  65. public DelayedDataSource(DataSource<String> ds, int latency) {
  66. this.ds = ds;
  67. this.latency = latency;
  68. }
  69. @Override
  70. public void ensureAvailability(final int firstRowIndex,
  71. final int numberOfRows) {
  72. timer = new Timer() {
  73. @Override
  74. public void run() {
  75. DelayedDataSource.this.firstRowIndex = firstRowIndex;
  76. DelayedDataSource.this.numberOfRows = numberOfRows;
  77. dataChangeHandler.dataUpdated(firstRowIndex, numberOfRows);
  78. dataChangeHandler.dataAvailable(firstRowIndex,
  79. numberOfRows);
  80. timer = null;
  81. }
  82. };
  83. timer.schedule(latency);
  84. }
  85. @Override
  86. public String getRow(int rowIndex) {
  87. if (rowIndex >= firstRowIndex
  88. && rowIndex <= firstRowIndex + numberOfRows) {
  89. return ds.getRow(rowIndex);
  90. }
  91. return null;
  92. }
  93. @Override
  94. public int size() {
  95. return ds.size();
  96. }
  97. @Override
  98. public Registration addDataChangeHandler(
  99. DataChangeHandler dataChangeHandler) {
  100. this.dataChangeHandler = dataChangeHandler;
  101. return null;
  102. }
  103. @Override
  104. public RowHandle<String> getHandle(String row) {
  105. // TODO Auto-generated method stub (henrik paul: 17.6.)
  106. return null;
  107. }
  108. @Override
  109. public boolean isWaitingForData() {
  110. return timer != null;
  111. }
  112. }
  113. @Override
  114. protected void init() {
  115. Grid<String> grid = getWidget();
  116. grid.setSelectionMode(Grid.SelectionMode.NONE);
  117. // Generated some column data
  118. List<String> columnData = new ArrayList<>();
  119. for (int i = 0; i < 100; i++) {
  120. columnData.add(String.valueOf(i));
  121. }
  122. // Provide data as data source
  123. if (Location.getParameter("latency") != null) {
  124. grid.setDataSource(new DelayedDataSource(
  125. new ListDataSource<>(columnData),
  126. Integer.parseInt(Location.getParameter("latency"))));
  127. } else {
  128. grid.setDataSource(new ListDataSource<>(columnData));
  129. }
  130. // Add a column to display the data in
  131. Grid.Column<String, String> c = createColumnWithRenderer(
  132. Renderers.TEXT_RENDERER);
  133. grid.addColumn(c);
  134. grid.getDefaultHeaderRow().getCell(c).setText("Column 1");
  135. // Add another column with a custom complex renderer
  136. c = createColumnWithRenderer(Renderers.CPLX_RENDERER);
  137. grid.addColumn(c);
  138. grid.getDefaultHeaderRow().getCell(c).setText("Column 2");
  139. // Add method for testing sort event firing
  140. grid.addSortHandler(new SortHandler<String>() {
  141. @Override
  142. public void sort(SortEvent<String> event) {
  143. Element console = Document.get()
  144. .getElementById("testDebugConsole");
  145. String text = "Client-side sort event received<br>"
  146. + "Columns: " + event.getOrder().size() + ", order: ";
  147. for (SortOrder order : event.getOrder()) {
  148. String columnHeader = getWidget().getDefaultHeaderRow()
  149. .getCell(order.getColumn()).getText();
  150. text += columnHeader + ": "
  151. + order.getDirection().toString();
  152. }
  153. console.setInnerHTML(text);
  154. }
  155. });
  156. // Handle RPC calls
  157. registerRpc(GridClientColumnRendererRpc.class,
  158. new GridClientColumnRendererRpc() {
  159. @Override
  160. public void addColumn(Renderers renderer) {
  161. Grid.Column<?, String> column;
  162. if (renderer == Renderers.NUMBER_RENDERER) {
  163. column = createNumberColumnWithRenderer(renderer);
  164. } else if (renderer == Renderers.DATE_RENDERER) {
  165. column = createDateColumnWithRenderer(renderer);
  166. } else {
  167. column = createColumnWithRenderer(renderer);
  168. }
  169. getWidget().addColumn(column);
  170. getWidget().getDefaultHeaderRow().getCell(column)
  171. .setText("Column " + String.valueOf(
  172. getWidget().getColumnCount() + 1));
  173. }
  174. @Override
  175. public void detachAttach() {
  176. // Detach
  177. HasWidgets parent = (HasWidgets) getWidget()
  178. .getParent();
  179. parent.remove(getWidget());
  180. // Re-attach
  181. parent.add(getWidget());
  182. }
  183. @Override
  184. public void triggerClientSorting() {
  185. getWidget().sort(Sort.by(getWidget().getColumn(0)));
  186. }
  187. @Override
  188. @SuppressWarnings("unchecked")
  189. public void triggerClientSortingTest() {
  190. Grid<String> grid = getWidget();
  191. ListSorter<String> sorter = new ListSorter<>(grid);
  192. // Make sorter sort the numbers in natural order
  193. sorter.setComparator(
  194. (Grid.Column<String, String>) grid.getColumn(0),
  195. new Comparator<String>() {
  196. @Override
  197. public int compare(String o1, String o2) {
  198. return Integer.parseInt(o1)
  199. - Integer.parseInt(o2);
  200. }
  201. });
  202. // Sort along column 0 in ascending order
  203. grid.sort(grid.getColumn(0));
  204. // Remove the sorter once we're done
  205. sorter.removeFromGrid();
  206. }
  207. @Override
  208. @SuppressWarnings("unchecked")
  209. public void shuffle() {
  210. Grid<String> grid = getWidget();
  211. ListSorter<String> shuffler = new ListSorter<>(grid);
  212. // Make shuffler return random order
  213. shuffler.setComparator(
  214. (Grid.Column<String, String>) grid.getColumn(0),
  215. new Comparator<String>() {
  216. @Override
  217. public int compare(String o1, String o2) {
  218. return com.google.gwt.user.client.Random
  219. .nextInt(3) - 1;
  220. }
  221. });
  222. // "Sort" (actually shuffle) along column 0
  223. grid.sort(grid.getColumn(0));
  224. // Remove the shuffler when we're done so that it
  225. // doesn't interfere with further operations
  226. shuffler.removeFromGrid();
  227. }
  228. });
  229. }
  230. /**
  231. * Creates a a renderer for a {@link Renderers}
  232. */
  233. private Renderer createRenderer(Renderers renderer) {
  234. switch (renderer) {
  235. case TEXT_RENDERER:
  236. return new TextRenderer();
  237. case WIDGET_RENDERER:
  238. return new WidgetRenderer<String, Button>() {
  239. @Override
  240. public Button createWidget() {
  241. final Button button = new Button("");
  242. button.addClickHandler(event -> button.setText("Clicked"));
  243. return button;
  244. }
  245. @Override
  246. public void render(RendererCellReference cell, String data,
  247. Button button) {
  248. button.setHTML(data);
  249. }
  250. };
  251. case HTML_RENDERER:
  252. return new HtmlRenderer() {
  253. @Override
  254. public void render(RendererCellReference cell,
  255. String htmlString) {
  256. super.render(cell, "<b>" + htmlString + "</b>");
  257. }
  258. };
  259. case NUMBER_RENDERER:
  260. return new NumberRenderer();
  261. case DATE_RENDERER:
  262. return new DateRenderer();
  263. case CPLX_RENDERER:
  264. return new ComplexRenderer<String>() {
  265. @Override
  266. public void init(RendererCellReference cell) {
  267. }
  268. @Override
  269. public void render(RendererCellReference cell, String data) {
  270. cell.getElement().setInnerHTML("<span>" + data + "</span>");
  271. cell.getElement().getStyle().clearBackgroundColor();
  272. }
  273. @Override
  274. public void setContentVisible(RendererCellReference cell,
  275. boolean hasData) {
  276. // Visualize content visible property
  277. cell.getElement().getStyle()
  278. .setBackgroundColor(hasData ? "green" : "red");
  279. super.setContentVisible(cell, hasData);
  280. }
  281. @Override
  282. public boolean onActivate(CellReference<?> cell) {
  283. cell.getElement().setInnerHTML("<span>Activated!</span>");
  284. return true;
  285. }
  286. };
  287. default:
  288. return new TextRenderer();
  289. }
  290. }
  291. private Grid.Column<String, String> createColumnWithRenderer(
  292. Renderers renderer) {
  293. return new Grid.Column<String, String>(createRenderer(renderer)) {
  294. @Override
  295. public String getValue(String row) {
  296. return row;
  297. }
  298. };
  299. }
  300. private Grid.Column<Number, String> createNumberColumnWithRenderer(
  301. Renderers renderer) {
  302. return new Grid.Column<Number, String>(createRenderer(renderer)) {
  303. @Override
  304. public Number getValue(String row) {
  305. return Long.parseLong(row);
  306. }
  307. };
  308. }
  309. private Grid.Column<Date, String> createDateColumnWithRenderer(
  310. Renderers renderer) {
  311. return new Grid.Column<Date, String>(createRenderer(renderer)) {
  312. @Override
  313. public Date getValue(String row) {
  314. return new Date();
  315. }
  316. };
  317. }
  318. @Override
  319. public Grid<String> getWidget() {
  320. return (Grid<String>) super.getWidget();
  321. }
  322. }