]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkWxBlackBox.cxx
=== MAJOR RELEASE ====
[bbtk.git] / kernel / src / bbtkWxBlackBox.cxx
index 4f791be31ff46919da792514fe8e244f7af7c72a..2413e4a55aba8e69c9e067adafb05c2db8b156db 100644 (file)
@@ -3,8 +3,8 @@
   Program:   bbtk
   Module:    $RCSfile: bbtkWxBlackBox.cxx,v $
   Language:  C++
-  Date:      $Date: 2008/02/07 07:58:54 $
-  Version:   $Revision: 1.6 $
+  Date:      $Date: 2008/04/18 12:59:16 $
+  Version:   $Revision: 1.12 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 namespace bbtk
 {
 
-  //=========================================================================
-  wxWindow* WxBlackBox::bbGlobalGetTopWindow() 
-  {
-    return bbmgTopWindow;
-  }
-  //=========================================================================
-
-  //=========================================================================
-  void WxBlackBox::bbGlobalSetTopWindow(wxWindow* w) 
-  {
-    if ( bbmgTopWindow ) 
-      {
-       bbtkGlobalError("WxBlackBox::bbGlobalSetTopWindow : top window already set !");
-      } 
-    bbmgTopWindow = w;
-  }
-  //=========================================================================
-   
-
-  //=========================================================================
-  void WxBlackBox::bbGlobalDecNbWindowsAlive()
-  { 
-    bbmgNbWindowsAlive--; 
-    /*
-    if ( (bbmgNbWindowsAlive==0) && 
-        bbmgTopWindow && (!bbmgTopWindow->IsShown()))
-      {
-       bbmgTopWindow->Close();
-      }
-    */
-  }
-  //=========================================================================
-
-  //=========================================================================
-  void WxBlackBox::bbGlobalDecNbWindowsShown()
-  { 
-    bbmgNbWindowsShown--; 
-    if ( (bbmgNbWindowsShown==0) && 
-        bbmgTopWindow && (!bbmgTopWindow->IsShown()))
-      {
-       bbmgTopWindow->Close();
-      }
-  }
-  //=========================================================================
-
-  //=========================================================================
-  // Static members 
-  wxWindow* WxBlackBox::bbmgTopWindow =0;
-  int WxBlackBox::bbmgNbWindowsAlive = 0;
-  int WxBlackBox::bbmgNbWindowsShown = 0;
-  //=========================================================================
-
-
 
 
 
@@ -101,15 +48,15 @@ namespace bbtk
 
 
   //=========================================================================
-  WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox* box)
+  WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox::Pointer box)
     : mBox(box), mShown(false)
   {
     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
                     mBox->bbGetFullName()<<")"<<std::endl);
     mBox->bbSetWindow(this);
-    WxBlackBox::bbGlobalIncNbWindowsAlive();
-    bbtkDebugMessage("Wx",9," -> Number of windows alive = "
-                    <<WxBlackBox::bbGlobalGetNbWindowsAlive()<<std::endl);
+    Wx::IncNbWindowsAlive();
+    bbtkDebugMessage("Wx",5," -> Number of windows alive = "
+                    <<Wx::GetNbWindowsAlive()<<std::endl);
   }
   //=========================================================================
 
@@ -120,24 +67,25 @@ namespace bbtk
                     mBox->bbGetFullName()<<"]"<<std::endl);
     bbHide();
     mBox->bbSetWindow(0);
-    WxBlackBox::bbGlobalDecNbWindowsAlive();
-    bbtkDebugMessage("Wx",9," -> Number of windows alive = "
-                    <<WxBlackBox::bbGlobalGetNbWindowsAlive()<<std::endl);
+    Wx::DecNbWindowsAlive();
+    bbtkDebugMessage("Wx",5," -> Number of windows alive = "
+                    <<Wx::GetNbWindowsAlive()<<std::endl);
      
 
   }
   //========================================================================= 
 
+
   //=========================================================================
   void WxBlackBoxWindow::bbShow()
   {
     if (bbIsShown()) return;
     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<<
                     mBox->bbGetFullName()<<"]"<<std::endl);
-    WxBlackBox::bbGlobalIncNbWindowsShown();
+    Wx::IncNbWindowsShown();
     mShown = true;
-    bbtkDebugMessage("Wx",9," -> Number of windows shown = "
-                    <<WxBlackBox::bbGlobalGetNbWindowsShown()<<std::endl);
+    bbtkDebugMessage("Wx",5," -> Number of windows shown = "
+                    <<Wx::GetNbWindowsShown()<<std::endl);
   }
   //=========================================================================
 
