Index: /trunk/SophyaPI/PI/Makefile
===================================================================
--- /trunk/SophyaPI/PI/Makefile	(revision 75)
+++ /trunk/SophyaPI/PI/Makefile	(revision 76)
@@ -3,5 +3,5 @@
  
 all: $(LIB)libPI.a
-$(LIB)libPI.a : $(OBJ)lut.o $(OBJ)piapplgen.o $(OBJ)piapplx.o $(OBJ)pibwdggen.o $(OBJ)pibwdgx.o $(OBJ)picmap.o $(OBJ)picmapgen.o $(OBJ)picmapx.o $(OBJ)picons.o $(OBJ)picontainergen.o $(OBJ)picontainerx.o $(OBJ)pidrawer.o $(OBJ)pidrawwin.o $(OBJ)pifilechogen.o $(OBJ)pifilechox.o $(OBJ)pigraphgen.o $(OBJ)pigraphps.o $(OBJ)pigraphuc.o $(OBJ)pigraphx.o $(OBJ)pihisto.o $(OBJ)piimage.o $(OBJ)pilistgen.o $(OBJ)pilistx.o $(OBJ)pimenubargen.o $(OBJ)pimenubarx.o $(OBJ)pimenugen.o $(OBJ)pimenux.o $(OBJ)pimsghandler.o $(OBJ)pintuple.o $(OBJ)pioptmenugen.o $(OBJ)pioptmenux.o $(OBJ)piperiodx.o $(OBJ)pipixmapgen.o $(OBJ)pipixmapx.o $(OBJ)piscdrawwdg.o $(OBJ)pistdwdggen.o $(OBJ)pistdwdgx.o $(OBJ)pistlist.o $(OBJ)piup.o $(OBJ)piwdggen.o $(OBJ)piwdgx.o $(OBJ)piwindowgen.o $(OBJ)piwindowx.o $(OBJ)pixtbase.o $(OBJ)psfile.o
+$(LIB)libPI.a : $(OBJ)lut.o $(OBJ)piapplgen.o $(OBJ)piapplx.o $(OBJ)pibwdggen.o $(OBJ)pibwdgx.o $(OBJ)picmap.o $(OBJ)picmapgen.o $(OBJ)picmapx.o $(OBJ)picons.o $(OBJ)picontainergen.o $(OBJ)picontainerx.o $(OBJ)pidrawer.o $(OBJ)pidrawwin.o $(OBJ)pifilechogen.o $(OBJ)pifilechox.o $(OBJ)pigraphgen.o $(OBJ)pigraphps.o $(OBJ)pigraphuc.o $(OBJ)pigraphx.o $(OBJ)pihisto.o $(OBJ)pihisto2d.o $(OBJ)piimage.o $(OBJ)pilistgen.o $(OBJ)pilistx.o $(OBJ)pimenubargen.o $(OBJ)pimenubarx.o $(OBJ)pimenugen.o $(OBJ)pimenux.o $(OBJ)pimsghandler.o $(OBJ)pintuple.o $(OBJ)pioptmenugen.o $(OBJ)pioptmenux.o $(OBJ)piperiodx.o $(OBJ)pipixmapgen.o $(OBJ)pipixmapx.o $(OBJ)piscdrawwdg.o $(OBJ)pistdwdggen.o $(OBJ)pistdwdgx.o $(OBJ)pistlist.o $(OBJ)piup.o $(OBJ)piwdggen.o $(OBJ)piwdgx.o $(OBJ)piwindowgen.o $(OBJ)piwindowx.o $(OBJ)pixtbase.o $(OBJ)psfile.o
 	$(AR) $(ARFLAGS)  $@ $? 
 ifeq ($(CXX),cxx)
@@ -79,4 +79,23 @@
  pistdwdgx.h pistdwdggen.h piwindowx.h piwindowgen.h picontainerx.h \
  picontainergen.h pidrawer.h pigraphuc.h
+$(OBJ)pihisto2d.o: pihisto2d.cc pihisto2d.h \
+ $(INC)histos2.h \
+ $(INC)peida.h \
+ $(INC)defs.h \
+ $(INC)utils.h \
+ $(INC)machine.h \
+ $(INC)perrors.h \
+ $(INC)exceptions.h \
+ $(INC)peidainit.h \
+ $(INC)fmath.h \
+ $(INC)histos.h \
+ $(INC)cvector.h \
+ $(INC)matrix.h \
+ $(INC)ppersist.h \
+ $(INC)pclassids.h piscdrawwdg.h pisysdep.h \
+ pibwdgx.h pibwdggen.h piwdgx.h piwdggen.h pimsghandler.h picmap.h \
+ picmapx.h picmapgen.h pigraphx.h pigraphgen.h psfile.h pigraphps.h \
+ pistdwdgx.h pistdwdggen.h piwindowx.h piwindowgen.h picontainerx.h \
+ picontainergen.h pidrawer.h pigraphuc.h
 $(OBJ)piimage.o: piimage.cc piimage.h $(INC)cimage.h \
  $(INC)rzimage.h \
