TreeViewer Drag&Drop Sortierung

Heavenfighter

Grünschnabel
Hallo,


ich habe einen TreeViewer dem ich die Drag&Drop Funktionalität hinzugefügt habe.
Jetzt ist mir ein kleines Problem aufgefallen. Und zwar egal wo hin ich ein Element verschiebe, es wird immer am Ende der Zielebene eingefügt und nie dazwischen.

Beispiel:

  • Element 1
  • Element 2
  • Element 3
  • Element 4

Wenn ich nun Element 1 zwischen 3 und 4 verschiebe, wird es mit immer hinter der 4 angelegt.
Mein Code dazu sieht so aus:
Code:
public boolean performDrop(Object data)
    {
        MegaMenuItem target = (MegaMenuItem) getCurrentTarget();

        if (target != null)
        {
            int loc = getCurrentLocation();

            if (loc == LOCATION_BEFORE || loc == LOCATION_AFTER)
                target = target.getParent();
        }

        if (target == null)
            target = (MegaMenuItem) getViewer().getInput();

        
        MegaMenuItem[] toDrop = (MegaMenuItem[]) data;
        TreeViewer viewer = (TreeViewer) getViewer();

        // cannot drop a gadget onto itself or a child
        for (int i = 0; i < toDrop.length; i++)
            if (toDrop[i].equals(target) || target.hasParent(toDrop[i]))
                return false;
        
        for (int i = 0; i < toDrop.length; i++)
        {
            toDrop[i].setParent(target);
            viewer.add(target, toDrop[i]);
            viewer.reveal(toDrop[i]);
            
        }

        return true;
    }

Kann mir jemand sagen wo hier der Fehler liegt?
 
Du hängst das Ganze an den Elternknoten ran, und da wird nun mal standardmäßig unten rangefügt.

Du müsstest entweder deinen Baum sortieren, oder das Model für den Baum sortieren und dann den Baum neu aufbauen.
 
Hmm ok, leuchtet ein.

Wie könnte ich das denn realisieren, das mein Datenmodell umsortiert wird?
Denn beim Drop bekomm ich ja ebend keine genaue Postion im Tree heraus, sondern nur die ebene.

Ich hatte schon versucht es nach dem Schema zu lösen:

Durchlaufe die Targetebene und schaue ob du beim CurrentTarget bist.
Dann erhöe oder verringere den Durchlaufindex und versuche ein
Code:
viewer.insert(target, toDrop[i], index);

Das hatte aber auch keinen Effekt.
 
Zurück