Page 1 of 2

ListView with groups ?

Posted: Sun Mar 31, 2013 1:28 am
by va!n
I found an old example to use ListViews with groups at following url:
http://www.purebasic.fr/english/viewtop ... VIEW+GROUP

I have tried to get it work with PB 5.11 but no groups will be shown. Any idea how to fix? Thanks
Here my version of the source

Code: Select all


; *****************************************************************
; ************ Requires WinXP with Skins enabled ******************
; *****************************************************************
#LVM_FIRST = $1000
#LVM_SETGROUPMETRICS = #LVM_FIRST + 155
#LVM_ENABLEGROUPVIEW = #LVM_FIRST + 157
#LVM_INSERTGROUP = #LVM_FIRST + 145
#LVGF_HEADER = 1
#LVGF_ALIGN = 8
#LVGF_STATE = 4
#LVGF_GROUPID = $10
#LVGMF_BORDERCOLOR = 2
#LVGMF_BORDERSIZE = 1
#LVGMF_NONE = 0
#LVGMF_TEXTCOLOR = 4
#LVGA_HEADER_CENTER = 2
#LVGA_HEADER_LEFT = 1
#LVGA_HEADER_RIGHT = 4
#LVIF_GROUPID = $100
#LVIF_IMAGE = 2
#LVIF_TEXT = 1

; --> Structure used tp define Group
Structure myLVGROUP
  cbSize.l
  mask.l
  pszHeader.l
  cchHeader.l
  pszFooter.l
  cchFooter.l
  iGroupId.l
  stateMask.l
  state.l
  uAlign.l
EndStructure
lvGroup.myLVGROUP

; --> Structure used for placing item into it's Group
Structure myLVITEM
  mask.l
  iItem.l
  iSubItem.l
  state.l
  stateMask.l
  pszText.l
  cchTextMax.l
  iImage.l
  lParam.l
  iIndent.l
  iGroupId.l
  cColumns.l
  puColumns.l
EndStructure
lvitemgroup.myLVITEM

; --> Structure used for changing Group colors
Structure myLVGROUPMETRICS
 cbSize.l
 mask.l
 left.l
 top.l
 right.l
 bottom.l
 crLeft.l
 crTop.l
 crRight.l
 crBottom.l
 crHeader.l
 crFooter.l
EndStructure
lvGM.myLVGROUPMETRICS

; --> Create 3 Group images
redImg = CreateImage(0, 16, 16)
StartDrawing(ImageOutput(0))
Box(0, 0, 16, 16, RGB(255, 0, 0))
StopDrawing()

greenImg = CreateImage(1, 16, 16)
StartDrawing(ImageOutput(1))
Box(0, 0, 16, 16, RGB(0, 255, 0))
StopDrawing()

blueImg = CreateImage(2, 16, 16)
StartDrawing(ImageOutput(2))
Box(0, 0, 16, 16, RGB(0, 0, 255))
StopDrawing()