Index: /trunk/SophyaPI/PI/piapplgen.cc
===================================================================
--- /trunk/SophyaPI/PI/piapplgen.cc	(revision 75)
+++ /trunk/SophyaPI/PI/piapplgen.cc	(revision 76)
@@ -1,2 +1,55 @@
+//  Classe de base d'objets application pour 
+//  les programmes graphiques interactives
+//
+//                  E.Aubourg , R. Ansari  96 - 98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
+//++
+// Class	PIApplication
+// Lib		PI
+// include	piapplgen.h
+//
+//	Classe de base pour l'objet application. L'objet PIApplication 
+//	doit être créé avant la création des autres objets de PI.
+//	La classe "PIApplication" a implémentation dépendante 
+//	du systeme utilisé (Mac, XWindow, ...). La classe "PIApplicationGen" 
+//	est la classe qui définit l'interface, et ne doit pas être instanciée 
+//	directement (Méthodes virtuelles pures). Les objets instanciés sont 
+//	de la classes "PIApplication" et le fichier entête correspondant est 
+//	"PIAPP_H" défini dans "pisysdep.h".
+//--
+//++
+// Links	Parents
+// PIMsgHandler
+//--
+//++
+// Titre	Constructeur
+//--
+//++
+// PIApplication(int sx=200, int sy=30, int narg=0, char *arg[]=NULL)
+//	Constructeur. "sx,sy" est la taille de la fenêtre principale
+//	(ou PIContainer) associée à l'application. Des arguments
+//	optionnels, par exemple celle de la ligne de commande peuvent 
+//	être transmis à l'objet PIApplication. Dans le cas d'Unix/XWindow
+//	par exemple, les options reconnues par la Xtoolkit peuvent 
+//	être passées à l'objet application.
+//--
+
+//++
+// Titre	Méthodes
+//--
+//++
+// PIContainer*   MainWin()
+//	Renvoie le pointeur de l'objet "PIContainer" associé à l'application.
+// PIMenubar*   Menubar()
+//	Renvoie le pointeur de l'objet "PIMenubar" associé à l'application.
+// void AppendMenu(PIPDMenu *pdm)
+//	Ajoute le "PIPDMenu *pdm" au Menubar de l'application. Le titre 
+//	du menu dans le menubar est le nom de l'objet menu. 
+// void Run() Stop
+//	Démarre, arrête la boucle d'événements.
+//--
+
+
 #include "piapplgen.h"
 
