]> Creatis software - bbtk.git/blob - kernel/src/bbtkKWBlackBox.cxx
KWWidgets support
[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 08:38:08 $
6   Version:   $Revision: 1.2 $
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                 //bbGetOutputWidget()->GetWidgetName());
350                              // win->SetName( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN" );
351                 //              win->SetWidth( bbGetInputWinWidth() );
352                 //              win->SetHeight( bbGetInputWinHeight() );
353                 KW::GetApplication()->AddWindow((vtkKWWindowBase*)win);
354                 win->Create();
355                 //              std::cout << "TclName='"<<win->GetTclName()<<"'"<<std::endl;
356                 
357                 bbUserCreateWidget(win);
358                 KW::GetApplication()->Script("pack %s -side top -expand yes",
359                                              bbGetOutputWidget()->GetWidgetName());
360                 /*
361                 bbGetOutputWidget()->SetParent(win);
362                 bbGetOutputWidget()->Create();
363                 KW::GetApplication()->Script("pack %s -side left -anchor c -expand y",
364                         
365                                      //"pack %s -side top -anchor nw -expand y -fill none -padx 2 -pady 2", 
366                                              bbGetOutputWidget()->GetWidgetName());
367                 */                           
368                 /*      
369                   }
370         
371             // Input WinDialog set to false : creating a Frame
372             else 
373               {
374                 bbtkDebugMessage("process",2,
375                                  "   Input WinDialog set to false : creating a Frame"
376                                  <<std::endl);
377                 vtkKWBlackBoxFrame* win = vtkKWBlackBoxFrame::New();
378                 show = (Window*) win;
379                 win->bbSetBlackBox( GetThisPointer<KWBlackBox>());
380                 //              win->SetName( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN" );
381                 //              win->SetWidth( bbGetInputWinWidth() );
382                 //              win->SetHeight( bbGetInputWinHeight() );
383                 KW::GetApplication()->AddWindow((vtkKWWindowBase*)win);
384                 win->Create();
385                 
386                 bbGetOutputWidget()->SetParent(win);
387                 bbGetOutputWidget()->Create();
388                 KW::GetApplication()->Script("pack %s -side top -anchor nw -expand y -fill none -padx 2 -pady 2", 
389                                              bbGetOutputWidget()->GetWidgetName());           }
390         */
391         
392                 //      win->Invoke();
393           }
394         
395         // Show the window
396
397         show->bbShow(); 
398         //      std::cout << "KW::GetApplication()->Start();"<<std::endl;
399         //      KW::GetApplication()->Start();
400         //      std::cout << "AFTER KW::GetApplication()->Start();"<<std::endl;
401         
402       }           
403     //   
404     
405   }
406   //=========================================================================
407   
408   
409   /*
410   // LG 24/11/08 : New widget pipeline
411   void KWBlackBox::bbCreateWidgetAndEventHandler(vtkKWWidget* parent)
412   {
413     if (bbGetOutputWidget()==0)
414       {
415         this->bbUserCreateWidget(parent);
416       } 
417     
418     // If Event Handler for the widget does not exist or is obsolete : create it 
419     
420       if (bbGetOutputWidget()!=0)
421       {
422         if (bbGetWidgetEventHandler()==0)
423           {
424             bbtkDebugMessage("kw",3,
425                              "-> No widget event handler : creating one"
426                              <<std::endl);
427             new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
428                                              bbGetOutputWidget());
429           }
430         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
431                   ( bbGetOutputWidget() ) )
432           {
433             bbtkDebugMessage("kw",3,
434                              "-> Obsolete widget event handler : re-creating one"
435                              <<std::endl);
436             delete bbGetWidgetEventHandler();
437             new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
438                                              bbGetOutputWidget());
439           }
440         // Sets the name of the vtkKWWidget to the input WinTitle
441         bbGetOutputWidget()->SetName(bbtk::std2kw(bbGetInputWinTitle()));
442       }
443    
444   }
445     
446   */
447   
448   vtkKWWidget*  KWBlackBox::bbCreateWidgetOfInput(const std::string& in, vtkKWWidget* parent)
449   {
450     vtkKWWidget* w = 0;
451     // If input is connected 
452     BlackBoxInputConnector* c = bbGetInputConnectorMap().find(in)->second ;
453     if ( c->IsConnected() )                     
454       {
455         // Get black box from 
456         BlackBox::Pointer from = 
457           c->GetConnection()->GetBlackBoxFrom();
458         // Cast it into a KWBlackBox
459         KWBlackBox::Pointer wfrom = boost::dynamic_pointer_cast<KWBlackBox>(from);
460         // Call bbCreateWidget
461         wfrom->bbUserCreateWidget(parent);
462         // Get the widget created
463         w = wfrom->bbGetOutputWidget();
464       }
465     return w;
466   }
467   
468   
469 /*
470   //==================================================================
471   /// Specific methods for window creation during pipeline execution
472   /// Shows the window associated to the box 
473   /// (called after bbProcess during bbExecute)
474   void KWBlackBox::bbShowWindow()
475   {
476     bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbShowWindow() ["
477                         <<bbGetFullName()<<"]"<<std::endl);
478  
479     // If Event Handler for the widget does not exist or is obsolete : create it 
480     if (bbGetOutputWidget()!=0)
481       {
482         if (bbGetWidgetEventHandler()==0)
483           {
484             bbtkDebugMessage("kw",3,
485                              "-> No widget event handler : creating one"
486                              <<std::endl);
487             new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
488                                              bbGetOutputWidget());
489           }
490         else if ( ! bbGetWidgetEventHandler()->IsHandlerOf 
491                   ( bbGetOutputWidget() ) )
492           {
493             bbtkDebugMessage("kw",3,
494                              "-> Obsolete widget event handler : re-creating one"
495                              <<std::endl);
496             delete bbGetWidgetEventHandler();
497             new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
498                                              bbGetOutputWidget());
499           }
500         // Sets the name of the vtkKWWidget to the input WinTitle
501         bbGetOutputWidget()->SetName(bbtk::std2kw(bbGetInputWinTitle()));
502       }
503
504     // If the output 'Widget' is connected then it's gonna 
505     // be captured by its parent window : nothing to do 
506     if ( (*bbGetOutputConnectorMap().find("Widget")).second
507          ->GetConnectionVector().size() != 0 ) 
508       {
509         
510         bbtkDebugMessage("kw",2,
511                          "-> Output 'Widget' connected : nothing to do"
512                          <<std::endl);
513         return;
514       }
515
516
517     Window* show = 0;
518     // If the window already exists : no need creating it
519     if (bbGetWindow()!=0)
520       {
521         bbtkDebugMessage("kw",2,
522                          "-> Window already exists"
523                          <<std::endl);
524         show = bbGetWindow();
525       }
526     // Else if the widget exists : create window 
527     else if (bbGetOutputWidget()!=0) 
528       {
529         bbtkDebugMessage("kw",2,
530                          "-> Widget exists : creating the window"
531                          <<std::endl);
532
533
534         // Input WinDialog set to true : creating a Dialog
535         if (bbGetInputWinDialog()) 
536           {
537             bbtkDebugMessage("kw",2,
538                              "   Input WinDialog set to true : creating a Dialog"
539                              <<std::endl);
540             show = (Window*) new KWBlackBoxDialog( GetThisPointer<KWBlackBox>(),
541                                                   // bbGetKWParent(), 
542                                                                                           // LG 24/11/08 : New widget pipeline
543                                                                                           KW::GetTopWindow(),
544                                                    std2kw( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
545                                                    kwSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
546           }
547         // Input WinDialog set to false : creating a Frame
548         else 
549           {
550             bbtkDebugMessage("process",2,
551                              "   Input WinDialog set to false : creating a Frame"
552                              <<std::endl);
553             show = (Window*) new KWBlackBoxFrame( GetThisPointer<KWBlackBox>(),
554                                                   // bbGetKWParent(), 
555                                                                                          // LG 24/11/08 : New widget pipeline
556                                                                                          KW::GetTopWindow(),
557                                                   std2kw( bbGetInputWinTitle()  + " - bbtk (c) CREATIS LRMN"),
558                                                   kwSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
559           }
560
561       }
562     // No window nor widget : error
563     else
564       {
565         bbtkError("KWBlackBox::bbShowWindow() ["
566                   <<bbGetFullName()
567                   <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
568       }
569  
570     
571     // Show the window
572     if (true) //!show->IsShown())
573       {
574         show->bbShow(); 
575       }
576     else 
577       {
578         bbtkDebugMessage("kw",2,"-> Already shown : nothing to do"<<std::endl);
579       }
580   
581
582     bbtkDebugMessage("kw",2,"<= KWBlackBox::bbShowWindow() ["
583                         <<bbGetFullName()<<"]"<<std::endl);
584
585   }
586   //==================================================================
587 */
588
589
590
591   //==================================================================
592    void KWBlackBox::bbHideWindow()
593   {
594     bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbHideWindow() ["
595                         <<bbGetFullName()<<"]"<<std::endl);
596
597     if (bbGetWindow()!=0) bbGetWindow()->bbHide();
598
599     bbtkDebugMessageDec("kw",2,"<= KWBlackBox::bbHideWindow() ["
600                         <<bbGetFullName()<<"]"<<std::endl);
601   }
602   //==================================================================
603
604
605   //==================================================================
606    void KWBlackBox::bbCloseWindow()
607   {
608     bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbCloseWindow() ["
609                         <<bbGetFullName()<<"]"<<std::endl);
610
611     if (bbGetWindow()!=0) bbGetWindow()->bbClose();
612
613     bbtkDebugMessageDec("kw",2,"<= KWBlackBox::bbCloseWindow() ["
614                         <<bbGetFullName()<<"]"<<std::endl);
615   }
616   //==================================================================
617
618   //==================================================================
619   KWBlackBox::Window* KWBlackBox::bbGetContainingWindow()
620   {
621     if (bbGetWindow()!=0) return bbGetWindow();
622     BlackBox::OutputConnectorMapType::const_iterator i 
623       = bbGetOutputConnectorMap().find("Widget");
624     if ( i->second->GetConnectionVector().size() != 0 ) 
625       {
626         return boost::static_pointer_cast<KWBlackBox>
627           (i->second->GetConnectionVector().front() //.lock()
628            ->GetBlackBoxTo())->bbGetContainingWindow();
629       }
630     return 0;
631   }
632   //==================================================================
633
634
635   //==================================================================
636         // LG 24/11/08 : New widget pipeline
637         //  vtkKWWidget* KWBlackBox::bbGetKWParent() { return KW::GetTopWindow(); }
638   //==================================================================
639   
640   
641   //==================================================================
642   bool KWBlackBox::bbIsShown()
643   {
644     if (bbGetContainingWindow()!=0)
645       return bbGetContainingWindow()->bbIsShown();
646     return false;
647   }
648   //==================================================================
649
650
651 }//namespace bbtk
652
653
654 #endif
655