]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkBlackBox.cxx
#2696 BBTK Bug New Normal - BoxChange BoxExecute not responding at the second actio...
[bbtk.git] / kernel / src / bbtkBlackBox.cxx
index 58ae9594c317d3447ce6112633eeb90dbdec934b..6fb1fb83a9c749dfce3cc545269c3f0773ad71bf 100644 (file)
@@ -1,22 +1,40 @@
+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ #                        pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ #  This software is governed by the CeCILL-B license under French law and
+ #  abiding by the rules of distribution of free software. You can  use,
+ #  modify and/ or redistribute the software under the terms of the CeCILL-B
+ #  license as circulated by CEA, CNRS and INRIA at the following URL
+ #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ #  or in the file LICENSE.txt.
+ #
+ #  As a counterpart to the access to the source code and  rights to copy,
+ #  modify and redistribute granted by the license, users are provided only
+ #  with a limited warranty  and the software's author,  the holder of the
+ #  economic rights,  and the successive licensors  have only  limited
+ #  liability.
+ #
+ #  The fact that you are presently reading this means that you have had
+ #  knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+
+
 /*=========================================================================
-                                                                                
-Program:   bbtk
-Module:    $RCSfile: bbtkBlackBox.cxx,v $
-Language:  C++
-Date:      $Date: 2008/04/18 12:59:15 $
-Version:   $Revision: 1.10 $
-                                                                                
-Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
-l'Image). All rights reserved. See doc/license.txt or
-http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
-                                                                                
-This software is distributed WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE.  See the above copyright notices for more information.
-                                                                                
+  Program:   bbtk
+  Module:    $RCSfile: bbtkBlackBox.cxx,v $
+  Language:  C++
+  Date:      $Date: 2012/11/16 08:49:01 $
+  Version:   $Revision: 1.56 $
 =========================================================================*/
 
 