Index: /trunk/SophyaPI/PI/piapplx.h
===================================================================
--- /trunk/SophyaPI/PI/piapplx.h	(revision 75)
+++ /trunk/SophyaPI/PI/piapplx.h	(revision 76)
@@ -8,6 +8,5 @@
 class PIApplicationX : public PIApplicationGen {
 public:
-		  PIApplicationX(int sx=0, int sy=0, 
-                                 int narg=0, char *arg[]=NULL);
+		  PIApplicationX(int sx=200, int sy=30, int narg=0, char *arg[]=NULL);
 
   virtual	  ~PIApplicationX();
Index: /trunk/SophyaPI/PI/picontainergen.cc
===================================================================
--- /trunk/SophyaPI/PI/picontainergen.cc	(revision 75)
+++ /trunk/SophyaPI/PI/picontainergen.cc	(revision 76)
@@ -1,4 +1,56 @@
+//  Classe de base pour les conteneurs de PIWdg pour
+//  programmes graphiques interactives
+//
+//                  E.Aubourg , R. Ansari  96 - 98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include "picontainergen.h"
 
+//++
+// Class	PIContainer
+// Lib		PI
+// include	picontainergen.h
+//
+//	Classe conteneur gérant un ensemble d'objets "PIWdg". Cette classe 
+//	organise la hiérarchie des objets "PIWdg" et donc aussi des "PIMsgHandler",
+//	contrôle la géométrie des objets "PIWdg" contenus, ainsi que leur 
+//	visibilité et activité. La classe "PIContainer" est une des 
+//	classes de PI qui ont une implementation dépendante du systeme utilisé
+//	(Mac, XWindow, ...). La classe "PIContainerGen" 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 "PIContainer" et le fichier entête correspondant est "PICONT_H"
+//	défini dans "pisysdep.h"
+//--
+//++
+// Links	Parents
+// PIWdg
+//--
+//++
+// Titre	Constructeur
+//--
+//++
+// PIContainer(PIContainerGen *par, char *nom, int sx, int sy, int px, int py)
+//	Création d'un objet "PIContainer" dans le conteneur parent "par", de
+//	taille "sx,sy", se trouvant à la position "px,py" avec le nom "nom"
+// long kind()
+//	Renvoie le type de la classe de l'objet ("=PIContainerGen::ClassId") pour cette classe.
+//--
+//++
+// Titre	Méthodes
+//--
+//++
+// void Show()
+//	Rend l'objet visible à l'écran. Tous les objets "PIWdg" contenus et qui sont dans 
+//	l'état actif sont visibles.
+// void Hide()
+//	Rend l'objet et tous les objets contenus invisibles.
+// void  PSPrint(PSFile *psf, int ofx=0, int ofy=0)
+//	Appelle la méthode "PSPrint()" pour tous les objets contenus.
+// void  SetAutoDelChilds(bool ad = false)
+//	Contrôle le comportement de l'objet conteneur vis à vis des objets
+//	contenus lors de la destruction. si "ad=true", les objets contenus 
+//	sont détruits lors de l'appel du destructeur de l'objet conteneur. 
+//--
 
 #define NCHALGRP 4
Index: /trunk/SophyaPI/PI/pihisto2d.cc
===================================================================
--- /trunk/SophyaPI/PI/pihisto2d.cc	(revision 76)
+++ /trunk/SophyaPI/PI/pihisto2d.cc	(revision 76)
@@ -0,0 +1,192 @@
+#include <stdio.h>
+#include "pihisto2d.h"
+
+#include PIMENU_H
+
+PIHisto2D::PIHisto2D(Histo2D* histo, bool ad)
+: PIScDrawer(), mHisto(histo)
+{
+  mAdDO = ad;     // Flag pour suppression automatique de mHisto  
+  UseColors();
+}
+
+PIHisto2D::~PIHisto2D()
+{
+  if (mAdDO)
+    delete mHisto;
+}
+
+void
+PIHisto2D::UseColors(bool fg, CMapId cmap)
+{
+  mFgCol = fg; mCmap = cmap;
+}
+
+void
+PIHisto2D::UpdateSize()
+{
+  if (!mDrawer) return;
+  if (mDrawer->LimitsFixed()) return;
+  // Commencer par trouver nos limites
+  
+  float xmin = mHisto->XMin();
+  float xmax = mHisto->XMax();
+
+  float ymax = mHisto->YMax();
+  float ymin = mHisto->YMin();
+  
+  if (mDrawWdg) 
+    mDrawWdg->SetLimits(xmin, xmax, ymin, ymax);
+  else 
+    mDrawer->SetLimits(xmin, xmax, ymin, ymax);
+
+  mDrawer->SetAxesFlags(kBoxAxes | kExtTicks | kLabels);
+}
+
+
+void
+PIHisto2D::Draw(PIGraphicUC* g, float /*xmin*/, float /*ymin*/, float /*xmax*/, float /*ymax*/)
+{
+  float hmin = mHisto->VMin();
+  float hmax = mHisto->VMax();
+  if(hmin>=hmax) hmax = hmin+1.;
+  float dx = mHisto->WBinX();
+  float dy = mHisto->WBinY();
+  float fracmin=0.1, fracmax=0.8;
+
+  PIColorMap* cmap=NULL;
+  PIColors coul;
+  int ncol = 0;
+  if (mFgCol) { 
+    cmap = new PIColorMap(mCmap);
+    ncol = cmap->NCol();
+    coul = g->GetForeground();
+//    fracmin = 0.;
+//    fracmax = 1.;
+  }
+
+  for (int i=0; i<mHisto->NBinX(); i++) {
+    for (int j=0; j<mHisto->NBinY(); j++) {
+      float left,bottom;
+      mHisto->BinLowEdge(i,j,left,bottom);
+      float frac = fracmax*((*mHisto)(i,j)-hmin)/(hmax-hmin);
+      if(frac<fracmin) continue;
+      float width = frac*dx;
+      float height = frac*dy;
+      left += 0.5*(1.-frac)*dx;
+      bottom += 0.5*(1.-frac)*dy;
+      if (cmap) {
+        int icol = ncol*(frac/fracmax);
+        if(icol>=ncol) icol = ncol-1; else if(icol<0) icol=0;
+        g->SelForeground(*cmap,icol);
+        g->DrawFBox(left,bottom,width,height);
+      }
+      else g->DrawBox(left,bottom,width,height);
+    }
+  }
+  if (cmap) { 
+    g->SelForeground(coul);
+    delete cmap;
+  }
+  DrawStats(g);
+}
+
+void
+PIHisto2D::DrawStats(PIGraphicUC* g)
+{
+  if (!mDrawWdg) return;
+  // Une boite dans le coin superieur droit
+  float cellHeight = (mDrawWdg->YMax() - mDrawWdg->YMin()) * 0.05;
+  float cellWidth  = (mDrawWdg->XMax() - mDrawWdg->XMin()) * 0.23;
+  g->DrawLine(mDrawWdg->XMax() - cellWidth, mDrawWdg->YMax(),
+                       mDrawWdg->XMax() - cellWidth, mDrawWdg->YMax() - cellHeight);
+  g->DrawLine(mDrawWdg->XMax() - cellWidth, mDrawWdg->YMax() - cellHeight,
+                       mDrawWdg->XMax()            , mDrawWdg->YMax() - cellHeight);
+  char label[50];
+  sprintf(label, "N = %.6g", mHisto->NData());
+  g->SelFontSz((mDrawWdg->YMax() - mDrawWdg->YMin())/30);
+  g->DrawString(mDrawWdg->XMax() - cellWidth*0.9, mDrawWdg->YMax() - cellHeight*0.8, label);
+                       
+}
+
+
+/////////////////////////////////////////////////////////////////
+//  Classe PIH2DWdg
+/////////////////////////////////////////////////////////////////
+
+
+//  Le menu qui va servir a choisir l'option d'affichage suite au click 
+// de bouton-3
+static PIPUMenu* optmenh2d=NULL;
+static int nb_optmen = 0;
+
+PIH2DWdg::PIH2DWdg(PIContainerGen *par, char *nom, int sx, int sy, int px, int py)
+        : PIScDrawWdg(par,nom,sx,sy,px,py)
+{
+if (!optmenh2d) {
+  optmenh2d = new PIPUMenu((PIMsgHandler *)this, "TypeH2D");
+  optmenh2d->AppendItem("B&W", 6101);
+  optmenh2d->AppendItem("Gris", 6102);
+  optmenh2d->AppendItem("RJ32", 6103);
+  optmenh2d->AppendItem("BR32", 6104);
+  }
+nb_optmen++;
+mPih = NULL;
+ActivateButton(3); // Pour afficher le menu option de trace
+}
+
+PIH2DWdg::~PIH2DWdg()
+{
+nb_optmen--;
+if (nb_optmen == 0) { delete optmenh2d;  optmenh2d=NULL; }
+if (mPih)  delete mPih;
+}
+
+void PIH2DWdg::SetHisto(Histo2D* histo, bool fg, CMapId cmap)
+{
+if (!histo) return;
+if (mPih)  delete mPih;
+mPih = new PIHisto2D(histo, true);
+mPih->UseColors(fg, cmap);
+AddScDrawer(mPih);
+}
+
+string  PIH2DWdg::GetClickText(float x, float y)
+{
+int i,j;
+Histo2D* h = mPih->Histogram();
+char str[128];
+
+h->FindBin(x,y,i,j);
+if(i<0 || i>=h->NBinX() || j<0 || j>=h->NBinY())
+  sprintf(str,"X=%g Y=%g ???",x,y);
+else sprintf(str,"X=%g Y=%g v=%g",x,y,(*h)(i,j));
+
+return((string)str);
+}
+
+void PIH2DWdg::Process(PIMessage msg, PIMsgHandler* sender, void* data)
+{
+//printf("PIH2DWdg::Process(%d-%d , %lx ...) \n", UserMsg(msg), ModMsg(msg), (long)sender);
+
+if (sender == optmenh2d) { // On n'attend de message que de la part du menu 
+  int opt=6101;
+  bool fgc=false;
+  CMapId col=CMAP_GREYINV32;
+      
+  opt = UserMsg(msg);
+  if (opt == 6102) { fgc = true; col = CMAP_GREYINV32; }
+  else if (opt == 6103) { fgc = true;  col = CMAP_COLRJ32; }
+  else if (opt == 6104) { fgc = true; col = CMAP_COLBR32; }
+  mPih->UseColors(fgc, col);
+  mPih->Refresh();  // On rafraichit le dessin     
+}
+
+}
+
+void PIH2DWdg::But3Press(int x, int y)
+{
+//printf("PIH2DWdg::But3Press(%d %d ) \n", x, y);
+optmenh2d->SetMsgParent((PIMsgHandler*)this);
+optmenh2d->Show(this, x, y);
+}
Index: /trunk/SophyaPI/PI/pihisto2d.h
===================================================================
--- /trunk/SophyaPI/PI/pihisto2d.h	(revision 76)
+++ /trunk/SophyaPI/PI/pihisto2d.h	(revision 76)
@@ -0,0 +1,41 @@
+#ifndef PIHISTO2D_H
+#define PIHISTO2D_H
+
+#include "histos2.h"
+#include "piscdrawwdg.h"
+
+class PIHisto2D : public PIScDrawer {
+public:
+                     PIHisto2D(Histo2D* histo, bool ad=false);
+  virtual            ~PIHisto2D();
+          void       UseColors(bool fg=false, CMapId cmap=CMAP_GREYINV32);
+  virtual void       Draw(PIGraphicUC* g, float xmin, float ymin, float xmax, float ymax);
+  virtual void       UpdateSize();
+  virtual void       DrawStats(PIGraphicUC* g);
+  inline  Histo2D*   Histogram() { return(mHisto); }
+
+protected:
+  Histo2D* mHisto;
+  bool mFgCol;
+  CMapId mCmap;
+};
+
+class PIH2DWdg : public PIScDrawWdg {
+public:
+                     PIH2DWdg(PIContainerGen *par, char *nom, int sx=300, int sy=300, 
+                              int px=0, int py=0);
+                     ~PIH2DWdg();
+
+  virtual void       Process(PIMessage msg, PIMsgHandler* sender, void* data=NULL);
+  void               SetHisto(Histo2D* histo, bool fg=false, CMapId cmap=CMAP_GREYINV32);
+
+
+  virtual string     GetClickText(float x, float y); 
+  virtual void       But3Press(int x, int y);
+
+protected:
+  PIHisto2D*  mPih;
+
+};
+
+#endif
Index: /trunk/SophyaPI/PI/piscdrawwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 75)
+++ /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 76)
@@ -190,4 +190,15 @@
 
 // Gestion affichage coordonnees du point 
