diff --git a/redo/reredo/darwin/combobox.m b/redo/reredo/darwin/combobox.m index cff6f2bf..ca427ede 100644 --- a/redo/reredo/darwin/combobox.m +++ b/redo/reredo/darwin/combobox.m @@ -1,26 +1,42 @@ // 14 august 2015 #include "uipriv_darwin.h" +// TODOs: +// - 10.8: edges of NSPopUpButton clipped + struct uiCombobox { uiDarwinControl c; BOOL editable; NSPopUpButton *pb; + NSArrayController *pbac; NSComboBox *cb; NSObject *handle; // for uiControlHandle() }; -uiDarwinDefineControl( +static void onDestroy(uiCombobox *); + +uiDarwinDefineControlWithOnDestroy( uiCombobox, // type name uiComboboxType, // type function - handle // handle + handle, // handle + onDestroy(this); // on destroy ) +static void onDestroy(uiCombobox *c) +{ + if (!c->editable) { + [c->pb unbind:@"contentObjects"]; + [c->pb unbind:@"selectedIndex"]; + [c->pbac release]; + } +} + void uiComboboxAppend(uiCombobox *c, const char *text) { if (c->editable) [c->cb addItemWithObjectValue:toNSString(text)]; else - [c->pb addItemWithTitle:toNSString(text)]; + [c->pbac addObject:toNSString(text)]; } static uiCombobox *finishNewCombobox(BOOL editable) @@ -46,6 +62,23 @@ static uiCombobox *finishNewCombobox(BOOL editable) [pbcell setArrowPosition:NSPopUpArrowAtBottom]; // TODO font c->handle = c->pb; + + // NSPopUpButton doesn't work like a combobox + // - it automatically selects the first item + // - it doesn't support duplicates + // but we can use a NSArrayController and Cocoa bindings to bypass these restrictions + c->pbac = [NSArrayController new]; + [c->pbac setAvoidsEmptySelection:NO]; + [c->pbac setSelectsInsertedObjects:NO]; + [c->pbac setAutomaticallyRearrangesObjects:NO]; + [c->pb bind:@"contentValues" + toObject:c->pbac + withKeyPath:@"arrangedObjects" + options:nil]; + [c->pb bind:@"selectedIndex" + toObject:c->pbac + withKeyPath:@"selectionIndex" + options:nil]; } uiDarwinFinishNewControl(c, uiCombobox);