//  Classe de gestionnaire de message pour programme graphique interactive
//
//                  E.Aubourg , R. Ansari  01-06/96
// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA

#include "sopnamsp.h"
#include "pimsghandler.h"

//++
// Class	PIMsgHandler
// Lib		PI
// include	pimsghandler.h
//
//   	Classe de gestionnaire de message de Peida Interactive (PI)
//	Les message ("PIMessage") sont des entiers non signés
//	("unsigned long"). 
//	Chaque PIMsgHandler se trouve dans une organisation 
//	hiérarchique où il dépend d'un
//	PIMsgHandler père à qui il reporte les messages, et peut
//	avoir lui-même un ou plusieurs PIMsgHandler qui sont sous sa 
//	dépendance. Un message ("PIMessage") est constitué de deux 
//	parties, une partie à la disposition de l'utilisateur ("UserMsg()")
//	et une partie sous contrôle du code PI ("ModMsg()"), 
//	qui peut spécifie si nécéssaire la raison de déclenchement 
//	d'envoi du message. 
//--

//++
// Titre	Constructeur
//--
//++
// PIMsgHandler(PIMsgHandler* par=NULL)
//	Création d'un PIMsgHandler dépendant hiérarchiquement du parent "par"
//--

PIMsgHandler::PIMsgHandler(PIMsgHandler* par)
: msgParent(par)
{}

PIMsgHandler::~PIMsgHandler()
{}


//++
// Titre	Traitement des messages
//--

//++
// PIMessage  UserMsg(PIMessage msg)
//	Décode et renvoie la partie utilisateur d'un PIMessage
// PIMessage  ModMsg(PIMessage msg)
//	Décode et renvoie la partie *modifier* d'un PIMessage
// PIMessage  BuildMsg(PIMessage um, PIMsgMod mm) 
//	Code les deux parties (user "um", modifier "mm") d'un message
//	dans un PIMessage.
// void  SetMsgParent(PIMsgHandler* par)
//	Modifie l'organisation hiérarchique, en assignant un nouveau père.
// void	 Process(PIMessage msg, PIMsgHandler* sender, void* data=NULL)
//	Cette méthode virtuelle est appelée quand un message "msg"
//	est reçue par l'objet gestionnaire. "sender" est l'expéditeur
//	du message, et "data" est un argument optionnel supplémentaire.
//	La signification et contenu de "data" dépend de l'expéditeur
//	et du contexte. Par défaut, la méthode "Process(...)" renvoie
//	le message au PIMsgHandler père, sans altérer l'identité
//	de l'expéditeur. (méthode "ReSend(...)"). C'est une méthode 
//	non public (protected) destinée être redéfinie par les classes
//	héritières.
// void  Send(PIMessage msg, PIMsgMod mm=0, void* data=NULL)
//	Envoie le message "msg" avec le modifier "mm", et l'argument 
//	optionnel "data" au parent, déclenchant ainsi l'execution
//	de la méthode "Process(...)" du père.
// void  SendSelf(PIMessage msg, PIMsgMod mm=0, void* data=NULL)
//	Envoie le message "msg" avec le modifier "mm", et l'argument 
//	optionnel "data" à l'objet lui-même, déclenchant ainsi l'execution
//	de la méthode "Process(...)" de l'objet.
//--

void
PIMsgHandler::Process(PIMessage msg, PIMsgHandler* sender, void* data)
{
	ReSend(msg, sender, data);
}

void
PIMsgHandler::Send(PIMessage msg, PIMsgMod mm,  void* data)
{
//	Process(msg, this, data);  $CHECK$  Reza 12/06/96
// Send par defaut appelle le process du parent $CHECK$
if (msgParent)
  msgParent->Process(BuildMsg(msg, mm), this, data);

}

void
PIMsgHandler::ReSend(PIMessage msg, PIMsgHandler* sender, void* data)
{
  if (msgParent)
    msgParent->Process(msg, sender, data);
}