@@ -147,10 +95,10 @@ namespace bbtk
     if (!bbIsShown()) return;
     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbHide() ["<<
                     mBox->bbGetFullName()<<"]"<<std::endl);
-    WxBlackBox::bbGlobalDecNbWindowsShown();
+    Wx::DecNbWindowsShown();
     mShown = false;
-    bbtkDebugMessage("Wx",9," -> Number of windows shown = "
-                    <<WxBlackBox::bbGlobalGetNbWindowsShown()<<std::endl);
+    bbtkDebugMessage("Wx",5," -> Number of windows shown = "
+                    <<Wx::GetNbWindowsShown()<<std::endl);
   }
   //=========================================================================
 
@@ -161,7 +109,7 @@ namespace bbtk
   //=========================================================================
 
   //=========================================================================
-  WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox* box,
+  WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox::Pointer box,
                                     wxWindow *parent,
                                     wxString title,
                                     wxSize size)
@@ -229,7 +177,7 @@ namespace bbtk
   //=========================================================================
 
   //=========================================================================
-  WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox* box,
+  WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox::Pointer box,
                                   wxWindow *parent,
                                   wxString title,
                                   wxSize size)
@@ -275,7 +223,13 @@ namespace bbtk
     bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow("
                     <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
     WxBlackBoxWindow::bbShow();
-    wxFrame::Show(); 
+    wxFrame::Show();
+    // This Update is ** MANDATORY ** 
+    // to synchronize wxvtkRenderWindowInteractor objects
+    // (force wx objects creation **NOW**)
+    wxFrame::Update();
+    bbGetBlackBox()->bbUserOnShow();
+    //    wxFrame::SetFocus();
   }
   //=========================================================================
 
@@ -285,7 +239,8 @@ namespace bbtk
     bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
                     bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
     WxBlackBoxWindow::bbHide();
-    Hide();
+    wxFrame::Hide();
+    bbGetBlackBox()->bbUserOnHide();
   }
   //=========================================================================
 
@@ -369,8 +324,9 @@ namespace bbtk
   //=========================================================================
 
   //=========================================================================
-  WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler( WxBlackBox* box, 
-                                                             wxWindow *widget )
+  WxBlackBoxWidgetEventHandler::
+  WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box, 
+                               wxWindow *widget )
     :
     mBox(box),
     mWindow(widget)
@@ -467,7 +423,7 @@ namespace bbtk
   //=========================================================================
   //=========================================================================
   //=========================================================================
-  BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
+  BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
   //=========================================================================
   
   //=========================================================================
@@ -539,8 +495,104 @@ namespace bbtk
   }
   //=========================================================================
 
+  //=========================================================================
+  /// Main processing method of the box.
+  void WxBlackBox::bbExecute(bool force)
+  {
+    bbtkDebugMessageInc("Process",1,
+                       "=> WxBlackBox::bbExecute() ["
+                       <<bbGetFullName()<<"]"<<std::endl);
+
+    // If the output 'Widget' is connected then 
+    // we must execute the parent box
+    BlackBox::OutputConnectorMapType::const_iterator i 
+      = bbGetOutputConnectorMap().find("Widget");
+
+    if ( i->second->GetConnectionVector().size() != 0 ) 
+      {
+       bbtkDebugMessage("Process",2,
+                        "-> Output 'Widget' connected : transfering execution to parent"
+                        <<std::endl);
+       
+       i->second->GetConnectionVector().front().lock()
+         ->GetBlackBoxTo()->bbExecute(force);
+
+      }
+    // else call 'standard' BlackBox execution method
+    else 
+      {
+       BlackBox::bbExecute(force);
+      }
+    //
+
+    bbtkDebugMessageDec("Process",1,
+                       "<= WxBlackBox::bbExecute() ["
+                       <<bbGetFullName()<<"]"<<std::endl);
+  }
+  //=========================================================================
+
 