+
 /**
  *  \file 
  *  \brief Class bbtk::BlackBox : abstract black-box interface. 
@@ -25,9 +43,11 @@ PURPOSE.  See the above copyright notices for more information.
 #include "bbtkPackage.h"
 #include "bbtkMessageManager.h"
 #include "bbtkFactory.h"
+#include "bbtkBlackBoxOutputConnector.h"
 
 #include "bbtkConfigurationFile.h"
 #include "bbtkWxBlackBox.h"
+#include "bbtkWx.h"
 
 #include <fstream>
 //#include <vector>
@@ -35,20 +55,19 @@ PURPOSE.  See the above copyright notices for more information.
 
 namespace bbtk
 {
-
-
   static bool bbmgSomeBoxExecuting = false;
   static bool bbmgFreezeExecution = false;
-  static std::set<BlackBox::Pointer> bbmgExecutionList;
+  static std::set<BlackBox::WeakPointer> bbmgExecutionList;
 
   //=========================================================================
+
   BlackBox::Deleter::Deleter()
   {
   }
   //=========================================================================
   
   //=========================================================================
-  void BlackBox::Deleter::Delete(Object* p)
+  int BlackBox::Deleter::Delete(Object* p)
   {
     BlackBox* b = dynamic_cast<BlackBox*>(p);
     if (!b)
@@ -64,9 +83,9 @@ namespace bbtk
     BlackBoxDescriptor::WeakPointer desc = b->bbGetDescriptor();
     bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : deleting black box"<<std::endl);
     
-    b->bbDelete();
-    
-    bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor ["<<desc.lock()<<"]"<<std::endl);
+    int refs = b->bbDelete();
+
+    bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor"<<std::endl);
     
     if (!desc.expired()) 
       {
@@ -85,37 +104,57 @@ namespace bbtk
        bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor expired : nothing to do (was not held by a package or the box is a complex black box prototype)"<<std::endl);
       }
     bbtkDebugMessage("object",2,"<## BlackBox::Deleter(\""<<name<<"\")"<<std::endl);
+    return refs;
   }
   //=========================================================================
 
   //=========================================================================
   BlackBox::BlackBox(const std::string &name) 
-    : bbmName(name), 
-      bbmStatus(MODIFIED), 
-      bbmBoxProcessMode("Pipeline"),
-      bbmParent(),
-      bbmExecuting(false)
+    : 
+    //    bbmStatus(MODIFIED), 
+    bbmInitialized(false),
+    bbmExecuting(false),
+    bbmName(name),
+    bbmBoxProcessMode("Pipeline"),
+       bbLetRecursiveExecuteManualMode(false),
+    bbmParent()
+    
   {
-    bbtkDebugMessage("object",4,"==> BlackBox::BlackBox(\""
+         //JCP 02-11-09
+        // bbmBoxProcessMode = "Pipeline";     
+//std::cout<<"JCP BlackBox::BlackBox(const std::string &name) name=" <<name
+//               <<"bbmBoxProcessMode="<<bbmBoxProcessMode<<std::endl;
+    bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::BlackBox(\""
                     <<name<<"\")"<<std::endl);
-    bbtkDebugMessage("object",4,"<== BlackBox::BlackBox(\""
+    bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::BlackBox(\""
                     <<name<<"\")"<<std::endl);
   }
   //=========================================================================
 
+  //=========================================================================
+  BlackBox::BlackBox(const BlackBox&)
+  {}
 
   //=========================================================================
   BlackBox::BlackBox(BlackBox& from, const std::string &name) 
-    : bbmName(name), 
-      bbmStatus(from.bbmStatus), 
-      bbmBoxProcessMode(from.bbmBoxProcessMode),
-      bbmParent(),
-      bbmExecuting(false)
+    :
+    //    bbmStatus(from.bbmStatus), 
+    bbmInitialized(false),
+    bbmExecuting(false),
+    bbmName(name), 
+    bbmBoxProcessMode(from.bbmBoxProcessMode),
+       bbLetRecursiveExecuteManualMode(false),
+    bbmParent()
+    
   {
-    bbtkDebugMessage("object",4,"==> BlackBox::BlackBox("
+         //JCP 02-11-09
+         //bbmBoxProcessMode = from.bbmBoxProcessMode;
+         //std::cout<<"JCP BlackBox::BlackBox(const std::string &name) name=" <<name
+               //  <<"bbmBoxProcessMode="<<bbmBoxProcessMode<<std::endl;
+    bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::BlackBox("
                     <<from.bbGetFullName()<<",\""
                     <<name<<"\")"<<std::endl);
-    bbtkDebugMessage("object",4,"<== BlackBox::BlackBox("
+    bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::BlackBox("
                     <<from.bbGetFullName()<<",\""
                     <<name<<"\")"<<std::endl);
   }
@@ -125,45 +164,15 @@ namespace bbtk
   //=========================================================================
   BlackBox::~BlackBox()
   {
-    bbtkDebugMessage("object",4,"==> BlackBox::~BlackBox() ["<<bbmName
+    bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::~BlackBox() ["<<bbmName
                     <<"]"<<std::endl);
     this->bbDesallocateConnectors();
-    bbtkDebugMessage("object",4,"<== BlackBox::~BlackBox() ["<<bbmName
+    bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::~BlackBox() ["<<bbmName
                     <<"]"<<std::endl);
   }
   //=========================================================================
 
 
-  //=========================================================================
-  /// Main processing method of the box.
-  void BlackBox::bbExecute(bool force)
-  {
-    bbtkDebugMessageInc("Process",1,
-                       "=> BlackBox::bbExecute() ["
-                       <<bbGetFullName()<<"]"<<std::endl);
-    Wx::BeginBusyCursor();
-
-    // If execution frozen : return
-    if (bbGlobalGetFreezeExecution()) 
-      {
-       bbtkDebugMessage("Process",1,
-                        " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
-      }
-
-    // If force is true then update is triggered even if the box is UPTODATE
-    if (force) bbSetModifiedStatus();
-
-    // Calls the main recursive update method 
-    bbBackwardUpdate(Connection::Pointer());
-
-    Wx::EndBusyCursor();
-
-    bbtkDebugMessageDec("Process",1,
-                       "<= BlackBox::bbExecute() ["
-                       <<bbGetFullName()<<"]"<<std::endl);
-  }
-  //=========================================================================
 
   //=========================================================================
   std::string BlackBox::bbGetFullName() const
@@ -175,7 +184,6 @@ namespace bbtk
 
 
   //=========================================================================
-  /// Returns the name with the name of the parent prepended if any
   std::string BlackBox::bbGetNameWithParent() const
   {
     if (bbmParent.lock()) 
@@ -190,7 +198,6 @@ namespace bbtk
   //=========================================================================
 
   //=========================================================================
-  /// Prints the Help on the BlackBox type 
   void BlackBox::bbGetHelp(bool full) const
   {
     bbGetDescriptor()->GetHelp(full); 
@@ -199,76 +206,76 @@ namespace bbtk
 
 
   //=========================================================================
-  /// Returns true if the UserBlackBox has an input of name name
   bool BlackBox::bbHasInput(const std::string& name) const
   {
-    bbtkDebugMessageInc("Kernel",8,
+    bbtkBlackBoxDebugMessage("kernel",8,
                        "BlackBox::bbHasInput(\""
-                       <<name<<"\") ["<<bbGetFullName()<<"]"
+                       <<name<<"\")"
                        <<std::endl);
     bool r = ( bbGetDescriptor()->GetInputDescriptorMap().find(name)
               != bbGetDescriptor()->GetInputDescriptorMap().end());
-    bbtkDebugDecTab("Kernel",8);
+    bbtkDebugDecTab("kernel",8);
     return r;
   }
   //=========================================================================
 
 
   //=========================================================================  
-  /// Returns true if the UserBlackBox has an output of name name
   bool BlackBox::bbHasOutput(const std::string& name) const
   {
-    bbtkDebugMessageInc("Kernel",8,"BlackBox::bbHasOutput(\""
-                       <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
+    bbtkBlackBoxDebugMessage("kernel",8,"BlackBox::bbHasOutput(\""
+                            <<name<<"\")"
+                            <<std::endl);
     bool r = ( bbGetDescriptor()->GetOutputDescriptorMap().find(name)
               != bbGetDescriptor()->GetOutputDescriptorMap().end());
-    bbtkDebugDecTab("Kernel",8);
+    bbtkDebugDecTab("kernel",8);
     return r;
   }
   //=========================================================================
 
 
   //=========================================================================  
-  ///  Gets the output type of a given name
   TypeInfo BlackBox::bbGetOutputType( const std::string &name ) const 
   {
-    bbtkDebugMessageInc("Kernel",8,
-                       "BlackBox::bbGetOutputType(\""
-                       <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
+    bbtkBlackBoxDebugMessage("kernel",8,
+                            "BlackBox::bbGetOutputType(\""
+                            <<name<<"\")"
+                            <<std::endl);
     TypeInfo r = bbGetDescriptor()->GetOutputDescriptor(name)->GetTypeInfo();
-    bbtkDebugDecTab("Kernel",8); 
+    bbtkDebugDecTab("kernel",8); 
     return r;
   }
   //=========================================================================
 
   //=========================================================================
-  ///  Gets the input type of a given name
   TypeInfo BlackBox::bbGetInputType( const std::string &name ) const
   {
-    bbtkDebugMessageInc("Kernel",8,
-                       "BlackBox::bbGetInputType(\""
-                       <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
+    bbtkBlackBoxDebugMessage("kernel",8,
+                            "BlackBox::bbGetInputType(\""
+                            <<name<<"\")"
+                            <<std::endl);
     TypeInfo r = bbGetDescriptor()->GetInputDescriptor(name)->GetTypeInfo();
-    bbtkDebugDecTab("Kernel",8);
+    bbtkDebugDecTab("kernel",8);
     return r;
   }
   //=========================================================================
 
 
   //=========================================================================
-  /// Allocates the i/o connectors of the black box
   void BlackBox::bbAllocateConnectors()
   {  
-    bbtkDebugMessageInc("Kernel",8,
-                       "BlackBox::bbAllocateConnectors() ["
-                       <<bbGetFullName()<<"]"
+    bbtkBlackBoxDebugMessage("kernel",8,
+                       "BlackBox::bbAllocateConnectors()"
                        <<std::endl);                                   
+
+    MakeBlackBoxPointer(this,true);
+
     const BlackBoxDescriptor::InputDescriptorMapType& imap 
       = bbGetDescriptor()->GetInputDescriptorMap(); 
     BlackBoxDescriptor::InputDescriptorMapType::const_iterator i;      
     for ( i = imap.begin(); i != imap.end(); ++i )                     
       {                                                                        
-       bbtkDebugMessage("Kernel",8,"* Allocate \""<<i->first<<"\""<<std::endl);
+       bbtkBlackBoxDebugMessage("kernel",8,"* Allocate \""<<i->first<<"\""<<std::endl);
        bbGetInputConnectorMap()[i->second->GetName()] 
          = new BlackBoxInputConnector(GetThisPointer<BlackBox>());
       }                                                                        
@@ -277,20 +284,18 @@ namespace bbtk
     BlackBoxDescriptor::OutputDescriptorMapType::const_iterator o; 
     for ( o = omap.begin(); o != omap.end(); ++o )
       {                                                        
-       bbtkDebugMessage("Kernel",8,"* Allocate \""<<o->first<<"\""<<std::endl);
+       bbtkBlackBoxDebugMessage("kernel",8,"* Allocate \""<<o->first<<"\""<<std::endl);
        bbGetOutputConnectorMap()[o->second->GetName()] 
-         = new BlackBoxOutputConnector();
+         = new BlackBoxOutputConnector(GetThisPointer<BlackBox>());
       }
-    bbtkDebugDecTab("Kernel",8);  
   }
   //=========================================================================
 
 
   //=========================================================================
-  /// Desallocates the i/o connectors of the black box
   void BlackBox::bbDesallocateConnectors()
   {
-    bbtkDebugMessageInc("Kernel",8,
+    bbtkBlackBoxDebugMessage("kernel",8,
                        "BlackBox::bbDesallocateConnectors()"
                        <<std::endl);                                   
 
@@ -298,31 +303,29 @@ namespace bbtk
     for ( i = bbGetInputConnectorMap().begin();
          i != bbGetInputConnectorMap().end(); ++i )                   
       {                                                                        
-       bbtkDebugMessage("Kernel",8,"* Delete \""<<i->first<<"\""<<std::endl);
+       bbtkBlackBoxDebugMessage("kernel",8,"* Delete \""<<i->first<<"\""<<std::endl);
        delete (i->second);
       }                                                                        
     OutputConnectorMapType::const_iterator o;  
     for ( o = bbGetOutputConnectorMap().begin(); 
          o != bbGetOutputConnectorMap().end(); ++o )                   
       {                                                                        
-       bbtkDebugMessage("Kernel",8,"* Delete \""<<o->first<<"\""<<std::endl);         
+       bbtkBlackBoxDebugMessage("kernel",8,"* Delete \""<<o->first<<"\""<<std::endl);         
        delete (o->second);
       }                                                                        
    
-    bbtkDebugDecTab("Kernel",8);  
-
+    bbtkDebugDecTab("kernel",8);
   }
   //=========================================================================
 
 
   //=========================================================================
-  /// Copies the input / output values from another box
   void BlackBox::bbCopyIOValues(BlackBox& from)
   {
-    bbtkDebugMessageInc("Kernel",9,
-                       "BlackBox::bbCopyIOValues("
-                       <<from.bbGetFullName()<<") ["
-                       <<bbGetFullName()<<"]"<<std::endl);
+    bbtkBlackBoxDebugMessage("kernel",1,
+                            "BlackBox::bbCopyIOValues("
+                            <<from.bbGetFullName()<<")"
+                            <<std::endl);
     // copies the input values
     const BlackBoxDescriptor::InputDescriptorMapType& imap 
       = bbGetDescriptor()->GetInputDescriptorMap(); 
@@ -331,6 +334,7 @@ namespace bbtk
       {                
        if (! i->second->GetCopyConstruct() ) continue;
        std::string input = i->second->GetName();
+       bbtkBlackBoxDebugMessage("kernel",2,"* Copying input "<<input<<std::endl);
        this->bbSetInput(input, from.bbGetInput(input) );
       }                                                                        
     // copies the output values
@@ -341,11 +345,11 @@ namespace bbtk
       {                                                        
        if (! o->second->GetCopyConstruct() ) continue;
        std::string output = o->second->GetName();
+       bbtkBlackBoxDebugMessage("kernel",2,"* Copying output "<<output<<std::endl);
        this->bbSetOutput(output, from.bbGetOutput(output) );
       }
 
-    bbtkDebugDecTab("Kernel",9);
-
+    bbtkDebugDecTab("kernel",9);
   }
   //=========================================================================
 
@@ -355,185 +359,232 @@ namespace bbtk
   bool BlackBox::bbCanReact() const 
   { 
     return ( bbGlobalGetSomeBoxExecuting() 
-#ifdef _USE_WXWIDGETS_
+#ifdef USE_WXWIDGETS
             || Wx::IsSomeWindowAlive() 
 #endif
-            ); 
+            );
   }
   //=========================================================================
 
 
 
-  //=========================================================================
-  /// User overloadable destruction method of a black box
-  void BlackBox::bbUserDelete() 
-  {   
-    bbtkDebugMessage("Process",5,
-                    "=> BlackBox::bbUserDelete() ["
-                    <<bbGetFullName()<<"]"
-                    <<" : not overloaded; using standard deletion"
-                    <<std::endl);
-    delete this;
-  }
-  //=========================================================================
-
-
   //=========================================================================
   BlackBox::BoxProcessModeValue BlackBox::bbGetBoxProcessModeValue() const
   {
     const std::string& p = bbmBoxProcessMode;
     if ( (p == "0") ||
         (p == "P") || (p == "p") ||
-        (p == "Pipeline") || (p == "pipeline") ) return Pipeline;
+        (p == "Pipeline") || (p == "pipeline") ) return bbPipeline;
     if ( (p == "1") ||
         (p == "A") || (p == "a") ||
-        (p == "Always") || (p == "always") ) return Always;
+        (p == "Always") || (p == "always") ) return bbAlways;
     if ( (p == "2") ||
         (p == "R") || (p == "r") ||
-        (p == "Reactive") || (p == "reactive") ) return Reactive;
-    bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
+        (p == "Reactive") || (p == "reactive") ) 
+               return bbReactive;
+    /*
+    if ( (p == "3") ||
+        (p == "F") || (p == "f") ||
+        (p == "Flash") || (p == "flash") ) return Flash;
+    */
+
+         if ( (p == "3") ||
+          (p == "M") || (p == "m") ||
+          (p == "Manual") || (p == "manual") ) return bbManual;
+         
+         bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
              <<"' unknown. Possible values : "
              <<"'0'/'P'/'p'/'Pipeline'/'pipeline' | "
              <<"'1'/'A'/'a'/'Always'/'always' | "
