ui/common/context.c

changeset 1200
abb4d3851061
parent 1198
5bb4366b0c32
equal deleted inserted replaced
1199:13b18989113c 1200:abb4d3851061
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 }

mercurial