]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkWx.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkWx.cxx
index aa05db7b0633e969f12352490573b3335a180011..ec1327fb8c1b4f3da3f178413e24eb953fc5e8c2 100644 (file)
 
 #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);
+       wxInitialize();
+      } 
+  }
+  //=========================================================================
 
   //=========================================================================
-  void Wx::CreateTopWindow(wxWindow* parent, bool autodestroy)
+  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::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 +164,7 @@ namespace bbtk
   // \BBTKWXSIG
 
   //=========================================================================
-  void Wx::AutoDestroyTopWindow(bool b)
+  void Wx::SetAutoDestroyTopWindow(bool b)
   {
     mgAutoDestroyTopWindow = b;
   }
@@ -92,14 +200,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 +226,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 +265,29 @@ namespace bbtk
   }
   //=========================================================================
   
+
+  //=========================================================================
+  Wx::BusyCursor::BusyCursor()
+  {
+    if (TopWindowExists()) 
+      {        
+       bbtkDebugMessage("wx",2,
+                        "Wx::BusyCursor::BusyCursor()"<<std::endl);
+       ::wxBeginBusyCursor(); 
+    }
+  }
+  Wx::BusyCursor::~BusyCursor()
+  {
+    if (TopWindowExists()) 
+      {        
+       bbtkDebugMessage("wx",2,
+                        "Wx::BusyCursor::~BusyCursor()"<<std::endl);
+       ::wxEndBusyCursor(); 
+      }
+  }
+  //=========================================================================
+
+  /*
   //=========================================================================
   void Wx::ResetCursor() 
   {
@@ -190,7 +312,7 @@ namespace bbtk
     ::wxEndBusyCursor();
   }
   //=========================================================================
-
+  */
 
 }