-             <<"'2'/'R'/'r'/'Reactive'/'reactive'"<<std::endl);
+             <<"'2'/'R'/'r'/'Reactive'/'reactive'"
+             //      <<"'3'/'F'/'f'/'Flash'/'flash'"
+             <<"'3'/'M'/'m'/'Manual'/'manual'"
+                 <<std::endl);
   }
   //=========================================================================
   
   //=========================================================================
   bool  BlackBox::bbBoxProcessModeIsReactive() const
   {
-    return (bbGetBoxProcessModeValue() == Reactive);
+    return (bbGetBoxProcessModeValue() == bbReactive);
   }
   //=========================================================================
 
   //=========================================================================
   bool  BlackBox::bbBoxProcessModeIsAlways() const
   {
-    return (bbGetBoxProcessModeValue() == Always);
+    return (bbGetBoxProcessModeValue() == bbAlways);
   }
   //=========================================================================
 
+
+       //=========================================================================
+       bool  BlackBox::bbBoxProcessModeIsManual() const
+       {
+               return (bbGetBoxProcessModeValue() == bbManual);
+       }
+       //=========================================================================
+       
+
   //=========================================================================
-  ///  Signals that the BlackBox has been modified
-  void BlackBox::bbSetModifiedStatus(BlackBoxInputConnector* c)
+  void BlackBox::bbAddOutputObserver(const std::string& output, 
+                                  OutputChangeCallbackType f)
   {
-    bbtkDebugMessageInc("Process",5,
-                       "=> BlackBox::bbSetModifiedStatus("<<c<<") ["
-                       <<bbGetFullName()<<"]"<<std::endl);
-   
-    if ( (c==bbGetInputConnectorMap().find("WinHide")->second) )
-        //      && (bbCanReact()))
+    bbGetOutputConnector(output).AddChangeObserver(f);
+  }  
+  //=========================================================================
+
+  //=========================================================================
+  void BlackBox::bbRemoveOutputObserver(const std::string& output_name, 
+                                     OutputChangeCallbackType f)
+  {
+    bbtkError("BlackBox::RemoveChangeObserver NOT IMPLEMENTED");
+  }
+  //=========================================================================
+
+
+  //=========================================================================
+  void BlackBox::bbSetStatusAndPropagate(BlackBoxInputConnector* c,
+                                        IOStatus s)
+  {
+    bbtkBlackBoxDebugMessage("change",5,
+                            "=> BlackBox::bbSetStatusAndPropagate(input,"
+                            <<GetIOStatusString(s)<<")"
+                            <<std::endl);
+
+    if (s==UPTODATE) bbtkError("bbSetStatusAndPropagate with status UPTODATE!");
+    c->SetStatus(s);
+
+    // Flash reaction
+    /*
+    if (bbGetBoxProcessModeValue() == Flash)
       {
-       bbtkDebugMessage("Process",9,
-                        "-> Hide triggered by WinHide input change"
-                        <<std::endl);
-       this->bbHideWindow();
-       this->bbSetStatus(MODIFIED); 
-       return;
+       this->bbExecute();
       }
-    if ( ( bbBoxProcessModeIsReactive()  ||
-          (c==bbGetInputConnectorMap().find("BoxExecute")->second))
-        && (bbCanReact() ) )
+    */
+
+
+    OutputConnectorMapType::const_iterator o;  
+    for ( o = bbGetOutputConnectorMap().begin(); 
+         o != bbGetOutputConnectorMap().end(); ++o )                   
       {
-       bbtkDebugMessage("Process",9,
+
+
+       if (o->first=="BoxChange")
+       {
+               o->second->SetStatus(UPTODATE);
+       }
+
+
+
+//EED 24/08/2015
+// EED CASPITAS 2
+       if (o->second->GetStatus()==UPTODATE)
+//     if ((o->second->GetStatus()==UPTODATE) || (o->second->GetStatus()==OUTOFDATE))
+//     if ((o->second->GetStatus()==UPTODATE) || (o->second->GetStatus()==MODIFIED))
+         {
+           o->second->SetStatus(OUTOFDATE);
+           o->second->SignalChange(GetThisPointer<BlackBox>(),o->first); 
+         } // if
+       } // for                                                        
+    
+
+    if (  ( bbBoxProcessModeIsReactive()
+          || (c==bbGetInputConnectorMap().find("BoxExecute")->second))
+          && (bbCanReact() ) )
+      {
+       bbtkBlackBoxDebugMessage("change",2,
                         "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
-       this->bbSetStatus(MODIFIED); 
         bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
-      }
-    else if ( bbGetStatus() == MODIFIED ) //! this->bbIsUptodate()) 
-      { 
-       bbtkDebugMessage("Process",5,"-> Already modified"<<std::endl);
-       bbtkDebugDecTab("Process",5);
-       return;
-      }
-    else 
-      {
-       bbtkDebugMessage("Process",5,"-> Status set to modified"<<std::endl);
-       bbtkDebugDecTab("Process",5);
-       this->bbSetStatus(MODIFIED); 
-      }
-    this->bbSignalOutputModification(false);
-
-   bbtkDebugMessageDec("Process",5,
-                       "<= BlackBox::bbSetModifiedStatus("<<c<<") ["
-                       <<bbGetFullName()<<"]"<<std::endl);
-  }  
+      } // if
+    bbtkBlackBoxDebugMessage("change",5,
+                            "<= BlackBox::bbSetStatusAndPropagate(input)"
+                            <<std::endl);
+  }
   //=========================================================================
 
