]> Creatis software - bbtk.git/blob - kernel/src/bbtkKWBlackBox.cxx
501ebef7d2707b894d53ac9e78d9fb09e9511d29
[bbtk.git] / kernel / src / bbtkKWBlackBox.cxx
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbtkKWBlackBox.cxx,v $
4   Language:  C++
5   Date:      $Date: 2008/12/02 10:21:40 $
6   Version:   $Revision: 1.3 $
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  *  \file 
32  *  \brief 
33  */
34
35 #ifdef USE_KWWIDGETS
36
37
38
39
40  
41 #include "bbtkKWBlackBox.h"
42 #include "vtkKWBlackBoxDialog.h"
43
44
45 namespace bbtk
46 {
47
48
49
50   /*
51   //=========================================================================
52   // KWBlackBoxWidgetEventHandler
53   //=========================================================================
54
55   //=========================================================================
56   KWBlackBoxWidgetEventHandler::
57   KWBlackBoxWidgetEventHandler( KWBlackBox::Pointer box, 
58                                 vtkKWWidget *widget )
59     :
60     mBox(box),
61     mWindow(widget)
62   { 
63     bbtkDebugMessage("kw",9,"KWBlackBoxWidgetEventHandler::KWBlackBoxWidgetEventHandler("<<mBox.lock()->bbGetFullName()<<")"<<std::endl);
64
65     mBox.lock()->bbSetWidgetEventHandler(this);
66
67     Connect (  mWindow->GetId(),
68                kwEVT_DESTROY,
69                (kwObjectEventFunction) 
70                (void (kwEvtHandler::*)(kwWindowDestroyEvent& c))
71                 &KWBlackBoxWidgetEventHandler::OnWindowDestroy );
72     
73     mWindow->PushEventHandler(this);
74     
75   }
76   //=========================================================================
77
78   //=========================================================================
79   KWBlackBoxWidgetEventHandler::~KWBlackBoxWidgetEventHandler()
80   {
81     if (mBox.expired()) return;
82     bbtkDebugMessage("kw",9,
83                      "KWBlackBoxWidgetEventHandler::~KWBlackBoxWidgetEventHandler() ["
84                      <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
85      mBox.lock()->bbSetWidgetEventHandler(0);   
86   }
87   //=========================================================================
88
89   //=========================================================================
90   void KWBlackBoxWidgetEventHandler::OnWindowDestroy(kwWindowDestroyEvent&)
91   {
92     if (mBox.expired()) return;
93     bbtkDebugMessage("kw",9,"KWBlackBoxWidgetEventHandler::OnWindowDestroy() ["
94                      <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
95     mBox.lock()->bbSetOutputWidget(0);
96     mBox.lock()->bbSetModifiedStatus();
97   }
98   //=========================================================================
99
100
101   */
102
103
104
105
106   //=========================================================================
107   // KWBlackBox
108   //=========================================================================
109
110   //=========================================================================
111   //=========================================================================
112   //=========================================================================
113   //=========================================================================
114   BBTK_BLACK_BOX_IMPLEMENTATION(KWBlackBox,AtomicBlackBox);
115   //=========================================================================
116   
117   //=========================================================================
118   void KWBlackBox::bbUserConstructor()
119   {
120     bbtkDebugMessage("Kernel",9,"KWBlackBox::bbUserConstructor()"<<std::endl);
121     bbInitAttributes();
122   }
123   //=========================================================================
124
125   //=========================================================================
126   void KWBlackBox::bbUserCopyConstructor(bbtk::BlackBox::Pointer)
127   {
128     bbtkDebugMessage("Kernel",9,"KWBlackBox::bbUserCopyConstructor()"
129                      <<std::endl);
130     bbInitAttributes();
131   }
132   //=========================================================================
133
134
135   //=========================================================================
136   void KWBlackBox::bbUserDestructor()
137   {
138     bbtkDebugMessage("kw",9,"==> KWBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
139     if (bbGetWindow()) {
140       bbGetWindow()->bbClose();
141       bbSetWindow(0);
142     }
143     bbtkDebugMessage("kw",9,"<== KWBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
144   }
145   //=========================================================================
146   
147
148
149   //=========================================================================
150   /**
151    * \brief Initialize the attributes of the class
152    *
153    */
154   void KWBlackBox::bbInitAttributes()
155   {
156     bbmWindow = 0;
157     //    bbmWidget = 0;
158     //    bbSetInputWinParent(0);
159     bbSetInputWinTitle(bbGetName());
160     bbSetInputWinWidth(800);
161     bbSetInputWinHeight(800);
162     bbSetInputWinDialog(false);
163     bbSetOutputWidget(0);
164
165     //    bbSetWidgetEventHandler(0);
166     bbSetUpdateTransferedToParent(false);
167   }
168   //=========================================================================
169
170   //=========================================================================
171   /// Main processing method of the box.
172   void KWBlackBox::bbExecute(bool force)
173   {
174     bbtkDebugMessageInc("process",2,
175                         "=> KWBlackBox::bbExecute("<<(int)force<<") ["
176                         <<bbGetFullName()<<"]"<<std::endl);
177
178     // If the output 'Widget' is connected then 
179     // we must execute the parent box
180     BlackBox::OutputConnectorMapType::const_iterator i 
181       = bbGetOutputConnectorMap().find("Widget");
182
183     if ( i->second->GetConnectionVector().size() != 0 ) 
184       {
185         bbtkDebugMessage("process",3,
186                          "-> Output 'Widget' connected : transfering execution to parent"
187                          <<std::endl);
188         
189         i->second->GetConnectionVector().front() //.lock()
190           ->GetBlackBoxTo()->bbExecute(force);
191
192       }
193     // else call 'standard' BlackBox execution method
194     else 
195       {
196         BlackBox::bbExecute(force);
197       }
198     //
199
200     bbtkDebugMessageDec("process",2,
201                         "<= KWBlackBox::bbExecute() ["
202                         <<bbGetFullName()<<"]"<<std::endl);
203   }
204   //=========================================================================
205
206
207   //=========================================================================
208   /// Main processing method of the box.
209   IOStatus KWBlackBox::bbBackwardUpdate( Connection::Pointer caller )
210   {
211     bbtkDebugMessage("process",3,
212                      "=> KWBlackBox::bbBackwardUpdate("
213                      <<(caller?caller->GetFullName():"0")<<") ["
214                      <<bbGetFullName()<<"]"<<std::endl);
215
216     if ( ! (( bbGetStatus() == MODIFIED ) ||
217             ( bbBoxProcessModeIsAlways() )) )
218       {
219         bbtkDebugMessage("process",3,"Up-to-date : nothing to do"<<std::endl);
220         bbtkDebugMessage("process",3,
221                          "<= KWBlackBox::bbBackwardUpdate("
222                          <<(caller?caller->GetFullName():"0")<<") ["
223                          <<bbGetFullName()<<"]"<<std::endl);
224         return bbGetStatus();
225       }
226  
227     // If the caller's box to is not the box to connected to the 
228     // output 'Widget'
229
230     BlackBox::OutputConnectorMapType::const_iterator i 
231       = bbGetOutputConnectorMap().find("Widget") ;
232     if ( i->second->GetConnectionVector().size() != 0 )
233       
234       {
235         BlackBox::Pointer to = 
236           i->second->GetConnectionVector()[0]->GetBlackBoxTo();
237                 
238         if (caller) 
239           {
240             bbtkDebugMessage("process",3,
241                              "-> Output 'Widget' connected to '"
242                              <<to->bbGetFullName()<<"' - caller->to = '"
243                              <<caller->GetBlackBoxTo()->bbGetFullName()
244                              <<"'"
245                              <<std::endl);
246           }
247         else
248           {
249             bbtkDebugMessage("process",3,
250                              "-> Output 'Widget' connected to '"
251                              <<to->bbGetFullName()<<"'"
252                              <<std::endl);
253           }
254         if ((caller==0) ||
255             ( (caller!=0) && 
256               (caller->GetBlackBoxTo() != to)&&
257               (!bbGetUpdateTransferedToParent())&&
258               (!to->bbGetExecuting()) 
259               )
260             )
261           {
262             bbtkDebugMessage("process",3,
263                              "   ... Transfering update order to parent"
264                              <<std::endl);
265             
266             bbSetUpdateTransferedToParent(true);
267             i->second->GetConnectionVector().front() //.lock()
268               ->GetBlackBoxTo()->bbExecute(false);
269           }
270         else
271           {
272             bbSetUpdateTransferedToParent(false);
273             bbtkDebugMessage("process",3,
274                              "   ... No need to transfer to parent"
275                              <<std::endl);
276           }
277       }
278     /*    
279
280     // If the caller is not the connection to the output widget
281     // and the output 'Widget' is connected then 
282     // we must execute the parent box 
283     // but only one time 
284     // (this is the role of the flag UpdateTransferedToParent)
285     if ( (caller==0) ||
286          ((caller!=0)&&(caller->GetBlackBoxFromOutput()!="Widget"))
287          )
288       {
289       }
290     */
291     // call 'standard' BlackBox execution method
292     if (!bbGetUpdateTransferedToParent()) 
293       { 
294           AtomicBlackBox::bbBackwardUpdate(caller);
295       }
296     
297     bbtkDebugMessageDec("process",3,
298                         "<= KWBlackBox::bbBackwardUpdate() ["
299                         <<bbGetFullName()<<"]"<<std::endl);
300     
301    return bbGetStatus();
302      
303
304   }
305
306   //=========================================================================
307   void KWBlackBox::bbProcess()
308   { 
309 /*
310           if (bbGetOutputWidget()==0) this->bbUserCreateWidget();
311     this->bbUserProcess(); 
312     bbShowWindow();
313     //    this->bbUserOnShow();
314 */
315     this->bbUserProcess(); 
316
317     // If output widget not connected create the window 
318     if ( (*bbGetOutputConnectorMap().find("Widget")).second
319          ->GetConnectionVector().size() == 0 ) 
320       {
321         Window* show = 0;
322         // If the window already exists : no need creating it
323         if (bbGetWindow()!=0)
324           {
325             bbtkDebugMessage("kw",2,
326                              "-> Window already exists"
327                              <<std::endl);
328             show = bbGetWindow();
329           }
330         // Else create window 
331         else 
332           {
333             bbtkDebugMessage("kw",2,
334                              "-> Creating the window"
335                              <<std::endl);
336             KW::GetApplication();
337             
338             // Input WinDialog set to true : creating a Dialog
339             /*
340             if (bbGetInputWinDialog()) 
341               {
342                 bbtkDebugMessage("kw",2,
343                                  "   Input WinDialog set to true : creating a Dialog"
344                                  <<std::endl);
345             */
346                 vtkKWBlackBoxDialog* win = vtkKWBlackBoxDialog::New();
347                 show = (Window*) win;
348                 win->bbSetBlackBox( GetThisPointer<KWBlackBox>());
349                 KW::GetApplication()->AddWindow((vtkKWWindowBase*)win);
350                 win->Create();
351                 win->SetResizable(0,0);
352                 bbUserCreateWidget(win->GetFrame());
353
354                 KW::GetApplication()->Script("place %s -x 0 -y 0 -width %d -height %d",
355                                              bbGetOutputWidget()->GetWidgetName(),
356                                              bbGetInputWinWidth(),
357                                              bbGetInputWinHeight());
358
359                 /*
360                 bbGetOutputWidget()->SetParent(win);
361                 bbGetOutputWidget()->Create();
362                 KW::GetApplication()->Script("pack %s -side left -anchor c -expand y",
363                         
364                                      //"pack %s -side top -anchor nw -expand y -fill none -padx 2 -pady 2", 
365                                              bbGetOutputWidget()->GetWidgetName());
366                 */                           
367                 /*      
368                   }
369         
370             // Input WinDialog set to false : creating a Frame
371             else 
372               {
373                 bbtkDebugMessage("process",2,
374                                  "   Input WinDialog set to false : creating a Frame"
375                                  <<std::endl);
376                 vtkKWBlackBoxFrame* win = vtkKWBlackBoxFrame::New();
377                 show = (Window*) win;
378                 win->bbSetBlackBox( GetThisPointer<KWBlackBox>());
379                 //              win->SetName( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN" );
380                 //              win->SetWidth( bbGetInputWinWidth() );
381                 //              win->SetHeight( bbGetInputWinHeight() );
382                 KW::GetApplication()->AddWindow((vtkKWWindowBase*)win);
383                 win->Create();
384                 
385                 bbGetOutputWidget()->SetParent(win);
386                 bbGetOutputWidget()->Create();
387                 KW::GetApplication()->Script("pack %s -side top -anchor nw -expand y -fill none -padx 2 -pady 2", 
388                                              bbGetOutputWidget()->GetWidgetName());           }
389         */
390         
391                 //      win->Invoke();
392           }
393         
394         // Show the window
395
396         show->bbShow(); 
397         //      std::cout << "KW::GetApplication()->Start();"<<std::endl;
398         //      KW::GetApplication()->Start();
399         //      std::cout << "AFTER KW::GetApplication()->Start();"<<std::endl;
400         
401       }           
402     //   
403     
404   }
405   //=========================================================================
406   
407   
408   /*
409   // LG 24/11/08 : New widget pipeline
410   void KWBlackBox::bbCreateWidgetAndEventHandler(vtkKWWidget* parent)
411   {
412     if (bbGetOutputWidget()==0)
413       {
414         this->bbUserCreateWidget(parent);
415       } 
416     
417     // If Event Handler for the widget does not exist or is obsolete : create it 
418     
419       if (bbGetOutputWidget()!=0)
420       {
421         if (bbGetWidgetEventHandler()==0)
422           {
423             bbtkDebugMessage("kw",3,
424                              "-> No widget event handler : creating one"
425                              <<std::endl);
426             new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
427                                              bbGetOutputWidget());
428           }
429         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
430                   ( bbGetOutputWidget() ) )
431           {
432             bbtkDebugMessage("kw",3,
433                              "-> Obsolete widget event handler : re-creating one"
434                              <<std::endl);
435             delete bbGetWidgetEventHandler();
436             new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
437                                              bbGetOutputWidget());
438           }
439         // Sets the name of the vtkKWWidget to the input WinTitle
440         bbGetOutputWidget()->SetName(bbtk::std2kw(bbGetInputWinTitle()));
441       }
442    
443   }
444     
445   */
446   
447   vtkKWWidget*  KWBlackBox::bbCreateWidgetOfInput(const std::string& in, vtkKWWidget* parent)
448   {
449     vtkKWWidget* w = 0;
450     // If input is connected 
451     BlackBoxInputConnector* c = bbGetInputConnectorMap().find(in)->second ;
452     if ( c->IsConnected() )                     
453       {
454         // Get black box from 
455         BlackBox::Pointer from = 
456           c->GetConnection()->GetBlackBoxFrom();
457         // Cast it into a KWBlackBox
458         KWBlackBox::Pointer wfrom = boost::dynamic_pointer_cast<KWBlackBox>(from);
459         // Call bbCreateWidget
460         wfrom->bbUserCreateWidget(parent);
461         // Get the widget created
462         w = wfrom->bbGetOutputWidget();
463       }
464     return w;
465   }
466   
467   
468 /*
469   //==================================================================
470   /// Specific methods for window creation during pipeline execution
471   /// Shows the window associated to the box 
472   /// (called after bbProcess during bbExecute)
473   void KWBlackBox::bbShowWindow()
474   {
475     bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbShowWindow() ["
476                         <<bbGetFullName()<<"]"<<std::endl);
477  
478     // If Event Handler for the widget does not exist or is obsolete : create it 
479     if (bbGetOutputWidget()!=0)
480       {
481         if (bbGetWidgetEventHandler()==0)
482           {
483             bbtkDebugMessage("kw",3,
484                              "-> No widget event handler : creating one"
485                              <<std::endl);
486             new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
487                                              bbGetOutputWidget());
488           }
489         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
490                   ( bbGetOutputWidget() ) )
491           {
492             bbtkDebugMessage("kw",3,
493                              "-> Obsolete widget event handler : re-creating one"
494                              <<std::endl);
495             delete bbGetWidgetEventHandler();
496             new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
497                                              bbGetOutputWidget());
498           }
499         // Sets the name of the vtkKWWidget to the input WinTitle
500         bbGetOutputWidget()->SetName(bbtk::std2kw(bbGetInputWinTitle()));
501       }
502
503     // If the output 'Widget' is connected then it's gonna 
504     // be captured by its parent window : nothing to do 
505     if ( (*bbGetOutputConnectorMap().find("Widget")).second
506          ->GetConnectionVector().size() != 0 ) 
507       {
508         
509         bbtkDebugMessage("kw",2,
510                          "-> Output 'Widget' connected : nothing to do"
511                          <<std::endl);
512         return;
513       }
514
515
516     Window* show = 0;
517     // If the window already exists : no need creating it
518     if (bbGetWindow()!=0)
519       {
520         bbtkDebugMessage("kw",2,
521                          "-> Window already exists"
522                          <<std::endl);
523         show = bbGetWindow();
524       }
525     // Else if the widget exists : create window 
526     else if (bbGetOutputWidget()!=0) 
527       {
528         bbtkDebugMessage("kw",2,
529                          "-> Widget exists : creating the window"
530                          <<std::endl);
531
532
533         // Input WinDialog set to true : creating a Dialog
534         if (bbGetInputWinDialog()) 
535           {
536             bbtkDebugMessage("kw",2,
537                              "   Input WinDialog set to true : creating a Dialog"
538                              <<std::endl);
539             show = (Window*) new KWBlackBoxDialog( GetThisPointer<KWBlackBox>(),
540                                                   // bbGetKWParent(), 
541                                                                                           // LG 24/11/08 : New widget pipeline
542                                                                                           KW::GetTopWindow(),
543                                                    std2kw( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
544                                                    kwSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
545           }
546         // Input WinDialog set to false : creating a Frame
547         else 
548           {
549             bbtkDebugMessage("process",2,
550                              "   Input WinDialog set to false : creating a Frame"
551                              <<std::endl);
552             show = (Window*) new KWBlackBoxFrame( GetThisPointer<KWBlackBox>(),
553                                                   // bbGetKWParent(), 
554                                                                                          // LG 24/11/08 : New widget pipeline
555                                                                                          KW::GetTopWindow(),
556                                                   std2kw( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
557                                                   kwSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
558           }
559
560       }
561     // No window nor widget : error
562     else
563       {
564         bbtkError("KWBlackBox::bbShowWindow() ["
565                   <<bbGetFullName()
566                   <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
567       }
568  
569     
570     // Show the window
571     if (true) //!show->IsShown())
572       {
573         show->bbShow(); 
574       }
575     else 
576       {
577         bbtkDebugMessage("kw",2,"-> Already shown : nothing to do"<<std::endl);
578       }
579   
580
581     bbtkDebugMessage("kw",2,"<= KWBlackBox::bbShowWindow() ["
582                         <<bbGetFullName()<<"]"<<std::endl);
583
584   }
585   //==================================================================
586 */
587
588
589
590   //==================================================================
591    void KWBlackBox::bbHideWindow()
592   {
593     bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbHideWindow() ["
594                         <<bbGetFullName()<<"]"<<std::endl);
595
596     if (bbGetWindow()!=0) bbGetWindow()->bbHide();
597
598     bbtkDebugMessageDec("kw",2,"<= KWBlackBox::bbHideWindow() ["
599                         <<bbGetFullName()<<"]"<<std::endl);
600   }
601   //==================================================================
602
603
604   //==================================================================
605    void KWBlackBox::bbCloseWindow()
606   {
607     bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbCloseWindow() ["
608                         <<bbGetFullName()<<"]"<<std::endl);
609
610     if (bbGetWindow()!=0) bbGetWindow()->bbClose();
611
612     bbtkDebugMessageDec("kw",2,"<= KWBlackBox::bbCloseWindow() ["
613                         <<bbGetFullName()<<"]"<<std::endl);
614   }
615   //==================================================================
616
617   //==================================================================
618   KWBlackBox::Window* KWBlackBox::bbGetContainingWindow()
619   {
620     if (bbGetWindow()!=0) return bbGetWindow();
621     BlackBox::OutputConnectorMapType::const_iterator i 
622       = bbGetOutputConnectorMap().find("Widget");
623     if ( i->second->GetConnectionVector().size() != 0 ) 
624       {
625         return boost::static_pointer_cast<KWBlackBox>
626           (i->second->GetConnectionVector().front() //.lock()
627            ->GetBlackBoxTo())->bbGetContainingWindow();
628       }
629     return 0;
630   }
631   //==================================================================
632
633
634   //==================================================================
635         // LG 24/11/08 : New widget pipeline
636         //  vtkKWWidget* KWBlackBox::bbGetKWParent() { return KW::GetTopWindow(); }
637   //==================================================================
638   
639   
640   //==================================================================
641   bool KWBlackBox::bbIsShown()
642   {
643     if (bbGetContainingWindow()!=0)
644       return bbGetContainingWindow()->bbIsShown();
645     return false;
646   }
647   //==================================================================
648
649
650 }//namespace bbtk
651
652
653 #endif
654