diff -r e4198fc2ead4 -r 56016468753d ui/common/document.c --- a/ui/common/document.c Sun May 11 11:35:33 2014 +0200 +++ b/ui/common/document.c Thu May 15 15:53:29 2014 +0200 @@ -39,18 +39,19 @@ } void ui_set_document(UiObject *obj, void *document) { - UiDocument *doc = ucx_map_get(documents, ucx_key(&document, sizeof(void*))); - if(!doc) { + UiContext *ctx = ucx_map_get(documents, ucx_key(&document, sizeof(void*))); + if(!ctx) { return; } - doc->obj = obj; + ctx->obj = obj; if(obj->document) { ui_detach_document(obj, obj->document); } obj->document = document; + obj->ctx->document = document; - UcxMapIterator i = ucx_map_iterator(doc->vars); + UcxMapIterator i = ucx_map_iterator(ctx->vars); UiVar *var; UCX_MAP_FOREACH(key, var, i) { UiVar *v = ucx_map_get(obj->ctx->vars, key); @@ -68,7 +69,7 @@ } // copy value - uic_var_move(v, var, 1); + uic_move_var(v, var, 1); var->from = v->from; // TODO: free var struct @@ -79,20 +80,27 @@ } void ui_detach_document(UiObject *obj, void *document) { - UiDocument *doc = ucx_map_get(documents, ucx_key(&document, sizeof(void*))); - if(!doc) { + UiContext *ctx = ucx_map_get(documents, ucx_key(&document, sizeof(void*))); + if(!ctx) { + fprintf( + stderr, + "UiError: ui_detach_document: document is not registered\n"); + return; + } + if(obj->document != document) { + fprintf(stderr, "UiError: ui_detach_document: wrong document\n"); return; } - UcxMapIterator i = ucx_map_iterator(doc->vars); + UcxMapIterator i = ucx_map_iterator(ctx->vars); UiVar *var; UCX_MAP_FOREACH(key, var, i) { - if(var->from && var->from != doc->vars) { + if(var->from && var->from != ctx->vars) { // this var is bind to an outer widget, so we move it UcxAllocator *a = var->from->allocator; UiVar *newvar = a->malloc(a->pool, sizeof(UiVar)); newvar->value = uic_create_value(a, var->type); - uic_var_move(var, newvar, 0); + uic_move_var(var, newvar, 0); newvar->type = var->type; newvar->from = var->from; newvar->isextern = 0; @@ -103,20 +111,22 @@ } } - doc->obj->document = NULL; - doc->obj = NULL; + ctx->obj->document = NULL; + ctx->obj->ctx->document = NULL; + + ctx->obj = NULL; } void* ui_document_new(size_t size) { UcxMempool *mp = ucx_mempool_new(256); - UiDocument *uidoc = ucx_mempool_malloc(mp, sizeof(UiDocument)); - uidoc->obj = NULL; - uidoc->mempool = mp; - uidoc->vars = ucx_map_new_a(mp->allocator, 16); - uidoc->subdocument = NULL; + UiContext *ctx = ucx_mempool_malloc(mp, sizeof(UiContext)); + ctx->obj = NULL; + ctx->mempool = mp; + ctx->vars = ucx_map_new_a(mp->allocator, 16); + //uidoc->subdocument = NULL; void *document = ucx_mempool_calloc(mp, 1, size); - ucx_map_put(documents, ucx_key(&document, sizeof(void*)), uidoc); + ucx_map_put(documents, ucx_key(&document, sizeof(void*)), ctx); return document; } @@ -124,158 +134,45 @@ // TODO } +UiContext* ui_document_context(void *doc) { + if(doc) { + return ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); + } else { + return NULL; + } +} + void* ui_document_malloc(void *doc, size_t size) { - UiDocument *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); + UiContext *uidoc = ui_document_context(doc); return ucx_mempool_malloc(uidoc->mempool, size); } void* ui_document_calloc(void *doc, size_t nelem, size_t elsize) { - UiDocument *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); + UiContext *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); return ucx_mempool_calloc(uidoc->mempool, nelem, elsize); } void ui_document_free(void *doc, void *ptr) { - UiDocument *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); + UiContext *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); ucx_mempool_free(uidoc->mempool, ptr); } void* ui_document_realloc(void *doc, void *ptr, size_t size) { - UiDocument *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); + UiContext *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); return ucx_mempool_realloc(uidoc->mempool, ptr, size); } -UiDocument* uic_getdocument(void *doc) { - return doc ? ucx_map_get(documents, ucx_key(&doc, sizeof(void*))) : NULL; -} - -UiVar* uic_document_getvar(UiDocument *doc, char *name) { - return doc ? ucx_map_cstr_get(doc->vars, name) : NULL; -} - void uic_document_addvar(void *doc, char *name, int type, size_t vs) { - UiDocument *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); - if(!uidoc) { - return; - } - - UiVar *newvar = ucx_mempool_malloc(uidoc->mempool, sizeof(UiVar)); - newvar->isextern = 0; - newvar->type = type; - newvar->value = ucx_mempool_calloc(uidoc->mempool, 1, vs); - newvar->from = NULL; - - uic_document_addvar_v(uidoc, name, newvar, type, vs); -} - -void uic_document_addvar_v( - UiDocument *uidoc, - char *name, - UiVar *newvar, - int type, - size_t vs) -{ - // if the window context has this variable, we remove it and put it to - // the document vars - UiVar *var = uidoc->obj ? - ucx_map_cstr_get(uidoc->obj->ctx->vars, name) : NULL; - if(var) { - // external variables cannot be moved - if(var->isextern) { - fprintf( - stderr, - "UI Error: external variable %s " - "cannot be moved to the document.\n", - name); - return; - } - - // check type - if(var->type != type) { - fprintf(stderr, "UI Error: var %s has incompatible type.\n", name); - return; - } - - // override document var with window context var - memcpy(newvar->value, var->value, vs); - - newvar->from = var->from; - - // TODO: free var struct - ucx_map_cstr_remove(uidoc->obj->ctx->vars, name); - } - - // finally, add the new variable to the document - ucx_map_cstr_put(uidoc->vars, name, newvar); -} + // TODO: remove + UiContext *ctx = ui_document_context(doc); + if(ctx) { + UiVar *newvar = ucx_mempool_malloc(ctx->mempool, sizeof(UiVar)); + newvar->isextern = 0; + newvar->type = type; + newvar->value = ucx_mempool_calloc(ctx->mempool, 1, vs); + newvar->from = NULL; -void uic_document_regvar( - void *doc, - char *name, - int type, - size_t vs, - void *value) -{ - UiDocument *uidoc = ucx_map_get(documents, ucx_key(&doc, sizeof(void*))); - if(!uidoc) { - return; - } - - UiVar *newvar = ucx_mempool_malloc(uidoc->mempool, sizeof(UiVar)); - newvar->isextern = 1; - newvar->type = type; - newvar->value = value; - newvar->from = NULL; - - uic_document_addvar_v(uidoc, name, newvar, type, vs); -} - -void uic_var_move(UiVar *from, UiVar *to, int set) { - switch(from->type) { - case UI_VAR_INTEGER: { - //memcpy(to->value, from->value, sizeof(UiInteger)); - UiInteger *f = from->value; - UiInteger *t = to->value; - t->get = f->get; - t->set = f->set; - t->obj = f->obj; - if(set) { - t->set(t, t->value); - } else { - //t->value = t->get(t); - f->value = f->get(f); - //t->value = 0; - } - break; - } - case UI_VAR_STRING: { - // TODO - break; - } - case UI_VAR_TEXT: { - UiText *f = from->value; - UiText *t = to->value; - char *tvalue = t->value; - memcpy(t, f, sizeof(UiText)); - if(set) { - t->set(t, tvalue); - } else { - f->value = f->get(f); - } - break; - } - case UI_VAR_LIST: { - UiListVar *f = from->value; - UiListVar *t = to->value; - UiList *list = t->listptr->list; - UiObserver *observers = f->listptr->list->observers; - t->listptr = f->listptr; - if(set) { - t->listptr->list = list; - list->observers = observers; - ui_notify(observers, list); - } - break; - } + uic_add_var(ctx, name, newvar, type, vs); } } @@ -283,18 +180,29 @@ uic_document_addvar(doc, name, UI_VAR_INTEGER, sizeof(UiInteger)); } + + void ui_document_regint(void *doc, char *name, UiInteger *i) { - uic_document_regvar(doc, name, UI_VAR_INTEGER, sizeof(UiInteger), i); + UiContext *ctx = ui_document_context(doc); + if(ctx) { + uic_reg_var(ctx, name, UI_VAR_INTEGER, sizeof(UiInteger), i); + } } void ui_document_regtext(void *doc, char *name, UiText *text) { - uic_document_regvar(doc, name, UI_VAR_TEXT, sizeof(UiText), text); + UiContext *ctx = ui_document_context(doc); + if(ctx) { + uic_reg_var(doc, name, UI_VAR_TEXT, sizeof(UiText), text); + } } void ui_document_reglist(void *doc, char *name, UiList *list) { - UiListVar *lv = ui_document_malloc(doc, sizeof(UiListVar)); - UiListPtr *lp = ui_document_malloc(doc, sizeof(UiListPtr)); - lv->listptr = lp; - lp->list = list; - uic_document_regvar(doc, name, UI_VAR_LIST, sizeof(UiListPtr), lv); + UiContext *ctx = ui_document_context(doc); + if(ctx) { + UiListVar *lv = ui_document_malloc(doc, sizeof(UiListVar)); + UiListPtr *lp = ui_document_malloc(doc, sizeof(UiListPtr)); + lv->listptr = lp; + lp->list = list; + uic_reg_var(doc, name, UI_VAR_LIST, sizeof(UiListPtr), lv); + } }