ui/motif/container.c

changeset 62
70d2aee84432
parent 61
7ee124a58fe3
child 63
46a42f0c4f93
equal deleted inserted replaced
61:7ee124a58fe3 62:70d2aee84432
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include <stdio.h> 29 #include <stdio.h>
30 #include <stdlib.h> 30 #include <stdlib.h>
31 #include <inttypes.h>
31 32
32 #include "container.h" 33 #include "container.h"
33 #include "../common/context.h" 34 #include "../common/context.h"
34 #include "../common/object.h" 35 #include "../common/object.h"
36
37 #define UI_GRID_MAX_COLUMNS 512
35 38
36 static UiBool ui_lb2bool(UiLayoutBool b) { 39 static UiBool ui_lb2bool(UiLayoutBool b) {
37 return b == UI_LAYOUT_TRUE ? TRUE : FALSE; 40 return b == UI_LAYOUT_TRUE ? TRUE : FALSE;
38 } 41 }
39 42
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(
124 XtSetArg(args[a], w1, bc->prev_widget); a++; 126 XtSetArg(args[a], w1, bc->prev_widget); a++;
125 } else { 127 } else {
126 XtSetArg(args[a], d1, XmATTACH_FORM); a++; 128 XtSetArg(args[a], d1, XmATTACH_FORM); a++;
127 } 129 }
128 130
129 *n += a; 131 *n = a;
130 return ct->widget; 132 return ct->widget;
131 } 133 }
132 134
133 void ui_box_container_add(UiContainer *ct, Widget widget) { 135 void ui_box_container_add(UiContainer *ct, Widget widget) {
134 UiBoxContainer *bc = (UiBoxContainer*)ct; 136 UiBoxContainer *bc = (UiBoxContainer*)ct;
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 }
448 586
449 void ui_layout_fill(UiObject *obj, UiBool fill) { 587 void ui_layout_fill(UiObject *obj, UiBool fill) {
450 UiContainer *ct = uic_get_current_container(obj); 588 UiContainer *ct = uic_get_current_container(obj);
451 ct->layout.fill = ui_bool2lb(fill); 589 ct->layout.fill = ui_bool2lb(fill);
452 } 590 }
591
592 void ui_newline(UiObject *obj) {
593 UiContainer *ct = uic_get_current_container(obj);
594 ct->layout.newline = TRUE;
595 }

mercurial