Re: Drag and drop replacement command(s)? Solved

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: Drag and drop replacement command(s)? Solved

4D Tech mailing list
Hi all.
If you have no need (or interest) in my replacement for 4D’s Drag and Drop command, stop reading now :-).

I have (like many others no doubt) developed alternative method calls to replace the obsolete 4D command _O_DRAG AND DROP PROPERTIES, and include the calls/code below in case someone else has problems coming up with a solution.
I was able to simply drop the new calls into the draggable list boxes on many forms quite easily.
I have simplified some bits in this email and, hopefully, didn’t mess it up.

Some sub-calls re objects use Cannon Smith’s Object Module calls (OBJ_xxx) but all can be replaced with native 4D code easily (I use them out of habit).

If you can see something I’ve screwed up or missed, please let me know.
Cheers, Keith

==========================
Form object call sequence
-----------------------------------
Given 2 listboxes side by side (A and B), that are able to drag/drop in either direction:
Both have events enabled for
- On Begin Drag Over
- On Drag Over
- On Drop

==========================
Listbox A method:

C_LONGINT($0)
C_LONGINT($Source_Element_l)
Case of
        // ********************************************************************************
        : (Form event code=On Begin Drag Over)
                OnDrag_Begin
               
                  //********************************************************************************
        : (Form event code=On Drag Over)  //this object has been dragged
                $0:=OnDrag_DragOver (->LSTBX_B_ab)  //pointer to allowed target listbox variable
               
                  //********************************************************************************
        : (Form event code=On Drop)  //Trap drop from Export Fields (removing an Export field)
                $Source_Element_l:=OnDrag_Drop (->LSTBX_B_ab)  //pointer to allowed target listbox variable
                If ($Source_Element_l>0)
                        //Do something
                End if
End case

==========================
Listbox B method:

C_LONGINT($0)
C_LONGINT($Source_Element_l)
Case of
        // ********************************************************************************
        : (Form event code=On Begin Drag Over)
                OnDrag_Begin
               
                  //********************************************************************************
        : (Form event code=On Drag Over)  //this object has been dragged
                $0:=OnDrag_DragOver (->LSTBX_A_ab)  //pointer to allowed target listbox variable
               
                  //********************************************************************************
        : (Form event code=On Drop)  //Trap drop from Export Fields (removing an Export field)
                $Source_Element_l:=OnDrag_Drop (->LSTBX_A_ab)  //pointer to allowed target listbox variable
                If ($Source_Element_l>0)
                        //Do something
                End if
End case

==========================
  // OnDrag_Begin  

  // Action: Centralised On Begin Drag Over handling for array based listboxes.
  // Created for 4D v18 upgrade
  // Created by Keith Goebel on 17/09/2020

If (False)  //Example calls for On Drag events to/from array based listboxes.
        OnDrag_Begin
       
          //$0:=OnDrag_DragOver (->LSTBX_MBR_Select_2_ab)  //pointer to allowed target listbox variable
       
        C_LONGINT($Source_Element_l)
        $Source_Element_l:=OnDrag_Drop (->LSTBX_MBR_Select_2_ab)  //pointer to allowed target listbox variable
        If ($Source_Element_l>0)
                  //do something
        End if
End if

  // ********************************************************************************
  // Declare local vars
C_TEXT($DragSourceName_t)
C_LONGINT($Column_Nb_l)
C_LONGINT($Row_Nb_l)
C_POINTER($Source_Object_p)
C_OBJECT($OBJ_o)

  //********************************************************************************
CLEAR PASTEBOARD  //clear special Drag and Drop 4D pasteboard
  // --------------------------------------------------------------------
  //Store name of current listbox variable and dragged row number
$Source_Object_p:=OBJECT Get pointer(Object current)
LISTBOX GET CELL POSITION($Source_Object_p->;$Column_Nb_l;$Row_Nb_l)
If ($Row_Nb_l>0)
        $OBJ_o:=OBJ_Create
                //subcall creates the object using Cannon Smith’s Object Module
        $DragSourceName_t:=OBJ_Get_Object_Name ($Source_Object_p;0)
                //subcall returns the pointed-to variable's name
        OBJ_Set_Text ($OBJ_o;"Source_Object";$DragSourceName_t)
                //subcall stores the text in the object using Cannon Smith’s Object Module
        OBJ_Set_Long ($OBJ_o;"Source_Element";$Row_Nb_l)
                //subcall stores the longint in the object using Cannon Smith’s Object Module
        SET TEXT TO PASTEBOARD(JSON Stringify($OBJ_o))
Else
          //do nothing
End if
  // EOM


==========================
  // OnDrag_DragOver  

  // $1   Pointer     Pointer to the required source listbox variable.
  // $0   Longint    Returns
  //                       0 = drag can continue
  //                      -1 = drag rejected

  // Action: Centralised On Drag Over handling for array based listboxes.
  // Created for 4D v18 upgrade
  // Created by Keith Goebel on 17/09/2020

