package kornell.gui.client.presentation.admin.courseversion.courseversion.wizard.edit; import java.util.ArrayList; import java.util.List; import com.google.gwt.event.dom.client.DragLeaveEvent; import com.google.gwt.event.dom.client.DragLeaveHandler; import com.google.gwt.event.dom.client.DragOverEvent; import com.google.gwt.event.dom.client.DragOverHandler; import com.google.gwt.event.dom.client.DragStartEvent; import com.google.gwt.event.dom.client.DragStartHandler; import com.google.gwt.event.dom.client.DropEvent; import com.google.gwt.event.dom.client.DropHandler; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Tree; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.Widget; public class WizardSideItemLabel extends Label { private static WizardSideItemLabel dragging = null; final boolean droppable; public WizardSideItemLabel(String text, boolean draggable, boolean droppable) { super(text); if (draggable) { initDrag(); } if (droppable) { initDrop(); } this.droppable = droppable; if (droppable) { addStyleName("droppable"); } else if (draggable) { addStyleName("draggable"); } } private void initDrag() { getElement().setDraggable(Element.DRAGGABLE_TRUE); addDragStartHandler(new DragStartHandler() { @Override public void onDragStart(DragStartEvent event) { // Remember what's being dragged dragging = WizardSideItemLabel.this; event.setData("ID", "UniqueIdentifier"); event.getDataTransfer().setDragImage(getElement(), 10, 10); } }); } private void initDrop() { addDomHandler(new DragOverHandler() { @Override public void onDragOver(DragOverEvent event) { addStyleName("dropping"); } }, DragOverEvent.getType()); addDomHandler(new DragLeaveHandler() { @Override public void onDragLeave(DragLeaveEvent event) { removeStyleName("dropping"); } }, DragLeaveEvent.getType()); addDomHandler(new DropHandler() { @Override public void onDrop(DropEvent event) { event.preventDefault(); if (dragging != null) { TreeItem target = null; TreeItem source = null; Tree tree = (Tree) WizardSideItemLabel.this.getParent(); List<TreeItem> treeItems = new ArrayList<TreeItem>(); treeItems.add(tree.getItem(0)); while (!treeItems.isEmpty()) { TreeItem item = treeItems.remove(0); for (int i = 0; i < item.getChildCount(); i++) { treeItems.add(item.getChild(i)); } Widget widget = item.getWidget(); if (widget != null) { if (widget == dragging) { source = item; if (target != null) { break; } } if (widget == WizardSideItemLabel.this) { target = item; widget.removeStyleName("dropping"); if (source != null) { break; } } } } if (source != null && target != null) { TreeItem testTarget = target; while (testTarget != null) { if (testTarget == source) { return; } testTarget = testTarget.getParentItem(); } target.addItem(source); target.setState(true); } dragging = null; } } }, DropEvent.getType()); } }