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.

TouchScrollables.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package com.vaadin.tests.components;
  2. import java.util.Collection;
  3. import com.vaadin.event.Action;
  4. import com.vaadin.event.Action.Handler;
  5. import com.vaadin.event.dd.DragAndDropEvent;
  6. import com.vaadin.event.dd.DropHandler;
  7. import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
  8. import com.vaadin.event.dd.acceptcriteria.SourceIs;
  9. import com.vaadin.shared.ui.dd.VerticalDropLocation;
  10. import com.vaadin.tests.util.Person;
  11. import com.vaadin.tests.util.PersonContainer;
  12. import com.vaadin.tests.util.TestUtils;
  13. import com.vaadin.ui.Accordion;
  14. import com.vaadin.ui.Button;
  15. import com.vaadin.ui.Component;
  16. import com.vaadin.ui.CssLayout;
  17. import com.vaadin.ui.HorizontalSplitPanel;
  18. import com.vaadin.ui.Label;
  19. import com.vaadin.ui.Layout;
  20. import com.vaadin.ui.Notification;
  21. import com.vaadin.ui.Panel;
  22. import com.vaadin.ui.TabSheet;
  23. import com.vaadin.ui.VerticalLayout;
  24. import com.vaadin.ui.Window;
  25. import com.vaadin.v7.data.Item;
  26. import com.vaadin.v7.data.util.IndexedContainer;
  27. import com.vaadin.v7.event.DataBoundTransferable;
  28. import com.vaadin.v7.ui.AbstractSelect.AbstractSelectTargetDetails;
  29. import com.vaadin.v7.ui.Table;
  30. public class TouchScrollables extends TestBase {
  31. java.util.Random r = new java.util.Random(1);
  32. private TabSheet testSelector = new TabSheet();
  33. @Override
  34. public void setup() {
  35. getLayout().addComponent(testSelector);
  36. testSelector.setHeight("500px");
  37. addTest(getPanelTest());
  38. addTest(getSimpleTableTest());
  39. addTest(getDDSortableTableTest());
  40. addTest(getTabSheetTest());
  41. addTest(getSplitPanelTest());
  42. addTest(getAccordionTest());
  43. addTest(getSubWindowTest());
  44. TestUtils.injectCSS(getLayout().getUI(),
  45. "body * {-webkit-user-select: none;} .v-table-row-drag-middle .v-table-cell-content {"
  46. + " background-color: inherit ; border-bottom: 1px solid cyan;"
  47. + "}"
  48. + ".v-table-row-drag-middle .v-table-cell-wrapper {"
  49. + " margin-bottom: -1px;" + "}" + ""
  50. );
  51. }
  52. private Component getPanelTest() {
  53. Layout cssLayout = new CssLayout();
  54. cssLayout.setCaption("Panel");
  55. final VerticalLayout pl = new VerticalLayout();
  56. pl.setMargin(true);
  57. final Panel p = new Panel(pl);
  58. p.setHeight("400px");
  59. Label l50 = null;
  60. for (int i = 0; i < 100; i++) {
  61. Label c = new Label("Label" + i);
  62. pl.addComponent(c);
  63. if (i == 50) {
  64. l50 = c;
  65. }
  66. }
  67. final Label l = l50;
  68. Button button = new Button("Scroll to label 50",
  69. event -> getLayout().getUI().scrollIntoView(l));
  70. cssLayout.addComponent(button);
  71. button = new Button("Scroll to 100px", event -> p.setScrollTop(100));
  72. cssLayout.addComponent(button);
  73. cssLayout.addComponent(p);
  74. return cssLayout;
  75. }
  76. private Component getTabSheetTest() {
  77. TabSheet ts = new TabSheet();
  78. ts.setCaption("Tabsheet");
  79. ts.setHeight("100%");
  80. ts.addTab(getBigComponent(), "Tab 1");
  81. ts.addTab(getBigComponent(), "Tab 2");
  82. return ts;
  83. }
  84. private Component getSplitPanelTest() {
  85. HorizontalSplitPanel sp = new HorizontalSplitPanel();
  86. sp.setCaption("Splitpanel");
  87. sp.addComponent(getBigComponent());
  88. sp.addComponent(getBigComponent());
  89. return sp;
  90. }
  91. private Component getSimpleTableTest() {
  92. CssLayout cssLayout = new CssLayout();
  93. final Table table = new Table();
  94. Button button = new Button("Toggle lazyloading");
  95. button.addClickListener(event -> {
  96. if (table.getCacheRate() == 100) {
  97. table.setCacheRate(2);
  98. table.setPageLength(15);
  99. } else {
  100. table.setCacheRate(100);
  101. table.setHeight("400px");
  102. }
  103. });
  104. cssLayout.addComponent(button);
  105. button = new Button("Toggle selectable");
  106. button.addClickListener(
  107. event -> table.setSelectable(!table.isSelectable()));
  108. cssLayout.addComponent(button);
  109. table.addContainerProperty("foo", String.class, "bar");
  110. table.setRowHeaderMode(Table.ROW_HEADER_MODE_INDEX);
  111. for (int i = 0; i < 1000; i++) {
  112. table.addItem();
  113. }
  114. cssLayout.addComponent(table);
  115. cssLayout.setCaption("Table");
  116. return cssLayout;
  117. }
  118. private Component getAccordionTest() {
  119. Accordion a = new Accordion();
  120. a.setCaption("Accordion");
  121. a.setHeight("100%");
  122. a.addTab(getBigComponent(), "Tab 1");
  123. a.addTab(getBigComponent(), "Tab 2");
  124. a.addTab(getBigComponent(), "Tab 3");
  125. return a;
  126. }
  127. private Component getSubWindowTest() {
  128. Button b = new Button("Open subwindow", event -> {
  129. VerticalLayout layout = new VerticalLayout();
  130. layout.setMargin(true);
  131. Window w = new Window("Subwindow", layout);
  132. w.center();
  133. w.setHeight("200px");
  134. layout.addComponent(getBigComponent());
  135. getMainWindow().addWindow(w);
  136. });
  137. return b;
  138. }
  139. private Component getDDSortableTableTest() {
  140. final Table table;
  141. table = new Table();
  142. table.setCaption("DD sortable table with context menus");
  143. // table.setWidth("100%");
  144. table.setPageLength(10);
  145. table.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);
  146. table.setSelectable(true);
  147. table.setMultiSelect(true);
  148. table.addActionHandler(new Handler() {
  149. Action[] actions = { new Action("FOO"), new Action("BAR"),
  150. new Action("CAR") };
  151. @Override
  152. public Action[] getActions(Object target, Object sender) {
  153. return actions;
  154. }
  155. @Override
  156. public void handleAction(Action action, Object sender,
  157. Object target) {
  158. Notification.show(action.getCaption());
  159. }
  160. });
  161. populateTable(table);
  162. /*
  163. * Make table rows draggable
  164. */
  165. table.setDragMode(Table.TableDragMode.ROW);
  166. table.setDropHandler(new DropHandler() {
  167. // accept only drags from this table
  168. AcceptCriterion crit = new SourceIs(table);
  169. @Override
  170. public AcceptCriterion getAcceptCriterion() {
  171. return crit;
  172. }
  173. @Override
  174. public void drop(DragAndDropEvent dropEvent) {
  175. AbstractSelectTargetDetails dropTargetData = (AbstractSelectTargetDetails) dropEvent
  176. .getTargetDetails();
  177. DataBoundTransferable transferable = (DataBoundTransferable) dropEvent
  178. .getTransferable();
  179. Object itemIdOver = dropTargetData.getItemIdOver();
  180. Object itemId = transferable.getItemId();
  181. if (itemId == null || itemIdOver == null
  182. || itemId.equals(itemIdOver)) {
  183. return; // no move happened
  184. }
  185. // IndexedContainer goodies... (hint: don't use it in real apps)
  186. IndexedContainer containerDataSource = (IndexedContainer) table
  187. .getContainerDataSource();
  188. int newIndex = containerDataSource.indexOfId(itemIdOver) - 1;
  189. if (dropTargetData
  190. .getDropLocation() != VerticalDropLocation.TOP) {
  191. newIndex++;
  192. }
  193. if (newIndex < 0) {
  194. newIndex = 0;
  195. }
  196. Object idAfter = containerDataSource.getIdByIndex(newIndex);
  197. Collection<?> selections = (Collection<?>) table.getValue();
  198. if (selections != null && selections.contains(itemId)) {
  199. // dragged a selected item, if multiple rows selected, drag
  200. // them too (functionality similar to apple mail)
  201. for (Object object : selections) {
  202. moveAfter(containerDataSource, object, idAfter);
  203. }
  204. } else {
  205. // move just the dragged row, not considering selection at
  206. // all
  207. moveAfter(containerDataSource, itemId, idAfter);
  208. }
  209. }
  210. private void moveAfter(IndexedContainer containerDataSource,
  211. Object itemId, Object idAfter) {
  212. try {
  213. IndexedContainer clone = null;
  214. clone = (IndexedContainer) containerDataSource.clone();
  215. containerDataSource.removeItem(itemId);
  216. Item newItem = containerDataSource.addItemAfter(idAfter,
  217. itemId);
  218. Item item = clone.getItem(itemId);
  219. for (Object propId : item.getItemPropertyIds()) {
  220. newItem.getItemProperty(propId).setValue(
  221. item.getItemProperty(propId).getValue());
  222. }
  223. } catch (CloneNotSupportedException e) {
  224. e.printStackTrace();
  225. }
  226. }
  227. });
  228. return table;
  229. }
  230. private void populateTable(Table table) {
  231. table.addContainerProperty("Name", String.class, "");
  232. table.addContainerProperty("Weight", Integer.class, 0);
  233. PersonContainer testData = PersonContainer.createWithTestData();
  234. for (int i = 0; i < 40; i++) {
  235. Item addItem = table.addItem("Item" + i);
  236. Person p = testData.getIdByIndex(i);
  237. addItem.getItemProperty("Name")
  238. .setValue(p.getFirstName() + " " + p.getLastName());
  239. addItem.getItemProperty("Weight").setValue(50 + r.nextInt(60));
  240. }
  241. }
  242. private void addTest(final Component t) {
  243. testSelector.addComponent(t);
  244. }
  245. private Component getBigComponent() {
  246. Layout l = new VerticalLayout();
  247. for (int i = 0; i < 100; i++) {
  248. Label c = new Label("Label" + i);
  249. l.addComponent(c);
  250. }
  251. return l;
  252. }
  253. @Override
  254. protected String getDescription() {
  255. return "Various components and setups suitable for testing scrolling on touch devices.";
  256. }
  257. @Override
  258. protected Integer getTicketNumber() {
  259. return null;
  260. }
  261. }