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.

DDTest7.java 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package com.vaadin.tests.dd;
  2. import java.util.Collection;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import com.vaadin.data.Item;
  6. import com.vaadin.data.util.IndexedContainer;
  7. import com.vaadin.event.DataBoundTransferable;
  8. import com.vaadin.event.dd.DragAndDropEvent;
  9. import com.vaadin.event.dd.DropHandler;
  10. import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
  11. import com.vaadin.tests.components.TestBase;
  12. import com.vaadin.tests.util.Person;
  13. import com.vaadin.tests.util.PersonContainer;
  14. import com.vaadin.tests.util.TestUtils;
  15. import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails;
  16. import com.vaadin.ui.HorizontalLayout;
  17. import com.vaadin.ui.Table;
  18. import com.vaadin.ui.UI;
  19. public class DDTest7 extends TestBase {
  20. java.util.Random r = new java.util.Random(1);
  21. HorizontalLayout hl = new HorizontalLayout();
  22. Table table = new Table(
  23. "Drag and drop sortable table with lazy loading rule. Dragged row can only be accepted after hevier row (weigh column). If starting from topmost row in viewport, heviests will end up on top.");
  24. @Override
  25. protected void setup() {
  26. UI w = getLayout().getUI();
  27. TestUtils
  28. .injectCSS(
  29. w,
  30. ".v-table-row-drag-middle .v-table-cell-content {"
  31. + " background-color: inherit ; border-bottom: 1px solid cyan;"
  32. + "}"
  33. + ".v-table-row-drag-middle .v-table-cell-wrapper {"
  34. + " margin-bottom: -1px;"
  35. + "}"
  36. + ""
  37. // always show the drop hint below
  38. + ".v-table-row-drag-top .v-table-cell-content {"
  39. + "border-top: 0; margin-top:0;border-bottom:1px solid cyan;"
  40. + " margin-bottom: -1px;" + "}" + ""
  41. );
  42. // hl.addComponent(tree1);
  43. hl.addComponent(table);
  44. // hl.addComponent(tree2);
  45. hl.setWidth("100%");
  46. hl.setSpacing(true);
  47. hl.setExpandRatio(table, 1);
  48. table.setWidth("100%");
  49. table.setPageLength(10);
  50. table.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);
  51. table.setSelectable(true);
  52. table.setMultiSelect(true);
  53. populateTable();
  54. addComponent(hl);
  55. /*
  56. * Make table rows draggable
  57. */
  58. table.setDragMode(Table.TableDragMode.ROW);
  59. table.setDropHandler(new DropHandler() {
  60. // accept only drags from this table
  61. AcceptCriterion crit = new Table.TableDropCriterion() {
  62. @Override
  63. protected Set<Object> getAllowedItemIds(
  64. DragAndDropEvent dragEvent, Table table,
  65. Collection<Object> visibleItemIds) {
  66. Object draggedItemId = ((Table.TableTransferable) dragEvent
  67. .getTransferable()).getItemId();
  68. Integer weightOfDraggedRow = (Integer) table
  69. .getItem(draggedItemId).getItemProperty("Weight")
  70. .getValue();
  71. HashSet<Object> accepted = new HashSet<Object>();
  72. for (Object itemId : visibleItemIds) {
  73. Item item = table.getItem(itemId);
  74. Integer w = (Integer) item.getItemProperty("Weight")
  75. .getValue();
  76. if (weightOfDraggedRow < w) {
  77. accepted.add(itemId);
  78. }
  79. }
  80. return accepted;
  81. }
  82. };
  83. @Override
  84. public AcceptCriterion getAcceptCriterion() {
  85. return crit;
  86. }
  87. @Override
  88. public void drop(DragAndDropEvent dropEvent) {
  89. AbstractSelectTargetDetails dropTargetData = (AbstractSelectTargetDetails) dropEvent
  90. .getTargetDetails();
  91. DataBoundTransferable transferable = (DataBoundTransferable) dropEvent
  92. .getTransferable();
  93. Object itemIdOver = dropTargetData.getItemIdOver();
  94. Object itemId = transferable.getItemId();
  95. if (itemId == null || itemIdOver == null
  96. || itemId.equals(itemIdOver)) {
  97. return; // no move happened
  98. }
  99. // IndexedContainer goodies... (hint: don't use it in real apps)
  100. IndexedContainer containerDataSource = (IndexedContainer) table
  101. .getContainerDataSource();
  102. int newIndex = containerDataSource.indexOfId(itemIdOver) - 1;
  103. // always add after
  104. newIndex++;
  105. if (newIndex < 0) {
  106. newIndex = 0;
  107. }
  108. Object idAfter = containerDataSource.getIdByIndex(newIndex);
  109. Collection<?> selections = (Collection<?>) table.getValue();
  110. if (selections != null && selections.contains(itemId)) {
  111. // dragged a selected item, if multiple rows selected, drag
  112. // them too (functionality similar to apple mail)
  113. for (Object object : selections) {
  114. moveAfter(containerDataSource, object, idAfter);
  115. }
  116. } else {
  117. // move just the dragged row, not considering selection at
  118. // all
  119. moveAfter(containerDataSource, itemId, idAfter);
  120. }
  121. }
  122. private void moveAfter(IndexedContainer containerDataSource,
  123. Object itemId, Object idAfter) {
  124. try {
  125. IndexedContainer clone = null;
  126. clone = (IndexedContainer) containerDataSource.clone();
  127. containerDataSource.removeItem(itemId);
  128. Item newItem = containerDataSource.addItemAfter(idAfter,
  129. itemId);
  130. Item item = clone.getItem(itemId);
  131. for (Object propId : item.getItemPropertyIds()) {
  132. newItem.getItemProperty(propId).setValue(
  133. item.getItemProperty(propId).getValue());
  134. }
  135. } catch (CloneNotSupportedException e) {
  136. e.printStackTrace();
  137. }
  138. }
  139. });
  140. }
  141. private void populateTable() {
  142. table.addContainerProperty("Name", String.class, "");
  143. table.addContainerProperty("Weight", Integer.class, 0);
  144. PersonContainer testData = PersonContainer.createWithTestData();
  145. for (int i = 0; i < 40; i++) {
  146. Item addItem = table.addItem("Item" + i);
  147. Person p = testData.getIdByIndex(i);
  148. addItem.getItemProperty("Name").setValue(
  149. p.getFirstName() + " " + p.getLastName());
  150. addItem.getItemProperty("Weight").setValue(50 + r.nextInt(60));
  151. }
  152. }
  153. @Override
  154. protected String getDescription() {
  155. return "dd";
  156. }
  157. @Override
  158. protected Integer getTicketNumber() {
  159. return 119;
  160. }
  161. }