+
+
+string   PIScDrawWdg::GetClickText(float x, float y) 
+// Donne le texte a afficher pour position x,y  
+{
+  char buff[128];
+  sprintf(buff, "X= %g  Y= %g",  x, y);
+  return((string)buff);
+}
+
+
 void
 PIScDrawWdg::But1Press(int x, int y)
@@ -232,11 +243,11 @@
   mPPos[0] = dx;  mPPos[1] = dy; 
   if ((mTxw == NULL) && (mTrlb == NULL)) return(false);
-
-  char buff[128];
-  sprintf(buff, "X= %g  Y= %g",  dx, dy);
+  
+  string ctxt =  GetClickText(dx, dy);
+
   if (mTxw)
-    mTxw->SetLabel((string)buff);
+    mTxw->SetLabel(ctxt);
   if (mTrlb)
-    mTrlb->SetLabel((string)buff);
+    mTrlb->SetLabel(ctxt);
   return(true);
 
Index: /trunk/SophyaPI/PI/piscdrawwdg.h
===================================================================
--- /trunk/SophyaPI/PI/piscdrawwdg.h	(revision 75)
+++ /trunk/SophyaPI/PI/piscdrawwdg.h	(revision 76)
@@ -53,5 +53,7 @@
     
 
-  void               SetTextWin(PILabel * tw, bool trw=true, int tx=200, int ty=30);
+  virtual string     GetClickText(float x, float y); // Donne le texte a afficher pour position x,y
+
+  void               SetTextWin(PILabel * tw, bool trw=true, int tx=300, int ty=30);
 
   virtual void       But1Press(int x, int y);
