by clicking on the column header cell and displaying an ascending or descending icon to also work in PB 6.00 with Asm and C backend and in older PB versions (successfully tested on MacOS 11.7.2 'Big Sur' on an iMac 2019 with Intel x86-64):
Code: Select all
EnableExplicit
Structure TableEntry
Name.S
Address.S
EndStructure
Enumeration #PB_Event_FirstCustomValue
#PB_Event_ListIcon_SortAscending
#PB_Event_ListIcon_SortDescending
EndEnumeration
Define AppDelegate.I = CocoaMessage(0, CocoaMessage(0, 0,
"NSApplication sharedApplication"), "delegate")
Define AscendingArrow.I
Define ColumnArray.I
Define DelegateClass.I = CocoaMessage(0, AppDelegate, "class")
Define DescendingArrow.I
Define i.I
Define LastSortColumn.I
Define SortColumn.I
Define SortIsAscending.I
NewList Table.TableEntry()
ProcedureC WillDisplayCell(Object.I, Selector.I, TableView.I, Cell.I, *Column,
Row.I)
Protected Column.I
Protected CellText.S
Protected ListIconID.I
ListIconID = CocoaMessage(0, TableView, "tag")
Column = CocoaMessage(0, CocoaMessage(0, TableView, "tableColumns"),
"indexOfObject:", *Column)
CocoaMessage(0, Cell, "_setVerticallyCentered:", #YES)
CellText = GetGadgetItemText(ListIconID, Row, Column)
CocoaMessage(0, Cell, "setStringValue:$", @CellText)
EndProcedure
ProcedureC LeftClickOnHeaderCellCallback(Object.I, Selector.I, View.I, Column.I)
Shared SortColumn.I
Shared SortIsAscending.I
SortColumn = Column
If SortIsAscending
PostEvent(#PB_Event_ListIcon_SortDescending)
Else
PostEvent(#PB_Event_ListIcon_SortAscending)
EndIf
SortIsAscending ! 1
EndProcedure
Procedure SortListIcon(ListIconID.I, SortColumn.I)
Shared Table()
Shared SortIsAscending.I
Protected ColumnIndex.I
ColumnIndex = Val(PeekS(CocoaMessage(0, CocoaMessage(0, SortColumn,
"identifier"), "UTF8String"), -1, #PB_UTF8))
If SortIsAscending
If ColumnIndex = 0
SortStructuredList(Table(), #PB_Sort_Ascending,
OffsetOf(TableEntry\Name), #PB_String)
Else
SortStructuredList(Table(), #PB_Sort_Ascending,
OffsetOf(TableEntry\Address), #PB_String)
EndIf
Else
If ColumnIndex = 0
SortStructuredList(Table(), #PB_Sort_Descending,
OffsetOf(TableEntry\Name), #PB_String)
Else
SortStructuredList(Table(), #PB_Sort_Descending,
OffsetOf(TableEntry\Address), #PB_String)
EndIf
EndIf
ClearGadgetItems(ListIconID)
ForEach Table()
AddGadgetItem(ListIconID, -1, Table()\Name + #LF$ + Table()\Address)
Next
EndProcedure
OpenWindow(0, 200, 100, 450, 122, "Sort ListIcon with column click")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Name",
110)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 8)
CocoaMessage(0, GadgetID(0), "sizeLastColumnToFit")
class_addMethod_(DelegateClass,
sel_registerName_("tableView:willDisplayCell:forTableColumn:row:"),
@WillDisplayCell(), "v@:@@@@")
class_addMethod_(DelegateClass,
sel_registerName_("tableView:didClickTableColumn:"),
@LeftClickOnHeaderCellCallback(), "v@:@@")
CocoaMessage(0, GadgetID(0), "setDelegate:", AppDelegate)
For i = 1 To 3
AddElement(Table())
Read.S Table()\Name
Read.S Table()\Address
Next i
ForEach Table()
AddGadgetItem(0, -1, Table()\Name + #LF$ + Table()\Address)
Next
AscendingArrow = CocoaMessage(0, CocoaMessage(0, 0, "NSImage imageNamed:$",
@"NSAscendingSortIndicator"), "retain")
DescendingArrow = CocoaMessage(0, CocoaMessage(0, 0, "NSImage imageNamed:$",
@"NSDescendingSortIndicator"), "retain")
CocoaMessage(@ColumnArray, GadgetID(0), "tableColumns")
CocoaMessage(@SortColumn, ColumnArray, "objectAtIndex:", 0)
LastSortColumn = SortColumn
SortIsAscending = #True
SortListIcon(0, SortColumn)
CocoaMessage(0, GadgetID(0), "setIndicatorImage:", AscendingArrow,
"inTableColumn:", SortColumn)
CocoaMessage(0, GadgetID(0), "setDelegate:", AppDelegate)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_ListIcon_SortAscending
If SortColumn <> LastSortColumn
CocoaMessage(0, GadgetID(0), "setIndicatorImage:", 0,
"inTableColumn:", LastSortColumn)
LastSortColumn = SortColumn
EndIf
SortListIcon(0, SortColumn)
CocoaMessage(0, GadgetID(0), "setIndicatorImage:", AscendingArrow,
"inTableColumn:", SortColumn)
Case #PB_Event_ListIcon_SortDescending
If SortColumn <> LastSortColumn
CocoaMessage(0, GadgetID(0), "setIndicatorImage:", 0,
"inTableColumn:", LastSortColumn)
LastSortColumn = SortColumn
EndIf
SortListIcon(0, SortColumn)
CocoaMessage(0, GadgetID(0), "setIndicatorImage:", DescendingArrow,
"inTableColumn:", SortColumn)
EndSelect
ForEver
End
DataSection
Data.S "Harry Rannit"
Data.S "12 Parliament Way, Battle Street, By the Bay"
Data.S "Ginger Brokeit"
Data.S "330 PureBasic Road, BigTown, CodeCity"
Data.S "Didi Foundit"
Data.S "231 Logo Drive, Mouse House, Downtown"
EndDataSection