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