Index: /trunk/SophyaPI/PI/piwdggen.cc
===================================================================
--- /trunk/SophyaPI/PI/piwdggen.cc	(revision 75)
+++ /trunk/SophyaPI/PI/piwdggen.cc	(revision 76)
@@ -1,2 +1,8 @@
+//  Classe de base pour les objets correspondant a une fenetre 
+//  dans les programmes graphiques interactives
+//
+//                  E.Aubourg , R. Ansari  96 - 98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include <stdlib.h>
 #include <stdio.h>
@@ -6,4 +12,146 @@
 
 #include "psfile.h"
+
+//++
+// Class	PIWdg
+// Lib		PI
+// include	piwdggen.h
+//
+//   	Classe de base pour tout objets correspondant à une fenêtre
+//	à l'écran, ayant donc une représentation graphique et 
+//	pouvant jouer un rôle dans la hiérarchie des objets interactif. 
+//	*PIWdg* hérite de *PIMsgHandler*, avec une hiérarchie correspondant
+//	par défaut à celles des PIWdg. La classe "PIWdg" est une des 
+//	classes de PI qui ont une implementation dépendante du systeme utilisé
+//	(Mac, XWindow, ...). La classe "PIWdgGen" est la classe qui
+//	définit l'interface, et ne doit pas être instanciée directement
+//	(Méthodes virtuelles pures). Les objets instanciés sont de la 
+//	classes "PIWdg" et le fichier entête correspondant est "PIWDG_H"
+//	défini dans "pisysdep.h"
+//--
+//++
+// Links	Parents
+// PIMsgHandler
+//--
+
+//++
+// Titre	Constructeur
+//--
+//++
+// PIWdg(PIContainerGen *par, char *nom, int sx=10, int sy=10, int px=0, int py=0)
+//	Création d'un objet contenu dans l'objet *PIContainer* "par", de
+//	taille "sx,sy", se trouvant à la position "px,py" avec le nom "nom"
+// long kind()
+//	Renvoie le type de la classe de l'objet ("=PIWdgGen::ClassId") pour cette classe
+//	de base. Doit être redéfinie par les classes dérivées.
+//--  
+
+
+//++
+// Titre	Taille, position
+//--
+//++
+// void  PSPrint(PSFile *psf, int ofx=0, int ofy=0)
+//	Méthode virtuelle qui doit être redéfinie pour chacune des classes filles.
+//	produit une représentation graphique de l'objet en Postscript.
+// SetSize(int sx, int sy)
+//	Modifie la taille de l'objet.
+// SetPos(int px, int py)
+//	Modifie la position de l'objet.
+// int  XSize()  YSize()
+//	Renvoient la taille (X,Y) de l'objet.
+// int  XPos()  YPos()
+//	Renvoient la position (X,Y) de l'objet.
+// void  GetScreenPos(int & spx, int & spy)
+//	Renvoie la position de l'objet sur l'écran.
+// void  SetBinding(PIBindingKind left, PIBindingKind top, PIBindingKind right, PIBindingKind bottom)
+//	Permet de contrôler le comportement de l'objet en cas de changement de taille 
+//	du conteneur parent. La position de chaque bord peut être sans contrainte ("PIBK_free")
+//	attachée à une distance fixe par rapport au bord opposé du conteneur ("PIBK_fixed"), 
+//	ou à une position proportionnelle à la taille du conteneur parent. ("PIBK_elastic") 
+//--
+
+//++
+// Titre	Etat de l'objet
+//	L'objet peut se trouver dans l'état actif ou inactif. Cet état est contrôlé par les 
+//	méthodes "Manage(), UnManage()". L'objet ne se trouve effectivement dans l'état 
+//	actif que si son conteneur parent est lui même actif.
+//--
+//++
+// void Manage()  UnManage()
+//	Change l'état de l'objet (actif, inactif)
+// bool IfManaged()  IfVisible()
+//	indique si l'objet est actif , visible	
+//--
+
+//++
+// Titre	Méthodes
+//--
+
+//++
+//
+// void SetMsg(PIMessage msg = 0)
+//	Modifie la valeur du message associé à l'objet.
+// PIMessage  Msg()
+//	Renvoie le message associé à l'objet.
+// string  Nom()
+//	Renvoie le nom associé à l'objet.
+// PIWdg*  Parent()
+//	Renvoie le conteneur parent de l'objet.
+// void  SetUserData( void * p, int fg = 0)
+//	Associe un pointeur de données à la disposition de l'utilisateur 
+//	("void* p") à l'objet, ainsi qu'une valeur ("int fg")
+// void* UserData()
+//	Renvoie le pointeur de données user de l'objet. (NULL par défaut)
+// int  UserFlag()
+//	Renvoie la valeur "int" user de l'objet.
+//--
+
+//++
+// Titre	Gestion du copier/coller
+//	L'ensemble des méthodes de gestion de copier/coller sont décrites ici. Les méthodes
+//	"SelectionLost()", "ProvideSelection()", et "PasteSelection()" doivent être 
+//	redéfinies par les classes héritières de *PIWdg* implémentant la fonctionalité
+//	copier/coller. Le mécanisme copier/coller entre objets d'une même application,
+//	ainsi qu'entre différentes applications. Dans les opérations de copier/coller,
+//	il existe un PIWdg ou une application source des données et un PIWdg ou 
+//	une application destinatire.
+//--
+//++
+// bool  ClaimSelection(int typ=PICP_string)
+//	Cette méthode doit être appelée par l'objet "PIWdg" source quand celui-ci veut 
+//	s'approprier la zone d'échange de données (Selection) pour le copier/coller. "typ" indique 
+//	le type de données que peut fournir l'objet. Le type "PICP_string" (suite de caractères)
+//	est le seul type supporté actuellement. La valeur de retour est "true" si 
+//	la zone d'échange est attribué a l'objet. Cette méthode ne doit en principe pas 
+//	être redéfinie par les classes héritières de *PIWdg*.
+// void  SelectionLost()
+//	Cette méthode est appelée quand l'objet "PIWdg" source qui possede la zone d'échange 
+//	(Selection) perd celle-ci, suite par exemple à la demande d'un autre objet. Cette méthode 
+//	doit être redéfinies par les classes qui implémentent la fonctionalité et ne doit 
+//	doit pas être appelée directement.
+// int  RequestSelection(int typ=PICP_string)
+//	Cette méthode doit être appelée par l'objet "PIWdg" destinatire quand celui-ci souhaite 
+//	obtenir les données de la zone d'échange (Selection). "typ" indique les types de données 
+//	acceptables par l'objet. La valeur de retour indique le type qui sera fourni
+//	(à l'appel de "PasteSelection()"). Cette méthode ne doit en principe pas 
+//	être redéfinie par les classes héritières de *PIWdg*.
+// void* ProvideSelection(int& typ, int& len)  
+//	Cette méthode est appelée quand l'objet "PIWdg" source, qui possede la zone d'échange 
+//	(Selection) doit  fournir les données correspondantes à la sélection. Renvoie le pointeur 
+//	de la zone mémoire correspondante, sa longueur ("len") et le type ("typ") des données.
+//	cette zone mémoire appartient à l'objet, et ne doit être modifié tant que 
+//	la méthode "SelectionTransferEnd()" n'a été appelé.
+// void  SelectionTransferEnd()
+//	Cette méthode est appelé une fois que l'objet ou l'application destinataire 
+//	des données de sélection a fini de traiter l'opération de copie. l'objet PIWdg 
+//	source peut alors détruire ou modifier les données correspondantes à l'échange.
+// void  PasteSelection(int typ, void *pdata, int l)
+//	Cette méthode est appelée après l'appel à "RequestSelection()" pour l'objet 
+//	destinataire. "typ" indique le type des données dans "pdata", et "l" la longeur. 
+//	La zone mémoire "pdata" n'appartient pas à l'objet destinataire et ne doit pas 
+//	être modifié par celui-ci. Une copie doit être effectué si cesCette méthode  données devaient
+//	être utilisées après la sortie de "PasteSelection()".
+//--
 
 /* --Methode-- */
