]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.cxx
Fix a big bug. Consider the script :
[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/06 09:23:43 $
7   Version:   $Revision: 1.8 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18
19 #ifdef _USE_WXWIDGETS_
20
21
22
23 /**
24  *  \file 
25  *  \brief 
26  */
27  
28 #include "bbtkWxBlackBox.h"
29 //#include "bbtkWxContainerBlackBox.h"
30 #include <wx/dialog.h>
31
32 //#include "bbtkData.h"
33 //#include "bbtkFactory.h"
34
35
36
37
38 namespace bbtk
39 {
40
41
42
43
44   //=========================================================================
45   // WxBlackBoxWindow
46   //=========================================================================
47
48
49
50   //=========================================================================
51   WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox* box)
52     : mBox(box), mShown(false)
53   {
54     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
55                      mBox->bbGetFullName()<<")"<<std::endl);
56     mBox->bbSetWindow(this);
57     Wx::IncNbWindowsAlive();
58     bbtkDebugMessage("Wx",9," -> Number of windows alive = "
59                      <<Wx::GetNbWindowsAlive()<<std::endl);
60   }
61   //=========================================================================
62
63   //=========================================================================
64   WxBlackBoxWindow::~WxBlackBoxWindow()
65   {
66     bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() ["<<
67                      mBox->bbGetFullName()<<"]"<<std::endl);
68     bbHide();
69     mBox->bbSetWindow(0);
70     Wx::DecNbWindowsAlive();
71     bbtkDebugMessage("Wx",9," -> Number of windows alive = "
72                      <<Wx::GetNbWindowsAlive()<<std::endl);
73      
74
75   }
76   //========================================================================= 
77
78
79   //=========================================================================
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",9," -> 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",9," -> 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   }
228   //=========================================================================
229
230   //=========================================================================
231   void WxBlackBoxFrame::bbHide()
232   {
233     bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
234                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
235     WxBlackBoxWindow::bbHide();
236     Hide();
237   }
238   //=========================================================================
239
240
241
242   //=========================================================================
243   // WxBlackBoxDialogWrapper
244   //=========================================================================
245   /*
246   //=========================================================================
247   WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
248                                                    wxDialog *wrapped) 
249     : WxBlackBoxWindow(box),
250       mWrapped(wrapped) 
251   {
252     bbtkDebugMessage("Wx",9,
253                      "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
254                      <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
255                      <<")"<<std::endl);
256   }
257   //=========================================================================
258
259   //=========================================================================
260   WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
261   {
262   }
263   //=========================================================================
264
265   //=========================================================================
266   void WxBlackBoxDialogWrapper::bbShow() 
267   {  
268     bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
269                      <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
270     WxBlackBoxWindow::bbShow();
271     int i = mWrapped->ShowModal();
272     // For Windows :
273     mWrapped->SetReturnCode( i ); 
274   }
275   //=========================================================================
276
277   //=========================================================================
278   void WxBlackBoxDialogWrapper::bbHide()
279   {
280     bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
281                      bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
282     WxBlackBoxWindow::bbHide();
283     mWrapped->Hide();
284   }
285   //=========================================================================
286
287   */
288
289   /*     
290   //=========================================================================
291   // WxBlackBoxWidget
292   //=========================================================================
293
294   //=========================================================================
295   WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
296   : mBox(box)
297   {
298     bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
299     mBox->bbSetWidget(this);
300   }
301   //=========================================================================
302
303   //=========================================================================
304   WxBlackBoxWidget::~WxBlackBoxWidget()
305   {
306     bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
307     mBox->bbSetWidget(0);
308     //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
309   }
310   //=========================================================================
311   */
312
313
314
315   //=========================================================================
316   // WxBlackBoxWidgetEventHandler
317   //=========================================================================
318
319   //=========================================================================
320   WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler( WxBlackBox* box, 
321                                                               wxWindow *widget )
322     :
323     mBox(box),
324     mWindow(widget)
325                                                             //    mDead(false)
326   { 
327     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
328
329     mBox->bbSetWidgetEventHandler(this);
330
331     Connect (  mWindow->GetId(),
332                wxEVT_DESTROY,
333                (wxObjectEventFunction) 
334                (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
335                 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
336     
337     mWindow->PushEventHandler(this);
338     
339   }
340   //=========================================================================
341
342   //=========================================================================
343   WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
344   {
345     bbtkDebugMessage("Wx",9,
346                      "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
347                      <<mBox->bbGetFullName()<<")"<<std::endl);
348      mBox->bbSetWidgetEventHandler(0);   
349   }
350   //=========================================================================
351
352   //=========================================================================
353   void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
354   {
355     bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
356                      <<mBox->bbGetFullName()<<"]"<<std::endl);
357     mBox->bbSetOutputWidget(0);
358     mBox->bbSetModifiedStatus();
359     //mDead = true;
360     //delete this;
361   }
362   //=========================================================================
363
364
365
366
367
368
369
370   /*
371   //=========================================================================
372   wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
373     const
374   {
375     bbtkDebugMessageInc("Kernel",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
376     
377     BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
378     if (i==b->bbGetInputConnectorMap().end())
379       {
380         bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
381                   <<b->bbGetFullName()
382                   <<" does not have any 'Parent' input ?!?");
383       }
384     Connection* c = i->second->GetConnection();
385     if (!c) 
386       {
387         bbtkDebugMessage("Kernel",9,
388                          "-> The input 'Parent' of the box "
389                          <<b->bbGetFullName()
390                          <<" is not connected."<<std::endl);
391         return 0;
392       }
393     
394     std::map< Connection*, wxWindow *>::const_iterator j 
395       = mConnectionToWindowMap.find(c);
396
397     if (j==mConnectionToWindowMap.end())
398       {
399         bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
400                   <<b->bbGetFullName()
401                   <<") no window provided by parent ?!?");
402       }
403
404     bbtkDebugDecTab("Kernel",9);
405     return j->second;
406   }
407   //=========================================================================
408   */
409   
410   //=========================================================================
411   // WxBlackBox
412   //=========================================================================
413
414   //=========================================================================
415   //=========================================================================
416   //=========================================================================
417   //=========================================================================
418   BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
419   //=========================================================================
420   
421   //=========================================================================
422   void WxBlackBox::bbUserConstructor()
423   {
424     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
425     bbInitAttributes();
426   }
427   //=========================================================================
428
429   //=========================================================================
430   void WxBlackBox::bbUserCopyConstructor()
431   {
432     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
433                      <<std::endl);
434     bbInitAttributes();
435   }
436   //=========================================================================
437
438
439   //=========================================================================
440   void WxBlackBox::bbUserDestructor()
441   {
442     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
443     if (bbGetWindow()) {
444       delete bbGetWindow();
445       //      bbSetWindow(0);
446     }
447     bbtkDebugMessage("Kernel",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
448   }
449   //=========================================================================
450   
451
452   /*
453   //=========================================================================
454   WxBlackBox::Widget*  WxBlackBox::bbGetWidget()
455   { 
456     if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead()) 
457       {
458         bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
459                          bbGetFullName()<<"] : Widget is dead : deleting it"
460                          <<std::endl);
461         delete bbGetOutputWidget();
462         bbSetOutputWidget(0);
463       }
464     return bbGetOutputWidget();
465   }
466   //=========================================================================
467   */
468
469
470   //=========================================================================
471   /**
472    * \brief Initialize the attributes of the class
473    *
474    */
475   void WxBlackBox::bbInitAttributes()
476   {
477     bbmWindow = 0;
478     //    bbmWidget = 0;
479     //    bbSetInputWinParent(0);
480     bbSetInputWinTitle(bbGetName());
481     bbSetInputWinWidth(800);
482     bbSetInputWinHeight(800);
483     bbSetInputWinDialog(false);
484     bbSetOutputWidget(0);
485
486     bbSetWidgetEventHandler(0);
487   }
488   //=========================================================================
489
490   //=========================================================================
491   /// Main processing method of the box.
492   void WxBlackBox::bbExecute(bool force)
493   {
494     bbtkDebugMessageInc("Process",1,
495                         "=> WxBlackBox::bbExecute() ["
496                         <<bbGetFullName()<<"]"<<std::endl);
497
498     // If the output 'Widget' is connected then 
499     // we must execute the parent box
500     BlackBox::OutputConnectorMapType::const_iterator i 
501       = bbGetOutputConnectorMap().find("Widget");
502
503     if ( i->second->GetConnectionVector().size() != 0 ) 
504       {
505         bbtkDebugMessage("Process",2,
506                          "-> Output 'Widget' connected : transfering execution to parent"
507                          <<std::endl);
508         
509         i->second->GetConnectionVector().front()
510           ->GetBlackBoxTo()->bbExecute(force);
511
512       }
513     // else call 'standard' BlackBox execution method
514     else 
515       {
516         BlackBox::bbExecute(force);
517       }
518     //
519
520     bbtkDebugMessageDec("Process",1,
521                         "<= WxBlackBox::bbExecute() ["
522                         <<bbGetFullName()<<"]"<<std::endl);
523   }
524   //=========================================================================
525
526
527   //==================================================================
528   /// Specific methods for window creation during pipeline execution
529   /// Shows the window associated to the box 
530   /// (called after bbProcess during bbExecute)
531   void WxBlackBox::bbShowWindow()
532   {
533     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
534                         <<bbGetFullName()<<"]"<<std::endl);
535  
536     // If Event Handler for the widget does not exist or is obsolete : create it 
537     if (bbGetOutputWidget()!=0)
538       {
539         if (bbGetWidgetEventHandler()==0)
540           {
541             bbtkDebugMessage("Process",3,
542                              "-> No widget event handler : creating one"
543                              <<std::endl);
544             new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
545           }
546         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
547                   ( bbGetOutputWidget() ) )
548           {
549             bbtkDebugMessage("Process",3,
550                              "-> Obsolete widget event handler : re-creating one"
551                              <<std::endl);
552             delete bbGetWidgetEventHandler();
553             new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
554           }
555         // Sets the name of the wxWindow to the input WinTitle
556         bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
557       }
558
559     // If the output 'Widget' is connected then it's gonna 
560     // be captured by its parent window : nothing to do 
561     if ( (*bbGetOutputConnectorMap().find("Widget")).second
562          ->GetConnectionVector().size() != 0 ) 
563       {
564         
565         bbtkDebugMessage("Process",2,
566                          "-> Output 'Widget' connected : nothing to do"
567                          <<std::endl);
568         bbtkDebugDecTab("Process",1);
569         return;
570       }
571
572
573     Window* show = 0;
574     // If the window already exists : no need creating it
575     if (bbGetWindow()!=0)
576       {
577         bbtkDebugMessage("Process",2,
578                          "-> Window already exists"
579                          <<std::endl);
580         show = bbGetWindow();
581       }
582     // Else if the widget exists : create window 
583     else if (bbGetOutputWidget()!=0) 
584       {
585         bbtkDebugMessage("Process",2,
586                          "-> Widget exists : creating the window"
587                          <<std::endl);
588
589
590         // Input WinDialog set to true : creating a Dialog
591         if (bbGetInputWinDialog()) 
592           {
593             bbtkDebugMessage("Process",2,
594                              "   Input WinDialog set to true : creating a Dialog"
595                              <<std::endl);
596             show = (Window*) new WxBlackBoxDialog( this,
597                                                    Wx::GetTopWindow(), 
598                                                    std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
599                                                    wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
600           }
601         // Input WinDialog set to false : creating a Frame
602         else 
603           {
604             bbtkDebugMessage("Process",2,
605                              "   Input WinDialog set to false : creating a Frame"
606                              <<std::endl);
607             show = (Window*) new WxBlackBoxFrame( this,
608                                                   Wx::GetTopWindow(), 
609                                                   std2wx( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
610                                                   wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
611           }
612
613       }
614     // No window nor widget : error
615     else
616       {
617         bbtkError("WxBlackBox::bbShowWindow() ["
618                   <<bbGetFullName()
619                   <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
620       }
621  
622     
623     // Show the window
624     if (true) //!show->IsShown())
625       {
626         show->bbShow(); 
627       }
628     else 
629       {
630         bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
631       }
632   
633
634     bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
635                         <<bbGetFullName()<<"]"<<std::endl);
636     bbtkDebugDecTab("Process",1);
637   }
638   //==================================================================
639
640
641
642
643   //==================================================================
644    void WxBlackBox::bbHideWindow()
645   {
646     bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
647                         <<bbGetFullName()<<"]"<<std::endl);
648
649     if (bbGetWindow()!=0) bbGetWindow()->bbHide();
650
651     bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
652                         <<bbGetFullName()<<"]"<<std::endl);
653   }
654   //==================================================================
655
656
657
658
659 }//namespace bbtk
660
661
662 #endif
663