Index: trunk/SophyaPI/PIext/nobjmgr.cc
===================================================================
--- trunk/SophyaPI/PIext/nobjmgr.cc	(revision 3355)
+++ trunk/SophyaPI/PIext/nobjmgr.cc	(revision 3366)
@@ -98,5 +98,33 @@
 // Pour gestion multithread 
 static ZMutex* myMutex = NULL;
+static bool myMtxLocked = false;   // if myMutex has been locked
+static bool obmWvis = false;  // true -> ObjMgrWindow() is active/visible
+static bool obmWUpdReq = false; // true -> ObjMgrWindow Update requested
 // ..................................................................
+// .... Classe NObjMgrSync ....
+class NObjMgrSync {
+public:
+  explicit NObjMgrSync(int sigbr) 
+  {
+    myMtxLocked = true;
+    myMutex->lock();
+    _sigbr = sigbr;
+  }
+  ~NObjMgrSync()
+  {
+    if (_sigbr == 1) myMutex->signal(); 
+    else  if (_sigbr == 2) myMutex->broadcast(); 
+    myMutex->unlock();
+    myMtxLocked = false;
+    if (obmWUpdReq) {
+      NamedObjMgr _momg;
+      _momg.UpdateObjMgrWindow(-1);
+    }
+  }
+  inline int NOp() { return _sigbr; } 
+
+  int _sigbr;
+};
+//.............................
 
 //++
@@ -229,5 +257,5 @@
     return(false);
   }
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK
   bool fg = true;
@@ -247,5 +275,5 @@
     return(false);
   }
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK
   DVList::ValList::const_iterator it;
@@ -265,5 +293,5 @@
     return(false);
   }
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK
   return(false);
@@ -280,5 +308,5 @@
     return("");
   }
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
   //  cout << " DEBUG::GetVar " << *myVars << endl;
   return(myVars->GetS(key));
@@ -289,5 +317,5 @@
 {
   //  cout << " DEBUG::GetVarList " << *myVars << endl;
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
   return(*myVars);
 }
@@ -296,5 +324,5 @@
 bool NamedObjMgr::CreateDir(string & dirname)
 {
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
   return CreateDir_P(dirname);
 }
@@ -336,5 +364,5 @@
   return(false); 
   }
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 NObjDirList::iterator it = myDirs->find(dirname);
 if (it == myDirs->end()) {
@@ -357,5 +385,10 @@
 if (myImgApp) {
   if ( !_fgimgapp )  myImgApp->LockMutex();
+  if ((myImgApp->ObjMgrW())->GetCurDirId() == (*it).second.id) {
+    (myImgApp->ObjMgrW())->SetCurDir(*currDir);
+    obmWUpdReq = true;
+  }
   (myImgApp->ObjMgrW())->DelDirectory((*it).second.id);
+  
   if ( !_fgimgapp )  myImgApp->UnlockMutex(true);
 }
@@ -368,5 +401,5 @@
 void NamedObjMgr::LockDir(string & dirname)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -380,5 +413,5 @@
 void NamedObjMgr::UnlockDir(string & dirname)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -392,5 +425,5 @@
 void NamedObjMgr::SetKeepOldDirAtt(string & dirname, bool keepold)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -408,5 +441,5 @@
 bool NamedObjMgr::SetCurrentDir(string & dirname)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 if ( !CheckDirName(dirname) ) {
   cout << "NamedObjMgr::SetCurrentDir( " << dirname << ") Error - Invalid name !" << endl;
@@ -426,5 +459,5 @@
 void NamedObjMgr::GetCurrentDir(string & dirname)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 dirname = *currDir;
 }
@@ -433,5 +466,5 @@
 void NamedObjMgr::ListDirs(string & patt)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 NObjDirList::iterator it;
 string cn;
@@ -453,5 +486,5 @@
 void NamedObjMgr::GetDirList(string & patt, vector<string>& lstd)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 NObjDirList::iterator it;
 string cn;
@@ -466,5 +499,5 @@
 void NamedObjMgr::CleanDir(string & dirname)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 CleanDir_P(dirname);
 }
@@ -499,5 +532,5 @@
 for(ii=odel.begin(); ii != odel.end(); ii++)  DelObj_P(*ii,true);
 
-UpdateObjMgrWindow_P(did);  // On met a jour la fenetre de gestion des objets 
+if (obmWvis) UpdateObjMgrWindow_P(did);  // On met a jour la fenetre de gestion des objets
 }
 
