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
{
- if (!GetTopWindow()) return;
- bbtkDebugMessage("Wx",9,"wx::ResetCursor()"<<std::endl);
- while (wxIsBusy()) ::wxEndBusyCursor();
+ 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::BeginBusyCursor()
+ //=========================================================================
+
+ //=========================================================================
+ void Wx::CreateWxAppIfNeeded()
{
- if (!GetTopWindow()) return;
- bbtkDebugMessage("Wx",9,"wx::BeginBusyCursor()"<<std::endl);
- ::wxBeginBusyCursor();
+ 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::EndBusyCursor()
+ //=========================================================================
+
+ //=========================================================================
+ void Wx::DestroyWxAppIfNeeded()
{
- if (!GetTopWindow()) return;
- bbtkDebugMessage("Wx",9,"wx::EndBusyCursor()"<<std::endl);
- ::wxEndBusyCursor();
+ 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)
mgTopWindow = w;
}
//=========================================================================
+
+
+ //=========================================================================
+ void Wx::IncNbWindowsAlive()
+ {
+ mgNbWindowsAlive++;
+ bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
+ <<std::endl);
+ // BBTKWXSIG
+ mgWxSignal();
+ // \BBTKWXSIG
+ }
+ //=========================================================================
+
//=========================================================================
void Wx::DecNbWindowsAlive()
{
mgNbWindowsAlive--;
- /*
- if ( (bbmgNbWindowsAlive==0) &&
- bbmgTopWindow && (!bbmgTopWindow->IsShown()))
- {
- bbmgTopWindow->Close();
- }
- */
+ 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--;
- if ( (mgNbWindowsShown==0) &&
- mgTopWindow && (!mgTopWindow->IsShown()))
- {
- mgTopWindow->Close();
- }
+ bbtkDebugMessage("wx",2,"* Number of windows shown = "<<mgNbWindowsShown
+ <<std::endl);
+
+ DestroyTopWindowIfNeeded();
+
+ // BBTKWXSIG
+ mgWxSignal();
+ // \BBTKWXSIG
}
//=========================================================================
+
+ //=========================================================================
+ int Wx::GetNbWindowsAlive()
+ {
+ return mgNbWindowsAlive;
+ }
//=========================================================================
- // Static members
- wxWindow* Wx::mgTopWindow = 0;
- int Wx::mgNbWindowsAlive = 0;
- int Wx::mgNbWindowsShown = 0;
+
//=========================================================================
+ bool Wx::IsSomeWindowAlive()
+ {
+ return (mgNbWindowsAlive>0);
+ }
+ //=========================================================================
+
+
+ //=========================================================================
+ int Wx::GetNbWindowsShown()
+ {
+ return mgNbWindowsShown;
+ }
+ //=========================================================================
+
+ //=========================================================================
+ bool Wx::IsSomeWindowShown()
+ {
+ return (mgNbWindowsShown>0);
+ }
+ //=========================================================================
+
+ //=========================================================================
+ 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()
+ {
+ 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();
+ }
+ //=========================================================================
+ */
}