Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » JFace » Drop problem with ListViewer
Drop problem with ListViewer [message #545606] Thu, 08 July 2010 12:20 Go to next message
No real name is currently offline No real nameFriend
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 Wink

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 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
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();
> }
> }
>
Re: Drop problem with ListViewer [message #545627 is a reply to message #545612] Thu, 08 July 2010 13:22 Go to previous message
No real name is currently offline No real nameFriend
Messages: 2
Registered: July 2010
Junior Member
Thank you for your quick reply and explanation!
Previous Topic:textExtent resets FontMetrics in 3.6.0
Next Topic:Cell editor with StyledText
Goto Forum:
  


Current Time: Fri Apr 19 03:30:10 GMT 2024

Powered by FUDForum. Page generated in 0.02723 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top