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