Drag N Drop on a ListIconGadget

Share your advanced PureBasic knowledge/code with the community.
LJ
Enthusiast
Enthusiast
Posts: 177
Joined: Wed Apr 30, 2003 4:00 pm

Drag N Drop on a ListIconGadget

Post by LJ »

Code updated for 5.20+

Code: Select all

; German forum:
; Author: Freak (Timo Harter)
; Date: 17. December 2002
; English forum:
; Modified for use with ListIconGadget by Lance Jepsen
; Date: 15. July 2003

; --------------------------------------------------------------------------
; Drag'n' Drop mit TreeGadgets
; by Timo Harter
;
; Syntax:
; EnableDragDrop( #Gadget, DragMode, @DropProcedure() )
;
;
; DragMode : #Drag_LeftMouse 
;            #Drag_RightMouse
;
; @DropProcedure()

;            Procedure DropProcedure(X, Y, Button, Item)
;


#TVN_BEGINDRAG       = -407
#TVN_BEGINRDRAG      = -408
#TVS_DISABLEDRAGDROP = $10
#Drag_LeftMouse  = 1
#Drag_RightMouse = 2
#ListIcon = 3

Global hWndTV, DropProc, DragDropMode, hDragIml, DragItem

Procedure DragDropCallback(Window, Message, wParam, lParam)
  Protected DoDrag, DropX, DropY, hItem, hItem2, dItem
  result = #PB_ProcessPureBasicEvents
  Select Message
    Case #WM_NOTIFY
      *lp.NMHDR = lParam
      If *lp\code = #TVN_BEGINDRAG And (DragDropMode & #Drag_LeftMouse): DoDrag = #True: EndIf
      If *lp\code = #TVN_BEGINRDRAG And (DragDropMode & #Drag_RightMouse): DoDrag = #True: EndIf
      If DoDrag
        *pnmtv.NMTREEVIEW = lParam
        DragItem = *pnmtv\itemNew\hItem
        hDragIml = SendMessage_(hWndTV, #TVM_CREATEDRAGIMAGE, 0, DragItem)
        SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, #Null)
        ImageList_BeginDrag_(hDragIml, 0, 0, 0)
        ImageList_DragEnter_(GetParent_(hWndTV), 0, 0)
        ImageList_DragShowNolock_(#True)
        ImageList_DragLeave_(hWndTV)
        ShowCursor_(#False)
        SetCapture_(GetParent_(hWndTV))
        SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, DragItem)
      EndIf
    Case #WM_MOUSEMOVE
        If hDragIml
          DropX = PeekW(@lParam)
          DropY = PeekW(@lParam+2)
          ImageList_DragMove_(DropX, DropY+20)
          ImageList_DragShowNolock_(#False)
          ImageList_DragShowNolock_(#True)
        EndIf
    Case #WM_LBUTTONUP
        If hDragIml And (DragDropMode & #Drag_LeftMouse)
          ImageList_EndDrag_()
          ReleaseCapture_()
          ShowCursor_(#True)
          ImageList_Destroy_(hDragIml)
          hDragIml = #False
          dItem = 0
          hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
          While hItem <> DragItem
            hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
            Repeat
              If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
              If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
            Until hItem2 <> #Null
            hItem = hItem2
            dItem + 1
          Wend
          CallFunctionFast(DropProc, WindowMouseX(0), WindowMouseY(0), #Drag_LeftMouse, dItem)
        EndIf
    Case #WM_RBUTTONUP
        If hDragIml And (DragDropMode & #Drag_RightMouse)
          ImageList_EndDrag_()
          ReleaseCapture_()
          ShowCursor_(#True)
          ImageList_Destroy_(hDragIml)
          hDragIml = #False
          dItem = 0
          hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
          While hItem <> DragItem
            hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
            Repeat
              If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
              If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
            Until hItem2 <> #Null
            hItem = hItem2
            dItem + 1
          Wend
          CallFunctionFast(DropProc, WindowMouseX(0), WindowMouseY(0), #Drag_RightMouse, DragItem)         
        EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure EnableDragDrop(TVGadget, DragMode, DropProcedure)
  Protected Style, hIml
  hWndTV = GadgetID(TVGadget)
  DropProc = DropProcedure
  DragDropMode = DragMode
  Style = GetWindowLong_(hWndTV, #GWL_STYLE)
  Style = Style & (~#TVS_DISABLEDRAGDROP)
  SetWindowLong_(hWndTV, #GWL_STYLE, Style)
  If SendMessage_(hWndTV, #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0) = #Null
    hIml = ImageList_Create_(16,16,#ILC_COLOR8,0,999)
    SendMessage_(hWndTV, #TVM_SETIMAGELIST, #TVSIL_NORMAL, hIml)
  EndIf
  SetWindowCallback(@DragDropCallback())
  ProcedureReturn #True
EndProcedure

Procedure DropProcedure(X, Y, Button, Item)
If Button = #Drag_LeftMouse
  If x > 212 And x < 310
     If y > 45 And y < 273
     AddGadgetItem(#ListIcon,-1,"Item"+Str(Item))
     EndIf
  EndIf
EndIf

; Un-REM (take off ";") in lines below when you need to determine X and Y coordinates of drop
;  If Button = #Drag_LeftMouse
;    MessageRequester("Drag'n Drop","Item Number "+Str(Item)+" has been dropped at X:"+Str(X)+" Y:"+Str(Y)+" using left Button.",#MB_ICONINFORMATION)
;  Else
;    MessageRequester("Drag'n Drop","Item Number "+Str(Item)+" has been dropped at X:"+Str(X)+" Y:"+Str(Y)+" using right Button.",#MB_ICONINFORMATION)
;  EndIf
EndProcedure

#Tree = 1

OpenWindow(0, 0, 0, 640, 480, "Drag'n Drop", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

TreeGadget(#Tree, 5, 5, 150, 250)
hImg = LoadIcon_(0,#IDI_APPLICATION)
AddGadgetItem(#Tree, -1, "Item0", hImg, 0)
AddGadgetItem(#Tree, -1, "Item1", hImg, 0)
AddGadgetItem(#Tree, -1, "Item2", hImg, 1)
AddGadgetItem(#Tree, -1, "Item3", hImg, 1)

ListIconGadget(#ListIcon,250,5, 80, 250, "Item Dropped", 76)

EnableDragDrop(#Tree, #Drag_LeftMouse|#Drag_RightMouse, @DropProcedure())

While WaitWindowEvent() <> #PB_Event_CloseWindow: Wend
End
Hi-Toro
Enthusiast
Enthusiast
Posts: 269
Joined: Sat Apr 26, 2003 3:23 pm

Addition...

Post by Hi-Toro »

Nice -- I had to add this at the top to run it though:

Code: Select all


Structure TVITEM
    mask.l ; UINT
    hItem.l;HTREEITEM
    state.l ; UINT
    stateMask.l ; UINT
    pszText$ ; LPSTR
    cchTextMax.l
    iImage.l
    iSelectedImage.l
    cChildren.l
    lParam.l;LPARAM
EndStructure

Structure NMTREEVIEW
    hdr.NMHDR
    action.l ; UINT
    itemOld.TVITEM
    itemNew.TVITEM
    ptDrag.POINT
EndStructure
(Not sure about UINT -- is there any way to use unsigned integers in PB?)
James Boyd
http://www.hi-toro.com/
Death to the Pixies!
User avatar
Flype
Addict
Addict
Posts: 1542
Joined: Tue Jul 22, 2003 5:02 pm
Location: In a long distant galaxy

Post by Flype »

on my pb it's not needed to declare those structs :
Structure TVITEM
Structure NMTREEVIEW

anyway, it works very fine. That's a bit tricky but useful. And is it possible to let the user sort the element list by this method ?
No programming language is perfect. There is not even a single best language.
There are only languages well suited or perhaps poorly suited for particular purposes. Herbert Mayer
Hi-Toro
Enthusiast
Enthusiast
Posts: 269
Joined: Sat Apr 26, 2003 3:23 pm

Doh...

Post by Hi-Toro »

Doh! Just noticed I was still running 3.60! Downloading 3.72 now!
James Boyd
http://www.hi-toro.com/
Death to the Pixies!
LJ
Enthusiast
Enthusiast
Posts: 177
Joined: Wed Apr 30, 2003 4:00 pm

Sure

Post by LJ »

Greeting Flype. Sure it is possible to sort anyway you like. Here is an example.

Code: Select all

; German forum:
; Author: Freak (Timo Harter)
; Date: 17. December 2002
; Modified for use with ListGadget by Lance Jepsen
; Date: 15. July 2003

; --------------------------------------------------------------------------
; Drag'n' Drop mit TreeGadgets
; by Timo Harter
;
; Syntax:
; EnableDragDrop( #Gadget, DragMode, @DropProcedure() )
;
;
; DragMode : #Drag_LeftMouse  
;            #Drag_RightMouse
;
; @DropProcedure()

;            Procedure DropProcedure(X.l, Y.l, Button.l, Item.l)
;


#TVN_BEGINDRAG       = -407
#TVN_BEGINRDRAG      = -408
#TVS_DISABLEDRAGDROP = $10
#Drag_LeftMouse  = 1
#Drag_RightMouse = 2
#ListIcon = 3

Global hWndTV.l, DropProc.l, DragDropMode.l, hDragIml.l, DragItem.l

Procedure.l DragDropCallback(Window.l, Message.l, wParam.l, lParam.l)
  Protected DoDrag.l, DropX.l, DropY.l, hItem.l, hItem2.l, dItem.l
  result = #PB_ProcessPureBasicEvents
  Select Message
    Case #WM_NOTIFY
      *lp.NMHDR = lParam
      If *lp\code = #TVN_BEGINDRAG And (DragDropMode & #Drag_LeftMouse): DoDrag = #True: EndIf
      If *lp\code = #TVN_BEGINRDRAG And (DragDropMode & #Drag_RightMouse): DoDrag = #True: EndIf
      If DoDrag
        *pnmtv.NMTREEVIEW = lParam
        DragItem = *pnmtv\itemNew\hItem
        hDragIml = SendMessage_(hWndTV, #TVM_CREATEDRAGIMAGE, 0, DragItem)
        SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, #NULL)
        ImageList_BeginDrag_(hDragIml, 0, 0, 0)
        ImageList_DragEnter_(GetParent_(hWndTV), 0, 0)
        ImageList_DragShowNolock_(#TRUE)
        ImageList_DragLeave_(hWndTV)
        ShowCursor_(#FALSE)
        SetCapture_(GetParent_(hWndTV))
        SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, DragItem)
      EndIf
    Case #WM_MOUSEMOVE
        If hDragIml
          DropX = PeekW(@lParam)
          DropY = PeekW(@lParam+2)
          ImageList_DragMove_(DropX, DropY+20)
          ImageList_DragShowNolock_(#FALSE)
          ImageList_DragShowNolock_(#TRUE)
        EndIf
    Case #WM_LBUTTONUP
        If hDragIml And (DragDropMode & #Drag_LeftMouse)
          ImageList_EndDrag_()
          ReleaseCapture_()
          ShowCursor_(#TRUE)
          ImageList_Destroy_(hDragIml)
          hDragIml = #false
          dItem = 0
          hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
          While hItem <> DragItem
            hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
            Repeat
              If hItem2 = #NULL: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
              If hItem2 = #NULL: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
            Until hItem2 <> #NULL
            hItem = hItem2
            dItem + 1
          Wend
          CallFunctionFast(DropProc, WindowMouseX(), WindowMouseY(), #Drag_LeftMouse, dItem)
        EndIf
    Case #WM_RBUTTONUP
        If hDragIml And (DragDropMode & #Drag_RightMouse)
          ImageList_EndDrag_()
          ReleaseCapture_()
          ShowCursor_(#TRUE)
          ImageList_Destroy_(hDragIml)
          hDragIml = #false
          dItem = 0
          hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
          While hItem <> DragItem
            hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
            Repeat
              If hItem2 = #NULL: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
              If hItem2 = #NULL: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
            Until hItem2 <> #NULL
            hItem = hItem2
            dItem + 1
          Wend
          CallFunctionFast(DropProc, WindowMouseX(), WindowMouseY(), #Drag_RightMouse, DragItem)         
        EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure.l EnableDragDrop(TVGadget.l, DragMode.l, DropProcedure.l)
  Protected Style.l, hIml.l
  hWndTV = GadgetID(TVGadget)
  DropProc = DropProcedure
  DragDropMode = DragMode
  Style = GetWindowLong_(hWndTV, #GWL_STYLE)
  Style = Style & (~#TVS_DISABLEDRAGDROP)
  SetWindowLong_(hWndTV, #GWL_STYLE, Style)
  If SendMessage_(hWndTV, #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0) = #NULL
    hIml = ImageList_Create_(16,16,#ILC_COLOR8,0,999)
    SendMessage_(hWndTV, #TVM_SETIMAGELIST, #TVSIL_NORMAL, hIml)
  EndIf
  SetWindowCallback(@DragDropCallback())
  ProcedureReturn #True
EndProcedure

Procedure DropProcedure(X.l, Y.l, Button.l, Item.l)
If Button = #Drag_LeftMouse
  If x > 212 And x < 310
     If y > 45 And y < 273
        If item = 0
        RemoveGadgetItem(#ListIcon,0) 
        AddGadgetItem(#ListIcon,0,"Item"+Str(Item))
        EndIf
        
        If item = 1
        RemoveGadgetItem(#ListIcon,1)
        AddGadgetItem(#ListIcon,1,"Item"+Str(Item))
        EndIf
        
        If item = 2
        RemoveGadgetItem(#ListIcon,2)
        AddGadgetItem(#ListIcon,2,"Item"+Str(Item))
        EndIf

        If item = 3
        RemoveGadgetItem(#ListIcon,3)
        AddGadgetItem(#ListIcon,3,"Item"+Str(Item))
        EndIf
        
     EndIf
  EndIf
EndIf

; Un-REM (take off ";" in lines below when you need to determine X and Y coordinates of drop
;  If Button = #Drag_LeftMouse
;    MessageRequester("Drag'n Drop","Item Number "+Str(Item)+" has been dropped at X:"+Str(X)+" Y:"+Str(Y)+" using left Button.",#MB_ICONINFORMATION)
;  Else
;    MessageRequester("Drag'n Drop","Item Number "+Str(Item)+" has been dropped at X:"+Str(X)+" Y:"+Str(Y)+" using right Button.",#MB_ICONINFORMATION)
;  EndIf
EndProcedure

#Tree = 1

OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_Screencentered, "Drag'n Drop")
CreateGadgetList(WindowID())

TreeGadget(#Tree, 5, 5, 150, 250)
hImg = LoadIcon_(0,#IDI_APPLICATION)
AddGadgetItem(#Tree, 0, "Item3", hImg)
AddGadgetItem(#Tree, 0, "Item2")
OpenTreeGadgetNode(#Tree)
  AddGadgetItem(#Tree, 0, "Item1")
  AddGadgetItem(#Tree, 0, "Item0")
CloseTreeGadgetNode(#Tree)

ListIconGadget(#ListIcon,250,5, 80, 250, "Item Dropped", 76) 
AddGadgetItem(#ListIcon,0,"")
AddGadgetItem(#ListIcon,1,"")
AddGadgetItem(#ListIcon,2,"")
AddGadgetItem(#ListIcon,3,"")

EnableDragDrop(#Tree, #Drag_LeftMouse|#Drag_RightMouse, @DropProcedure())

While WaitWindowEvent() <> #PB_EventCloseWindow: Wend
End
User avatar
Flype
Addict
Addict
Posts: 1542
Joined: Tue Jul 22, 2003 5:02 pm
Location: In a long distant galaxy

Post by Flype »

Heavy code but EXCELLENT !!!
No programming language is perfect. There is not even a single best language.
There are only languages well suited or perhaps poorly suited for particular purposes. Herbert Mayer
LJ
Enthusiast
Enthusiast
Posts: 177
Joined: Wed Apr 30, 2003 4:00 pm

If...

Post by LJ »

If you don't like the positional method, here is another method using PureBasic's powerful SORT ARRAY method:

Code: Select all

; German forum:
; Author: Freak (Timo Harter)
; Date: 17. December 2002
; Modified for use with ListGadget by Lance Jepsen (Sorted)
; Date: 15. July 2003

; --------------------------------------------------------------------------
; Drag'n' Drop mit TreeGadgets
; by Timo Harter
;
; Syntax:
; EnableDragDrop( #Gadget, DragMode, @DropProcedure() )
;
;
; DragMode : #Drag_LeftMouse  
;            #Drag_RightMouse
;
; @DropProcedure()

;            Procedure DropProcedure(X.l, Y.l, Button.l, Item.l)
;


#TVN_BEGINDRAG       = -407
#TVN_BEGINRDRAG      = -408
#TVS_DISABLEDRAGDROP = $10
#Drag_LeftMouse  = 1
#Drag_RightMouse = 2
#ListIcon = 3

Global hWndTV.l, DropProc.l, DragDropMode.l, hDragIml.l, DragItem.l

Procedure.l DragDropCallback(Window.l, Message.l, wParam.l, lParam.l)
  Protected DoDrag.l, DropX.l, DropY.l, hItem.l, hItem2.l, dItem.l
  result = #PB_ProcessPureBasicEvents
  Select Message
    Case #WM_NOTIFY
      *lp.NMHDR = lParam
      If *lp\code = #TVN_BEGINDRAG And (DragDropMode & #Drag_LeftMouse): DoDrag = #True: EndIf
      If *lp\code = #TVN_BEGINRDRAG And (DragDropMode & #Drag_RightMouse): DoDrag = #True: EndIf
      If DoDrag
        *pnmtv.NMTREEVIEW = lParam
        DragItem = *pnmtv\itemNew\hItem
        hDragIml = SendMessage_(hWndTV, #TVM_CREATEDRAGIMAGE, 0, DragItem)
        SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, #NULL)
        ImageList_BeginDrag_(hDragIml, 0, 0, 0)
        ImageList_DragEnter_(GetParent_(hWndTV), 0, 0)
        ImageList_DragShowNolock_(#TRUE)
        ImageList_DragLeave_(hWndTV)
        ShowCursor_(#FALSE)
        SetCapture_(GetParent_(hWndTV))
        SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, DragItem)
      EndIf
    Case #WM_MOUSEMOVE
        If hDragIml
          DropX = PeekW(@lParam)
          DropY = PeekW(@lParam+2)
          ImageList_DragMove_(DropX, DropY+20)
          ImageList_DragShowNolock_(#FALSE)
          ImageList_DragShowNolock_(#TRUE)
        EndIf
    Case #WM_LBUTTONUP
        If hDragIml And (DragDropMode & #Drag_LeftMouse)
          ImageList_EndDrag_()
          ReleaseCapture_()
          ShowCursor_(#TRUE)
          ImageList_Destroy_(hDragIml)
          hDragIml = #false
          dItem = 0
          hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
          While hItem <> DragItem
            hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
            Repeat
              If hItem2 = #NULL: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
              If hItem2 = #NULL: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
            Until hItem2 <> #NULL
            hItem = hItem2
            dItem + 1
          Wend
          CallFunctionFast(DropProc, WindowMouseX(), WindowMouseY(), #Drag_LeftMouse, dItem)
        EndIf
    Case #WM_RBUTTONUP
        If hDragIml And (DragDropMode & #Drag_RightMouse)
          ImageList_EndDrag_()
          ReleaseCapture_()
          ShowCursor_(#TRUE)
          ImageList_Destroy_(hDragIml)
          hDragIml = #false
          dItem = 0
          hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
          While hItem <> DragItem
            hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
            Repeat
              If hItem2 = #NULL: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
              If hItem2 = #NULL: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
            Until hItem2 <> #NULL
            hItem = hItem2
            dItem + 1
          Wend
          CallFunctionFast(DropProc, WindowMouseX(), WindowMouseY(), #Drag_RightMouse, DragItem)         
        EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure.l EnableDragDrop(TVGadget.l, DragMode.l, DropProcedure.l)
  Protected Style.l, hIml.l
  hWndTV = GadgetID(TVGadget)
  DropProc = DropProcedure
  DragDropMode = DragMode
  Style = GetWindowLong_(hWndTV, #GWL_STYLE)
  Style = Style & (~#TVS_DISABLEDRAGDROP)
  SetWindowLong_(hWndTV, #GWL_STYLE, Style)
  If SendMessage_(hWndTV, #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0) = #NULL
    hIml = ImageList_Create_(16,16,#ILC_COLOR8,0,999)
    SendMessage_(hWndTV, #TVM_SETIMAGELIST, #TVSIL_NORMAL, hIml)
  EndIf
  SetWindowCallback(@DragDropCallback())
  ProcedureReturn #True
EndProcedure

Procedure DropProcedure(X.l, Y.l, Button.l, Item.l)
If Button = #Drag_LeftMouse
  If x > 212 And x < 310
     If y > 45 And y < 273
     
        AddGadgetItem(#ListIcon,-1,"Item"+Str(Item))
         NbElements = CountGadgetItems(#ListIcon)
         Dim Array.s(NbElements)
         For k=0 To NbElements
         Array(k) = GetGadgetItemText(#ListIcon, k,0)
         Next
         SortArray(Array(), 2, 0, NbElements)
         ClearGadgetItemList(#ListIcon)
         For k= 1 To NbElements
         AddGadgetItem(#ListIcon, k, Array(k))
         Next
          
     EndIf
  EndIf
EndIf

; Un-REM (take off ";" in lines below when you need to determine X and Y coordinates of drop
;  If Button = #Drag_LeftMouse
;    MessageRequester("Drag'n Drop","Item Number "+Str(Item)+" has been dropped at X:"+Str(X)+" Y:"+Str(Y)+" using left Button.",#MB_ICONINFORMATION)
;  Else
;    MessageRequester("Drag'n Drop","Item Number "+Str(Item)+" has been dropped at X:"+Str(X)+" Y:"+Str(Y)+" using right Button.",#MB_ICONINFORMATION)
;  EndIf
EndProcedure

#Tree = 1

OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_Screencentered, "Drag'n Drop")
CreateGadgetList(WindowID())

TreeGadget(#Tree, 5, 5, 150, 250)
hImg = LoadIcon_(0,#IDI_APPLICATION)
AddGadgetItem(#Tree, 0, "Item3", hImg)
AddGadgetItem(#Tree, 0, "Item2")
OpenTreeGadgetNode(#Tree)
  AddGadgetItem(#Tree, 0, "Item1")
  AddGadgetItem(#Tree, 0, "Item0")
CloseTreeGadgetNode(#Tree)

ListIconGadget(#ListIcon,250,5, 80, 250, "Item Dropped", 76) 

EnableDragDrop(#Tree, #Drag_LeftMouse|#Drag_RightMouse, @DropProcedure())

While WaitWindowEvent() <> #PB_EventCloseWindow: Wend
End
Post Reply