ui/common/context.c

changeset 1215
00515f6dbbd7
parent 1203
35779840ebfd
child 1216
c9702a6d7306
equal deleted inserted replaced
1214:beba01f68a9f 1215:00515f6dbbd7
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 }

mercurial