Index: /trunk/SophyaPI/PI/pibwdggen.cc
===================================================================
--- /trunk/SophyaPI/PI/pibwdggen.cc	(revision 2502)
+++ /trunk/SophyaPI/PI/pibwdggen.cc	(revision 2503)
@@ -502,4 +502,7 @@
 // PIDrawer*  GetActiveDrawer()
 //	Retourne le pointeur sur le traceur actif (NULL si pas de traceur actif).
+// int   FindNearestDrawerId(int x, int y)
+//	Retourne le numéro du traceur le plus proche au point "(x,y)" de l'objet PIBaseWdg. 
+//	-1 si pas de traceur.
 //--
 
@@ -540,4 +543,58 @@
   if (mActDrwId < 0) return(NULL); 
   else return(GetDrawerId(mActDrwId));
+}
+
+/* --Methode-- */
+int PIBaseWdgGen::FindNearestDrawerId(int xp, int yp)
+{
+  if (mDrwList.size() < 1)  return -1;
+  double xmin,ymin, xmax, ymax;
+  int drx0, dry0, drdx, drdy;
+  int ddrx0, ddry0, ddrdx, ddrdy;
+
+  if (mDrElastic) { 
+    ddrx0 = (int)((double) mDrX1 * (double)XSize());
+    ddry0 = (int)((double) mDrY1 * (double)YSize());
+    ddrdx = (int)((double) mDrX2 * (double)XSize()) - ddrx0 ;
+    ddrdy = (int)((double) mDrY2 * (double)YSize()) - ddry0 ;
+  }
+  else {
+    ddrx0 = (int)mDrX1;   ddry0 = (int)mDrY1;  
+    ddrdx = (int)mDrX2-ddrx0;   ddrdy = (int)mDrY2-ddry0;  
+  }
+  
+  int nid = -1;
+  double neardist = 9.e39;
+  bool fgido = false;
+  
+  vector<BWDrwId>::iterator it;
+  for(it = mDrwList.begin(); it != mDrwList.end(); it++) {
+    if ( (*it).autoszp )   // Taille/position  par defaut impose par PIBaseWdg 
+      { drx0 = ddrx0;  dry0 = ddry0;   drdx = ddrdx;  drdy = ddrdy; } 
+    else {
+      if ( (*it).elastic  ) {   // Taille/position defin en fraction de la taille du PIBaseWdg
+	drx0 = (int)((double)(*it).x1 * (double)XSize());
+	dry0 = (int)((double)(*it).y1 * (double)YSize());
+	drdx = (int)((double)(*it).x2 * (double)XSize()) - drx0 ;
+	drdy = (int)((double)(*it).y2 * (double)YSize()) - dry0 ;
+      }
+      else {
+	drx0 = (int)(*it).x1 ;  dry0 = (int)(*it).y1 ; 
+	drdx = (int)(*it).x2-drx0 ;  drdy = (int)(*it).y2-dry0 ; 
+      }
+    }
+    // L'ordre des operations ici est importante 
+    if ( (*it).autolim ) {
+      (*it).drw->SetLimits(mDrXmin, mDrXmax, mDrYmin, mDrYmax, mDXdir, mDYdir);     
+      (*it).drw->SetLogScale(mDXlog, mDYlog);
+    }
+    double xu, yu;
+    (*it).drw->WdgCoord2DrwCoord(xp, yp, xu, yu, drx0, dry0, drdx, drdy);
+    double curd = (*it).drw->GetDistanceToPoint(xu, yu);
+    if (!fgido || (curd < neardist)) {
+      neardist = curd;  nid = (*it).id;  fgido = true;
+    }
+  }
+return nid;  
 }
 
Index: /trunk/SophyaPI/PI/pibwdggen.h
===================================================================
--- /trunk/SophyaPI/PI/pibwdggen.h	(revision 2502)
+++ /trunk/SophyaPI/PI/pibwdggen.h	(revision 2503)
@@ -104,5 +104,9 @@
   virtual int        GetActiveDrawerId();   
   virtual int        GetActiveDrawerNum();   
