| 197 memset(&event, 0, sizeof(UiEvent)); |
197 memset(&event, 0, sizeof(UiEvent)); |
| 198 event.document = document; |
198 event.document = document; |
| 199 doc_ctx->onattach(&event, doc_ctx->onattachdata); |
199 doc_ctx->onattach(&event, doc_ctx->onattachdata); |
| 200 } |
200 } |
| 201 uic_check_state_widgets(ui_context_toplevel_parent(ctx)); |
201 uic_check_state_widgets(ui_context_toplevel_parent(ctx)); |
| 202 uic_send_status_change(doc_ctx); |
202 UiObject *obj = ui_context_get_parent_obj(ctx); |
| |
203 uic_send_status_change(doc_ctx, obj); |
| |
204 |
| |
205 UiContext *obj_ctx = uic_obj_context(ctx); |
| |
206 if(obj_ctx) { |
| |
207 ui_update_action_bindings(obj_ctx); |
| |
208 } |
| 203 } |
209 } |
| 204 |
210 |
| 205 static void uic_context_unbind_vars(UiContext *ctx) { |
211 static void uic_context_unbind_vars(UiContext *ctx) { |
| 206 int onchange_enabled = ui_onchange_events_is_enabled(); |
212 int onchange_enabled = ui_onchange_events_is_enabled(); |
| 207 int onselection_enabled = ui_selection_events_is_enabled(); |
213 int onselection_enabled = ui_selection_events_is_enabled(); |
| 245 |
251 |
| 246 UiContext *doc_ctx = ui_document_context(document); |
252 UiContext *doc_ctx = ui_document_context(document); |
| 247 uic_context_unbind_vars(doc_ctx); // unbind all doc/subdoc vars from the parent |
253 uic_context_unbind_vars(doc_ctx); // unbind all doc/subdoc vars from the parent |
| 248 doc_ctx->parent = NULL; |
254 doc_ctx->parent = NULL; |
| 249 |
255 |
| 250 ui_update_action_bindings(ctx); |
256 UiContext *obj_ctx = uic_obj_context(ctx); |
| |
257 if(obj_ctx) { |
| |
258 ui_update_action_bindings(obj_ctx); |
| |
259 } |
| 251 if(doc_ctx->ondetach) { |
260 if(doc_ctx->ondetach) { |
| 252 UiEvent event; |
261 UiEvent event; |
| 253 memset(&event, 0, sizeof(UiEvent)); |
262 memset(&event, 0, sizeof(UiEvent)); |
| 254 event.document = document; |
263 event.document = document; |
| 255 doc_ctx->ondetach(&event, doc_ctx->ondetachdata); |
264 doc_ctx->ondetach(&event, doc_ctx->ondetachdata); |
| 256 } |
265 } |
| 257 |
266 |
| 258 uic_check_state_widgets(ui_context_toplevel_parent(ctx)); |
267 uic_check_state_widgets(ui_context_toplevel_parent(ctx)); |
| 259 uic_send_status_change(doc_ctx); |
268 uic_send_status_change(doc_ctx, NULL); |
| 260 ui_document_unref(document); |
269 ui_document_unref(document); |
| 261 } |
270 } |
| 262 |
271 |
| 263 void uic_context_detach_all(UiContext *ctx) { |
272 void uic_context_detach_all(UiContext *ctx) { |
| 264 // copy list |
273 // copy list |
| 270 |
279 |
| 271 // detach documents |
280 // detach documents |
| 272 i = cxListIterator(ls); |
281 i = cxListIterator(ls); |
| 273 cx_foreach(void *, doc, i) { |
282 cx_foreach(void *, doc, i) { |
| 274 uic_context_detach_document(ctx, doc); |
283 uic_context_detach_document(ctx, doc); |
| 275 uic_send_status_change(ui_document_context(doc)); |
284 uic_send_status_change(ui_document_context(doc), NULL); |
| 276 } |
285 } |
| 277 |
286 |
| 278 cxListFree(ls); |
287 cxListFree(ls); |
| 279 ui_update_action_bindings(ctx); |
288 ui_update_action_bindings(ctx); |
| 280 } |
289 } |
| 281 |
290 |
| 282 static void send_status_change(UiContext *ctx, UiEvent *event) { |
291 static void send_status_change(UiContext *ctx, UiEvent *event, UiObject *obj) { |
| 283 CxIterator i = cxListIterator(ctx->documents); |
292 CxIterator i = cxListIterator(ctx->documents); |
| 284 cx_foreach(void *, doc, i) { |
293 cx_foreach(void *, doc, i) { |
| 285 UiContext *doc_ctx = ui_document_context(doc); |
294 UiContext *doc_ctx = ui_document_context(doc); |
| 286 if(doc_ctx->onattachmentstatuschange) { |
295 if(doc_ctx->onattachmentstatuschange) { |
| 287 event->obj = doc_ctx->obj; |
296 event->obj = doc_ctx->obj ? doc_ctx->obj : obj; |
| 288 event->window = event->obj ? event->obj->window : NULL; |
297 event->window = event->obj ? event->obj->window : NULL; |
| 289 event->document = doc_ctx->self_doc ? doc_ctx->self_doc : doc_ctx->document; |
298 event->document = doc_ctx->self_doc ? doc_ctx->self_doc : doc_ctx->document; |
| 290 doc_ctx->onattachmentstatuschange(event, doc_ctx->onattachmentstatuschangedata); |
299 doc_ctx->onattachmentstatuschange(event, doc_ctx->onattachmentstatuschangedata); |
| 291 } |
300 } |
| 292 } |
301 } |
| 293 |
302 |
| 294 if(ctx->onattachmentstatuschange) { |
303 if(ctx->onattachmentstatuschange) { |
| 295 event->obj = ctx->obj; |
304 event->obj = ctx->obj ? ctx->obj : obj; |
| 296 event->window = event->obj ? event->obj->window : NULL; |
305 event->window = event->obj ? event->obj->window : NULL; |
| 297 event->document = ctx->self_doc ? ctx->self_doc : ctx->document; |
306 event->document = ctx->self_doc ? ctx->self_doc : ctx->document; |
| 298 ctx->onattachmentstatuschange(event, ctx->onattachmentstatuschangedata); |
307 ctx->onattachmentstatuschange(event, ctx->onattachmentstatuschangedata); |
| 299 } |
308 } |
| 300 } |
309 } |
| 301 |
310 |
| 302 void uic_send_status_change(UiContext *ctx) { |
311 void uic_send_status_change(UiContext *ctx, UiObject *obj) { |
| 303 UiEvent event; |
312 UiEvent event; |
| 304 memset(&event, 0, sizeof(UiEvent)); |
313 memset(&event, 0, sizeof(UiEvent)); |
| 305 send_status_change(ctx, &event); |
314 send_status_change(ctx, &event, obj); |
| 306 } |
315 } |
| 307 |
316 |
| 308 |
317 |
| 309 static UiVar* ctx_getvar(UiContext *ctx, CxHashKey key) { |
318 static UiVar* ctx_getvar(UiContext *ctx, CxHashKey key) { |
| 310 UiVar *var = cxMapGet(ctx->vars, key); |
319 UiVar *var = cxMapGet(ctx->vars, key); |
| 1102 int ui_context_is_attached(UiContext *ctx) { |
1111 int ui_context_is_attached(UiContext *ctx) { |
| 1103 return ctx->parent != NULL; |
1112 return ctx->parent != NULL; |
| 1104 } |
1113 } |
| 1105 |
1114 |
| 1106 int ui_context_is_attached_to_obj(UiContext *ctx) { |
1115 int ui_context_is_attached_to_obj(UiContext *ctx) { |
| |
1116 return uic_obj_context(ctx) != NULL; |
| |
1117 } |
| |
1118 |
| |
1119 UIEXPORT UiObject* ui_context_get_parent_obj(UiContext *ctx) { |
| |
1120 UiContext *obj_ctx = uic_obj_context(ctx); |
| |
1121 return obj_ctx ? obj_ctx->obj : NULL; |
| |
1122 } |
| |
1123 |
| |
1124 UiContext* uic_obj_context(UiContext *ctx) { |
| 1107 if(ctx->obj) { |
1125 if(ctx->obj) { |
| 1108 return TRUE; |
1126 return ctx; |
| 1109 } |
1127 } |
| 1110 if(ctx->parent == NULL) { |
1128 if(ctx->parent == NULL) { |
| 1111 return FALSE; |
1129 return NULL; |
| 1112 } |
1130 } |
| 1113 return ui_context_is_attached_to_obj(ctx->parent); |
1131 return uic_obj_context(ctx->parent); |
| 1114 } |
1132 } |