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