/* * Created on Nov 2, 2010 * * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE */ package org.eclipse.nebula.widgets.xviewer.customize.dialog; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn; import org.eclipse.nebula.widgets.xviewer.core.util.CollectionsUtil; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSourceAdapter; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; public class XViewerCustDialogDragDrop { private final XViewerCustomizeDialog xViewerCustomizeDialog; public XViewerCustDialogDragDrop(XViewerCustomizeDialog xViewerCustomizeDialog) { this.xViewerCustomizeDialog = xViewerCustomizeDialog; xViewerCustomizeDialog.visibleColTable.getViewer().addDragSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()}, visibleTableDragListener); xViewerCustomizeDialog.visibleColTable.getViewer().addDropSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()}, visibleTableDropListener); xViewerCustomizeDialog.hiddenColTable.getViewer().addDragSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()}, hiddenTableDragListener); xViewerCustomizeDialog.hiddenColTable.getViewer().addDropSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()}, hiddenTableDropListener); } DragSourceAdapter hiddenTableDragListener = new DragSourceAdapter() { @Override public void dragStart(DragSourceEvent event) { if (xViewerCustomizeDialog.hiddenColTable.getViewer().getSelection().isEmpty()) { event.doit = false; } } /* * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent) */ @Override public void dragSetData(DragSourceEvent event) { if (TextTransfer.getInstance().isSupportedType(event.dataType)) { List<XViewerColumn> selCols = xViewerCustomizeDialog.getHiddenTableSelection(); Collection<String> ids = new ArrayList<String>(selCols.size()); for (XViewerColumn xCol : selCols) { ids.add(xCol.getId()); } event.data = CollectionsUtil.toString(ids, null, ", ", null); //$NON-NLS-1$ } } }; DropTargetAdapter hiddenTableDropListener = new DropTargetAdapter() { @Override public void dragOperationChanged(DropTargetEvent event) { // do nothing } @Override public void drop(DropTargetEvent event) { if (event.data instanceof String) { performHiddenTableTextDrop(event); } } @Override public void dragOver(DropTargetEvent event) { performHiddenTableDragOver(event); } @Override public void dropAccept(DropTargetEvent event) { // do nothing } }; /** * Drag should only be from visible table */ public void performHiddenTableDragOver(DropTargetEvent event) { if (!TextTransfer.getInstance().isSupportedType(event.currentDataType)) { event.detail = DND.DROP_NONE; return; } // Only allow drag from visibleColTable if (event.widget != xViewerCustomizeDialog.visibleColTable) { return; } event.detail = DND.DROP_MOVE; } @SuppressWarnings("unchecked") public void performHiddenTableTextDrop(DropTargetEvent event) { String droppedIds = (String) event.data; List<XViewerColumn> droppedVisibleTableXCols = new ArrayList<XViewerColumn>(); List<XViewerColumn> orderCols = (List<XViewerColumn>) xViewerCustomizeDialog.visibleColTable.getViewer().getInput(); for (XViewerColumn xCol : orderCols) { if (droppedIds.contains(xCol.getId())) { droppedVisibleTableXCols.add(xCol); } } xViewerCustomizeDialog.moveFromVisibleToHidden(droppedVisibleTableXCols); } DragSourceAdapter visibleTableDragListener = new DragSourceAdapter() { @Override public void dragStart(DragSourceEvent event) { if (xViewerCustomizeDialog.visibleColTable.getViewer().getSelection().isEmpty()) { event.doit = false; } } /* * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent) */ @Override public void dragSetData(DragSourceEvent event) { if (TextTransfer.getInstance().isSupportedType(event.dataType)) { List<XViewerColumn> selCols = xViewerCustomizeDialog.getVisibleTableSelection(); Collection<String> ids = new ArrayList<String>(selCols.size()); for (XViewerColumn xCol : selCols) { ids.add(xCol.getId()); } event.data = CollectionsUtil.toString(ids, null, ", ", null); //$NON-NLS-1$ } } }; DropTargetAdapter visibleTableDropListener = new DropTargetAdapter() { @Override public void dragOperationChanged(DropTargetEvent event) { // do nothing } @Override public void drop(DropTargetEvent event) { if (event.data instanceof String) { performVisibleTableTextDrop(event); } } @Override public void dragOver(DropTargetEvent event) { performVisibleTableDragOver(event); } @Override public void dropAccept(DropTargetEvent event) { // do nothing } }; @SuppressWarnings("unchecked") public void performVisibleTableTextDrop(DropTargetEvent event) { Tree tree = xViewerCustomizeDialog.visibleColTable.getViewer().getTree(); TreeItem dragOverTreeItem = tree.getItem(xViewerCustomizeDialog.visibleColTable.getViewer().getTree().toControl(event.x, event.y)); String droppedIds = (String) event.data; // Determine dragOverXCol, if any XViewerColumn dragOverXCol = null; if (dragOverTreeItem != null) { dragOverXCol = (XViewerColumn) dragOverTreeItem.getData(); // Don't allow dropping on same item as dragging if (droppedIds.contains(dragOverXCol.getId())) { return; } } List<XViewerColumn> droppedXCols = new ArrayList<XViewerColumn>(); List<XViewerColumn> orderCols = (List<XViewerColumn>) xViewerCustomizeDialog.visibleColTable.getViewer().getInput(); for (XViewerColumn xCol : orderCols) { if (droppedIds.contains(xCol.getId())) { droppedXCols.add(xCol); } } for (XViewerColumn xCol : (List<XViewerColumn>) xViewerCustomizeDialog.hiddenColTable.getViewer().getInput()) { if (droppedIds.contains(xCol.getId())) { droppedXCols.add(xCol); } } orderCols.removeAll(droppedXCols); int dropXColOrderColsIndex = 0; for (XViewerColumn xCol : (List<XViewerColumn>) xViewerCustomizeDialog.visibleColTable.getViewer().getInput()) { if (dragOverXCol != null && xCol.getId().equals(dragOverXCol.getId())) { break; } dropXColOrderColsIndex++; } if (xViewerCustomizeDialog.isFeedbackAfter) { orderCols.addAll(dropXColOrderColsIndex + 1, droppedXCols); } else { orderCols.addAll(dropXColOrderColsIndex, droppedXCols); } xViewerCustomizeDialog.visibleColTable.getViewer().setInput(orderCols); List<XViewerColumn> hiddenCols = (List<XViewerColumn>) xViewerCustomizeDialog.hiddenColTable.getViewer().getInput(); hiddenCols.removeAll(droppedXCols); xViewerCustomizeDialog.hiddenColTable.getViewer().setInput(hiddenCols); } public void performVisibleTableDragOver(DropTargetEvent event) { if (!TextTransfer.getInstance().isSupportedType(event.currentDataType)) { event.detail = DND.DROP_NONE; return; } Tree tree = xViewerCustomizeDialog.visibleColTable.getViewer().getTree(); TreeItem dragOverTreeItem = tree.getItem(xViewerCustomizeDialog.visibleColTable.getViewer().getTree().toControl(event.x, event.y)); if (dragOverTreeItem == null) { return; } event.feedback = DND.FEEDBACK_EXPAND; event.detail = DND.DROP_NONE; IStructuredSelection selectedItem = (IStructuredSelection) xViewerCustomizeDialog.visibleColTable.getViewer().getSelection(); if (selectedItem == null || selectedItem.isEmpty()) { selectedItem = (IStructuredSelection) xViewerCustomizeDialog.hiddenColTable.getViewer().getSelection(); } if (selectedItem == null) { return; } Object obj = selectedItem.getFirstElement(); if (obj instanceof XViewerColumn) { if (xViewerCustomizeDialog.isFeedbackAfter) { event.feedback = DND.FEEDBACK_INSERT_AFTER; } else { event.feedback = DND.FEEDBACK_INSERT_BEFORE; } event.detail = DND.DROP_MOVE; } } }