version 2003
PA_GetDragAndDropInfo (params) PA_DragAndDropInfo
| Parameter | Type | Description | |
| params | PA_PluginParameters | Parameters received in PluginMain | |
| Function result | PA_DragAndDropInfo | Information on the Drag/Droppped object |
Description
The routine PA_GetDragAndDropInfo returns a structure of type PA_DragAndDropInfo, which contains various information on the object being drag/dropped onto the area. This routine must be called when PA_GetAreaEvent returns eAE_Drop or eAE_AllowDrop. If it is called at another time, it does nothing, PA_GetLastError returns eER_BadEventCall, and, most importantly, the returned structure can contain garbage (the returned PA_DragAndDropInfo is not initialized to null values).
When the event is eAE_AllowDrop, the area can check the kind of object being dropped, and then allow or disallow the drop by calling PA_AllowDrop.
If the drag/drop is allowed and the user dropped the object, call PA_GetDragAndDropInfo again to retrieve its value.
The PA_DragAndDropInfo structure is defined in the "PublicTypes.h" header file, and this API contains its the main accessors (PA_GetDragAndDropKind, PA_GetDragAndDropVariable, PA_GetDragAndDropTableField).
typedef struct PA_DragAndDropInfo
{
char fReserved1[10];
long fToArrayIndice; // index of element when destination is an array
long fReserved2[2];
long fFromArrayIndex; // index of element when source is an array
short fFromProcess;
short fFromWhereV; // where user clicks at first
short fFromWhereH;
short fToWhereV; // where user release mouse button - _global_ coordinates
short fToWhereH;
long fReserved3;
char fVariableName[32]; // empty string or variable name if user drags a variable
char fInterProcess;
short fField;
short fTable; // zero or table name if user drags a field from a table
} PA_DragAndDropInfo;
NOTE
The routines "Drag and Drop" are internal to 4th Dimension. The developer cannot use them with other applications.
NOTE
The coordinates included in the structure referring to the screen are global. The area must convert them (ScreenToClient under Windows and GlobalToLocal under MacOS) if those coordinates are used by it later.
Examples
(1) See the sample in Drag and drop with a plug-in area.
(2) Allow drag and drop only if the object is a real array element.
/* . . . assume we are dispatching a PA_AreaEvent . . . */
case eAE_AllowDrop:
{
char allow = 0;
long index;
// get the drag-drop info
PA_GetDragAndDropInfo ddi = PA_GetDragDropInfo(params);
// if the object is a variable...
if( PA_GetDragAndDropKind(ddi) == eDK_DragVariable )
{
// ... of type array long integer...
if( PA_GetVariableKind(PA_GetDragAndDropVariable(params, &index)) == eVK_ArrayLongint )
// ... we accept it.
allow = 1;
}
PA_AllowDrop(params, allow);
}
break;
(3) Returns the process number owning the object.
long GetSourceProcessOfTheObject(PA_PluginParameters params)
{
PA_DragAndDropInfo ddi = PA_GetDragAndDropInfo(params);
if( PA_GetLastError() == eER_NoErr)
return ddi.fFromProcess;
else
return 0L.
}
See Also
Drag and drop with a plugin area, PA_AllowDrop, PA_CustomizeDragOver, PA_GetDragPositions.
Error Handling
Use PA_GetLastError to see if an error occurred (eER_BadEventCall)