95 lines
2.2 KiB
Objective-C
95 lines
2.2 KiB
Objective-C
// 14 august 2015
|
|
#include "uipriv_darwin.h"
|
|
|
|
struct uiCombobox {
|
|
uiDarwinControl c;
|
|
BOOL editable;
|
|
NSPopUpButton *pb;
|
|
NSArrayController *pbac;
|
|
NSComboBox *cb;
|
|
NSObject *handle; // for uiControlHandle()
|
|
};
|
|
|
|
static void onDestroy(uiCombobox *);
|
|
|
|
uiDarwinDefineControlWithOnDestroy(
|
|
uiCombobox, // type name
|
|
uiComboboxType, // type function
|
|
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->pbac addObject:toNSString(text)];
|
|
}
|
|
|
|
static uiCombobox *finishNewCombobox(BOOL editable)
|
|
{
|
|
uiCombobox *c;
|
|
|
|
c = (uiCombobox *) uiNewControl(uiComboboxType());
|
|
|
|
c->editable = editable;
|
|
if (c->editable) {
|
|
c->cb = [[NSComboBox alloc] initWithFrame:NSZeroRect];
|
|
[c->cb setUsesDataSource:NO];
|
|
[c->cb setButtonBordered:YES];
|
|
[c->cb setCompletes:NO];
|
|
uiDarwinSetControlFont(c->cb, NSRegularControlSize);
|
|
c->handle = c->cb;
|
|
} else {
|
|
NSPopUpButtonCell *pbcell;
|
|
|
|
c->pb = [[NSPopUpButton alloc] initWithFrame:NSZeroRect pullsDown:NO];
|
|
[c->pb setPreferredEdge:NSMinYEdge];
|
|
pbcell = (NSPopUpButtonCell *) [c->pb cell];
|
|
[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);
|
|
|
|
return c;
|
|
}
|
|
|
|
uiCombobox *uiNewCombobox(void)
|
|
{
|
|
return finishNewCombobox(NO);
|
|
}
|
|
|
|
uiCombobox *uiNewEditableCombobox(void)
|
|
{
|
|
return finishNewCombobox(YES);
|
|
}
|