Skip to content

Instantly share code, notes, and snippets.

@marcphilipp
Created September 18, 2011 12:07
Show Gist options
  • Save marcphilipp/1225023 to your computer and use it in GitHub Desktop.
Save marcphilipp/1225023 to your computer and use it in GitHub Desktop.
SWT Tree Drag and Drop
package de.marcphilipp.dnd.model;
public class Eintrag {
private final String description;
private Gruppe gruppe;
public Eintrag(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public Gruppe getGruppe() {
return gruppe;
}
public void setGruppe(Gruppe gruppe) {
this.gruppe = gruppe;
}
public void resetGruppe() {
gruppe = null;
}
@Override
public String toString() {
return description;
}
}
package de.marcphilipp.dnd.model;
import static java.util.Collections.unmodifiableList;
import java.util.ArrayList;
import java.util.List;
public class Gruppe {
private final String name;
private List<Eintrag> eintraege = new ArrayList<Eintrag>();
public Gruppe(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void addEintrag(Eintrag eintrag) {
Gruppe alteGruppe = eintrag.getGruppe();
if (alteGruppe != null) {
alteGruppe.removeEintrag(eintrag);
}
eintraege.add(eintrag);
eintrag.setGruppe(this);
}
private void removeEintrag(Eintrag eintrag) {
eintraege.remove(eintrag);
eintrag.resetGruppe();
}
@Override
public String toString() {
return name;
}
public List<Eintrag> getEintraege() {
return unmodifiableList(eintraege);
}
public void addEintraege(Iterable<Eintrag> eintraege) {
for (Eintrag eintrag : eintraege) {
addEintrag(eintrag);
}
}
}
package de.marcphilipp.dnd.model;
import java.util.ArrayList;
import java.util.List;
public enum Model {
INSTANCE;
List<Gruppe> gruppen = new ArrayList<Gruppe>();
private Model() {
Gruppe gruppe1 = new Gruppe("Gruppe 1");
gruppe1.addEintrag(new Eintrag("short"));
gruppen.add(gruppe1);
Gruppe gruppe2 = new Gruppe("Gruppe 2");
gruppe2.addEintrag(new Eintrag("short2"));
gruppen.add(gruppe2);
}
public List<Gruppe> getModel(){
return gruppen;
}
}
package de.marcphilipp.dnd.view;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
public class MyDragListener extends DragSourceAdapter {
private final ISelectionProvider selectionProvider;
public MyDragListener(ISelectionProvider selectionProvider) {
this.selectionProvider = selectionProvider;
}
@Override
public void dragSetData(DragSourceEvent event) {
IStructuredSelection selection = (IStructuredSelection) selectionProvider
.getSelection();
LocalSelectionTransfer transfer = LocalSelectionTransfer.getTransfer();
if (transfer.isSupportedType(event.dataType)) {
transfer.setSelection(selection);
transfer.setSelectionSetTime(event.time & 0xFFFF);
}
}
}
package de.marcphilipp.dnd.view;
import java.util.List;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.dnd.TransferData;
import de.marcphilipp.dnd.model.Eintrag;
import de.marcphilipp.dnd.model.Gruppe;
public class MyDropListener extends ViewerDropAdapter {
public MyDropListener(Viewer viewer) {
super(viewer);
}
@Override
public boolean validateDrop(Object target, int operation,
TransferData transferType) {
return getCurrentLocation() == LOCATION_ON
&& target instanceof Gruppe
&& LocalSelectionTransfer.getTransfer().isSupportedType(
transferType);
}
@Override
public boolean performDrop(Object data) {
List<Eintrag> eintraege = ermittleEintraege();
Gruppe gruppe = (Gruppe) getCurrentTarget();
gruppe.addEintraege(eintraege);
getViewer().refresh();
return true;
}
@SuppressWarnings("unchecked")
private List<Eintrag> ermittleEintraege() {
LocalSelectionTransfer transfer = LocalSelectionTransfer.getTransfer();
IStructuredSelection selection = (IStructuredSelection) transfer.getSelection();
return (List<Eintrag>) selection.toList();
}
}
package de.marcphilipp.dnd.view;
import java.util.List;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import de.marcphilipp.dnd.model.Eintrag;
import de.marcphilipp.dnd.model.Gruppe;
public class TreeContentProvider implements ITreeContentProvider {
@Override
public Object[] getChildren(Object parentElement) {
return ((Gruppe) parentElement).getEintraege().toArray();
}
@Override
public Object getParent(Object element) {
return ((Eintrag)element).getGruppe();
}
@Override
public boolean hasChildren(Object element) {
return element instanceof Gruppe;
}
@Override
public Object[] getElements(Object inputElement) {
List<?> list = (List<?>) inputElement;
return list.toArray();
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
package de.marcphilipp.dnd.view;
import static org.eclipse.swt.dnd.DND.DROP_MOVE;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import de.marcphilipp.dnd.model.Model;
public class TreeView extends ViewPart {
@Override
public void createPartControl(Composite parent) {
TreeViewer viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
Transfer[] transferTypes = { LocalSelectionTransfer.getTransfer() };
viewer.addDragSupport(DROP_MOVE, transferTypes, new MyDragListener(
viewer));
viewer.addDropSupport(DROP_MOVE, transferTypes, new MyDropListener(
viewer));
viewer.setContentProvider(new TreeContentProvider());
viewer.setInput(Model.INSTANCE.getModel());
}
@Override
public void setFocus() {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment