]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.cxx
Fixed X Window Server errors with wxvtk::Viewer2D (bad synchro between wx and vtk...
[bbtk.git] / kernel / src / bbtkWxBlackBox.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkWxBlackBox.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/03/10 12:28:43 $
7   Version:   $Revision: 1.10 $
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",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* 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* 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::WxBlackBoxWidgetEventHandler( WxBlackBox* box, 
328                                                               wxWindow *widget )
329     :
330     mBox(box),
331     mWindow(widget)
332                                                             //    mDead(false)
333   { 
334     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
335
336     mBox->bbSetWidgetEventHandler(this);
337
338     Connect (  mWindow->GetId(),
339                wxEVT_DESTROY,
340                (wxObjectEventFunction) 
341                (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
342                 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
343     
344     mWindow->PushEventHandler(this);
345     
346   }
347   //=========================================================================
348
349   //=========================================================================
350   WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
351   {
352     bbtkDebugMessage("Wx",9,
353                      "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
354                      <<mBox->bbGetFullName()<<")"<<std::endl);
355      mBox->bbSetWidgetEventHandler(0);   
356   }
357   //=========================================================================
358
359   //=========================================================================
360   void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
361   {
362     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
363                      <<mBox->bbGetFullName()<<"]"<<std::endl);
364     mBox->bbSetOutputWidget(0);
365     mBox->bbSetModifiedStatus();
366     //mDead = true;
367     //delete this;
368   }
369   //=========================================================================
370
371
372
373
374
375
376
377   /*
378   //=========================================================================
379   wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
380     const
381   {
382     bbtkDebugMessageInc("Kernel",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
383     
384     BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
385     if (i==b->bbGetInputConnectorMap().end())
386       {
387         bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
388                   <<b->bbGetFullName()
389                   <<" does not have any 'Parent' input ?!?");
390       }
391     Connection* c = i->second->GetConnection();
392     if (!c) 
393       {
394         bbtkDebugMessage("Kernel",9,
395                          "-> The input 'Parent' of the box "
396                          <<b->bbGetFullName()
397                          <<" is not connected."<<std::endl);
398         return 0;
399       }
400     
401     std::map< Connection*, wxWindow *>::const_iterator j 
402       = mConnectionToWindowMap.find(c);
403
404     if (j==mConnectionToWindowMap.end())
405       {
406         bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
407                   <<b->bbGetFullName()
408                   <<") no window provided by parent ?!?");
409       }
410
411     bbtkDebugDecTab("Kernel",9);
412     return j->second;
413   }
414   //=========================================================================
415   */
416   
417   //=========================================================================
418   // WxBlackBox
419   //=========================================================================
420
421   //=========================================================================
422   //=========================================================================
423   //=========================================================================
424   //=========================================================================
425   BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
426   //=========================================================================
427   
428   //=========================================================================
429   void WxBlackBox::bbUserConstructor()
430   {
431     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
432     bbInitAttributes();
433   }
434   //=========================================================================
435
436   //=========================================================================
437   void WxBlackBox::bbUserCopyConstructor()
438   {
439     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
440                      <<std::endl);
441     bbInitAttributes();
442   }
443   //=========================================================================
444
445
446   //=========================================================================
447   void WxBlackBox::bbUserDestructor()
448   {
449     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
450     if (bbGetWindow()) {
451       delete bbGetWindow();
452       //      bbSetWindow(0);
453     }
454     bbtkDebugMessage("Kernel",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
455   }
456   //=========================================================================
457   
458
459   /*
460   //=========================================================================
461   WxBlackBox::Widget*  WxBlackBox::bbGetWidget()
462   { 
463     if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead()) 
464       {
465         bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
466                          bbGetFullName()<<"] : Widget is dead : deleting it"
467                          <<std::endl);
468         delete bbGetOutputWidget();
469         bbSetOutputWidget(0);
470       }
471     return bbGetOutputWidget();
472   }
473   //=========================================================================
474   */
475
476
477   //=========================================================================
478   /**
479    * \brief Initialize the attributes of the class
480    *
481    */
482   void WxBlackBox::bbInitAttributes()
483   {
484     bbmWindow = 0;
485     //    bbmWidget = 0;
486     //    bbSetInputWinParent(0);
487     bbSetInputWinTitle(bbGetName());
488     bbSetInputWinWidth(800);
489     bbSetInputWinHeight(800);
490     bbSetInputWinDialog(false);
491     bbSetOutputWidget(0);
492
493     bbSetWidgetEventHandler(0);
494   }
495   //=========================================================================
496
497   //=========================================================================
498   /// Main processing method of the box.
499   void WxBlackBox::bbExecute(bool force)
500   {
501     bbtkDebugMessageInc("Process",1,
502                         "=> WxBlackBox::bbExecute() ["
503                         <<bbGetFullName()<<"]"<<std::endl);
504
505     // If the output 'Widget' is connected then 
506     // we must execute the parent box
507     BlackBox::OutputConnectorMapType::const_iterator i 
508       = bbGetOutputConnectorMap().find("Widget");
509
510     if ( i->second->GetConnectionVector().size() != 0 ) 
511       {
512         bbtkDebugMessage("Process",2,
513                          "-> Output 'Widget' connected : transfering execution to parent"
514                          <<std::endl);
515         
516         i->second->GetConnectionVector().front()
517           ->GetBlackBoxTo()->bbExecute(force);
518
519       }
520     // else call 'standard' BlackBox execution method
521     else 
522       {
523         BlackBox::bbExecute(force);
524       }
525     //
526
527     bbtkDebugMessageDec("Process",1,
528                         "<= WxBlackBox::bbExecute() ["
529                         <<bbGetFullName()<<"]"<<std::endl);
530   }
531   //=========================================================================
532
533
534   //=========================================================================
535   void WxBlackBox::bbProcess()
536   { 
537     if (bbGetOutputWidget()==0) this->bbUserCreateWidget();
538     this->bbUserProcess(); 
539     bbShowWindow();
540   }
541   //=========================================================================
542   
543   //==================================================================
544   /// Specific methods for window creation during pipeline execution
545   /// Shows the window associated to the box 
546   /// (called after bbProcess during bbExecute)
547   void WxBlackBox::bbShowWindow()
548   {
549     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
550                         <<bbGetFullName()<<"]"<<std::endl);
551  
552     // If Event Handler for the widget does not exist or is obsolete : create it 
553     if (bbGetOutputWidget()!=0)
554       {
555         if (bbGetWidgetEventHandler()==0)
556           {
557             bbtkDebugMessage("Process",3,
558                              "-> No widget event handler : creating one"
559                              <<std::endl);
560             new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
561           }
562         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
563                   ( bbGetOutputWidget() ) )
564           {
565             bbtkDebugMessage("Process",3,
566                              "-> Obsolete widget event handler : re-creating one"
567                              <<std::endl);
568             delete bbGetWidgetEventHandler();
569             new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
570           }
571         // Sets the name of the wxWindow to the input WinTitle
572         bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
573       }
574
575     // If the output 'Widget' is connected then it's gonna 
576     // be captured by its parent window : nothing to do 
577     if ( (*bbGetOutputConnectorMap().find("Widget")).second
578          ->GetConnectionVector().size() != 0 ) 
579       {
580         
581         bbtkDebugMessage("Process",2,
582                          "-> Output 'Widget' connected : nothing to do"
583                          <<std::endl);
584         bbtkDebugDecTab("Process",1);
585         return;
586       }
587
588
589     Window* show = 0;
590     // If the window already exists : no need creating it
591     if (bbGetWindow()!=0)
592       {
593         bbtkDebugMessage("Process",2,
594                          "-> Window already exists"
595                          <<std::endl);
596         show = bbGetWindow();
597       }
598     // Else if the widget exists : create window 
599     else if (bbGetOutputWidget()!=0) 
600       {
601         bbtkDebugMessage("Process",2,
602                          "-> Widget exists : creating the window"
603                          <<std::endl);
604
605
606         // Input WinDialog set to true : creating a Dialog
607         if (bbGetInputWinDialog()) 
608           {
609             bbtkDebugMessage("Process",2,
610                              "   Input WinDialog set to true : creating a Dialog"
611                              <<std::endl);
612             show = (Window*) new WxBlackBoxDialog( this,
613                                                    bbGetWxParent(), 
614                                                    std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
615                                                    wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
616           }
617         // Input WinDialog set to false : creating a Frame
618         else 
619           {
620             bbtkDebugMessage("Process",2,
621                              "   Input WinDialog set to false : creating a Frame"
622                              <<std::endl);
623             show = (Window*) new WxBlackBoxFrame( this,
624                                                   bbGetWxParent(), 
625                                                   std2wx( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
626                                                   wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
627           }
628
629       }
630     // No window nor widget : error
631     else
632       {
633         bbtkError("WxBlackBox::bbShowWindow() ["
634                   <<bbGetFullName()
635                   <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
636       }
637  
638     
639     // Show the window
640     if (true) //!show->IsShown())
641       {
642         show->bbShow(); 
643       }
644     else 
645       {
646         bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
647       }
648   
649
650     bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
651                         <<bbGetFullName()<<"]"<<std::endl);
652     bbtkDebugDecTab("Process",1);
653   }
654   //==================================================================
655
656
657
658
659   //==================================================================
660    void WxBlackBox::bbHideWindow()
661   {
662     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
663                         <<bbGetFullName()<<"]"<<std::endl);
664
665     if (bbGetWindow()!=0) bbGetWindow()->bbHide();
666
667     bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
668                         <<bbGetFullName()<<"]"<<std::endl);
669   }
670   //==================================================================
671
672
673   //==================================================================
674   WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
675   {
676     if (bbGetWindow()!=0) return bbGetWindow();
677     BlackBox::OutputConnectorMapType::const_iterator i 
678       = bbGetOutputConnectorMap().find("Widget");
679     if ( i->second->GetConnectionVector().size() != 0 ) 
680       {
681         return ((WxBlackBox*)i->second->GetConnectionVector().front()
682                 ->GetBlackBoxTo())->bbGetContainingWindow();
683       }
684     return 0;
685   }
686   //==================================================================
687
688
689   //==================================================================
690   wxWindow* WxBlackBox::bbGetWxParent() { return Wx::GetTopWindow(); }
691   //==================================================================
692   
693   
694   //==================================================================
695   bool WxBlackBox::bbIsShown()
696   {
697     if (bbGetContainingWindow()!=0)
698       return bbGetContainingWindow()->bbIsShown();
699     return false;
700   }
701   //==================================================================
702
703
704 }//namespace bbtk
705
706
707 #endif
708