+
   virtual PIDrawer*  GetActiveDrawer();   
+
+// Recherche du plus proche Drawer
+  virtual int        FindNearestDrawerId(int x, int y);
 
 //  Trace des Drawers ...          
Index: /trunk/SophyaPI/PI/pidrawer.cc
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.cc	(revision 2502)
+++ /trunk/SophyaPI/PI/pidrawer.cc	(revision 2503)
@@ -374,4 +374,10 @@
 //	L'implémentation par défaut effectue le décodage des attributs graphiques en 
 //	utilisant la méthode *PIGraphicAtt::DecodeAttStrings()*
+// int  OptionToString(vector<string> & opt) const
+//	Méthode virtuelle qui peut être redéfinie dans les classes filles,
+//	pour fournir des chaines de caracteres décodable par *DecodeOptionString()* .
+//	Renvoie le nombre d'éléments ajoutés.
+//	L'implémentation par défaut effectue le décodage des attributs graphiques en 
+//	utilisant la méthode *PIGraphicAtt::AttToStrings()*
 // void	 GetOptionsHelpInfo(string& info)
 //	Ajoute au bout de la chaine "info" l'aide concernant le décodage des options du traceur.
@@ -385,4 +391,10 @@
   UpdateGraphicAtt(gratt);
   return(ndec);
+}
+
+int
+PIDrawer::OptionToString(vector<string> & opt) const
+{
+  return mGrAtt.AttToStrings(opt);
 }
 
@@ -438,4 +450,5 @@
   xW0 = x0;   yW0 = y0;
   xWd = dx;   yWd = dy;
+  if (!limitsFixed) UpdateLimits();
   if (mGrUC)  delete mGrUC;
   mGrUC = new PIGraphicUC(g, x0, y0, dx, dy);
@@ -452,4 +465,16 @@
 
 void
