]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkWx.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkWx.cxx
index e186c7923a6b8342a768dcc99996ed0164c9324e..46712c4869ad4bcc1bc15da6845677437b2df7ef 100644 (file)
 
 namespace bbtk
 {
+  //=========================================================================
+  class WxApp;
+  //=========================================================================
 
-//EED
+  //=========================================================================
+  static WxApp* mgWxApp = 0;
   static wxWindow* mgTopWindow = 0;
+  static wxWindow* mgTopWindowParent = 0;
+  static bool mgAutoDestroyTopWindow = true;
   static int mgNbWindowsAlive  = 0;
   static int mgNbWindowsShown  = 0;
+  //=========================================================================
+
+  //=========================================================================
+  // BBTKWXSIG
+  static Wx::Signal_type mgWxSignal;
+  // \BBTKWXSIG
+  //=========================================================================
 
-  void Wx::CreateInvisibleTopWindow()
+  //=========================================================================
+  // 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::CreateTopWindowIfNeeded()
   {
-    wxWindow* top = new wxFrame(0,-1,_T("TOP (YOU SHOULD NOT SEE ME !!)"));
+    if (mgTopWindow!=0) return;
+    bbtkDebugMessage("wx",1,"  --> Creating bbtk top window"<<std::endl);
+
+    CreateWxAppIfNeeded();
+
+    wxWindow* top = 
+      new wxFrame(mgTopWindowParent,
+                 -1,
+                 _T("TOP BBTK FRAME (YOU SHOULD NOT SEE ME !!)"));
     top->Hide();
+
     Wx::SetTopWindow(top);
   }
-  void Wx::ResetCursor() 
+  //=========================================================================
+
+  //=========================================================================
+  void Wx::DestroyTopWindowIfNeeded()
   {
-    if (!GetTopWindow()) return;
-    bbtkDebugMessage("wx",9,"wx::ResetCursor()"<<std::endl);
-    while (wxIsBusy()) ::wxEndBusyCursor();
+    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);
+
+      }
   }
-  void Wx::BeginBusyCursor() 
+  //=========================================================================
+
+  //=========================================================================
+  wxWindow* Wx::GetTopWindow() 
+  { 
+    Wx::CreateTopWindowIfNeeded();
+    return mgTopWindow; 
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  bool Wx::TopWindowExists()
   {
-    if (!GetTopWindow()) return;
-    bbtkDebugMessage("wx",9,"wx::BeginBusyCursor()"<<std::endl);
-    ::wxBeginBusyCursor();
+    return (mgTopWindow!=0);
   }
-  void Wx::EndBusyCursor()
+  //=========================================================================
+
+  // BBTKWXSIG
+  //=========================================================================
+  void Wx::AddSignalObserver(Slot_function_type f)
   {
-    if (!GetTopWindow()) return;
-    bbtkDebugMessage("wx",9,"wx::EndBusyCursor()"<<std::endl);
-    ::wxEndBusyCursor();
+    mgWxSignal.connect(f);
+  }
+  //=========================================================================
+  // \BBTKWXSIG
+
+  //=========================================================================
+  void Wx::SetAutoDestroyTopWindow(bool b)
+  {
+    mgAutoDestroyTopWindow = b;
   }
+  //=========================================================================
   
   //=========================================================================
   void Wx::SetTopWindow(wxWindow* w) 
@@ -47,77 +182,139 @@ namespace bbtk
     mgTopWindow = w;
   }
   //=========================================================================
+
+
   //=========================================================================
-  void Wx::DecNbWindowsAlive()
+  void Wx::IncNbWindowsAlive() 
   { 
-    mgNbWindowsAlive--; 
-    /*
-    if ( (bbmgNbWindowsAlive==0) && 
-        bbmgTopWindow && (!bbmgTopWindow->IsShown()))
-      {
-       bbmgTopWindow->Close();
-      }
-    */
+    mgNbWindowsAlive++; 
+    bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
+                    <<std::endl);
+    // BBTKWXSIG
+    mgWxSignal();
+    // \BBTKWXSIG
   }
   //=========================================================================
 
   //=========================================================================
