//  Classe de base pour les fenêtre de premier niveau
//  dans les programmes graphiques interactives
//
//                  E.Aubourg , R. Ansari  96 - 98
// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA

#include "sopnamsp.h"
#include "piwindowgen.h"
#include "psfile.h"

//++
// Class	PIWindow
// Lib		PI
// include	piwindowgen.h
//
//	Classe de conteneur (dérivant de *PIContainer") spécialisée pour 
//	la création des fenêtres de premier niveau, gérée par l'application
//	"WindowManager". La classe "PIWindow" a  implementation dépendante 
//	du systeme utilisé (Mac, XWindow, ...). La classe "PIWindowGen" est 
//	la classe qui définit l'interface, et ne pas doit être instanciée 
//	directement (Méthodes virtuelles pures). Les objets instanciés sont 
//	de la classes "PIWindow" et le fichier entête correspondant est 
//	"PIWIN_H" défini dans "pisysdep.h"
//--
//++
// Links	Parents
// PIContainer
//--
//++
// Titre	Constructeur
//--
//++
// PIWindowGen(PIMsgHandler* par, const char *nom, PIWindowKind k=PIWK_normal, int sx=10, int sy=10, int px=0, int py=0)
//	Création d'une fenêtre de haut niveau. La variable "PIWindowKind k"  contrôle
//	le comportement de l'objet vis à vis de l'application WindowManager. Le comportement
//	exacte, ainsi que l'apparence graphique dépend de la plateforme et du WindowManager
//	utilisés. "par" est le l'objet "PIMsgHandler" dont dépend la fenêtre, en général un objet
//	de la classe "PIApplication". "nom" désigne le nom, "sx,sy" la taille et 
//	"px,py" la position de l'objet.
//	- "PIWK_normal" : fenêtre ordinaire
//	- "PIWK_floating" : fenêtre qui reste en avant plan 
//	- "PIWK_dialog" : fenêtre de dialogue 
//	- "PIWK_transient" : fenêtre apparaissant an avant plan, sans barre de contrôle 
// long kind()
//	Renvoie le type de la classe de l'objet ("=PIWindowGen::ClassId") pour cette classe.
//--

//++
// Titre	Méthodes
//--
//++
// void  AutoHideOnClose(bool ahc=true)
//	Contrôle le comportement par défaut de l'objet quand la fenêtre est fermée
//	à travers le WindowManager. si "ahc=true", "Hide()" est appelé. 
//	Le message de l'objet avec le qualificatif "PIMsg_Closë est transmis
//	au "PIMsgHandler" parent.
// void  PSPrint(PSFile *psf, int ofx=0, int ofy=0)
//	Définit une nouvelle page et appelle la méthode "PSPrint()" pour tous les
//	objets "PIWdg" contenus dans la fenêtre.
//--


/* --Methode-- */
PIWindowGen::PIWindowGen(PIMsgHandler *par, const char *nom, PIWindowKind k, 
                         int sx, int sy, int px, int py)
: PIContainer(NULL, nom, sx, sy, px, py), mWtyp(k)
{
  SetMsgParent(par);
  AutoHideOnClose();
}


/* --Methode-- */
PIWindowGen::~PIWindowGen()
{}

/* --Methode-- */
void PIWindowGen::PSPrint(PSFile *psf, int ofx, int ofy, double scale_x, double scale_y)
{
if (!psf) return;
//int ori;
//ori = (XSize() > YSize()) ? LANDSCAPE : PORTRAIT ;
psf->NewPage((float)XSize()*scale_x, (float)YSize()*scale_y,PI_Auto);
PIContainerGen::PSPrint(psf, ofx, ofy, scale_x, scale_y);
}


/* --Methode-- */
void PIWindowGen::Process(PIMessage msg, PIMsgHandler* sender, void* data)
/*  On intercepte le message Active, et Close avant de les renvoyer */
/*  avec un message ActiveWdg de la part de la fenetre              */
{
if (ModMsg(msg) == PIMsg_ResizeRequest) { 
  // On change la taille de la fenetre - data est un pointeur sur entier
  // data[0] represente l'increment (positif ou negatif) en X, data[1] en Y
  int* nsz = (int*) data;
  SetSize(XSize()+nsz[0], YSize()+nsz[1]);
  return;
  }
else if ((msg == BuildMsg(Msg(), PIMsg_Close)) && (sender == this) && mAHC) {
  Hide();   // Action par defaut en cas de MsgClose.
  ReSend(msg, sender, data);
  }
else if (ModMsg(msg) == PIMsg_Active) {
  ReSend(msg, sender, data);
  PIWdg * sndw = dynamic_cast<PIWdg *>(sender);
  if (sndw && (sndw->kind() != PIWindowGen::ClassId))  Send(Msg(),PIMsg_Active);
  }
else ReSend(msg, sender, data);
return;  
}