Index: /trunk/SophyaPI/PI/piwdggen.h
===================================================================
--- /trunk/SophyaPI/PI/piwdggen.h	(revision 75)
+++ /trunk/SophyaPI/PI/piwdggen.h	(revision 76)
@@ -72,9 +72,10 @@
 
 //  Gestion de copier-coller
-  virtual bool           ClaimSelection(int typ=PICP_string)            = 0;
-  virtual void           SelectionLost()                                = 0;
-  virtual int            RequestSelection(int typ=PICP_string)          = 0;
-  virtual void*          ProvideSelection(int& typ, int& len)           = 0;
-  virtual void           PasteSelection(int& typ, void *, int l)        = 0;
+  virtual bool           ClaimSelection(unsigned int typ=PICP_string)                     = 0;
+  virtual void           SelectionLost()                                                  = 0;
+  virtual int            RequestSelection(unsigned int typ=PICP_string)                   = 0;
+  virtual void*          ProvideSelection(unsigned int& typ, unsigned int& len)           = 0;
+  virtual void           SelectionTransferEnd()                                           = 0;
+  virtual void           PasteSelection(unsigned int typ, void *pdata, unsigned int l)    = 0;
 
 protected:
Index: /trunk/SophyaPI/PI/piwdgx.cc
===================================================================
--- /trunk/SophyaPI/PI/piwdgx.cc	(revision 75)
+++ /trunk/SophyaPI/PI/piwdgx.cc	(revision 76)
@@ -477,4 +477,9 @@
 }
 
