| 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); |