]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.cxx
MACOS configure
[bbtk.git] / kernel / src / bbtkWxBlackBox.cxx
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbtkWxBlackBox.cxx,v $
4   Language:  C++
5   Date:      $Date: 2009/03/23 13:06:41 $
6   Version:   $Revision: 1.37 $
7 =========================================================================*/
8
9 /* ---------------------------------------------------------------------
10
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
13 *
14 *  This software is governed by the CeCILL-B license under French law and 
15 *  abiding by the rules of distribution of free software. You can  use, 
16 *  modify and/ or redistribute the software under the terms of the CeCILL-B 
17 *  license as circulated by CEA, CNRS and INRIA at the following URL 
18 *  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
19 *  or in the file LICENSE.txt.
20 *
21 *  As a counterpart to the access to the source code and  rights to copy,
22 *  modify and redistribute granted by the license, users are provided only
23 *  with a limited warranty  and the software's author,  the holder of the
24 *  economic rights,  and the successive licensors  have only  limited
25 *  liability. 
26 *
27 *  The fact that you are presently reading this means that you have had
28 *  knowledge of the CeCILL-B license and that you accept its terms.
29 * ------------------------------------------------------------------------ */                                                                         
30
31
32 #ifdef _USE_WXWIDGETS_
33
34
35
36 /**
37  *  \file 
38  *  \brief 
39  */
40  
41 #include "bbtkWxBlackBox.h"
42 #include "bbtkBlackBoxOutputConnector.h"
43
44 //#include "bbtkWxContainerBlackBox.h"
45 #include <wx/dialog.h>
46
47 //#include "bbtkData.h"
48 //#include "bbtkFactory.h"
49
50
51
52
53 namespace bbtk
54 {
55
56
57
58
59   //=========================================================================
60   // WxBlackBoxWindow
61   //=========================================================================
62
63
64
65   //=========================================================================
66   WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox::Pointer box)
67     : mBox(box), mShown(false)
68   {
69     bbtkDebugMessage("wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
70                      mBox.lock()->bbGetFullName()<<")"<<std::endl);
71     mBox.lock()->bbSetWindow(this);
72     Wx::IncNbWindowsAlive();
73   }
74   //=========================================================================
75
76   //=========================================================================
77   WxBlackBoxWindow::~WxBlackBoxWindow()
78   {
79     bbtkDebugMessage("wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() "
80                      <<this<<std::endl);
81     bbHide();
82     Wx::DecNbWindowsAlive();
83     if (!mBox.expired())
84       {
85         mBox.lock()->bbSetWindow(0);
86       }
87   }
88   //========================================================================= 
89
90
91   //=========================================================================
92   void WxBlackBoxWindow::bbShow()
93   {
94     if (bbIsShown()) return;
95     bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbShow()"<<std::endl);
96     Wx::IncNbWindowsShown();
97     mShown = true;
98     if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnShow();
99   }
100   //=========================================================================
101
102   //=========================================================================
103   void WxBlackBoxWindow::bbHide()
104   {
105     if (!bbIsShown()) return;
106     bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbHide()"<<std::endl);
107     Wx::DecNbWindowsShown();
108     mShown = false;
109   }
110   //=========================================================================
111
112   //=========================================================================
113   void WxBlackBoxWindow::bbClose()
114   {
115   }
116   //=========================================================================
117
118
119   //=========================================================================
120   // WxBlackBoxDialog
121   //=========================================================================
122
123   //=========================================================================
124   WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox::Pointer box,
125                                      wxWindow *parent,
126                                      wxString title,
127                                      wxSize size)
128     :
129     wxDialog( parent, 
130                 -1, 
131                 title,
132                 wxDefaultPosition,
133                 size,
134                 wxRESIZE_BORDER | 
135                 wxSYSTEM_MENU  |
136                 wxCLOSE_BOX |
137                 wxMAXIMIZE_BOX | 
138                 wxMINIMIZE_BOX | 
139                 wxCAPTION  
140               ),
141     WxBlackBoxWindow(box)
142   {
143     bbtkDebugMessage("wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
144                      bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
145                      <<title<<",size)"<<std::endl);
146     // Insert the widget into the window
147     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
148           // LG 22/11/08 : new widget pipeline
149           bbGetBlackBox()->bbCreateWidgetAndEventHandler(this);
150     wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
151 // old :    widget->Reparent(this);
152     sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
153     //SetAutoLayout(true);
154     SetSizer(sizer);
155     Layout();
156   }
157   //=========================================================================
158   
159   //=========================================================================
160   void WxBlackBoxDialog::bbShow()
161   { 
162     if (bbIsShown()) return;
163     bbtkDebugMessage("wx",5,"WxBlackBoxDialog::bbShow() ["
164                      <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
165     WxBlackBoxWindow::bbShow();
166         Show(false);
167     SetReturnCode( wxDialog::ShowModal() ); 
168     bbClose();
169   }
170   //=========================================================================
171
172   //=========================================================================
173   void WxBlackBoxDialog::bbHide()
174   {
175     bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbHide()"<<std::endl);
176     WxBlackBoxWindow::bbHide();
177     Hide();
178   }
179   //=========================================================================
180
181   //=========================================================================
182   void WxBlackBoxDialog::bbClose()
183   {
184     bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbClose()"<<std::endl);
185     wxDialog::Destroy();
186   }
187   //=========================================================================
188
189   //=========================================================================
190   WxBlackBoxDialog::~WxBlackBoxDialog()
191   {
192   }
193   //=========================================================================
194
195
196
197
198
199   //=========================================================================
200   // WxBlackBoxFrame
201   //=========================================================================
202
203   //=========================================================================
204   WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox::Pointer box,
205                                    wxWindow *parent,
206                                    wxString title,
207                                    wxSize size)
208     :  wxFrame( parent, 
209                -1, 
210                title,
211                wxDefaultPosition,
212                size,
213                wxRESIZE_BORDER | 
214                wxSYSTEM_MENU  |
215                wxCLOSE_BOX |
216                wxMAXIMIZE_BOX | 
217                wxMINIMIZE_BOX | 
218                wxCAPTION  
219                 ),
220        WxBlackBoxWindow(box)
221   {
222     bbtkDebugMessage("wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
223                      bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
224                      <<title<<",size)"<<std::endl);
225     // Insert the widget into the window
226     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
227           // LG 22/11/08 : new widget pipeline
228           bbGetBlackBox()->bbCreateWidgetAndEventHandler(this);
229     wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
230     wxFrame* frame = (wxFrame*)this;
231 // old :    widget->Reparent(frame);
232     sizer->Add( widget, 1, wxALL|wxGROW, 2);
233     //  frame->SetAutoLayout(true);
234     frame->SetSizer(sizer);
235     //frame->Fit();
236     frame->Layout();
237   }
238   //=========================================================================
239   
240   //=========================================================================
241   WxBlackBoxFrame::~WxBlackBoxFrame()
242   {
243   }
244   //=========================================================================
245
246   //=========================================================================
247   void WxBlackBoxFrame::bbShow() 
248   { 
249     if (bbIsShown()) return;
250     bbtkDebugMessage("wx",5,"WxBlackBoxFrame::bbShow("
251                      <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
252     WxBlackBoxWindow::bbShow();
253     wxFrame::Show();
254     // This Update is ** MANDATORY ** 
255     // to synchronize wxvtkRenderWindowInteractor objects
256     // (force wx objects creation **NOW**)
257     
258     
259 #if defined(_WIN32)
260     wxFrame::Refresh();
261 #endif
262     
263     wxFrame::Update();
264     wxFrame::SetFocus();
265     //    if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnShow();
266   }
267   //=========================================================================
268
269   //=========================================================================
270   void WxBlackBoxFrame::bbHide()
271   {
272     bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbHide()"<<std::endl);
273     WxBlackBoxWindow::bbHide();
274     wxFrame::Hide();
275     if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnHide();
276   }
277   //=========================================================================
278
279   //=========================================================================
280   void WxBlackBoxFrame::bbClose()
281   {
282     bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbClose()"<<std::endl);
283     wxFrame::Close();
284   }
285   //=========================================================================
286
287
288
289   //=========================================================================
290   // WxBlackBoxWidgetEventHandler
291   //=========================================================================
292
293   //=========================================================================
294   WxBlackBoxWidgetEventHandler::
295   WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box, 
296                                 wxWindow *widget )
297     :
298     mBox(box),
299     mWindow(widget)
300   { 
301     bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox.lock()->bbGetFullName()<<")"<<std::endl);
302
303     mBox.lock()->bbSetWidgetEventHandler(this);
304
305     Connect (  mWindow->GetId(),
306                wxEVT_DESTROY,
307                (wxObjectEventFunction) 
308                (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
309                 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
310     
311     mWindow->PushEventHandler(this);
312     
313   }
314   //=========================================================================
315
316   //=========================================================================
317   WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
318   {
319     if (mBox.expired()) return;
320     bbtkDebugMessage("wx",9,
321                      "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() ["
322                      <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
323      mBox.lock()->bbSetWidgetEventHandler(0);   
324   }
325   //=========================================================================
326
327   //=========================================================================
328   void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
329   {
330     if (mBox.expired()) return;
331     bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
332                      <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
333     mBox.lock()->bbSetOutputWidget(0);
334     // LGSIGNAL
335     //    mBox.lock()->bbSetModifiedStatus();
336   }
337   //=========================================================================
338
339
340
341
342
343
344
345   //=========================================================================
346   // WxBlackBox
347   //=========================================================================
348
349   //=========================================================================
350   //=========================================================================
351   //=========================================================================
352   //=========================================================================
353   BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
354   //=========================================================================
355   
356   //=========================================================================
357   void WxBlackBox::bbUserConstructor()
358   {
359     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
360     bbInitAttributes();
361   }
362   //=========================================================================
363
364   //=========================================================================
365   void WxBlackBox::bbUserCopyConstructor(bbtk::BlackBox::Pointer)
366   {
367     bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
368                      <<std::endl);
369     bbInitAttributes();
370   }
371   //=========================================================================
372
373
374   //=========================================================================
375   void WxBlackBox::bbUserDestructor()
376   {
377     bbtkDebugMessage("wx",9,"==> WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
378     if (bbGetWindow()) {
379       delete bbGetWindow();
380       bbSetWindow(0);
381     }
382     bbtkDebugMessage("wx",9,"<== WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
383   }
384   //=========================================================================
385   
386
387   //=========================================================================
388   /**
389    * \brief Initialize the attributes of the class
390    *
391    */
392   void WxBlackBox::bbInitAttributes()
393   {
394     bbmWindow = 0;
395     //    bbmWidget = 0;
396     //    bbSetInputWinParent(0);
397     bbSetInputWinTitle(bbGetName());
398     bbSetInputWinWidth(800);
399     bbSetInputWinHeight(800);
400     bbSetInputWinDialog(false);
401     bbSetOutputWidget(0);
402
403     bbSetWidgetEventHandler(0);
404     //    bbSetUpdateTransferedToParent(false);
405   }
406   //=========================================================================
407
408
409         //=========================================================================
410         void WxBlackBox::bbCreateWidget()
411         {
412                 // If output widget not connected : have to create and show the window
413                 if ( (*bbGetOutputConnectorMap().find("Widget")).second->GetConnectionVector().size() == 0 ) 
414                 {
415                         Window* show = 0;
416                         // If the window already exists : no need creating it
417                         if (bbGetWindow()!=0)
418                         {
419                                 bbtkDebugMessage("wx",2,
420                                                                  "-> Window already exists"
421                                                                  <<std::endl);
422                                 show = bbGetWindow();
423                         } // bbGetWindow
424                         // Else create window 
425                         else 
426                         {
427                                 bbtkDebugMessage("wx",2,
428                                                                  "-> Creating the window"
429                                                                  <<std::endl);
430                                 
431                                 // Input WinDialog set to true : creating a Dialog
432                                 if (bbGetInputWinDialog()) 
433                                 {
434                                         bbtkDebugMessage("wx",2,
435                                                                          "   Input WinDialog set to true : creating a Dialog"
436                                                                          <<std::endl);
437                                         show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
438                                                                                                                   Wx::GetTopWindow(),
439                                                                                                                   std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
440                                                                                                                   wxSize( bbGetInputWinWidth() , bbGetInputWinHeight()  )); 
441                                         //bbGetInputWinWidth() , bbGetInputWinHeight() ) );
442 //                                      show->bbGetDialog()->Update();
443 //                                      show->bbGetDialog()->Refresh();
444                                         
445                                         //show->bbGetDialog()->Iconize(true);
446                                         show->bbGetDialog()->Show(true);
447 //                                      show->bbGetDialog()->Show(false);
448 //                                      show->bbGetDialog()->SetSize(wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ));
449                                         
450                                 }
451                                 // Input WinDialog set to false : creating a Frame
452                                 else 
453                                 {
454                                         bbtkDebugMessage("process",2,
455                                                                          "   Input WinDialog set to false : creating a Frame"
456                                                                          <<std::endl);
457                                         show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
458                                                                                                                  Wx::GetTopWindow(),
459                                                                                                                  std2wx( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
460                                                                                                                  wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
461 //                                      show->bbGetFrame()->Update();
462 //                                      show->bbGetFrame()->Refresh();
463                                                                                         show->bbGetFrame()->Show();
464                                 }
465                                 
466                         } // else bbGetWindow
467 //                      show->bbShow();
468                         
469                 } // bbGetOutputConnectorMap().find("Widget")).second->GetConnectionVector().size()  
470         }
471         //=========================================================================
472
473         
474         //=========================================================================
475         void WxBlackBox::bbShowWidget()
476         {
477                 // Show the window
478                 Window *show = bbGetWindow();
479                 if (show!=NULL)
480                 {
481                         show->bbShow(); 
482                 }
483         }
484         //=========================================================================
485         
486         
487         //=========================================================================
488         void WxBlackBox::bbProcess()
489         { 
490                 // TODO : update the window size and title 
491                 this->bbUserProcess(); 
492         }
493         //=========================================================================
494         
495         /* EED BORRAME  original  18 mars 2009
496   //=========================================================================
497   void WxBlackBox::bbProcess()
498   { 
499     // If output widget not connected : have to create and show the window
500     if ( (*bbGetOutputConnectorMap().find("Widget")).second->GetConnectionVector().size() == 0 ) 
501       {
502                 Window* show = 0;
503         // If the window already exists : no need creating it
504         if (bbGetWindow()!=0)
505           {
506             bbtkDebugMessage("wx",2,
507                              "-> Window already exists"
508                              <<std::endl);
509             show = bbGetWindow();
510           }
511         // Else create window 
512         else 
513           {
514             bbtkDebugMessage("wx",2,
515                              "-> Creating the window"
516                              <<std::endl);
517             
518             // Input WinDialog set to true : creating a Dialog
519             if (bbGetInputWinDialog()) 
520               {
521                 bbtkDebugMessage("wx",2,
522                                  "   Input WinDialog set to true : creating a Dialog"
523                                  <<std::endl);
524                 show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
525                                                        Wx::GetTopWindow(),
526                                                        std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
527                                                        wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
528               }
529             // Input WinDialog set to false : creating a Frame
530             else 
531               {
532                 bbtkDebugMessage("process",2,
533                                  "   Input WinDialog set to false : creating a Frame"
534                                  <<std::endl);
535                 show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
536                                                       Wx::GetTopWindow(),
537                                                       std2wx( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
538                                                       wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
539               }
540             
541           }
542         
543         // Show the window
544         show->bbShow(); 
545         
546         
547       }           
548     this->bbUserProcess(); 
549     
550   }
551   //=========================================================================
552 */ 
553         
554         
555   //=========================================================================
556   void WxBlackBox::bbCreateWidgetAndEventHandler(wxWindow* parent)
557   {
558     if (bbGetOutputWidget()==0)
559       {
560         this->bbUserCreateWidget(parent);
561       }         
562     // If Event Handler for the widget does not exist or is obsolete : create it 
563     if (bbGetOutputWidget()!=0)
564       {
565         if (bbGetWidgetEventHandler()==0)
566           {
567             bbtkDebugMessage("wx",3,
568                              "-> No widget event handler : creating one"
569                              <<std::endl);
570             new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
571                                              bbGetOutputWidget());
572           }
573         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
574                   ( bbGetOutputWidget() ) )
575           {
576             bbtkDebugMessage("wx",3,
577                              "-> Obsolete widget event handler : re-creating one"
578                              <<std::endl);
579             delete bbGetWidgetEventHandler();
580             new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
581                                              bbGetOutputWidget());
582           }
583         // Sets the name of the wxWindow to the input WinTitle
584         bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
585       }
586     
587     
588   }
589   //=========================================================================
590   
591   
592   //========================================================================= 
593   wxWindow*  WxBlackBox::bbCreateWidgetOfInput(const std::string& in, 
594                                                wxWindow* parent)
595   {
596     wxWindow* w = 0;
597     // If input is connected 
598     BlackBoxInputConnector* c = bbGetInputConnectorMap().find(in)->second ;
599     if ( c->IsConnected() )                     
600       {
601         // Get black box from 
602         BlackBox::Pointer from = 
603           c->GetConnection()->GetBlackBoxFrom();
604         // Cast it into a WxBlackBox
605         WxBlackBox::Pointer wfrom = boost::dynamic_pointer_cast<WxBlackBox>(from);
606         // Call bbCreateWidgetAndEventHandler
607         wfrom->bbCreateWidgetAndEventHandler(parent);
608         // Get the widget created
609         w = wfrom->bbGetOutputWidget();
610       }
611     return w;
612   }
613   //==================================================================
614
615
616   //==================================================================
617    void WxBlackBox::bbHideWindow()
618   {
619     bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbHideWindow() ["
620                         <<bbGetFullName()<<"]"<<std::endl);
621
622     if (bbGetWindow()!=0) bbGetWindow()->bbHide();
623
624     bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbHideWindow() ["
625                         <<bbGetFullName()<<"]"<<std::endl);
626   }
627   //==================================================================
628
629
630   //==================================================================
631    void WxBlackBox::bbCloseWindow()
632   {
633     bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbCloseWindow() ["
634                         <<bbGetFullName()<<"]"<<std::endl);
635
636     if (bbGetWindow()!=0) bbGetWindow()->bbClose();
637
638     bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbCloseWindow() ["
639                         <<bbGetFullName()<<"]"<<std::endl);
640   }
641   //==================================================================
642
643   //==================================================================
644   WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
645   {
646     if (bbGetWindow()!=0) return bbGetWindow();
647     BlackBox::OutputConnectorMapType::const_iterator i 
648       = bbGetOutputConnectorMap().find("Widget");
649     if ( i->second->GetConnectionVector().size() != 0 ) 
650       {
651         return boost::static_pointer_cast<WxBlackBox>
652           (i->second->GetConnectionVector().front() //.lock()
653            ->GetBlackBoxTo())->bbGetContainingWindow();
654       }
655     return 0;
656   }
657   //==================================================================
658
659
660   //==================================================================
661   bool WxBlackBox::bbIsShown()
662   {
663     if (bbGetContainingWindow()!=0)
664       return bbGetContainingWindow()->bbIsShown();
665     return false;
666   }
667   //==================================================================
668
669
670 }//namespace bbtk
671
672
673 #endif
674