1 /*=========================================================================
3 Module: $RCSfile: bbtkKWBlackBox.cxx,v $
5 Date: $Date: 2008/12/02 13:37:54 $
6 Version: $Revision: 1.4 $
7 =========================================================================*/
9 /* ---------------------------------------------------------------------
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
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.
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
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 * ------------------------------------------------------------------------ */
41 #include "bbtkKWBlackBox.h"
42 #include "vtkKWBlackBoxDialog.h"
51 //=========================================================================
52 // KWBlackBoxWidgetEventHandler
53 //=========================================================================
55 //=========================================================================
56 KWBlackBoxWidgetEventHandler::
57 KWBlackBoxWidgetEventHandler( KWBlackBox::Pointer box,
63 bbtkDebugMessage("kw",9,"KWBlackBoxWidgetEventHandler::KWBlackBoxWidgetEventHandler("<<mBox.lock()->bbGetFullName()<<")"<<std::endl);
65 mBox.lock()->bbSetWidgetEventHandler(this);
67 Connect ( mWindow->GetId(),
69 (kwObjectEventFunction)
70 (void (kwEvtHandler::*)(kwWindowDestroyEvent& c))
71 &KWBlackBoxWidgetEventHandler::OnWindowDestroy );
73 mWindow->PushEventHandler(this);
76 //=========================================================================
78 //=========================================================================
79 KWBlackBoxWidgetEventHandler::~KWBlackBoxWidgetEventHandler()
81 if (mBox.expired()) return;
82 bbtkDebugMessage("kw",9,
83 "KWBlackBoxWidgetEventHandler::~KWBlackBoxWidgetEventHandler() ["
84 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
85 mBox.lock()->bbSetWidgetEventHandler(0);
87 //=========================================================================
89 //=========================================================================
90 void KWBlackBoxWidgetEventHandler::OnWindowDestroy(kwWindowDestroyEvent&)
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();
98 //=========================================================================
106 //=========================================================================
108 //=========================================================================
110 //=========================================================================
111 //=========================================================================
112 //=========================================================================
113 //=========================================================================
114 BBTK_BLACK_BOX_IMPLEMENTATION(KWBlackBox,AtomicBlackBox);
115 //=========================================================================
117 //=========================================================================
118 void KWBlackBox::bbUserConstructor()
120 bbtkDebugMessage("Kernel",9,"KWBlackBox::bbUserConstructor()"<<std::endl);
123 //=========================================================================
125 //=========================================================================
126 void KWBlackBox::bbUserCopyConstructor(bbtk::BlackBox::Pointer)
128 bbtkDebugMessage("Kernel",9,"KWBlackBox::bbUserCopyConstructor()"
132 //=========================================================================
135 //=========================================================================
136 void KWBlackBox::bbUserDestructor()
138 bbtkDebugMessage("kw",9,"==> KWBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
140 bbGetWindow()->bbClose();
143 bbtkDebugMessage("kw",9,"<== KWBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
145 //=========================================================================
149 //=========================================================================
151 * \brief Initialize the attributes of the class
154 void KWBlackBox::bbInitAttributes()
158 // bbSetInputWinParent(0);
159 bbSetInputWinTitle(bbGetName());
160 bbSetInputWinWidth(800);
161 bbSetInputWinHeight(800);
162 bbSetInputWinDialog(false);
163 bbSetOutputWidget(0);
165 // bbSetWidgetEventHandler(0);
166 bbSetUpdateTransferedToParent(false);
168 //=========================================================================
170 //=========================================================================
171 /// Main processing method of the box.
172 void KWBlackBox::bbExecute(bool force)
174 bbtkDebugMessageInc("process",2,
175 "=> KWBlackBox::bbExecute("<<(int)force<<") ["
176 <<bbGetFullName()<<"]"<<std::endl);
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");
183 if ( i->second->GetConnectionVector().size() != 0 )
185 bbtkDebugMessage("process",3,
186 "-> Output 'Widget' connected : transfering execution to parent"
189 i->second->GetConnectionVector().front() //.lock()
190 ->GetBlackBoxTo()->bbExecute(force);
193 // else call 'standard' BlackBox execution method
196 BlackBox::bbExecute(force);
200 bbtkDebugMessageDec("process",2,
201 "<= KWBlackBox::bbExecute() ["
202 <<bbGetFullName()<<"]"<<std::endl);
204 //=========================================================================
207 //=========================================================================
208 /// Main processing method of the box.
209 IOStatus KWBlackBox::bbBackwardUpdate( Connection::Pointer caller )
211 bbtkDebugMessage("process",3,
212 "=> KWBlackBox::bbBackwardUpdate("
213 <<(caller?caller->GetFullName():"0")<<") ["
214 <<bbGetFullName()<<"]"<<std::endl);
216 if ( ! (( bbGetStatus() == MODIFIED ) ||
217 ( bbBoxProcessModeIsAlways() )) )
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();
227 // If the caller's box to is not the box to connected to the
230 BlackBox::OutputConnectorMapType::const_iterator i
231 = bbGetOutputConnectorMap().find("Widget") ;
232 if ( i->second->GetConnectionVector().size() != 0 )
235 BlackBox::Pointer to =
236 i->second->GetConnectionVector()[0]->GetBlackBoxTo();
240 bbtkDebugMessage("process",3,
241 "-> Output 'Widget' connected to '"
242 <<to->bbGetFullName()<<"' - caller->to = '"
243 <<caller->GetBlackBoxTo()->bbGetFullName()
249 bbtkDebugMessage("process",3,
250 "-> Output 'Widget' connected to '"
251 <<to->bbGetFullName()<<"'"
256 (caller->GetBlackBoxTo() != to)&&
257 (!bbGetUpdateTransferedToParent())&&
258 (!to->bbGetExecuting())
262 bbtkDebugMessage("process",3,
263 " ... Transfering update order to parent"
266 bbSetUpdateTransferedToParent(true);
267 i->second->GetConnectionVector().front() //.lock()
268 ->GetBlackBoxTo()->bbExecute(false);
272 bbSetUpdateTransferedToParent(false);
273 bbtkDebugMessage("process",3,
274 " ... No need to transfer to parent"
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
284 // (this is the role of the flag UpdateTransferedToParent)
286 ((caller!=0)&&(caller->GetBlackBoxFromOutput()!="Widget"))
291 // call 'standard' BlackBox execution method
292 if (!bbGetUpdateTransferedToParent())
294 AtomicBlackBox::bbBackwardUpdate(caller);
297 bbtkDebugMessageDec("process",3,
298 "<= KWBlackBox::bbBackwardUpdate() ["
299 <<bbGetFullName()<<"]"<<std::endl);
301 return bbGetStatus();
306 //=========================================================================
307 void KWBlackBox::bbProcess()
310 if (bbGetOutputWidget()==0) this->bbUserCreateWidget();
311 this->bbUserProcess();
313 // this->bbUserOnShow();
315 this->bbUserProcess();
317 // If output widget not connected create the window
318 if ( (*bbGetOutputConnectorMap().find("Widget")).second
319 ->GetConnectionVector().size() == 0 )
322 // If the window already exists : no need creating it
323 if (bbGetWindow()!=0)
325 bbtkDebugMessage("kw",2,
326 "-> Window already exists"
328 show = bbGetWindow();
330 // Else create window
333 bbtkDebugMessage("kw",2,
334 "-> Creating the window"
336 KW::GetApplication();
338 // Input WinDialog set to true : creating a Dialog
340 if (bbGetInputWinDialog())
342 bbtkDebugMessage("kw",2,
343 " Input WinDialog set to true : creating a Dialog"
346 vtkKWBlackBoxDialog* win = vtkKWBlackBoxDialog::New();
347 show = (Window*) win;
348 win->bbSetBlackBox( GetThisPointer<KWBlackBox>());
349 KW::GetApplication()->AddWindow((vtkKWWindowBase*)win);
351 win->SetResizable(0,0);
353 bbUserCreateWidget(win->GetFrame());
354 KW::GetApplication()->Script("place %s -x 0 -y 0 -width %d -height %d",
355 bbGetOutputWidget()->GetWidgetName(),
356 bbGetInputWinWidth(),
357 bbGetInputWinHeight());
364 bbGetOutputWidget()->SetParent(win);
365 bbGetOutputWidget()->Create();
366 KW::GetApplication()->Script("pack %s -side left -anchor c -expand y",
368 //"pack %s -side top -anchor nw -expand y -fill none -padx 2 -pady 2",
369 bbGetOutputWidget()->GetWidgetName());
374 // Input WinDialog set to false : creating a Frame
377 bbtkDebugMessage("process",2,
378 " Input WinDialog set to false : creating a Frame"
380 vtkKWBlackBoxFrame* win = vtkKWBlackBoxFrame::New();
381 show = (Window*) win;
382 win->bbSetBlackBox( GetThisPointer<KWBlackBox>());
383 // win->SetName( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN" );
384 // win->SetWidth( bbGetInputWinWidth() );
385 // win->SetHeight( bbGetInputWinHeight() );
386 KW::GetApplication()->AddWindow((vtkKWWindowBase*)win);
389 bbGetOutputWidget()->SetParent(win);
390 bbGetOutputWidget()->Create();
391 KW::GetApplication()->Script("pack %s -side top -anchor nw -expand y -fill none -padx 2 -pady 2",
392 bbGetOutputWidget()->GetWidgetName()); }
401 // std::cout << "KW::GetApplication()->Start();"<<std::endl;
402 // KW::GetApplication()->Start();
403 // std::cout << "AFTER KW::GetApplication()->Start();"<<std::endl;
409 //=========================================================================
412 //=========================================================================
413 void KWBlackBox::bbPlaceWidget()
415 vtkKWFrame* parent = (vtkKWFrame*)(bbGetOutputWidget()->GetParent());
416 bbGetOutputWidget->GetApplication()->Script("place %s -x 0 -y 0 -width %s -height %s",
417 bbGetOutputWidget()->GetWidgetName(),
419 parent->GetHeight());
421 //=========================================================================
425 // LG 24/11/08 : New widget pipeline
426 void KWBlackBox::bbCreateWidgetAndEventHandler(vtkKWWidget* parent)
428 if (bbGetOutputWidget()==0)
430 this->bbUserCreateWidget(parent);
433 // If Event Handler for the widget does not exist or is obsolete : create it
435 if (bbGetOutputWidget()!=0)
437 if (bbGetWidgetEventHandler()==0)
439 bbtkDebugMessage("kw",3,
440 "-> No widget event handler : creating one"
442 new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
443 bbGetOutputWidget());
445 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
446 ( bbGetOutputWidget() ) )
448 bbtkDebugMessage("kw",3,
449 "-> Obsolete widget event handler : re-creating one"
451 delete bbGetWidgetEventHandler();
452 new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
453 bbGetOutputWidget());
455 // Sets the name of the vtkKWWidget to the input WinTitle
456 bbGetOutputWidget()->SetName(bbtk::std2kw(bbGetInputWinTitle()));
463 vtkKWWidget* KWBlackBox::bbCreateWidgetOfInput(const std::string& in, vtkKWFrame* parent)
466 // If input is connected
467 BlackBoxInputConnector* c = bbGetInputConnectorMap().find(in)->second ;
468 if ( c->IsConnected() )
470 // Get black box from
471 BlackBox::Pointer from =
472 c->GetConnection()->GetBlackBoxFrom();
473 // Cast it into a KWBlackBox
474 KWBlackBox::Pointer wfrom = boost::dynamic_pointer_cast<KWBlackBox>(from);
475 // Call bbCreateWidget
476 wfrom->bbUserCreateWidget(parent);
477 // Get the widget created
478 w = wfrom->bbGetOutputWidget();
485 //==================================================================
486 /// Specific methods for window creation during pipeline execution
487 /// Shows the window associated to the box
488 /// (called after bbProcess during bbExecute)
489 void KWBlackBox::bbShowWindow()
491 bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbShowWindow() ["
492 <<bbGetFullName()<<"]"<<std::endl);
494 // If Event Handler for the widget does not exist or is obsolete : create it
495 if (bbGetOutputWidget()!=0)
497 if (bbGetWidgetEventHandler()==0)
499 bbtkDebugMessage("kw",3,
500 "-> No widget event handler : creating one"
502 new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
503 bbGetOutputWidget());
505 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
506 ( bbGetOutputWidget() ) )
508 bbtkDebugMessage("kw",3,
509 "-> Obsolete widget event handler : re-creating one"
511 delete bbGetWidgetEventHandler();
512 new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
513 bbGetOutputWidget());
515 // Sets the name of the vtkKWWidget to the input WinTitle
516 bbGetOutputWidget()->SetName(bbtk::std2kw(bbGetInputWinTitle()));
519 // If the output 'Widget' is connected then it's gonna
520 // be captured by its parent window : nothing to do
521 if ( (*bbGetOutputConnectorMap().find("Widget")).second
522 ->GetConnectionVector().size() != 0 )
525 bbtkDebugMessage("kw",2,
526 "-> Output 'Widget' connected : nothing to do"
533 // If the window already exists : no need creating it
534 if (bbGetWindow()!=0)
536 bbtkDebugMessage("kw",2,
537 "-> Window already exists"
539 show = bbGetWindow();
541 // Else if the widget exists : create window
542 else if (bbGetOutputWidget()!=0)
544 bbtkDebugMessage("kw",2,
545 "-> Widget exists : creating the window"
549 // Input WinDialog set to true : creating a Dialog
550 if (bbGetInputWinDialog())
552 bbtkDebugMessage("kw",2,
553 " Input WinDialog set to true : creating a Dialog"
555 show = (Window*) new KWBlackBoxDialog( GetThisPointer<KWBlackBox>(),
557 // LG 24/11/08 : New widget pipeline
559 std2kw( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
560 kwSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
562 // Input WinDialog set to false : creating a Frame
565 bbtkDebugMessage("process",2,
566 " Input WinDialog set to false : creating a Frame"
568 show = (Window*) new KWBlackBoxFrame( GetThisPointer<KWBlackBox>(),
570 // LG 24/11/08 : New widget pipeline
572 std2kw( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
573 kwSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
577 // No window nor widget : error
580 bbtkError("KWBlackBox::bbShowWindow() ["
582 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
587 if (true) //!show->IsShown())
593 bbtkDebugMessage("kw",2,"-> Already shown : nothing to do"<<std::endl);
597 bbtkDebugMessage("kw",2,"<= KWBlackBox::bbShowWindow() ["
598 <<bbGetFullName()<<"]"<<std::endl);
601 //==================================================================
606 //==================================================================
607 void KWBlackBox::bbHideWindow()
609 bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbHideWindow() ["
610 <<bbGetFullName()<<"]"<<std::endl);
612 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
614 bbtkDebugMessageDec("kw",2,"<= KWBlackBox::bbHideWindow() ["
615 <<bbGetFullName()<<"]"<<std::endl);
617 //==================================================================
620 //==================================================================
621 void KWBlackBox::bbCloseWindow()
623 bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbCloseWindow() ["
624 <<bbGetFullName()<<"]"<<std::endl);
626 if (bbGetWindow()!=0) bbGetWindow()->bbClose();
628 bbtkDebugMessageDec("kw",2,"<= KWBlackBox::bbCloseWindow() ["
629 <<bbGetFullName()<<"]"<<std::endl);
631 //==================================================================
633 //==================================================================
634 KWBlackBox::Window* KWBlackBox::bbGetContainingWindow()
636 if (bbGetWindow()!=0) return bbGetWindow();
637 BlackBox::OutputConnectorMapType::const_iterator i
638 = bbGetOutputConnectorMap().find("Widget");
639 if ( i->second->GetConnectionVector().size() != 0 )
641 return boost::static_pointer_cast<KWBlackBox>
642 (i->second->GetConnectionVector().front() //.lock()
643 ->GetBlackBoxTo())->bbGetContainingWindow();
647 //==================================================================
650 //==================================================================
651 // LG 24/11/08 : New widget pipeline
652 // vtkKWWidget* KWBlackBox::bbGetKWParent() { return KW::GetTopWindow(); }
653 //==================================================================
656 //==================================================================
657 bool KWBlackBox::bbIsShown()
659 if (bbGetContainingWindow()!=0)
660 return bbGetContainingWindow()->bbIsShown();
663 //==================================================================