ui/common/document.c

changeset 37
56016468753d
parent 33
458831c574f4
child 52
25e5390cce41
--- 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);
+    }
 }

mercurial