Understanding drag & drop
This is an introduction to drag & drop programming.
Drag & drop is a well-known feature of graphical applications, allowing the end user to use the mouse to drag an element of a window to another window in the same program or into an external application. The front-end platform/device must support this feature.
This feature is not supported on mobile platforms.
Drag & drop can be implemented in regular tables and tree-views controlled by a singular
DISPLAY ARRAY
or a DISPLAY ARRAY
sub-dialog within a
DIALOG
instruction. Drag & drop is not supported in other dialog contexts,
such as a singular INPUT
, INPUT ARRAY
or
CONSTRUCT
.
With drag & drop, end users can:
- Move drag-able objects between lists and tree-views in the same Genero form or program.
- Move drag-able objects between lists and tree-views in different Genero forms and programs.
- Move drag-able objects between other desktop applications and tables / tree-views in Genero programs.
Drag & drop control is implemented in a DISPLAY ARRAY
with specific
interaction blocks, to handle the events related to the drag and drop operation. These specific
blocks will be triggered when drag and drop events arrive from the front-end.
Each of these interaction blocks takes an ui.DragDrop
object as a parameter. A
reference variable to that object must be declared before the dialog. In the interaction block, the
ui.DragDrop
object can be used to configure the drag & drop action to take. For
example, a "drag enter" event can be refused.
The ON DRAG_START
and ON DRAG_FINISHED
triggers apply to the
source of the drag & drop operation; the dialog where the object was dragged. The other triggers
provide notification to the drop target dialog, used to inform the program when the different drop
events occur and to let the target accept or reject the drop action.
ui.DragDrop
control object:DEFINE dnd ui.DragDrop
...
DISPLAY ARRAY arr TO sr.* ...
...
ON DRAG_ENTER(dnd)
IF ok_to_drop THEN
CALL dnd.setOperation("move")
ELSE
CALL dnd.setOperation(NULL)
END IF
...
END DISPLAY