Page 1 of 1

[SOLVED] Prevent a ListIcon column from being moved before or after another column ?

Posted: Fri Sep 06, 2024 11:54 pm
by boddhi
Hello,

In a ListIcon() with the #PB_ListIcon_HeaderDragDrop flag, I know how to prevent, with a callback and #HDN_BEGINDRAG, a column from being dragged, but is it possible to prevent a column from being dragged before (or after) another column?

E.g. Column 2 can be moved to position 1, but not to position 0.

Here, a part of my code:

Code: Select all

Procedure.i Pc_FenPrincipale_Callback(ArgHwnd.i,ArgMsg.i,ArgWParam.i,ArgLParam.i)
  Protected.NMHDR *NMHDR
  Protected.NMHEADER *NMHEADER
  Protected.NM_LISTVIEW *NMLISTVIEW
  
  Select ArgMsg
    Case #WM_NOTIFY
      *NMHDR=ArgLParam
      *NMLISTVIEW=ArgLParam
      *NMHEADER=ArgLParam
      Select *NMHDR\code
        Case #HDN_BEGINDRAG
          If *NMLISTVIEW\iItem=0  ; Block column 0 dragging
            SetCapture_(0) 
            ProcedureReturn 1
          EndIf
          ; Something here?
          ; I can't find the column number where the new position would be.
        Case #HDN_ENDDRAG
          ; Something here?
          ; I can't find the column number where the new position would be.
        Case #HDN_BEGINTRACK ; Block resize columns
          If *NMHDR\hwndFrom=SendMessage_(GadgetID(0),#LVM_GETHEADER,0,0)
            *NMHEADER=ArgLParam
            If *NMHEADER\iItem=0:ProcedureReturn #True:EndIf
            ProcedureReturn #False
          EndIf
      EndSelect
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure 
Thanks for your help.

Re: [SOLVED] Prevent a ListIcon column from being moved before or after another column ?

Posted: Sun Sep 08, 2024 12:01 pm
by boddhi
Finally...

Code: Select all

Procedure.i Pc_FenPrincipale_Callback(ArgHwnd.i,ArgMsg.i,ArgWParam.i,ArgLParam.i)
  Protected.NMHDR *NMHDR
  Protected.NMHEADER *NMHEADER
  Protected.NM_LISTVIEW *NMLISTVIEW
  Protected.HDITEM *HDITEM
  
  Select ArgMsg
    Case #WM_NOTIFY
      *NMHDR=ArgLParam
      Select *NMHDR\code
        Case #HDN_BEGINDRAG
          *NMLISTVIEW=ArgLParam
          Select *NMLISTVIEW\iItem
            Case 0,3  ; Block columns 0 & 3 dragging
              SetCapture_(0) 
              ProcedureReturn 1
          EndSelect
        Case #HDN_ENDDRAG
          *NMHEADER=ArgLParam
          *HDITEM=*NMHEADER\pitem
          Select *HDITEM\iOrder
            Case 0,3:ProcedureReturn #True ; Block moves before column 0 or after column 3
          EndSelect
        Case #HDN_BEGINTRACK ; Block column 0 resizing
            *NMHEADER=ArgLParam
            If *NMHEADER\iItem=0:ProcedureReturn #True:EndIf
            ProcedureReturn #False
      EndSelect
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure 

If OpenWindow(0, 0, 0, 420, 220, "ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(10, 10, 10, 400, 200, "Colonne 1", 100, #PB_ListIcon_HeaderDragDrop)
  AddGadgetColumn(10, 1, "Colonne 2", 100)
  AddGadgetColumn(10, 2, "Colonne 3", 100)
  AddGadgetColumn(10, 3, "Colonne 4", 100)
  SetWindowCallback(@Pc_FenPrincipale_Callback())
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf