[163987] XML outline expects DND data too early
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
index ce87173..ea8ac30 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -18,17 +18,24 @@
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.util.TransferDragSourceListener;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.wst.common.ui.internal.dnd.ObjectTransfer;
-import org.eclipse.wst.common.ui.internal.dnd.ViewerDragAdapter;
-import org.eclipse.wst.common.ui.internal.dnd.ViewerDropAdapter;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.wst.common.ui.internal.dnd.DragAndDropCommand;
import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
import org.eclipse.wst.dtd.ui.internal.DTDUIPlugin;
import org.eclipse.wst.dtd.ui.internal.dnd.DTDDragAndDropManager;
@@ -146,83 +153,6 @@
/*
* (non-Javadoc)
*
- * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDragSourceListeners(org.eclipse.jface.viewers.TreeViewer)
- */
- public TransferDragSourceListener[] getTransferDragSourceListeners(TreeViewer treeViewer) {
- if (fTransferDragSourceListeners == null) {
- // emulate the XMLDragAndDropManager
- final ViewerDragAdapter dragAdapter = new ViewerDragAdapter(treeViewer);
- fTransferDragSourceListeners = new TransferDragSourceListener[]{new TransferDragSourceListener() {
- public void dragFinished(DragSourceEvent event) {
- dragAdapter.dragFinished(event);
- }
-
- public void dragSetData(DragSourceEvent event) {
- dragAdapter.dragSetData(event);
- }
-
- public void dragStart(DragSourceEvent event) {
- dragAdapter.dragStart(event);
- }
-
- public Transfer getTransfer() {
- return ObjectTransfer.getInstance();
- }
- }};
- }
-
- return fTransferDragSourceListeners;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
- */
- public TransferDropTargetListener[] getTransferDropTargetListeners(TreeViewer treeViewer) {
- if (fTransferDropTargetListeners == null) {
- // emulate the XMLDragAnDropManager
- final ViewerDropAdapter dropAdapter = new ViewerDropAdapter(treeViewer, new DTDDragAndDropManager());
- fTransferDropTargetListeners = new TransferDropTargetListener[]{new TransferDropTargetListener() {
- public void dragEnter(DropTargetEvent event) {
- dropAdapter.dragEnter(event);
- }
-
- public void dragLeave(DropTargetEvent event) {
- dropAdapter.dragLeave(event);
- }
-
- public void dragOperationChanged(DropTargetEvent event) {
- dropAdapter.dragOperationChanged(event);
- }
-
- public void dragOver(DropTargetEvent event) {
- dropAdapter.dragOver(event);
- }
-
- public void drop(DropTargetEvent event) {
- dropAdapter.drop(event);
- }
-
- public void dropAccept(DropTargetEvent event) {
- dropAdapter.dropAccept(event);
- }
-
- public Transfer getTransfer() {
- return ObjectTransfer.getInstance();
- }
-
- public boolean isEnabled(DropTargetEvent event) {
- return getTransfer().isSupportedType(event.currentDataType);
- }
- }};
- }
- return fTransferDropTargetListeners;
- }
-
- /*
- * (non-Javadoc)
- *
* @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#unconfigure(org.eclipse.jface.viewers.TreeViewer)
*/
public void unconfigure(TreeViewer viewer) {
@@ -233,4 +163,121 @@
fMenuHelper = null;
}
}
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDragSourceListeners(org.eclipse.jface.viewers.TreeViewer)
+ */
+ public TransferDragSourceListener[] getTransferDragSourceListeners(final TreeViewer treeViewer) {
+ if (fTransferDragSourceListeners == null) {
+ fTransferDragSourceListeners = new TransferDragSourceListener[]{new TransferDragSourceListener() {
+ public void dragFinished(DragSourceEvent event) {
+ LocalSelectionTransfer.getTransfer().setSelection(null);
+ }
+
+ public void dragSetData(DragSourceEvent event) {
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ LocalSelectionTransfer.getTransfer().setSelection(treeViewer.getSelection());
+ }
+
+ public Transfer getTransfer() {
+ return LocalSelectionTransfer.getTransfer();
+ }
+ }};
+ }
+
+ return fTransferDragSourceListeners;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
+ */
+ public TransferDropTargetListener[] getTransferDropTargetListeners(final TreeViewer treeViewer) {
+ if (fTransferDropTargetListeners == null) {
+ fTransferDropTargetListeners = new TransferDropTargetListener[]{new TransferDropTargetListener() {
+ public void dragEnter(DropTargetEvent event) {
+ event.operations = DND.DROP_COPY | DND.DROP_MOVE;
+ }
+
+ public void dragLeave(DropTargetEvent event) {
+ }
+
+ public void dragOperationChanged(DropTargetEvent event) {
+ }
+
+ public void dragOver(DropTargetEvent event) {
+ event.feedback = DND.FEEDBACK_SELECT;
+ float feedbackFloat = getHeightInItem(event);
+ if (feedbackFloat > 0.75) {
+ event.feedback = DND.FEEDBACK_INSERT_AFTER;
+ }
+ else if (feedbackFloat < 0.25) {
+ event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+ }
+ event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
+ }
+
+ public void drop(DropTargetEvent event) {
+ if (event.operations != DND.DROP_NONE && LocalSelectionTransfer.getTransfer().getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+ if (selection != null && !selection.isEmpty() && event.item != null && event.item.getData() != null) {
+ /*
+ * the command uses these numbers instead of the
+ * feedback constants (even though it converts in
+ * the other direction as well)
+ */
+ float feedbackFloat = getHeightInItem(event);
+
+ final DragAndDropCommand command = new DTDDragAndDropManager().createCommand(event.item.getData(), feedbackFloat, event.operations, event.detail, selection.toList());
+ if (command != null && command.canExecute()) {
+ SafeRunnable.run(new SafeRunnable() {
+ public void run() throws Exception {
+ command.execute();
+ }
+ });
+ }
+ }
+ }
+ }
+
+ public void dropAccept(DropTargetEvent event) {
+ }
+
+ private float getHeightInItem(DropTargetEvent event) {
+ if(event.item == null) return .5f;
+ if (event.item instanceof TreeItem) {
+ TreeItem treeItem = (TreeItem) event.item;
+ Control control = treeItem.getParent();
+ Point point = control.toControl(new Point(event.x, event.y));
+ Rectangle bounds = treeItem.getBounds();
+ return (float) (point.y - bounds.y) / (float) bounds.height;
+ }
+ else if (event.item instanceof TableItem) {
+ TableItem tableItem = (TableItem) event.item;
+ Control control = tableItem.getParent();
+ Point point = control.toControl(new Point(event.x, event.y));
+ Rectangle bounds = tableItem.getBounds(0);
+ return (float) (point.y - bounds.y) / (float) bounds.height;
+ }
+ else {
+ return 0.0F;
+ }
+ }
+
+ public Transfer getTransfer() {
+ return LocalSelectionTransfer.getTransfer();
+ }
+
+ public boolean isEnabled(DropTargetEvent event) {
+ return getTransfer().isSupportedType(event.currentDataType);
+ }
+ }};
+ }
+ return fTransferDropTargetListeners;
+ }
}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java
index ab4b531..8e31f81 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentoutline/ConfigurableContentOutlinePage.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -92,7 +92,7 @@
* Provides double-click registration so it can be done before the Control
* is created.
*/
- private class DoubleClickProvider implements IDoubleClickListener {
+ class DoubleClickProvider implements IDoubleClickListener {
private IDoubleClickListener[] listeners = null;
void addDoubleClickListener(IDoubleClickListener newListener) {
@@ -359,9 +359,9 @@
}
fDragAdapter = new DelegatingDragAdapter();
- fDragSource = new DragSource(getControl(), DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK);
+ fDragSource = new DragSource(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
fDropAdapter = new DelegatingDropAdapter();
- fDropTarget = new DropTarget(getControl(), DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK);
+ fDropTarget = new DropTarget(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
setConfiguration(getConfiguration());
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java
index 912a8df..14d094b 100644
--- a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java
+++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLTableTreeViewer.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2004 IBM Corporation and others. All rights reserved. This
+ * Copyright (c) 2004, 2007 IBM Corporation and others. All rights reserved. This
* program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and
* is available at http://www.eclipse.org/legal/epl-v10.html
@@ -13,20 +13,36 @@
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.eclipse.wst.xml.ui.internal.actions.NodeAction;
import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
-import org.eclipse.wst.xml.ui.internal.dnd.XMLDragAndDropManager;
+import org.eclipse.wst.xml.ui.internal.dnd.DragNodeCommand;
import org.w3c.dom.Document;
public class XMLTableTreeViewer extends TreeViewer implements IDesignViewer {
@@ -66,7 +82,13 @@
createContextMenu();
- XMLDragAndDropManager.addDragAndDropSupport(this);
+ DragSource dragSource = new DragSource(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
+ dragSource.addDragListener(createDragSourceListener());
+ dragSource.setTransfer(new Transfer[] {LocalSelectionTransfer.getTransfer()});
+
+ DropTarget dropTarget = new DropTarget(getControl(), DND.DROP_COPY | DND.DROP_MOVE);
+ dropTarget.addDropListener(createDropTargetListener());
+ dropTarget.setTransfer(new Transfer[] {LocalSelectionTransfer.getTransfer()});
}
/**
@@ -149,4 +171,91 @@
}
+ private DragSourceListener createDragSourceListener() {
+ return new DragSourceListener() {
+ public void dragFinished(DragSourceEvent event) {
+ LocalSelectionTransfer.getTransfer().setSelection(null);
+ }
+
+ public void dragSetData(DragSourceEvent event) {
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ LocalSelectionTransfer.getTransfer().setSelection(getSelection());
+ }
+ };
+ }
+
+ private DropTargetListener createDropTargetListener() {
+ return new DropTargetListener() {
+ public void dragEnter(DropTargetEvent event) {
+ }
+
+ public void dragLeave(DropTargetEvent event) {
+ }
+
+ public void dragOperationChanged(DropTargetEvent event) {
+ }
+
+ public void drop(DropTargetEvent event) {
+ if (event.operations != DND.DROP_NONE && LocalSelectionTransfer.getTransfer().getSelection() instanceof IStructuredSelection) {
+ dragOver(event);
+ IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+ if (selection != null && !selection.isEmpty() && event.item != null && event.item.getData() != null) {
+ /*
+ * the command uses these numbers instead of the
+ * feedback constants (even though it converts in
+ * the other direction as well)
+ */
+ float feedbackFloat = getHeightInItem(event);
+
+ final DragNodeCommand command = new DragNodeCommand(event.item.getData(), feedbackFloat, event.operations, event.detail, selection.toList(), XMLTableTreeViewer.this);
+ if (command != null && command.canExecute()) {
+ SafeRunnable.run(new SafeRunnable() {
+ public void run() throws Exception {
+ command.execute();
+ }
+ });
+ }
+ }
+ }
+ }
+
+ public void dropAccept(DropTargetEvent event) {
+ }
+
+ public void dragOver(DropTargetEvent event) {
+ event.feedback = DND.FEEDBACK_SELECT;
+ float feedbackFloat = getHeightInItem(event);
+ if (feedbackFloat > 0.75) {
+ event.feedback = DND.FEEDBACK_INSERT_AFTER;
+ }
+ else if (feedbackFloat < 0.25) {
+ event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+ }
+ event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
+ }
+
+ private float getHeightInItem(DropTargetEvent event) {
+ if(event.item == null) return .5f;
+ if (event.item instanceof TreeItem) {
+ TreeItem treeItem = (TreeItem) event.item;
+ Control control = treeItem.getParent();
+ Point point = control.toControl(new Point(event.x, event.y));
+ Rectangle bounds = treeItem.getBounds();
+ return (float) (point.y - bounds.y) / (float) bounds.height;
+ }
+ else if (event.item instanceof TableItem) {
+ TableItem tableItem = (TableItem) event.item;
+ Control control = tableItem.getParent();
+ Point point = control.toControl(new Point(event.x, event.y));
+ Rectangle bounds = tableItem.getBounds(0);
+ return (float) (point.y - bounds.y) / (float) bounds.height;
+ }
+ else {
+ return 0.0F;
+ }
+ }
+ };
+ }
}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java
index 6c37951..b4be68a 100644
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/views/contentoutline/XMLContentOutlineConfiguration.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2001, 2005 IBM Corporation and others.
+ * Copyright (c) 2001, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -16,6 +16,8 @@
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.util.TransferDragSourceListener;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.jface.viewers.IContentProvider;
@@ -24,12 +26,15 @@
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.wst.common.ui.internal.dnd.ObjectTransfer;
-import org.eclipse.wst.common.ui.internal.dnd.ViewerDragAdapter;
-import org.eclipse.wst.common.ui.internal.dnd.ViewerDropAdapter;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.eclipse.wst.sse.ui.internal.IReleasable;
@@ -48,7 +53,7 @@
import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeContentProvider;
import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
-import org.eclipse.wst.xml.ui.internal.dnd.XMLDragAndDropManager;
+import org.eclipse.wst.xml.ui.internal.dnd.DragNodeCommand;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
@@ -386,68 +391,109 @@
*
* @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDragSourceListeners(org.eclipse.jface.viewers.TreeViewer)
*/
- public TransferDragSourceListener[] getTransferDragSourceListeners(TreeViewer treeViewer) {
+ public TransferDragSourceListener[] getTransferDragSourceListeners(final TreeViewer treeViewer) {
if (fTransferDragSourceListeners == null) {
- // emulate the XMLDragAndDropManager
- final ViewerDragAdapter dragAdapter = new ViewerDragAdapter(treeViewer);
fTransferDragSourceListeners = new TransferDragSourceListener[]{new TransferDragSourceListener() {
+
public void dragFinished(DragSourceEvent event) {
- dragAdapter.dragFinished(event);
+ LocalSelectionTransfer.getTransfer().setSelection(null);
}
public void dragSetData(DragSourceEvent event) {
- dragAdapter.dragSetData(event);
}
public void dragStart(DragSourceEvent event) {
- dragAdapter.dragStart(event);
+ LocalSelectionTransfer.getTransfer().setSelection(treeViewer.getSelection());
}
public Transfer getTransfer() {
- return ObjectTransfer.getInstance();
+ return LocalSelectionTransfer.getTransfer();
}
}};
}
return fTransferDragSourceListeners;
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
- */
- public TransferDropTargetListener[] getTransferDropTargetListeners(TreeViewer treeViewer) {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getTransferDropTargetListeners(org.eclipse.jface.viewers.TreeViewer)
+ */
+ public TransferDropTargetListener[] getTransferDropTargetListeners(final TreeViewer treeViewer) {
if (fTransferDropTargetListeners == null) {
- // emulate the XMLDragAnDropManager
- final ViewerDropAdapter dropAdapter = new ViewerDropAdapter(treeViewer, new XMLDragAndDropManager());
fTransferDropTargetListeners = new TransferDropTargetListener[]{new TransferDropTargetListener() {
public void dragEnter(DropTargetEvent event) {
- dropAdapter.dragEnter(event);
}
public void dragLeave(DropTargetEvent event) {
- dropAdapter.dragLeave(event);
}
public void dragOperationChanged(DropTargetEvent event) {
- dropAdapter.dragOperationChanged(event);
}
public void dragOver(DropTargetEvent event) {
- dropAdapter.dragOver(event);
+ event.feedback = DND.FEEDBACK_SELECT;
+ float feedbackFloat = getHeightInItem(event);
+ if (feedbackFloat > 0.75) {
+ event.feedback = DND.FEEDBACK_INSERT_AFTER;
+ }
+ else if (feedbackFloat < 0.25) {
+ event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+ }
+ event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
}
public void drop(DropTargetEvent event) {
- dropAdapter.drop(event);
+ if (event.operations != DND.DROP_NONE && LocalSelectionTransfer.getTransfer().getSelection() != null && !LocalSelectionTransfer.getTransfer().getSelection().isEmpty()) {
+ IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+ if (selection != null && !selection.isEmpty() && event.item != null && event.item.getData() != null) {
+ /*
+ * the command uses these numbers instead of the
+ * feedback constants (even though it converts in
+ * the other direction as well)
+ */
+ float feedbackFloat = getHeightInItem(event);
+
+ final DragNodeCommand command = new DragNodeCommand(event.item.getData(), feedbackFloat, event.operations, event.detail, selection.toList(), treeViewer);
+ if (command != null && command.canExecute()) {
+ SafeRunnable.run(new SafeRunnable() {
+ public void run() throws Exception {
+ command.execute();
+ }
+ });
+ }
+ }
+ }
}
public void dropAccept(DropTargetEvent event) {
- dropAdapter.dropAccept(event);
+ }
+
+ private float getHeightInItem(DropTargetEvent event) {
+ if (event.item == null)
+ return .5f;
+ if (event.item instanceof TreeItem) {
+ TreeItem treeItem = (TreeItem) event.item;
+ Control control = treeItem.getParent();
+ Point point = control.toControl(new Point(event.x, event.y));
+ Rectangle bounds = treeItem.getBounds();
+ return (float) (point.y - bounds.y) / (float) bounds.height;
+ }
+ else if (event.item instanceof TableItem) {
+ TableItem tableItem = (TableItem) event.item;
+ Control control = tableItem.getParent();
+ Point point = control.toControl(new Point(event.x, event.y));
+ Rectangle bounds = tableItem.getBounds(0);
+ return (float) (point.y - bounds.y) / (float) bounds.height;
+ }
+ else {
+ return 0.0F;
+ }
}
public Transfer getTransfer() {
- return ObjectTransfer.getInstance();
+ return LocalSelectionTransfer.getTransfer();
}
public boolean isEnabled(DropTargetEvent event) {