1 /*=========================================================================
3 Module: $RCSfile: bbtkKWBlackBox.cxx,v $
5 Date: $Date: 2008/12/02 10:21:40 $
6 Version: $Revision: 1.3 $
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);
352 bbUserCreateWidget(win->GetFrame());
354 KW::GetApplication()->Script("place %s -x 0 -y 0 -width %d -height %d",
355 bbGetOutputWidget()->GetWidgetName(),
356 bbGetInputWinWidth(),
357 bbGetInputWinHeight());
360 bbGetOutputWidget()->SetParent(win);
361 bbGetOutputWidget()->Create();
362 KW::GetApplication()->Script("pack %s -side left -anchor c -expand y",
364 //"pack %s -side top -anchor nw -expand y -fill none -padx 2 -pady 2",
365 bbGetOutputWidget()->GetWidgetName());
370 // Input WinDialog set to false : creating a Frame
373 bbtkDebugMessage("process",2,
374 " Input WinDialog set to false : creating a Frame"
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);
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()); }
397 // std::cout << "KW::GetApplication()->Start();"<<std::endl;
398 // KW::GetApplication()->Start();
399 // std::cout << "AFTER KW::GetApplication()->Start();"<<std::endl;
405 //=========================================================================
409 // LG 24/11/08 : New widget pipeline
410 void KWBlackBox::bbCreateWidgetAndEventHandler(vtkKWWidget* parent)
412 if (bbGetOutputWidget()==0)
414 this->bbUserCreateWidget(parent);
417 // If Event Handler for the widget does not exist or is obsolete : create it
419 if (bbGetOutputWidget()!=0)
421 if (bbGetWidgetEventHandler()==0)
423 bbtkDebugMessage("kw",3,
424 "-> No widget event handler : creating one"
426 new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
427 bbGetOutputWidget());
429 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
430 ( bbGetOutputWidget() ) )
432 bbtkDebugMessage("kw",3,
433 "-> Obsolete widget event handler : re-creating one"
435 delete bbGetWidgetEventHandler();
436 new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
437 bbGetOutputWidget());
439 // Sets the name of the vtkKWWidget to the input WinTitle
440 bbGetOutputWidget()->SetName(bbtk::std2kw(bbGetInputWinTitle()));
447 vtkKWWidget* KWBlackBox::bbCreateWidgetOfInput(const std::string& in, vtkKWWidget* parent)
450 // If input is connected
451 BlackBoxInputConnector* c = bbGetInputConnectorMap().find(in)->second ;
452 if ( c->IsConnected() )
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();
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()
475 bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbShowWindow() ["
476 <<bbGetFullName()<<"]"<<std::endl);
478 // If Event Handler for the widget does not exist or is obsolete : create it
479 if (bbGetOutputWidget()!=0)
481 if (bbGetWidgetEventHandler()==0)
483 bbtkDebugMessage("kw",3,
484 "-> No widget event handler : creating one"
486 new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
487 bbGetOutputWidget());
489 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
490 ( bbGetOutputWidget() ) )
492 bbtkDebugMessage("kw",3,
493 "-> Obsolete widget event handler : re-creating one"
495 delete bbGetWidgetEventHandler();
496 new KWBlackBoxWidgetEventHandler(GetThisPointer<KWBlackBox>(),
497 bbGetOutputWidget());
499 // Sets the name of the vtkKWWidget to the input WinTitle
500 bbGetOutputWidget()->SetName(bbtk::std2kw(bbGetInputWinTitle()));
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 )
509 bbtkDebugMessage("kw",2,
510 "-> Output 'Widget' connected : nothing to do"
517 // If the window already exists : no need creating it
518 if (bbGetWindow()!=0)
520 bbtkDebugMessage("kw",2,
521 "-> Window already exists"
523 show = bbGetWindow();
525 // Else if the widget exists : create window
526 else if (bbGetOutputWidget()!=0)
528 bbtkDebugMessage("kw",2,
529 "-> Widget exists : creating the window"
533 // Input WinDialog set to true : creating a Dialog
534 if (bbGetInputWinDialog())
536 bbtkDebugMessage("kw",2,
537 " Input WinDialog set to true : creating a Dialog"
539 show = (Window*) new KWBlackBoxDialog( GetThisPointer<KWBlackBox>(),
541 // LG 24/11/08 : New widget pipeline
543 std2kw( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
544 kwSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
546 // Input WinDialog set to false : creating a Frame
549 bbtkDebugMessage("process",2,
550 " Input WinDialog set to false : creating a Frame"
552 show = (Window*) new KWBlackBoxFrame( GetThisPointer<KWBlackBox>(),
554 // LG 24/11/08 : New widget pipeline
556 std2kw( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
557 kwSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
561 // No window nor widget : error
564 bbtkError("KWBlackBox::bbShowWindow() ["
566 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
571 if (true) //!show->IsShown())
577 bbtkDebugMessage("kw",2,"-> Already shown : nothing to do"<<std::endl);
581 bbtkDebugMessage("kw",2,"<= KWBlackBox::bbShowWindow() ["
582 <<bbGetFullName()<<"]"<<std::endl);
585 //==================================================================
590 //==================================================================
591 void KWBlackBox::bbHideWindow()
593 bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbHideWindow() ["
594 <<bbGetFullName()<<"]"<<std::endl);
596 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
598 bbtkDebugMessageDec("kw",2,"<= KWBlackBox::bbHideWindow() ["
599 <<bbGetFullName()<<"]"<<std::endl);
601 //==================================================================
604 //==================================================================
605 void KWBlackBox::bbCloseWindow()
607 bbtkDebugMessageInc("kw",1,"=> KWBlackBox::bbCloseWindow() ["
608 <<bbGetFullName()<<"]"<<std::endl);
610 if (bbGetWindow()!=0) bbGetWindow()->bbClose();
612 bbtkDebugMessageDec("kw",2,"<= KWBlackBox::bbCloseWindow() ["
613 <<bbGetFullName()<<"]"<<std::endl);
615 //==================================================================
617 //==================================================================
618 KWBlackBox::Window* KWBlackBox::bbGetContainingWindow()
620 if (bbGetWindow()!=0) return bbGetWindow();
621 BlackBox::OutputConnectorMapType::const_iterator i
622 = bbGetOutputConnectorMap().find("Widget");
623 if ( i->second->GetConnectionVector().size() != 0 )
625 return boost::static_pointer_cast<KWBlackBox>
626 (i->second->GetConnectionVector().front() //.lock()
627 ->GetBlackBoxTo())->bbGetContainingWindow();
631 //==================================================================
634 //==================================================================
635 // LG 24/11/08 : New widget pipeline
636 // vtkKWWidget* KWBlackBox::bbGetKWParent() { return KW::GetTopWindow(); }
637 //==================================================================
640 //==================================================================
641 bool KWBlackBox::bbIsShown()
643 if (bbGetContainingWindow()!=0)
644 return bbGetContainingWindow()->bbIsShown();
647 //==================================================================