Re: Cross-platform column justification of ListIconGadget
Posted: Thu Feb 02, 2017 10:09 pm
My last cross-platform code example is from 2012 and therefore still contains MacOS code for the Carbon framework. The last PureBasic version which is able to run this code example on MacOS is PB 5.11 with subsystem "Carbon". Although I already posted this link inside this thread to a Cocoa solution, for your convenience I have now replaced the Carbon part by the linked Cocoa part so that this example is now working with current PB versions on MacOS (tested successfully on MacOS 10.6.8 'Snow Leopard' with PB 5.44 x86 in both ASCII and Unicode mode and on MacOS 10.9.5 'Mavericks' with PB 5.44 x86 and x64 in both ASCII and Unicode mode).
Furthermore I have included Charly's suggested change in order to be able to run the example on Linux with both GTK2 and GTK3 (Thank you for that hint, Charly!).
Update: I have added the corrected GTK API function gtk_tree_view_column_set_alignment(*TreeColumn, Alignment.F) to the Linux ImportC block because the predefined PureBasic function declares incorrectly Alignment as Integer which resulted in missing header alignment when run on Linux. Thank you to eck49 for reporting the problem!
Furthermore I have included Charly's suggested change in order to be able to run the example on Linux with both GTK2 and GTK3 (Thank you for that hint, Charly!).
Code: Select all
EnableExplicit
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
ImportC ""
g_object_set_double(*Object, Property.P-ASCII, Value.D,
Null) As "g_object_set"
gtk_cell_layout_get_cells(*CellLayout)
gtk_tree_view_column_set_alignment(*TreeColumn.GtkTreeViewColumn,
Alignment.F)
EndImport
CompilerEndSelect
Enumeration
#PB_ListIcon_JustifyColumnLeft
#PB_ListIcon_JustifyColumnCenter
#PB_ListIcon_JustifyColumnRight
EndEnumeration
Procedure SetListIconColumnJustification(ListIconID.I, Column.I, Alignment.I)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Protected AlignmentFactor.F
Protected *CellRenderers
Protected *Column
Protected Count.I
Protected i.I
Select Alignment
Case #PB_ListIcon_JustifyColumnLeft
AlignmentFactor = 0.0
Case #PB_ListIcon_JustifyColumnCenter
AlignmentFactor = 0.5
Case #PB_ListIcon_JustifyColumnRight
AlignmentFactor = 1.0
EndSelect
*Column = gtk_tree_view_get_column_(GadgetID(ListIconID), Column)
If *Column
gtk_tree_view_column_set_alignment(*Column, AlignmentFactor)
*CellRenderers = gtk_cell_layout_get_cells(*Column)
If *CellRenderers
Count = g_list_length_(*CellRenderers)
For i = 0 To Count - 1
g_object_set_double(g_list_nth_data_(*CellRenderers, i), "xalign",
AlignmentFactor, #Null)
Next i
g_list_free_(*CellRenderers)
EndIf
EndIf
CompilerCase #PB_OS_MacOS
Protected ColumnHeaderCell.I
Protected ColumnObject.I
Protected ColumnObjectArray.I
Select Alignment
Case #PB_ListIcon_JustifyColumnLeft
Alignment = #NSLeftTextAlignment
Case #PB_ListIcon_JustifyColumnCenter
Alignment = #NSCenterTextAlignment
Case #PB_ListIcon_JustifyColumnRight
Alignment = #NSRightTextAlignment
EndSelect
; ----- Justify text of column cells
CocoaMessage(@ColumnObjectArray, GadgetID(ListIconID), "tableColumns")
CocoaMessage(@ColumnObject, ColumnObjectArray, "objectAtIndex:", Column)
CocoaMessage(0, CocoaMessage(0, ColumnObject, "dataCell"), "setAlignment:", Alignment)
; ----- Justify text of column header
CocoaMessage(@ColumnHeaderCell, ColumnObject, "headerCell")
CocoaMessage(0, ColumnHeaderCell, "setAlignment:", Alignment)
; ----- Redraw ListIcon contents to see change
CocoaMessage(0, GadgetID(ListIconID), "reloadData")
CompilerCase #PB_OS_Windows
Protected ListIconColumn.LV_COLUMN
ListIconColumn\mask = #LVCF_FMT
Select Alignment
Case #PB_ListIcon_JustifyColumnLeft
ListIconColumn\fmt = #LVCFMT_LEFT
Case #PB_ListIcon_JustifyColumnCenter
ListIconColumn\fmt = #LVCFMT_CENTER
Case #PB_ListIcon_JustifyColumnRight
ListIconColumn\fmt = #LVCFMT_RIGHT
EndSelect
SendMessage_(GadgetID(ListIconID), #LVM_SETCOLUMN, Column, @ListIconColumn)
CompilerEndSelect
EndProcedure
OpenWindow(0, 200, 100, 445, 90, "Right justify 1st column")
ListIconGadget(0, 5, 5, 435, 80, "Name", 110)
AddGadgetColumn(0, 1, "Address", 300)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
SetListIconColumnJustification(0, 0, #PB_ListIcon_JustifyColumnRight)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow