#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "document.h"
#include <cx/hash_map.h>
#include <cx/mempool.h>
static CxMap *documents;
void uic_docmgr_init() {
if (!documents) {
documents = cxHashMapCreate(cxDefaultAllocator,
CX_STORE_POINTERS,
32);
}
}
void ui_set_document(UiObject *obj,
void *document) {
uic_context_detach_all(obj->ctx);
obj->ctx->attach_document(obj->ctx, document);
}
void ui_detach_document(UiObject *obj) {
uic_context_detach_all(obj->ctx);
}
void* ui_get_document(UiObject *obj) {
return obj->ctx->document;
}
void ui_set_subdocument(
void *document,
void *sub) {
UiContext *ctx = ui_document_context(document);
if(!ctx) {
fprintf(stderr,
"UI Error: pointer is not a document\n");
}
}
void ui_detach_subdocument(
void *document,
void *sub) {
UiContext *ctx = ui_document_context(document);
if(!ctx) {
fprintf(stderr,
"UI Error: pointer is not a document\n");
}
}
void* ui_get_subdocument(
void *document) {
UiContext *ctx = ui_document_context(document);
if(!ctx) {
fprintf(stderr,
"UI Error: pointer is not a document\n");
}
return NULL;
}
void* ui_document_new(
size_t size) {
CxMempool *mp = cxMempoolCreate(
256,
NULL);
const CxAllocator *a = mp->allocator;
UiContext *ctx = cxCalloc(a,
1,
sizeof(UiContext));
ctx->mp = mp;
ctx->attach_document = uic_context_attach_document;
ctx->detach_document2 = uic_context_detach_document2;
ctx->allocator = a;
ctx->vars = cxHashMapCreate(a,
CX_STORE_POINTERS,
16);
void *document = cxCalloc(a, size,
1);
cxMapPut(documents, cx_hash_key(&document,
sizeof(
void*)), ctx);
return document;
}
void ui_document_destroy(
void *doc) {
UiContext *ctx = ui_document_context(doc);
if(ctx) {
UiEvent ev;
ev.window =
NULL;
ev.document = doc;
ev.obj =
NULL;
ev.eventdata =
NULL;
ev.intval =
0;
if(ctx->close_callback) {
ctx->close_callback(&ev, ctx->close_data);
}
cxMempoolDestroy(ctx->mp);
}
}
UiContext* ui_document_context(
void *doc) {
if(doc) {
return cxMapGet(documents, cx_hash_key(&doc,
sizeof(
void*)));
}
else {
return NULL;
}
}