+PIDrawer::WdgCoord2DrwCoord(int x, int y, double& xu, double& yu, 
+			    int x0, int y0, int dx, int dy)
+{
+  if (!limitsFixed) UpdateLimits();
+  PIGraphicUC guc(NULL, x0, y0, dx, dy);
+  guc.SetUCS(xMin, xMax, yMin, yMax, aXFlg, aYFlg);
+  if (aXlog || aYlog) guc.SetLogScale(aXlog, aYlog);
+  guc.GrC2UC(x,y,xu,yu);
+  return;
+}
+
+void
 PIDrawer::SetAxesFlags(unsigned int flags)
 {
@@ -496,4 +521,8 @@
 //	rectangulaire "(xmin,ymin) -- (xmax,ymax)". 
 //	L'implémentation par défaut ne fait rien.
+// double  GetDistanceToPoint(double x, double y)
+//	Fournit une distance au point "x,y". Valeur entre 0 et 1 au bord xmin/max,ymin/max.  
+//	L'implémentation par défaut retourne la distance normalisée au point 
+//	((xmin+xmax)/2,(ymin+ymax)/2)
 //--
 
@@ -508,2 +537,12 @@
 {
 }
+
+double
+PIDrawer::GetDistanceToPoint(double x, double y)
+{
+  double xc = 0.5*(XMin()+XMax());
+  double yc = 0.5*(YMin()+YMax());
+  double delx = (x-xc)/(0.5*(XMax()-XMin()));
+  double dely = (y-yc)/(0.5*(YMax()-YMin()));  
+  return sqrt((delx*delx+dely*dely)/2.);
+}
Index: /trunk/SophyaPI/PI/pidrawer.h
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.h	(revision 2502)
+++ /trunk/SophyaPI/PI/pidrawer.h	(revision 2503)
@@ -42,4 +42,8 @@
   virtual void       GetClickInfo(string& info,double x,double y
                                  ,double x0=0.,double y0=0.,bool fgdiff=false); 
+// Renvoie une distance au point x,y 
+// 0: au(x) point(s) le(s) plus proche(s) ... 1  au bord xmin/xmax , ymin/ymax
+// La methode par defaut calcule la distance normalisee au point ((xmin+xmax)/2,(ymin+ymax)/2)
+  virtual double     GetDistanceToPoint(double x, double y);
 
   virtual void       Refresh();      // Recalcule les limites et reaffiche
@@ -83,4 +87,7 @@
 //   Methode permettant de decoder des options a partir de chaines
   virtual int        DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
+//   Methode retournant un vecteur de string a partir des options 
+  virtual int        OptionToString(vector<string> & opt) const;
+
 //   Texte d'aide des options disponibles
   virtual void	     GetOptionsHelpInfo(string& info);
@@ -94,4 +101,7 @@
 //  Pb avec acces depuis PIBaseWdgGen (Reza 11/07/97) 
   virtual  PIGraphicUC*  SetDrwWdg(PIBaseWdgGen* drw, int x0, int y0, int dx, int dy, PIGraphicGen* g);
+//  Transformation coordonnees fenetre en coordonnees drawer
+  virtual  void      WdgCoord2DrwCoord(int x, int y, double& xu, double& yu, 
+				       int x0, int y0, int dx, int dy);
 
 //  Je declare en public a cause de cxx - Reza 11/07/97 
Index: /trunk/SophyaPI/PI/pidrwtools.cc
===================================================================
--- /trunk/SophyaPI/PI/pidrwtools.cc	(revision 2502)
+++ /trunk/SophyaPI/PI/pidrwtools.cc	(revision 2503)
@@ -773,10 +773,13 @@
   mLab->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
   mLab->SetLabel("");
-  cpx += 2.6*bsx;
-  mBut[0] = new PIButton(this, "SetOption", 555, bsx*1.5, bsy, cpx, cpy);
+  cpx += 2.3*bsx;
+  mBut[0] = new PIButton(this, "SetOption", 555, bsx*1.2, bsy, cpx, cpy);
   mBut[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
-  cpx += 1.8*bsx;
-  mBut[1] = new PIButton(this, "Dimiss", 777, bsx*1.5, bsy, cpx, cpy);
+  cpx += 1.25*bsx;
+  mBut[1] = new PIButton(this, "GetOption", 666, bsx*1.2, bsy, cpx, cpy);
   mBut[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
+  cpx += 1.25*bsx;
+  mBut[2] = new PIButton(this, "Dimiss", 777, bsx*1.2, bsy, cpx, cpy);
+  mBut[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
 }
 
@@ -789,4 +792,5 @@
   delete mBut[0];
   delete mBut[1];
+  delete mBut[2];
 }
 /* --Methode-- */
@@ -842,4 +846,16 @@
       mDrw->Refresh();
     }
+    break;
+  case 666:
+    if (mDrw) {
+      vector<string> vops;
+      mDrw->OptionToString(vops);
+      string ops;
+      for(int kk=0; kk<vops.size(); kk++) {
+	ops += vops[kk]; ops += ' ';
+      }
+      mTxt[1]->SetText(ops);
+    }
+    break;
   default :
     break;
Index: /trunk/SophyaPI/PI/pidrwtools.h
===================================================================
--- /trunk/SophyaPI/PI/pidrwtools.h	(revision 2502)
+++ /trunk/SophyaPI/PI/pidrwtools.h	(revision 2503)
@@ -76,5 +76,5 @@
   PIText* mTxt[2]; 
   PILabel* mLab;
-  PIButton* mBut[2];
+  PIButton* mBut[3];
   PIDrawer* mDrw;
 };
Index: /trunk/SophyaPI/PI/pieldrw.cc
===================================================================
--- /trunk/SophyaPI/PI/pieldrw.cc	(revision 2502)
+++ /trunk/SophyaPI/PI/pieldrw.cc	(revision 2503)
@@ -675,2 +675,31 @@
 }
 
