#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include "container.h"
#include "../common/context.h"
#include "../common/object.h"
#include "Grid.h"
static UIWIDGET box_create(UiObject *obj, UiContainerArgs args, UiBoxOrientation orientation) {
UiContainerPrivate *ctn = ui_obj_container(obj);
UI_APPLY_LAYOUT(ctn->layout, args);
Arg xargs[
16];
int n =
0;
if(orientation ==
UI_BOX_VERTICAL) {
}
else {
}
Widget parent = ctn->prepare(ctn, xargs, &n);
Widget grid = XtCreateManagedWidget(args.name ? args.name :
"boxcontainer", gridClass, parent, xargs, n);
ctn->add(ctn, grid);
UiContainerX *container = ui_box_container(obj, grid, orientation);
uic_object_push_container(obj, container);
return grid;
}
UIWIDGET ui_vbox_create(UiObject *obj, UiContainerArgs args) {
return box_create(obj, args,
UI_BOX_VERTICAL);
}
UIWIDGET ui_hbox_create(UiObject *obj, UiContainerArgs args) {
return box_create(obj, args,
UI_BOX_HORIZONTAL);
}
UiContainerX* ui_box_container(UiObject *obj, Widget grid, UiBoxOrientation orientation) {
UiBoxContainer *ctn = ui_malloc(obj->ctx,
sizeof(UiBoxContainer));
memset(ctn,
0,
sizeof(UiBoxContainer));
ctn->container.prepare = orientation ==
UI_BOX_VERTICAL ? ui_vbox_prepare : ui_hbox_prepare;
ctn->container.add = ui_box_container_add;
ctn->container.widget = grid;
ctn->n =
0;
return (UiContainerX*)ctn;
}
static Widget ui_box_container_prepare(UiBoxContainer *box, Arg *args,
int *n) {
int a = *n;
box->n++;
return box->container.widget;
}
Widget ui_vbox_prepare(UiContainerPrivate *ctn, Arg *args,
int *n) {
UiBoxContainer *box = (UiBoxContainer*)ctn;
int a = *n;
XtSetArg(args[a], gridRow, box->n); a++;
if(box->container.layout.fill ==
UI_ON) {
XtSetArg(args[a], gridVExpand,
TRUE); a++;
XtSetArg(args[a], gridVFill,
TRUE); a++;
}
XtSetArg(args[a], gridHExpand,
TRUE); a++;
XtSetArg(args[a], gridHFill,
TRUE); a++;
*n = a;
return ui_box_container_prepare(box, args, n);
}
Widget ui_hbox_prepare(UiContainerPrivate *ctn, Arg *args,
int *n) {
UiBoxContainer *box = (UiBoxContainer*)ctn;
int a = *n;
XtSetArg(args[a], gridColumn, box->n); a++;
if(box->container.layout.fill ==
UI_ON) {
XtSetArg(args[a], gridHExpand,
TRUE); a++;
XtSetArg(args[a], gridHFill,
TRUE); a++;
}
XtSetArg(args[a], gridVExpand,
TRUE); a++;
XtSetArg(args[a], gridVFill,
TRUE); a++;
*n = a;
return ui_box_container_prepare(box, args, n);
}
void ui_box_container_add(UiContainerPrivate *ctn, Widget widget) {
ui_reset_layout(ctn->layout);
}
UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs args) {
Arg xargs[
16];
int n =
0;
XtSetArg(xargs[n], XmNbackground,
0); n++;
UiContainerPrivate *ctn = ui_obj_container(obj);
UI_APPLY_LAYOUT(ctn->layout, args);
Widget parent = ctn->prepare(ctn, xargs, &n);
Widget grid = XtCreateManagedWidget(args.name ? args.name :
"gridcontainer", gridClass, parent, xargs, n);
ctn->add(ctn, grid);
UiContainerX *container = ui_grid_container(obj, grid);
uic_object_push_container(obj, container);
return grid;
}
UiContainerX* ui_grid_container(UiObject *obj, Widget grid) {
UiGridContainer *ctn = ui_malloc(obj->ctx,
sizeof(UiGridContainer));
memset(ctn,
0,
sizeof(UiBoxContainer));
ctn->container.prepare = ui_grid_container_prepare;
ctn->container.add = ui_grid_container_add;
ctn->container.widget = grid;
ctn->x =
0;
ctn->y =
0;
return (UiContainerX*)ctn;
}
Widget ui_grid_container_prepare(UiContainerPrivate *ctn, Arg *args,
int *n) {
UiGridContainer *grid = (UiGridContainer*)ctn;
if(ctn->layout.newline) {
grid->y++;
grid->x =
0;
}
int a = *n;
XtSetArg(args[a], gridColumn, grid->x); a++;
XtSetArg(args[a], gridRow, grid->y); a++;
if(ctn->layout.colspan >
0) {
XtSetArg(args[a], gridColspan, ctn->layout.colspan); a++;
}
if(ctn->layout.rowspan >
0) {
XtSetArg(args[a], gridRowspan, ctn->layout.rowspan); a++;
}
if(grid->container.layout.fill ==
UI_ON) {
grid->container.layout.hfill =
TRUE;
grid->container.layout.vfill =
TRUE;
grid->container.layout.hexpand =
TRUE;
grid->container.layout.vexpand =
TRUE;
}
if(grid->container.layout.hfill) {
XtSetArg(args[a], gridHFill,
TRUE); a++;
}
if(grid->container.layout.vfill) {
XtSetArg(args[a], gridVFill,
TRUE); a++;
}
if(grid->container.layout.hexpand) {
XtSetArg(args[a], gridHExpand,
TRUE); a++;
}
if(grid->container.layout.vexpand) {
XtSetArg(args[a], gridVExpand,
TRUE); a++;
}
*n = a;
return ctn->widget;
}
void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget) {
UiGridContainer *grid = (UiGridContainer*)ctn;
grid->x++;
ui_reset_layout(ctn->layout);
}
void ui_container_begin_close(UiObject *obj) {
UiContainerPrivate *ct = ui_obj_container(obj);
ct->container.close =
1;
}
int ui_container_finish(UiObject *obj) {
UiContainerPrivate *ct = ui_obj_container(obj);
if(ct->container.close) {
ui_end_new(obj);
return 0;
}
return 1;
}
void ui_newline(UiObject *obj) {
UiContainerPrivate *ct = ui_obj_container(obj);
ct->layout.newline =
TRUE;
}