Page 1 of 1

Drag'n'Drop Tree

PostPosted: Wed Apr 23, 2014 12:40 pm
by manfrede
Hi!

Ich stehe gerade vor der Herausforderung Nodes in einem Tree zu verschieben (reorganisieren).
Gleich vorweg, es soll nur ein selfjoined-Databook zur Anwendung kommen, da das mit eigenen Databooks pro Level etwas wenig Sinn machen würde, schließlich sollen die Nodes über mehrere Ebenen hinweg verschoben werden können.

Prinzipiell ist das GUI-technisch gesehen kein Problem, weder in Swing noch in Vaadin (in den restlichen Technologien wirds wohl auch so sein).
Auch datentechnisch nicht herausfordernd, es wären nur die Vorgänger-Keys anzupassen.

Das einzige Problem vor dem ich stehe ist ja nur folgendes: In einem selfjoined-Databook liegen die Nodes pro Level in einer eigenen DataPage. Würde ich nun eine Node verschieben, müsste ich die Daten von dem Storage-Array der Datapage A entfernen, und in die Storage der Datapage B einfügen. Mit Sicherheit ist auch noch auf die Reihenfolge innerhalb der betroffenen Storages zu achten, da diese danach nicht mehr mit den Treepaths zusammenstimmen.
Leider ist die nötige API teilweise nicht vorhanden, zum größten Teil jedoch protected.

Meine Vorgehensweise wäre nun folgende gewesen:

  • Eine eigene Databook Implementierung mit eigenen Datapages, welches die API zum Verschieben bereitstellt (nennen wirs mal VolatileDataBook). Dieses Databook stellt damit einen Wrapper dar und kann nur mit einem IDataBook sowie mit einem ColumnMapping instanziert werden. Im Databook selbst befinden sich keinerlei Daten, alle Abfragen, Änderungen etc. werden (dem Treepath entsprechend) auf das OriginalDataBook umgeleitet.
  • Ein eigener UITree, welcher nur ein VolatileDataBook als Quelle annimmt und auf dieses die entsprechenden Operationen ausführt.

Nun meine Frage, habe ich mir das zu einfach vorgestellt?
Gibt es für diesen Anwendungsfall bereits etwas im JVx-Framework?

Re: Drag'n'Drop Tree

PostPosted: Wed Apr 23, 2014 12:56 pm
by Support@SIB
Das Verschieben von Datensätzen in einem SelfJoined - DataBook zu einem anderen Master funktioniert ganz einfach.

Beispiel:
Tabelle mit Spalten : ID, TEXT, PARENT_ID
Daten:
1, Master1, null
2, Master2, null
3, Detail, 1

Wird diese Tabelle als WritebackTable gesetzt, erhält man sogar automatisch eine zusätzliche Spalte "PARENT_TEXT" mit Auswahlliste zum Ändern des Masters.

Das Detail kann man nun ganz einfach umhängen:

Code: Select all
dataBook.setValue("PARENT_ID", "2");
dataBook.saveSelectedRow();


Die Zeile wird automatisch in die richtige DataPage verschoben.

Re: Drag'n'Drop Tree

PostPosted: Wed Apr 23, 2014 1:27 pm
by manfrede
Hab ich mir offensichtlich wieder mal viel komplizierter vorgestellt. :D

Da das verschieben in die richtigen DataPages erst in
Code: Select all
dataBook.saveSelectedRow();
geschieht, wie sieht es aus wenn der WriteBackIsolationLevel gesetzt ist:
Code: Select all
databook.setWritebackIsolationLevel(WriteBackIsolationLevel.DATASOURCE);


Hier würde ja tatsächlich bereits bis in die Datenbank gespeichert. Kann man das anderweitig umgehen?

Im Prinzip soll der Benutzer solange verschieben bis er entweder abbricht, oder bestätigt (saveAllRows).

Re: Drag'n'Drop Tree

PostPosted: Wed Apr 23, 2014 4:09 pm
by Support@SIB
Im Falle von WriteBackIsolationLevel.DATASOURCE ist das Ganze etwas komplizierter, aber nicht unmöglich.

Am Besten man legt einen Listener an:
Code: Select all
  dataBook.eventValuesChanged("PARENT_ID").addListener(this, "doMasterKeyChanged");


Code: Select all
public void doMasterKeyChanged() throws Exception
{
  dataBook.setWritebackEnabled(false);
  dataBook.saveSelectedRow(); 
  dataBook.setWriteBackEnabled(true);
  dataBook.update(); // Zeile updating markieren, damit saveAllRows speichert.
}


Bei Abbrechen hilft dann natürlich ein restoreAllRows nichts. Ein einfaches
Code: Select all
dataBook.reload();

stellt aber den ursprüngliche Zustand wieder her.

Re: Drag'n'Drop Tree

PostPosted: Thu Apr 24, 2014 9:02 am
by manfrede
Sieht vielversprechend aus, werd ich ausprobieren.
Danke!