However, you can manage this yourself with the MS-ListView flags #LVS_OWNERDATA.
This applies to all created ListIconGadgets.
SetGadgetItemState only supports the flag #PB_ListIcon_Checked.
Since a mouse click on the check box of ListIconGadget does not respond, it had to be evaluated separately. (Took a long time to find, Window bug)
I also changed the behaviour here.
Example for testing with 100,000 items, colors and font
File: ListIconGadgetEx.pb
Update v1.08.1
- Code reorganized
Update v1.08.4
- Remove SetWindowCallback. Change to SetWindowSubClass
- Added FreeGadgetEx (Does not have to be used when closing the window)
Update v1.08.5
- Added CustomSortListIconGadgetEx
Update v1.08.7
- Remove UpdateListIconGadget.
- Added EventType Refresh
- Change RemoveGadgetItem
Update v1.08.8
- Bugfix RemoveGadgetColumn
Update v1.08.10
- Bugfix ListIconGadget with #PB_Any. Intern Bug from WM_NOTIFY invalid NMHDR\idFrom
- Update example
Update v1.08.11
- Update Example for PB v6.40 Alpha Test
Update v1.08.12
- Fix Checkbox Click in List Mode
Code: Select all
;-TOP
; Comment : Windows ListIconGadget Owner Data
; Author : mk-soft
; Version : v1.08.12
; Create : 26.12.2025
; Update : 08.03.2026
;
; Link : https://www.purebasic.fr/english/viewtopic.php?t=88103
;
; Description
;
; EventType:
; The check box sends an EventType #PB_EventType_StatusChange. EventData receives the item.
;
; Custom Sort Callback:
;
; Example:
;
; Procedure CustomSortDoubleDE(*strA.string, *strB.string)
; Protected strA.s, strB.s, a.d, b.d
; strA = *strA\s
; strB = *strB\s
; ReplaceString(strA, ",", ".", #PB_String_InPlace)
; ReplaceString(strB, ",", ".", #PB_String_InPlace)
; a = ValD(strA)
; b = ValD(strB)
; If a < b
; ProcedureReturn #PB_Sort_Lesser
; ElseIf a > b
; ProcedureReturn #PB_Sort_Greater
; Else
; ProcedureReturn #PB_Sort_Equal
; EndIf
; EndProcedure
;
EnableExplicit
;- Import
Import ""
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
SetWindowSubclass_(hWnd, *fnSubclass, uIdSubclass, dwRefData) As "SetWindowSubclass"
GetWindowSubclass_(hWnd, *fnSubclass, uIdSubclass, *dwRefData) As "GetWindowSubclass"
RemoveWindowSubclass_(hWnd, *fnSubclass, uIdSubclass) As "RemoveWindowSubclass"
DefSubclassProc_(hWnd, uMsg, wParam, lParam) As "DefSubclassProc"
CompilerElse
SetWindowSubclass_(hWnd, *fnSubclass, uIdSubclass, dwRefData) As "_SetWindowSubclass@16"
GetWindowSubclass_(hWnd, *fnSubclass, uIdSubclass, *dwRefData) As "_GetWindowSubclass@16"
RemoveWindowSubclass_(hWnd, *fnSubclass, uIdSubclass) As "_RemoveWindowSubclass@12"
DefSubclassProc_(hWnd, uMsg, wParam, lParam) As "_DefSubclassProc@16"
CompilerEndIf
EndImport
;- Configuration
#USE_GLOBAL_LISTICON_OWNER_DATA = #True
;- Define
#LISTICON_COLUMN_SIZE = 20
#LISTICON_HEADER_SELECT_COLOR = #Black
#LISTICON_HEADER_SELECT_COLOR_BK = $FFE1CA
#LVIS_UNCHECKED = $1000;
#LVIS_CHECKED = $2000 ;
#ILC_COLOR32 = $00000020
Structure udtListIconItem
; Sort reference on top
*Reference
; Item Data
State.l
ItemColor.l
ItemColorBk.l
ItemImage.l
UserData.i
Array Column.s(#LISTICON_COLUMN_SIZE - 1)
Array ColumnColor.l(#LISTICON_COLUMN_SIZE - 1)
Array ColumnColorBk.l(#LISTICON_COLUMN_SIZE - 1)
EndStructure
Structure udtListIconData
Gadget.i
ExStyle.l
Refresh.l
; Items
CountItems.l
CountColumns.l
List Items.udtListIconItem()
; Images
hImageList.i
Map ImageList.l()
; Header Colors
IsHeaderColor.l
HeaderColor.l
HeaderColorBk.i
HeaderColorSelect.l
HeaderColorSelectBk.i
Array HeaderColumnColor.l(0)
Array HeaderColumnColorBk.i(0)
Text.s{256}
Null.u
EndStructure
Global NewMap ListIconData.udtListIconData()
Global CheckBoxSize = DesktopScaledX(16)
Global HeaderLineColor = GetSysColorBrush_(#COLOR_3DFACE)
; ----
;- Private
Procedure LvnGetDispInfoCB(*Data.NMLVDISPINFO)
Protected gadget, *items.udtListIconData
With *Data
;gadget = GetProp_(\hdr\hwndFrom, "PB_ID")
gadget = GetWindowLongPtr_(\hdr\hwndFrom, #GWLP_ID)
If Not FindMapElement(ListIconData(), Str(gadget))
ProcedureReturn #False
EndIf
*items = @ListIconData()
If \item\iItem >= *items\CountItems
ProcedureReturn #False
EndIf
SelectElement(*items\Items(), \item\iItem)
If \item\mask & #LVIF_TEXT
\item\pszText = @*items\Items()\Column(\item\iSubItem)
EndIf
If \item\mask & #LVIF_STATE
\item\stateMask = #LVIS_STATEIMAGEMASK
\item\state = *items\Items()\State
EndIf
If \item\mask & #LVIF_IMAGE
If *items\Items()\ItemImage >= 0
\item\iImage = *items\Items()\ItemImage
EndIf
EndIf
ProcedureReturn #True
EndWith
EndProcedure
; ----
Procedure LvnCustomDrawCB(*DrawData.NMLVCUSTOMDRAW)
Protected r1, gadget, gadgetcolor, *items.udtListIconData
With *DrawData
;gadget = GetProp_(\nmcd\hdr\hwndFrom, "PB_ID")
gadget = GetWindowLongPtr_(\nmcd\hdr\hwndFrom, #GWLP_ID)
If Not FindMapElement(ListIconData(), Str(gadget))
ProcedureReturn #PB_Default
EndIf
*items = @ListIconData()
If \nmcd\dwItemSpec >= *items\CountItems
ProcedureReturn #PB_Default
EndIf
If \nmcd\dwItemSpec < 0
ProcedureReturn #PB_Default
EndIf
Select \nmcd\dwDrawStage
Case #CDDS_PREPAINT
r1 = #PB_Default
Case #CDDS_ITEMPREPAINT
r1 = #CDRF_NOTIFYSUBITEMDRAW
Case #CDDS_SUBITEMPREPAINT
SelectElement(*items\Items(), \nmcd\dwItemSpec)
; Text Color
If *items\Items()\ColumnColor(\iSubItem) <> #PB_Default
\clrText = *items\Items()\ColumnColor(\iSubItem)
ElseIf *items\Items()\ItemColor <> #PB_Default
\clrText = *items\Items()\ItemColor
Else
gadgetcolor = GetGadgetColor(gadget, #PB_Gadget_FrontColor)
If gadgetcolor = #PB_Default
\clrText = #CLR_DEFAULT
Else
\clrText = gadgetcolor
EndIf
EndIf
; Back Color
If *items\Items()\ColumnColorBk(\iSubItem) <> #PB_Default
\clrTextBk = *items\Items()\ColumnColorBk(\iSubItem)
ElseIf *items\Items()\ItemColorBk <> #PB_Default
\clrTextBk = *items\Items()\ItemColorBk
Else
gadgetcolor = GetGadgetColor(gadget, #PB_Gadget_BackColor)
If gadgetcolor = #PB_Default
\clrTextBk = #CLR_DEFAULT
Else
\clrTextBk = gadgetcolor
EndIf
EndIf
r1 = #CDRF_DODEFAULT
Default
r1 = #PB_Default
EndSelect
ProcedureReturn r1
EndWith
EndProcedure
; ----
Procedure LvnClickCB(*ItemData.NMITEMACTIVATE)
Protected gadget, style, x1, x2, *items.udtListIconData, lvItem.LVITEM, rect.RECT
With *ItemData
;gadget = GetProp_(\hdr\hwndFrom, "PB_ID")
gadget = GetWindowLongPtr_(\hdr\hwndFrom, #GWLP_ID)
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
If Not (ListIconData()\ExStyle & #LVS_EX_CHECKBOXES)
ProcedureReturn #False
EndIf
If \iItem < 0
ProcedureReturn #False
EndIf
SendMessage_(\hdr\hwndFrom, #LVM_GETITEMRECT, \iItem, @rect)
If \ptAction\x - rect\left > CheckBoxSize
ProcedureReturn #False
EndIf
If \iItem >= ListIconData()\CountItems
ProcedureReturn #False
EndIf
SelectElement(ListIconData()\Items(), \iItem)
If ListIconData()\Items()\State & #LVIS_CHECKED
ListIconData()\Items()\State | #LVIS_UNCHECKED & ~#LVIS_CHECKED
Else
ListIconData()\Items()\State | #LVIS_CHECKED & ~#LVIS_UNCHECKED
EndIf
; Redraw selected item
InvalidateRect_(\hdr\hwndFrom, rect, #True)
; Send PB message
PostEvent(#PB_Event_Gadget, GetActiveWindow(), gadget, #PB_EventType_StatusChange, \iItem)
ProcedureReturn #True
EndWith
EndProcedure
; ----
Procedure LvnKeyDownCB(*KeyData.LVKEYDOWN)
Protected gadget, iItem, *items.udtListIconData, lvItem.LVITEM, rect.RECT
With *KeyData
;gadget = GetProp_(\hdr\hwndFrom, "PB_ID")
gadget = GetWindowLongPtr_(\hdr\hwndFrom, #GWLP_ID)
If Not FindMapElement(ListIconData(), Str(gadget))
ProcedureReturn #False
EndIf
If Not (ListIconData()\ExStyle & #LVS_EX_CHECKBOXES)
ProcedureReturn #False
EndIf
If \wVKey <> #VK_SPACE
ProcedureReturn #False
EndIf
iItem = SendMessage_(\hdr\hwndFrom, #LVM_GETSELECTIONMARK, 0, 0)
If iItem < 0 Or iItem >= ListIconData()\CountItems
ProcedureReturn #False
EndIf
SelectElement(ListIconData()\Items(), iItem)
If ListIconData()\Items()\State & #LVIS_CHECKED
ListIconData()\Items()\State | #LVIS_UNCHECKED & ~#LVIS_CHECKED
Else
ListIconData()\Items()\State | #LVIS_CHECKED & ~#LVIS_UNCHECKED
EndIf
; Redraw selected item
SendMessage_(\hdr\hwndFrom, #LVM_GETITEMRECT, iItem, @rect)
InvalidateRect_(\hdr\hwndFrom, rect, #True)
; Send PB message
PostEvent(#PB_Event_Gadget, GetActiveWindow(), gadget, #PB_EventType_StatusChange, iItem)
ProcedureReturn #True
EndWith
EndProcedure
; ----
Declare _LvnReleaseListIconGadget(Gadget)
Procedure LvnWindowCB(hWnd, uMsg, wParam, lParam, uIdSubclass, *dwRefData.udtListIconData)
Protected r1, *nmh.NMHDR
Select uMsg
Case #WM_NOTIFY
*nmh = lParam
Select *nmh\code
Case #LVN_GETDISPINFO
If LvnGetDispInfoCB(lParam)
ProcedureReturn #True
EndIf
Case #NM_CUSTOMDRAW
r1 = LvnCustomDrawCB(lParam)
If r1 <> #PB_Default
ProcedureReturn r1
EndIf
Case #NM_CLICK
If LvnClickCB(lParam)
ProcedureReturn 0
EndIf
Case #LVN_KEYDOWN
If LvnKeyDownCB(lParam)
ProcedureReturn 0
EndIf
EndSelect
Case #WM_DESTROY
If *dwRefData
_LvnReleaseListIconGadget(*dwRefData\Gadget)
EndIf
EndSelect
ProcedureReturn DefSubclassProc_(hWnd, uMsg, wParam, lParam)
EndProcedure
; ----
Declare _LvnDrawHeader(*ListIconData.udtListIconData, *lpCD.NMCUSTOMDRAW)
Procedure LvnGadgetCB(hWnd, uMsg, wParam, lParam, uIdSubclass, dwRefData)
Protected *nmh.NMHDR
Select uMsg
Case #WM_NOTIFY
*nmh = lParam
Select *nmh\code
Case #NM_CUSTOMDRAW
ProcedureReturn _LvnDrawHeader(dwRefData, lParam)
EndSelect
EndSelect
ProcedureReturn DefSubclassProc_(hWnd, uMsg, wParam, lParam)
EndProcedure
; ----
Procedure _LvnDrawHeader(*ListIconData.udtListIconData, *lpCD.NMCUSTOMDRAW)
Protected hdi.HDITEM, format, Color.l, ColorBk.i
With *ListIconData
Select *lpCD\dwDrawStage
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
If *lpCD\uItemState & #CDIS_SELECTED
; Selected Text and Background Color
Color = \HeaderColorSelect
ColorBk = \HeaderColorSelectBk
Else
; Text Color
If \HeaderColumnColor(*lpCD\dwItemSpec) <> #PB_Default
Color = \HeaderColumnColor(*lpCD\dwItemSpec)
ElseIf \HeaderColor <> #PB_Default
Color = \HeaderColor
Else
color = #Black
EndIf
; Background Color
If \HeaderColumnColorBk(*lpCD\dwItemSpec) <> #PB_Default
ColorBk = \HeaderColumnColorBk(*lpCD\dwItemSpec)
ElseIf \HeaderColorBk <> #PB_Default
ColorBk = \HeaderColorBk
EndIf
EndIf
; Get Header Item
hdi\mask = #HDI_TEXT | #HDI_FORMAT
hdi\pszText = *ListIconData + OffsetOf(udtListIconData\Text)
hdi\cchTextMax = 256
SendMessage_(*lpCD\hdr\hwndFrom, #HDM_GETITEM, *lpCD\dwItemSpec, @hdi)
; Draw Background
If ColorBk <> #PB_Default
FrameRect_(*lpCD\hdc, *lpCD\rc, HeaderLineColor)
*lpCD\rc\left + 0
*lpCD\rc\right - 1
FillRect_(*lpCD\hdc, *lpCD\rc, ColorBk)
EndIf
; Draw Text
SetBkMode_(*lpCD\hdc,#TRANSPARENT)
SetTextColor_(*lpCD\hdc, Color)
format = #DT_VCENTER | #DT_SINGLELINE | #DT_END_ELLIPSIS
If hdi\fmt & #HDF_CENTER
format | #DT_CENTER
EndIf
If hdi\fmt & #HDF_RIGHT
format | #DT_RIGHT
EndIf
*lpCD\rc\left + 6
*lpCD\rc\right - 5
DrawText_(*lpCD\hdc, @\Text, Len(\Text), *lpCD\rc, format)
ProcedureReturn #CDRF_SKIPDEFAULT
Default
ProcedureReturn #CDRF_DODEFAULT
EndSelect
EndWith
EndProcedure
; ----
; Refresh Gadget over BindGadgetEvent
Procedure _LvnRefreshListIconGadget()
Protected *ListIconData.udtListIconData
With *ListIconData
*ListIconData = EventData()
If *ListIconData
\Refresh = #False
If IsGadget(\Gadget)
SendMessage_(GadgetID(\Gadget), #LVM_SETITEMCOUNT, \CountItems, 1)
InvalidateRect_(GadgetID(\Gadget), 0, #True)
EndIf
EndIf
EndWith
EndProcedure
; ----
Procedure _LvnInitializeHeaderColors(*ListIconData.udtListIconData)
Protected count
With *ListIconData
If Not \IsHeaderColor
\IsHeaderColor = #True
; Header Default Colors
\HeaderColor = #PB_Default
\HeaderColorBk = #PB_Default
\HeaderColorSelect = #LISTICON_HEADER_SELECT_COLOR
\HeaderColorSelectBk = CreateSolidBrush_(#LISTICON_HEADER_SELECT_COLOR_BK)
count = \CountColumns
Dim \HeaderColumnColor(count)
Dim \HeaderColumnColorBk(count)
FillMemory(\HeaderColumnColor(), (count + 1) * SizeOf(LONG), #PB_Default, #PB_Long)
FillMemory(\HeaderColumnColorBk(), (count + 1) * SizeOf(INTEGER), #PB_Default, #PB_Integer)
; Set Header Color Callback
SetWindowSubclass_(GadgetID(\Gadget), @LvnGadgetCB(), *ListIconData, *ListIconData)
EndIf
EndWith
EndProcedure
; ----
Procedure _LvnReleaseHeaderColors(*ListIconData.udtListIconData)
Protected index, count
With *ListIconData
If \IsHeaderColor
\IsHeaderColor = #False
; Remove Header Color Callback
RemoveWindowSubclass_(GadgetID(\Gadget), @LvnGadgetCB(), *ListIconData)
; Release Header Colors
\HeaderColor = #PB_Default
If \HeaderColorBk <> #PB_Default
DeleteObject_(\HeaderColorBk)
\HeaderColorBk = #PB_Default
EndIf
; Release Header Selection Colors
\HeaderColorSelect = #PB_Default
If \HeaderColorSelectBk <> #PB_Default
DeleteObject_(\HeaderColorSelectBk)
\HeaderColorSelectBk = #PB_Default
EndIf
; Release Header Column Colors
count = ArraySize(\HeaderColumnColorBk())
For index = 0 To count
If \HeaderColumnColorBk(index) <> #PB_Default
DeleteObject_(\HeaderColumnColorBk(index))
\HeaderColumnColorBk(index) = #PB_Default
EndIf
Next
Dim \HeaderColumnColor(0)
Dim \HeaderColumnColorBk(0)
EndIf
EndWith
EndProcedure
; ----
Procedure _LvnReleaseListIconGadget(Gadget)
If FindMapElement(ListIconData(), Str(Gadget))
; Unbind Gadget Event
UnbindGadgetEvent(Gadget, @_LvnRefreshListIconGadget(), #PB_EventType_Refresh)
; Remove Parent Window Callback
RemoveWindowSubclass_(GetParent_(GadgetID(Gadget)), @LvnWindowCB(), GadgetID(Gadget))
; Release Header Colors
If ListIconData()\IsHeaderColor
_LvnReleaseHeaderColors(@ListIconData())
EndIf
; Release Images
If ListIconData()\hImageList
ImageList_Destroy_(ListIconData()\hImageList)
EndIf
; Release List Icon Data
DeleteMapElement(ListIconData())
; Destroy ListIconGadget
FreeGadget(Gadget)
EndIf
EndProcedure
; ----
Procedure _LvnAddListIconImage(*ListIconData.udtListIconData, *Item.udtListIconItem, ImageID)
Protected Index
With *ListIconData
If Not \hImageList
\hImageList = ImageList_Create_(16, 16, #ILC_COLOR32, 2, 0)
If \hImageList
SendMessage_(GadgetID(\Gadget), #LVM_SETIMAGELIST, #LVSIL_SMALL, ListIconData()\hImageList)
Else
ProcedureReturn #False
EndIf
EndIf
If Not FindMapElement(\ImageList(), Str(ImageID))
AddMapElement(\ImageList(), Str(ImageID))
Index = ImageList_Add_(\hImageList, ImageID, 0)
If index < 0
DeleteMapElement(\ImageList())
ProcedureReturn #False
EndIf
\ImageList() = Index
EndIf
*Item\ItemImage = \ImageList()
ProcedureReturn #True
EndWith
EndProcedure
; ----
;- Public
Procedure ListIconGadgetEx(Gadget, x, y, Width, height, FirstColumnTitle$, FirstColumnWith, Flags=0)
Protected id, ExStyle, hHeader
id = ListIconGadget(Gadget, x, y, Width, height, FirstColumnTitle$, FirstColumnWith, Flags | #LVS_OWNERDATA)
If id
If Gadget = #PB_Any
Gadget = id
EndIf
; Initialize List Icon Data
If FindMapElement(ListIconData(), Str(Gadget))
ClearList(ListIconData()\Items())
Else
AddMapElement(ListIconData(), Str(Gadget))
EndIf
; Fix Gridlines
ExStyle = SendMessage_(GadgetID(Gadget), #LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)
If Flags & #PB_ListIcon_GridLines
ExStyle | #LVS_EX_GRIDLINES
SendMessage_(GadgetID(Gadget), #LVM_SETEXTENDEDLISTVIEWSTYLE, 0, ExStyle)
EndIf
; Set Default Values
ListIconData()\Gadget = Gadget
ListIconData()\ExStyle = ExStyle
ListIconData()\CountItems = 0
ListIconData()\CountColumns = 1
; Bind Gadget Event
BindGadgetEvent(Gadget, @_LvnRefreshListIconGadget(), #PB_EventType_Refresh)
; Set Parent Window Callback
SetWindowSubclass_(GetParent_(GadgetID(Gadget)), @LvnWindowCB(), GadgetID(Gadget), @ListIconData())
EndIf
ProcedureReturn id
EndProcedure
; ----
Procedure FreeGadgetEx(Gadget)
If FindMapElement(ListIconData(), Str(Gadget))
_LvnReleaseListIconGadget(Gadget)
Else
FreeGadget(Gadget)
EndIf
EndProcedure
; ----
Procedure AddGadgetColumnEx(Gadget, Column, Title$, Width)
Protected index, count, array_size
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn AddGadgetColumn(Gadget, Column, Title$, Width)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
count = ListIconData()\CountColumns
If Column > count
ProcedureReturn #False
EndIf
If Column = -1
Column = count
EndIf
ListIconData()\CountColumns + 1
SendMessage_(GadgetID(Gadget), #LVM_SETITEMCOUNT, 0, 1)
AddGadgetColumn(Gadget, Column, Title$, Width)
SendMessage_(GadgetID(Gadget), #LVM_SETITEMCOUNT, ListIconData()\CountItems, 1)
; Update Header Column
If ListIconData()\IsHeaderColor
array_size = ListIconData()\CountColumns
If ArraySize(ListIconData()\HeaderColumnColor()) < array_size
ReDim ListIconData()\HeaderColumnColor(array_size)
ReDim ListIconData()\HeaderColumnColorBk(array_size)
ListIconData()\HeaderColumnColor(array_size) = #PB_Default
ListIconData()\HeaderColumnColorBk(array_size) = #PB_Default
EndIf
For index = count To Column + 1 Step -1
ListIconData()\HeaderColumnColor(index) = ListIconData()\HeaderColumnColor(index-1)
ListIconData()\HeaderColumnColorBk(index) = ListIconData()\HeaderColumnColorBk(index-1)
Next
ListIconData()\HeaderColumnColor(Column) = #PB_Default
ListIconData()\HeaderColumnColorBk(Column) = #PB_Default
EndIf
; Update Items Columns
array_size = 0
If ListIconData()\CountItems
FirstElement(ListIconData()\Items())
If ArraySize(ListIconData()\Items()\Column()) < ListIconData()\CountColumns
array_size = ListIconData()\CountColumns
EndIf
ForEach ListIconData()\Items()
If array_size
ReDim ListIconData()\Items()\Column(array_size)
ReDim ListIconData()\Items()\ColumnColor(array_size)
ReDim ListIconData()\Items()\ColumnColorBk(array_size)
EndIf
For index = count To Column + 1 Step -1
ListIconData()\Items()\Column(index) = ListIconData()\Items()\Column(index-1)
ListIconData()\Items()\ColumnColor(index) = ListIconData()\Items()\ColumnColor(index-1)
ListIconData()\Items()\ColumnColorBk(index) = ListIconData()\Items()\ColumnColorBk(index-1)
Next
ListIconData()\Items()\Column(Column) = #Empty$
ListIconData()\Items()\ColumnColor(Column) = #PB_Default
ListIconData()\Items()\ColumnColorBk(Column) = #PB_Default
Next
EndIf
InvalidateRect_(GadgetID(Gadget), 0, #True)
ProcedureReturn #True
EndProcedure
; ----
Procedure RemoveGadgetColumnEx(Gadget, Column)
Protected index, count
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn RemoveGadgetColumn(Gadget, Column)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
If Column = #PB_All
SendMessage_(GadgetID(Gadget), #LVM_SETITEMCOUNT, 0, 1)
ClearList(ListIconData()\Items())
ListIconData()\CountItems = 0
ListIconData()\CountColumns = 0
RemoveGadgetColumn(Gadget, #PB_All)
Else
count = ListIconData()\CountColumns
If Column >= count
ProcedureReturn #False
EndIf
If Column < 0
ProcedureReturn #False
EndIf
SendMessage_(GadgetID(Gadget), #LVM_SETITEMCOUNT, 0, 1)
RemoveGadgetColumn(Gadget, Column)
SendMessage_(GadgetID(Gadget), #LVM_SETITEMCOUNT, ListIconData()\CountItems, 1)
ListIconData()\CountColumns - 1
; Update Header Columns
If ListIconData()\IsHeaderColor
If ListIconData()\HeaderColumnColorBk(Column) <> #PB_Default
DeleteObject_(ListIconData()\HeaderColumnColorBk(Column))
ListIconData()\HeaderColumnColorBk(Column) = #PB_Default
EndIf
count - 1
For index = Column To count
ListIconData()\HeaderColumnColor(index) = ListIconData()\HeaderColumnColor(index + 1)
ListIconData()\HeaderColumnColorBk(index) = ListIconData()\HeaderColumnColorBk(index + 1)
Next
EndIf
; Update Items Columns
ForEach ListIconData()\Items()
For index = Column To count
ListIconData()\Items()\Column(index) = ListIconData()\Items()\Column(index + 1)
ListIconData()\Items()\ColumnColor(index) = ListIconData()\Items()\ColumnColor(index + 1)
ListIconData()\Items()\ColumnColorBk(index) = ListIconData()\Items()\ColumnColorBk(index + 1)
Next
ListIconData()\Items()\Column(index) = #Empty$
ListIconData()\Items()\ColumnColor(index) = #PB_Default
ListIconData()\Items()\ColumnColorBk(index) = #PB_Default
Next
EndIf
If ListIconData()\CountColumns = 0
If ListIconData()\IsHeaderColor
; Release Header Column Colors
_LvnReleaseHeaderColors(@ListIconData())
EndIf
EndIf
InvalidateRect_(GadgetID(Gadget), 0, #True)
ProcedureReturn #True
EndProcedure
; ----
Procedure AddGadgetItemEx(Gadget, Item, Text$, ImageID=0, Flags=0)
Protected *item.udtListIconItem, count, columns, index, size
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn AddGadgetItem(Gadget, Item, Text$, ImageID, Flags)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
count = ListSize(ListIconData()\Items())
If Item = -1
LastElement(ListIconData()\Items())
AddElement(ListIconData()\Items())
ElseIf Item = count
LastElement(ListIconData()\Items())
AddElement(ListIconData()\Items())
ElseIf Item < count
SelectElement(ListIconData()\Items(), Item)
InsertElement(ListIconData()\Items())
Else
ProcedureReturn #False
EndIf
ListIconData()\CountItems = ListSize(ListIconData()\Items())
columns = ListIconData()\CountColumns
If ArraySize(ListIconData()\Items()\Column()) < columns
ReDim ListIconData()\Items()\Column(columns)
ReDim ListIconData()\Items()\ColumnColor(columns)
ReDim ListIconData()\Items()\ColumnColorBk(ListIconData()\CountColumns)
EndIf
*item = @ListIconData()\Items()
*item\State = #LVIS_UNCHECKED
*item\ItemColor = #PB_Default
*item\ItemColorBk = #PB_Default
*item\ItemImage = -1
*item\UserData = 0
columns = CountString(Text$, #LF$)
If columns >= ListIconData()\CountColumns
columns = ListIconData()\CountColumns - 1
EndIf
For index = 0 To columns
*item\Column(index) = StringField(Text$, index + 1, #LF$)
Next
columns + 1
For index = columns To ListIconData()\CountColumns
*item\Column(index) = #Empty$
Next
size = (ArraySize(ListIconData()\Items()\Column()) + 1) * SizeOf(LONG)
FillMemory(@*item\ColumnColor(), size, #PB_Default, #PB_Long)
FillMemory(@*item\ColumnColorBk(), size, #PB_Default, #PB_Long)
If ImageID
_LvnAddListIconImage(@ListIconData(), *Item, ImageID)
EndIf
; Post Event Refresh
If Not ListIconData()\Refresh
ListIconData()\Refresh = #True
PostEvent(#PB_Event_Gadget, GetActiveWindow(), Gadget, #PB_EventType_Refresh, @ListIconData())
EndIf
EndProcedure
; ----
Procedure RemoveGadgetItemEx(Gadget, Item)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn RemoveGadgetItem(Gadget, Item)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn #False
EndIf
If Item < 0
ProcedureReturn #False
EndIf
SelectElement(ListIconData()\Items(), Item)
DeleteElement(ListIconData()\Items())
ListIconData()\CountItems = ListSize(ListIconData()\Items())
; Post Event Refresh
If Not ListIconData()\Refresh
ListIconData()\Refresh = #True
PostEvent(#PB_Event_Gadget, GetActiveWindow(), Gadget, #PB_EventType_Refresh, @ListIconData())
EndIf
ProcedureReturn #True
EndProcedure
; ----
Procedure ClearGadgetItemsEx(Gadget)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn ClearGadgetItems(Gadget)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
ClearList(ListIconData()\Items())
ListIconData()\CountItems = 0
SendMessage_(GadgetID(Gadget), #LVM_SETITEMCOUNT, 0, 1)
InvalidateRect_(GadgetID(Gadget), 0, #True)
ProcedureReturn #True
EndProcedure
; ----
Procedure SetGadgetItemStateEx(Gadget, Item, State)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn SetGadgetItemState(Gadget, Item, State)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn #False
EndIf
If Item < 0
ProcedureReturn #False
EndIf
SelectElement(ListIconData()\Items(), Item)
If State & #PB_ListIcon_Checked
ListIconData()\Items()\State | #LVIS_CHECKED & ~#LVIS_UNCHECKED
Else
ListIconData()\Items()\State | #LVIS_UNCHECKED & ~#LVIS_CHECKED
EndIf
; Post Event Refresh
If Not ListIconData()\Refresh
ListIconData()\Refresh = #True
PostEvent(#PB_Event_Gadget, GetActiveWindow(), Gadget, #PB_EventType_Refresh, @ListIconData())
EndIf
EndProcedure
; ----
Procedure GetGadgetItemStateEx(Gadget, Item)
Protected r1
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn GetGadgetItemState(Gadget, Item)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn 0
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn 0
EndIf
If Item < 0
ProcedureReturn 0
EndIf
SelectElement(ListIconData()\Items(), Item)
If ListIconData()\Items()\State & #LVIS_CHECKED
r1 = #PB_ListIcon_Checked
EndIf
If SendMessage_(GadgetID(Gadget), #LVM_GETITEMSTATE, Item, #LVIS_SELECTED) & #LVIS_SELECTED
r1 | #PB_ListIcon_Selected
EndIf
ProcedureReturn r1
EndProcedure
; ----
Procedure SetGadgetItemDataEx(Gadget, Item, Value)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn SetGadgetItemData(Gadget, Item, Value)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn #False
EndIf
If Item < 0
ProcedureReturn #False
EndIf
SelectElement(ListIconData()\Items(), Item)
ListIconData()\Items()\UserData = Value
ProcedureReturn #True
EndProcedure
; ----
Procedure GetGadgetItemDataEx(Gadget, Item)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn GetGadgetItemData(Gadget, Item)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn 0
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn 0
EndIf
If Item < 0
ProcedureReturn 0
EndIf
SelectElement(ListIconData()\Items(), Item)
ProcedureReturn ListIconData()\Items()\UserData
EndProcedure
; ----
Procedure SetGadgetItemTextEx(Gadget, Item, Text$, Column=-1)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon Or Item < 0
If Column = -1
ProcedureReturn SetGadgetItemText(Gadget, Item, Text$)
Else
ProcedureReturn SetGadgetItemText(Gadget, Item, Text$, Column)
EndIf
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn 0
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn 0
EndIf
If Column >= ListIconData()\CountColumns
ProcedureReturn #False
EndIf
If Column < 0
Column = 0
EndIf
SelectElement(ListIconData()\Items(), Item)
ListIconData()\Items()\Column(Column) = Text$
InvalidateRect_(GadgetID(Gadget), 0, #True)
ProcedureReturn #True
EndProcedure
; ----
Procedure.s GetGadgetItemTextEx(Gadget, Item, Column=-1)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon Or Item < 0
If Column = -1
ProcedureReturn GetGadgetItemText(Gadget, Item)
Else
ProcedureReturn GetGadgetItemText(Gadget, Item, Column)
EndIf
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn ""
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn ""
EndIf
If Column >= ListIconData()\CountColumns
ProcedureReturn ""
EndIf
If Column < 0
Column = 0
EndIf
SelectElement(ListIconData()\Items(), Item)
ProcedureReturn ListIconData()\Items()\Column(Column)
EndProcedure
; ----
Procedure SetGadgetItemColorEx(Gadget, Item, ColorType, Color, Column=-1)
Protected color_red, color_green, color_blue
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
If Column = -1
ProcedureReturn SetGadgetItemColor(Gadget, Item, ColorType, Color)
Else
ProcedureReturn SetGadgetItemColor(Gadget, Item, ColorType, Color, Column)
EndIf
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn #False
EndIf
If Item < 0
; Header Colors
If Not ListIconData()\IsHeaderColor
; Initalize Header Colors
_LvnInitializeHeaderColors(@ListIconData())
EndIf
If Column < 0
; Set Header Color
Select ColorType
Case #PB_Gadget_FrontColor
ListIconData()\HeaderColor = Color
Case #PB_Gadget_BackColor
If ListIconData()\HeaderColorBk <> #PB_Default
DeleteObject_(ListIconData()\HeaderColorBk)
EndIf
ListIconData()\HeaderColorBk = CreateSolidBrush_(Color)
; Change Header Color Select
color_red = Red(color) * 92 / 100
color_green = Green(color) * 92 / 100
color_blue = Blue(color) * 92 / 100
color = RGB(color_red, color_green, color_blue)
ListIconData()\HeaderColorSelect = ListIconData()\HeaderColor
If ListIconData()\HeaderColorSelectBk <> #PB_Default
DeleteObject_(ListIconData()\HeaderColorSelectBk)
EndIf
ListIconData()\HeaderColorSelectBk = CreateSolidBrush_(Color)
EndSelect
ElseIf Column < ListIconData()\CountColumns
; Set Header Column Color
Select ColorType
Case #PB_Gadget_FrontColor
ListIconData()\HeaderColumnColor(Column) = Color
Case #PB_Gadget_BackColor
If ListIconData()\HeaderColumnColorBk(Column) <> #PB_Default
DeleteObject_(ListIconData()\HeaderColumnColorBk(Column))
EndIf
ListIconData()\HeaderColumnColorBk(Column) = CreateSolidBrush_(Color)
EndSelect
EndIf
; Refresh Header
InvalidateRect_(GadgetID(Gadget), 0, #True)
Else
; Set Items Colors
SelectElement(ListIconData()\Items(), Item)
If Column < 0
; Set Item Color
Select ColorType
Case #PB_Gadget_FrontColor
ListIconData()\Items()\ItemColor = Color
Case #PB_Gadget_BackColor
ListIconData()\Items()\ItemColorBk = Color
EndSelect
ElseIf Column < ListIconData()\CountColumns
; Set Column Color
Select ColorType
Case #PB_Gadget_FrontColor
ListIconData()\Items()\ColumnColor(Column) = Color
Case #PB_Gadget_BackColor
ListIconData()\Items()\ColumnColorBk(Column) = Color
EndSelect
EndIf
; Post Event Refresh
If Not ListIconData()\Refresh
ListIconData()\Refresh = #True
PostEvent(#PB_Event_Gadget, GetActiveWindow(), Gadget, #PB_EventType_Refresh, @ListIconData())
EndIf
EndIf
ProcedureReturn #True
EndProcedure
; ----
Procedure GetGadgetItemColorEx(Gadget, Item, ColorType, Column=-1)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
If Column = -1
ProcedureReturn GetGadgetItemColor(Gadget, Item, ColorType)
Else
ProcedureReturn GetGadgetItemColor(Gadget, Item, ColorType, Column)
EndIf
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn 0
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn 0
EndIf
If Item < 0
ProcedureReturn #PB_Default
EndIf
If Column >= ListIconData()\CountColumns
ProcedureReturn #PB_Default
EndIf
SelectElement(ListIconData()\Items(), Item)
If Column < 0
Select ColorType
Case #PB_Gadget_FrontColor
ProcedureReturn ListIconData()\Items()\ItemColor
Case #PB_Gadget_BackColor
ProcedureReturn ListIconData()\Items()\ItemColor
EndSelect
Else
Select ColorType
Case #PB_Gadget_FrontColor
ProcedureReturn ListIconData()\Items()\ColumnColor(Column)
Case #PB_Gadget_BackColor
ProcedureReturn ListIconData()\Items()\ColumnColorBk(Column)
EndSelect
EndIf
ProcedureReturn #PB_Default
EndProcedure
; ----
Procedure SetGadgetItemImageEx(Gadget, Item, ImageID)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn SetGadgetItemImage(Gadget, Item, ImageID)
EndIf
If Not FindMapElement(ListIconData(), Str(Gadget))
ProcedureReturn #False
EndIf
If Item >= ListIconData()\CountItems
ProcedureReturn #False
EndIf
If Item < 0
ProcedureReturn #False
EndIf
SelectElement(ListIconData()\Items(), Item)
If ImageID
_LvnAddListIconImage(@ListIconData(), @ListIconData()\Items(), ImageID)
Else
ListIconData()\Items()\ItemImage = -1
EndIf
; Post Event Refresh
If Not ListIconData()\Refresh
ListIconData()\Refresh = #True
PostEvent(#PB_Event_Gadget, GetActiveWindow(), Gadget, #PB_EventType_Refresh, @ListIconData())
EndIf
ProcedureReturn #True
EndProcedure
; ----
;- Private Special Function
Procedure _CustomSortInteger(*strA.String, *strB.String)
Protected a.i, b.i
a = Val(*strA\s)
b = Val(*strB\s)
If a < b
ProcedureReturn #PB_Sort_Lesser
ElseIf a > b
ProcedureReturn #PB_Sort_Greater
Else
ProcedureReturn #PB_Sort_Equal
EndIf
EndProcedure
Procedure _CustomSortDouble(*strA.String, *strB.String)
Protected a.d, b.d
a = ValD(*strA\s)
b = ValD(*strB\s)
If a < b
ProcedureReturn #PB_Sort_Lesser
ElseIf a > b
ProcedureReturn #PB_Sort_Greater
Else
ProcedureReturn #PB_Sort_Equal
EndIf
EndProcedure
;- Public Special Function
; Description
; - Option: #PB_Sort_Ascending, #PB_Sort_Descending, #PB_Sort_NoCase
; - Typ : #PB_String, #PB_Integer, #PB_Double
Procedure SortListIconGadgetEx(Gadget, Option, Column, Typ = #PB_String, StartItem = #PB_Default, EndItem = #PB_Default)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn #False
EndIf
If FindMapElement(ListIconData(), Str(Gadget))
If Column >= ListIconData()\CountColumns
ProcedureReturn #False
EndIf
; Build Sort Reference
ForEach ListIconData()\Items()
ListIconData()\Items()\Reference = @ListIconData()\Items()\Column(Column)
Next
If StartItem <> #PB_Default
If EndItem = #PB_Default
EndItem = ListIconData()\CountItems - 1
EndIf
Select Typ
Case #PB_String
SortStructuredList(ListIconData()\Items(), Option, OffsetOf(udtListIconItem\Reference), #PB_String, StartItem, EndItem)
Case #PB_Integer
CustomSortList(ListIconData()\Items(), @_CustomSortInteger(), Option, StartItem, EndItem)
Case #PB_Double
CustomSortList(ListIconData()\Items(), @_CustomSortDouble(), Option, StartItem, EndItem)
EndSelect
Else
Select Typ
Case #PB_String
SortStructuredList(ListIconData()\Items(), Option, OffsetOf(udtListIconItem\Reference), #PB_String)
Case #PB_Integer
CustomSortList(ListIconData()\Items(), @_CustomSortInteger(), Option)
Case #PB_Double
CustomSortList(ListIconData()\Items(), @_CustomSortDouble(), Option)
EndSelect
EndIf
InvalidateRect_(GadgetID(Gadget), 0, #True)
EndIf
EndProcedure
; ----
; Description
; - Option: #PB_Sort_Ascending, #PB_Sort_Descending, #PB_Sort_NoCase
Procedure CustomSortListIconGadgetEx(Gadget, Option, Column, *CompareProcedure, StartItem = #PB_Default, EndItem = #PB_Default)
If GadgetType(Gadget) <> #PB_GadgetType_ListIcon
ProcedureReturn #False
EndIf
If FindMapElement(ListIconData(), Str(Gadget))
If Column >= ListIconData()\CountColumns
ProcedureReturn #False
EndIf
If Not *CompareProcedure
ProcedureReturn #False
EndIf
; Build Sort Reference
ForEach ListIconData()\Items()
ListIconData()\Items()\Reference = @ListIconData()\Items()\Column(Column)
Next
If StartItem <> #PB_Default
If EndItem = #PB_Default
EndItem = ListIconData()\CountItems - 1
EndIf
CustomSortList(ListIconData()\Items(), *CompareProcedure, Option, StartItem, EndItem)
Else
CustomSortList(ListIconData()\Items(), *CompareProcedure, Option)
EndIf
InvalidateRect_(GadgetID(Gadget), 0, #True)
EndIf
EndProcedure
; ----
;- Macros
CompilerIf #USE_GLOBAL_LISTICON_OWNER_DATA
Macro ListIconGadget(Gadget, x, y, Width, height, FirstColumnTitle, FirstColumnWith, Flags=0)
ListIconGadgetEx(Gadget, x, y, Width, height, FirstColumnTitle, FirstColumnWith, Flags)
EndMacro
Macro FreeGadget(Gadget)
FreeGadgetEx(Gadget)
EndMacro
Macro AddGadgetColumn(Gadget, Column, Title, Width)
AddGadgetColumnEx(Gadget, Column, Title, Width)
EndMacro
Macro RemoveGadgetColumn(Gadget, Column)
RemoveGadgetColumnEx(Gadget, Column)
EndMacro
Macro AddGadgetItem(Gadget, Item, Text, ImageID=0, Flags=0)
AddGadgetItemEx(Gadget, Item, Text, ImageID, Flags)
EndMacro
Macro RemoveGadgetItem(Gadget, Item)
RemoveGadgetItemEx(Gadget, Item)
EndMacro
Macro ClearGadgetItems(Gadget)
ClearGadgetItemsEx(Gadget)
EndMacro
Macro SetGadgetItemState(Gadget, Item, State)
SetGadgetItemStateEx(Gadget, Item, State)
EndMacro
Macro GetGadgetItemState(Gadget, Item)
GetGadgetItemStateEx(Gadget, Item)
EndMacro
Macro SetGadgetItemData(Gadget, Item, Value)
SetGadgetItemDataEx(Gadget, Item, Value)
EndMacro
Macro GetGadgetItemData(Gadget, Item)
GetGadgetItemDataEx(Gadget, Item)
EndMacro
Macro SetGadgetItemText(Gadget, Item, Text, Column=-1)
SetGadgetItemTextEx(Gadget, Item, Text, Column)
EndMacro
Macro GetGadgetItemText(Gadget, Item, Column=-1)
GetGadgetItemTextEx(Gadget, Item, Column)
EndMacro
Macro SetGadgetItemColor(Gadget, Item, ColorType, Color, Column=-1)
SetGadgetItemColorEx(Gadget, Item, ColorType, Color, Column)
EndMacro
Macro GetGadgetItemColor(Gadget, Item, ColorType, Column=-1)
GetGadgetItemColorEx(Gadget, Item, ColorType, Column)
EndMacro
Macro SetGadgetItemImage(Gadget, Item, ImageID)
SetGadgetItemImageEx(Gadget, Item, ImageID)
EndMacro
CompilerEndIf
;- ********
;-Example
CompilerIf #PB_Compiler_IsMainFile
#CharSortAscend = "▲ "
#CharSortDescend = "▼ "
UsePNGImageDecoder()
Procedure Logging(Text.s)
Protected count
count = CountGadgetItems(2)
AddGadgetItem(2, -1 , Text)
SetGadgetState(2, count)
SetGadgetState(2, -1)
EndProcedure
; ----
Procedure ListFillData()
Protected i, time, image0, image1, image2 , dblVal.s, dblVal2.s
time = ElapsedMilliseconds()
; Create Images
CreateImage(0, 16, 16, 32, #PB_Image_Transparent)
If StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AllChannels)
Circle(7, 7, 7, $FF000000 | #Red)
DrawingMode(#PB_2DDrawing_Outlined)
Circle(7, 7, 7, $FF000000 | #Black)
StopDrawing()
EndIf
CreateImage(1, 16, 16, 32, #PB_Image_Transparent)
If StartDrawing(ImageOutput(1))
DrawingMode(#PB_2DDrawing_AllChannels)
Circle(7, 7, 7, $FF000000 | #Yellow)
DrawingMode(#PB_2DDrawing_Outlined)
Circle(7, 7, 7, $FF000000 | #Black)
StopDrawing()
EndIf
CreateImage(2, 16, 16, 32, #PB_Image_Transparent)
If StartDrawing(ImageOutput(2))
DrawingMode(#PB_2DDrawing_AllChannels)
Circle(7, 7, 7, $FF000000 | #Green)
DrawingMode(#PB_2DDrawing_Outlined)
Circle(7, 7, 7, $FF000000 | #Black)
StopDrawing()
EndIf
LoadImage(3, #PB_Compiler_Home + "Examples\Sources\Data\world.png")
LoadImage(4, #PB_Compiler_Home + "Examples\Sources\Data\Drive.bmp")
For i = 0 To 100000
dblVal = StrD(0.001 * Random(100000), 3)
dblVal2 = ReplaceString(StrD(0.001 * Random(100000), 3), ".", ",")
AddGadgetItem(1, -1, "Item " + i + #LF$ + Str(i + 100) + #LF$ + Str(i + 1000) + #LF$ + Str(Random(10000)) + #LF$ + Str(Random(10000)) + #LF$ + dblVal + #LF$ + dblVal2, ImageID(Random(4)))
Next
SetGadgetItemState(1, 2, #PB_ListIcon_Checked)
; Header Colors
SetGadgetItemColor(1, -1, #PB_Gadget_FrontColor, $701919)
SetGadgetItemColor(1, -1, #PB_Gadget_BackColor, $FFBF00)
; Header Column Color
SetGadgetItemColor(1, -1, #PB_Gadget_FrontColor, #White, 2)
SetGadgetItemColor(1, -1, #PB_Gadget_BackColor, #Blue, 2)
SetGadgetItemColor(1, -1, #PB_Gadget_BackColor, #Yellow, 6)
; Item Colors
SetGadgetItemColor(1, 1, #PB_Gadget_BackColor, #Red)
SetGadgetItemColor(1, 1, #PB_Gadget_FrontColor, #Yellow)
SetGadgetItemColor(1, 1, #PB_Gadget_BackColor, #Green, 0)
SetGadgetItemColor(1, 1, #PB_Gadget_FrontColor, #Black, 0)
SetGadgetItemColor(1, 2, #PB_Gadget_BackColor, #Green, 1)
SetGadgetItemColor(1, 2, #PB_Gadget_FrontColor, #Black, 1)
SetGadgetItemColor(1, 3, #PB_Gadget_BackColor, #Red)
SetGadgetItemColor(1, 3, #PB_Gadget_FrontColor, #Yellow)
SetGadgetItemColor(1, 3, #PB_Gadget_BackColor, #Blue, 2)
SetGadgetItemColor(1, 3, #PB_Gadget_FrontColor, #White, 2)
SetGadgetItemColor(1, 5, #PB_Gadget_BackColor, $D0D0D0)
SetGadgetItemColor(1, 5, #PB_Gadget_BackColor, #Yellow, 6)
i - 1
SetGadgetItemColor(1, i, #PB_Gadget_BackColor, #Green)
SetGadgetItemColor(1, i, #PB_Gadget_FrontColor, #Blue)
;AddGadgetItem(1, 10, "Insert Item 10" + #LF$ + Str(1) + #LF$ +Str(2))
SetGadgetItemImage(1, 1, 0)
SetGadgetItemImage(1, 3, 0)
SetGadgetItemImage(1, 5, ImageID(0))
Logging("Fill Time " + Str(ElapsedMilliseconds() - time))
EndProcedure
Procedure ListCheckBoxData()
Protected i, cnt
cnt = CountGadgetItems(1) - 1
For i = 0 To cnt
If Random(1)
SetGadgetItemState(1, i, #PB_ListIcon_Checked)
SetGadgetItemColor(1, i, #PB_Gadget_FrontColor, #Black)
SetGadgetItemColor(1, i, #PB_Gadget_BackColor, $FFE2B0)
Else
SetGadgetItemState(1, i, 0)
SetGadgetItemColor(1, i, #PB_Gadget_FrontColor, #PB_Default)
SetGadgetItemColor(1, i, #PB_Gadget_BackColor, #PB_Default)
EndIf
Next
EndProcedure
; ----
Procedure CustomSortDoubleDE(*strA.string, *strB.string)
Protected strA.s, strB.s, a.d, b.d
strA = ReplaceString(*strA\s, ",", ".")
strB = ReplaceString(*strB\s, ",", ".")
a = ValD(strA)
b = ValD(strB)
If a < b
ProcedureReturn #PB_Sort_Lesser
ElseIf a > b
ProcedureReturn #PB_Sort_Greater
Else
ProcedureReturn #PB_Sort_Equal
EndIf
EndProcedure
; ----
Procedure UpdateWindow()
Protected dx, dy
dx = WindowWidth(0)
dy = WindowHeight(0) - StatusBarHeight(0) - MenuHeight()
; Resize Gadgets
ResizeGadget(3, 0, 0, dx, dy)
EndProcedure
LoadFont(0, "Arial", 11, #PB_Font_Bold)
Procedure Main()
Protected dx, dy, item, state, i, column, count, temp.s, time
#WinStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 420, "Window ListIconGadget Owner Data", #WinStyle)
; MenuBar
CreateMenu(0, WindowID(0))
MenuTitle("&File")
MenuItem(99, "E&xit")
MenuTitle("Test")
MenuItem(1, "Fill CheckBoxed")
MenuItem(2, "Insert Column")
MenuItem(3, "Remove Column")
MenuItem(4, "Remove All Column")
MenuItem(5, "Remove Checked Item")
MenuItem(6, "Remove All Items")
MenuItem(7, "Get Selected Items")
; StatusBar
CreateStatusBar(0, WindowID(0))
AddStatusBarField(#PB_Ignore)
; Gadgets
dx = WindowWidth(0)
dy = WindowHeight(0) - StatusBarHeight(0) - MenuHeight()
#ListStyle = #PB_ListIcon_GridLines | #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect | #PB_ListIcon_MultiSelect
ListIconGadget(1, 5, 5, dx - 10, dy - 10, "Column 0", 200, #ListStyle)
For i = 1 To 6
AddGadgetColumn(1, i, "Column " + i, 200)
Next
SetGadgetItemAttribute(1, 0, #PB_ListIcon_ColumnAlignment, #PB_ListIcon_Center, 1)
SetGadgetItemAttribute(1, 0, #PB_ListIcon_ColumnAlignment, #PB_ListIcon_Right, 2)
SetGadgetColor(1, #PB_Gadget_FrontColor, $4F4F2F)
SetGadgetColor(1, #PB_Gadget_BackColor, $FFFFE0)
SetGadgetFont(1, FontID(0))
ListViewGadget(2, 0, 0, dx, dy)
SplitterGadget(3, 0, 0, dx, dy, 1, 2)
SetGadgetState(3, dy * 2 / 3)
; Bind Events
BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), 0)
ListFillData()
;SetGadgetAttribute(1, #PB_ListIcon_DisplayMode, #PB_ListIcon_List)
; Main Loop
Repeat
Select WaitWindowEvent()
Case #WM_APP
Debug "App"
Case #PB_Event_CloseWindow
Select EventWindow()
Case 0
Break
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case 1
ListCheckBoxData()
Case 2
AddGadgetColumn(1, 6, "Insert", 100)
Case 3
RemoveGadgetColumn(1, 6)
Case 4
RemoveGadgetColumn(1, #PB_All)
Case 5
count = CountGadgetItems(1) - 1
For i = 0 To count
If GetGadgetItemState(1, i) & #PB_ListIcon_Checked
RemoveGadgetItem(1, i)
i - 1
EndIf
Next
Case 6
ClearGadgetItems(1)
Case 7
state = GetGadgetState(1)
count = CountGadgetItems(1) - 1
For i = state To count
If GetGadgetItemState(1, i) & #PB_ListIcon_Selected
Logging( "Selected Item " + i)
EndIf
Next
Case 99
PostEvent(#PB_Event_CloseWindow, 0, 0)
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Select EventType()
Case #PB_EventType_Change
item = GetGadgetState(1)
state = GetGadgetItemState(1, item)
Logging("PB Event Change Item " + item + " / State " + state)
Case #PB_EventType_StatusChange
item = EventData()
state = GetGadgetItemState(1, item)
Logging("PB Event StatusChange Item " + item + " / CheckBox " + Bool(state & #PB_ListIcon_Checked))
Case #PB_EventType_LeftDoubleClick, #PB_EventType_RightClick
item = GetGadgetState(1)
state = GetGadgetItemState(1, item)
Logging("PB Event LeftDoubleClick Item " + item + " / CheckBox " + Bool(state & #PB_ListIcon_Checked))
Case #PB_EventType_ColumnClick
time = ElapsedMilliseconds()
column = GetGadgetAttribute(1, #PB_ListIcon_ClickedColumn)
If column < 2
Logging("ColumnClick - " + GetGadgetItemText(1, -1, column) + " - Sort String")
temp = #CharSortAscend + "Column " + column
SortListIconGadgetEx(1, #PB_Sort_Ascending, column)
Logging("Sort Time " + Str(ElapsedMilliseconds() - time) + "ms")
ElseIf column <= 3
Logging("ColumnClick - " + GetGadgetItemText(1, -1, column) + " - Sort Integer")
temp = #CharSortAscend + "Column " + column
SortListIconGadgetEx(1, #PB_Sort_Ascending, column, #PB_Integer)
Logging("Sort Time " + Str(ElapsedMilliseconds() - time) + "ms")
ElseIf column <= 4
Logging("ColumnClick - " + GetGadgetItemText(1, -1, column) + " - Sort Integer Desc")
temp = #CharSortDescend + "Column " + column
SortListIconGadgetEx(1, #PB_Sort_Descending, column, #PB_Integer)
Logging("Sort Time " + Str(ElapsedMilliseconds() - time) + "ms")
ElseIf column <= 5
Logging("ColumnClick - " + GetGadgetItemText(1, -1, column) + " - Sort Double")
temp = #CharSortAscend + "Column " + column
SortListIconGadgetEx(1, #PB_Sort_Ascending, column, #PB_Double)
Logging("Sort Time " + Str(ElapsedMilliseconds() - time) + "ms")
ElseIf column <= 6
Logging("ColumnClick - " + GetGadgetItemText(1, -1, column) + " - Sort Custom Desc")
temp = #CharSortDescend + "Column " + column
CustomSortListIconGadgetEx(1, #PB_Sort_Descending, column, @CustomSortDoubleDE())
Logging("Sort Time " + Str(ElapsedMilliseconds() - time) + "ms")
Else
Logging("ColumnClick - " + GetGadgetItemText(1, -1, column))
temp = "Column " + column
EndIf
count = GetGadgetAttribute(1, #PB_ListIcon_ColumnCount) - 1
For i = 0 To count
If i = column
SetGadgetItemText(1, -1, temp, i)
Else
SetGadgetItemText(1, -1, "Column " + i, i)
EndIf
Next
Case #PB_EventType_Refresh
count = CountGadgetItems(1)
StatusBarText(0, 0, "Count: " + count)
EndSelect
EndSelect
EndSelect
ForEver
EndIf
EndProcedure : Main()
CompilerEndIf



