I have found a workaround to edit tree items with an image. My example code does the following:
The first step was to find a way how to grab the image from a tree item. For this purpose I already posted
cross-platform example.
This is the complete example which I tested successfully on MacOS 10.6.8 'Snow Leopard' with PB 5.46 x86 in ASCII and Unicode mode and on MacOS 10.13.6 'High Sierra' with PB 5.46 x64 in ASCII and Unicode mode:
Code: Select all
EnableExplicit
Define AppDelegate.I = CocoaMessage(0, CocoaMessage(0, 0,
"NSApplication sharedApplication"), "delegate")
Define Cell.I
Define CellImage.I
Define ClassName.S
Define DelegateClass.I = CocoaMessage(0, AppDelegate, "class")
Define NotificationCenter.I = CocoaMessage(0, 0,
"NSNotificationCenter defaultCenter")
Define SelectedRow.I
Define Selector.I = sel_registerName_("textDidEndEditing:")
ProcedureC EditingFinishedCallback(Object.I, Selector.I, Notification.I)
Shared CellImage.I
Protected EditedCell.I
Protected EditedColumn.I = CocoaMessage(0, GadgetID(0), "editedColumn")
Protected EditedRow.I = CocoaMessage(0, GadgetID(0), "editedRow")
Protected EditedText.S
EditedCell = CocoaMessage(0, Notification, "object")
EditedText = PeekS(CocoaMessage(0, CocoaMessage(0, EditedCell, "stringValue"),
"UTF8String"), -1, #PB_UTF8)
SetGadgetItemText(0, EditedRow, EditedText, EditedColumn)
If CellImage
SetGadgetItemImage(0, EditedRow, CellImage)
CellImage = 0
EndIf
EndProcedure
Procedure GetGadgetItemImage(TreeGadgetID.I, Row.I)
Protected Item.I
Protected CellImage.I
Item = CocoaMessage(0, GadgetID(TreeGadgetID), "itemAtRow:", Row)
CellImage = PeekI(PeekI(PeekI(Item + SizeOf(Integer))) + SizeOf(Integer) * 3)
ProcedureReturn CellImage
EndProcedure
CreateImage(0, 16, 16, 24, $FF)
CreateImage(1, 16, 16, 24, $FF0000)
OpenWindow(0, 200, 100, 220, 130, "Editable TreeGadget")
TreeGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20)
AddGadgetItem(0, -1, "Fruit", ImageID(0))
AddGadgetItem(0, -1, "Apples", 0, 1)
AddGadgetItem(0, -1, "Bananas", ImageID(1), 1)
AddGadgetItem(0, -1, "Oranges", 0, 1)
SetGadgetItemState(0, 0, #PB_Tree_Expanded)
CocoaMessage(0, GadgetID(0), "setSelectionHighlightStyle:", -1)
class_addMethod_(DelegateClass, Selector, @EditingFinishedCallback(), "v@:@")
CocoaMessage(0, NotificationCenter,
"addObserver:", AppDelegate,
"selector:", Selector,
"name:$", @"NSControlTextDidEndEditingNotification",
"object:", GadgetID(0))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
SelectedRow = GetGadgetState(0)
Cell = CocoaMessage(0, GadgetID(0),
"preparedCellAtColumn:", 0,
"row:", SelectedRow)
ClassName = PeekS(CocoaMessage(0, CocoaMessage(0,
Cell, "className"), "UTF8String"), -1, #PB_UTF8)
If ClassName = "PBIconTextCell"
CellImage = GetGadgetItemImage(0, SelectedRow)
SetGadgetItemImage(0, SelectedRow, 0)
EndIf
CocoaMessage(0, GadgetID(0), "setFocusedColumn:", 0)
CocoaMessage(0, GadgetID(0),
"editColumn:", 0,
"row:", SelectedRow,
"withEvent:", 0,
"select:", #YES)
EndIf
EndSelect
ForEver