#include <stdio.h>
#include <stdlib.h>
#include "object.h"
#include "context.h"
#include "../ui/container.h"
void ui_end(UiObject *obj) {
if(!obj->next) {
return;
}
UiObject *prev =
NULL;
while(obj->next) {
prev = obj;
obj = obj->next;
}
if(prev) {
prev->next =
NULL;
}
}
void ui_end_new(UiObject *obj) {
if(!obj->container_end) {
return;
}
UiContainerX *rm = obj->container_end;
uic_object_pop_container(obj);
ui_free(obj->ctx, rm);
}
void ui_object_ref(UiObject *obj) {
obj->ref++;
}
int ui_object_unref(UiObject *obj) {
if(obj->ref ==
0 || --obj->ref ==
0) {
if(obj->destroy) {
obj->destroy(obj);
}
uic_object_destroy(obj);
return 0;
}
return 1;
}
void uic_object_destroy(UiObject *obj) {
if(obj->ctx->close_callback) {
UiEvent ev;
ev.window = obj->window;
ev.document = obj->ctx->document;
ev.obj = obj;
ev.eventdata =
NULL;
ev.intval =
0;
obj->ctx->close_callback(&ev, obj->ctx->close_data);
}
cxMempoolFree(obj->ctx->mp);
}
UiObject* uic_object_new(UiObject *toplevel,
UIWIDGET widget) {
return uic_ctx_object_new(toplevel->ctx, widget);
}
UiObject* uic_ctx_object_new(UiContext *ctx,
UIWIDGET widget) {
UiObject *newobj = cxCalloc(ctx->allocator,
1,
sizeof(UiObject));
newobj->ctx = ctx;
newobj->widget = widget;
return newobj;
}
void uic_obj_add(UiObject *toplevel, UiObject *ctobj) {
UiObject *current = uic_current_obj(toplevel);
current->next = ctobj;
}
UiObject* uic_current_obj(UiObject *toplevel) {
if(!toplevel) {
return NULL;
}
UiObject *obj = toplevel;
while(obj->next) {
obj = obj->next;
}
return obj;
}
UiContainer* uic_get_current_container(UiObject *obj) {
return uic_current_obj(obj)->container;
}
void uic_object_push_container(UiObject *toplevel, UiContainerX *newcontainer) {
newcontainer->prev = toplevel->container_end;
if(toplevel->container_end) {
toplevel->container_end->next = newcontainer;
toplevel->container_end = newcontainer;
}
else {
toplevel->container_begin = newcontainer;
toplevel->container_end = newcontainer;
}
}
void uic_object_pop_container(UiObject *toplevel) {
toplevel->container_end = toplevel->container_end->prev;
if(toplevel->container_end) {
toplevel->container_end->next =
NULL;
}
else {
toplevel->container_begin =
NULL;
}
}