Drag and Drop
Ā
This example exercise is meant to show how to create a display file capable ofĀ drag and dropĀ betweenĀ subfiles.
Example Steps
Open the Profound UI Visual Designer, start with a new display file and name the record formatĀ
SFLCTL1
Ā .Ā
Add an empty panel labeledĀ
Drag and Drop
Ā .Ā
Add an exit button labeledĀ
Exit
Ā bound to an indicator namedĀBTNEXIT
.Ā
Add two single column subfiles with output fields as shown below.
Ā
Set the id of the first subfile toĀ
Grid1
Ā and the second subfile toĀGrid2
.Ā
Set theĀ
record format name
Ā of the first subfile (ĀGrid1
Ā ) toĀSFLA
Ā and the second subfile (ĀGrid2
Ā ) toĀSFLBĀ
.Ā
Add an output field to each subfileĀ bound toĀ
FIELDA
Ā andĀFIELDB
Ā respectively. These fields areĀ20A
Ā .Ā
Bind an indicator namedĀ
SFLCLR
Ā to theĀclear subfile
Ā property of both subfiles. (The same indicator can be used with both subfiles.)Ā
For both subfiles, set the properties as shown:
Ā
Ā
Select theĀ
SFTCTL1
Ā record format and bind the following fields to the properties shown:Ā
Save the display file asĀ
DRAGD
Ā and compile it to your library.Ā
Compile the code below into yourĀ
QRPGLESRC
. A file is attached here to import into your library:Ā DRAGR.RPGLE.Ā H DFTACTGRP(*NO) * FDRAGD CF E WorkStn Handler('PROFOUNDUI(HANDLER)') F SFile(SFLA : RRNA) F SFILE(SFLB : RRNB) D RRNA S 5I 0 D RRNB S 5I 0 D ArrayA S 20A DIM(100) D CountA S 5I 0 D ArrayB S 20A DIM(100) D CountB S 5I 0 D RemoveItem PR D rm_ARRAY 20A DIM(100) D rm_Index 5I 0 CONST D InsertItem PR D in_ARRAY 20A DIM(100) D in_Index 5I 0 CONST D in_Value 20A CONST D in_Count 5I 0 D ClearEmpty PR D cl_ARRAY 20A DIM(100) D cl_Count 5I 0 D Item S 20A /FREE ArrayA(1) = 'Red'; ArrayA(2) = 'Green'; ArrayA(3) = 'Mouse'; ArrayA(4) = 'Dog'; ArrayA(5) = 'Kangaroo'; ArrayA(6) = 'Ant'; ArrayA(7) = 'Purple'; ArrayA(8) = 'White'; ArrayA(9) = 'Cat'; ArrayA(10) = 'Camel'; ArrayA(11) = 'Horse'; CountA = 11; ArrayB(1) = 'Orange'; ArrayB(2) = 'Gound Hog'; ArrayB(3) = 'Yellow'; ArrayB(4) = 'Black'; ArrayB(5) = 'Hog'; CountB = 5; Dou BTNEXIT = *On; // Clear the subfiles. SFLCLR= *On; Write SFLCTL1; SFLCLR= *Off; // Load subfile A with Array A FOR RRNA = 1 TO CountA; FIELDA = ArrayA(RRNA); WRITE SFLA; ENDFOR; // Load subfile B with Array B FOR RRNB = 1 TO CountB; FIELDB = ArrayB(RRNB); WRITE SFLB; ENDFOR; // Display the subfile. ExFmt SFLCTL1; If BTNEXIT = *Off; If DragFromId = 'Grid1' And DragToId = 'Grid1'; Chain DragFromRN SFLA; RemoveItem(ArrayA : DragFromRN); InsertItem(ArrayA : DragToRN : FIELDA : CountA); ENDIF; If DragFromId = 'Grid1' And DragToId = 'Grid2'; Chain DragFromRN SFLA; RemoveItem(ArrayA : DragFromRN); InsertItem(ArrayB : DragToRN : FIELDA : CountB); ENDIF; If DragFromId = 'Grid2' And DragToId = 'Grid2'; Chain DragFromRN SFLB; RemoveItem(ArrayB : DragFromRN); InsertItem(ArrayB : DragToRN : FIELDB : CountB); ENDIF; If DragFromId = 'Grid2' And DragToId = 'Grid1'; Chain DragFromRN SFLB; RemoveItem(ArrayB : DragFromRN); InsertItem(ArrayA : DragToRN : FIELDB : CountA); ENDIF; ClearEmpty(ArrayA : CountA); ClearEmpty(ArrayB : CountB); EndIf; // end if exit = off. EndDo; *InLr = *On; Return; /END-FREE P RemoveItem B D RemoveItem PI D rm_ARRAY 20A DIM(100) D rm_Index 5I 0 CONST /FREE rm_ARRAY(rm_Index) = 'EMPTYEMPTY'; return; /END-FREE P RemoveItem E P InsertItem B D InsertItem PI D in_ARRAY 20A DIM(100) D in_Index 5I 0 CONST D in_Value 20A CONST D in_Count 5I 0 D I s 5I 0 D Index s like(in_Index) /FREE Index = in_Index + 1; * Shift each element from the end of the array forward, starting from * the end and working backward to the destination index spot. for i = in_Count downto Index; in_ARRAY(i+1) = in_ARRAY(i); ENDFOR; * The destination spot gets the parameter value. in_ARRAY(Index) = in_Value; * Increment the size of the array (how many elements are filled). in_Count+=1; return; /END-FREE P InsertItem E P ClearEmpty B D ClearEmpty PI D cl_ARRAY 20A DIM(100) D cl_Count 5I 0 D lookIndex s 5I 0 D i s 5I 0 /FREE lookIndex = %lookup('EMPTYEMPTY':cl_ARRAY); if lookIndex > 0; for i = lookIndex to cl_Count; cl_ARRAY(i) = cl_ARRAY(i+1); ENDFOR; cl_Count-=1; ENDIF; return; /END-FREE P ClearEmpty E
The important piece of code is shown below.
If BTNEXIT = *Off; If DragFromId = 'Grid1' And DragToId = 'Grid1'; Chain DragFromRN SFLA; RemoveItem(ArrayA : DragFromRN); InsertItem(ArrayA : DragToRN : FIELDA : CountA); ENDIF; If DragFromId = 'Grid1' And DragToId = 'Grid2'; Chain DragFromRN SFLA; RemoveItem(ArrayA : DragFromRN); InsertItem(ArrayB : DragToRN : FIELDA : CountB); ENDIF; If DragFromId = 'Grid2' And DragToId = 'Grid2'; Chain DragFromRN SFLB; RemoveItem(ArrayB : DragFromRN); InsertItem(ArrayB : DragToRN : FIELDB : CountB); ENDIF; If DragFromId = 'Grid2' And DragToId = 'Grid1'; Chain DragFromRN SFLB; RemoveItem(ArrayB : DragFromRN); InsertItem(ArrayA : DragToRN : FIELDB : CountA); ENDIF;
Using the data taken fromĀ
DragFromId
Ā andĀDragToId
, we can determine the subfile that the item was taken from, and where it was dropped. Then using theĀRemoveItem()
Ā andĀInsertItem()
Ā sub procedures included in the code, we can then remove the item from the original subfile and insert it into the correct position on the new subfile.
Properties
Property Name | Promptable | Possible Values | Bindable? | Available In |
---|---|---|---|---|
Allow Drag | ā (DROPDOWN) |
| ā | Profound UI |
Use Proxy | ā (DROPDOWN) |
| ā | Profound UI |
Drop Targets | ā |
| ā | Profound UI |
OnDragStart | ā |
| ā | Profound UI |
OnDragEnter | ā |
| ā | Profound UI |
OnDragLeave | ā |
| ā | Profound UI |
OnDrop | ā |
| ā | Profound UI |
Global JavaScript Object: pui.dragDropInfo
TheĀ pui.dragDropInfo
Ā object contains information related to the drag and drop events. This object can be accessed in the eventsĀ OnDrop
,Ā OnDragLeave
,Ā OnDragStart
, andĀ OnDragEnterĀ
.
Properties and Usage
// The object contains many properties, but
// here are a few useful ones used as examples
// of how to retrieve the property value in
// JavaScript.
Ā
// Retrieve the element id of the selected
// subfile record.
var ddID = pui.dragDropInfo["dd element id"];
Ā
// Retrieve the relative record number of the
// selected element to drag/drop.
var ddRecNum = pui.dragDropInfo["dd record number"];
Ā
// Returns the target element id of the where
// the selection is to be dropped.
var targetID = pui.dragDropInfo["target element id"];
Ā
// Returns the relative record number of where
// the selection is after it has been dropped.
var targetRecNum = pui.dragDropInfo["target record number"];
Ā
// Log values to browser console to see values.
console.log(
"DD Element ID:", ddID,
"\nDD Element Record Number:", ddRecNum,
"\nDD Target Record Number:", targetID,
"\nDD Target Record Number:", targetRecNum
)
Customizing with CSS
As ofĀ Profound UI Version 5, Fix Pack 1.2
, the style of the drop target line can be set using custom CSS. By default a dashed, gray line appears to indicate drop target when you drag a grid item over a valid drop target:
You can change the default style by adding a CSS rule into a custom style sheet under theĀ /www/profoundui/htdocs/profoundui/userdata/custom/css/
Ā folder (whereĀ profounduiĀ
is the installation folder).
custom.css
The width of the line is 2 pixels, and the line color isĀ #CCCCCC
Ā by default. If the grid'sĀ border widthĀ property is set, then the border width overrides any custom CSS:
If the grid'sĀ border colorĀ property is set, then the border color overrides any custom CSS: