]> 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         wxInitialize();
63       } 
64   }
65   //=========================================================================
66
67   //=========================================================================
68   void Wx::DestroyWxAppIfNeeded()
69   {
70     if (mgWxApp!= 0) 
71       {
72         bbtkDebugMessage("wx",1,"  --> Destructing bbtk WxApp"<<std::endl);
73         //delete mgWxApp;
74         //      mgWxApp = 0;
75         // Uninit wx
76         //      wxUninitialize();
77       }
78   }
79   //=========================================================================
80
81   //=========================================================================  
82   void Wx::SetTopWindowParent(wxWindow* w)
83   {
84     if (mgTopWindowParent != 0)
85       {
86         bbtkGlobalError("Wx::SetTopWindowParent : top window parent != 0");
87       }
88     mgTopWindowParent = w;
89   }
90   //=========================================================================
91
92   //=========================================================================
93   void Wx::CreateTopWindowIfNeeded()
94   {
95     if (mgTopWindow!=0) return;
96     bbtkDebugMessage("wx",1,"  --> Creating bbtk top window"<<std::endl);
97
98     CreateWxAppIfNeeded();
99
100     wxWindow* top = 
101       new wxFrame(mgTopWindowParent,
102                   -1,
103                   _T("TOP BBTK FRAME (YOU SHOULD NOT SEE ME !!)"));
104     top->Hide();
105
106     Wx::SetTopWindow(top);
107   }
108   //=========================================================================
109
110   //=========================================================================
111   void Wx::DestroyTopWindowIfNeeded()
112   {
113     if ( (mgNbWindowsAlive==0) && 
114          (mgAutoDestroyTopWindow) )
115       {
116         bbtkDebugMessage("wx",1,"  --> Destructing bbtk top window"<<std::endl);
117         mgTopWindow->Close();
118         mgTopWindow = 0;
119         
120         DestroyWxAppIfNeeded();
121       }
122   } 
123   //=========================================================================
124
125   //=========================================================================
126   void Wx::LoopUntilAllWindowsClose()
127   {
128     int i = 0;
129     while (mgTopWindow != 0)
130       {
131         if (i % 100 == 0) 
132           {
133             bbtkDebugMessage("wx",2,"Wx::Loop "<<i << std::endl);
134           }
135         i++;
136         wxMilliSleep(10);
137
138       }
139   }
140   //=========================================================================
141
142   //=========================================================================
143   wxWindow* Wx::GetTopWindow() 
144   { 
145     Wx::CreateTopWindowIfNeeded();
146     return mgTopWindow; 
147   }
148   //=========================================================================
149   
150   //=========================================================================
151   bool Wx::TopWindowExists()
152   {
153     return (mgTopWindow!=0);
154   }
155   //=========================================================================
156
157   // BBTKWXSIG
158   //=========================================================================
159   void Wx::AddSignalObserver(Slot_function_type f)
160   {
161     mgWxSignal.connect(f);
162   }
163   //=========================================================================
164   // \BBTKWXSIG
165
166   //=========================================================================
167   void Wx::SetAutoDestroyTopWindow(bool b)
168   {
169     mgAutoDestroyTopWindow = b;
170   }
171   //=========================================================================
172   
173   //=========================================================================
174   void Wx::SetTopWindow(wxWindow* w) 
175   {
176     if ( mgTopWindow ) 
177       {
178         bbtkGlobalError("wx::SetTopWindow : top window already set !");
179       } 
180     mgTopWindow = w;
181   }
182   //=========================================================================
183
184
185   //=========================================================================
186   void Wx::IncNbWindowsAlive() 
187   { 
188     mgNbWindowsAlive++; 
189     bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
190                      <<std::endl);
191     // BBTKWXSIG
192     mgWxSignal();
193     // \BBTKWXSIG
194   }
195   //=========================================================================
196
197   //=========================================================================
198   void Wx::DecNbWindowsAlive()
199   { 
200     mgNbWindowsAlive--; 
201     bbtkDebugMessage("wx",2,"* Number of windows alive = "<<mgNbWindowsAlive
202                      <<std::endl);
203
204     DestroyTopWindowIfNeeded();
205      // BBTKWXSIG
206     mgWxSignal();
207     // \BBTKWXSIG
208   }
209   //=========================================================================
210   
211   //=========================================================================
212   void Wx::IncNbWindowsShown() 
213   { 
214     mgNbWindowsShown++; 
215     bbtkDebugMessage("wx",2,"* Number of windows shown = "<<mgNbWindowsShown
216                      <<std::endl);
217     // BBTKWXSIG
218     mgWxSignal();
219     // \BBTKWXSIG
220   }
221   //=========================================================================
222
223   //=========================================================================
224   void Wx::DecNbWindowsShown()
225   { 
226     mgNbWindowsShown--; 
227     bbtkDebugMessage("wx",2,"* Number of windows shown = "<<mgNbWindowsShown
228                      <<std::endl);
229
230     DestroyTopWindowIfNeeded();
231
232     // BBTKWXSIG
233     mgWxSignal();
234     // \BBTKWXSIG
235   }
236   //=========================================================================
237
238
239   //=========================================================================
240   int  Wx::GetNbWindowsAlive() 
241   { 
242     return mgNbWindowsAlive; 
243   }
244   //=========================================================================
245   
246   //=========================================================================
247   bool Wx::IsSomeWindowAlive() 
248   { 
249     return (mgNbWindowsAlive>0);
250   }
251   //=========================================================================
252   
253   
254   //=========================================================================
255   int  Wx::GetNbWindowsShown() 
256   { 
257     return mgNbWindowsShown; 
258   }
259   //=========================================================================
260   
261   //=========================================================================
262   bool Wx::IsSomeWindowShown() 
263   { 
264     return (mgNbWindowsShown>0);
265   }
266   //=========================================================================
267   
268
269   //=========================================================================
270   Wx::BusyCursor::BusyCursor()
271   {
272     if (TopWindowExists()) 
273       {         
274         bbtkDebugMessage("wx",2,
275                          "Wx::BusyCursor::BusyCursor()"<<std::endl);
276         ::wxBeginBusyCursor(); 
277     }
278   }
279   Wx::BusyCursor::~BusyCursor()
280   {
281     if (TopWindowExists()) 
282       {         
283         bbtkDebugMessage("wx",2,
284                          "Wx::BusyCursor::~BusyCursor()"<<std::endl);
285         ::wxEndBusyCursor(); 
286       }
287   }
288   //=========================================================================
289
290   /*
291   //=========================================================================
292   void Wx::ResetCursor() 
293   {
294     if (!TopWindowExists()) return;
295     bbtkDebugMessage("wx",9,"Wx::ResetCursor()"<<std::endl);
296     while (wxIsBusy()) ::wxEndBusyCursor();
297   }
298   //=========================================================================
299   //=========================================================================
300   void Wx::BeginBusyCursor() 
301   {
302     if (!TopWindowExists()) return;
303     bbtkDebugMessage("wx",9,"Wx::BeginBusyCursor()"<<std::endl);
304     ::wxBeginBusyCursor();
305   }
306   //=========================================================================
307   //=========================================================================
308   void Wx::EndBusyCursor()
309   {
310     if (!TopWindowExists()) return;
311     bbtkDebugMessage("wx",9,"Wx::EndBusyCursor()"<<std::endl);
312     ::wxEndBusyCursor();
313   }
314   //=========================================================================
315   */
316
317 }
318
319 #endif