]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.cxx
*** empty log message ***
[bbtk.git] / kernel / src / bbtkWxBlackBox.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkWxBlackBox.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/02/08 10:05:38 $
7   Version:   $Revision: 1.7 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18
19 #ifdef _USE_WXWIDGETS_
20
21
22
23 /**
24  *  \file 
25  *  \brief 
26  */
27  
28 #include "bbtkWxBlackBox.h"
29 //#include "bbtkWxContainerBlackBox.h"
30 #include <wx/dialog.h>
31
32 //#include "bbtkData.h"
33 //#include "bbtkFactory.h"
34
35
36
37
38 namespace bbtk
39 {
40
41
42
43
44   //=========================================================================
45   // WxBlackBoxWindow
46   //=========================================================================
47
48
49
50   //=========================================================================
51   WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox* box)
52     : mBox(box), mShown(false)
53   {
54     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
55                      mBox->bbGetFullName()<<")"<<std::endl);
56     mBox->bbSetWindow(this);
57     Wx::IncNbWindowsAlive();
58     bbtkDebugMessage("Wx",9," -> Number of windows alive = "
59                      <<Wx::GetNbWindowsAlive()<<std::endl);
60   }
61   //=========================================================================
62
63   //=========================================================================
64   WxBlackBoxWindow::~WxBlackBoxWindow()
65   {
66     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() ["<<
67                      mBox->bbGetFullName()<<"]"<<std::endl);
68     bbHide();
69     mBox->bbSetWindow(0);
70     Wx::DecNbWindowsAlive();
71     bbtkDebugMessage("Wx",9," -> Number of windows alive = "
72                      <<Wx::GetNbWindowsAlive()<<std::endl);
73      
74
75   }
76   //========================================================================= 
77
78   //=========================================================================
79   void WxBlackBoxWindow::bbShow()
80   {
81     if (bbIsShown()) return;
82     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<<
83                      mBox->bbGetFullName()<<"]"<<std::endl);
84     Wx::IncNbWindowsShown();
85     mShown = true;
86     bbtkDebugMessage("Wx",9," -> Number of windows shown = "
87                      <<Wx::GetNbWindowsShown()<<std::endl);
88   }
89   //=========================================================================
90
91   //=========================================================================
92   void WxBlackBoxWindow::bbHide()
93   {
94     if (!bbIsShown()) return;
95     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbHide() ["<<
96                      mBox->bbGetFullName()<<"]"<<std::endl);
97     Wx::DecNbWindowsShown();
98     mShown = false;
99     bbtkDebugMessage("Wx",9," -> Number of windows shown = "
100                      <<Wx::GetNbWindowsShown()<<std::endl);
101   }
102   //=========================================================================
103
104
105
106   //=========================================================================
107   // WxBlackBoxDialog
108   //=========================================================================
109
110   //=========================================================================
111   WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox* box,
112                                      wxWindow *parent,
113                                      wxString title,
114                                      wxSize size)
115     :
116     WxBlackBoxWindow(box),
117     wxDialog( parent, 
118                 -1, 
119                 title,
120                 wxDefaultPosition,
121                 size,
122                 wxRESIZE_BORDER | 
123                 wxSYSTEM_MENU  |
124                 wxCLOSE_BOX |
125                 wxMAXIMIZE_BOX | 
126                 wxMINIMIZE_BOX | 
127                 wxCAPTION  
128                 )
129   {
130     bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
131                      bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
132                      <<title<<",size)"<<std::endl);
133     // Insert the widget into the window
134     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
135     wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
136     widget->Reparent(this);
137     sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
138     //SetAutoLayout(true);
139     SetSizer(sizer);
140     Layout();
141   }
142   //=========================================================================
143   
144   //=========================================================================
145   void WxBlackBoxDialog::bbShow()
146   { 
147     bbtkDebugMessage("Wx",5,"WxBlackBoxDialog::bbShow() ["
148                      <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
149     WxBlackBoxWindow::bbShow();
150     SetReturnCode( wxDialog::ShowModal() ); 
151   }
152   //=========================================================================
153
154   //=========================================================================
155   void WxBlackBoxDialog::bbHide()
156   {
157     bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::bbHide() ["<<
158                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
159     WxBlackBoxWindow::bbHide();
160     Hide();
161   }
162   //=========================================================================
163
164   //=========================================================================
165   WxBlackBoxDialog::~WxBlackBoxDialog()
166   {
167   }
168   //=========================================================================
169
170
171
172
173
174   //=========================================================================
175   // WxBlackBoxFrame
176   //=========================================================================
177
178   //=========================================================================
179   WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox* box,
180                                    wxWindow *parent,
181                                    wxString title,
182                                    wxSize size)
183     : WxBlackBoxWindow(box),
184       wxFrame( parent, 
185                -1, 
186                title,
187                wxDefaultPosition,
188                size,
189                wxRESIZE_BORDER | 
190                wxSYSTEM_MENU  |
191                wxCLOSE_BOX |
192                wxMAXIMIZE_BOX | 
193                wxMINIMIZE_BOX | 
194                wxCAPTION  
195                )
196   {
197     bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
198                      bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
199                      <<title<<",size)"<<std::endl);
200     // Insert the widget into the window
201     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
202     wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
203     wxFrame* frame = (wxFrame*)this;
204     widget->Reparent(frame);
205     sizer->Add( widget, 1, wxALL|wxGROW, 2);
206     //  frame->SetAutoLayout(true);
207     frame->SetSizer(sizer);
208     //frame->Fit();
209     frame->Layout();
210   }
211   //=========================================================================
212   
213   //=========================================================================
214   WxBlackBoxFrame::~WxBlackBoxFrame()
215   {
216   }
217   //=========================================================================
218
219   //=========================================================================
220   void WxBlackBoxFrame::bbShow() 
221   { 
222     bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow("
223                      <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
224     WxBlackBoxWindow::bbShow();
225     wxFrame::Show(); 
226   }
227   //=========================================================================
228
229   //=========================================================================
230   void WxBlackBoxFrame::bbHide()
231   {
232     bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
233                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
234     WxBlackBoxWindow::bbHide();
235     Hide();
236   }
237   //=========================================================================
238
239
240
241   //=========================================================================
242   // WxBlackBoxDialogWrapper
243   //=========================================================================
244   /*
245   //=========================================================================
246   WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
247                                                    wxDialog *wrapped) 
248     : WxBlackBoxWindow(box),
249       mWrapped(wrapped) 
250   {
251     bbtkDebugMessage("Wx",9,
252                      "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
253                      <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
254                      <<")"<<std::endl);
255   }
256   //=========================================================================
257
258   //=========================================================================
259   WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
260   {
261   }
262   //=========================================================================
263
264   //=========================================================================
265   void WxBlackBoxDialogWrapper::bbShow() 
266   {  
267     bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
268                      <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
269     WxBlackBoxWindow::bbShow();
270     int i = mWrapped->ShowModal();
271     // For Windows :
272     mWrapped->SetReturnCode( i ); 
273   }
274   //=========================================================================
275
276   //=========================================================================
277   void WxBlackBoxDialogWrapper::bbHide()
278   {
279     bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
280                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
281     WxBlackBoxWindow::bbHide();
282     mWrapped->Hide();
283   }
284   //=========================================================================
285
286   */
287
288   /*     
289   //=========================================================================
290   // WxBlackBoxWidget
291   //=========================================================================
292
293   //=========================================================================
294   WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
295   : mBox(box)
296   {
297     bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
298     mBox->bbSetWidget(this);
299   }
300   //=========================================================================
301
302   //=========================================================================
303   WxBlackBoxWidget::~WxBlackBoxWidget()
304   {
305     bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
306     mBox->bbSetWidget(0);
307     //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
308   }
309   //=========================================================================
310   */
311
312
313
314   //=========================================================================
315   // WxBlackBoxWidgetEventHandler
316   //=========================================================================
317
318   //=========================================================================
319   WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler( WxBlackBox* box, 
320                                                               wxWindow *widget )
321     :
322     mBox(box),
323     mWindow(widget)
324                                                             //    mDead(false)
325   { 
326     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
327
328     mBox->bbSetWidgetEventHandler(this);
329
330     Connect (  mWindow->GetId(),
331                wxEVT_DESTROY,
332                (wxObjectEventFunction) 
333                (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
334                 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
335     
336     mWindow->PushEventHandler(this);
337     
338   }
339   //=========================================================================
340
341   //=========================================================================
342   WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
343   {
344     bbtkDebugMessage("Wx",9,
345                      "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
346                      <<mBox->bbGetFullName()<<")"<<std::endl);
347      mBox->bbSetWidgetEventHandler(0);   
348   }
349   //=========================================================================
350
351   //=========================================================================
352   void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
353   {
354     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
355                      <<mBox->bbGetFullName()<<"]"<<std::endl);
356     mBox->bbSetOutputWidget(0);
357     mBox->bbSetModifiedStatus();
358     //mDead = true;
359     //delete this;
360   }
361   //=========================================================================
362
363
364
365
366
367
368
369   /*
370   //=========================================================================
371   wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
372     const
373   {
374     bbtkDebugMessageInc("Kernel",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
375     
376     BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
377     if (i==b->bbGetInputConnectorMap().end())
378       {
379         bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
380                   <<b->bbGetFullName()
381                   <<" does not have any 'Parent' input ?!?");
382       }
383     Connection* c = i->second->GetConnection();
384     if (!c) 
385       {
386         bbtkDebugMessage("Kernel",9,
387                          "-> The input 'Parent' of the box "
388                          <<b->bbGetFullName()
389                          <<" is not connected."<<std::endl);
390         return 0;
391       }
392     
393     std::map< Connection*, wxWindow *>::const_iterator j 
394       = mConnectionToWindowMap.find(c);
395
396     if (j==mConnectionToWindowMap.end())
397       {
398         bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
399                   <<b->bbGetFullName()
400                   <<") no window provided by parent ?!?");
401       }
402
403     bbtkDebugDecTab("Kernel",9);
404     return j->second;
405   }
406   //=========================================================================
407   */
408   
409   //=========================================================================
410   // WxBlackBox
411   //=========================================================================
412
413   //=========================================================================
414   //=========================================================================
415   //=========================================================================
416   //=========================================================================
417   BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
418   //=========================================================================
419   
420   //=========================================================================
421   void WxBlackBox::bbUserConstructor()
422   {
423     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
424     bbInitAttributes();
425   }
426   //=========================================================================
427
428   //=========================================================================
429   void WxBlackBox::bbUserCopyConstructor()
430   {
431     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
432                      <<std::endl);
433     bbInitAttributes();
434   }
435   //=========================================================================
436
437
438   //=========================================================================
439   void WxBlackBox::bbUserDestructor()
440   {
441     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
442     if (bbGetWindow()) {
443       delete bbGetWindow();
444       //      bbSetWindow(0);
445     }
446     bbtkDebugMessage("Kernel",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
447   }
448   //=========================================================================
449   
450
451   /*
452   //=========================================================================
453   WxBlackBox::Widget*  WxBlackBox::bbGetWidget()
454   { 
455     if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead()) 
456       {
457         bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
458                          bbGetFullName()<<"] : Widget is dead : deleting it"
459                          <<std::endl);
460         delete bbGetOutputWidget();
461         bbSetOutputWidget(0);
462       }
463     return bbGetOutputWidget();
464   }
465   //=========================================================================
466   */
467
468
469   //=========================================================================
470   /**
471    * \brief Initialize the attributes of the class
472    *
473    */
474   void WxBlackBox::bbInitAttributes()
475   {
476     bbmWindow = 0;
477     //    bbmWidget = 0;
478     //    bbSetInputWinParent(0);
479     bbSetInputWinTitle(bbGetName());
480     bbSetInputWinWidth(800);
481     bbSetInputWinHeight(800);
482     bbSetInputWinDialog(false);
483     bbSetOutputWidget(0);
484
485     bbSetWidgetEventHandler(0);
486   }
487   //=========================================================================
488
489
490
491   //==================================================================
492   /// Specific methods for window creation during pipeline execution
493   /// Shows the window associated to the box 
494   /// (called after bbProcess during bbExecute)
495   void WxBlackBox::bbShowWindow()
496   {
497     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
498                         <<bbGetFullName()<<"]"<<std::endl);
499  
500     // If Event Handler for the widget does not exist or is obsolete : create it 
501     if (bbGetOutputWidget()!=0)
502       {
503         if (bbGetWidgetEventHandler()==0)
504           {
505             bbtkDebugMessage("Process",3,
506                              "-> No widget event handler : creating one"
507                              <<std::endl);
508             new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
509           }
510         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
511                   ( bbGetOutputWidget() ) )
512           {
513             bbtkDebugMessage("Process",3,
514                              "-> Obsolete widget event handler : re-creating one"
515                              <<std::endl);
516             delete bbGetWidgetEventHandler();
517             new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
518           }
519         // Sets the name of the wxWindow to the input WinTitle
520         bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
521       }
522
523     // If the output 'Widget' is connected then it's gonna 
524     // be captured by its parent window : nothing to do 
525     if ( (*bbGetOutputConnectorMap().find("Widget")).second
526          ->GetConnectionVector().size() != 0 ) 
527       {
528         
529         bbtkDebugMessage("Process",2,
530                          "-> Output 'Widget' connected : nothing to do"
531                          <<std::endl);
532         bbtkDebugDecTab("Process",1);
533         return;
534       }
535
536
537     Window* show = 0;
538     // If the window already exists : no need creating it
539     if (bbGetWindow()!=0)
540       {
541         bbtkDebugMessage("Process",2,
542                          "-> Window already exists"
543                          <<std::endl);
544         show = bbGetWindow();
545       }
546     // Else if the widget exists : create window 
547     else if (bbGetOutputWidget()!=0) 
548       {
549         bbtkDebugMessage("Process",2,
550                          "-> Widget exists : creating the window"
551                          <<std::endl);
552
553
554         // Input WinDialog set to true : creating a Dialog
555         if (bbGetInputWinDialog()) 
556           {
557             bbtkDebugMessage("Process",2,
558                              "   Input WinDialog set to true : creating a Dialog"
559                              <<std::endl);
560             show = (Window*) new WxBlackBoxDialog( this,
561                                                    Wx::GetTopWindow(), 
562                                                    std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
563                                                    wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
564           }
565         // Input WinDialog set to false : creating a Frame
566         else 
567           {
568             bbtkDebugMessage("Process",2,
569                              "   Input WinDialog set to false : creating a Frame"
570                              <<std::endl);
571             show = (Window*) new WxBlackBoxFrame( this,
572                                                   Wx::GetTopWindow(), 
573                                                   std2wx( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
574                                                   wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
575           }
576
577       }
578     // No window nor widget : error
579     else
580       {
581         bbtkError("WxBlackBox::bbShowWindow() ["
582                   <<bbGetFullName()
583                   <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
584       }
585  
586     
587     // Show the window
588     if (true) //!show->IsShown())
589       {
590         show->bbShow(); 
591       }
592     else 
593       {
594         bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
595       }
596   
597
598     bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
599                         <<bbGetFullName()<<"]"<<std::endl);
600     bbtkDebugDecTab("Process",1);
601   }
602   //==================================================================
603
604
605
606
607   //==================================================================
608    void WxBlackBox::bbHideWindow()
609   {
610     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
611                         <<bbGetFullName()<<"]"<<std::endl);
612
613     if (bbGetWindow()!=0) bbGetWindow()->bbHide();
614
615     bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
616                         <<bbGetFullName()<<"]"<<std::endl);
617   }
618   //==================================================================
619
620
621
622
623 }//namespace bbtk
624
625
626 #endif
627