+/* --Methode-- */
+double  PIElDrawer::GetDistanceToPoint(double x, double y) 
+{
+  double dist,disty,distx,d1,d2;
+  bool fgokx, fgoky;
+  d1 = fabs(x-XMin());
+  d2 = fabs(x-XMax());
+  if ((y<YMax()) && (y>YMin()))  { 
+    distx = (d1 < d2) ? d1 : d2;
+    distx /= 0.5*(XMax()-XMin());
+    fgokx = true;
+  }
+  else fgokx = false;
+  d1 = fabs(y-YMin());
+  d2 = fabs(y-YMax());
+  if ((x<XMax()) && (x>XMin()))  { 
+    disty = (d1 < d2) ? d1 : d2;
+    disty /= 0.5*(YMax()-YMin());
+    fgoky = true;
+  }
+  else fgoky = false;
+  if (!fgokx  && !fgoky)  return PIDrawer::GetDistanceToPoint(x,y);
+  else {
+    if (fgokx && fgoky) dist = (distx<disty) ? distx : disty;
+    else if (fgokx) dist = distx;
+    else dist = disty;
+  }
+  return dist;
+}
Index: /trunk/SophyaPI/PI/pieldrw.h
===================================================================
--- /trunk/SophyaPI/PI/pieldrw.h	(revision 2502)
+++ /trunk/SophyaPI/PI/pieldrw.h	(revision 2503)
@@ -224,4 +224,9 @@
   virtual void       Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax); 
 
+// Renvoie une distance au point x,y 
+// 0: au(x) point(s) le(s) plus proche(s) ... 1  au bord xmin/xmax , ymin/ymax
+// La methode par defaut calcule la distance normalisee au point ((xmin+xmax)/2,(ymin+ymax)/2)
+  virtual double     GetDistanceToPoint(double x, double y);
+
   inline void        ConfigureAxeTicks(int ntickx=0, int nticky=0, 
 				       double majtl=0., double mintl=0.)
Index: /trunk/SophyaPI/PI/pigratt.cc
===================================================================
--- /trunk/SophyaPI/PI/pigratt.cc	(revision 2502)
+++ /trunk/SophyaPI/PI/pigratt.cc	(revision 2503)
@@ -87,4 +87,7 @@
 //	Si "rmdecatt == true", les attributs décodés sont supprimés du
 //	vecteur de départ.
+// int  AttToStrings(vector<string> & att) const
+//	Renvoie dans "att" les attributs sous forme de string Décodeable 
+//	par *DecodeAttStrings()* . Retourne le nombre d'éléments ajoutés.
 // unsigned long DecodeTextPosDirAtt(vector<string> & att, bool rmdecatt=true)
 //	Décode les attributs de direction et de positionnement de tracé de texte
@@ -654,4 +657,12 @@
 }
 
+int PIGraphicAtt::AttToStrings(vector<string> & att) const
+{
+  // A FAIRE - Reza->CMV  Mars 2004
+  // On ne vide pas (ne met pas a zero) att, mais on ajoute derriere.
+  att.push_back("A FAIRE - Reza->CMV  Mars 2004");
+  return 1;
+}
+
 int PIGraphicAtt::DecodeTextPosDirAtt(vector<string> & att, unsigned long& tdirpos, 
 				   bool rmdecatt)
Index: /trunk/SophyaPI/PI/pigratt.h
===================================================================
--- /trunk/SophyaPI/PI/pigratt.h	(revision 2502)
+++ /trunk/SophyaPI/PI/pigratt.h	(revision 2503)
@@ -33,4 +33,5 @@
   virtual void   UpdateFrom(PIGraphicAtt const & att);
   virtual int    DecodeAttStrings(vector<string> & att, bool rmdecatt=true);
