]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.cxx
Fixed Window deletion mechanism
[bbtk.git] / kernel / src / bbtkWxBlackBox.cxx
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbtkWxBlackBox.cxx,v $
4   Language:  C++
5   Date:      $Date: 2009/05/28 08:12:06 $
6   Version:   $Revision: 1.41 $
7 =========================================================================*/
8
9 /* ---------------------------------------------------------------------
10
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
13 *
14 *  This software is governed by the CeCILL-B license under French law and 
15 *  abiding by the rules of distribution of free software. You can  use, 
16 *  modify and/ or redistribute the software under the terms of the CeCILL-B 
17 *  license as circulated by CEA, CNRS and INRIA at the following URL 
18 *  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
19 *  or in the file LICENSE.txt.
20 *
21 *  As a counterpart to the access to the source code and  rights to copy,
22 *  modify and redistribute granted by the license, users are provided only
23 *  with a limited warranty  and the software's author,  the holder of the
24 *  economic rights,  and the successive licensors  have only  limited
25 *  liability. 
26 *
27 *  The fact that you are presently reading this means that you have had
28 *  knowledge of the CeCILL-B license and that you accept its terms.
29 * ------------------------------------------------------------------------ */                                                                         
30
31
32 #ifdef _USE_WXWIDGETS_
33
34
35
36 /**
37  *  \file 
38  *  \brief 
39  */
40  
41 #include "bbtkWxBlackBox.h"
42 #include "bbtkBlackBoxOutputConnector.h"
43
44 //#include "bbtkWxContainerBlackBox.h"
45 #include <wx/dialog.h>
46
47 //#include "bbtkData.h"
48 //#include "bbtkFactory.h"
49
50
51
52
53 namespace bbtk
54 {
55
56
57
58  
59
60   //=========================================================================
61   // WxFrame
62   //=========================================================================
63
64   //==================================================================
65   class WxFrame : public wxFrame
66   {
67   public:
68     WxFrame(WxBlackBox::Pointer b,
69             wxWindow *parent,
70             wxString title,
71             wxSize size);
72     ~WxFrame();
73     void OnCloseWindow(wxCloseEvent& event);
74
75
76     WxBlackBox::WeakPointer mBox;      
77     DECLARE_EVENT_TABLE();
78     
79   };
80   
81   BEGIN_EVENT_TABLE(WxFrame, wxFrame)
82   //  EVT_CLOSE(WxFrame::OnCloseWindow)
83     END_EVENT_TABLE();
84      //==================================================================
85   
86      //==================================================================
87   WxFrame::WxFrame(WxBlackBox::Pointer b,
88                    wxWindow *parent,
89                    wxString title,
90                    wxSize size) 
91     : 
92     wxFrame( parent, 
93              -1, 
94              title,
95              wxDefaultPosition,
96              size,
97              wxRESIZE_BORDER | 
98              wxSYSTEM_MENU  |
99              wxCLOSE_BOX |
100              wxMAXIMIZE_BOX | 
101              wxMINIMIZE_BOX | 
102              wxCAPTION  
103              ),
104     mBox(b)
105   {   
106     bbtkDebugMessage("widget",9,"["<<b->bbGetName()<<"] WxFrame()"
107                      <<std::endl);
108     Wx::IncNbWindowsAlive();
109     b->bbSetWindow(this);
110     // Insert the widget into the window
111     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
112     b->bbUserCreateWidget(this);
113     wxWindow* widget = b->bbGetOutputWidget();
114     sizer->Add( widget, 1, wxALL|wxGROW, 2);
115     SetSizer(sizer);
116     Layout();
117   }
118   //==================================================================
119   //==================================================================
120   WxFrame::~WxFrame() 
121     { 
122       if (mBox.lock())
123         bbtkDebugMessage("widget",9,"["<<mBox.lock()->bbGetName()
124                          <<"] $$$$$$$$$$$$$$$$$$$ ~WxFrame()"
125                          <<std::endl);
126       else 
127         bbtkDebugMessage("widget",9,"[DEAD] $$$$$$$$$$$$$$$$$$$$$ ~WxFrame()"<<std::endl);
128       //bbtkDebugMessage("widget",9,"WxFrame::~WxFrame()"<<std::endl);
129       if (mBox.lock()) mBox.lock()->bbSetWindow(0); 
130       Wx::DecNbWindowsAlive();
131     }
132    //==================================================================
133    //==================================================================
134   void WxFrame::OnCloseWindow(wxCloseEvent& event)
135     {
136       if (mBox.lock())
137         bbtkDebugMessage("widget",9,"["<<mBox.lock()->bbGetName()
138                          <<"] $$$$$$$$$$$$$$$ WxFrame::OnCloseWindow()"<<std::endl);
139       else
140         bbtkDebugMessage("widget",9,"[DEAD] WxFrame::OnCloseWindow()"
141                          <<std::endl);
142       if (mBox.lock()) mBox.lock()->bbSetWindow(0); 
143       Wx::DecNbWindowsAlive();
144       
145         bbtkDebugMessage("widget",9,
146                          "$$$$$$$$$$$$$$$ Destroy !!!"<<std::endl);
147         //      this->Destroy();
148     }
149    //==================================================================
150
151
152
153
154
155   //=========================================================================
156   // WxDialog
157   //=========================================================================
158
159    //==================================================================
160   // Dialog window which is modal
161   class BBTK_EXPORT  WxDialog : public wxDialog
162   {
163   public:
164     WxDialog(WxBlackBox::Pointer box, 
165                      wxWindow *parent, 
166                      wxString title, 
167                      wxSize size);
168     ~WxDialog();
169     void OnCloseWindow(wxCloseEvent& event);
170
171
172     WxBlackBox::WeakPointer mBox;      
173     DECLARE_EVENT_TABLE();
174     
175   };
176   
177   BEGIN_EVENT_TABLE(WxDialog, wxDialog)
178     EVT_CLOSE(WxDialog::OnCloseWindow)
179     END_EVENT_TABLE();
180   //==================================================================
181
182   //=========================================================================
183   WxDialog::WxDialog(WxBlackBox::Pointer b,
184                      wxWindow *parent,
185                      wxString title,
186                      wxSize size)
187     :
188     wxDialog( parent, 
189                 -1, 
190                 title,
191                 wxDefaultPosition,
192                 size,
193                 wxRESIZE_BORDER | 
194                 wxSYSTEM_MENU  |
195                 wxCLOSE_BOX |
196                 wxMAXIMIZE_BOX | 
197                 wxMINIMIZE_BOX | 
198                 wxCAPTION  
199               ),
200     mBox(b)
201   {
202     bbtkDebugMessage("widget",9,"WxDialog::WxDialog ["<<b->bbGetName()<<"]"
203                      <<std::endl);
204     Wx::IncNbWindowsAlive();
205     b->bbSetWindow(this);
206     // Insert the widget into the window
207     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
208     b->bbUserCreateWidget(this);
209     wxWindow* widget = b->bbGetOutputWidget();
210     sizer->Add( widget, 1, wxALL|wxGROW, 2);
211     SetSizer(sizer);
212     Layout();
213   }
214   //=========================================================================
215   //==================================================================
216   WxDialog::~WxDialog() 
217     { 
218       bbtkDebugMessage("widget",9,"WxDialog::~WxDialog()"<<std::endl);
219       //bbtkDebugMessage("widget",9,"WxFrame::~WxFrame()"<<std::endl);
220       //      if (mBox.lock()) mBox.lock()->bbSetWindow(0); 
221       //      Wx::DecNbWindowsAlive();
222     }
223    //==================================================================
224    //==================================================================
225   void WxDialog::OnCloseWindow(wxCloseEvent& event)
226     {
227       bbtkDebugMessage("widget",9,"WxDialog::OnCloseWindow()"<<std::endl);
228       if (mBox.lock()) mBox.lock()->bbSetWindow(0); 
229       Wx::DecNbWindowsAlive();
230       this->Destroy();
231     }
232    //==================================================================
233
234
235
236
237
238
239
240  //=========================================================================
241   // WxBlackBox
242   //=========================================================================
243
244   //=========================================================================
245   //=========================================================================
246   //=========================================================================
247   //=========================================================================
248   BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,WidgetBlackBox<wxWindow>);
249   //=========================================================================
250   
251   //=========================================================================
252   void WxBlackBox::bbUserSetDefaultValues()
253   {
254     bbtkBlackBoxDebugMessage("widget",5,"WxBlackBox::bbUserSetDefaultValues()"<<std::endl);
255     //    bbSetWidgetEventHandler(0);
256     bbmWindow = 0;
257   }
258   //=========================================================================
259
260   //=========================================================================
261   void WxBlackBox::bbUserInitializeProcessing()
262   {
263   }
264   //==================================================================    
265
266   //=========================================================================
267   void WxBlackBox::bbUserFinalizeProcessing()
268   {
269     bbtkBlackBoxDebugMessage("widget",5,"==> WxBlackBox::bbUserFinalizeProcessing()"<<std::endl);
270     bbDestroyWindow();
271     bbtkBlackBoxDebugMessage("widget",5,"<== WxBlackBox::bbUserFinalizeProcessing()"<<std::endl);
272   }
273   //==================================================================    
274
275   //==================================================================    
276   /// Callback for creating a Dialog window (modal)
277   void WxBlackBox::bbCreateDialogWindow()
278   {
279   bbtkBlackBoxDebugMessage("widget",3,
280                      "==> WxBlackBox::bbCreateDialogWindow() - parent = "
281                      <<Wx::GetTopWindow()
282                      <<std::endl);
283     WxDialog* w = 0;  
284     w = new WxDialog( GetThisPointer<WxBlackBox>(),
285                       Wx::GetTopWindow(),
286                       std2wx( bbGetInputWinTitle()  
287                               + " - bbtk (c) CREATIS-LRMN"),
288                       wxSize( bbGetInputWinWidth() , 
289                               bbGetInputWinHeight() ) );
290     w->Show(false);
291     //    w->ShowModal();
292   } 
293   //=========================================================================
294
295   //==================================================================    
296
297   //==================================================================    
298   /// Callback for creating a Frame window 
299   void WxBlackBox::bbCreateFrameWindow()
300   {
301     bbtkBlackBoxDebugMessage("widget",3,
302                      "==> WxBlackBox::bbCreateFrameWindow() - parent = "
303                      <<Wx::GetTopWindow()
304                      <<std::endl);
305     WxFrame* w = 0;  
306     w = new WxFrame( GetThisPointer<WxBlackBox>(),
307                      Wx::GetTopWindow(),
308                      std2wx( bbGetInputWinTitle()  
309                              + " - bbtk (c) CREATIS-LRMN"),
310                      wxSize( bbGetInputWinWidth() , 
311                              bbGetInputWinHeight() ) );
312     w->Show();
313    }
314   //==================================================================    
315
316   //==================================================================    
317   void WxBlackBox::bbSetWindow(wxWindow* w) 
318   {
319     bbtkBlackBoxDebugMessage("widget",9,"==> WxBlackBox::bbSetWindow("<<w<<")"<<std::endl);
320     if ((bbmWindow != 0)&&(w!=0)) 
321       { 
322         std::cout << "ERRRRRRRROOOOR"<<std::endl; 
323       }
324     bbmWindow = w;
325   }
326   //==================================================================    
327
328   //==================================================================    
329   void WxBlackBox::bbShowWindow()
330   {
331     if ((bbmWindow) && (!bbIsShown()))
332       {
333         bbtkBlackBoxDebugMessage("widget",3,"==> WxBlackBox::bbShowWindow()"
334                          <<std::endl);
335         if (bbGetInputWinDialog()) 
336           {
337             ((WxDialog*)bbmWindow)->ShowModal();
338           }
339         else
340           {
341             bbGetWindow()->Show();
342             bbSetShown(true);
343           } 
344     }
345   }
346   //==================================================================    
347
348   //==================================================================    
349   void WxBlackBox::bbDestroyWindow()
350   {
351     bbtkBlackBoxDebugMessage("widget",3,"==> WxBlackBox::bbDestroyWindow("<<bbmWindow<<")"<<std::endl);
352     if (bbGetWindow()!=NULL) 
353       {
354         //       wxWindow* w = bbGetWindow();
355         //bbSetWindow(0);
356         // WE SHOULD DESTROY THE WINDOW WITH THE Close METHOD
357         // HOWEVER I
358         //w->Close(true);
359         //
360         delete bbGetWindow();
361         bbSetShown(false);
362       }
363     bbtkBlackBoxDebugMessage("widget",3,"<== WxBlackBox::bbDestroyWindow("<<bbmWindow<<")"<<std::endl);
364
365   }
366   //==================================================================    
367
368
369
370 }//namespace bbtk
371
372
373 #endif
374