+/* .................................................................*/
+/* ................... Gestion de Copier/Coller ....................*/
+/* .................................................................*/
+
+// Les Call-Backs Xt
 
 static Boolean forXt_ConvertSelection(Widget w, Atom* sel, Atom *targ, Atom* typ,
@@ -486,7 +491,8 @@
                                  XtPointer value, unsigned long* len, int* format );
 
-static PIWdgX* curselwdg = NULL;
-static char* selval = NULL;
-
+static PIWdgX* curselwdg = NULL;    // Le PIWdg qui possede la selection
+static unsigned int curseltype = PICP_string; // Type de selcetion qu'il peut fournir
+static unsigned int reqseltype = PICP_string; // Type de selection demande
+static unsigned int provseltype = PICP_string; // Type de selection fourni
 
 /* Nouvelle-Fonction */
@@ -496,10 +502,11 @@
 if (*targ != XA_STRING)  return(FALSE);
 if (!curselwdg)  return(FALSE);
-int l;
-int styp = 1;
+int l = 0;
+int styp = reqseltype;
 *value = curselwdg->ProvideSelection(styp, l);
 *len=l;
 *typ = XA_STRING;
 *format = 8;
+provseltype = (styp != 0) ? styp : PICP_string;
 return(TRUE);
 }
@@ -509,5 +516,5 @@
 {
 if (curselwdg)  curselwdg->SelectionLost();
-curselwdg = NULL;
+curselwdg = NULL; curseltype = PICP_string; 
 }
 
@@ -515,6 +522,5 @@
 void forXt_DoneSelection(Widget w, Atom* sel, Atom *targ)
 {
-if (selval)   delete selval;
-selval = NULL;
+if (curselwdg)  curselwdg->SelectionTransferEnd();
 }
 
@@ -523,9 +529,8 @@
                                  XtPointer value, unsigned long* len, int* format )
 {
-printf("forXt_SelectionValue()/Debug: %lx %lx - %lx - %d \n", (unsigned long)w,
-       (unsigned long)usd, (unsigned long)value, (*len));
-int styp = 1;
+printf("forXt_SelectionValue()/Debug: %lx %lx - %lx - %d (%d %d %d)\n", (unsigned long)w,
+       (unsigned long)usd, (unsigned long)value, (*len), curseltype, reqseltype, provseltype);
 if ( (value != NULL) && (*len > 0) ) 
-  ((PIWdgX*)usd)->PasteSelection(styp, (void*)value, (*len)) ;
+  ((PIWdgX*)usd)->PasteSelection(provseltype, (void*)value, (*len)) ;
 }
 
