__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();
		}
}
Pages: 1 2 3 4 5 6 7
Skip to toolbar