]> 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/04/21 12:43:05 $
7   Version:   $Revision: 1.13 $
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::Pointer 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",5," -> 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",5," -> Number of windows alive = "
72                      <<Wx::GetNbWindowsAlive()<<std::endl);
73      
74
75   }
76   //========================================================================= 
77
78
79   //=========================================================================
80   void WxBlackBoxWindow::bbShow()
81   {
82     if (bbIsShown()) return;
83     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<<
84                      mBox->bbGetFullName()<<"]"<<std::endl);
85     Wx::IncNbWindowsShown();
86     mShown = true;
87     bbtkDebugMessage("Wx",5," -> Number of windows shown = "
88                      <<Wx::GetNbWindowsShown()<<std::endl);
89   }
90   //=========================================================================
91
92   //=========================================================================
93   void WxBlackBoxWindow::bbHide()
94   {
95     if (!bbIsShown()) return;
96     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbHide() ["<<
97                      mBox->bbGetFullName()<<"]"<<std::endl);
98     Wx::DecNbWindowsShown();
99     mShown = false;
100     bbtkDebugMessage("Wx",5," -> Number of windows shown = "
101                      <<Wx::GetNbWindowsShown()<<std::endl);
102   }
103   //=========================================================================
104
105
106
107   //=========================================================================
108   // WxBlackBoxDialog
109   //=========================================================================
110
111   //=========================================================================
112   WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox::Pointer box,
113                                      wxWindow *parent,
114                                      wxString title,
115                                      wxSize size)
116     :
117     WxBlackBoxWindow(box),
118     wxDialog( parent, 
119                 -1, 
120                 title,
121                 wxDefaultPosition,
122                 size,
123                 wxRESIZE_BORDER | 
124                 wxSYSTEM_MENU  |
125                 wxCLOSE_BOX |
126                 wxMAXIMIZE_BOX | 
127                 wxMINIMIZE_BOX | 
128                 wxCAPTION  
129                 )
130   {
131     bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
132                      bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
133                      <<title<<",size)"<<std::endl);
134     // Insert the widget into the window
135     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
136     wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
137     widget->Reparent(this);
138     sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
139     //SetAutoLayout(true);
140     SetSizer(sizer);
141     Layout();
142   }
143   //=========================================================================
144   
145   //=========================================================================
146   void WxBlackBoxDialog::bbShow()
147   { 
148     bbtkDebugMessage("Wx",5,"WxBlackBoxDialog::bbShow() ["
149                      <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
150     WxBlackBoxWindow::bbShow();
151     SetReturnCode( wxDialog::ShowModal() ); 
152   }
153   //=========================================================================
154
155   //=========================================================================
156   void WxBlackBoxDialog::bbHide()
157   {
158     bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::bbHide() ["<<
159                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
160     WxBlackBoxWindow::bbHide();
161     Hide();
162   }
163   //=========================================================================
164
165   //=========================================================================
166   WxBlackBoxDialog::~WxBlackBoxDialog()
167   {
168   }
169   //=========================================================================
170
171
172
173
174
175   //=========================================================================
176   // WxBlackBoxFrame
177   //=========================================================================
178
179   //=========================================================================
180   WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox::Pointer box,
181                                    wxWindow *parent,
182                                    wxString title,
183                                    wxSize size)
184     : WxBlackBoxWindow(box),
185       wxFrame( parent, 
186                -1, 
187                title,
188                wxDefaultPosition,
189                size,
190                wxRESIZE_BORDER | 
191                wxSYSTEM_MENU  |
192                wxCLOSE_BOX |
193                wxMAXIMIZE_BOX | 
194                wxMINIMIZE_BOX | 
195                wxCAPTION  
196                )
197   {
198     bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
199                      bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
200                      <<title<<",size)"<<std::endl);
201     // Insert the widget into the window
202     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
203     wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
204     wxFrame* frame = (wxFrame*)this;
205     widget->Reparent(frame);
206     sizer->Add( widget, 1, wxALL|wxGROW, 2);
207     //  frame->SetAutoLayout(true);
208     frame->SetSizer(sizer);
209     //frame->Fit();
210     frame->Layout();
211   }
212   //=========================================================================
213   
214   //=========================================================================
215   WxBlackBoxFrame::~WxBlackBoxFrame()
216   {
217   }
218   //=========================================================================
219
220   //=========================================================================
221   void WxBlackBoxFrame::bbShow() 
222   { 
223     bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow("
224                      <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
225     WxBlackBoxWindow::bbShow();
226     wxFrame::Show();
227     // This Update is ** MANDATORY ** 
228     // to synchronize wxvtkRenderWindowInteractor objects
229     // (force wx objects creation **NOW**)
230     wxFrame::Update();
231     bbGetBlackBox()->bbUserOnShow();
232     //    wxFrame::SetFocus();
233   }
234   //=========================================================================
235
236   //=========================================================================
237   void WxBlackBoxFrame::bbHide()
238   {
239     bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
240                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
241     WxBlackBoxWindow::bbHide();
242     wxFrame::Hide();
243     bbGetBlackBox()->bbUserOnHide();
244   }
245   //=========================================================================
246
247
248
249   //=========================================================================
250   // WxBlackBoxDialogWrapper
251   //=========================================================================
252   /*
253   //=========================================================================
254   WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
255                                                    wxDialog *wrapped) 
256     : WxBlackBoxWindow(box),
257       mWrapped(wrapped) 
258   {
259     bbtkDebugMessage("Wx",9,
260                      "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
261                      <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
262                      <<")"<<std::endl);
263   }
264   //=========================================================================
265
266   //=========================================================================
267   WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
268   {
269   }
270   //=========================================================================
271
272   //=========================================================================
273   void WxBlackBoxDialogWrapper::bbShow() 
274   {  
275     bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
276                      <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
277     WxBlackBoxWindow::bbShow();
278     int i = mWrapped->ShowModal();
279     // For Windows :
280     mWrapped->SetReturnCode( i ); 
281   }
282   //=========================================================================
283
284   //=========================================================================
285   void WxBlackBoxDialogWrapper::bbHide()
286   {
287     bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
288                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
289     WxBlackBoxWindow::bbHide();
290     mWrapped->Hide();
291   }
292   //=========================================================================
293
294   */
295
296   /*     
297   //=========================================================================
298   // WxBlackBoxWidget
299   //=========================================================================
300
301   //=========================================================================
302   WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
303   : mBox(box)
304   {
305     bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
306     mBox->bbSetWidget(this);
307   }
308   //=========================================================================
309
310   //=========================================================================
311   WxBlackBoxWidget::~WxBlackBoxWidget()
312   {
313     bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
314     mBox->bbSetWidget(0);
315     //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
316   }
317   //=========================================================================
318   */
319
320
321
322   //=========================================================================
323   // WxBlackBoxWidgetEventHandler
324   //=========================================================================
325
326   //=========================================================================
327   WxBlackBoxWidgetEventHandler::
328   WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box, 
329                                 wxWindow *widget )
330     :
331     mBox(box),
332     mWindow(widget)
333                                                             //    mDead(false)
334   { 
335     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
336
337     mBox->bbSetWidgetEventHandler(this);
338
339     Connect (  mWindow->GetId(),
340                wxEVT_DESTROY,
341                (wxObjectEventFunction) 
342                (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
343                 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
344     
345     mWindow->PushEventHandler(this);
346     
347   }
348   //=========================================================================
349
350   //=========================================================================
351   WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
352   {
353     bbtkDebugMessage("Wx",9,
354                      "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
355                      <<mBox->bbGetFullName()<<")"<<std::endl);
356      mBox->bbSetWidgetEventHandler(0);   
357   }
358   //=========================================================================
359
360   //=========================================================================
361   void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
362   {
363     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
364                      <<mBox->bbGetFullName()<<"]"<<std::endl);
365     mBox->bbSetOutputWidget(0);
366     mBox->bbSetModifiedStatus();
367     //mDead = true;
368     //delete this;
369   }
370   //=========================================================================
371
372
373
374
375
376
377
378   /*
379   //=========================================================================
380   wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
381     const
382   {
383     bbtkDebugMessageInc("Kernel",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
384     
385     BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
386     if (i==b->bbGetInputConnectorMap().end())
387       {
388         bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
389                   <<b->bbGetFullName()
390                   <<" does not have any 'Parent' input ?!?");
391       }
392     Connection* c = i->second->GetConnection();
393     if (!c) 
394       {
395         bbtkDebugMessage("Kernel",9,
396                          "-> The input 'Parent' of the box "
397                          <<b->bbGetFullName()
398                          <<" is not connected."<<std::endl);
399         return 0;
400       }
401     
402     std::map< Connection*, wxWindow *>::const_iterator j 
403       = mConnectionToWindowMap.find(c);
404
405     if (j==mConnectionToWindowMap.end())
406       {
407         bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
408                   <<b->bbGetFullName()
409                   <<") no window provided by parent ?!?");
410       }
411
412     bbtkDebugDecTab("Kernel",9);
413     return j->second;
414   }
415   //=========================================================================
416   */
417   
418   //=========================================================================
419   // WxBlackBox
420   //=========================================================================
421
422   //=========================================================================
423   //=========================================================================
424   //=========================================================================
425   //=========================================================================
426   BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
427   //=========================================================================
428   
429   //=========================================================================
430   void WxBlackBox::bbUserConstructor()
431   {
432     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
433     bbInitAttributes();
434   }
435   //=========================================================================
436
437   //=========================================================================
438   void WxBlackBox::bbUserCopyConstructor()
439   {
440     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
441                      <<std::endl);
442     bbInitAttributes();
443   }
444   //=========================================================================
445
446
447   //=========================================================================
448   void WxBlackBox::bbUserDestructor()
449   {
450     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
451     if (bbGetWindow()) {
452       delete bbGetWindow();
453       //      bbSetWindow(0);
454     }
455     bbtkDebugMessage("Kernel",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
456   }
457   //=========================================================================
458   
459
460   /*
461   //=========================================================================
462   WxBlackBox::Widget*  WxBlackBox::bbGetWidget()
463   { 
464     if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead()) 
465       {
466         bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
467                          bbGetFullName()<<"] : Widget is dead : deleting it"
468                          <<std::endl);
469         delete bbGetOutputWidget();
470         bbSetOutputWidget(0);
471       }
472     return bbGetOutputWidget();
473   }
474   //=========================================================================
475   */
476
477
478   //=========================================================================
479   /**
480    * \brief Initialize the attributes of the class
481    *
482    */
483   void WxBlackBox::bbInitAttributes()
484   {
485     bbmWindow = 0;
486     //    bbmWidget = 0;
487     //    bbSetInputWinParent(0);
488     bbSetInputWinTitle(bbGetName());
489     bbSetInputWinWidth(800);
490     bbSetInputWinHeight(800);
491     bbSetInputWinDialog(false);
492     bbSetOutputWidget(0);
493
494     bbSetWidgetEventHandler(0);
495   }
496   //=========================================================================
497
498   //=========================================================================
499   /// Main processing method of the box.
500   void WxBlackBox::bbExecute(bool force)
501   {
502     bbtkDebugMessageInc("Process",1,
503                         "=> WxBlackBox::bbExecute() ["
504                         <<bbGetFullName()<<"]"<<std::endl);
505
506     // If the output 'Widget' is connected then 
507     // we must execute the parent box
508     BlackBox::OutputConnectorMapType::const_iterator i 
509       = bbGetOutputConnectorMap().find("Widget");
510
511     if ( i->second->GetConnectionVector().size() != 0 ) 
512       {
513         bbtkDebugMessage("Process",2,
514                          "-> Output 'Widget' connected : transfering execution to parent"
515                          <<std::endl);
516         
517         i->second->GetConnectionVector().front().lock()
518           ->GetBlackBoxTo()->bbExecute(force);
519
520       }
521     // else call 'standard' BlackBox execution method
522     else 
523       {
524         BlackBox::bbExecute(force);
525       }
526     //
527
528     bbtkDebugMessageDec("Process",1,
529                         "<= WxBlackBox::bbExecute() ["
530                         <<bbGetFullName()<<"]"<<std::endl);
531   }
532   //=========================================================================
533
534
535   //=========================================================================
536   /// Main processing method of the box.
537   IOStatus WxBlackBox::bbBackwardUpdate( Connection::Pointer caller )
538   {
539     bbtkDebugMessageInc("Process",1,
540                         "=> WxBlackBox::bbBackwardUpdate("
541                         <<(caller?caller->GetFullName():"0")<<") ["
542                         <<bbGetFullName()<<"]"<<std::endl);
543     // If the caller is not the connection to the output widget
544     // and the output 'Widget' is connected then 
545     // we must execute the parent box 
546     // but only one time 
547     // (this is the role of the flag UpdateTransferedToParent=
548     if ( (caller==0) ||
549          ((caller!=0)&&(caller->GetBlackBoxFromOutput()!="Widget"))
550          )
551       {
552         BlackBox::OutputConnectorMapType::const_iterator i 
553           = bbGetOutputConnectorMap().find("Widget") ;
554         if ( i->second->GetConnectionVector().size() != 0 )
555              
556           {
557             bbtkDebugMessage("Process",2,
558                              "-> Output 'Widget' connected : transfering update order to parent"
559                              <<std::endl);
560             if ( bbGetUpdateTransferedToParent() )          
561               {
562                 bbSetUpdateTransferedToParent(false);
563                 bbtkDebugMessage("Process",2,
564                                  "   ... already transfered : abort"
565                                  <<std::endl);
566               }
567             else 
568               {
569                 bbSetUpdateTransferedToParent(true);
570                 i->second->GetConnectionVector().front().lock()
571                   ->GetBlackBoxTo()->bbExecute(false);
572               }
573           }
574       }
575     // call 'standard' BlackBox execution method
576     if (!bbGetUpdateTransferedToParent()) 
577       { 
578         AtomicBlackBox::bbBackwardUpdate(caller);
579       }
580     
581     bbtkDebugMessageDec("Process",1,
582                         "<= WxBlackBox::bbBackwardUpdate() ["
583                         <<bbGetFullName()<<"]"<<std::endl);
584     
585   }
586
587   //=========================================================================
588   void WxBlackBox::bbProcess()
589   { 
590     if (bbGetOutputWidget()==0) this->bbUserCreateWidget();
591     this->bbUserProcess(); 
592     bbShowWindow();
593   }
594   //=========================================================================
595   
596   //==================================================================
597   /// Specific methods for window creation during pipeline execution
598   /// Shows the window associated to the box 
599   /// (called after bbProcess during bbExecute)
600   void WxBlackBox::bbShowWindow()
601   {
602     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
603                         <<bbGetFullName()<<"]"<<std::endl);
604  
605     // If Event Handler for the widget does not exist or is obsolete : create it 
606     if (bbGetOutputWidget()!=0)
607       {
608         if (bbGetWidgetEventHandler()==0)
609           {
610             bbtkDebugMessage("Process",3,
611                              "-> No widget event handler : creating one"
612                              <<std::endl);
613             new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
614                                              bbGetOutputWidget());
615           }
616         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
617                   ( bbGetOutputWidget() ) )
618           {
619             bbtkDebugMessage("Process",3,
620                              "-> Obsolete widget event handler : re-creating one"
621                              <<std::endl);
622             delete bbGetWidgetEventHandler();
623             new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
624                                              bbGetOutputWidget());
625           }
626         // Sets the name of the wxWindow to the input WinTitle
627         bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
628       }
629
630     // If the output 'Widget' is connected then it's gonna 
631     // be captured by its parent window : nothing to do 
632     if ( (*bbGetOutputConnectorMap().find("Widget")).second
633          ->GetConnectionVector().size() != 0 ) 
634       {
635         
636         bbtkDebugMessage("Process",2,
637                          "-> Output 'Widget' connected : nothing to do"
638                          <<std::endl);
639         bbtkDebugDecTab("Process",1);
640         return;
641       }
642
643
644     Window* show = 0;
645     // If the window already exists : no need creating it
646     if (bbGetWindow()!=0)
647       {
648         bbtkDebugMessage("Process",2,
649                          "-> Window already exists"
650                          <<std::endl);
651         show = bbGetWindow();
652       }
653     // Else if the widget exists : create window 
654     else if (bbGetOutputWidget()!=0) 
655       {
656         bbtkDebugMessage("Process",2,
657                          "-> Widget exists : creating the window"
658                          <<std::endl);
659
660
661         // Input WinDialog set to true : creating a Dialog
662         if (bbGetInputWinDialog()) 
663           {
664             bbtkDebugMessage("Process",2,
665                              "   Input WinDialog set to true : creating a Dialog"
666                              <<std::endl);
667             show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
668                                                    bbGetWxParent(), 
669                                                    std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
670                                                    wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
671           }
672         // Input WinDialog set to false : creating a Frame
673         else 
674           {
675             bbtkDebugMessage("Process",2,
676                              "   Input WinDialog set to false : creating a Frame"
677                              <<std::endl);
678             show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
679                                                   bbGetWxParent(), 
680                                                   std2wx( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
681                                                   wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
682           }
683
684       }
685     // No window nor widget : error
686     else
687       {
688         bbtkError("WxBlackBox::bbShowWindow() ["
689                   <<bbGetFullName()
690                   <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
691       }
692  
693     
694     // Show the window
695     if (true) //!show->IsShown())
696       {
697         show->bbShow(); 
698       }
699     else 
700       {
701         bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
702       }
703   
704
705     bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
706                         <<bbGetFullName()<<"]"<<std::endl);
707     bbtkDebugDecTab("Process",1);
708   }
709   //==================================================================
710
711
712
713
714   //==================================================================
715    void WxBlackBox::bbHideWindow()
716   {
717     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
718                         <<bbGetFullName()<<"]"<<std::endl);
719
720     if (bbGetWindow()!=0) bbGetWindow()->bbHide();
721
722     bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
723                         <<bbGetFullName()<<"]"<<std::endl);
724   }
725   //==================================================================
726
727
728   //==================================================================
729   WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
730   {
731     if (bbGetWindow()!=0) return bbGetWindow();
732     BlackBox::OutputConnectorMapType::const_iterator i 
733       = bbGetOutputConnectorMap().find("Widget");
734     if ( i->second->GetConnectionVector().size() != 0 ) 
735       {
736         return boost::static_pointer_cast<WxBlackBox>
737           (i->second->GetConnectionVector().front().lock()->GetBlackBoxTo())
738           ->bbGetContainingWindow();
739       }
740     return 0;
741   }
742   //==================================================================
743
744
745   //==================================================================
746   wxWindow* WxBlackBox::bbGetWxParent() { return Wx::GetTopWindow(); }
747   //==================================================================
748   
749   
750   //==================================================================
751   bool WxBlackBox::bbIsShown()
752   {
753     if (bbGetContainingWindow()!=0)
754       return bbGetContainingWindow()->bbIsShown();
755     return false;
756   }
757   //==================================================================
758
759
760 }//namespace bbtk
761
762
763 #endif
764