summaryrefslogtreecommitdiff
path: root/listbox_darwin.m
diff options
context:
space:
mode:
Diffstat (limited to 'listbox_darwin.m')
-rw-r--r--listbox_darwin.m142
1 files changed, 142 insertions, 0 deletions
diff --git a/listbox_darwin.m b/listbox_darwin.m
new file mode 100644
index 0000000..f6f2838
--- /dev/null
+++ b/listbox_darwin.m
@@ -0,0 +1,142 @@
+// 13 may 2014
+
+#include "objc_darwin.h"
+#import <Foundation/NSDictionary.h>
+#import <AppKit/NSArrayController.h>
+#import <AppKit/NSTableColumn.h>
+#import <AppKit/NSTableView.h>
+#import <Foundation/NSIndexSet.h>
+
+#define to(T, x) ((T *) (x))
+#define toNSMutableDictionary(x) to(NSMutableDictionary, (x))
+#define toNSArrayController(x) to(NSArrayController, (x))
+#define toNSTableColumn(x) to(NSTableColumn, (x))
+#define toNSTableView(x) to(NSTableView, (x))
+#define toNSIndexSet(x) to(NSIndexSet, (x))
+
+#define toNSInteger(x) ((NSInteger) (x))
+#define fromNSInteger(x) ((intptr_t) (x))
+#define toNSUInteger(x) ((NSUInteger) (x))
+#define fromNSUInteger(x) ((uintptr_t) (x))
+
+extern NSRect dummyRect;
+
+id toListboxItem(id key, id value)
+{
+ return [NSMutableDictionary dictionaryWithObject:value forKey:key];
+}
+
+id fromListboxItem(id item, id key)
+{
+ return [toNSMutableDictionary(item) objectForKey:key];
+}
+
+id makeListboxArray(void)
+{
+ NSArrayController *ac;
+
+ ac = [NSArrayController new];
+ [ac setAutomaticallyRearrangesObjects:NO];
+ // we don't want Cocoa to change the selection when items are inserted
+ // found via http://stackoverflow.com/a/5765318/3408572; not sure how I missed it the first time
+ [ac setSelectsInsertedObjects:NO]; // for insertions
+ [ac setAvoidsEmptySelection:NO]; // for deletions
+ return ac;
+}
+
+void listboxArrayAppend(id ac, id item)
+{
+ [toNSArrayController(ac) addObject:item];
+}
+
+void listboxArrayInsertBefore(id ac, id item, uintptr_t before)
+{
+ [toNSArrayController(ac) insertObject:item atArrangedObjectIndex:toNSUInteger(before)];
+}
+
+void listboxArrayDelete(id ac, uintptr_t index)
+{
+ [toNSArrayController(ac) removeObjectAtArrangedObjectIndex:toNSUInteger(index)];
+}
+
+id listboxArrayItemAt(id ac, uintptr_t index)
+{
+ NSArrayController *array;
+
+ array = toNSArrayController(ac);
+ return [[array arrangedObjects] objectAtIndex:toNSUInteger(index)];
+}
+
+void bindListboxArray(id tableColumn, id bindwhat, id ac, id keyPath)
+{
+ [toNSTableColumn(tableColumn) bind:bindwhat
+ toObject:ac
+ withKeyPath:keyPath
+ options:nil]; // no options
+}
+
+id boundListboxArray(id tableColumn, id boundwhat)
+{
+ return [[toNSTableColumn(tableColumn) infoForBinding:boundwhat]
+ objectForKey:NSObservedObjectKey];
+}
+
+id makeListboxTableColumn(id identifier)
+{
+ NSTableColumn *column;
+ NSCell *dataCell;
+
+ column = [[NSTableColumn alloc] initWithIdentifier:identifier];
+ [column setEditable:NO];
+ // to set the font for each item, we set the font of the "data cell", which is more aptly called the "cell template"
+ dataCell = [column dataCell];
+ // technically not a NSControl, but still accepts the selector, so we can call it anyway
+ applyStandardControlFont(dataCell);
+ [column setDataCell:dataCell];
+ // TODO other properties?
+ return column;
+}
+
+id listboxTableColumn(id listbox, id identifier)
+{
+ return [toNSTableView(listbox) tableColumnWithIdentifier:identifier];
+}
+
+id makeListbox(id tableColumn, BOOL multisel)
+{
+ NSTableView *listbox;
+
+ listbox = [[NSTableView alloc]
+ initWithFrame:dummyRect];
+ [listbox addTableColumn:tableColumn];
+ [listbox setAllowsMultipleSelection:multisel];
+ [listbox setAllowsEmptySelection:YES];
+ [listbox setHeaderView:nil];
+ // TODO other prperties?
+ return listbox;
+}
+
+id listboxSelectedRowIndexes(id listbox)
+{
+ return [toNSTableView(listbox) selectedRowIndexes];
+}
+
+uintptr_t listboxIndexesCount(id indexes)
+{
+ return fromNSUInteger([toNSIndexSet(indexes) count]);
+}
+
+uintptr_t listboxIndexesFirst(id indexes)
+{
+ return fromNSUInteger([toNSIndexSet(indexes) firstIndex]);
+}
+
+uintptr_t listboxIndexesNext(id indexes, uintptr_t prev)
+{
+ return fromNSUInteger([toNSIndexSet(indexes) indexGreaterThanIndex:toNSUInteger(prev)]);
+}
+
+intptr_t listboxLen(id listbox)
+{
+ return fromNSInteger([toNSTableView(listbox) numberOfRows]);
+}