+
   //=========================================================================  
   void BlackBox::bbSignalOutputModification(bool reaction)
   {
-    bbtkDebugMessageInc("Process",5,
-                       "=> BlackBox::bbSignalOutputModification() ["
-                       <<bbGetFullName()<<"]"<<std::endl);
-    
-    OutputConnectorMapType::iterator change = bbGetOutputConnectorMap().end();
+    bbtkBlackBoxDebugMessage("change",5,
+                            "=> BlackBox::bbSignalOutputModification("
+                            <<reaction<<")"
+                            <<"]"<<std::endl);
+
     OutputConnectorMapType::iterator i;
     for ( i  = bbGetOutputConnectorMap().begin(); 
-         i != bbGetOutputConnectorMap().end(); ++i) {
-      /*     if ( i->first == "BoxChange" ) 
-       {
-         change = i;
-         continue;
-       }
-      */
-      i->second->SetModifiedStatus();
-    } 
-    //    if (change != bbGetOutputConnectorMap().end()) 
-    // change->second->SetModifiedStatus();
+         i != bbGetOutputConnectorMap().end(); ++i) 
+      {
+       //      std::cout << "Stat = "
+       //<<GetIOStatusString(i->second->GetStatus())
+       //                <<std::endl;
+       // LG : CANNOT SIGNAL ONLY WHEN UPTODATE 
+       // See bbtkSampleOutputObserver
+       //      if (i->second->GetStatus()==UPTODATE) 
+       //        {
+           i->second->SignalChange(GetThisPointer<BlackBox>(),i->first); 
+           //    }
+      } // for
 
     if (reaction) bbGlobalProcessExecutionList();
 
-    bbtkDebugMessageDec("Process",5,
-                       "<= BlackBox::bbSignalOutputModification() ["
-                       <<bbGetFullName()<<"]"<<std::endl);
-    
+    bbtkBlackBoxDebugMessage("change",5,
+                            "<= BlackBox::bbSignalOutputModification()"
+                            <<std::endl);
   }  
   //=========================================================================   
+
+
   //=========================================================================  
   void BlackBox::bbSignalOutputModification(const std::string& output,
-       bool reaction)
+                                           bool reaction)
   {
-    bbtkDebugMessageInc("Process",5,
-                       "=> BlackBox::bbSignalOutputModification("
-                       <<output<<") ["
-                       <<bbGetFullName()<<"]"<<std::endl);
+    bbtkBlackBoxDebugMessage("change",5,
+                            "=> BlackBox::bbSignalOutputModification("
+                            <<output<<","<<reaction<<")"
+                            <<std::endl);
     
-    OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(output);
+    OutputConnectorMapType::iterator i = 
+      bbGetOutputConnectorMap().find(output);
+
+
     if ( i == bbGetOutputConnectorMap().end() ) 
        {
          bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<output<<") : unknown output");
        }
