Created
September 18, 2011 12:07
-
-
Save marcphilipp/1225023 to your computer and use it in GitHub Desktop.
SWT Tree Drag and Drop
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) { | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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