If (False)  //Example calls for On Drag events to/from array based listboxes.
        OnDrag_Begin
       
          //$0:=OnDrag_DragOver (->LSTBX_MBR_Select_2_ab)  //pointer to allowed target listbox variable
       
        C_LONGINT($Source_Element_l)
        $Source_Element_l:=OnDrag_Drop (->LSTBX_MBR_Select_2_ab)  //pointer to allowed target listbox variable
        If ($Source_Element_l>0)
                  //do something
        End if
End if

  // ********************************************************************************
  // Declare and Init parameters
C_POINTER($1;$Source_Check_p)
C_LONGINT($0)
$Source_Check_p:=$1
  // ------------------------------------------------------------------
  // Declare local vars
C_TEXT($PasteBoard_t)
C_TEXT($DragSourceName_t)
C_POINTER($Source_Object_p)
C_OBJECT($OBJ_o)

  //********************************************************************************
$PasteBoard_t:=Get text from pasteboard  //get special Drag and Drop 4D pasteboard contents
If (Length($PasteBoard_t)>0)  //for protection against empty pastboard for some reason (prevents 4D crash)
        $OBJ_o:=JSON Parse(Get text from pasteboard)
        $DragSourceName_t:=OBJ_Get_Text ($OBJ_o;"Source_Object”)
                //subcall gets the text from the object using Cannon Smith’s Object Module
        $Source_Object_p:=Get pointer($DragSourceName_t)
        If (Not(Is nil pointer($Source_Object_p)))
                If ($Source_Object_p=($Source_Check_p))
                        $0:=0
                Else
                        $0:=-1
                End if
        Else
                  //how did we get here?
                $0:=-1  //error
        End if
End if
  // EOM


==========================
  // OnDrag_Drop  

  // $1   Pointer     Pointer to the required source listbox variable.
  // $0   Longint    Returns the dragged row niumber.

  // Action: Centralised On Drop handling for array based listboxes.
  // Created for 4D v18 upgrade
  // Created by Keith Goebel on 17/09/2020

If (False)  //Example calls for On Drag events to/from array based listboxes.
        OnDrag_Begin
       
          //$0:=OnDrag_DragOver (->LSTBX_MBR_Select_2_ab)  //pointer to allowed target listbox variable
       
        C_LONGINT($Source_Element_l)
        $Source_Element_l:=OnDrag_Drop (->LSTBX_MBR_Select_2_ab)  //pointer to allowed target listbox variable
        If ($Source_Element_l>0)
                  //do something
        End if
End if

  //********************************************************************************
  // Declare and Init parameters
C_POINTER($1;$Source_Check_p)
C_LONGINT($0;$Source_Element_l)
$Source_Check_p:=$1
  // ------------------------------------------------------------------
  // Declare local vars
C_TEXT($PasteBoard_t)
C_TEXT($DragSourceName_t)  //All added for 4D v18 upgrade
C_POINTER($Source_Object_p)
C_OBJECT($OBJ_o)

  //********************************************************************************
$PasteBoard_t:=Get text from pasteboard  //get special Drag and Drop 4D pasteboard contents
If (Length($PasteBoard_t)>0)  //for protection against empty pastboard for some reason
        $OBJ_o:=JSON Parse($PasteBoard_t)
        $DragSourceName_t:=OBJ_Get_Text ($OBJ_o;"Source_Object")
                //subcall gets the text from the object using Cannon Smith’s Object Module
        $Source_Object_p:=Get pointer($DragSourceName_t)
        If (Not(Is nil pointer($Source_Object_p)))
                If ($Source_Object_p=($Source_Check_p))
                        $Source_Element_l:=OBJ_Get_Long ($OBJ_o;"Source_Element”)
                                //subcall gets the longint from the object using Cannon Smith’s Object Module
                End if
        End if
End if
$0:=$Source_Element_l
  // EOM


**********************************************************************
4D Internet Users Group (4D iNUG)
New Forum: https://discuss.4D.com
Archive:  http://lists.4d.com/archives.html
Options: https://lists.4d.com/mailman/options/4d_tech
Unsub:  mailto:[hidden email]
**********************************************************************
Reply | Threaded
Open this post in threaded view
|

Re: Drag and drop replacement command(s)? Solved

4D Tech mailing list
Have just realised I pressed send before thanking all those who supplied me with examples of how to go about the replacement.
So, to you all, I thank you.
Cheers, Keith

**********************************************************************
4D Internet Users Group (4D iNUG)
New Forum: https://discuss.4D.com
Archive:  http://lists.4d.com/archives.html
Options: https://lists.4d.com/mailman/options/4d_tech
Unsub:  mailto:[hidden email]
**********************************************************************