]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkWx.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkWx.cxx
index aa05db7b0633e969f12352490573b3335a180011..29567ff69b031e4f560e8f102a8572fe2f7d6682 100644 (file)
+/*=========================================================================                                                                               
+  Program:   bbtk
+  Module:    $RCSfile: bbtkWx.cxx,v $
+  Language:  C++
+  Date:      $Date: 2008/10/21 13:55:49 $
+  Version:   $Revision: 1.11 $
+=========================================================================*/
+
+/* ---------------------------------------------------------------------
+
+* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
+* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
+*
+*  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.
+* ------------------------------------------------------------------------ */                                                                         
+
 #ifdef _USE_WXWIDGETS_
 
 #include "bbtkWx.h"
 #include "bbtkMessageManager.h"
-#include <boost/signal.hpp>
-//#include <boost/bind.hpp>
 
 namespace bbtk
 {
+  //=========================================================================
+  class WxApp;
+  //=========================================================================
 
+  //=========================================================================
+  static WxApp* mgWxApp = 0;
   static wxWindow* mgTopWindow = 0;
+  static wxWindow* mgTopWindowParent = 0;
+  static bool mgAutoDestroyTopWindow = true;
   static int mgNbWindowsAlive  = 0;
   static int mgNbWindowsShown  = 0;
-  static bool mgAutoDestroyTopWindow = true;
+  //=========================================================================
 
+  //=========================================================================
   // BBTKWXSIG
   static Wx::Signal_type mgWxSignal;
   // \BBTKWXSIG
+  //=========================================================================
+
+  //=========================================================================
+  // The wxApp class which is used when no user wxApp was created
+  class WxApp : public wxApp
+  {
+  public:
+    bool OnInit( );
+    int  OnExit() { return true; }
+  };
+  //=========================================================================
+  IMPLEMENT_APP_NO_MAIN(WxApp);
+  //=========================================================================
+  bool WxApp::OnInit( )
+  {     
+    wxApp::OnInit();
+#ifdef __WXGTK__
+    //See http://www.wxwindows.org/faqgtk.htm#locale
+    setlocale(LC_NUMERIC, "C");
+#endif
+    return true;
+  }
+  //=========================================================================
+
+  //=========================================================================
+  void Wx::CreateWxAppIfNeeded()
+  {
+    if (wxApp::GetInstance()==0)
+      {
+       if (mgWxApp != 0) 
+         {
+           bbtkGlobalError("Wx::CreateWxAppIfNeeded() : INTERNAL ERROR ! (wxApp::GetInstance()==0) && (mgWxApp != 0)");
+         }
+       bbtkDebugMessage("wx",1,"  --> Creating bbtk wxApp"<<std::endl);
+       mgWxApp = new WxApp;
+       wxApp::SetInstance(mgWxApp);
+       //int argc = 0;
+       //wxEntry(argc,0);
+       wxInitialize();
+      } 
+  }
+  //=========================================================================
 
+  //=========================================================================
+  void Wx::DestroyWxAppIfNeeded()
+  {
+    if (mgWxApp!= 0) 
+      {
+       bbtkDebugMessage("wx",1,"  --> Destructing bbtk WxApp"<<std::endl);
+       //delete mgWxApp;
+       //      mgWxApp = 0;
+       // Uninit wx
+       //      wxUninitialize();
+      }
+  }
+  //=========================================================================
 
+  //=========================================================================  
+  void Wx::SetTopWindowParent(wxWindow* w)
+  {
+    if (mgTopWindowParent != 0)
+      {
+       bbtkGlobalError("Wx::SetTopWindowParent : top window parent != 0");
+      }
+    mgTopWindowParent = w;
+  }
   //=========================================================================
-  void Wx::CreateTopWindow(wxWindow* parent, bool autodestroy)
+
+  //=========================================================================
+  void Wx::CreateTopWindowIfNeeded()
   {
+    if (mgTopWindow!=0) return;
+    bbtkDebugMessage("wx",1,"  --> Creating bbtk top window"<<std::endl);
+
+    CreateWxAppIfNeeded();
+
     wxWindow* top = 
-      new wxFrame(parent,
+      new wxFrame(mgTopWindowParent,
                  -1,
                  _T("TOP BBTK FRAME (YOU SHOULD NOT SEE ME !!)"));
     top->Hide();
+
     Wx::SetTopWindow(top);
-    mgAutoDestroyTopWindow = autodestroy;
   }
   //=========================================================================
-  
+
+  //=========================================================================
+  void Wx::DestroyTopWindowIfNeeded()
+  {
+    if ( (mgNbWindowsAlive==0) && 
+        (mgAutoDestroyTopWindow) )
+      {
+       bbtkDebugMessage("wx",1,"  --> Destructing bbtk top window"<<std::endl);
+       mgTopWindow->Close();
+       mgTopWindow = 0;
+       
+       DestroyWxAppIfNeeded();
+      }
+  } 
+  //=========================================================================
+
+  //=========================================================================
+  void Wx::LoopUntilAllWindowsClose()
+  {
+    int i = 0;
+    while (mgTopWindow != 0)
+      {
+       if (i % 100 == 0) 
+         {
+           bbtkDebugMessage("wx",2,"Wx::Loop "<<i << std::endl);
+         }
+       i++;
+       wxMilliSleep(10);
+
+      }
+  }
+  //=========================================================================
+
   //=========================================================================
   wxWindow* Wx::GetTopWindow() 
   { 
-    if (mgTopWindow==0) Wx::CreateTopWindow(0);
+    Wx::CreateTopWindowIfNeeded();
     return mgTopWindow; 
   }
   //=========================================================================
@@ -56,7 +196,7 @@ namespace bbtk
   // \BBTKWXSIG
 
   //=========================================================================
-  void Wx::AutoDestroyTopWindow(bool b)
+  void Wx::SetAutoDestroyTopWindow(bool b)
   {
     mgAutoDestroyTopWindow = b;
   }
@@ -92,14 +232,9 @@ namespace bbtk
     mgNbWindowsAlive--; 
     bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
                     <<std::endl);
-    if ( (mgNbWindowsAlive==0) && 
-        (mgAutoDestroyTopWindow) )
-      {
-    bbtkDebugMessage("wx",2,"  --> Destructing top window"<<std::endl);
-       mgTopWindow->Close();
-       mgTopWindow = 0;
-      }
-    // BBTKWXSIG
+
+    DestroyTopWindowIfNeeded();
+     // BBTKWXSIG
     mgWxSignal();
     // \BBTKWXSIG
   }
