
Mit Drag&Drop kann ein Benutzer Einträge eines UI-Elements markieren oder View-Elemente selber anfassen (Quelle), weg ziehen und auf ein anderes View Element (Ziel) fallen lassen. Quelle und Ziel können dabei das gleiche View-Element oder zwei unterschiedliche View-Elemente sein.
In Web Dynpro können nur bestimmte UI-Elemente als Quelle bzw. Ziel einer Drag&Drop-Operation verwendet werden.
Um die Barrierefreiheit Ihrer Anwendung zu gewährleisten, implementieren Sie zusätzlich die Möglichkeit, eine Aufgabe auch ohne Drag&Drop durchzuführen.
Vorgehen aus Sicht des Benutzers
Die Drag&Drop Funktionalität stellt sich für den Benutzer folgendermaßen dar:
Der Benutzer zieht ein UI-Element, z.B. ein Image, Zeilen einer Table, Knoten eines Tree oder Einträge einer ItemListBox, mit gedrückter Maustaste.
Während der Benutzer die Maustaste gedrückt hält, wird auf dem Bildschirm ein "Geisterbild", also eine Kopie der gezogenene Objekte angezeigt, das den Bewegungen des Maus-Cursor folgt. Wenn der Benutzer den Mauszeiger über ein UI-Element bewegt, auf das man das gezogene Objekt fallen lassen kann, wird dies entweder durch eine gepunktete Box (z.B. MatrixLayout), eine Einfügelinie zwischen Zeilen (z.B. Table) oder durch Aufleuchten (z.B. Tabellenzeilen) dargestellt. Ansonsten zeigt der Mauszeiger ein Verbotsschild an. Ein View-Element oder deren Einträge kann auf ein Zielobjekt fallen gelassen werden, wenn für letzteres eine DropTargetInfo definiert ist (siehe unten) und mindestens ein tags von Ziel und Quelle übereinstimmen. Wenn der Benutzer das Objekt fallen lässt, wird der onDrop-Event des Ziels ausgelöst.
Der Anwendungsentwickler muss dafür sorgen, dass daraufhin die entsprechenden Daten verschoben oder kopiert werden bzw. dass die entsprechenden Aktionen ausgeführt werden.
Vorgehen des Entwicklers
Das Web-Dynpro-ABAP-Framework stellt für Drag&Drop die Visualisierung zur Verfügung. Funktionalität wie das Vertauschen, Umsortieren, Einfügen oder Löschen von Einträgen muss von der Anwendung programmiert werden.
Gehen Sie für die Implementierung von Drag&Drop folgendermaßen vor:
Um eine Drag-Quelle zu definieren, fügen Sie eine DragSourceInfo an das jeweilige View-Element an.
Um ein Drop-Ziel zu definieren, fügen Sie eine DropTargetInfo an das jeweilige View-Element an.
Um festzulegen, welche Drag-Quelle auf welche Drag-Ziele gezogen werden kann, geben Sie den gleichen String (Namensgleichheit!) bei der Eigenschaft tags der jeweiligen DragSourceInfo und DropTargetInfo an.
Sie können auch mehrere tags verwenden, wobei Sie die tags durch Leerzeichen voneinander trennen.
Bei den Angaben für tags wird zwischen Groß- und Kleinschreibung unterschieden. Es ist möglich, einen Stern ( *) als Wildcard am Ende des tags in der DropTargetInfo zu verwenden, z.B. grid*.
Die folgenden Zeichen dürfen Sie nicht verwenden:
Doppelpunkt ( :)
Komma ( ,)
Semikolon ( ;)
Backslash ( \)
Slash ( /)
Punkt ( .)
Mit dieser Eigenschaft können Sie eigene Entwicklungsstandards festlegen. Achten Sie als Software-Architekt darauf, welche tags Sie verwenden und wie Sie sie designen.
Sie setzen einen Action-Handler für das onDrop-Event des Ziels.
Datentransport
Der Datentransport wird über die Eigenschaft DragSourceInfo.data realisiert: Beim Drop wird ein Event getriggert und DragSourceInfo.data als Event-Parameter dataübergeben. Gegebenenfalls werden zusätzliche Informationen als Event-Parameter übergeben, z.B. die Einfügeposition.
Beachten Sie, dass die Daten nicht nachgeladen werden, sondern vor der Drag-Aktion vorhanden sein müssen.
Da die Daten über den Client transportiert werden, dürfen keine sicherheitskritischen Daten und auch keine großen Daten in der data-Eigenschaft sein. Die Werte für data sollten eher eine Art Referenz auf die eigentlichen Daten sein.
Für die Drop-Aktionen gilt analog: Es sollte immer geprüft werden, ob die Drop-Aktion erlaubt ist, ähnlich wie die Eingabeprüfung zu einem InputField.
Gültigkeitsbereich
Der Gültigkeitsbereich der DragSourceInfo wird über die Eigenschaft DragSourceInfo.scope bestimmt. Sie haben die Möglichkeiten, dass die DragSourceInfo entweder nur innerhalb der Component oder über Component-Grenzen hinaus verwendet wird.
Weitere Informationen finden Sie unter DragSourceInfo-Eigenschaften.
Drag&Drop steht für folgende UI-Elemente zur Verfügung:
|
UI-Element |
Aktion |
|---|---|
|
Accordion |
Im Accordion sind zwei Arten von Drag&Drop möglich:
Um dieses Verhalten zu testen, steht im System die Component WDR_TEST_ACCORDION zur Verfügung. |
|
CTable |
Informationen finden Sie unter Drag&Drop in der CTable. |
|
GridLayout MatrixLayout |
Im GridLayout und MatrixLayout können einzelne Zellen dieses Layouts verschoben werden, bzw. Objekte zwischen Zellen eingefügt werden. Drag&Drop ist nur bei einem einspaltigen GridLayout möglich. Im MatrixLayout ist Drag&Drop nur zeilenweise möglich. Beispiel
Für Drag&Drop in Layouts benötigen Sie Ereignisse und Aggregationen. Gehen Sie folgendermaßen vor:
|
|
Image |
Ein Bild kann verschoben werden, indem man es selektiert und zieht. |
|
ItemListBox |
Einträge können verschoben werden, indem man sie selektiert (Mehrfachselektion mit SHIFT+Mausklick) und zieht. In einer ItemListBox können auch an bestimmten Stellen Objekte eingefügt werden:
In einer leeren ItemListBox gibt es nur eine mögliche Einfügeposition (erste = letzte Position). |
|
PanelStack |
Beim PanelStack sind zwei Arten von Drag&Drop möglich:
|
|
Table |
Einzelne Tabellenzeilen können verschoben werden. In einer Table können auch an bestimmten Stellen Objekte eingefügt werden:
In einer leeren Table gibt es nur eine mögliche Einfügeposition (erste = letzte Position). Das Droppen auf Zeilen ist ebenfalls möglich. Weitere Informationen finden Sie unter Drag&Drop bei der Table. |
|
Tree |
Einzelne Knoten und Blätter können verschoben werden. In einen Tree können auch an bestimmten Stellen Objekte fallen gelassen werden:
Die Auswahl mehrerer Knoten für Drag&Drop ist nur dann möglich, wenn die Knoten mindestens ein tags gemeinsam haben. In einem leeren Tree gibt es nur eine mögliche Einfügeposition (erste = letzte Position). |
Folgende UI-Elemente sind essentiell für die Drag&Drop-Operation:
|
UI-Element |
Beschreibung |
|---|---|
|
DropTarget |
DropTarget ist das Ziel einer Drag&Drop-Operation. Es legt fest, wo ein per Drag&Drop bewegtes UI-Element fallen gelassen werden kann. Weitere Informationen finden Sie unter DropTarget |
WDR_TEST_DRAG_AND_DROP
Im System steht die Test-Component WDR_TEST_DRAG_AND_DROP zur Verfügung. Folgende Einsatz-Szenarien für Drag&Drop werden demonstriert:
Browse&Collect
Hier wählt ein Benutzer einen oder mehrere Einträge aus und zieht sie an eine bestimmte Position auf einem anderen UI-Element. Dadurch werden Daten entweder verschoben oder kopiert. Für alle Zeilen wird die gleiche DragSourceInfo verwendet. Überall, wo ein DropTargetInfo definiert ist, können Einträge hinein kommen.
Browse&Collect steht für die folgenden UI-Elemente zur Verfügung:
Die folgende Grafik stellt Browse&Collect am Beispiel der ItemListBox dar:
Generisches Drag&Drop
Der Benutzer zieht ein UI-Element fort und lässt es auf ein DropTarget fallen. Hierfür können Image, GridLayout und MatrixLayout verwendet werden. In diesem Fall wird ein DropTarget als verschalendes UI-Element verwendet.
Die folgende Grafik stellt das generische Drag&Drop am Beispiel
Laufzeit-Authoring
Sie können die folgenden UI-Elemente als Drag-Handle (Eigenschaft isDragHandle) definieren, um verschiedene Bildschirmbereiche neu zu sortieren. Die folgenden UI-Elemente können auf diese Art verschoben werden:
Beachten Sie, dass Sie die Ausprogrammierung der Funktionalität selbst vornehmen müssen.