/
Drag and Drop

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

  1. Open the Profound UI Visual Designer, start with a new display file and name the record formatĀ SFLCTL1Ā .

    Ā 

  2. Add an empty panel labeledĀ Drag and DropĀ .

    Ā 

  3. Add an exit button labeledĀ ExitĀ bound to an indicator namedĀ BTNEXIT.

    Ā 

  4. Add two single column subfiles with output fields as shown below.

    Ā 

  5. Set the id of the first subfile toĀ Grid1Ā and the second subfile toĀ Grid2.

    Ā 

  6. Set theĀ record format nameĀ of the first subfile (Ā Grid1Ā ) toĀ SFLAĀ and the second subfile (Ā Grid2Ā ) toĀ SFLBĀ .

    Ā 

  7. Add an output field to each subfileĀ  bound toĀ FIELDAĀ andĀ FIELDBĀ respectively. These fields areĀ 20AĀ .

    Ā 

  8. Bind an indicator namedĀ SFLCLRĀ to theĀ clear subfileĀ property of both subfiles. (The same indicator can be used with both subfiles.)

    Ā 

  9. For both subfiles, set the properties as shown:

    Ā 

    Ā 

  10. Select theĀ SFTCTL1Ā record format and bind the following fields to the properties shown:

    Ā 

  11. Save the display file asĀ DRAGDĀ and compile it to your library.

    Ā 

  12. 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

Property Name

Promptable

Possible Values

Bindable?

Available In

Allow Drag

āŒ (DROPDOWN)

true or false

āœ…

Profound UI

Use Proxy

āŒ (DROPDOWN)

true or false

āœ…

Profound UI

Drop Targets

āœ…

Comma Delimited List of Element IDs

āœ…

Profound UI

OnDragStart

āœ…

Any Valid JavaScript

āŒ

Profound UI

OnDragEnter

āœ…

Any Valid JavaScript

āŒ

Profound UI

OnDragLeave

āœ…

Any Valid JavaScript

āŒ

Profound UI

OnDrop

āœ…

Any Valid JavaScript

āŒ

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: