]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkWx.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkWx.cxx
index 0c6b568845000dac95201c57b6bde2aa1cbef2bd..29567ff69b031e4f560e8f102a8572fe2f7d6682 100644 (file)
@@ -1,3 +1,33 @@
+/*=========================================================================                                                                               
+  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"
 
 namespace bbtk
 {
-  void wx::ResetCursor() 
+  //=========================================================================
+  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;
+  //=========================================================================
+
+  //=========================================================================
+  // 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::CreateTopWindowIfNeeded()
+  {
+    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::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() 
+  { 
+    Wx::CreateTopWindowIfNeeded();
+    return mgTopWindow; 
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  bool Wx::TopWindowExists()
+  {
+    return (mgTopWindow!=0);
+  }
+  //=========================================================================
+
+  // BBTKWXSIG
+  //=========================================================================
+  void Wx::AddSignalObserver(Slot_function_type f)
+  {
+    mgWxSignal.connect(f);
+  }
+  //=========================================================================
+  // \BBTKWXSIG
+
+  //=========================================================================
+  void Wx::SetAutoDestroyTopWindow(bool b)
+  {
+    mgAutoDestroyTopWindow = b;
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  void Wx::SetTopWindow(wxWindow* w) 
   {
-    bbtkDebugMessage("Wx",9,"wx::ResetCursor()"<<std::endl);
+    if ( mgTopWindow ) 
+      {
+       bbtkGlobalError("wx::SetTopWindow : top window already set !");
+      } 
+    mgTopWindow = w;
+  }
+  //=========================================================================
+
+
+  //=========================================================================
+  void Wx::IncNbWindowsAlive() 
+  { 
+    mgNbWindowsAlive++; 
+    bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
+                    <<std::endl);
+    // BBTKWXSIG
+    mgWxSignal();
+    // \BBTKWXSIG
+  }
+  //=========================================================================
+
+  //=========================================================================
+  void Wx::DecNbWindowsAlive()
+  { 
+    mgNbWindowsAlive--; 
+    bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
+                    <<std::endl);
+
+    DestroyTopWindowIfNeeded();
+     // BBTKWXSIG
+    mgWxSignal();
+    // \BBTKWXSIG
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  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);
+
+    DestroyTopWindowIfNeeded();
+
+    // BBTKWXSIG
+    mgWxSignal();
+    // \BBTKWXSIG
+  }
+  //=========================================================================
+
+
+  //=========================================================================
+  int  Wx::GetNbWindowsAlive() 
+  { 
+    return mgNbWindowsAlive; 
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  bool Wx::IsSomeWindowAlive() 
+  { 
+    return (mgNbWindowsAlive>0);
+  }
+  //=========================================================================
+  
+  
+  //=========================================================================
+  int  Wx::GetNbWindowsShown() 
+  { 
+    return mgNbWindowsShown; 
+  }
+  //=========================================================================
+  
+  //=========================================================================
+  bool Wx::IsSomeWindowShown() 
+  { 
+    return (mgNbWindowsShown>0);
+  }
+  //=========================================================================
+  
+
+  //=========================================================================
+  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() 
+  {
+    if (!TopWindowExists()) return;
+    bbtkDebugMessage("wx",9,"Wx::ResetCursor()"<<std::endl);
     while (wxIsBusy()) ::wxEndBusyCursor();
   }
-  void wx::BeginBusyCursor() 
+  //=========================================================================
+  //=========================================================================
+  void Wx::BeginBusyCursor() 
   {
-    bbtkDebugMessage("Wx",9,"wx::BeginBusyCursor()"<<std::endl);
+    if (!TopWindowExists()) return;
+    bbtkDebugMessage("wx",9,"Wx::BeginBusyCursor()"<<std::endl);
     ::wxBeginBusyCursor();
   }
-  void wx::EndBusyCursor()
+  //=========================================================================
+  //=========================================================================
+  void Wx::EndBusyCursor()
   {
-    bbtkDebugMessage("Wx",9,"wx::EndBusyCursor()"<<std::endl);
+    if (!TopWindowExists()) return;
+    bbtkDebugMessage("wx",9,"Wx::EndBusyCursor()"<<std::endl);
     ::wxEndBusyCursor();
   }
-  
+  //=========================================================================
+  */
 
 }