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

Just starting out? Need help? Post your questions and find answers here.
boddhi
Enthusiast
Enthusiast
Posts: 524
Joined: Mon Nov 15, 2010 9:53 pm

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

Post 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.
If my English syntax and lexicon are incorrect, please bear with Google translate and DeepL. They rarely agree with each other!
Except on this sentence...
boddhi
Enthusiast
Enthusiast
Posts: 524
Joined: Mon Nov 15, 2010 9:53 pm

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

Post 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
If my English syntax and lexicon are incorrect, please bear with Google translate and DeepL. They rarely agree with each other!
Except on this sentence...
Post Reply