Listicon header : captured or released

Share your advanced PureBasic knowledge/code with the community.
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Listicon header : captured or released

Post by eddy »

Code updated for 5.20+

3 functions :
- listicon header : captured or released
(works with several listicon gadgets in the same window)
- resize correctly the last column

Code: Select all

; ----------------------
; resize last column of listicon
; ----------------------

Procedure ListIconLastColumnFixed(gadget)
  col.LV_COLUMN\mask = #LVCF_WIDTH
  Repeat
    a+1:x=SendMessage_(GadgetID(gadget),#LVM_GETCOLUMN,a,@col)
  Until x = 0   
  SendMessage_(GadgetID(gadget),#LVM_SETCOLUMNWIDTH, a-1,#LVSCW_AUTOSIZE_USEHEADER)
EndProcedure

; ----------------------
; return captured header, if not return zero
; ----------------------

Global LastListiconHeaderCaptured

Procedure.b ListIconHeaderCaptured(gadget)
  Header = SendMessage_(GadgetID(gadget),$1000+31,0,0)
  If GetCapture_()=Header
    LastListiconHeaderCaptured=Header
    ProcedureReturn LastListiconHeaderCaptured
  EndIf
EndProcedure

; ----------------------
; return TRUE if mouse released listicon header
; ----------------------

Procedure.b ListIconHeaderReleased(gadget) 
  Header = SendMessage_(GadgetID(gadget),$1000+31,0,0)   
  ;if listicon header was captured
  If LastListiconHeaderCaptured=Header
    ;if it has been released
    If GetCapture_()<>LastListiconHeaderCaptured
      LastListiconHeaderCaptured=0
      ProcedureReturn #True
    EndIf
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

; ----------------------
; EXAMPLE
; ----------------------

OpenWindow(0,0,0,400,400, "Last Column Fixed",#PB_Window_SystemMenu)
Listbox = ListIconGadget(#PB_Any,10,10, 300, 300, "Test" ,70,#PB_ListIcon_FullRowSelect)
AddGadgetColumn(Listbox,1,"col",50)
AddGadgetColumn(Listbox,2,"col",50)
AddGadgetColumn(Listbox,3,"last col",50)
ListIconLastColumnFixed(Listbox)   
AddGadgetItem(Listbox,-1,"cc")

Repeat
  EventID = WaitWindowEvent()   
  
  ;if listicon header is captured
  If EventID=#WM_MOUSEMOVE
    If ListIconHeaderCaptured(Listbox)   
      Debug "move header"
    EndIf
  EndIf
  
  ;if release listicon header
  If EventID=#WM_LBUTTONUP
    If ListIconHeaderReleased(Listbox)
      ListIconLastColumnFixed(Listbox) 
      Debug "** release header **"
      Debug "--> resize last column"
    EndIf
  EndIf
Until EventID = #PB_Event_CloseWindow 
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
sverson
Enthusiast
Enthusiast
Posts: 286
Joined: Sun Jul 04, 2004 12:15 pm
Location: Germany

Post by sverson »

hi eddy - good idea using GetCapture_

I tested it and added some more tests:
o hidden columns
o second listicon gadget
o resize main window

...and new functions
+ CountListIconColumns using #HDM_GETITEMCOUNT
+ column click resize using #LVN_COLUMNCLICK / #LVSCW_AUTOSIZE

Code: Select all

;/ Tricks 'n' Tips: 12.10.2004 08:06   
;/                  listicon Header : captured Or released
;/                  http://jconserv.net/purebasic/viewtopic.php?t=12751&highlight=Header+listicon
;/                  by eddy
;/ modified:        04.02.1005 sverson

Enumeration;- Windows
  #MainWindow
EndEnumeration

Enumeration;- Gadgets
  #ListIcon01
  #ListIcon02
  #Splitter01
EndEnumeration

#LVM_GETHEADER = (#LVM_FIRST + 31)

Global LastListiconHeaderCaptured

Procedure.l CountListIconColumns(Gadget_ID.l);- count columns
  Protected hHdr.l, lResult.l
  hHdr    = SendMessage_(Gadget_ID,#LVM_GETHEADER,0,0)
  lResult = SendMessage_(hHdr,#HDM_GETITEMCOUNT,#Null,#Null)
  ProcedureReturn lResult
EndProcedure

Procedure ListIconLastColumnFixed(Gadget_ID.l);- resize last column
  SendMessage_(Gadget_ID,#LVM_SETCOLUMNWIDTH, CountListIconColumns(Gadget_ID)-1,#LVSCW_AUTOSIZE_USEHEADER)
EndProcedure

Procedure.b ListIconHeaderCaptured(Gadget.l);- return captured header, if not return zero
  Protected hHdr.l, bResult.b
  hHdr.l  = SendMessage_(GadgetID(Gadget),#LVM_GETHEADER,0,0)
  If GetCapture_()=hHdr
    LastListiconHeaderCaptured = hHdr
    bResult = LastListiconHeaderCaptured
  Else
    bResult = #False
  EndIf
  ProcedureReturn bResult
EndProcedure

Procedure.b ListIconHeaderReleased(Gadget.l);- return TRUE if mouse released listicon header
  Protected hHdr.l, bResult.b
  hHdr.l = SendMessage_(GadgetID(Gadget),#LVM_GETHEADER,0,0)   
  If LastListiconHeaderCaptured=hHdr             ; if listicon header was captured
    If GetCapture_()<>LastListiconHeaderCaptured ; if it has been released
      LastListiconHeaderCaptured=0
      bResult = #True
    EndIf
  Else
    bResult = #False
  EndIf
  ProcedureReturn bResult
EndProcedure

Procedure WindowCallBack(Window, message, wParam, lParam);- Window Callback
  Protected wWidth.l, wHeight.l, Gadget_ID.l, AktColumn.l, LastColumn.l
  ReturnValue = #PB_ProcessPureBasicEvents
  Select message
    Case #WM_SIZE
      If Window = WindowID(#MainWindow)
        wWidth = WindowWidth()   : If wWidth<320  : wWidth=320  : ElseIf wWidth>800  : wWidth=800  : EndIf
        wHeight = WindowHeight() : If wHeight<240 : wHeight=240 : ElseIf wHeight>600 : wHeight=600 : EndIf
        ResizeWindow(wWidth,wHeight)
        ResizeGadget(#Splitter01,-1,-1,wWidth-20,wHeight-20)
        ListIconLastColumnFixed(GadgetID(#ListIcon01))
        ListIconLastColumnFixed(GadgetID(#ListIcon02))
      EndIf
    Case #WM_NOTIFY
      *nmHEADER.HD_NOTIFY = lParam
      Gadget_ID = *nmHEADER\hdr\hwndFrom
      Select *nmHEADER\hdr\code
        Case #HDN_ITEMCHANGING ; is header item changing?
          Select GetParent_(Gadget_ID)
            Case GadgetID(#ListIcon01)
              If *nmHEADER\iItem = 1 ; second col fixed
                ;Beep_(1200,50)
                ReturnValue = #True
              EndIf
            Case GadgetID(#ListIcon02)
              If *nmHEADER\iItem = 0 Or *nmHEADER\iItem = 2 ; first and third col fixed (hidden)
                ;Beep_(1200,50)
                ReturnValue = #True
              EndIf
          EndSelect
        Case #LVN_COLUMNCLICK
          *pnmv.NM_LISTVIEW = lParam 
          AktColumn  = *pnmv\iSubItem
          LastColumn = CountListIconColumns(Gadget_ID)-1
          If AktColumn <> LastColumn
            ;Beep_(600,50)
            SendMessage_(Gadget_ID,#LVM_SETCOLUMNWIDTH,AktColumn,#LVSCW_AUTOSIZE)
            SendMessage_(Gadget_ID,#LVM_SETCOLUMNWIDTH,LastColumn,#LVSCW_AUTOSIZE_USEHEADER)
          EndIf
      EndSelect 
  EndSelect
  ProcedureReturn ReturnValue
EndProcedure

;{- START OF EXAMPLE

OpenWindow(#MainWindow,0,0,640,480,#PB_Window_SystemMenu|#PB_Window_WindowCentered|#PB_Window_SizeGadget, "fixed & hidden columns / auto resize")
If CreateGadgetList(WindowID(#MainWindow))
  ListIconGadget(#ListIcon01,10,10, WindowWidth()-20, WindowHeight()-20, "click" ,70,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#ListIcon01,1,"fixed",50)
    AddGadgetColumn(#ListIcon01,2,"click",50)
    AddGadgetColumn(#ListIcon01,3,"auto resize",50)
    ListIconLastColumnFixed(GadgetID(#ListIcon01))   
    AddGadgetItem(#ListIcon01,-1,"a long text ... a long text"+Chr(10)+"BB"+Chr(10)+"CC"+Chr(10)+"DD"+Chr(10))
    AddGadgetItem(#ListIcon01,-1,"AA"+Chr(10)+"BB"+Chr(10)+"a long text ... a long text"+Chr(10)+"DD"+Chr(10))
  ListIconGadget(#ListIcon02,10,10, WindowWidth()-20, WindowHeight()-20, "fixed hidden" ,0,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#ListIcon02,1,"click",50)
    AddGadgetColumn(#ListIcon02,2,"fixed hidden",0)
    AddGadgetColumn(#ListIcon02,3,"auto resize",70)
    ListIconLastColumnFixed(GadgetID(#ListIcon02))   
  SplitterGadget(#Splitter01,10,10, WindowWidth()-20, WindowHeight()-20,#ListIcon01,#ListIcon02)
    AddGadgetItem(#ListIcon02,-1,"hidden"+Chr(10)+"visible"+Chr(10)+"hidden"+Chr(10)+"a long text ... a long text"+Chr(10))
    AddGadgetItem(#ListIcon02,-1,"hidden"+Chr(10)+"a long text ... a long text"+Chr(10)+"hidden"+Chr(10)+"visible"+Chr(10))
    SetWindowCallback(@WindowCallBack())
  
  Repeat
    EventID.l = WaitWindowEvent()   
    
    ;if listicon header is captured
    If EventID=#WM_MOUSEMOVE
      If ListIconHeaderCaptured(#ListIcon01) Or ListIconHeaderCaptured(#ListIcon02)
        Debug "move header"
      EndIf
    EndIf
    ;if release listicon header
    If EventID=#WM_LBUTTONUP
      If ListIconHeaderReleased(#ListIcon01)
        ListIconLastColumnFixed(GadgetID(#ListIcon01)) 
        Debug "** release header **"
        Debug "--> resize last column"
      EndIf
      If ListIconHeaderReleased(#ListIcon02)
        ListIconLastColumnFixed(GadgetID(#ListIcon02)) 
        Debug "** release header **"
        Debug "--> resize last column"
      EndIf
    EndIf
  Until EventID = #PB_Event_CloseWindow 
  
EndIf   

End ;}- END OF EXAMPLE
:) sverson
Post Reply