@@ -529,5 +562,5 @@
 bool NamedObjMgr::AddObj(AnyDataObj* obj, string & nom, bool crd)
 {
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
   return AddObj_P(obj, nom, crd);
 }
@@ -605,5 +638,5 @@
 (*itr).second.nobj++;
 
-if (myImgApp != NULL) {
+if (obmWvis && (myImgApp != NULL)) {
   if ( !_fgimgapp )  myImgApp->LockMutex();
   if ( (myImgApp->ObjMgrW())->Visible() ) {
@@ -620,5 +653,5 @@
 bool NamedObjMgr::AddObj(AnyDataObj& obj, string & nom, bool crd)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 NObjMgrAdapter* adap = GetServiceObj()->GetAdapter(&obj);
 if (adap == NULL) {
@@ -638,5 +671,5 @@
 bool NamedObjMgr::RenameObj(string & nom, string& nomnew)
 {
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
   return RenameObj_P(nom, nomnew);
 }
@@ -689,5 +722,5 @@
 (*itr).second.nobj++;
 
-if (myImgApp != NULL) {
+if (obmWvis && (myImgApp != NULL)) {
   if ( !_fgimgapp )  myImgApp->LockMutex();
   if ( (myImgApp->ObjMgrW())->Visible() ) {
@@ -706,5 +739,5 @@
 bool NamedObjMgr::CopyObj(string & nom, string& nomcp)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 if(nomcp.length()<=0)
   {cout<<"NamedObjMgr::CopyObj() Error, copied obj name "<<nomcp<<" not valid"<<endl;
@@ -723,5 +756,5 @@
 bool NamedObjMgr::DelObj(string & nom, bool fgd)
 {
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
   return DelObj_P(nom, fgd);
 }
@@ -753,5 +786,5 @@
 if (fgd) delete (*it).second.obj;
 
-if (myImgApp != NULL) {
+if (obmWvis && (myImgApp != NULL)) {
   if ( !_fgimgapp )  myImgApp->LockMutex();
   if ( (myImgApp->ObjMgrW())->Visible() ) {
@@ -774,5 +807,5 @@
 bool NamedObjMgr::DelObj_Id(int oid)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 NObjList::iterator it;
 string nom;
@@ -790,5 +823,5 @@
 void NamedObjMgr::DelObjects(string & patt, bool fgd)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 string n1,r1;
 ParseObjectName(patt, r1, n1);
@@ -808,5 +841,5 @@
 AnyDataObj* NamedObjMgr::GetObj(string & nom)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 return GetObj_P(nom);
 }
@@ -826,5 +859,5 @@
 NObjMgrAdapter* NamedObjMgr::GetObjAdapter(string & nom)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 return GetObjAdapter_P(nom);
 }
@@ -844,5 +877,5 @@
 void NamedObjMgr::ListObjs(string & patt)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 int k;
 AnyDataObj* obj=NULL;
@@ -873,5 +906,5 @@
 void NamedObjMgr::GetObjList(string & patt, vector<string> &lst)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 string n1,r1;
 if (patt.length() < 1)  return;
@@ -909,5 +942,4 @@
 void NamedObjMgr::ReadObj(string const & flnm, string & nobj)
 {
-ZSync zs(*myMutex); zs.NOp(); 
 PPersist* ppobj=NULL;
 bool ok = true;
@@ -932,5 +964,5 @@
 if (!ok)  return;
 if (nobj.length()<1)  nobj = servnobjm->FileName2Name(flnm);
-AddObj_P(ppobj->DataObj(), nobj, true);
+AddObj(ppobj->DataObj(), nobj, true);
 cout << "NamedObjMgr::ReadObj(...) object " << nobj << " read from file " << endl;
 return;
@@ -942,5 +974,4 @@
 {
 if(flnm_objname.size()<2) return;
-ZSync zs(*myMutex); zs.NOp(); 
 int nread=0;
 try {
@@ -957,5 +988,5 @@
       continue;
     }
-    AddObj_P(ppobj->DataObj(),flnm_objname[i],true);
+    AddObj(ppobj->DataObj(),flnm_objname[i],true);
     nread++;
     cout<<"NamedObjMgr::ReadObj(...) object "<<flnm_objname[i]<<" read from file "<<endl;
@@ -971,5 +1002,5 @@
 void NamedObjMgr::ReadObj(PInPersist& s, int num)
 {
-ZSync zs(*myMutex); zs.NOp();
+NObjMgrSync zs(0); zs.NOp();
 ReadObj_P(s, num); 
 }
@@ -1060,5 +1091,4 @@
 void NamedObjMgr::ReadAll(string const & flnm)
 {
-ZSync zs(*myMutex); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK
 bool ok = true;
@@ -1077,7 +1107,7 @@
 if (obj) {
   string nom = servnobjm->FileName2Name(flnm);
-  AddObj_P(obj->DataObj(), nom, false);
-  }
-else ReadObj_P((*ppin), -1);
+  AddObj(obj->DataObj(), nom, false);
+  }
+else ReadObj((*ppin), -1);
 delete ppin;
 #else
@@ -1091,5 +1121,5 @@
       cout << " ... Reading " << pis.NbNameTags() << " objects at NameTags " ;
     }
-    ReadObj_P(pis, -1);
+    ReadObj(pis, -1);
     return;
   }
@@ -1100,5 +1130,5 @@
     PPersist* obj = pis.ReadObject();
     if (!obj) continue;
-    AddObj_P(obj->DataObj(), nom, false);
+    AddObj(obj->DataObj(), nom, false);
     kn++;
     nom += (string)MuTyV(kn);
@@ -1116,5 +1146,5 @@
 void NamedObjMgr::SaveObj(string & nom, POutPersist& s, bool keeppath)
 {
-  ZSync zs(*myMutex); zs.NOp(); 
+  NObjMgrSync zs(0); zs.NOp(); 
   SaveObj_P(nom, s, keeppath);
 }
@@ -1141,5 +1171,5 @@
 void NamedObjMgr::SaveObjects(string & patt, string const& flnm)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 string n1,r1;
 if (patt.length() < 1)  return;
@@ -1183,5 +1213,5 @@
 // dont le nom est le dernier argument (liste[n-1])
 {
- ZSync zs(*myMutex); zs.NOp(); 
+ NObjMgrSync zs(0); zs.NOp(); 
 
  if(liste.size()<2) {
@@ -1215,5 +1245,5 @@
 void NamedObjMgr::SaveAll(string const& flnm)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 bool ok = true;
 
@@ -1250,5 +1280,5 @@
 void NamedObjMgr::PrintObj(string& nom, int lev)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 NObjMgrAdapter* obja=NULL;
 obja = GetObjAdapter_P(nom);
@@ -1272,5 +1302,5 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 
 NObjMgrAdapter* obja=NULL;
@@ -1322,5 +1352,5 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 
 NObjMgrAdapter* obja=NULL;
@@ -1362,5 +1392,5 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 
 NObjMgrAdapter* obja=NULL;
@@ -1412,5 +1442,5 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 
 AnyDataObj* obj=GetObj_P(nom);
@@ -1482,5 +1512,5 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 
 AnyDataObj* obj=GetObj_P(nom);
@@ -1538,5 +1568,5 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 
 #ifdef SANS_EVOLPLANCK
@@ -1640,5 +1670,5 @@
 int NamedObjMgr::NameToOId(string & nom)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 return NameToOId_P(nom);
 }
@@ -1659,5 +1689,5 @@
 void NamedObjMgr::AddWRsId(string & nom, int wrsid)
 {
-ZSync zs(*myMutex); zs.NOp(); 
+NObjMgrSync zs(0); zs.NOp(); 
 AddWRsId_P(nom, wrsid);
 }
@@ -1678,6 +1708,28 @@
 {
 if (!myImgApp)  return;
-ZSync zs(*myMutex); zs.NOp(); 
+if (myMtxLocked) {
+  obmWUpdReq = true;
+  obmWvis = false;
+  (myImgApp->ObjMgrW())->SetUnSensitive();
+  return;
+}
+NObjMgrSync zs(0); zs.NOp();
+if (did < 0) {
+  string cdir = *currDir;
+  cdir = '/' + cdir;
+  (myImgApp->ObjMgrW())->SetCurDir(cdir);
+  did = (myImgApp->ObjMgrW())->GetCurDirId();
+}
+
 UpdateObjMgrWindow_P(did);
+(myImgApp->ObjMgrW())->SetSensitive();
+obmWUpdReq = false;
+obmWvis = true;
+}
+
+/* --Methode-- */
+void NamedObjMgr::SetObjMgrWindowVisibility(bool fgvis)
+{
+obmWvis = fgvis;
 }
 