+  //=========================================================================
+  /// Main processing method of the box.
+  IOStatus WxBlackBox::bbBackwardUpdate( Connection::Pointer caller )
+  {
+    bbtkDebugMessageInc("Process",1,
+                       "=> WxBlackBox::bbBackwardUpdate("
+                       <<(caller?caller->GetFullName():"0")<<") ["
+                       <<bbGetFullName()<<"]"<<std::endl);
+
+    if (bbGetExecuting()) 
+      {
+       bbtkWarning(bbGetFullName()<<" : Cyclic execution stopped");
+       return UPTODATE;
+      }
+    bbSetExecuting(true);
+
+    // If the caller is not the connection to the output widget
+    // and the output 'Widget' is connected then 
+    // we must execute the parent box
+    bool done = false;
+    if ( (caller==0) ||
+        ((caller!=0)&&(caller->GetBlackBoxFromOutput()!="Widget"))
+        )
+      {
+       BlackBox::OutputConnectorMapType::const_iterator i 
+         = bbGetOutputConnectorMap().find("Widget") ;
+       if ( 
+           i->second->GetConnectionVector().size() != 0 ) 
+         {
+           bbtkDebugMessage("Process",2,
+                            "-> Output 'Widget' connected : transfering execution to parent"
+                            <<std::endl);
+           
+           i->second->GetConnectionVector().front().lock()
+             ->GetBlackBoxTo()->bbExecute(false);
+           done = true;
+         }
+      }
+    // call 'standard' BlackBox execution method
+    if (!done) 
+      { 
+       bbSetExecuting(false);
+       AtomicBlackBox::bbBackwardUpdate(caller);
+      }
+    
+    bbtkDebugMessageDec("Process",1,
+                       "<= WxBlackBox::bbBackwardUpdate() ["
+                       <<bbGetFullName()<<"]"<<std::endl);
+    
+    bbSetExecuting(false);
+  }
 
+  //=========================================================================
+  void WxBlackBox::bbProcess()
+  { 
+    if (bbGetOutputWidget()==0) this->bbUserCreateWidget();
+    this->bbUserProcess(); 
+    bbShowWindow();
+  }
+  //=========================================================================
+  
   //==================================================================
   /// Specific methods for window creation during pipeline execution
   /// Shows the window associated to the box 
@@ -558,7 +610,8 @@ namespace bbtk
            bbtkDebugMessage("Process",3,
                             "-> No widget event handler : creating one"
                             <<std::endl);
-           new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
+           new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
+                                            bbGetOutputWidget());
          }
        else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
                  ( bbGetOutputWidget() ) )
@@ -567,7 +620,8 @@ namespace bbtk
                             "-> Obsolete widget event handler : re-creating one"
                             <<std::endl);
            delete bbGetWidgetEventHandler();
-           new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
+           new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
+                                            bbGetOutputWidget());
          }
        // Sets the name of the wxWindow to the input WinTitle
        bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
@@ -610,8 +664,8 @@ namespace bbtk
            bbtkDebugMessage("Process",2,
                             "   Input WinDialog set to true : creating a Dialog"
                             <<std::endl);
-           show = (Window*) new WxBlackBoxDialog( this,
-                                                  bbGlobalGetTopWindow(), 
+           show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
+                                                  bbGetWxParent(), 
                                                   std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
                                                   wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
          }
@@ -621,8 +675,8 @@ namespace bbtk
            bbtkDebugMessage("Process",2,
                             "   Input WinDialog set to false : creating a Frame"
                             <<std::endl);
-           show = (Window*) new WxBlackBoxFrame( this,
-                                                 bbGlobalGetTopWindow(), 
+           show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
+                                                 bbGetWxParent(), 
                                                  std2wx( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
                                                  wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
          }
@@ -671,6 +725,36 @@ namespace bbtk
   //==================================================================
 
 
+  //==================================================================
+  WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
+  {
+    if (bbGetWindow()!=0) return bbGetWindow();
+    BlackBox::OutputConnectorMapType::const_iterator i 
+      = bbGetOutputConnectorMap().find("Widget");
+    if ( i->second->GetConnectionVector().size() != 0 ) 
+      {
+       return boost::static_pointer_cast<WxBlackBox>
+         (i->second->GetConnectionVector().front().lock()->GetBlackBoxTo())
+         ->bbGetContainingWindow();
+      }
+    return 0;
+  }
+  //==================================================================
+
+
+  //==================================================================
+  wxWindow* WxBlackBox::bbGetWxParent() { return Wx::GetTopWindow(); }
+  //==================================================================
+  
+  
+  //==================================================================
+  bool WxBlackBox::bbIsShown()
+  {
+    if (bbGetContainingWindow()!=0)
+      return bbGetContainingWindow()->bbIsShown();
+    return false;
+  }
+  //==================================================================
 
 
 }//namespace bbtk