]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.cxx
Recreated the complete cvs tree because the project architecture deeply changed
[bbtk.git] / kernel / src / bbtkWxBlackBox.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkWxBlackBox.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/01/22 15:02:00 $
7   Version:   $Revision: 1.1.1.1 $
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 namespace bbtk
38 {
39
40   //=========================================================================
41   wxWindow* WxBlackBox::bbGlobalGetTopWindow() 
42   {
43     return bbmgTopWindow;
44   }
45   //=========================================================================
46
47   //=========================================================================
48   void WxBlackBox::bbGlobalSetTopWindow(wxWindow* w) 
49   {
50     if ( bbmgTopWindow ) 
51       {
52         bbtkGlobalError("WxBlackBox::bbGlobalSetTopWindow : top window already set !");
53       } 
54     bbmgTopWindow = w;
55   }
56   //=========================================================================
57    
58
59   //=========================================================================
60   void WxBlackBox::bbGlobalDecNbWindowsAlive()
61   { 
62     bbmgNbWindowsAlive--; 
63     /*
64     if ( (bbmgNbWindowsAlive==0) && 
65          bbmgTopWindow && (!bbmgTopWindow->IsShown()))
66       {
67         bbmgTopWindow->Close();
68       }
69     */
70   }
71   //=========================================================================
72
73   //=========================================================================
74   void WxBlackBox::bbGlobalDecNbWindowsShown()
75   { 
76     bbmgNbWindowsShown--; 
77     if ( (bbmgNbWindowsShown==0) && 
78          bbmgTopWindow && (!bbmgTopWindow->IsShown()))
79       {
80         bbmgTopWindow->Close();
81       }
82   }
83   //=========================================================================
84
85   //=========================================================================
86   // Static members 
87   wxWindow* WxBlackBox::bbmgTopWindow =0;
88   int WxBlackBox::bbmgNbWindowsAlive = 0;
89   int WxBlackBox::bbmgNbWindowsShown = 0;
90   //=========================================================================
91
92
93
94
95
96   //=========================================================================
97   // WxBlackBoxWindow
98   //=========================================================================
99
100
101
102   //=========================================================================
103   WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox* box)
104     : mBox(box), mShown(false)
105   {
106     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
107                      mBox->bbGetFullName()<<")"<<std::endl);
108     mBox->bbSetWindow(this);
109     WxBlackBox::bbGlobalIncNbWindowsAlive();
110     bbtkDebugMessage("Wx",9," -> Number of windows alive = "
111                      <<WxBlackBox::bbGlobalGetNbWindowsAlive()<<std::endl);
112   }
113   //=========================================================================
114
115   //=========================================================================
116   WxBlackBoxWindow::~WxBlackBoxWindow()
117   {
118     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() ["<<
119                      mBox->bbGetFullName()<<"]"<<std::endl);
120     bbHide();
121     mBox->bbSetWindow(0);
122     WxBlackBox::bbGlobalDecNbWindowsAlive();
123     bbtkDebugMessage("Wx",9," -> Number of windows alive = "
124                      <<WxBlackBox::bbGlobalGetNbWindowsAlive()<<std::endl);
125      
126
127   }
128   //========================================================================= 
129
130   //=========================================================================
131   void WxBlackBoxWindow::bbShow()
132   {
133     if (bbIsShown()) return;
134     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<<
135                      mBox->bbGetFullName()<<"]"<<std::endl);
136     WxBlackBox::bbGlobalIncNbWindowsShown();
137     mShown = true;
138     bbtkDebugMessage("Wx",9," -> Number of windows shown = "
139                      <<WxBlackBox::bbGlobalGetNbWindowsShown()<<std::endl);
140   }
141   //=========================================================================
142
143   //=========================================================================
144   void WxBlackBoxWindow::bbHide()
145   {
146     if (!bbIsShown()) return;
147     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbHide() ["<<
148                      mBox->bbGetFullName()<<"]"<<std::endl);
149     WxBlackBox::bbGlobalDecNbWindowsShown();
150     mShown = false;
151     bbtkDebugMessage("Wx",9," -> Number of windows shown = "
152                      <<WxBlackBox::bbGlobalGetNbWindowsShown()<<std::endl);
153   }
154   //=========================================================================
155
156
157
158   //=========================================================================
159   // WxBlackBoxDialog
160   //=========================================================================
161
162   //=========================================================================
163   WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox* box,
164                                      wxWindow *parent,
165                                      wxString title,
166                                      wxSize size)
167     :
168     WxBlackBoxWindow(box),
169     wxDialog( parent, 
170                 -1, 
171                 title,
172                 wxDefaultPosition,
173                 size,
174                 wxRESIZE_BORDER | 
175                 wxSYSTEM_MENU  |
176                 wxCLOSE_BOX |
177                 wxMAXIMIZE_BOX | 
178                 wxMINIMIZE_BOX | 
179                 wxCAPTION  
180                 )
181   {
182     bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
183                      bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
184                      <<title<<",size)"<<std::endl);
185     // Insert the widget into the window
186     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
187     wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
188     widget->Reparent(this);
189     sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
190     //SetAutoLayout(true);
191     SetSizer(sizer);
192     Layout();
193   }
194   //=========================================================================
195   
196   //=========================================================================
197   void WxBlackBoxDialog::bbShow()
198   { 
199     bbtkDebugMessage("Wx",5,"WxBlackBoxDialog::bbShow() ["
200                      <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
201     WxBlackBoxWindow::bbShow();
202     SetReturnCode( wxDialog::ShowModal() ); 
203   }
204   //=========================================================================
205
206   //=========================================================================
207   void WxBlackBoxDialog::bbHide()
208   {
209     bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::bbHide() ["<<
210                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
211     WxBlackBoxWindow::bbHide();
212     Hide();
213   }
214   //=========================================================================
215
216   //=========================================================================
217   WxBlackBoxDialog::~WxBlackBoxDialog()
218   {
219   }
220   //=========================================================================
221
222
223
224
225
226   //=========================================================================
227   // WxBlackBoxFrame
228   //=========================================================================
229
230   //=========================================================================
231   WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox* box,
232                                    wxWindow *parent,
233                                    wxString title,
234                                    wxSize size)
235     : WxBlackBoxWindow(box),
236       wxFrame( parent, 
237                -1, 
238                title,
239                wxDefaultPosition,
240                size,
241                wxRESIZE_BORDER | 
242                wxSYSTEM_MENU  |
243                wxCLOSE_BOX |
244                wxMAXIMIZE_BOX | 
245                wxMINIMIZE_BOX | 
246                wxCAPTION  
247                )
248   {
249     bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
250                      bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
251                      <<title<<",size)"<<std::endl);
252     // Insert the widget into the window
253     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
254     wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
255     wxFrame* frame = (wxFrame*)this;
256     widget->Reparent(frame);
257     sizer->Add( widget, 1, wxALL|wxGROW, 2);
258     //  frame->SetAutoLayout(true);
259     frame->SetSizer(sizer);
260     //frame->Fit();
261     frame->Layout();
262   }
263   //=========================================================================
264   
265   //=========================================================================
266   WxBlackBoxFrame::~WxBlackBoxFrame()
267   {
268   }
269   //=========================================================================
270
271   //=========================================================================
272   void WxBlackBoxFrame::bbShow() 
273   { 
274     bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow("
275                      <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
276     WxBlackBoxWindow::bbShow();
277     wxFrame::Show(); 
278   }
279   //=========================================================================
280
281   //=========================================================================
282   void WxBlackBoxFrame::bbHide()
283   {
284     bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
285                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
286     WxBlackBoxWindow::bbHide();
287     Hide();
288   }
289   //=========================================================================
290
291
292
293   //=========================================================================
294   // WxBlackBoxDialogWrapper
295   //=========================================================================
296   /*
297   //=========================================================================
298   WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
299                                                    wxDialog *wrapped) 
300     : WxBlackBoxWindow(box),
301       mWrapped(wrapped) 
302   {
303     bbtkDebugMessage("Wx",9,
304                      "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
305                      <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
306                      <<")"<<std::endl);
307   }
308   //=========================================================================
309
310   //=========================================================================
311   WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
312   {
313   }
314   //=========================================================================
315
316   //=========================================================================
317   void WxBlackBoxDialogWrapper::bbShow() 
318   {  
319     bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
320                      <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
321     WxBlackBoxWindow::bbShow();
322     int i = mWrapped->ShowModal();
323     // For Windows :
324     mWrapped->SetReturnCode( i ); 
325   }
326   //=========================================================================
327
328   //=========================================================================
329   void WxBlackBoxDialogWrapper::bbHide()
330   {
331     bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
332                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
333     WxBlackBoxWindow::bbHide();
334     mWrapped->Hide();
335   }
336   //=========================================================================
337
338   */
339
340   /*     
341   //=========================================================================
342   // WxBlackBoxWidget
343   //=========================================================================
344
345   //=========================================================================
346   WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
347   : mBox(box)
348   {
349     bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
350     mBox->bbSetWidget(this);
351   }
352   //=========================================================================
353
354   //=========================================================================
355   WxBlackBoxWidget::~WxBlackBoxWidget()
356   {
357     bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
358     mBox->bbSetWidget(0);
359     //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
360   }
361   //=========================================================================
362   */
363
364
365
366   //=========================================================================
367   // WxBlackBoxWidgetEventHandler
368   //=========================================================================
369
370   //=========================================================================
371   WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler( WxBlackBox* box, 
372                                                               wxWindow *widget )
373     :
374     mBox(box),
375     mWindow(widget)
376                                                             //    mDead(false)
377   { 
378     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
379
380     mBox->bbSetWidgetEventHandler(this);
381
382     Connect (  mWindow->GetId(),
383                wxEVT_DESTROY,
384                (wxObjectEventFunction) 
385                (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
386                 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
387     
388     mWindow->PushEventHandler(this);
389     
390   }
391   //=========================================================================
392
393   //=========================================================================
394   WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
395   {
396     bbtkDebugMessage("Wx",9,
397                      "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
398                      <<mBox->bbGetFullName()<<")"<<std::endl);
399      mBox->bbSetWidgetEventHandler(0);   
400   }
401   //=========================================================================
402
403   //=========================================================================
404   void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
405   {
406     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
407                      <<mBox->bbGetFullName()<<"]"<<std::endl);
408     mBox->bbSetOutputWidget(0);
409     mBox->bbSetModifiedStatus();
410     //mDead = true;
411     //delete this;
412   }
413   //=========================================================================
414
415
416
417
418
419
420
421   /*
422   //=========================================================================
423   wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
424     const
425   {
426     bbtkDebugMessageInc("Core",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
427     
428     BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
429     if (i==b->bbGetInputConnectorMap().end())
430       {
431         bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
432                   <<b->bbGetFullName()
433                   <<" does not have any 'Parent' input ?!?");
434       }
435     Connection* c = i->second->GetConnection();
436     if (!c) 
437       {
438         bbtkDebugMessage("Core",9,
439                          "-> The input 'Parent' of the box "
440                          <<b->bbGetFullName()
441                          <<" is not connected."<<std::endl);
442         return 0;
443       }
444     
445     std::map< Connection*, wxWindow *>::const_iterator j 
446       = mConnectionToWindowMap.find(c);
447
448     if (j==mConnectionToWindowMap.end())
449       {
450         bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
451                   <<b->bbGetFullName()
452                   <<") no window provided by parent ?!?");
453       }
454
455     bbtkDebugDecTab("Core",9);
456     return j->second;
457   }
458   //=========================================================================
459   */
460   
461   //=========================================================================
462   // WxBlackBox
463   //=========================================================================
464
465   //=========================================================================
466   //=========================================================================
467   //=========================================================================
468   //=========================================================================
469   BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,UserBlackBox);
470   //=========================================================================
471   
472   //=========================================================================
473   void WxBlackBox::bbUserConstructor()
474   {
475     bbtkDebugMessage("Core",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
476     bbInitAttributes();
477   }
478   //=========================================================================
479
480   //=========================================================================
481   void WxBlackBox::bbUserCopyConstructor()
482   {
483     bbtkDebugMessage("Core",9,"WxBlackBox::bbUserCopyConstructor()"
484                      <<std::endl);
485     bbInitAttributes();
486   }
487   //=========================================================================
488
489
490   //=========================================================================
491   void WxBlackBox::bbUserDestructor()
492   {
493     bbtkDebugMessage("Core",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
494     if (bbGetWindow()) {
495       delete bbGetWindow();
496       //      bbSetWindow(0);
497     }
498     bbtkDebugMessage("Core",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
499   }
500   //=========================================================================
501   
502
503   /*
504   //=========================================================================
505   WxBlackBox::Widget*  WxBlackBox::bbGetWidget()
506   { 
507     if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead()) 
508       {
509         bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
510                          bbGetFullName()<<"] : Widget is dead : deleting it"
511                          <<std::endl);
512         delete bbGetOutputWidget();
513         bbSetOutputWidget(0);
514       }
515     return bbGetOutputWidget();
516   }
517   //=========================================================================
518   */
519
520
521   //=========================================================================
522   /**
523    * \brief Initialize the attributes of the class
524    *
525    */
526   void WxBlackBox::bbInitAttributes()
527   {
528     bbmWindow = 0;
529     //    bbmWidget = 0;
530     //    bbSetInputWinParent(0);
531     bbSetInputWinTitle("...");
532     bbSetInputWinWidth(800);
533     bbSetInputWinHeight(800);
534     bbSetInputWinDialog(false);
535     bbSetOutputWidget(0);
536
537     bbSetWidgetEventHandler(0);
538   }
539   //=========================================================================
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(Connection* caller)
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       }
572
573     // If the output 'Widget' is connected then it's gonna 
574     // be captured by its parent window : nothing to do 
575     if ( (*bbGetOutputConnectorMap().find("Widget")).second
576          ->GetConnectionVector().size() != 0 ) 
577       {
578         
579         bbtkDebugMessage("Process",2,
580                          "-> Output 'Widget' connected : nothing to do"
581                          <<std::endl);
582         bbtkDebugDecTab("Process",1);
583         return;
584       }
585
586
587     Window* show = 0;
588     // If the window already exists : no need creating it
589     if (bbGetWindow()!=0)
590       {
591         bbtkDebugMessage("Process",2,
592                          "-> Window already exists"
593                          <<std::endl);
594         show = bbGetWindow();
595       }
596     // Else if the widget exists : create window 
597     else if (bbGetOutputWidget()!=0) 
598       {
599         bbtkDebugMessage("Process",2,
600                          "-> Widget exists : creating the window"
601                          <<std::endl);
602
603
604         // Input WinDialog set to true : creating a Dialog
605         if (bbGetInputWinDialog()) 
606           {
607             bbtkDebugMessage("Process",2,
608                              "   Input WinDialog set to true : creating a Dialog"
609                              <<std::endl);
610             show = (Window*) new WxBlackBoxDialog( this,
611                                                    bbGlobalGetTopWindow(), 
612                                                    std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
613                                                    wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
614           }
615         // Input WinDialog set to false : creating a Frame
616         else 
617           {
618             bbtkDebugMessage("Process",2,
619                              "   Input WinDialog set to false : creating a Frame"
620                              <<std::endl);
621             show = (Window*) new WxBlackBoxFrame( this,
622                                                   bbGlobalGetTopWindow(), 
623                                                   std2wx( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
624                                                   wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
625           }
626
627       }
628     // No window nor widget : error
629     else
630       {
631         bbtkError("WxBlackBox::bbShowWindow() ["
632                   <<bbGetFullName()
633                   <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
634       }
635  
636     
637     // Show the window
638     if (true) //!show->IsShown())
639       {
640         show->bbShow(); 
641       }
642     else 
643       {
644         bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
645       }
646   
647
648     bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
649                         <<bbGetFullName()<<"]"<<std::endl);
650     bbtkDebugDecTab("Process",1);
651   }
652   //==================================================================
653
654
655
656
657   //==================================================================
658    void WxBlackBox::bbHideWindow()
659   {
660     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
661                         <<bbGetFullName()<<"]"<<std::endl);
662
663     if (bbGetWindow()!=0) bbGetWindow()->bbHide();
664
665     bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
666                         <<bbGetFullName()<<"]"<<std::endl);
667   }
668   //==================================================================
669
670
671
672
673 }//namespace bbtk
674
675
676 #endif
677