-  void Wx::DecNbWindowsShown()
+  void Wx::DecNbWindowsAlive()
   { 
-    mgNbWindowsShown--; 
-    if ( (mgNbWindowsShown==0) && 
-        mgTopWindow && (!mgTopWindow->IsShown()))
-      {
-       mgTopWindow->Close();
-      }
+    mgNbWindowsAlive--; 
+    bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
+                    <<std::endl);
+
+    DestroyTopWindowIfNeeded();
+     // BBTKWXSIG
+    mgWxSignal();
+    // \BBTKWXSIG
   }
   //=========================================================================
-
+  
   //=========================================================================
-/*EED
-  // Static members 
-  wxWindow* Wx::mgTopWindow = 0;
-  int Wx::mgNbWindowsAlive  = 0;
-  int Wx::mgNbWindowsShown  = 0;
-*/
+  void Wx::IncNbWindowsShown() 
+  { 
+    mgNbWindowsShown++; 
+    bbtkDebugMessage("wx",2,"* Number of windows shown = "<<mgNbWindowsShown
+                    <<std::endl);
+    // BBTKWXSIG
+    mgWxSignal();
+    // \BBTKWXSIG
+  }
   //=========================================================================
 
+  //=========================================================================
+  void Wx::DecNbWindowsShown()
+  { 
+    mgNbWindowsShown--; 
+    bbtkDebugMessage("wx",2,"* Number of windows shown = "<<mgNbWindowsShown
+                    <<std::endl);
 
-//EED
-    wxWindow* Wx::GetTopWindow() 
-       { 
-               return mgTopWindow; 
-       }
-
-    void Wx::IncNbWindowsAlive() 
-       { 
-               mgNbWindowsAlive++; 
-       }
+    DestroyTopWindowIfNeeded();
 
-    int  Wx::GetNbWindowsAlive() 
-       { 
-               return mgNbWindowsAlive; 
-       }
+    // BBTKWXSIG
+    mgWxSignal();
+    // \BBTKWXSIG
+  }
+  //=========================================================================
 
-    bool Wx::IsSomeWindowAlive() 
-       { 
-               return (mgNbWindowsAlive>0);
-       }
 
-    void Wx::IncNbWindowsShown() 
-       { 
-               mgNbWindowsShown++; 
-       }
+  //=========================================================================
+  int  Wx::GetNbWindowsAlive() 
+  { 
+    return mgNbWindowsAlive; 
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  bool Wx::IsSomeWindowAlive() 
+  { 
+    return (mgNbWindowsAlive>0);
+  }
+  //=========================================================================
+  
+  
+  //=========================================================================
+  int  Wx::GetNbWindowsShown() 
+  { 
+    return mgNbWindowsShown; 
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  bool Wx::IsSomeWindowShown() 
+  { 
+    return (mgNbWindowsShown>0);
+  }
+  //=========================================================================
+  
 
-    int  Wx::GetNbWindowsShown() 
-       { 
-               return mgNbWindowsShown; 
-       }
+  //=========================================================================
+  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(); 
+      }
+  }
+  //=========================================================================
 
-    bool Wx::IsSomeWindowShown() 
-       { 
-               return (mgNbWindowsShown>0);
-       }
+  /*
+  //=========================================================================
+  void Wx::ResetCursor() 
+  {
+    if (!TopWindowExists()) return;
+    bbtkDebugMessage("wx",9,"Wx::ResetCursor()"<<std::endl);
+    while (wxIsBusy()) ::wxEndBusyCursor();
+  }
+  //=========================================================================
+  //=========================================================================
+  void Wx::BeginBusyCursor() 
+  {
+    if (!TopWindowExists()) return;
+    bbtkDebugMessage("wx",9,"Wx::BeginBusyCursor()"<<std::endl);
+    ::wxBeginBusyCursor();
+  }
+  //=========================================================================
+  //=========================================================================
+  void Wx::EndBusyCursor()
+  {
+    if (!TopWindowExists()) return;
+    bbtkDebugMessage("wx",9,"Wx::EndBusyCursor()"<<std::endl);
+    ::wxEndBusyCursor();
+  }
+  //=========================================================================
+  */
 
 }