+  virtual int    AttToStrings(vector<string> & att) const;
   // decodage des attributs de positions et direction de trace de texte 
   static  int    DecodeTextPosDirAtt(vector<string> & att, unsigned long& tdirpos, 
Index: /trunk/SophyaPI/PI/piscdrawwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 2502)
+++ /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 2503)
@@ -80,4 +80,5 @@
 {
   mFgReticule = false;
+  mFgShiftBut = false;
   mCPosX = mCPosY = 0;
   mPPos[0] = mPPos[1] = 0.;
@@ -408,4 +409,17 @@
 PIScDrawWdg::But1Press(int x, int y)
 {
+  PIKeyModifier kmod;
+  unsigned long tm;
+  GetLastEventInfo(kmod, tm);
+  if (kmod == PIKM_Shift) {   //SetActive Drawer on Shift-Button-1
+    mFgShiftBut = true; 
+    int nid = FindNearestDrawerId(x,y);
+    SetActiveDrawerId(nid);
+    PIDrawer*  actdr = GetActiveDrawer();
+    if (actdr) { 
+      actdr->HighLight(true);
+    }
+    return;
+  }
   UpdateText(x, y);
   if (mTrW)
@@ -438,4 +452,5 @@
 PIScDrawWdg::Ptr1Move(int x, int y)
 {
+  if (mFgShiftBut) return;  //SetActive Drawer on Shift-Button-1
   UpdateText(x, y);  // Met a jour mPPos
   if (mFgReticule)  DrawReticule(x,y,1);
@@ -445,4 +460,13 @@
 PIScDrawWdg::But1Release(int x, int y)
 {
+  if (mFgShiftBut) {  //SetActive Drawer on Shift-Button-1
+    mFgShiftBut = false; 
+    PIDrawer*  actdr = GetActiveDrawer();
+    if (actdr) { 
+      actdr->HighLight(false);
+    }
+    return;
+  }
+  
   UpdateText(x, y);
   if (mFgReticule)  DrawReticule(x,y,2);
Index: /trunk/SophyaPI/PI/piscdrawwdg.h
===================================================================
--- /trunk/SophyaPI/PI/piscdrawwdg.h	(revision 2502)
+++ /trunk/SophyaPI/PI/piscdrawwdg.h	(revision 2503)
@@ -101,4 +101,5 @@
   int mPosFDX, mPosFDY;       // Position (coord fenetre memorise)
   bool mFgReticule;       // Controle l'affiche d'une réticule (Bouton-1)
+  bool mFgShiftBut;       // true -> shift-Button
   string mFormatOpt[2];   // Format optimal d'impression des textes
 
Index: /trunk/SophyaPI/PI/piwdggen.cc
===================================================================
--- /trunk/SophyaPI/PI/piwdggen.cc	(revision 2502)
+++ /trunk/SophyaPI/PI/piwdggen.cc	(revision 2503)
@@ -79,4 +79,8 @@
 //	pour decoder des options a partir de chaines de caracteres.
 //	Renvoie le nombre d'options decodees.
+// int  OptionToString(vector<string> & opt) const
+//	Méthode virtuelle qui peut être redéfinie dans les classes filles,
+//	pour fournir des chaines de caracteres décodable par *DecodeOptionString()* .
+//	Renvoie le nombre d'éléments ajoutés.
 //--
 
@@ -84,4 +88,8 @@
 {
   return(0);
+}
+int PIWdgGen::OptionToString(vector<string> & opt) const
+{
+  return(0); 
 }
 
Index: /trunk/SophyaPI/PI/piwdggen.h
===================================================================
--- /trunk/SophyaPI/PI/piwdggen.h	(revision 2502)
+++ /trunk/SophyaPI/PI/piwdggen.h	(revision 2503)
@@ -73,4 +73,6 @@
   virtual int            DecodeOptionString(vector<string> & opt, 
 					    bool rmdecopt=true);
+//   Remplissage de chaine decodable par DecodeOptionString() a partir des options
+  virtual int            OptionToString(vector<string> & opt) const;
 
 //  Gestion des accrochages (binding) aux containers
