| 194 UiEvent event; |
194 UiEvent event; |
| 195 memset(&event, 0, sizeof(UiEvent)); |
195 memset(&event, 0, sizeof(UiEvent)); |
| 196 event.document = document; |
196 event.document = document; |
| 197 doc_ctx->onattach(&event, doc_ctx->onattachdata); |
197 doc_ctx->onattach(&event, doc_ctx->onattachdata); |
| 198 } |
198 } |
| |
199 uic_send_status_change(doc_ctx); |
| 199 } |
200 } |
| 200 |
201 |
| 201 static void uic_context_unbind_vars(UiContext *ctx) { |
202 static void uic_context_unbind_vars(UiContext *ctx) { |
| 202 int onchange_enabled = ui_onchange_events_is_enabled(); |
203 int onchange_enabled = ui_onchange_events_is_enabled(); |
| 203 int onselection_enabled = ui_selection_events_is_enabled(); |
204 int onselection_enabled = ui_selection_events_is_enabled(); |
| 240 ctx->document = cxListAt(ctx->documents, 0); |
241 ctx->document = cxListAt(ctx->documents, 0); |
| 241 |
242 |
| 242 UiContext *doc_ctx = ui_document_context(document); |
243 UiContext *doc_ctx = ui_document_context(document); |
| 243 uic_context_unbind_vars(doc_ctx); // unbind all doc/subdoc vars from the parent |
244 uic_context_unbind_vars(doc_ctx); // unbind all doc/subdoc vars from the parent |
| 244 doc_ctx->parent = NULL; |
245 doc_ctx->parent = NULL; |
| 245 ui_document_unref(document); |
|
| 246 |
246 |
| 247 ui_update_action_bindings(ctx); |
247 ui_update_action_bindings(ctx); |
| 248 if(doc_ctx->ondetach) { |
248 if(doc_ctx->ondetach) { |
| 249 UiEvent event; |
249 UiEvent event; |
| 250 memset(&event, 0, sizeof(UiEvent)); |
250 memset(&event, 0, sizeof(UiEvent)); |
| 251 event.document = document; |
251 event.document = document; |
| 252 doc_ctx->ondetach(&event, doc_ctx->ondetachdata); |
252 doc_ctx->ondetach(&event, doc_ctx->ondetachdata); |
| 253 } |
253 } |
| |
254 |
| |
255 uic_send_status_change(doc_ctx); |
| |
256 ui_document_unref(document); |
| 254 } |
257 } |
| 255 |
258 |
| 256 void uic_context_detach_all(UiContext *ctx) { |
259 void uic_context_detach_all(UiContext *ctx) { |
| 257 // copy list |
260 // copy list |
| 258 CxList *ls = cxLinkedListCreate(cxDefaultAllocator, CX_STORE_POINTERS); |
261 CxList *ls = cxLinkedListCreate(cxDefaultAllocator, CX_STORE_POINTERS); |
| 263 |
266 |
| 264 // detach documents |
267 // detach documents |
| 265 i = cxListIterator(ls); |
268 i = cxListIterator(ls); |
| 266 cx_foreach(void *, doc, i) { |
269 cx_foreach(void *, doc, i) { |
| 267 uic_context_detach_document(ctx, doc); |
270 uic_context_detach_document(ctx, doc); |
| |
271 uic_send_status_change(ui_document_context(doc)); |
| 268 } |
272 } |
| 269 |
273 |
| 270 cxListFree(ls); |
274 cxListFree(ls); |
| 271 ui_update_action_bindings(ctx); |
275 ui_update_action_bindings(ctx); |
| 272 } |
276 } |
| |
277 |
| |
278 static void send_status_change(UiContext *ctx, UiEvent *event) { |
| |
279 CxIterator i = cxListIterator(ctx->documents); |
| |
280 cx_foreach(void *, doc, i) { |
| |
281 UiContext *doc_ctx = ui_document_context(doc); |
| |
282 if(doc_ctx->onattachmentstatuschange) { |
| |
283 event->obj = doc_ctx->obj; |
| |
284 event->window = event->obj ? event->obj->window : NULL; |
| |
285 event->document = doc_ctx->self_doc ? doc_ctx->self_doc : doc_ctx->document; |
| |
286 doc_ctx->onattachmentstatuschange(event, doc_ctx->onattachmentstatuschangedata); |
| |
287 } |
| |
288 } |
| |
289 |
| |
290 if(ctx->onattachmentstatuschange) { |
| |
291 event->obj = ctx->obj; |
| |
292 event->window = event->obj ? event->obj->window : NULL; |
| |
293 event->document = ctx->self_doc ? ctx->self_doc : ctx->document; |
| |
294 ctx->onattachmentstatuschange(event, ctx->onattachmentstatuschangedata); |
| |
295 } |
| |
296 } |
| |
297 |
| |
298 void uic_send_status_change(UiContext *ctx) { |
| |
299 UiEvent event; |
| |
300 memset(&event, 0, sizeof(UiEvent)); |
| |
301 send_status_change(ctx, &event); |
| |
302 } |
| |
303 |
| 273 |
304 |
| 274 static UiVar* ctx_getvar(UiContext *ctx, CxHashKey key) { |
305 static UiVar* ctx_getvar(UiContext *ctx, CxHashKey key) { |
| 275 UiVar *var = cxMapGet(ctx->vars, key); |
306 UiVar *var = cxMapGet(ctx->vars, key); |
| 276 if(!var && ctx->documents) { |
307 if(!var && ctx->documents) { |
| 277 CxIterator i = cxListIterator(ctx->documents); |
308 CxIterator i = cxListIterator(ctx->documents); |
| 954 void ui_context_ondetach(UiContext *ctx, ui_callback cb, void *data) { |
985 void ui_context_ondetach(UiContext *ctx, ui_callback cb, void *data) { |
| 955 ctx->ondetach = cb; |
986 ctx->ondetach = cb; |
| 956 ctx->ondetachdata = data; |
987 ctx->ondetachdata = data; |
| 957 } |
988 } |
| 958 |
989 |
| |
990 void ui_context_onattachmentstatuschange(UiContext *ctx, ui_callback cb, void *data) { |
| |
991 ctx->onattachmentstatuschange = cb; |
| |
992 ctx->onattachmentstatuschangedata = data; |
| |
993 } |
| |
994 |
| 959 static void attachment_action_callback(UiEvent *event, void *action) { |
995 static void attachment_action_callback(UiEvent *event, void *action) { |
| 960 if(event->document) { |
996 if(event->document) { |
| 961 UiContext *ctx = ui_document_context(event->document); |
997 UiContext *ctx = ui_document_context(event->document); |
| 962 ui_call_action_on(ctx, action); |
998 ui_call_action_on(ctx, action); |
| 963 } |
999 } |
| 970 |
1006 |
| 971 void ui_context_ondetach_action(UiContext *ctx, const char *action) { |
1007 void ui_context_ondetach_action(UiContext *ctx, const char *action) { |
| 972 ctx->ondetach = attachment_action_callback; |
1008 ctx->ondetach = attachment_action_callback; |
| 973 ctx->ondetachdata = ui_strdup(ctx, action); |
1009 ctx->ondetachdata = ui_strdup(ctx, action); |
| 974 } |
1010 } |
| |
1011 |
| |
1012 void ui_context_onattachmentstatuschange_action(UiContext *ctx, const char *action) { |
| |
1013 ctx->onattachmentstatuschange = attachment_action_callback; |
| |
1014 ctx->onattachmentstatuschangedata = ui_strdup(ctx, action); |
| |
1015 } |
| |
1016 |
| |
1017 |
| |
1018 int ui_context_is_attached(UiContext *ctx) { |
| |
1019 return ctx->parent != NULL; |
| |
1020 } |
| |
1021 |
| |
1022 int ui_context_is_attached_to_obj(UiContext *ctx) { |
| |
1023 if(ctx->obj) { |
| |
1024 return TRUE; |
| |
1025 } |
| |
1026 if(ctx->parent == NULL) { |
| |
1027 return FALSE; |
| |
1028 } |
| |
1029 return ui_context_is_attached_to_obj(ctx->parent); |
| |
1030 } |