@@ -534,5 +539,5 @@
 // Gestion de Copier/Coller
 /* --Methode-- */
-bool PIWdgX::ClaimSelection(int typ)
+bool PIWdgX::ClaimSelection(unsigned int typ)
 // Pour prendre possession du buffer copier/coller
 {
@@ -541,4 +546,5 @@
   printf("PIWdgX::ClaimSelection(%d) - OK  (Wdg= %lx)\n", typ, (unsigned long)this);
   curselwdg = this;
+  curseltype = (typ != 0) ? typ : PICP_string;
   return (true);
 }
@@ -546,4 +552,5 @@
   printf("PIWdgX::ClaimSelection() - Probleme (Wdg= %lx)\n", (unsigned long)this);
   curselwdg = NULL;
+  curseltype = PICP_string;
   return (false);
 }
@@ -556,27 +563,28 @@
   printf("PIWdgX::SelectionLost()  Ne fait rien !(Wdg= %lx - %lx) \n", 
         (unsigned long)this, (unsigned long)curselwdg);
-  if (curselwdg == this)  curselwdg = NULL; 
-}
-
-/* --Methode-- */
-int PIWdgX::RequestSelection(int typ)
+}
+
+/* --Methode-- */
+int PIWdgX::RequestSelection(unsigned int typ)
 {
 // Pour demander le contenu du buffer de copier/coller
 printf("PIWdgX::RequestSelection(%d) (Wdg= %lx - %lx) \n", typ,  
         (unsigned long)this, (unsigned long)curselwdg);
+reqseltype = (typ != 0) ? typ : PICP_string;
 XtGetSelectionValue(XtWdg(), XA_PRIMARY, XA_STRING, forXt_SelectionValue, 
                     (XtPointer)this, PIXGetLastEventTime());
-return(1);
-}
-
-
-/* --Methode-- */
-void* PIWdgX::ProvideSelection(int& typ, int& len)
+return(reqseltype);
+}
+
+static char* rs = NULL;
+
+/* --Methode-- */
+void* PIWdgX::ProvideSelection(unsigned int& typ, unsigned int& len)
 // Le widget doit fournier une l zone memoire contenant la selection
 // en un type donne
 // Renvoie le pointeur de cette zone, sa taille et son typ
 {
-char *rs = new char[80];
-sprintf(rs, "Test-of-PIWdgX::ProvideSelection(%d)", typ);
+rs = new char[80];
+sprintf(rs, "Test-of-PIWdgX::ProvideSelection(%d)- %lx", typ,(long)rs);
 len = strlen(rs);
 return(rs);
@@ -584,5 +592,13 @@
 
 /* --Methode-- */
-void PIWdgX::PasteSelection(int& typ, void *buff, int l)
+void PIWdgX::SelectionTransferEnd()
+{
+printf("PIWdgX::SelectionTransferEnd() %lx \n", (long)rs);
+delete[] rs;
+}
+
+
+/* --Methode-- */
+void PIWdgX::PasteSelection(unsigned int typ, void *buff, unsigned int l)
 {
 // Methode appele apres que le widget ait fait RequestSelection
@@ -592,5 +608,5 @@
 strncpy(mbuff, (char *)buff, l);
 mbuff[l] = '\0';
-printf("PIWdgX::PasteSelection() L=%d [%s] \n", l, mbuff);
+printf("PIWdgX::PasteSelection(%d, %lx, %d) [%s] \n", typ, (long)buff, l, mbuff);
 delete[] mbuff;
 return;
Index: /trunk/SophyaPI/PI/piwdgx.h
===================================================================
--- /trunk/SophyaPI/PI/piwdgx.h	(revision 75)
+++ /trunk/SophyaPI/PI/piwdgx.h	(revision 76)
@@ -56,9 +56,10 @@
 
 //  Gestion de copier-coller
-  virtual bool           ClaimSelection(int typ=PICP_string);
+  virtual bool           ClaimSelection(unsigned int typ=PICP_string);
   virtual void           SelectionLost();
-  virtual int            RequestSelection(int typ=PICP_string);
-  virtual void*          ProvideSelection(int& typ, int& len);
-  virtual void           PasteSelection(int& typ, void *, int l);
+  virtual int            RequestSelection(unsigned int typ=PICP_string);
+  virtual void*          ProvideSelection(unsigned int& typ, unsigned int& len);
+  virtual void           SelectionTransferEnd();
+  virtual void           PasteSelection(unsigned int typ, void *, unsigned int l);
 
   inline SysDWdg XtWdg() const {return(sdw); }; 
Index: /trunk/SophyaPI/PI/piwindowgen.cc
===================================================================
--- /trunk/SophyaPI/PI/piwindowgen.cc	(revision 75)
+++ /trunk/SophyaPI/PI/piwindowgen.cc	(revision 76)
@@ -1,4 +1,62 @@
+//  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 "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, 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-- */