@@ -123,13 +258,9 @@ namespace bbtk
     mgNbWindowsShown--; 
     bbtkDebugMessage("wx",2,"* Number of windows shown = "<<mgNbWindowsShown
                     <<std::endl);
-    if ( (mgNbWindowsAlive==0) && 
-        (mgAutoDestroyTopWindow) )
-      {
-       bbtkDebugMessage("wx",2,"  --> Destructing top window"<<std::endl);
-       mgTopWindow->Close();
-       mgTopWindow = 0;
-      }
+
+    DestroyTopWindowIfNeeded();
+
     // BBTKWXSIG
     mgWxSignal();
     // \BBTKWXSIG
@@ -166,6 +297,26 @@ namespace bbtk
   }
   //=========================================================================
   
+
+  //=========================================================================
+  Wx::BusyCursor::BusyCursor()
+  {
+    mCursor = 0;
+    if (TopWindowExists()) 
+      {        
+       bbtkDebugMessage("wx",2,
+                        "Wx::BusyCursor::BusyCursor()"<<std::endl);
+          mCursor = new wxBusyCursor; 
+       //::wxBeginBusyCursor(); 
+    }
+  }
+  Wx::BusyCursor::~BusyCursor()
+  {
+    if (mCursor) delete mCursor;
+  }
+  //=========================================================================
+
+  /*
   //=========================================================================
   void Wx::ResetCursor() 
   {
@@ -190,7 +341,7 @@ namespace bbtk
     ::wxEndBusyCursor();
   }
   //=========================================================================
-
+  */
 
 }