Drop problem with ListViewer [message #545606] |
Thu, 08 July 2010 12:20 |
No real name Messages: 2 Registered: July 2010 |
Junior Member |
|
|
Hi,
I'm currently facing some problems regarding a ListViewer and DnD for which I haven't been able to find a solution or explanation so far.
I'd like to be able to re-order the list elements using drag and drop (which perfectly works fine when used in a TreeViewer), but unfortunately, the drop target is always null, so I have no information about where the user dragged the currently selected item to.
Does ListViewer support this usecase? Is there any option other than using a one-column grid?
If this scenario should work, then please see my code snippet below and feel free to correct any errors
Thank you in advance!
import java.util.Vector;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DnDTest {
Display display = new Display();
Shell shell = new Shell(display);
ListViewer listViewer;
public static class Item {
public String name;
public Item(String name) {
this.name = name;
}
@Override
public String toString() {
return "Item: " + name;
}
}
Vector<Item> items = new Vector<Item>();
private void init() {
for (int i = 0; i < 6; i++) {
items.add(new Item("foo" + i));
}
listViewer = new ListViewer(shell, SWT.SINGLE);
listViewer.setContentProvider(new IStructuredContentProvider()
{
public Object[] getElements(Object inputElement)
{
Vector v = (Vector) inputElement;
return v.toArray();
}
@Override
public void dispose()
{
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
}
});
listViewer.setInput(items);
addDragAndDropSupport();
}
public void addDragAndDropSupport() {
listViewer.addDragSupport(DND.DROP_MOVE,
new Transfer[] { LocalSelectionTransfer.getTransfer() },
new DragSourceAdapter()
{
@Override
public void dragStart(final DragSourceEvent event)
{
}
});
listViewer.addDropSupport(DND.DROP_MOVE,
new Transfer[] { LocalSelectionTransfer.getTransfer() },
new ViewerDropAdapter(listViewer)
{
@Override
public boolean performDrop(final Object data)
{
return true;
}
@Override
public boolean validateDrop(Object target, int operation,
TransferData transferType)
{
if (target != null)
{
System.out.println("target != null");
return true;
}
else
{
System.out.println("target == null");
return false;
}
}
});
}
public DnDTest() {
FillLayout layout = new FillLayout();
shell.setLayout(layout);
init();
shell.setBounds(100, 100, 300, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public static void main(String[] args) {
new DnDTest();
}
}
|
|
|
Re: Drop problem with ListViewer [message #545612 is a reply to message #545606] |
Thu, 08 July 2010 12:33 |
Thomas Schindl Messages: 6651 Registered: July 2009 |
Senior Member |
|
|
SWT-List are not Item based so this is not possible. You are better of
using a TableViewer without any columns which is Item based.
Tom
Am 08.07.10 14:20, schrieb bernd.stuebinger@jcom1.com:
> Hi,
>
> I'm currently facing some problems regarding a ListViewer and DnD for
> which I haven't been able to find a solution or explanation so far.
>
> I'd like to be able to re-order the list elements using drag and drop
> (which perfectly works fine when used in a TreeViewer), but
> unfortunately, the drop target is always null, so I have no information
> about where the user dragged the currently selected item to.
>
> Does ListViewer support this usecase? Is there any option other than
> using a one-column grid?
>
> If this scenario should work, then please see my code snippet below and
> feel free to correct any errors ;)
>
> Thank you in advance!
>
>
>
> import java.util.Vector;
> import org.eclipse.jface.util.LocalSelectionTransfer;
> import org.eclipse.jface.viewers.IStructuredContentProvider;
> import org.eclipse.jface.viewers.ListViewer;
> import org.eclipse.jface.viewers.Viewer;
> import org.eclipse.jface.viewers.ViewerDropAdapter;
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.dnd.DND;
> import org.eclipse.swt.dnd.DragSourceAdapter;
> import org.eclipse.swt.dnd.DragSourceEvent;
> import org.eclipse.swt.dnd.Transfer;
> import org.eclipse.swt.dnd.TransferData;
> import org.eclipse.swt.layout.FillLayout;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Shell;
>
> public class DnDTest {
> Display display = new Display();
> Shell shell = new Shell(display);
>
> ListViewer listViewer;
>
> public static class Item {
> public String name;
>
> public Item(String name) {
> this.name = name;
> }
>
> @Override
> public String toString() {
> return "Item: " + name;
> }
> }
>
> Vector<Item> items = new Vector<Item>();
>
> private void init() {
> for (int i = 0; i < 6; i++) {
> items.add(new Item("foo" + i));
> }
>
> listViewer = new ListViewer(shell, SWT.SINGLE);
>
> listViewer.setContentProvider(new IStructuredContentProvider()
> {
> public Object[] getElements(Object inputElement)
> {
> Vector v = (Vector) inputElement;
> return v.toArray();
> }
>
> @Override
> public void dispose()
> {
> }
>
> @Override
> public void inputChanged(Viewer viewer, Object oldInput, Object
> newInput)
> {
> }
> });
>
> listViewer.setInput(items);
>
> addDragAndDropSupport();
> }
>
> public void addDragAndDropSupport() {
> listViewer.addDragSupport(DND.DROP_MOVE,
> new Transfer[] { LocalSelectionTransfer.getTransfer() },
> new DragSourceAdapter()
> {
> @Override
> public void dragStart(final DragSourceEvent event)
> {
> }
> });
>
> listViewer.addDropSupport(DND.DROP_MOVE,
> new Transfer[] { LocalSelectionTransfer.getTransfer() },
> new ViewerDropAdapter(listViewer)
> {
> @Override
> public boolean performDrop(final Object data)
> {
> return true;
> }
>
> @Override
> public boolean validateDrop(Object target, int operation,
> TransferData transferType)
> {
> if (target != null)
> {
> System.out.println("target != null");
> return true;
> }
> else
> {
> System.out.println("target == null");
> return false;
> }
> }
> });
> }
>
> public DnDTest() {
> FillLayout layout = new FillLayout();
> shell.setLayout(layout);
>
> init();
>
> shell.setBounds(100, 100, 300, 200);
> shell.open();
>
> while (!shell.isDisposed()) {
> if (!display.readAndDispatch()) {
> display.sleep();
> }
> }
>
> display.dispose();
> }
>
> public static void main(String[] args) {
> new DnDTest();
> }
> }
>
|
|
|
|
Powered by
FUDForum. Page generated in 0.07767 seconds