__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();
}
}
