ui/common/context.c

changeset 1165
aca0b56e92d2
parent 1147
30476eaff3ba
child 1166
01653cc7256b
equal deleted inserted replaced
1164:3c037b84e6eb 1165:aca0b56e92d2
139 uic_context_detach_all(ctx); 139 uic_context_detach_all(ctx);
140 140
141 cxMempoolFree(ctx->mp); 141 cxMempoolFree(ctx->mp);
142 } 142 }
143 143
144 void uic_context_attach_document(UiContext *ctx, void *document) { 144 void uic_context_update_bindings(UiContext *ctx) {
145 if(ctx->single_document_mode) {
146 if(ctx->document) {
147 uic_context_detach_document(ctx, ctx->document);
148 }
149 }
150
151 cxListAdd(ctx->documents, document);
152 ctx->document = document;
153
154 UiContext *doc_ctx = ui_document_context(document);
155 doc_ctx->parent = ctx;
156 doc_ctx->ref++;
157
158 // if a document variable has the same name as a parent variable, 145 // if a document variable has the same name as a parent variable,
159 // move the bindings to the document 146 // move the bindings to the document
160 UiContext *var_ctx = ctx; 147 UiContext *var_ctx = ctx->parent;
161 while(var_ctx) { 148 while(var_ctx) {
162 CxMapIterator i = cxMapIterator(var_ctx->vars); 149 CxMapIterator i = cxMapIterator(var_ctx->vars);
163 cx_foreach(CxMapEntry*, entry, i) { 150 cx_foreach(CxMapEntry*, entry, i) {
164 printf("attach %.*s\n", (int)entry->key->len, (char*)entry->key->data); 151 printf("attach %.*s\n", (int)entry->key->len, (char*)entry->key->data);
165 UiVar *var = entry->value; 152 UiVar *var = entry->value;
166 UiVar *docvar = cxMapGet(doc_ctx->vars, *entry->key); 153 UiVar *docvar = cxMapGet(ctx->vars, *entry->key);
167 if(docvar) { 154 if(docvar) {
168 // bind var to document var 155 // bind var to document var
169 uic_copy_var_binding(var, docvar, TRUE); 156 uic_copy_var_binding(var, docvar, TRUE);
170 cxIteratorFlagRemoval(i); 157 cxIteratorFlagRemoval(i);
171 } 158 }
173 160
174 var_ctx = var_ctx->parent; 161 var_ctx = var_ctx->parent;
175 } 162 }
176 163
177 ui_update_action_bindings(ctx); 164 ui_update_action_bindings(ctx);
165
166 if(ctx->documents) {
167 CxIterator i = cxListIterator(ctx->documents);
168 cx_foreach(void *, doc, i) {
169 UiContext *subctx = ui_document_context(doc);
170 uic_context_update_bindings(subctx);
171 }
172 }
173 }
174
175 void uic_context_attach_document(UiContext *ctx, void *document) {
176 if(ctx->single_document_mode) {
177 if(ctx->document) {
178 uic_context_detach_document(ctx, ctx->document);
179 }
180 }
181
182 cxListAdd(ctx->documents, document);
183 ctx->document = document;
184
185 UiContext *doc_ctx = ui_document_context(document);
186 doc_ctx->parent = ctx;
187 doc_ctx->ref++;
188
189 uic_context_update_bindings(doc_ctx);
178 } 190 }
179 191
180 static void uic_context_unbind_vars(UiContext *ctx) { 192 static void uic_context_unbind_vars(UiContext *ctx) {
181 ui_onchange_events_enable(FALSE); 193 ui_onchange_events_enable(FALSE);
182 CxMapIterator mi = cxMapIterator(ctx->vars); 194 CxMapIterator mi = cxMapIterator(ctx->vars);

mercurial