1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32
33 #include "document.h"
34
35 #include <cx/hash_map.h>
36 #include <cx/mempool.h>
37
38
39 static CxMap *documents;
40
41 void uic_docmgr_init() {
42 if (!documents) {
43 documents = cxHashMapCreate(cxDefaultAllocator,
CX_STORE_POINTERS,
32);
44 }
45 }
46
47 void ui_set_document(UiObject *obj,
void *document) {
48 uic_context_detach_all(obj->ctx);
49 obj->ctx->attach_document(obj->ctx, document);
50 }
51
52 void ui_detach_document(UiObject *obj) {
53 uic_context_detach_all(obj->ctx);
54 }
55
56 void* ui_get_document(UiObject *obj) {
57 return obj->ctx->document;
58 }
59
60 void ui_set_subdocument(
void *document,
void *sub) {
61 UiContext *ctx = ui_document_context(document);
62 if(!ctx) {
63 fprintf(stderr,
"UI Error: pointer is not a document\n");
64 }
65
66 }
67
68 void ui_detach_subdocument(
void *document,
void *sub) {
69 UiContext *ctx = ui_document_context(document);
70 if(!ctx) {
71 fprintf(stderr,
"UI Error: pointer is not a document\n");
72 }
73
74 }
75
76 void* ui_get_subdocument(
void *document) {
77 UiContext *ctx = ui_document_context(document);
78 if(!ctx) {
79 fprintf(stderr,
"UI Error: pointer is not a document\n");
80 }
81
82 return NULL;
83 }
84
85 void* ui_document_new(
size_t size) {
86 CxMempool *mp = cxMempoolCreate(
256,
NULL);
87 const CxAllocator *a = mp->allocator;
88 UiContext *ctx = cxCalloc(a,
1,
sizeof(UiContext));
89 ctx->mp = mp;
90 ctx->attach_document = uic_context_attach_document;
91 ctx->detach_document2 = uic_context_detach_document2;
92 ctx->allocator = a;
93 ctx->vars = cxHashMapCreate(a,
CX_STORE_POINTERS,
16);
94
95 void *document = cxCalloc(a, size,
1);
96 cxMapPut(documents, cx_hash_key(&document,
sizeof(
void*)), ctx);
97 return document;
98 }
99
100 void ui_document_destroy(
void *doc) {
101 UiContext *ctx = ui_document_context(doc);
102 if(ctx) {
103 UiEvent ev;
104 ev.window =
NULL;
105 ev.document = doc;
106 ev.obj =
NULL;
107 ev.eventdata =
NULL;
108 ev.intval =
0;
109
110 if(ctx->close_callback) {
111 ctx->close_callback(&ev, ctx->close_data);
112 }
113 cxMempoolDestroy(ctx->mp);
114 }
115 }
116
117 UiContext* ui_document_context(
void *doc) {
118 if(doc) {
119 return cxMapGet(documents, cx_hash_key(&doc,
sizeof(
void*)));
120 }
else {
121 return NULL;
122 }
123 }
124