If OpenWindow(0, 0, 0, 500, 300, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  ListIconGadget(0, 10, 10, 480, 280, "ww", 200)
 ; ChangeListIconGadgetDisplay(0, 1)
 
 SetGadgetAttribute(0, #PB_ListIcon_DisplayMode,   2 )

 For i = 0 To 3
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, redImg)
  Next  i
  For i = 4 To 7
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, greenImg)
  Next  i
  For i = 8 To 11
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, blueImg)
  Next  i
  ; --> Enable Group view
  SendMessage_(GadgetID(0), #LVM_ENABLEGROUPVIEW , #True, 0)
  lvGroup\cbSize = SizeOf(myLVGROUP)
  lvGroup\mask = #LVGF_HEADER | #LVGF_GROUPID | #LVGF_ALIGN
  ; --> Create Group 0
  group$ = "Red Group"
  sLen = MultiByteToWideChar_(#CP_ACP, 0, group$, -1, 0, 0)
  GroupName$ = Space(sLen*2)
  MultiByteToWideChar_(#CP_ACP, 0, group$, -1, @GroupName$, sLen)
  lvGroup\pszHeader = @GroupName$
  lvGroup\cchHeader = sLen*2
  lvGroup\iGroupId = 0
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 0, lvGroup)
  ; --> Create Group 1
  group$ = "Green Group"
  sLen = MultiByteToWideChar_(#CP_ACP, 0, group$, -1, 0, 0)
  GroupName$ = Space(sLen*2)
  MultiByteToWideChar_(#CP_ACP, 0, group$, -1, @GroupName$, sLen)
  lvGroup\pszHeader = @GroupName$
  lvGroup\cchHeader = sLen*2
  lvGroup\iGroupId = 1
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 1, lvGroup)
  ; --> Create Group 2
  group$ = "Blue Group"
  sLen = MultiByteToWideChar_(#CP_ACP, 0, group$, -1, 0, 0)
  GroupName$ = Space(sLen*2)
  MultiByteToWideChar_(#CP_ACP, 0, group$, -1, @GroupName$, sLen)
  lvGroup\pszHeader = @GroupName$
  lvGroup\cchHeader = sLen*2
  lvGroup\iGroupId = 2
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 2, lvGroup)
  ; --> Change Group header text color
  ; --> AFAIK, Group Metrics applies to all Groups
  lvGM\cbSize = SizeOf(myLVGROUPMETRICS)
  lvGM\mask = #LVGMF_TEXTCOLOR
  lvGM\crHeader = RGB(100, 50, 100)
  SendMessage_(GadgetID(0), #LVM_SETGROUPMETRICS, 0, lvGM)
  ; --> Place items 0 - 3 into Group 0
  For r = 0 To 3
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = r
    lvitemgroup\iGroupId = 0
    SendMessage_(GadgetID(0), #LVM_SETITEM, r, lvitemgroup)
  Next r
  ; --> Place items 4 - 7 into Group 1
  For g = 4 To 7
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = g
    lvitemgroup\iGroupId = 1
    SendMessage_(GadgetID(0), #LVM_SETITEM, g, lvitemgroup)
  Next g
  ; --> Place items 8 - 11 into Group 2
  For b = 8 To 11
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = b
    lvitemgroup\iGroupId = 2
    SendMessage_(GadgetID(0), #LVM_SETITEM, b, lvitemgroup)
  Next b
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 

Re: ListView with groups ?

Posted: Sun Mar 31, 2013 1:45 am
by RASHAD
Change to :

Code: Select all

SetGadgetAttribute(0, #PB_ListIcon_DisplayMode,   0 )
OR

Code: Select all

SetGadgetAttribute(0, #PB_ListIcon_DisplayMode,   1 )

Re: ListView with groups ?

Posted: Sun Mar 31, 2013 1:51 am
by va!n
@RASHAD:
Thanks for your reply!
Using "SetGadgetAttribute(0, #PB_ListIcon_DisplayMode, 1 )" gives me a complete empty ListView on PB x64!
Tested with PB x86 and here it works great!


@all:
Found another good looking old example source; but getting only an empty listview.
Compiling with PB x86 it works great! :)
How to get it work for PB x64 ?

Code: Select all

; www.PureArea.net, sent by mail to me
; Author: Stefan 'wayne-c' Christen (updated for PB 4.00 by Andre)
; Date: 28. June 2004
; OS: Windows
; Demo: No


; Purpose: How to use item groups in the ListIcon gadget
; Tested: on Windows XP only (don't think it runs elsewhere)

; Structure LVGROUP
;   cbSize.l
;   mask.l
;   pszHeader.l
;   cchHeader.l
;   pszFooter.l
;   cchFooter.l
;   iGroupId.l
;   stateMask.l
;   state.l
;   uAlign.l
; EndStructure

; Structure LVITEM
;   mask.l
;   iItem.l
;   iSubItem.l
;   state.l
;   stateMask.l
;   pszText.l
;   cchTextMax.l
;   iImage.l
;   lParam.l
;   iIndent.l
;   iGroupId.l
;   cColumns.l
;   puColunns.l
; EndStructure
; 

#LVM_ENABLEGROUPVIEW = #LVM_FIRST + 157
#LVM_MOVEITEMTOGROUP = #LVM_FIRST + 154
#LVM_INSERTGROUP = #LVM_FIRST + 145

#LVIF_GROUPID = $0100

#LVGA_HEADER_LEFT = $1
#LVGA_HEADER_CENTER = $2
#LVGA_HEADER_RIGHT = $4

#LVGS_NORMAL = $0
#LVGS_COLLAPSED = $1
#LVGS_HIDDEN = $2

#LVGF_HEADER = $1
#LVGF_FOOTER = $2
#LVGF_STATE = $4
#LVGF_ALIGN = $8
#LVGF_GROUPID = $10


Procedure StringToUnicode(pbstrptr.l, ucstrptr.l)
  MultiByteToWideChar_ (#CP_ACP, 0, pbstrptr, Len(PeekS(pbstrptr)), ucstrptr, Len(PeekS(ucstrptr)))
  PokeL( ucstrptr + Len(PeekS(pbstrptr))*2, 0)
EndProcedure 


Procedure ListIcon_AddGroup(gadget.l, text.s, groupid.l)
  lvg.LVGROUP\cbSize = SizeOf(LVGROUP)
  lvg\mask = #LVGF_GROUPID | #LVGF_ALIGN | #LVGF_HEADER
  lvg\iGroupId = groupid
  lvg\uAlign = #LVGA_HEADER_LEFT
  text_uc.s = Space(260)  
  StringToUnicode(@text, @text_uc) 
  lvg\pszHeader = @text_uc
  SendMessage_ (GadgetID(gadget), #LVM_INSERTGROUP, -1, @lvg)
EndProcedure


Procedure ListIcon_EnableGroupView(gadget.l, state.l)
  SendMessage_ (GadgetID(gadget), #LVM_ENABLEGROUPVIEW, state, 0)
EndProcedure


Procedure ListIcon_AddItem(gadget.l, text.s, groupid.l)
  itm.LVITEM\mask = #LVIF_TEXT | #LVIF_GROUPID
  itm\pszText = @text
  itm\iGroupId = groupid
  SendMessage_ (GadgetID(gadget), #LVM_INSERTITEM, 0, @itm)
EndProcedure


;- Test


;XIncludeFile "ListIcon_Groups_XP.pb"


Enumeration
  #Window
  #ListIcon
EndEnumeration


If OpenWindow(#Window, 0, 0, 300, 400, "ListIcon_Groups_XP", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#Window))
    ListIconGadget(#ListIcon, 5, 5, 290, 390, "Game", 200)
  EndIf
  
  ListIcon_EnableGroupView(#ListIcon, 1)
  For g=1 To 5
    ListIcon_AddGroup(#ListIcon, "This is group "+Str(g), g)
    For i=1 To 5
      ListIcon_AddItem(#ListIcon, "Item "+Str((g-1)*5+i)+" belongs to group "+Str(g), g)
    Next
  Next
  
  Quit.l = 0
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
      Case #PB_Event_SizeWindow
        ResizeGadget(#ListIcon, 5, 5, WindowWidth(#Window)-10, WindowHeight(#Window)-10)
    EndSelect
  Until Quit > 0
EndIf
End


; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -
; EnableXP
; Executable = ..\Dokumente und Einstellungen\Wayne\Desktop\ListIcon_Groups_XP.exe

Re: ListView with groups ?

Posted: Sun Mar 31, 2013 4:47 am
by Thunder93
64bit support, ... but just make sure that I hadn't made a mistake somewhere on this.

Code: Select all

; www.PureArea.net, sent by mail to me
; Author: Stefan 'wayne-c' Christen (updated for PB 4.00 by Andre)
; Date: 28. June 2004
; OS: Windows
; Demo: No


; Purpose: How to use item groups in the ListIcon gadget
; Tested: on Windows XP only (don't think it runs elsewhere)

Structure LVGROUP1  Align #PB_Structure_AlignC
  cbSize.l
  mask.l
  *pszHeader
  cchHeader.l
  *pszFooter
  cchFooter.l
  iGroupId.l
  stateMask.l
  state.l
  uAlign.l
EndStructure

Structure LVITEM1  Align #PB_Structure_AlignC
  mask.l
  iItem.l
  iSubItem.l
  state.l
  stateMask.l
  *pszText
  cchTextMax.l
  iImage.l
  lParam.i
  iIndent.l
  iGroupId.l
  cColumns.l
  puColunns.l
EndStructure


#LVM_ENABLEGROUPVIEW = #LVM_FIRST + 157
#LVM_MOVEITEMTOGROUP = #LVM_FIRST + 154
#LVM_INSERTGROUP = #LVM_FIRST + 145

#LVIF_GROUPID = $0100

#LVGA_HEADER_LEFT = $1
#LVGA_HEADER_CENTER = $2
#LVGA_HEADER_RIGHT = $4

#LVGS_NORMAL = $0
#LVGS_COLLAPSED = $1
#LVGS_HIDDEN = $2

#LVGF_HEADER = $1
#LVGF_FOOTER = $2
#LVGF_STATE = $4
#LVGF_ALIGN = $8
#LVGF_GROUPID = $10


Procedure StringToUnicode(pbstrptr.i, ucstrptr.i)
  MultiByteToWideChar_ (#CP_ACP, 0, pbstrptr, Len(PeekS(pbstrptr)), ucstrptr, Len(PeekS(ucstrptr)))
  PokeL( ucstrptr + Len(PeekS(pbstrptr))*2, 0)
EndProcedure 


Procedure ListIcon_AddGroup(gadget.l, text.s, groupid.l)  
  lvg.LVGROUP1\cbSize = SizeOf(LVGROUP1)
  lvg\mask = #LVGF_GROUPID | #LVGF_ALIGN | #LVGF_HEADER
  lvg\iGroupId = groupid
  lvg\uAlign = #LVGA_HEADER_LEFT
  text_uc.s = Space(260)  
  StringToUnicode(@text, @text_uc) 
  lvg\pszHeader = @text_uc
  SendMessage_ (GadgetID(gadget), #LVM_INSERTGROUP, -1, @lvg)
EndProcedure


Procedure ListIcon_EnableGroupView(gadget.l, state.l)
  SendMessage_ (GadgetID(gadget), #LVM_ENABLEGROUPVIEW, state, 0)
EndProcedure


Procedure ListIcon_AddItem(gadget.l, text.s, groupid.l)
  itm.LVITEM1\mask = #LVIF_TEXT | #LVIF_GROUPID
  itm\pszText = @text
  itm\iGroupId = groupid
  SendMessage_ (GadgetID(gadget), #LVM_INSERTITEM, 0, @itm)
EndProcedure


;- Test


;XIncludeFile "ListIcon_Groups_XP.pb"


Enumeration
  #Window
  #ListIcon
EndEnumeration


If OpenWindow(#Window, 0, 0, 300, 400, "ListIcon_Groups_XP", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
;   If CreateGadgetList(WindowID(#Window))
    ListIconGadget(#ListIcon, 5, 5, 290, 390, "Game", 200)
;   EndIf
  
  ListIcon_EnableGroupView(#ListIcon, 1)
  For g=1 To 5
    ListIcon_AddGroup(#ListIcon, "This is group "+Str(g), g)
    For i=1 To 5
      ListIcon_AddItem(#ListIcon, "Item "+Str((g-1)*5+i)+" belongs to group "+Str(g), g)
    Next
  Next
  
  Quit.l = 0
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
      Case #PB_Event_SizeWindow
        ResizeGadget(#ListIcon, 5, 5, WindowWidth(#Window)-10, WindowHeight(#Window)-10)
    EndSelect
  Until Quit > 0
EndIf
End


Re: ListView with groups ?

Posted: Sun Mar 31, 2013 5:05 am
by Thunder93
Sorry.., for your initially posted code.

Code: Select all

; *****************************************************************
; ************ Requires WinXP with Skins enabled ******************
; *****************************************************************
#LVM_FIRST = $1000
#LVM_SETGROUPMETRICS = #LVM_FIRST + 155
#LVM_ENABLEGROUPVIEW = #LVM_FIRST + 157
#LVM_INSERTGROUP = #LVM_FIRST + 145
#LVGF_HEADER = 1
#LVGF_ALIGN = 8
#LVGF_STATE = 4
#LVGF_GROUPID = $10
#LVGMF_BORDERCOLOR = 2
#LVGMF_BORDERSIZE = 1
#LVGMF_NONE = 0
#LVGMF_TEXTCOLOR = 4
#LVGA_HEADER_CENTER = 2
#LVGA_HEADER_LEFT = 1
#LVGA_HEADER_RIGHT = 4
#LVIF_GROUPID = $100
#LVIF_IMAGE = 2
#LVIF_TEXT = 1

; ; --> Structure used tp define Group
; Structure myLVGROUP
;   cbSize.l
;   mask.l
;   pszHeader.l
;   cchHeader.l
;   pszFooter.l
;   cchFooter.l
;   iGroupId.l
;   stateMask.l
;   state.l
;   uAlign.l
; EndStructure
; lvGroup.myLVGROUP
; 
; ; --> Structure used for placing item into it's Group
; Structure myLVITEM
;   mask.l
;   iItem.l
;   iSubItem.l
;   state.l
;   stateMask.l
;   pszText.l
;   cchTextMax.l
;   iImage.l
;   lParam.l
;   iIndent.l
;   iGroupId.l
;   cColumns.l
;   puColumns.l
; EndStructure
;lvitemgroup.myLVITEM

Structure myLVGROUP  Align #PB_Structure_AlignC
  cbSize.l
  mask.l
  *pszHeader
  cchHeader.l
  *pszFooter
  cchFooter.l
  iGroupId.l
  stateMask.l
  state.l
  uAlign.l
EndStructure
lvGroup.myLVGROUP

Structure myLVITEM  Align #PB_Structure_AlignC
  mask.l
  iItem.l
  iSubItem.l
  state.l
  stateMask.l
  *pszText
  cchTextMax.l
  iImage.l
  lParam.i
  iIndent.l
  iGroupId.l
  cColumns.l
  puColunns.l
EndStructure
lvitemgroup.myLVITEM

; --> Structure used for changing Group colors
Structure myLVGROUPMETRICS  Align #PB_Structure_AlignC
 cbSize.l
 mask.l
 left.l
 top.l
 right.l
 bottom.l
 crLeft.l
 crTop.l
 crRight.l
 crBottom.l
 crHeader.l
 crFooter.l
EndStructure
lvGM.myLVGROUPMETRICS

; --> Create 3 Group images
redImg = CreateImage(0, 16, 16)
StartDrawing(ImageOutput(0))
Box(0, 0, 16, 16, RGB(255, 0, 0))
StopDrawing()

greenImg = CreateImage(1, 16, 16)
StartDrawing(ImageOutput(1))
Box(0, 0, 16, 16, RGB(0, 255, 0))
StopDrawing()

blueImg = CreateImage(2, 16, 16)
StartDrawing(ImageOutput(2))
Box(0, 0, 16, 16, RGB(0, 0, 255))
StopDrawing()

If OpenWindow(0, 0, 0, 500, 300, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  ListIconGadget(0, 10, 10, 480, 280, "ww", 200)
 ; ChangeListIconGadgetDisplay(0, 1)
 
 SetGadgetAttribute(0, #PB_ListIcon_DisplayMode,   1 )

 For i = 0 To 3
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, redImg)
  Next  i
  For i = 4 To 7
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, greenImg)
  Next  i
  For i = 8 To 11
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, blueImg)
  Next  i
  ; --> Enable Group view
  SendMessage_(GadgetID(0), #LVM_ENABLEGROUPVIEW , #True, 0)
  
  lvGroup\cbSize = SizeOf(myLVGROUP)
  lvGroup\mask = #LVGF_HEADER | #LVGF_GROUPID | #LVGF_ALIGN
  ; --> Create Group 0
  group$ = "Red Group"
  sLen = MultiByteToWideChar_(#CP_ACP, 0, group$, -1, 0, 0)
  GroupName$ = Space(sLen*2)
  MultiByteToWideChar_(#CP_ACP, 0, group$, -1, @GroupName$, sLen)
  lvGroup\pszHeader = @GroupName$
  lvGroup\cchHeader = sLen*2
  lvGroup\iGroupId = 0
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 0, lvGroup)
  ; --> Create Group 1
  group$ = "Green Group"
  sLen = MultiByteToWideChar_(#CP_ACP, 0, group$, -1, 0, 0)
  GroupName$ = Space(sLen*2)
  MultiByteToWideChar_(#CP_ACP, 0, group$, -1, @GroupName$, sLen)
  lvGroup\pszHeader = @GroupName$
  lvGroup\cchHeader = sLen*2
  lvGroup\iGroupId = 1
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 1, lvGroup)
  ; --> Create Group 2
  group$ = "Blue Group"
  sLen = MultiByteToWideChar_(#CP_ACP, 0, group$, -1, 0, 0)
  GroupName$ = Space(sLen*2)
  MultiByteToWideChar_(#CP_ACP, 0, group$, -1, @GroupName$, sLen)
  lvGroup\pszHeader = @GroupName$
  lvGroup\cchHeader = sLen*2
  lvGroup\iGroupId = 2
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 2, lvGroup)
  ; --> Change Group header text color
  ; --> AFAIK, Group Metrics applies to all Groups
  lvGM\cbSize = SizeOf(myLVGROUPMETRICS)
  lvGM\mask = #LVGMF_TEXTCOLOR
  lvGM\crHeader = RGB(100, 50, 100)
  SendMessage_(GadgetID(0), #LVM_SETGROUPMETRICS, 0, lvGM)
  ; --> Place items 0 - 3 into Group 0
  For r = 0 To 3
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = r
    lvitemgroup\iGroupId = 0
    SendMessage_(GadgetID(0), #LVM_SETITEM, r, lvitemgroup)
  Next r
  ; --> Place items 4 - 7 into Group 1
  For g = 4 To 7
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = g
    lvitemgroup\iGroupId = 1
    SendMessage_(GadgetID(0), #LVM_SETITEM, g, lvitemgroup)
  Next g
  ; --> Place items 8 - 11 into Group 2
  For b = 8 To 11
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = b
    lvitemgroup\iGroupId = 2
    SendMessage_(GadgetID(0), #LVM_SETITEM, b, lvitemgroup)
  Next b
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 

Re: ListView with groups ?

Posted: Sun Mar 31, 2013 5:23 am
by Danilo
Thanks Thunder93! The old codes are ASCII only, had to change it a bit to work with UNICODE too:

Code: Select all

; www.PureArea.net, sent by mail to me
; Author: Stefan 'wayne-c' Christen (updated for PB 4.00 by Andre)
; Date: 28. June 2004
; OS: Windows
; Demo: No


; Purpose: How to use item groups in the ListIcon gadget
; Tested: on Windows XP only (don't think it runs elsewhere)

Structure LVGROUP1  Align #PB_Structure_AlignC
  cbSize.l
  mask.l
  *pszHeader
  cchHeader.l
  *pszFooter
  cchFooter.l
  iGroupId.l
  stateMask.l
  state.l
  uAlign.l
EndStructure

Structure LVITEM1  Align #PB_Structure_AlignC
  mask.l
  iItem.l
  iSubItem.l
  state.l
  stateMask.l
  *pszText
  cchTextMax.l
  iImage.l
  lParam.i
  iIndent.l
  iGroupId.l
  cColumns.l
  puColunns.l
EndStructure


#LVM_ENABLEGROUPVIEW = #LVM_FIRST + 157
#LVM_MOVEITEMTOGROUP = #LVM_FIRST + 154
#LVM_INSERTGROUP = #LVM_FIRST + 145

#LVIF_GROUPID = $0100

#LVGA_HEADER_LEFT = $1
#LVGA_HEADER_CENTER = $2
#LVGA_HEADER_RIGHT = $4

#LVGS_NORMAL = $0
#LVGS_COLLAPSED = $1
#LVGS_HIDDEN = $2

#LVGF_HEADER = $1
#LVGF_FOOTER = $2
#LVGF_STATE = $4
#LVGF_ALIGN = $8
#LVGF_GROUPID = $10


Procedure ListIcon_AddGroup(gadget.l, text.s, groupid.l)  
  lvg.LVGROUP1\cbSize = SizeOf(LVGROUP1)
  lvg\mask = #LVGF_GROUPID | #LVGF_ALIGN | #LVGF_HEADER
  lvg\iGroupId = groupid
  lvg\uAlign = #LVGA_HEADER_LEFT
  CompilerIf #PB_Compiler_Unicode = 0
    text_uc.s = Space(260*2+2)
    PokeS(@text_uc,text,260,#PB_Unicode)  
    lvg\pszHeader = @text_uc
  CompilerElse
    lvg\pszHeader = @text
  CompilerEndIf
  SendMessage_ (GadgetID(gadget), #LVM_INSERTGROUP, -1, @lvg)
EndProcedure


Procedure ListIcon_EnableGroupView(gadget.l, state.l)
  SendMessage_ (GadgetID(gadget), #LVM_ENABLEGROUPVIEW, state, 0)
EndProcedure


Procedure ListIcon_AddItem(gadget.l, text.s, groupid.l)
  itm.LVITEM1\mask = #LVIF_TEXT | #LVIF_GROUPID
  itm\pszText = @text
  itm\iGroupId = groupid
  SendMessage_ (GadgetID(gadget), #LVM_INSERTITEM, 0, @itm)
EndProcedure


;- Test


;XIncludeFile "ListIcon_Groups_XP.pb"


Enumeration
  #Window
  #ListIcon
EndEnumeration


If OpenWindow(#Window, 0, 0, 300, 400, "ListIcon_Groups_XP", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  ListIconGadget(#ListIcon, 5, 5, 290, 390, "Game", 200)
  
  ListIcon_EnableGroupView(#ListIcon, 1)
  For g=1 To 5
    ListIcon_AddGroup(#ListIcon, "This is group "+Str(g), g)
    For i=1 To 5
      ListIcon_AddItem(#ListIcon, "Item "+Str((g-1)*5+i)+" belongs to group "+Str(g), g)
    Next
  Next
  
  Quit.l = 0
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
      Case #PB_Event_SizeWindow
        ResizeGadget(#ListIcon, 5, 5, WindowWidth(#Window)-10, WindowHeight(#Window)-10)
    EndSelect
  Until Quit > 0
EndIf
End


Code: Select all

; *****************************************************************
; ************ Requires WinXP with Skins enabled ******************
; *****************************************************************
#LVM_FIRST = $1000
#LVM_SETGROUPMETRICS = #LVM_FIRST + 155
#LVM_ENABLEGROUPVIEW = #LVM_FIRST + 157
#LVM_INSERTGROUP = #LVM_FIRST + 145
#LVGF_HEADER = 1
#LVGF_ALIGN = 8
#LVGF_STATE = 4
#LVGF_GROUPID = $10
#LVGMF_BORDERCOLOR = 2
#LVGMF_BORDERSIZE = 1
#LVGMF_NONE = 0
#LVGMF_TEXTCOLOR = 4
#LVGA_HEADER_CENTER = 2
#LVGA_HEADER_LEFT = 1
#LVGA_HEADER_RIGHT = 4
#LVIF_GROUPID = $100
#LVIF_IMAGE = 2
#LVIF_TEXT = 1

; ; --> Structure used tp define Group
; Structure myLVGROUP
;   cbSize.l
;   mask.l
;   pszHeader.l
;   cchHeader.l
;   pszFooter.l
;   cchFooter.l
;   iGroupId.l
;   stateMask.l
;   state.l
;   uAlign.l
; EndStructure
; lvGroup.myLVGROUP
; 
; ; --> Structure used for placing item into it's Group
; Structure myLVITEM
;   mask.l
;   iItem.l
;   iSubItem.l
;   state.l
;   stateMask.l
;   pszText.l
;   cchTextMax.l
;   iImage.l
;   lParam.l
;   iIndent.l
;   iGroupId.l
;   cColumns.l
;   puColumns.l
; EndStructure
;lvitemgroup.myLVITEM

Structure myLVGROUP  Align #PB_Structure_AlignC
  cbSize.l
  mask.l
  *pszHeader
  cchHeader.l
  *pszFooter
  cchFooter.l
  iGroupId.l
  stateMask.l
  state.l
  uAlign.l
EndStructure
lvGroup.myLVGROUP

Structure myLVITEM  Align #PB_Structure_AlignC
  mask.l
  iItem.l
  iSubItem.l
  state.l
  stateMask.l
  *pszText
  cchTextMax.l
  iImage.l
  lParam.i
  iIndent.l
  iGroupId.l
  cColumns.l
  puColunns.l
EndStructure
lvitemgroup.myLVITEM

; --> Structure used for changing Group colors
Structure myLVGROUPMETRICS  Align #PB_Structure_AlignC
 cbSize.l
 mask.l
 left.l
 top.l
 right.l
 bottom.l
 crLeft.l
 crTop.l
 crRight.l
 crBottom.l
 crHeader.l
 crFooter.l
EndStructure
lvGM.myLVGROUPMETRICS

; --> Create 3 Group images
redImg = CreateImage(0, 16, 16)
StartDrawing(ImageOutput(0))
Box(0, 0, 16, 16, RGB(255, 0, 0))
StopDrawing()

greenImg = CreateImage(1, 16, 16)
StartDrawing(ImageOutput(1))
Box(0, 0, 16, 16, RGB(0, 255, 0))
StopDrawing()

blueImg = CreateImage(2, 16, 16)
StartDrawing(ImageOutput(2))
Box(0, 0, 16, 16, RGB(0, 0, 255))
StopDrawing()

If OpenWindow(0, 0, 0, 500, 300, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  ListIconGadget(0, 10, 10, 480, 280, "ww", 200)
 
 SetGadgetAttribute(0, #PB_ListIcon_DisplayMode,   1 )

 For i = 0 To 3
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, redImg)
  Next  i
  For i = 4 To 7
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, greenImg)
  Next  i
  For i = 8 To 11
    item$ = "Item " + Str(i)
    AddGadgetItem(0 , i, item$, blueImg)
  Next  i
  ; --> Enable Group view
  SendMessage_(GadgetID(0), #LVM_ENABLEGROUPVIEW , #True, 0)
  
  lvGroup\cbSize = SizeOf(myLVGROUP)
  lvGroup\mask = #LVGF_HEADER | #LVGF_GROUPID | #LVGF_ALIGN
  ; --> Create Group 0
  group$ = "Red Group"
  sLen = Len(group$)
  CompilerIf #PB_Compiler_Unicode = 0
      GroupName$ = Space(slen*2+2)
      PokeS(@GroupName$,group$,sLen,#PB_Unicode)  
      lvGroup\pszHeader = @GroupName$
  CompilerElse
      lvGroup\pszHeader = @group$
  CompilerEndIf
  lvGroup\cchHeader = sLen
  lvGroup\iGroupId = 0
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 0, lvGroup)
  ; --> Create Group 1
  group$ = "Green Group"
  sLen = Len(group$)
  CompilerIf #PB_Compiler_Unicode = 0
      GroupName$ = Space(slen*2+2)
      PokeS(@GroupName$,group$,sLen,#PB_Unicode)  
      lvGroup\pszHeader = @GroupName$
  CompilerElse
      lvGroup\pszHeader = @group$
  CompilerEndIf
  lvGroup\cchHeader = sLen
  lvGroup\iGroupId = 1
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 1, lvGroup)
  ; --> Create Group 2
  group$ = "Blue Group"
  sLen = Len(group$)
  CompilerIf #PB_Compiler_Unicode = 0
      GroupName$ = Space(slen*2+2)
      PokeS(@GroupName$,group$,sLen,#PB_Unicode)  
      lvGroup\pszHeader = @GroupName$
  CompilerElse
      lvGroup\pszHeader = @group$
  CompilerEndIf
  lvGroup\cchHeader = sLen
  lvGroup\iGroupId = 2
  lvGroup\uAlign = #LVGA_HEADER_LEFT
  SendMessage_(GadgetID(0), #LVM_INSERTGROUP, 2, lvGroup)
  ; --> Change Group header text color
  ; --> AFAIK, Group Metrics applies to all Groups
  lvGM\cbSize = SizeOf(myLVGROUPMETRICS)
  lvGM\mask = #LVGMF_TEXTCOLOR
  lvGM\crHeader = RGB(100, 50, 100)
  SendMessage_(GadgetID(0), #LVM_SETGROUPMETRICS, 0, lvGM)
  ; --> Place items 0 - 3 into Group 0
  For r = 0 To 3
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = r
    lvitemgroup\iGroupId = 0
    SendMessage_(GadgetID(0), #LVM_SETITEM, r, lvitemgroup)
  Next r
  ; --> Place items 4 - 7 into Group 1
  For g = 4 To 7
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = g
    lvitemgroup\iGroupId = 1
    SendMessage_(GadgetID(0), #LVM_SETITEM, g, lvitemgroup)
  Next g
  ; --> Place items 8 - 11 into Group 2
  For b = 8 To 11
    lvitemgroup\mask = #LVIF_GROUPID
    lvitemgroup\iItem = b
    lvitemgroup\iGroupId = 2
    SendMessage_(GadgetID(0), #LVM_SETITEM, b, lvitemgroup)
  Next b
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 

Re: ListView with groups ?

Posted: Sun Mar 31, 2013 7:15 am
by Maitre_Kanter
Hello,

test with Purebasic 5.11 on Windows 7 Ultimate x64 and it works.

Image

Code: Select all

; www.PureArea.net, sent by mail to me
; Author: Stefan 'wayne-c' Christen (updated for PB 4.00 by Andre)
; Date: 28. June 2004
; OS: Windows
; Demo: No


; Purpose: How to use item groups in the ListIcon gadget
; Tested: on Windows XP only (don't think it runs elsewhere)

Structure LVGROUP1  Align #PB_Structure_AlignC
  cbSize.l
  mask.l
  *pszHeader
  cchHeader.l
  *pszFooter
  cchFooter.l
  iGroupId.l
  stateMask.l
  state.l
  uAlign.l
EndStructure

Structure LVITEM1  Align #PB_Structure_AlignC
  mask.l
  iItem.l
  iSubItem.l
  state.l
  stateMask.l
  *pszText
  cchTextMax.l
  iImage.l
  lParam.i
  iIndent.l
  iGroupId.l
  cColumns.l
  puColunns.l
EndStructure


#LVM_ENABLEGROUPVIEW = #LVM_FIRST + 157
#LVM_MOVEITEMTOGROUP = #LVM_FIRST + 154
#LVM_INSERTGROUP = #LVM_FIRST + 145

#LVIF_GROUPID = $0100

#LVGA_HEADER_LEFT = $1
#LVGA_HEADER_CENTER = $2
#LVGA_HEADER_RIGHT = $4

#LVGS_NORMAL = $0
#LVGS_COLLAPSED = $1
#LVGS_HIDDEN = $2

#LVGF_HEADER = $1
#LVGF_FOOTER = $2
#LVGF_STATE = $4
#LVGF_ALIGN = $8
#LVGF_GROUPID = $10


Procedure StringToUnicode(pbstrptr.i, ucstrptr.i)
  MultiByteToWideChar_ (#CP_ACP, 0, pbstrptr, Len(PeekS(pbstrptr)), ucstrptr, Len(PeekS(ucstrptr)))
  PokeL( ucstrptr + Len(PeekS(pbstrptr))*2, 0)
EndProcedure 


Procedure ListIcon_AddGroup(gadget.l, text.s, groupid.l)  
  lvg.LVGROUP1\cbSize = SizeOf(LVGROUP1)
  lvg\mask = #LVGF_GROUPID | #LVGF_ALIGN | #LVGF_HEADER
  lvg\iGroupId = groupid
  lvg\uAlign = #LVGA_HEADER_LEFT
  text_uc.s = Space(260)  
  StringToUnicode(@text, @text_uc) 
  lvg\pszHeader = @text_uc
  SendMessage_ (GadgetID(gadget), #LVM_INSERTGROUP, -1, @lvg)
EndProcedure


Procedure ListIcon_EnableGroupView(gadget.l, state.l)
  SendMessage_ (GadgetID(gadget), #LVM_ENABLEGROUPVIEW, state, 0)
EndProcedure


Procedure ListIcon_AddItem(gadget.l, text.s, groupid.l)
  itm.LVITEM1\mask = #LVIF_TEXT | #LVIF_GROUPID
  itm\pszText = @text
  itm\iGroupId = groupid
  SendMessage_ (GadgetID(gadget), #LVM_INSERTITEM, 0, @itm)
EndProcedure


;- Test


;XIncludeFile "ListIcon_Groups_XP.pb"


Enumeration
  #Window
  #ListIcon
EndEnumeration


If OpenWindow(#Window, 0, 0, 300, 400, "ListIcon_Groups_XP", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
;   If CreateGadgetList(WindowID(#Window))
    ListIconGadget(#ListIcon, 5, 5, 290, 390, "Game", 200)
;   EndIf
  
  ListIcon_EnableGroupView(#ListIcon, 1)
  For g=1 To 5
    ListIcon_AddGroup(#ListIcon, "This is group "+Str(g), g)
    For i=1 To 5
      ListIcon_AddItem(#ListIcon, "Item "+Str((g-1)*5+i)+" belongs to group "+Str(g), g)
    Next
  Next
  
  Quit.l = 0
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
      Case #PB_Event_SizeWindow
        ResizeGadget(#ListIcon, 5, 5, WindowWidth(#Window)-10, WindowHeight(#Window)-10)
    EndSelect
  Until Quit > 0
EndIf
End

Re: ListView with groups ?

Posted: Sun Mar 31, 2013 8:17 am
by Maitre_Kanter
and a little modification for SubItems support :

Code: Select all

Procedure ListIcon_AddItem(gadget.l, text.s, groupid.l)
	Define	CountSubItem.i , Index
	Define	itm.LVITEM1\mask = #LVIF_TEXT | #LVIF_GROUPID | #LVIF_DI_SETITEM
	Define	Buff.s
	CountSubItem = CountString( text , Chr(10) )
	
	Buff = StringField( text , 1 , Chr(10) )
	
	itm\pszText = @Buff
  itm\iGroupId = groupid
  SendMessage_ (GadgetID(gadget), #LVM_INSERTITEM, 0, @itm)
  
  For Index = 1 To CountSubItem
	  Define subitm.LVITEM1\mask = #LVIF_TEXT | #LVIF_GROUPID | #LVIF_DI_SETITEM
	  Buff = StringField( text , Index + 1 , Chr(10) )
	  subitm\mask = #LVIF_TEXT
	  subitm\pszText = @Buff
	  subitm\iGroupId = groupid
	  subitm\iItem = 0
	  subitm\iSubItem = Index
	  SendMessage_ (GadgetID(gadget), #LVM_SETITEM, 0, @subitm)  
  Next
EndProcedure

Re: ListView with groups ?

Posted: Sun Mar 31, 2013 9:40 am
by Danilo
Maitre_Kanter wrote:test with Purebasic 5.11 on Windows 7 Ultimate x64 and it works.

Image
Compile with UNICODE enabled and look what happens to the group text. ;)

See above, I already changed it to work in UNICODE mode.

Re: ListView with groups ?

Posted: Mon Apr 01, 2013 1:17 am
by Thunder93
You certainly welcome Danilo! Thanks for the Unicode support.
Danilo wrote:Thanks Thunder93! The old codes are ASCII only, had to change it a bit to work with UNICODE too:

Re: ListView with groups ?

Posted: Tue Apr 02, 2013 11:03 pm
by va!n
@Thunder93 and Danilo:
Many thanks for the fixed version! :)

Re: ListView with groups ?

Posted: Wed Apr 03, 2013 8:41 am
by jesperbrannmark
Going crossplatform with this would basicly require using canvasgadget and making the gadget from scratch, or?

Re: ListView with groups ?

Posted: Wed Apr 03, 2013 9:37 pm
by va!n
@Ijesperbrannmark:
I dont know if Linux or OSX has such a feature for ListView.
If not, you are right and you have to do something simliar yourself.

@all:
Problem filling a row with more columns as only one.
Works great as long as using a listview with only 1 column... I have listviews with different numbers of comlumns, so i have tried following like which dont work:

Code: Select all

 ListIcon_AddItem( liExample,""+ Column1$+Chr(10)+Chr(10)+Column2$, g)
;  AddGadgetItem(liExample ,-1,Column1$+Chr(10)+Column2$)       

Any idea how to

Re: ListView with groups ?

Posted: Thu Apr 04, 2013 12:00 am
by Thunder93
No problem here, or I'm misunderstanding what you trying to-do.

Code: Select all

ListIcon_AddItem(#ListIcon, "Item "+Str((g-1)*5+i)+" belongs to group "+Str(g) +Chr(10)+"Test: +"+Str(i), g)

Re: ListView with groups ?

Posted: Thu Apr 04, 2013 12:05 am
by Thunder93

Code: Select all

Column1$ = "Item "+Str((g-1)*5+i)+" belongs to group "+Str(g)
Column2$ = "Test: +"+Str(i)
ListIcon_AddItem(#ListIcon, Column1$+Chr(10)+Column2$, g)