package com.vaadin.tests.dd;
import java.util.Collection;
import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.event.DataBoundTransferable;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DropHandler;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.event.dd.acceptcriteria.SourceIs;
import com.vaadin.shared.ui.dd.VerticalDropLocation;
import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.util.Person;
import com.vaadin.tests.util.PersonContainer;
import com.vaadin.tests.util.TestUtils;
import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
public class DDTest4 extends TestBase {
java.util.Random r = new java.util.Random(1);
HorizontalLayout hl = new HorizontalLayout();
Table table = new Table("Drag and drop sortable table");
@Override
protected void setup() {
UI w = getLayout().getUI();
TestUtils
.injectCSS(
w,
".v-table-row-drag-middle .v-table-cell-content {"
+ " background-color: inherit ; border-bottom: 1px solid cyan;"
+ "}"
+ ".v-table-row-drag-middle .v-table-cell-wrapper {"
+ " margin-bottom: -1px;" + "}" + ""
);
// hl.addComponent(tree1);
hl.addComponent(table);
// hl.addComponent(tree2);
hl.setWidth("100%");
hl.setSpacing(true);
hl.setExpandRatio(table, 1);
table.setWidth("100%");
table.setPageLength(10);
table.setRowHeaderMode(Table.ROW_HEADER_MODE_ID);
table.setSelectable(true);
table.setMultiSelect(true);
populateTable();
addComponent(hl);
/*
* Make table rows draggable
*/
table.setDragMode(Table.TableDragMode.ROW);
table.setDropHandler(new DropHandler() {
// accept only drags from this table
AcceptCriterion crit = new SourceIs(table);
@Override
public AcceptCriterion getAcceptCriterion() {
return crit;
}
@Override
public void drop(DragAndDropEvent dropEvent) {
AbstractSelectTargetDetails dropTargetData = (AbstractSelectTargetDetails) dropEvent
.getTargetDetails();
DataBoundTransferable transferable = (DataBoundTransferable) dropEvent
.getTransferable();
Object itemIdOver = dropTargetData.getItemIdOver();
Object itemId = transferable.getItemId();
if (itemId == null || itemIdOver == null
|| itemId.equals(itemIdOver)) {
return; // no move happened
}
// IndexedContainer goodies... (hint: don't use it in real apps)
IndexedContainer containerDataSource = (IndexedContainer) table
.getContainerDataSource();
int newIndex = containerDataSource.indexOfId(itemIdOver) - 1;
if (dropTargetData.getDropLocation() != VerticalDropLocation.TOP) {
newIndex++;
}
if (newIndex < 0) {
newIndex = 0;
}
Object idAfter = containerDataSource.getIdByIndex(newIndex);
Collection<?> selections = (Collection<?>) table.getValue();
if (selections != null && selections.contains(itemId)) {
// dragged a selected item, if multiple rows selected, drag
// them too (functionality similar to apple mail)
for (Object object : selections) {
moveAfter(containerDataSource, object, idAfter);
}
} else {
// move just the dragged row, not considering selection at
// all
moveAfter(containerDataSource, itemId, idAfter);
}
}
private void moveAfter(IndexedContainer containerDataSource,
Object itemId, Object idAfter) {
try {
IndexedContainer clone = null;
clone = (IndexedContainer) containerDataSource.clone();
containerDataSource.removeItem(itemId);
Item newItem = containerDataSource.addItemAfter(idAfter,
itemId);
Item item = clone.getItem(itemId);
for (Object propId : item.getItemPropertyIds()) {
newItem.getItemProperty(propId).setValue(
item.getItemProperty(propId).getValue());
}
// TODO Auto-generated method stub
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private void populateTable() {
table.addContainerProperty("Name", String.class, "");
table.addContainerProperty("Weight", Integer.class, 0);
PersonContainer testData = PersonContainer.createWithTestData();
for (int i = 0; i < 10; i++) {
Item addItem = table.addItem("Item" + i);
Person p = testData.getIdByIndex(i);
addItem.getItemProperty("Name").setValue(
p.getFirstName() + " " + p.getLastName());
addItem.getItemProperty("Weight").setValue(50 + r.nextInt(60));
}
}
@Override
protected String getDescription() {
return "dd";
}
@Override
protected Integer getTicketNumber() {
return 119;
}
}