]> Creatis software - bbtk.git/blob - kernel/src/bbtkWx.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkWx.cxx
1 #ifdef _USE_WXWIDGETS_
2
3 #include "bbtkWx.h"
4 #include "bbtkMessageManager.h"
5
6 namespace bbtk
7 {
8   //=========================================================================
9   class WxApp;
10   //=========================================================================
11
12   //=========================================================================
13   static WxApp* mgWxApp = 0;
14   static wxWindow* mgTopWindow = 0;
15   static wxWindow* mgTopWindowParent = 0;
16   static bool mgAutoDestroyTopWindow = true;
17   static int mgNbWindowsAlive  = 0;
18   static int mgNbWindowsShown  = 0;
19   //=========================================================================
20
21   //=========================================================================
22   // BBTKWXSIG
23   static Wx::Signal_type mgWxSignal;
24   // \BBTKWXSIG
25   //=========================================================================
26
27  
28   //=========================================================================
29   // The wxApp class which is used when no user wxApp was created
30   class WxApp : public wxApp
31   {
32   public:
33     bool OnInit( );
34     int  OnExit() { return true; }
35   };
36   //=========================================================================
37   IMPLEMENT_APP_NO_MAIN(WxApp);
38   //=========================================================================
39   bool WxApp::OnInit( )
40   {      
41     wxApp::OnInit();
42 #ifdef __WXGTK__
43     //See http://www.wxwindows.org/faqgtk.htm#locale
44     setlocale(LC_NUMERIC, "C");
45 #endif
46     return true;
47   }
48   //=========================================================================
49
50   //=========================================================================
51   void Wx::CreateWxAppIfNeeded()
52   {
53     if (wxApp::GetInstance()==0)
54       {
55         if (mgWxApp != 0) 
56           {
57             bbtkGlobalError("Wx::CreateWxAppIfNeeded() : INTERNAL ERROR ! (wxApp::GetInstance()==0) && (mgWxApp != 0)");
58           }
59         bbtkDebugMessage("wx",1,"  --> Creating bbtk wxApp"<<std::endl);
60         mgWxApp = new WxApp;
61         wxApp::SetInstance(mgWxApp);
62         //int argc = 0;
63         //wxEntry(argc,0);
64         wxInitialize();
65       } 
66   }
67   //=========================================================================
68
69   //=========================================================================
70   void Wx::DestroyWxAppIfNeeded()
71   {
72     if (mgWxApp!= 0) 
73       {
74         bbtkDebugMessage("wx",1,"  --> Destructing bbtk WxApp"<<std::endl);
75         //delete mgWxApp;
76         //      mgWxApp = 0;
77         // Uninit wx
78         //      wxUninitialize();
79       }
80   }
81   //=========================================================================
82
83   //=========================================================================  
84   void Wx::SetTopWindowParent(wxWindow* w)
85   {
86     if (mgTopWindowParent != 0)
87       {
88         bbtkGlobalError("Wx::SetTopWindowParent : top window parent != 0");
89       }
90     mgTopWindowParent = w;
91   }
92   //=========================================================================
93
94   //=========================================================================
95   void Wx::CreateTopWindowIfNeeded()
96   {
97     if (mgTopWindow!=0) return;
98     bbtkDebugMessage("wx",1,"  --> Creating bbtk top window"<<std::endl);
99
100     CreateWxAppIfNeeded();
101
102     wxWindow* top = 
103       new wxFrame(mgTopWindowParent,
104                   -1,
105                   _T("TOP BBTK FRAME (YOU SHOULD NOT SEE ME !!)"));
106     top->Hide();
107
108     Wx::SetTopWindow(top);
109   }
110   //=========================================================================
111
112   //=========================================================================
113   void Wx::DestroyTopWindowIfNeeded()
114   {
115     if ( (mgNbWindowsAlive==0) && 
116          (mgAutoDestroyTopWindow) )
117       {
118         bbtkDebugMessage("wx",1,"  --> Destructing bbtk top window"<<std::endl);
119         mgTopWindow->Close();
120         mgTopWindow = 0;
121         
122         DestroyWxAppIfNeeded();
123       }
124   } 
125   //=========================================================================
126
127   //=========================================================================
128   void Wx::LoopUntilAllWindowsClose()
129   {
130     int i = 0;
131     while (mgTopWindow != 0)
132       {
133         if (i % 100 == 0) 
134           {
135             bbtkDebugMessage("wx",2,"Wx::Loop "<<i << std::endl);
136           }
137         i++;
138         wxMilliSleep(10);
139
140       }
141   }
142   //=========================================================================
143
144   //=========================================================================
145   wxWindow* Wx::GetTopWindow() 
146   { 
147     Wx::CreateTopWindowIfNeeded();
148     return mgTopWindow; 
149   }
150   //=========================================================================
151   
152   //=========================================================================
153   bool Wx::TopWindowExists()
154   {
155     return (mgTopWindow!=0);
156   }
157   //=========================================================================
158
159   // BBTKWXSIG
160   //=========================================================================
161   void Wx::AddSignalObserver(Slot_function_type f)
162   {
163     mgWxSignal.connect(f);
164   }
165   //=========================================================================
166   // \BBTKWXSIG
167
168   //=========================================================================
169   void Wx::SetAutoDestroyTopWindow(bool b)
170   {
171     mgAutoDestroyTopWindow = b;
172   }
173   //=========================================================================
174   
175   //=========================================================================
176   void Wx::SetTopWindow(wxWindow* w) 
177   {
178     if ( mgTopWindow ) 
179       {
180         bbtkGlobalError("wx::SetTopWindow : top window already set !");
181       } 
182     mgTopWindow = w;
183   }
184   //=========================================================================
185
186
187   //=========================================================================
188   void Wx::IncNbWindowsAlive() 
189   { 
190     mgNbWindowsAlive++; 
191     bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
192                      <<std::endl);
193     // BBTKWXSIG
194     mgWxSignal();
195     // \BBTKWXSIG
196   }
197   //=========================================================================
198
199   //=========================================================================
200   void Wx::DecNbWindowsAlive()
201   { 
202     mgNbWindowsAlive--; 
203     bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
204                      <<std::endl);
205
206     DestroyTopWindowIfNeeded();
207      // BBTKWXSIG
208     mgWxSignal();
209     // \BBTKWXSIG
210   }
211   //=========================================================================
212   
213   //=========================================================================
214   void Wx::IncNbWindowsShown() 
215   { 
216     mgNbWindowsShown++; 
217     bbtkDebugMessage("wx",2,"* Number of windows shown = "<<mgNbWindowsShown
218                      <<std::endl);
219     // BBTKWXSIG
220     mgWxSignal();
221     // \BBTKWXSIG
222   }
223   //=========================================================================
224
225   //=========================================================================
226   void Wx::DecNbWindowsShown()
227   { 
228     mgNbWindowsShown--; 
229     bbtkDebugMessage("wx",2,"* Number of windows shown = "<<mgNbWindowsShown
230                      <<std::endl);
231
232     DestroyTopWindowIfNeeded();
233
234     // BBTKWXSIG
235     mgWxSignal();
236     // \BBTKWXSIG
237   }
238   //=========================================================================
239
240
241   //=========================================================================
242   int  Wx::GetNbWindowsAlive() 
243   { 
244     return mgNbWindowsAlive; 
245   }
246   //=========================================================================
247   
248   //=========================================================================
249   bool Wx::IsSomeWindowAlive() 
250   { 
251     return (mgNbWindowsAlive>0);
252   }
253   //=========================================================================
254   
255   
256   //=========================================================================
257   int  Wx::GetNbWindowsShown() 
258   { 
259     return mgNbWindowsShown; 
260   }
261   //=========================================================================
262   
263   //=========================================================================
264   bool Wx::IsSomeWindowShown() 
265   { 
266     return (mgNbWindowsShown>0);
267   }
268   //=========================================================================
269   
270
271   //=========================================================================
272   Wx::BusyCursor::BusyCursor()
273   {
274     if (TopWindowExists()) 
275       {         
276         bbtkDebugMessage("wx",2,
277                          "Wx::BusyCursor::BusyCursor()"<<std::endl);
278         ::wxBeginBusyCursor(); 
279     }
280   }
281   Wx::BusyCursor::~BusyCursor()
282   {
283     if (TopWindowExists()) 
284       {         
285         bbtkDebugMessage("wx",2,
286                          "Wx::BusyCursor::~BusyCursor()"<<std::endl);
287         ::wxEndBusyCursor(); 
288       }
289   }
290   //=========================================================================
291
292   /*
293   //=========================================================================
294   void Wx::ResetCursor() 
295   {
296     if (!TopWindowExists()) return;
297     bbtkDebugMessage("wx",9,"Wx::ResetCursor()"<<std::endl);
298     while (wxIsBusy()) ::wxEndBusyCursor();
299   }
300   //=========================================================================
301   //=========================================================================
302   void Wx::BeginBusyCursor() 
303   {
304     if (!TopWindowExists()) return;
305     bbtkDebugMessage("wx",9,"Wx::BeginBusyCursor()"<<std::endl);
306     ::wxBeginBusyCursor();
307   }
308   //=========================================================================
309   //=========================================================================
310   void Wx::EndBusyCursor()
311   {
312     if (!TopWindowExists()) return;
313     bbtkDebugMessage("wx",9,"Wx::EndBusyCursor()"<<std::endl);
314     ::wxEndBusyCursor();
315   }
316   //=========================================================================
317   */
318
319 }
320
321 #endif