52 ct->add = ui_frame_container_add; |
55 ct->add = ui_frame_container_add; |
53 return ct; |
56 return ct; |
54 } |
57 } |
55 |
58 |
56 Widget ui_frame_container_prepare(UiContainer *ct, Arg *args, int *n, UiBool fill) { |
59 Widget ui_frame_container_prepare(UiContainer *ct, Arg *args, int *n, UiBool fill) { |
|
60 return ct->widget; |
|
61 } |
|
62 |
|
63 void ui_frame_container_add(UiContainer *ct, Widget widget) { |
57 ui_reset_layout(ct->layout); |
64 ui_reset_layout(ct->layout); |
58 return ct->widget; |
|
59 } |
|
60 |
|
61 void ui_frame_container_add(UiContainer *ct, Widget widget) { |
|
62 |
|
63 } |
65 } |
64 |
66 |
65 |
67 |
66 UiContainer* ui_box_container(UiObject *obj, Widget box, UiBoxOrientation orientation) { |
68 UiContainer* ui_box_container(UiObject *obj, Widget box, UiBoxOrientation orientation) { |
67 UiBoxContainer *ct = ucx_mempool_calloc( |
69 UiBoxContainer *ct = ucx_mempool_calloc( |
173 bc->prev_widget = widget; |
175 bc->prev_widget = widget; |
174 |
176 |
175 ui_reset_layout(ct->layout); |
177 ui_reset_layout(ct->layout); |
176 } |
178 } |
177 |
179 |
|
180 UiContainer* ui_grid_container(UiObject *obj, Widget form) { |
|
181 UiGridContainer *ct = ucx_mempool_calloc( |
|
182 obj->ctx->mempool, |
|
183 1, |
|
184 sizeof(UiGridContainer)); |
|
185 ct->container.widget = form; |
|
186 ct->container.prepare = ui_grid_container_prepare; |
|
187 ct->container.add = ui_grid_container_add; |
|
188 return (UiContainer*)ct; |
|
189 } |
|
190 |
|
191 void ui_grid_newline(UiGridContainer *grid) { |
|
192 if(grid->current) { |
|
193 grid->current = NULL; |
|
194 } |
|
195 grid->container.layout.newline = FALSE; |
|
196 } |
|
197 |
|
198 Widget ui_grid_container_prepare(UiContainer *ct, Arg *args, int *n, UiBool fill) { |
|
199 UiGridContainer *grid = (UiGridContainer*)ct; |
|
200 if(ct->layout.newline) { |
|
201 ui_grid_newline(grid); |
|
202 } |
|
203 return ct->widget; |
|
204 } |
|
205 |
|
206 void ui_grid_container_add(UiContainer *ct, Widget widget) { |
|
207 UiGridContainer *grid = (UiGridContainer*)ct; |
|
208 |
|
209 if(grid->current) { |
|
210 grid->current = ucx_list_append(grid->current, widget); |
|
211 } else { |
|
212 grid->current = ucx_list_append(grid->current, widget); |
|
213 grid->lines = ucx_list_append(grid->lines, grid->current); |
|
214 } |
|
215 |
|
216 ui_reset_layout(ct->layout); |
|
217 } |
|
218 |
|
219 static void ui_grid_resize(Widget widget, XtPointer udata, XtPointer cdata) { |
|
220 UiGridContainer *grid = udata; |
|
221 |
|
222 UcxList *rowdim = NULL; |
|
223 int coldim[UI_GRID_MAX_COLUMNS]; |
|
224 memset(coldim, 0, UI_GRID_MAX_COLUMNS*sizeof(int)); |
|
225 int numcol = 0; |
|
226 |
|
227 // get the minimum size of the columns and rows |
|
228 int sumw = 0; |
|
229 int sumh = 0; |
|
230 UCX_FOREACH(row, grid->lines) { |
|
231 int rheight = 0; |
|
232 int i=0; |
|
233 int sum_width = 0; |
|
234 UCX_FOREACH(elm, row->data) { |
|
235 Widget w = elm->data; |
|
236 int widget_width = 0; |
|
237 int widget_height = 0; |
|
238 XtVaGetValues( |
|
239 w, |
|
240 XmNwidth, |
|
241 &widget_width, |
|
242 XmNheight, |
|
243 &widget_height, |
|
244 0); |
|
245 |
|
246 // get the maximum height in this row |
|
247 if(widget_height > rheight) { |
|
248 rheight = widget_height; |
|
249 } |
|
250 rowdim = ucx_list_append(rowdim, (void*)(intptr_t)rheight); |
|
251 |
|
252 // get the maximum width in this column |
|
253 if(widget_width > coldim[i]) { |
|
254 coldim[i] = widget_width; |
|
255 } |
|
256 sum_width += widget_width; |
|
257 if(sum_width > sumw) { |
|
258 sumw = sum_width; |
|
259 } |
|
260 |
|
261 i++; |
|
262 if(i > numcol) { |
|
263 numcol = i; |
|
264 } |
|
265 } |
|
266 sumh += rheight; |
|
267 } |
|
268 |
|
269 // check container size |
|
270 int gwidth = 0; |
|
271 int gheight = 0; |
|
272 XtVaGetValues(widget, XmNwidth, &gwidth, XmNheight, &gheight, NULL); |
|
273 if(gwidth < sumw || gheight < sumh) { |
|
274 XtVaSetValues(widget, XmNwidth, sumw, XmNheight, sumh, NULL); |
|
275 ucx_list_free(rowdim); |
|
276 return; |
|
277 } |
|
278 |
|
279 |
|
280 // adjust the positions of all children |
|
281 int y = 0; |
|
282 UCX_FOREACH(row, grid->lines) { |
|
283 int x = 0; |
|
284 int i=0; |
|
285 UCX_FOREACH(elm, row->data) { |
|
286 Widget w = elm->data; |
|
287 XtVaSetValues(w, XmNx, x, XmNy, y, NULL); |
|
288 |
|
289 x += coldim[i]; |
|
290 i++; |
|
291 } |
|
292 y += (intptr_t)rowdim->data; |
|
293 rowdim = rowdim->next; |
|
294 } |
|
295 |
|
296 ucx_list_free(rowdim); |
|
297 } |
|
298 |
178 UIWIDGET ui_box(UiObject *obj, UiBoxOrientation orientation) { |
299 UIWIDGET ui_box(UiObject *obj, UiBoxOrientation orientation) { |
179 UiContainer *ct = uic_get_current_container(obj); |
300 UiContainer *ct = uic_get_current_container(obj); |
180 |
301 |
181 Arg args[16]; |
302 Arg args[16]; |
182 int n = 0; |
303 int n = 0; |
198 |
319 |
199 UIWIDGET ui_hbox(UiObject *obj) { |
320 UIWIDGET ui_hbox(UiObject *obj) { |
200 return ui_box(obj, UI_BOX_HORIZONTAL); |
321 return ui_box(obj, UI_BOX_HORIZONTAL); |
201 } |
322 } |
202 |
323 |
|
324 UIWIDGET ui_grid(UiObject *obj) { |
|
325 UiContainer *ct = uic_get_current_container(obj); |
|
326 |
|
327 Arg args[16]; |
|
328 int n = 0; |
|
329 Widget parent = ct->prepare(ct, args, &n, TRUE); |
|
330 Widget grid = XmCreateDrawingArea(parent, "grid", args, n); |
|
331 ct->add(ct, grid); |
|
332 XtManageChild(grid); |
|
333 |
|
334 UiObject *newobj = uic_object_new(obj, grid); |
|
335 newobj->container = ui_grid_container(obj, grid); |
|
336 uic_obj_add(obj, newobj); |
|
337 |
|
338 XtAddCallback (grid, XmNresizeCallback , ui_grid_resize, newobj->container); |
|
339 |
|
340 return grid; |
|
341 } |
|
342 |
203 UIWIDGET ui_sidebar(UiObject *obj) { |
343 UIWIDGET ui_sidebar(UiObject *obj) { |
204 UiContainer *ct = uic_get_current_container(obj); |
344 UiContainer *ct = uic_get_current_container(obj); |
205 |
345 |
206 Arg args[16]; |
346 Arg args[16]; |
207 int n = 0; |
347 int n = 0; |
|
348 |
208 XtSetArg(args[n], XmNorientation, XmHORIZONTAL); |
349 XtSetArg(args[n], XmNorientation, XmHORIZONTAL); |
209 n++; |
350 n++; |
210 |
351 |
211 Widget parent = ct->prepare(ct, args, &n, TRUE); |
352 Widget parent = ct->prepare(ct, args, &n, TRUE); |
212 Widget pane = XmCreatePanedWindow(parent, "pane", args, n); |
353 Widget pane = XmCreatePanedWindow(parent, "pane", args, n); |
213 ct->add(ct, pane); |
354 ct->add(ct, pane); |
214 XtManageChild(pane); |
355 XtManageChild(pane); |
215 |
356 |
216 // add sidebar widget |
357 // add sidebar widget |
217 XtSetArg(args[0], XmNshadowType, XmSHADOW_ETCHED_OUT); |
358 Widget sidebar = XmCreateForm(pane, "sidebar", args, 0); |
218 XtSetArg(args[1], XmNshadowThickness, 0); |
|
219 Widget sidebar = XmCreateFrame(pane, "sidebar", args, 2); |
|
220 XtManageChild(sidebar); |
359 XtManageChild(sidebar); |
221 |
360 |
222 UiObject *left = uic_object_new(obj, sidebar); |
361 UiObject *left = uic_object_new(obj, sidebar); |
223 left->container = ui_frame_container(left, sidebar); |
362 left->container = ui_box_container(left, sidebar, UI_BOX_VERTICAL); |
224 |
363 |
225 // add content widget |
364 // add content widget |
226 XtSetArg (args[2], XmNpaneMaximum, 8000); |
365 XtSetArg (args[0], XmNpaneMaximum, 8000); |
227 Widget content = XmCreateFrame(pane, "content_area", args, 3); |
366 Widget content = XmCreateForm(pane, "content_area", args, 1); |
228 XtManageChild(content); |
367 XtManageChild(content); |
229 |
368 |
230 UiObject *right = uic_object_new(obj, content); |
369 UiObject *right = uic_object_new(obj, content); |
231 right->container = ui_frame_container(right, content); |
370 right->container = ui_box_container(right, content, UI_BOX_VERTICAL); |
232 |
371 |
233 uic_obj_add(obj, right); |
372 uic_obj_add(obj, right); |
234 uic_obj_add(obj, left); |
373 uic_obj_add(obj, left); |
235 |
374 |
236 return sidebar; |
375 return sidebar; |
267 MotifTabbedPane *tabbedpane = ui_malloc(obj->ctx, sizeof(MotifTabbedPane)); |
406 MotifTabbedPane *tabbedpane = ui_malloc(obj->ctx, sizeof(MotifTabbedPane)); |
268 tabbedpane->view.ctx = uic_current_obj(obj)->ctx; |
407 tabbedpane->view.ctx = uic_current_obj(obj)->ctx; |
269 tabbedpane->view.widget = tabct; |
408 tabbedpane->view.widget = tabct; |
270 tabbedpane->view.document = NULL; |
409 tabbedpane->view.document = NULL; |
271 tabbedpane->tabbar = tabbar; |
410 tabbedpane->tabbar = tabbar; |
272 //tabbedpane->form = tabview; |
|
273 tabbedpane->tabs = NULL; |
411 tabbedpane->tabs = NULL; |
274 tabbedpane->current = NULL; |
412 tabbedpane->current = NULL; |
275 |
413 |
276 return &tabbedpane->view; |
414 return &tabbedpane->view; |
277 } |
415 } |