36 #include "container.h" |
36 #include "container.h" |
37 #include "../common/object.h" |
37 #include "../common/object.h" |
38 #include "../common/context.h" |
38 #include "../common/context.h" |
39 #include "../../ucx/utils.h" |
39 #include "../../ucx/utils.h" |
40 |
40 |
41 UIWIDGET ui_table(UiObject *obj, UiList *model, UiModelInfo *modelinfo) { |
41 UIWIDGET ui_table_var(UiObject *obj, UiVar *var, UiModel *model, UiListCallbacks cb) { |
42 // TODO: check if modelinfo is complete |
42 // TODO: check if modelinfo is complete |
43 |
43 |
44 Arg args[32]; |
44 Arg args[32]; |
45 int n = 0; |
45 int n = 0; |
46 |
46 |
56 ct->add(ct, scrollw); |
56 ct->add(ct, scrollw); |
57 XtManageChild(scrollw); |
57 XtManageChild(scrollw); |
58 |
58 |
59 // create table headers |
59 // create table headers |
60 XmStringTable header = (XmStringTable)XtMalloc( |
60 XmStringTable header = (XmStringTable)XtMalloc( |
61 modelinfo->columns * sizeof(XmString)); |
61 model->columns * sizeof(XmString)); |
62 for(int i=0;i<modelinfo->columns;i++) { |
62 for(int i=0;i<model->columns;i++) { |
63 header[i] = XmStringCreateLocalized(modelinfo->titles[i]); |
63 header[i] = XmStringCreateLocalized(model->titles[i]); |
64 } |
64 } |
65 n = 0; |
65 n = 0; |
66 XtSetArg(args[n], XmNdetailColumnHeading, header); |
66 XtSetArg(args[n], XmNdetailColumnHeading, header); |
67 n++; |
67 n++; |
68 XtSetArg(args[n], XmNdetailColumnHeadingCount, modelinfo->columns); |
68 XtSetArg(args[n], XmNdetailColumnHeadingCount, model->columns); |
69 n++; |
69 n++; |
70 |
70 |
71 // set res |
71 // set res |
72 XtSetArg(args[n], XmNlayoutType, XmDETAIL); |
72 XtSetArg(args[n], XmNlayoutType, XmDETAIL); |
73 n++; |
73 n++; |
86 XtManageChild(container); |
86 XtManageChild(container); |
87 |
87 |
88 // add callbacks |
88 // add callbacks |
89 UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData)); |
89 UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData)); |
90 event->obj = obj; |
90 event->obj = obj; |
91 event->activate = modelinfo->activate; |
91 event->activate = cb.activate; |
92 event->selection = modelinfo->selection; |
92 event->selection = cb.selection; |
93 event->userdata = modelinfo->userdata; |
93 event->userdata = cb.userdata; |
94 event->last_selection = NULL; |
94 event->last_selection = NULL; |
95 if(modelinfo->selection) { |
95 if(cb.selection) { |
96 XtAddCallback( |
96 XtAddCallback( |
97 container, |
97 container, |
98 XmNselectionCallback, |
98 XmNselectionCallback, |
99 (XtCallbackProc)ui_table_select_callback, |
99 (XtCallbackProc)ui_table_select_callback, |
100 event); |
100 event); |
101 } |
101 } |
102 if(modelinfo->activate) { |
102 if(cb.activate) { |
103 XtAddCallback( |
103 XtAddCallback( |
104 container, |
104 container, |
105 XmNdefaultActionCallback, |
105 XmNdefaultActionCallback, |
106 (XtCallbackProc)ui_table_action_callback, |
106 (XtCallbackProc)ui_table_action_callback, |
107 event); |
107 event); |
108 } |
108 } |
109 |
109 |
110 // add initial data |
110 // add initial data |
111 void *data = model->first(model); |
111 UiList *list = var->value; |
|
112 void *data = list->first(list); |
112 int width = 0; |
113 int width = 0; |
113 while(data) { |
114 while(data) { |
114 int w = ui_add_icon_gadget(container, modelinfo, data); |
115 int w = ui_add_icon_gadget(container, model, data); |
115 if(w > width) { |
116 if(w > width) { |
116 width = w; |
117 width = w; |
117 } |
118 } |
118 data = model->next(model); |
119 data = list->next(list); |
119 } |
120 } |
120 |
121 |
121 UiTableView *tableview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiTableView)); |
122 UiTableView *tableview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiTableView)); |
122 tableview->widget = container; |
123 tableview->widget = container; |
123 tableview->list = model; |
124 tableview->var = var; |
124 tableview->modelinfo = modelinfo; |
125 tableview->model = model; |
125 model->observers = ui_add_observer( |
|
126 model->observers, |
|
127 (ui_callback)ui_table_update, |
|
128 tableview); |
|
129 |
126 |
130 // set new XmContainer width |
127 // set new XmContainer width |
131 XtVaSetValues(container, XmNwidth, width, NULL); |
128 XtVaSetValues(container, XmNwidth, width, NULL); |
132 |
129 |
133 // cleanup |
130 // cleanup |
134 for(int i=0;i<modelinfo->columns;i++) { |
131 for(int i=0;i<model->columns;i++) { |
135 XmStringFree(header[i]); |
132 XmStringFree(header[i]); |
136 } |
133 } |
137 XtFree((char*)header); |
134 XtFree((char*)header); |
138 |
135 |
139 return scrollw; |
136 return scrollw; |
|
137 } |
|
138 |
|
139 UIWIDGET ui_table(UiObject *obj, UiList *data, UiModel *model, UiListCallbacks cb) { |
|
140 UiVar *var = malloc(sizeof(UiVar)); |
|
141 var->value = data; |
|
142 var->type = UI_VAR_SPECIAL; |
|
143 return ui_table_var(obj, var, model, cb); |
140 } |
144 } |
141 |
145 |
142 void ui_table_update(UiEvent *event, UiTableView *view) { |
146 void ui_table_update(UiEvent *event, UiTableView *view) { |
143 // clear container |
147 // clear container |
144 Widget *children; |
148 Widget *children; |
154 |
158 |
155 for(int i=0;i<nc;i++) { |
159 for(int i=0;i<nc;i++) { |
156 XtDestroyWidget(children[i]); |
160 XtDestroyWidget(children[i]); |
157 } |
161 } |
158 |
162 |
159 UiList *model = view->list; |
163 UiList *list = view->var->value; |
160 |
164 |
161 void *data = model->first(model); |
165 void *data = list->first(list); |
162 int width = 0; |
166 int width = 0; |
163 while(data) { |
167 while(data) { |
164 int w = ui_add_icon_gadget(view->widget, view->modelinfo, data); |
168 int w = ui_add_icon_gadget(view->widget, view->model, data); |
165 if(w > width) { |
169 if(w > width) { |
166 width = w; |
170 width = w; |
167 } |
171 } |
168 data = model->next(model); |
172 data = list->next(list); |
169 } |
173 } |
170 |
174 |
171 } |
175 } |
172 |
176 |
173 #define UI_COL_CHAR_WIDTH 12 |
177 #define UI_COL_CHAR_WIDTH 12 |
174 |
178 |
175 int ui_add_icon_gadget(Widget container, UiModelInfo *modelinfo, void *data) { |
179 int ui_add_icon_gadget(Widget container, UiModel *model, void *data) { |
176 int width = 50; |
180 int width = 50; |
177 |
181 |
178 if(modelinfo->columns == 0) { |
182 if(model->columns == 0) { |
179 return width; |
183 return width; |
180 } |
184 } |
181 |
185 |
182 XmString label = NULL; |
186 XmString label = NULL; |
183 Arg args[8]; |
187 Arg args[8]; |
184 Boolean f; |
188 Boolean f; |
185 // first column |
189 // first column |
186 if(modelinfo->types[0] != 12345678) { // TODO: icon/label type |
190 if(model->types[0] != 12345678) { // TODO: icon/label type |
187 char *str = ui_type_to_string( |
191 char *str = ui_type_to_string( |
188 modelinfo->types[0], |
192 model->types[0], |
189 modelinfo->getvalue(data, 0), |
193 model->getvalue(data, 0), |
190 &f); |
194 &f); |
191 |
195 |
192 // column width |
196 // column width |
193 width += strlen(str) * UI_COL_CHAR_WIDTH; |
197 width += strlen(str) * UI_COL_CHAR_WIDTH; |
194 |
198 |
202 // TODO |
206 // TODO |
203 } |
207 } |
204 |
208 |
205 // remaining columns are the icon gadget details |
209 // remaining columns are the icon gadget details |
206 XmStringTable details = (XmStringTable)XtMalloc( |
210 XmStringTable details = (XmStringTable)XtMalloc( |
207 (modelinfo->columns - 1) * sizeof(XmString)); |
211 (model->columns - 1) * sizeof(XmString)); |
208 for(int i=1;i<modelinfo->columns;i++) { |
212 for(int i=1;i<model->columns;i++) { |
209 char *str = ui_type_to_string( |
213 char *str = ui_type_to_string( |
210 modelinfo->types[i], |
214 model->types[i], |
211 modelinfo->getvalue(data, i), |
215 model->getvalue(data, i), |
212 &f); |
216 &f); |
213 |
217 |
214 // column width |
218 // column width |
215 width += strlen(str) * UI_COL_CHAR_WIDTH; |
219 width += strlen(str) * UI_COL_CHAR_WIDTH; |
216 |
220 |
218 if(f) { |
222 if(f) { |
219 free(str); |
223 free(str); |
220 } |
224 } |
221 } |
225 } |
222 XtSetArg(args[1], XmNdetail, details); |
226 XtSetArg(args[1], XmNdetail, details); |
223 XtSetArg(args[2], XmNdetailCount, modelinfo->columns - 1); |
227 XtSetArg(args[2], XmNdetailCount, model->columns - 1); |
224 XtSetArg(args[3], XmNshadowThickness, 0); |
228 XtSetArg(args[3], XmNshadowThickness, 0); |
225 // create widget |
229 // create widget |
226 Widget item = XmCreateIconGadget(container, "table_item", args, 4); |
230 Widget item = XmCreateIconGadget(container, "table_item", args, 4); |
227 XtManageChild(item); |
231 XtManageChild(item); |
228 |
232 |
229 // cleanup |
233 // cleanup |
230 XmStringFree(label); |
234 XmStringFree(label); |
231 for(int i=0;i<modelinfo->columns-1;i++) { |
235 for(int i=0;i<model->columns-1;i++) { |
232 XmStringFree(details[i]); |
236 XmStringFree(details[i]); |
233 } |
237 } |
234 XtFree((char*)details); |
238 XtFree((char*)details); |
235 |
239 |
236 return width; |
240 return width; |