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.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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.demo.tutorial.addressbook.data.Person;
  8. import com.vaadin.demo.tutorial.addressbook.data.PersonContainer;
  9. import com.vaadin.event.DataBoundTransferable;
  10. import com.vaadin.event.dd.DragAndDropEvent;
  11. import com.vaadin.event.dd.DropHandler;
  12. import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
  13. import com.vaadin.terminal.ThemeResource;
  14. import com.vaadin.tests.components.TestBase;
  15. import com.vaadin.tests.util.TestUtils;
  16. import com.vaadin.ui.HorizontalLayout;
  17. import com.vaadin.ui.Table;
  18. import com.vaadin.ui.Window;
  19. import com.vaadin.ui.AbstractSelect.AbstractSelectDropTargetDetails;
  20. public class DDTest7 extends TestBase {
  21. java.util.Random r = new java.util.Random(1);
  22. HorizontalLayout hl = new HorizontalLayout();
  23. Table table = new Table(
  24. "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, hevies will end up on top.");
  25. @Override
  26. protected void setup() {
  27. Window w = getLayout().getWindow();
  28. TestUtils
  29. .injectCSS(
  30. w,
  31. ".v-table-row-drag-middle .v-table-cell-content {"
  32. + " background-color: inherit ; border-bottom: 1px solid cyan;"
  33. + "}"
  34. + ".v-table-row-drag-middle .v-table-cell-wrapper {"
  35. + " margin-bottom: -1px;"
  36. + "}"
  37. + ""
  38. // always show the drop hint below
  39. + ".v-table-row-drag-top .v-table-cell-content {"
  40. + "border-top: 0; margin-top:0;border-bottom:1px solid cyan;"
  41. + " margin-bottom: -1px;" + "}" + ""
  42. );
  43. // hl.addComponent(tree1);
  44. hl.addComponent(table);
  45. // hl.addComponent(tree2);
  46. hl.setWidth("100%");
  47. hl.setSpacing(true);
  48. hl.setExpandRatio(table, 1);
  49. table.setWidth("100%");
  50. table.setPageLength(10);
  51. table.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);
  52. table.setSelectable(true);
  53. table.setMultiSelect(true);
  54. populateTable();
  55. addComponent(hl);
  56. /*
  57. * Make table rows draggable
  58. */
  59. table.setDragMode(Table.TableDragMode.ROWS);
  60. table.setDropHandler(new DropHandler() {
  61. // accept only drags from this table
  62. AcceptCriterion crit = new Table.TableDropCriterion() {
  63. @Override
  64. protected Set<Object> getAllowedItemIds(
  65. DragAndDropEvent dragEvent, Table table,
  66. Collection<Object> visibleItemIds) {
  67. Object draggedItemId = ((Table.TableTransferable) dragEvent
  68. .getTransferable()).getItemId();
  69. Integer weightOfDraggedRow = (Integer) table.getItem(
  70. draggedItemId).getItemProperty("Weight").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. public AcceptCriterion getAcceptCriterion() {
  84. return crit;
  85. }
  86. public void drop(DragAndDropEvent dropEvent) {
  87. AbstractSelectDropTargetDetails dropTargetData = (AbstractSelectDropTargetDetails) dropEvent
  88. .getDropTargetDetails();
  89. DataBoundTransferable transferable = (DataBoundTransferable) dropEvent
  90. .getTransferable();
  91. Object itemIdOver = dropTargetData.getItemIdOver();
  92. Object itemId = transferable.getItemId();
  93. if (itemId == null || itemIdOver == null
  94. || itemId.equals(itemIdOver)) {
  95. return; // no move happened
  96. }
  97. // IndexedContainer goodies... (hint: don't use it in real apps)
  98. IndexedContainer containerDataSource = (IndexedContainer) table
  99. .getContainerDataSource();
  100. int newIndex = containerDataSource.indexOfId(itemIdOver) - 1;
  101. // always add after
  102. newIndex++;
  103. if (newIndex < 0) {
  104. newIndex = 0;
  105. }
  106. Object idAfter = containerDataSource.getIdByIndex(newIndex);
  107. Collection selections = (Collection) table.getValue();
  108. if (selections != null && selections.contains(itemId)) {
  109. // dragged a selected item, if multiple rows selected, drag
  110. // them too (functionality similar to apple mail)
  111. for (Object object : selections) {
  112. moveAfter(containerDataSource, object, idAfter);
  113. }
  114. } else {
  115. // move just the dragged row, not considering selection at
  116. // all
  117. moveAfter(containerDataSource, itemId, idAfter);
  118. }
  119. }
  120. private void moveAfter(IndexedContainer containerDataSource,
  121. Object itemId, Object idAfter) {
  122. try {
  123. IndexedContainer clone = null;
  124. clone = (IndexedContainer) containerDataSource.clone();
  125. containerDataSource.removeItem(itemId);
  126. Item newItem = containerDataSource.addItemAfter(idAfter,
  127. itemId);
  128. Item item = clone.getItem(itemId);
  129. for (Object propId : item.getItemPropertyIds()) {
  130. newItem.getItemProperty(propId).setValue(
  131. item.getItemProperty(propId).getValue());
  132. }
  133. // TODO Auto-generated method stub
  134. } catch (CloneNotSupportedException e) {
  135. // TODO Auto-generated catch block
  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. private final static ThemeResource FOLDER = new ThemeResource(
  154. "../runo/icons/16/folder.png");
  155. private final static ThemeResource DOC = new ThemeResource(
  156. "../runo/icons/16/document.png");
  157. @Override
  158. protected String getDescription() {
  159. return "dd";
  160. }
  161. @Override
  162. protected Integer getTicketNumber() {
  163. return 119;
  164. }
  165. }