ui/cocoa/list.m

Fri, 10 Oct 2025 14:13:52 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 10 Oct 2025 14:13:52 +0200
changeset 828
a952337ae325
parent 718
06eec75a6fd5
child 829
0980245646b4
permissions
-rw-r--r--

add sourcelist data source (Cocoa)

711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #import "list.h"
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #import "ListDelegate.h"
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #import <objc/runtime.h>
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
828
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
33 #import <inttypes.h>
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
34 #import <limits.h>
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
35
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
36 #import <cx/array_list.h>
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
37
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 return getvalue(elm, col);
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 }
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 static void* str_getvalue(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 return elm;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 }
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
47 /* --------------------------- ListView --------------------------- */
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
48
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
49 /*
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
50 * adds a NSTableViewDelegate that handles all events and calls
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
51 * callbacks specified in the UiListArgs
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
52 */
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
53 static void add_listdelegate(UiObject *obj, NSTableView *tableview, UiListArgs *args) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
54 ListDelegate *delegate = [[ListDelegate alloc] init:tableview obj:obj];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
55 delegate.onactivate = args->onactivate;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
56 delegate.onactivatedata = args->onactivatedata;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
57 delegate.onselection = args->onselection;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
58 delegate.onselectiondata = args->onselectiondata;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
59 tableview.delegate = delegate;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
60 objc_setAssociatedObject(tableview, "ui_listdelegate", delegate, OBJC_ASSOCIATION_RETAIN);
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
61 tableview.doubleAction = @selector(activateEvent:);
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
62 tableview.target = delegate;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
63 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
64
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
65 static void bind_list_to_tableview(UiList *list, NSTableView *tableview) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
66 list->obj = (__bridge void*)tableview;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
67 list->update = ui_tableview_update;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
68 list->getselection = ui_tableview_getselection;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
69 list->setselection = ui_tableview_setselection;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
70 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
71
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) {
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 NSScrollView *scrollview = [[NSScrollView alloc] init];
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 NSTableView *tableview = [[NSTableView alloc] init];
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 tableview.autoresizingMask = NSViewWidthSizable;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 tableview.headerView = nil;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78
713
f279d3cf2bf5 implement listview multiselection (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 712
diff changeset
79 if(args->multiselection) {
f279d3cf2bf5 implement listview multiselection (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 712
diff changeset
80 tableview.allowsMultipleSelection = YES;
f279d3cf2bf5 implement listview multiselection (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 712
diff changeset
81 }
f279d3cf2bf5 implement listview multiselection (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 712
diff changeset
82
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 scrollview.documentView = tableview;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 UiLayout layout = UI_INIT_LAYOUT(args);
718
06eec75a6fd5 remove default fill parameter vom container (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 717
diff changeset
86 ui_container_add(obj, scrollview, &layout);
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
88 add_listdelegate(obj, tableview, args);
714
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
89
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 if(var) {
714
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
92 UiList *list = var->value;
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
93 bind_list_to_tableview(list, tableview);
714
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
94
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 ui_getvaluefunc2 getvalue = args->getvalue2;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 void *getvaluedata = args->getvalue2data;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 if(!getvalue) {
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 if(args->getvalue) {
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 getvalue = getvalue_wrapper;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 getvaluedata = (void*)args->getvalue;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 } else {
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 getvalue = str_getvalue; // by default list values are interpreted as strings
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 }
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 }
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"];
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 [tableview addTableColumn:column];
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 ListDataSource *dataSource = [[ListDataSource alloc] init:tableview.tableColumns var:var getvalue:getvalue getvaluedata:getvaluedata];
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 tableview.dataSource = dataSource;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 [tableview reloadData];
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN);
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 }
714
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
116
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 return (__bridge void*)scrollview;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 }
714
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
119
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
120 /* --------------------------- TableView --------------------------- */
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
121
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
122 UIWIDGET ui_table_create(UiObject* obj, UiListArgs *args) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
123 NSScrollView *scrollview = [[NSScrollView alloc] init];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
124
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
125 NSTableView *tableview = [[NSTableView alloc] init];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
126 tableview.autoresizingMask = NSViewWidthSizable;
716
99386f34efc9 improve table columnsize handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 715
diff changeset
127 tableview.columnAutoresizingStyle = NSTableViewSequentialColumnAutoresizingStyle;
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
128
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
129 if(args->multiselection) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
130 tableview.allowsMultipleSelection = YES;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
131 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
132
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
133 UiLayout layout = UI_INIT_LAYOUT(args);
718
06eec75a6fd5 remove default fill parameter vom container (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 717
diff changeset
134 ui_container_add(obj, scrollview, &layout);
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
135
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
136 add_listdelegate(obj, tableview, args);
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
137
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
138 // convert model
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
139 NSMutableArray<NSTableColumn*> *cols = [[NSMutableArray alloc] init];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
140 UiModel *model = args->model;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
141 if(model) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
142 for(int i=0;i<model->columns;i++) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
143 char *title = model->titles[i];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
144 UiModelType type = model->types[i];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
145 int width = model->columnsize[i];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
146 NSString *identifier = [[NSString alloc] initWithUTF8String:title];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
147 NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:identifier];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
148 column.title = identifier;
716
99386f34efc9 improve table columnsize handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 715
diff changeset
149 column.resizingMask = NSTableColumnUserResizingMask;
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
150 if(width > 0) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
151 column.width = width;
716
99386f34efc9 improve table columnsize handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 715
diff changeset
152 } else if(width < 0) {
99386f34efc9 improve table columnsize handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 715
diff changeset
153 column.resizingMask = NSTableColumnAutoresizingMask | NSTableColumnUserResizingMask;
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
154 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
155 if(type >= UI_ICON) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
156 // TODO
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
157 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
158 [tableview addTableColumn:column];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
159 [cols addObject:column];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
160 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
161 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
162
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
163 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
164 if(var) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
165 UiList *list = var->value;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
166 bind_list_to_tableview(list, tableview);
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
167
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
168 ui_getvaluefunc2 getvalue = args->getvalue2;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
169 void *getvaluedata = args->getvalue2data;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
170 if(!getvalue) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
171 if(args->getvalue) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
172 getvalue = getvalue_wrapper;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
173 getvaluedata = (void*)args->getvalue;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
174 } else {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
175 fprintf(stderr, "Error: tableview requires getvalue or getvalue2 func\n");
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
176 return (__bridge void*)scrollview;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
177 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
178 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
179
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
180 ListDataSource *dataSource = [[ListDataSource alloc] init:cols var:var getvalue:getvalue getvaluedata:getvaluedata];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
181 if(model) {
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
182 dataSource.model = ui_model_copy(obj->ctx, model);
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
183 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
184
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
185 tableview.dataSource = dataSource;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
186 [tableview reloadData];
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
187
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
188 objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN);
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
189 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
190
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
191 scrollview.documentView = tableview;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
192
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
193 return (__bridge void*)scrollview;
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
194 }
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
195
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
196 /* ------ common functions ------ */
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
197
714
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
198 void ui_tableview_update(UiList *list, int i) {
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
199 NSTableView *tableview = (__bridge NSTableView*)list->obj;
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
200 if(i < 0) {
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
201 [tableview reloadData];
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
202 } else {
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
203 [tableview reloadData]; // TODO: optimize
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
204 }
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
205 }
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
206
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
207 UiListSelection ui_tableview_getselection(UiList *list) {
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
208 NSTableView *tableview = (__bridge NSTableView*)list->obj;
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
209 return ui_tableview_selection(tableview);
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
210 }
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
211
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
212 void ui_tableview_setselection(UiList *list, UiListSelection selection) {
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
213 NSTableView *tableview = (__bridge NSTableView*)list->obj;
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
214 NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
215 for(int i=0;i<selection.count;i++) {
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
216 [indexSet addIndex:selection.rows[i]];
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
217 }
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
218 [tableview selectRowIndexes:indexSet byExtendingSelection:NO];
3905f542e150 implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 713
diff changeset
219 }
715
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
220
2082c80fb010 add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 714
diff changeset
221
717
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
222 /* --------------------------- DropDown --------------------------- */
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
223
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
224 @implementation UiDropDown
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
225
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
226 - (id)init:(UiObject*)obj {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
227 _obj = obj;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
228 return self;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
229 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
230
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
231 - (void) comboBoxSelectionDidChange:(NSNotification *) notification {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
232 int index = (int)_combobox.indexOfSelectedItem;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
233
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
234 void *eventdata = NULL;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
235 if(_var) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
236 UiList *list = _var->value;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
237 if(index >= 0) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
238 eventdata = list->get(list, index);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
239 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
240 } else {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
241 NSString *str = _combobox.objectValueOfSelectedItem;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
242 if(str) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
243 eventdata = (void*)str.UTF8String;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
244 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
245 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
246
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
247 UiEvent event;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
248 event.obj = _obj;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
249 event.window = event.obj->window;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
250 event.document = event.obj->ctx->document;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
251 event.eventdata = eventdata;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
252 event.eventdatatype = UI_EVENT_DATA_LIST_ELM;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
253 event.intval = index;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
254
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
255 if(_onselection) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
256 _onselection(&event, _onselectiondata);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
257 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
258
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
259 if(_onactivate) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
260 _onactivate(&event, _onactivatedata);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
261 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
262 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
263
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
264 @end
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
265
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
266 UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs *args) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
267 NSComboBox *dropdown = [[NSComboBox alloc] init];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
268 dropdown.editable = NO;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
269
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
270 UiDropDown *uidropdown = [[UiDropDown alloc] init:obj];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
271 objc_setAssociatedObject(dropdown, "ui_dropdown", uidropdown, OBJC_ASSOCIATION_RETAIN);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
272 uidropdown.onactivate = args->onactivate;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
273 uidropdown.onactivatedata = args->onactivatedata;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
274 uidropdown.onselection = args->onselection;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
275 uidropdown.onselectiondata = args->onselectiondata;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
276 uidropdown.combobox = dropdown;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
277
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
278 if(!args->getvalue2) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
279 if(args->getvalue) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
280 args->getvalue2 = getvalue_wrapper;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
281 args->getvalue2data = (void*)args->getvalue;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
282 } else {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
283 args->getvalue2 = str_getvalue;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
284 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
285 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
286 uidropdown.getvalue = args->getvalue2;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
287 uidropdown.getvaluedata = args->getvalue2data;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
288
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
289 UiLayout layout = UI_INIT_LAYOUT(args);
718
06eec75a6fd5 remove default fill parameter vom container (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 717
diff changeset
290 ui_container_add(obj, dropdown, &layout);
717
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
291
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
292 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
293 if(var) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
294 UiList *list = var->value;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
295 list->obj = (__bridge void*)dropdown;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
296 list->update = ui_dropdown_update;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
297 list->getselection = ui_dropdown_getselection;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
298 list->setselection = ui_dropdown_setselection;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
299 ui_dropdown_update(list, -1);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
300 } else {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
301 for(int i=0;i<args->static_nelm;i++) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
302 char *str = args->static_elements[i];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
303 NSString *item = [[NSString alloc] initWithUTF8String:str];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
304 [dropdown addItemWithObjectValue:item];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
305 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
306 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
307
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
308 uidropdown.var = var;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
309
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
310 return (__bridge void*)dropdown;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
311 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
312
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
313 void ui_dropdown_update(UiList *list, int i) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
314 NSComboBox *combobox = (__bridge NSComboBox*)list->obj;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
315 UiDropDown *dropdown = objc_getAssociatedObject(combobox, "ui_dropdown");
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
316 if(dropdown) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
317 [combobox removeAllItems];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
318
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
319 ui_getvaluefunc2 getvalue = dropdown.getvalue;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
320 void *getvaluedata = dropdown.getvaluedata;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
321
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
322 int index = 0;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
323 void *elm = list->first(list);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
324 while(elm) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
325 UiBool freeResult = FALSE;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
326 char *str = getvalue(list, elm, index, 0, getvaluedata, &freeResult);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
327 if(str) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
328 NSString *item = [[NSString alloc] initWithUTF8String:str];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
329 [combobox addItemWithObjectValue:item];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
330 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
331 if(freeResult) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
332 free(str);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
333 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
334 elm = list->next(list);
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
335 index++;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
336 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
337 } else {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
338 fprintf(stderr, "Error: obj is not a dropdown\n");
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
339 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
340 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
341
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
342 UiListSelection ui_dropdown_getselection(UiList *list) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
343 UiListSelection sel = { 0, NULL };
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
344 NSComboBox *combobox = (__bridge NSComboBox*)list->obj;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
345 NSInteger index = combobox.indexOfSelectedItem;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
346 if(index >= 0) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
347 sel.rows = malloc(sizeof(int));
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
348 sel.count = 1;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
349 sel.rows[0] = (int)index;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
350 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
351 return sel;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
352 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
353
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
354 void ui_dropdown_setselection(UiList *list, UiListSelection selection) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
355 NSComboBox *combobox = (__bridge NSComboBox*)list->obj;
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
356 if(selection.count > 0) {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
357 [combobox selectItemAtIndex:selection.rows[0]];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
358 } else {
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
359 [combobox selectItemAtIndex: -1];
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
360 }
c35b2f18841c add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 716
diff changeset
361 }
828
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
362
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
363
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
364 /* --------------------------- SourceList --------------------------- */
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
365
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
366 static void sublist_free(const CxAllocator *a, UiSubList *sl) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
367 cxFree(a, (char*)sl->varname);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
368 cxFree(a, (char*)sl->header);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
369 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
370
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
371 static UiSubList copy_sublist(const CxAllocator *a, UiSubList *sl) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
372 UiSubList new_sl;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
373 new_sl.value = sl->value;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
374 new_sl.varname = sl->varname ? cx_strdup_a(a, cx_str(sl->varname)).ptr : NULL;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
375 new_sl.header = sl->header ? cx_strdup_a(a, cx_str(sl->header)).ptr : NULL;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
376 new_sl.separator = sl->separator;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
377 new_sl.userdata = sl->userdata;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
378 return new_sl;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
379 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
380
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
381 static CxList* copy_sublists(const CxAllocator *a, UiSourceListArgs *args) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
382 if(args->sublists) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
383 size_t max = args->numsublists;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
384 if(max == 0) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
385 max = INT_MAX;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
386 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
387
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
388 CxList *sublists = cxArrayListCreate(a, NULL, sizeof(UiSubList), args->numsublists);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
389 sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_free;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
390
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
391 for(int i=0;i<max;i++) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
392 UiSubList *sl = &args->sublists[i];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
393 if(sl->value == NULL && sl->varname == NULL) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
394 break;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
395 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
396
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
397 UiSubList new_sl = copy_sublist(a, sl);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
398 cxListAdd(sublists, &new_sl);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
399 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
400
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
401 return sublists;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
402 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
403 return NULL;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
404 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
405
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
406 UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
407 // create views
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
408 NSScrollView *scrollview = [[NSScrollView alloc] init];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
409 scrollview.autoresizingMask = NSViewWidthSizable;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
410
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
411 NSOutlineView *outline = [[NSOutlineView alloc]init];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
412 NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"label"];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
413 [outline addTableColumn:column];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
414 outline.outlineTableColumn = column;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
415 outline.headerView = NULL;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
416
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
417 outline.style = NSTableViewStyleSourceList;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
418
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
419 // Make background transparent so vibrancy shows through
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
420 outline.backgroundColor = [NSColor clearColor];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
421 scrollview.drawsBackground = NO;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
422
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
423 scrollview.documentView = outline;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
424
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
425 UiLayout layout = UI_ARGS2LAYOUT(args);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
426 ui_container_add(obj, scrollview, &layout);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
427
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
428 // datasource and delegate
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
429 UiSourceList *data = [[UiSourceList alloc] init:obj];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
430 data.sublists = copy_sublists(obj->ctx->allocator, args);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
431 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->dynamic_sublist, args->varname, UI_VAR_LIST);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
432 if(var) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
433 UiList *list = var->value;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
434 list->obj = (__bridge void*)data;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
435 list->update = ui_sourcelist_update;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
436 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
437 data.dynamic_sublists = var;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
438 data.getvalue = args->getvalue;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
439 data.getvaluedata = args->getvaluedata;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
440 data.onactivate = args->onactivate;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
441 data.onactivatedata = args->onactivatedata;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
442 data.onbuttonclick = args->onbuttonclick;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
443 data.onactivatedata = args->onbuttonclickdata;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
444 [data update:-1];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
445
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
446 outline.dataSource = data;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
447 //outline.delegate = data;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
448
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
449 objc_setAssociatedObject(outline, "ui_datasource", data, OBJC_ASSOCIATION_RETAIN);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
450
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
451 return (__bridge void*)scrollview;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
452 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
453
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
454 void ui_sourcelist_update(UiList *list, int row) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
455 UiSourceList *sourcelist = (__bridge UiSourceList*)list->obj;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
456 [sourcelist update:row];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
457 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
458
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
459
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
460 @implementation UiSourceList
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
461
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
462 - (id)init:(UiObject*)obj {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
463 _obj = obj;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
464 _sections = [[NSMutableArray alloc] initWithCapacity:16];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
465 return self;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
466 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
467
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
468 - (void)dealloc {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
469 cxListFree(_sublists);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
470 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
471
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
472 - (void)update:(int)row {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
473 // TODO: check row
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
474
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
475 [_sections removeAllObjects];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
476
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
477 CxIterator i = cxListIterator(_sublists);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
478 cx_foreach(UiSubList *, sl, i) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
479 UiSourceListItem *section = [[UiSourceListItem alloc] init:self sublist:sl];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
480 [section update:-1];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
481 [_sections addObject:section];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
482 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
483 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
484
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
485 // NSOutlineViewDataSource implementation
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
486
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
487 - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
488 if(item == nil) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
489 return _sections.count;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
490 } else {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
491 UiSourceListItem *i = item;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
492 return i.items.count;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
493 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
494 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
495
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
496 - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
497 UiSourceListItem *i = item;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
498 return [i isSection];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
499 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
500
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
501 - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
502 UiSourceListItem *i = item;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
503 if(i) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
504 return [i.items objectAtIndex:index];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
505 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
506 return [_sections objectAtIndex:index];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
507 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
508
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
509 - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
510 UiSourceListItem *i = item;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
511 if([[tableColumn identifier] isEqualToString:@"label"]) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
512 return i.label;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
513 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
514 return nil;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
515 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
516
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
517 - (void)outlineView:(NSOutlineView *)outlineView
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
518 setObjectValue:(id)object
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
519 forTableColumn:(NSTableColumn *)tableColumn
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
520 byItem:(id)item {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
521
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
522 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
523
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
524 @end
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
525
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
526 @implementation UiSourceListItem
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
527
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
528 - (id)init:(UiSourceList*)sourcelist sublist:(UiSubList*)sublist {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
529 _sourcelist = sourcelist;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
530 _sublist = sublist;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
531 _items = [[NSMutableArray alloc]initWithCapacity:16];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
532 if(sublist->header) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
533 _label = [[NSString alloc]initWithUTF8String:sublist->header];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
534 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
535 UiVar *var = uic_widget_var(sourcelist.obj->ctx,
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
536 sourcelist.obj->ctx,
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
537 sublist->value,
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
538 sublist->varname,
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
539 UI_VAR_LIST);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
540 _var = var;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
541 return self;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
542 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
543
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
544 - (id)init:(UiSubListItem*)item {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
545 if(item->label) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
546 _label = [[NSString alloc]initWithUTF8String:item->label];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
547 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
548 return self;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
549 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
550
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
551 - (BOOL)isSection {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
552 return _sublist != NULL;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
553 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
554
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
555 - (void)update:(int)row {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
556 [_items removeAllObjects];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
557 if(_var == NULL) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
558 return;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
559 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
560 UiList *list = _var->value;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
561 void *elm = list->first(list);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
562 int index = 0;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
563 while(elm) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
564 UiSubListItem item = { NULL, NULL, NULL, NULL, NULL, NULL };
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
565 if(_sourcelist.getvalue) {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
566 _sourcelist.getvalue(list, _sublist->userdata, elm, index, &item, _sourcelist.getvaluedata);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
567 } else {
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
568 item.label = strdup(elm);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
569 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
570
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
571 [_items addObject:[[UiSourceListItem alloc] init:&item]];
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
572
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
573 elm = list->next(list);
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
574 index++;
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
575 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
576 }
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
577
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
578 @end
a952337ae325 add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 718
diff changeset
579

mercurial