-    i->second->SetModifiedStatus();
-    // Has to notify the output "BoxChange" also
-    if (output != "BoxChange") 
-      {
-       i = bbGetOutputConnectorMap().find("BoxChange");
-       if ( i != bbGetOutputConnectorMap().end() 
+
+    //    if (i->second->GetStatus()==UPTODATE) 
+    //      {
+       i->second->SignalChange(GetThisPointer<BlackBox>(),i->first); 
+       // Has to notify the output "BoxChange" also
+       if (output != "BoxChange"
          {
-           i->second->SetModifiedStatus();
+           i = bbGetOutputConnectorMap().find("BoxChange");
+           if ( i != bbGetOutputConnectorMap().end() ) 
+             {
+               i->second->SignalChange(GetThisPointer<BlackBox>(),i->first); 
+             }
          }
-      }
-  if (reaction) bbGlobalProcessExecutionList();
-
-  bbtkDebugMessageDec("Process",5,
-                      "<= BlackBox::bbSignalOutputModification("
-                      <<output<<") ["
-                      <<bbGetFullName()<<"]"<<std::endl);
+       if (reaction) bbGlobalProcessExecutionList();
+       //      }
 
+       bbtkBlackBoxDebugMessage("change",5,
+                            "<= BlackBox::bbSignalOutputModification("
+                            <<output<<")"
+                            <<std::endl);
   }  
   //=========================================================================   
   //=========================================================================  
   void BlackBox::bbSignalOutputModification(const std::vector<std::string>& output,
        bool reaction)
   {
-    bbtkDebugMessageInc("Process",5,
-                       "=> BlackBox::bbSignalOutputModification(vector of outputs) ["
-                       <<bbGetFullName()<<"]"<<std::endl);
+    bbtkBlackBoxDebugMessage("change",5,
+                       "=> BlackBox::bbSignalOutputModification(vector of outputs)"
+<<std::endl);
     OutputConnectorMapType::iterator i;
     std::vector<std::string>::const_iterator o;
+    bool changed = false;
     for (o=output.begin();o!=output.end();++o) 
       {
        // the output "BoxChange" must be signaled **AFTER** all others
@@ -544,32 +595,222 @@ namespace bbtk
          {
            bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<*o<<") : unknown output");
          }
-       i->second->SetModifiedStatus();
+
+       //      if (i->second->GetStatus()==UPTODATE)
+       //        {
+           i->second->SignalChange(GetThisPointer<BlackBox>(),i->first); 
+           changed = true;
+           //  }
       }
     // Has to notify the output "BoxChange" also
     i = bbGetOutputConnectorMap().find("BoxChange");
-    if ( i != bbGetOutputConnectorMap().end() 
+    if ( changed && (i != bbGetOutputConnectorMap().end())
       {
-       i->second->SetModifiedStatus();
+       // if (i->second->GetStatus()==UPTODATE) 
+       //        {
+           i->second->SignalChange(GetThisPointer<BlackBox>(),i->first); 
+           if (reaction) bbGlobalProcessExecutionList();
+           //  }
       }
-  if (reaction) bbGlobalProcessExecutionList();
-
-   bbtkDebugMessageDec("Process",5,
-                      "<= BlackBox::bbSignalOutputModification(vector of outputs) ["
-                       <<bbGetFullName()<<"]"<<std::endl);
 
+    bbtkBlackBoxDebugMessage("change",5,
+                            "<= BlackBox::bbSignalOutputModification(vector of outputs)"
+                            <<std::endl);
   }  
   //=========================================================================   
 
+
+
+
+
+
+
+  //=========================================================================
+  /// Main processing method of the box.
+  void BlackBox::bbExecute(bool force)
+  {
+    bbtkBlackBoxDebugMessage("process",2,
+                            "=> BlackBox::bbExecute("<<(int)force<<")"
+                            <<std::endl);
+    // If already executing : return
+    /*
+    if (bbGetExecuting()) 
+      {
+       bbtkBlackBoxDebugMessage("process",2,
+                        " -> already executing : abort"<<std::endl);
+       return;
+      }
+    */
+
+    // If execution frozen : return
+    if (bbGlobalGetFreezeExecution()) 
+      {
+       bbtkBlackBoxDebugMessage("process",2,
+                        " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
+      }
+
+    BBTK_BUSY_CURSOR;
+
+    // If force is true then update is triggered even if the box is UPTODATE
+    //    if (force) bbSetModifiedStatus();
+
+       if ( bbBoxProcessModeIsManual() ) 
+       {
+               bbLetRecursiveExecuteManualMode = true;
+    }
+         
+         
+    // Calls the main recursive execution method 
+    bbRecursiveExecute(Connection::Pointer());
+
+         
+       if ( bbBoxProcessModeIsManual() ) 
+       {
+               bbLetRecursiveExecuteManualMode = false;
+       }
+         
+         
+    bbtkBlackBoxDebugMessage("process",2,
+                            "<= BlackBox::bbExecute()"
+                            <<std::endl);
+  }
+  //=========================================================================
+
+  //=========================================================================
+  void BlackBox::bbInitializeProcessing()
+  {
+    if (!bbmInitialized) 
+      {
+       bbtkBlackBoxDebugMessage("process",2,"** Initialize processing"
+                                <<std::endl);
+       this->bbRecursiveInitializeProcessing();
+       bbmInitialized = true;
+      }
+  }
+  //=========================================================================
+
+  //=========================================================================
+  void BlackBox::bbFinalizeProcessing()
+  {
+    if (bbmInitialized) 
+      {
+       bbtkBlackBoxDebugMessage("process",2,"** Finalize processing"
+                                <<std::endl);
+       this->bbRecursiveFinalizeProcessing();
+       bbmInitialized = false;
+      }
+  }
+  //=========================================================================
+
+  
+  //=========================================================================
+  void BlackBox::bbRecursiveExecute( Connection::Pointer caller )
+  {
+
+    bbtkBlackBoxDebugMessage("process",3,
+                       "=> BlackBox::bbRecursiveExecute("
+                       <<(caller?caller->GetFullName():"0")<<")"
+                       <<std::endl);
+
+    // If already executing : return
+    if (bbGetExecuting()) 
+      {
+       bbtkBlackBoxDebugMessage("process",3,
+                        " -> already executing : abort"<<std::endl);
+       return; 
+      }
+    
+    // If not initialized do it
+    bbInitializeProcessing();
+
+    bbSetExecuting(true);
+    bool wasExecuting = bbGlobalGetSomeBoxExecuting();
+    bbGlobalSetSomeBoxExecuting(true);
+    
+    // Creates the window if the black box has one
+    this->bbCreateWindow();
+    
+    // Updates its inputs
+         
+//       IOStatus s;
+         IOStatus s=UPTODATE;
+//       IOStatus s=OUTOFDATE;
+//       IOStatus s=MODIFIED;
+                 
+
+         if ( ( bbBoxProcessModeIsManual()==false )  || 
+                  ( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==true) ) )
+         {
+                 s = bbUpdateInputs();
+         }       
+                 
+    if ( (s != UPTODATE) ||  bbBoxProcessModeIsAlways() )
+      {
+         // Displays the window (WxBlackbox)
+         //    bbShowWindow(caller);
+
+         // Actual processing (virtual)
+                 if ( ( bbBoxProcessModeIsManual()==false )  || 
+                          ( (bbBoxProcessModeIsManual()==true)&&(bbLetRecursiveExecuteManualMode==true) ) 
+                        )
+                       {
+                               this->bbProcess();              
+                   } // Manual analysis
+                 
+//EED ups                      if ((bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==false))
+//EED ups                      {
+//EED ups                        bbSignalOutputModification(true);
+//EED ups                      }
+                 
+                 
+                 // Update the I/O statuses
+                 bbComputePostProcessStatus();
+      }
+    else 
+      {
+       // Test output status...
+       OutputConnectorMapType::iterator o;
+       for ( o = bbGetOutputConnectorMap().begin(); 
+             o!= bbGetOutputConnectorMap().end(); ++o) 
+         {
+           if (o->second->GetStatus() != UPTODATE)
+             {
+               bbtkWarning("BlackBox::bbRecursiveExecute: "
+                           <<"all inputs are Up-to-date but output '"
+                           <<o->first<<"' is Out-of-date ???");
+             }
+         }
+       
+        bbtkBlackBoxDebugMessage("process",3," -> Up-to-date : nothing to do"
+                        <<std::endl);
+      }
+
+    // Shows the window if the black box has one
+    this->bbShowWindow(); 
+
+         
+    bbtkBlackBoxDebugMessage("process",3,
+            "<= BlackBox::bbRecursiveExecute()"
+            <<std::endl);
+
+    bbSetExecuting(false);
+    bbGlobalSetSomeBoxExecuting(wasExecuting);
+
+
+    return;
+  }
   //=========================================================================
-  /// Updates the BlackBox inputs
-  /// \returns UPTODATE if all inputs are in UPTODATE status after update
-  ///          else MODIFIED 
-  IOStatus BlackBox::bbUpdateInputs(bool excludeParent)
+  
+   
+
+
+
+  //=========================================================================
+  IOStatus BlackBox::bbUpdateInputs()
   {
-    bbtkDebugMessageInc("Process",4,
-                       "=> BlackBox::bbUpdateInputs() ["
-                       <<bbGetFullName()<<"]"
+    bbtkBlackBoxDebugMessage("process",4,
+                       "=> BlackBox::bbUpdateInputs()"
                        <<std::endl);   
 
     IOStatus s = UPTODATE;
@@ -578,57 +819,120 @@ namespace bbtk
     for ( i = bbGetInputConnectorMap().begin(); 
          i!= bbGetInputConnectorMap().end(); ++i) 
       {
-       if (excludeParent && (i->first=="WinParent")) continue;
-       if (i->first=="WinHide") continue;
+       //      if (i->first=="WinHide") continue;
        // If input type is Void : no recurse
        //if (  bbGetDescriptor()->GetInputDescriptor(i->first)->GetTypeInfo() 
        //      == typeid(Void) ) 
        //  continue;
-
-       IOStatus t = i->second->BackwardUpdate();
-       if (t==MODIFIED) s = MODIFIED;
+       bbtkBlackBoxDebugMessage("change",2,
+                           "Input '"<<i->first
+                           <<"': status before update = '"
+                           <<GetIOStatusString(i->second->GetStatus())
+                           <<"'"<<std::endl);
+       i->second->RecursiveExecute();
+       IOStatus t = i->second->GetStatus();
+       if (t > s) s = t;
+       bbtkBlackBoxDebugMessage("change",2,
+                                "Input '"<<i->first
+                                <<"': status before process = '"
+                                <<GetIOStatusString(i->second->GetStatus())
+                                <<"'"<<std::endl);
       }
     
-   bbtkDebugMessageDec("Process",4,
-                       "<= BlackBox::bbUpdateInputs() ["
-                       <<bbGetFullName()<<"]"
+    bbtkBlackBoxDebugMessage("process",4,
+                       "<= BlackBox::bbUpdateInputs()"
+                       <<std::endl);
+    return s;
+  }
+  //=========================================================================
+
+  //==================================================================
+   void BlackBox::bbComputePostProcessStatus()
+  {
+    bbtkBlackBoxDebugMessage("process",4,
+                       "=> BlackBox::bbComputePostProcessStatus()"
                        <<std::endl);   
 
+    IOStatus new_output_status = UPTODATE;
+    if (bbBoxProcessModeIsAlways()) new_output_status = OUTOFDATE;
 
-    return s;
+    // Update the input statuses
+    InputConnectorMapType::iterator i;
+    for ( i = bbGetInputConnectorMap().begin(); 
+         i!= bbGetInputConnectorMap().end(); ++i) 
+      {
+       IOStatus t = i->second->GetStatus();
+       if (t == OUTOFDATE) new_output_status = OUTOFDATE;
+       // A previously MODIFIED status turns to UPTODATE
+       if (t==MODIFIED) i->second->SetStatus(UPTODATE);
+       bbtkBlackBoxDebugMessage("change",2,
+                        "Input '"<<i->first<<"' : "
+                        << GetIOStatusString(t) << " -> "
+                        << GetIOStatusString(i->second->GetStatus())
+                        << std::endl);
+      }
+    bbtkBlackBoxDebugMessage("change",2,
+                            "New output status : "
+                            << GetIOStatusString(new_output_status)
+                            <<std::endl);
+    // Update the output statuses
+    OutputConnectorMapType::iterator o;
+    for ( o = bbGetOutputConnectorMap().begin(); 
+         o!= bbGetOutputConnectorMap().end(); ++o) 
+      {
+               
+//EED            if  ( ( bbBoxProcessModeIsManual()==false )  || 
+//EED                      ( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==true) ) 
+//EED                    )
+//EED            {
+                         o->second->SetStatus(new_output_status);
+//EED            }  else  {
+//EED                    if  (( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==false) )  ) 
+//EED                    {
+//EED                            o->second->SetStatus(UPTODATE);
+//EED                    }
+//EED            } // Manual analysis
+                         
+      }
+
+    bbtkBlackBoxDebugMessage("process",4,
+                       "<= BlackBox::bbComputePostProcessStatus()"
+                       <<std::endl);
   }
-  //=========================================================================
+  //==================================================================
 
   //=========================================================================
-  /// Connects the input <name> to the connection c
-  void BlackBox::bbConnectInput( const std::string& name, Connection::Pointer c)
+  void BlackBox::bbConnectInput( const std::string& name, Connection* c)
   {
-    bbtkDebugMessageInc("Kernel",7,
-                       "BlackBox::bbConnectInput(\""<<name<<"\","<<c<<") ["
-                       <<bbGetFullName()<<"]"
+    bbtkBlackBoxDebugMessage("connection",2,
+                       "==> BlackBox::bbConnectInput(\""
+                       <<name<<"\","<<c->GetFullName()<<")"
                        <<std::endl);       
+
     InputConnectorMapType::iterator i = bbGetInputConnectorMap().find(name);
     if (i==bbGetInputConnectorMap().end())
       {
        bbtkError("no input called '"<<name<<"'");
       }
     i->second->SetConnection(c);
-    
-    //  bbSetModifiedStatus();
+    // The input *MUST* be set OUTOFDATE to update its input on next execution
+    bbSetStatusAndPropagate(i->second,OUTOFDATE);
 
-    bbtkDebugDecTab("Kernel",7);
+    bbtkBlackBoxDebugMessage("connection",2,
+                       "<== BlackBox::bbConnectInput(\""
+                       <<name<<"\","<<c->GetFullName()<<")"
+                       <<std::endl);
   }
   //=========================================================================
 
 
   //=========================================================================  
-  /// Connects the output <name> to the connection c
-  void BlackBox::bbConnectOutput( const std::string& name, Connection::Pointer c)
+  void BlackBox::bbConnectOutput( const std::string& name, Connection* c)
   {
-    bbtkDebugMessageInc("Kernel",7,
-                       "BlackBox::bbConnectOutput(\""<<name<<"\","<<c<<") ["
-                       <<bbGetFullName()<<"]"<<std::endl);       
+    bbtkBlackBoxDebugMessage("connection",2,
+                            "==> BlackBox::bbConnectOutput(\""<<name<<"\","
+                            <<c->GetFullName()<<")"
+                            <<std::endl);       
 
     OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(name);
     if (i==bbGetOutputConnectorMap().end())
@@ -637,21 +941,28 @@ namespace bbtk
       }
     i->second->SetConnection(c);
 
-    bbtkDebugDecTab("Kernel",7);
+    bbtkBlackBoxDebugMessage("connection",2,
+                            "<== BlackBox::bbConnectOutput(\""<<name<<"\","
+                            <<c->GetFullName()<<")"
+                            <<std::endl);
   }
   //=========================================================================
 
 
   //=========================================================================
-  /// Disconnects the input <name> from the connection c
-  void BlackBox::bbDisconnectInput( const std::string& name, Connection::Pointer c)
+   void BlackBox::bbDisconnectInput( const std::string& name, Connection* c)
   {
-    if (!c) return;
-    bbtkDebugMessageInc("Kernel",7,
-                       "BlackBox::bbDisconnectInput(\""<<name
-                       <<"\","<<c<<") ["
-                       <<bbGetFullName()<<"]"
-                       <<std::endl);      
+
+    bbtkBlackBoxDebugMessage("connection",2,
+                    "==> BlackBox::bbDisconnectInput(\""<<name
+                    <<"\","<<c->GetFullName()<<")"
+                    <<std::endl);
+    if (!c) 
+      {
+
+       bbtkBlackBoxDebugMessage("connection",2,"c==0"<<std::endl);     
+       return;
+      }
 
     InputConnectorMapType::iterator i = bbGetInputConnectorMap().find(name);
     if (i==bbGetInputConnectorMap().end())
@@ -660,21 +971,28 @@ namespace bbtk
       }
     i->second->UnsetConnection(c);
 
-    bbtkDebugDecTab("Kernel",7);
+    bbtkBlackBoxDebugMessage("connection",2,
+                    "<== BlackBox::bbDisconnectInput(\""<<name
+                    <<"\","<<c->GetFullName()<<")"
+                    <<std::endl);      
+
   }
   //=========================================================================
 
 
   //=========================================================================
-  /// Disconnects the output <name> from the connection c
-  void BlackBox::bbDisconnectOutput( const std::string& name, Connection::Pointer c)
+   void BlackBox::bbDisconnectOutput( const std::string& name, Connection* c)
   {
-    if (!c) return;
-    bbtkDebugMessageInc("Kernel",7,
-                       "BlackBox::bbDisconnectOutput(\""<<name
-                       <<"\","<<c<<") ["
-                       <<bbGetFullName()<<"]"
-                       <<std::endl);       
+    bbtkBlackBoxDebugMessage("connection",2,
+                    "==> BlackBox::bbDisconnectOutput(\""<<name
+                    <<"\","<<c->GetFullName()<<")"
+                    <<std::endl);       
+    if (!c) 
+      {
+
+       bbtkBlackBoxDebugMessage("connection",2,"c==0"<<std::endl);     
+       return;
+      }
 
     OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(name);
     if (i==bbGetOutputConnectorMap().end())
@@ -683,13 +1001,36 @@ namespace bbtk
       }
     i->second->UnsetConnection(c);
 
-    bbtkDebugDecTab("Kernel",7);
+    bbtkBlackBoxDebugMessage("connection",2,
+                    "<== BlackBox::bbDisconnectOutput(\""<<name
+                    <<"\","<<c->GetFullName()<<")"
+                    <<std::endl);       
   } 
   //=========================================================================
  
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
   //=========================================================================
-  /// Virtual
   void BlackBox::bbWriteDotInputOutputName(FILE *ff,bool inputoutput,int detail, int level)
   {
     fprintf(ff,"%s%p",bbGetTypeName().c_str(),this);
@@ -797,11 +1138,11 @@ namespace bbtk
     std::string ss("<");
     std::string::size_type pos = 0;
     pos = s.find(ss,0);
-    char* cr = "[";
+    std::string cr("[");
     while ( pos != std::string::npos )
       {
        //      std::cout << "*** find one "<<std::endl;
-       s.replace(pos,1,cr,1);
+       s.replace(pos,1,cr.c_str(),1);
        pos = s.find(ss, pos);
       } 
     ss = ">";
@@ -811,7 +1152,7 @@ namespace bbtk
     while ( pos != std::string::npos )
       {
        //      std::cout << "*** find one "<<std::endl;
-       s.replace(pos,1,cr,1);
+       s.replace(pos,1,cr.c_str(),1);
        pos = s.find(ss, pos);
       } 
     ss = ",";
@@ -821,7 +1162,7 @@ namespace bbtk
     while ( pos != std::string::npos )
       {
        //      std::cout << "*** find one "<<std::endl;
-       s.replace(pos,1,cr,1);
+       s.replace(pos,1,cr.c_str(),1);
        pos = s.find(ss, pos);
       }     //    std::cout << "AFTER=["<<s<<"]"<<std::endl;
   }
@@ -892,8 +1233,8 @@ namespace bbtk
           const BlackBoxOutputDescriptor* id = bbGetDescriptor()->GetOutputDescriptor(ii->first); 
           tempStrTypeName=id->GetTypeName();
           SubsBrackets(tempStrTypeName);
-           std::string Name(ii->first);
-           SubsBrackets(Name);
+          std::string Name(ii->first);
+          SubsBrackets(Name);
           labelStr=labelStr+"<"+ii->first.c_str()+"> " + valueStr + Name.c_str() + "  ["+tempStrTypeName+"]";
        }
        labelStr = labelStr+ "      } }" ;
@@ -918,21 +1259,21 @@ namespace bbtk
        {
          if (i->second)
            {
-             Connection::Pointer con = i->second->GetConnection();
+             Connection* con = i->second->GetConnection();
              if (con!=NULL){
-               BlackBox::Pointer a=con->GetBlackBoxFrom();
-               BlackBox::Pointer b=con->GetBlackBoxTo();
+               BlackBox::Pointer a=con->GetOriginalBlackBoxFrom();
+               BlackBox::Pointer b=con->GetOriginalBlackBoxTo();
                fprintf(ff,"  ");
                a->bbWriteDotInputOutputName(ff,false,detail,level);
                if (detail==1)
                  {
-                   fprintf(ff,":%s",con->GetBlackBoxFromOutput().c_str());
+                   fprintf(ff,":%s",con->GetOriginalBlackBoxFromOutput().c_str());
                  }
                fprintf(ff,"->");
                b->bbWriteDotInputOutputName(ff,true,detail,level);
                if (detail==1)
                  {
-                   fprintf(ff,":%s",con->GetBlackBoxToInput().c_str());
+                   fprintf(ff,":%s",con->GetOriginalBlackBoxToInput().c_str());
                  }
                fprintf(ff,"%s\n",";");
              }  // if con
@@ -946,150 +1287,205 @@ namespace bbtk
 
 
   //=========================================================================
-  void BlackBox::bbShowRelations(BlackBox::Pointer parentblackbox, 
+  void BlackBox::bbPrintHelp(BlackBox::Pointer parentblackbox, 
                                 int detail, int level
                                 /*,Factory *factory*/ )
   {
      
     if (this->bbGetDescriptor()->GetPackage()) 
       {
-       bbtkMessage("Help",1,"Black Box '"<<bbGetName()<<"' <"<<
+            bbtkBlackBoxMessage("help",1,"Black Box '"<<bbGetName()<<"' <"<<
                    this->bbGetDescriptor()->GetPackage()->GetName()
                    <<"::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
       }
     else 
       {
-       bbtkMessage("Help",1,"Black Box <::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
+            bbtkBlackBoxMessage("help",1,"Black Box <::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
+      }
+    /*
+    if (bbIsUpToDate())
+      {
+            bbtkBlackBoxMessage("help",1,"Up-to-date ["<<mMaxInputChangeTime<<","
+                   <<mMinOutputChangeTime<<"]"<<std::endl);
+      }
+    else 
+      {
+            bbtkBlackBoxMessage("help",1,"Out-of-date ["<<mMaxInputChangeTime<<","
+                   <<mMinOutputChangeTime<<"]"<<std::endl);
       }
-    //    bbtkMessage("Help",1," "<<GetDescription()<<std::endl);
-    //    bbtkMessage("Help",1," By : "<<GetAuthor()<<std::endl);
+    */
+    //    bbtkBlackBoxMessage("help",1," "<<GetDescription()<<std::endl);
+    //    bbtkBlackBoxMessage("help",1," By : "<<GetAuthor()<<std::endl);
 
     std::vector<std::string> iname;
     std::vector<std::string> ivalue;
     std::vector<std::string> iconn;
+    std::vector<std::string> istatus;
 
     InputConnectorMapType::iterator i;
     unsigned int namelmax = 0;
     unsigned int valuelmax = 0;
-    unsigned int connlmax = 0;
+    //   unsigned int connlmax = 0;
     for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i ) 
-      {
-       iname.push_back(i->first);
-       if (iname.back().size()>namelmax) namelmax = iname.back().size();
-       ivalue.push_back(bbGetInputAsString(i->first));
-       if (ivalue.back().size()>valuelmax) valuelmax = ivalue.back().size();
-       std::string s("");
-       Connection::Pointer con = i->second->GetConnection();
-       if (con!=0){
-         s = con->GetBlackBoxFrom()->bbGetName();
-         s += ".";
-         s += con->GetBlackBoxFromOutput();
-       }  // if con
-       iconn.push_back(s);
-      }
+    {
+          iname.push_back(i->first);
+          if (iname.back().size()>namelmax) namelmax = iname.back().size();
+          ivalue.push_back(bbGetInputAsString(i->first));
+          if (ivalue.back().size()>valuelmax) valuelmax = ivalue.back().size();
+          std::string s("");
+          Connection* con = i->second->GetConnection();
+          if (con!=0){
+             s = con->GetOriginalBlackBoxFrom()->bbGetName();
+             s += ".";
+             s += con->GetOriginalBlackBoxFromOutput();
+          }  // if con
+          iconn.push_back(s);
+          istatus.push_back(GetIOStatusString(i->second->GetStatus()));
+    }
     OutputConnectorMapType::iterator o;
     std::vector<std::string> oname;
     std::vector<std::string> ovalue;
     std::vector<std::vector<std::string> > oconn;
+    std::vector<std::string> ostatus;
     for ( o = mOutputConnectorMap.begin(); o != mOutputConnectorMap.end(); ++o ) 
-      {
-       oname.push_back(o->first);
-       if (oname.back().size()>namelmax) namelmax = oname.back().size();
-       ovalue.push_back(bbGetOutputAsString(o->first));
-       if (ovalue.back().size()>valuelmax) valuelmax = ovalue.back().size();
-       std::vector<std::string> ss;
-       const std::vector<Connection::WeakPointer>& con 
-         = o->second->GetConnectionVector();
-       std::vector<Connection::WeakPointer>::const_iterator c;
-       for (c=con.begin();c!=con.end();++c) 
-         {
-           std::string s;
-           s = (*c).lock()->GetBlackBoxTo()->bbGetName();
-           s += ".";
-           s += (*c).lock()->GetBlackBoxToInput();
-           ss.push_back(s);
-       }  // if con
-       oconn.push_back(ss);
-      }
+    {
+          oname.push_back(o->first);
+          if (oname.back().size()>namelmax)
+          namelmax = oname.back().size();
+          ovalue.push_back(bbGetOutputAsString(o->first));
+          if (ovalue.back().size()>valuelmax) 
+          valuelmax = ovalue.back().size();
+          std::vector<std::string> ss;
+          const std::vector<Connection*>& con 
+                                   = o->second->GetConnectionVector();
+          std::vector<Connection*>::const_iterator c;
+          for (c=con.begin();c!=con.end();++c) 
+          {
+              std::string s;
+              s = (*c)->GetOriginalBlackBoxTo()->bbGetName();
+              s += ".";
+              s += (*c)->GetOriginalBlackBoxToInput();
+              ss.push_back(s);
+           }  // if con
+           oconn.push_back(ss);
+           ostatus.push_back(GetIOStatusString(o->second->GetStatus()));
+    }
 
     if (iname.size()) 
-      bbtkMessage("Help",1," * Inputs : "<<std::endl);
+      bbtkBlackBoxMessage("help",1," * Inputs : "<<std::endl);
     else 
-      bbtkMessage("Help",1," * No inputs"<<std::endl);
-
-    std::vector<std::string>::iterator i1,i2,i3;
-    for (i1=iname.begin(),i2=ivalue.begin(),i3=iconn.begin();
-        i1!=iname.end(),i2!=ivalue.end(),i3!=iconn.end();
-        ++i1,++i2,++i3)
-      {
-       std::string name(*i1);
-       name += "'";
-       name.append(1+namelmax-name.size(),' ');
-       std::string value(*i2);
-       value += "'";
-       value.append(1+valuelmax-value.size(),' ');
-       if (i3->size()) 
-         bbtkMessage("Help",1,"    '"<<name<<" = '"<<value<<" <-- '"<<*i3<<"'"<<std::endl);
-       else 
-         bbtkMessage("Help",1,"    '"<<name<<" = '"<<value<<std::endl);
-      }
+      bbtkBlackBoxMessage("help",1," * No inputs"<<std::endl);
+
+    std::vector<std::string>::iterator i1,i2,i3,i4;
+    for (i1=iname.begin(),i2=ivalue.begin(),i3=iconn.begin(),i4=istatus.begin();
+            i1!=iname.end(),i2!=ivalue.end(),i3!=iconn.end(),i4!=istatus.end();
+          ++i1,++i2,++i3,++i4)
+     {
+           std::string name(*i1);
+           name += "'";
+           name.append(1+namelmax-name.size(),' ');
+           std::string value(*i2);
+           value += "'";
+           value.append(1+valuelmax-value.size(),' ');
+           if (i3->size()) 
+             bbtkBlackBoxMessage("help",1,"    '"<<name<<" = '"<<value<<" <-- '" <<*i3<<"'");
+           else 
+             bbtkBlackBoxMessage("help",1,"    '"<<name<<" = '"<<value);
+           bbtkBlackBoxMessage("help",1," ["<<*i4<<"]"<<std::endl);
+     }
 
     if (oname.size()) 
-      bbtkMessage("Help",1," * Outputs : "<<std::endl);
+       bbtkBlackBoxMessage("help",1," * Outputs : "<<std::endl);
     else 
-      bbtkMessage("Help",1," * No outputs"<<std::endl);
-
-    std::vector<std::vector<std::string> >::iterator i4;
-
-    for (i1=oname.begin(),i2=ovalue.begin(),i4=oconn.begin();
-        i1!=oname.end(),i2!=ovalue.end(),i4!=oconn.end();
-        ++i1,++i2,++i4)
-      {
-       std::string name(*i1);
-       name += "'";
-       name.append(1+namelmax-name.size(),' ');
-       std::string value(*i2);
-       value += "'";
-       value.append(1+valuelmax-value.size(),' ');
-       if (!(*i4).size())
-         bbtkMessage("Help",1,"    '"<<name<<" = '"<<value<<std::endl);
-       else 
-         {
-           std::string pref = "    '"+name+" = '"+value;
-           for (i3=i4->begin();i3!=i4->end();++i3)
-             {
-               bbtkMessage("Help",1,pref<<" --> '"<<*i3<<"'"<<std::endl);
-               pref.replace(0,pref.size(),pref.size(),' ');
-             }
-         }
-      }
+       bbtkBlackBoxMessage("help",1," * No outputs"<<std::endl);
+
+    std::vector<std::vector<std::string> >::iterator i5;
+
+    for (i1=oname.begin(),i2=ovalue.begin(),i5=oconn.begin(),i4=ostatus.begin();
+            i1!=oname.end(),i2!=ovalue.end(),i5!=oconn.end(),i4!=ostatus.end();
+          ++i1,++i2,++i4,++i5)
+    {
+           std::string name(*i1);
+           name += "'";
+           name.append(1+namelmax-name.size(),' ');
+           std::string value(*i2);
+           value += "'";
+           value.append(1+valuelmax-value.size(),' ');
+           if (!(*i5).size())
+             bbtkBlackBoxMessage("help",1,"    '"<<name<<" = '"<<value);
+           else 
+           {
+              std::string pref = "    '"+name+" = '"+value;
+              for (i3=i5->begin();i3!=i5->end();++i3)
+              {
+                     bbtkBlackBoxMessage("help",1,pref<<" --> '"<<*i3<<"'");
+                     pref.replace(0,pref.size(),pref.size(),' ');
+              }
+           }
+           bbtkBlackBoxMessage("help",1," ["<<*i4<<"]"<<std::endl);
+    }
 
    }
   //=========================================================================
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  static bool bbmgGlobalProcessingExecutionList = false;
+
   //=========================================================================
    void BlackBox::bbGlobalProcessExecutionList()
    {   
-     bbtkDebugMessageInc("Process",1,
-                        "=> BlackBox::bbGlobalProcessExecutionList()"
-                        <<std::endl);     
-     
-     std::set<BlackBox::Pointer>::iterator i;
-     for (i=bbmgExecutionList.begin();
-         i!=bbmgExecutionList.end();
-         ++i)
+     bbtkDebugMessage("process",3,
+                     "=> BlackBox::bbGlobalProcessExecutionList()"
+                     <<std::endl);    
+     if (bbmgGlobalProcessingExecutionList) 
        {
-        bbtkDebugMessage("Process",2,
-                         " -> Executing "<<(*i)->bbGetFullName()<<std::endl);
-        (*i)->bbExecute(true);
+        bbtkDebugMessage("process",3,"BlackBox::bbGlobalProcessExecutionList() reentered !");
+        return;
+       }
+     bbmgGlobalProcessingExecutionList = true;
+
+     std::set<BlackBox::WeakPointer>::iterator i; 
+     while (bbmgExecutionList.size()>0)
+       {
+        i = bbmgExecutionList.begin();
+        BlackBox::WeakPointer p = *i;
+        bbmgExecutionList.erase(i);
+        if (p.lock())
+          {
+            bbtkDebugMessage("process",4,
+                             " -> Executing '"<<
+                             p.lock()->bbGetName()<<"'"<<std::endl);
+            p.lock()->bbExecute(true);
+          }
+        else 
+          {
+            bbtkGlobalError("Strange error in BlackBox::bbGlobalProcessExecutionList() : Weak bb pointer in bbmgExecutionList is no more valid...");
+          }
        }
      
      bbmgExecutionList.clear();
-     bbtkDebugMessageDec("Process",1,
+     bbtkDebugMessage("process",3,
                         "<= BlackBox::bbGlobalProcessExecutionList()"
                         <<std::endl);     
      
+     bbmgGlobalProcessingExecutionList = false;
+
      
    }
   //=========================================================================
@@ -1115,30 +1511,29 @@ namespace bbtk
        }
 
   void BlackBox::bbGlobalAddToExecutionList( BlackBox::Pointer b )
-       {  
-               bbmgExecutionList.insert(b); 
-       } 
+  {  
+    bbtkDebugMessage("process",3,"* bbGlobalAddToExecutionList("<<b->bbGetName()<<")"<<std::endl);
+    if (bbmgGlobalProcessingExecutionList) 
+      {
+       bbtkDebugMessage("process",3,"bbGlobalAddToExecutionList called inside bbGlobalProcessExecutionList !");
+      }
+    bbmgExecutionList.insert(b); 
+  } 
 
 
-  //=========================================================================
-  // Static members initialization
-/*EED
-  bool BlackBox::bbmgSomeBoxExecuting = false;
-  bool BlackBox::bbmgFreezeExecution = false;
-  std::set<BlackBox*> BlackBox::bbmgExecutionList;
-*/
    //=========================================================================
 
   //=========================================================================
   void BlackBox::Check(bool recursive)
   {
-    bbtkMessage("Debug",1,"*** Checking Black Box "<<(void*)this<<" ["<<bbGetFullName()
-               <<"] ... OK"<<std::endl);
+    bbtkBlackBoxMessage("debug",1,"*** Checking"
+                       <<" ... OK"<<std::endl);
   }
   //=========================================================================
 
 
 
+
 }  // EO namespace bbtk
 
 // EOF