Although my code example posted above is working quite fine, it is a hack which messes around with PureBasic internals by returning view-based objects instead of cell-based objects. This prevents PureBasic events and PureBasic functions like GetGadgetItemText() to work correctly for the ListIconGadget! Therefore I programmed a more compatible cell-based approach using NSComboBoxCells. But now the ComboBoxes are not editable anymore. If you need editable ComboBoxes you should take a look into
more advanced code example.
This code example was tested successfully with PB 5.44 x86 and x64 in ASCII and Unicode mode on these MacOS versions:
- 10.6.8 (Snow Leopard) (it's only compilable with PB 5.44 x86; to compile it with x64 it's necessary to use PB 5.43 x64!)
Code: Select all
EnableExplicit
#ListIcon = 0
#ComboBoxColumn = 1
Define AppDelegate.I = CocoaMessage(0,
CocoaMessage(0, 0, "NSApplication sharedApplication"), "delegate")
Define ColumnObject.I
Define i.I
Define ComboBoxCell.I
Define DelegateClass.I = CocoaMessage(0, AppDelegate, "class")
Define NotificationCenter.I = CocoaMessage(0, 0,
"NSNotificationCenter defaultCenter")
Define RowHeight.CGFloat = 21
Define Selector.I = sel_registerName_("itemChanged:")
Define SubclassedComboBoxCell.I
ProcedureC ComboBoxSelectionChangedCallback(Object.I, Selector.I,
Notification.I)
Protected Cell.I
Protected ItemIndex.I
Protected ItemText.S
Protected Row.I
Cell = CocoaMessage(0, GadgetID(#ListIcon), "selectedCell")
If Cell
Row = CocoaMessage(0, GadgetID(#ListIcon), "selectedRow")
ItemIndex = CocoaMessage(0, Cell, "indexOfSelectedItem")
If ItemIndex >= 0
ItemText = PeekS(CocoaMessage(0, CocoaMessage(0,
Cell, "itemObjectValueAtIndex:", ItemIndex),
"UTF8String"), -1, #PB_UTF8)
If ItemText <> GetGadgetItemText(#ListIcon, Row, #ComboBoxColumn)
SetGadgetItemText(#ListIcon, Row, ItemText, #ComboBoxColumn)
EndIf
EndIf
EndIf
EndProcedure
OpenWindow(0, 200, 100, 250, 113, "ListIcon with ComboBoxes")
ListIconGadget(#ListIcon, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20,
"Friend", 70, #PB_ListIcon_GridLines)
AddGadgetColumn(#ListIcon, #ComboBoxColumn, "Country",
GadgetWidth(#ListIcon) - GetGadgetItemAttribute(#ListIcon, 0,
#PB_ListIcon_ColumnWidth) - 8)
AddGadgetItem(#ListIcon, -1, "Alice")
AddGadgetItem(#ListIcon, -1, "Bob")
AddGadgetItem(#ListIcon, -1, "Eve")
; ----- Increase row height to be able to display the larger ComboBox
CocoaMessage(0, GadgetID(#ListIcon), "setRowHeight:@", @RowHeight)
; ----- Disable highlighting of selected row
CocoaMessage(0, GadgetID(#ListIcon), "setSelectionHighlightStyle:", -1)
; ----- Center text in 1st column vertically
; Caution: _setVerticallyCentered: is an internal flag; it could simply
; disappear without warning in a future release and its use may lead
; to a rejection in Apple's AppStore!
ColumnObject = CocoaMessage(0, CocoaMessage(0,
GadgetID(#ListIcon), "tableColumns"), "objectAtIndex:", 0)
CocoaMessage(0, CocoaMessage(0, ColumnObject, "dataCell"),
"_setVerticallyCentered:", #YES)
; ----- Create a NSComboBoxCell (used internally as an editable ComboBox by
; PureBasic) and use it in all cells of column #ComboBoxColumn
ColumnObject = CocoaMessage(0, CocoaMessage(0,
GadgetID(#ListIcon), "tableColumns"), "objectAtIndex:", #ComboBoxColumn)
ComboBoxCell = CocoaMessage(0, 0, "NSComboBoxCell new")
CocoaMessage(0, ColumnObject, "setDataCell:", ComboBoxCell)
; ----- Remove border around button (special style for NSComboBoxCell in
; NSTableView)
CocoaMessage(0, ComboBoxCell, "setButtonBordered:", #NO)
; ----- Fill ComboBox
CocoaMessage(0, ComboBoxCell, "addItemWithObjectValue:$", @"France")
CocoaMessage(0, ComboBoxCell, "addItemWithObjectValue:$", @"Germany")
CocoaMessage(0, ComboBoxCell, "addItemWithObjectValue:$", @"USA")
; ----- Subclass ComboBoxCell
SubclassedComboBoxCell = objc_allocateClassPair_(CocoaMessage(0,
ComboBoxCell, "class"), "SubclassedComboBoxCell", 0)
objc_registerClassPair_(SubclassedComboBoxCell)
object_setClass_(ComboBoxCell, SubclassedComboBoxCell)
; ----- Set callback to detect selection change in ComboBox
class_addMethod_(DelegateClass, Selector, @ComboBoxSelectionChangedCallback(),
"v@:@")
CocoaMessage(0, NotificationCenter,
"addObserver:", AppDelegate,
"selector:", Selector,
"name:$", @"NSTableViewSelectionDidChangeNotification",
"object:", CocoaMessage(0, GadgetID(#ListIcon), "menu"))
SetActiveGadget(#ListIcon)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
; ----- Display countries currently selected in ComboBoxes
For i = 0 To 2
Debug Str(i + 1) + ". " + GetGadgetItemText(#ListIcon, i, 0) + " - " +
GetGadgetItemText(#ListIcon, i, #ComboBoxColumn)
Next i
CocoaMessage(0, NotificationCenter, "removeObserver:", AppDelegate)