__add_function_parser: la ricezione dei messaggi
Abbiamo descritto le modalità di trasmissione dei messaggi verso un oggetto (globale o locale) di interfaccia OPERATION_CALL; descriveremo ora la costruzione dei metodi nella classe ricevente per interpretare i messaggi.
Un breve inciso: fino ad ora abbiamo genericamente scritto di messaggi trasferiti da un trasmettitore ad un ricevente; a questo punto potremmo dire che si tratta di una chiamata ad una funzione (func_name) relativa ad un oggetto base (op_id) con una eventuale lista di argomenti (args);questa osservazione servirà per comprendere la sintassi di analisi (parser) del comando nella classe ricevente;
__add_function_parser: dichiarazione dello slot di parsing delle funzioni func_name.
Le classi OPERATION_CALL, come è stato scritto in precedenza, per ricevere i messaggi usano una particolare dichiarazione, la __declare_slots, che costituisce una lista di __slot ciascuno correlato ad un particolare messaggio; per attivare la gestione delle funzioni (func_name) è sufficiente inserire nella dichiarazione la macro__add_function_parser:
__declare_slots { OP_DISPLAY, DO_DISPLAY_PANEL }, { OP_CLOSE, DO_CLOSE_PANEL }, { OP_SWITCH, DO_SWITCH_PANEL }, __add_function_parser __end__declare_slots
Nell’esempio appena riportato, estratto dal codice della classe DOCK_edit_layout in Colibri, la macro __add_function_parser attiva automaticamente il riconoscimento dello slot __slot_function_parser, il cui scopo è analizzare i messaggio ricevuti; il codice mostra l’uso di macro per il parsing del contenuto e forma dei messaggi:
// parser delle funzioni chiamate // __slot_function_parser __is_function(_$detach) { __operation_case(_$document) { __pop_param(edit, LAYOUT_printing_page); if (!edit) { _$str->layout = 0; return true; } else if (edit == _$str->layout) { _$str->layout = 0; return true; } } } __is_function(_$display) { __operation_case(_$document) { __pop_param(edit, LAYOUT_printing_page); if (edit) { if (edit != _$str->layout) { _$str->layout = edit; __trace(L"edit nuovo layout ") } return true; } else // rimosso layout { _$str->layout = 0; return true; } return false; } __operation_case(_$all) { _redisplay_document(_$str); } } else __is_function(_$remove) { if (!_$str->layout) return false; __operation_case(_$document) { __pop_param(doc, DOCUMENT) _$str->layout->RemoveDocumentObjects(doc); __panel_refresh(_$dock_edit_layout) } } else __is_function(_$resize) { if (!_$str->layout) return false; __operation_case(_$document) { __pop_param(doc, DOCUMENT) __pop_param(rect, RectF) RESIZE_SELECTED_DOCUMENT(_$str, doc, rect); //__panel_refresh(_$dock_edit_layout) } } else __is_function(_$edit) { __operation_case(_$selected) { __pop_param(ly, LY_OBJECT) if (!ly) return false; EDIT_SELECTED_OBJECT(_$str, ly); } } else __is_function(_$copy) { __operation_case(_$selected) { if (_$str->layout) _$str->layout->CopySelectedToClipBoard(); } }