1 /*=========================================================================
4 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
6 Date: $Date: 2008/04/18 12:59:16 $
7 Version: $Revision: 1.12 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
19 #ifdef _USE_WXWIDGETS_
28 #include "bbtkWxBlackBox.h"
29 //#include "bbtkWxContainerBlackBox.h"
30 #include <wx/dialog.h>
32 //#include "bbtkData.h"
33 //#include "bbtkFactory.h"
44 //=========================================================================
46 //=========================================================================
50 //=========================================================================
51 WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox::Pointer box)
52 : mBox(box), mShown(false)
54 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
55 mBox->bbGetFullName()<<")"<<std::endl);
56 mBox->bbSetWindow(this);
57 Wx::IncNbWindowsAlive();
58 bbtkDebugMessage("Wx",5," -> Number of windows alive = "
59 <<Wx::GetNbWindowsAlive()<<std::endl);
61 //=========================================================================
63 //=========================================================================
64 WxBlackBoxWindow::~WxBlackBoxWindow()
66 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() ["<<
67 mBox->bbGetFullName()<<"]"<<std::endl);
70 Wx::DecNbWindowsAlive();
71 bbtkDebugMessage("Wx",5," -> Number of windows alive = "
72 <<Wx::GetNbWindowsAlive()<<std::endl);
76 //=========================================================================
79 //=========================================================================
80 void WxBlackBoxWindow::bbShow()
82 if (bbIsShown()) return;
83 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<<
84 mBox->bbGetFullName()<<"]"<<std::endl);
85 Wx::IncNbWindowsShown();
87 bbtkDebugMessage("Wx",5," -> Number of windows shown = "
88 <<Wx::GetNbWindowsShown()<<std::endl);
90 //=========================================================================
92 //=========================================================================
93 void WxBlackBoxWindow::bbHide()
95 if (!bbIsShown()) return;
96 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbHide() ["<<
97 mBox->bbGetFullName()<<"]"<<std::endl);
98 Wx::DecNbWindowsShown();
100 bbtkDebugMessage("Wx",5," -> Number of windows shown = "
101 <<Wx::GetNbWindowsShown()<<std::endl);
103 //=========================================================================
107 //=========================================================================
109 //=========================================================================
111 //=========================================================================
112 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox::Pointer box,
117 WxBlackBoxWindow(box),
131 bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
132 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
133 <<title<<",size)"<<std::endl);
134 // Insert the widget into the window
135 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
136 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
137 widget->Reparent(this);
138 sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
139 //SetAutoLayout(true);
143 //=========================================================================
145 //=========================================================================
146 void WxBlackBoxDialog::bbShow()
148 bbtkDebugMessage("Wx",5,"WxBlackBoxDialog::bbShow() ["
149 <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
150 WxBlackBoxWindow::bbShow();
151 SetReturnCode( wxDialog::ShowModal() );
153 //=========================================================================
155 //=========================================================================
156 void WxBlackBoxDialog::bbHide()
158 bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::bbHide() ["<<
159 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
160 WxBlackBoxWindow::bbHide();
163 //=========================================================================
165 //=========================================================================
166 WxBlackBoxDialog::~WxBlackBoxDialog()
169 //=========================================================================
175 //=========================================================================
177 //=========================================================================
179 //=========================================================================
180 WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox::Pointer box,
184 : WxBlackBoxWindow(box),
198 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
199 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
200 <<title<<",size)"<<std::endl);
201 // Insert the widget into the window
202 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
203 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
204 wxFrame* frame = (wxFrame*)this;
205 widget->Reparent(frame);
206 sizer->Add( widget, 1, wxALL|wxGROW, 2);
207 // frame->SetAutoLayout(true);
208 frame->SetSizer(sizer);
212 //=========================================================================
214 //=========================================================================
215 WxBlackBoxFrame::~WxBlackBoxFrame()
218 //=========================================================================
220 //=========================================================================
221 void WxBlackBoxFrame::bbShow()
223 bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow("
224 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
225 WxBlackBoxWindow::bbShow();
227 // This Update is ** MANDATORY **
228 // to synchronize wxvtkRenderWindowInteractor objects
229 // (force wx objects creation **NOW**)
231 bbGetBlackBox()->bbUserOnShow();
232 // wxFrame::SetFocus();
234 //=========================================================================
236 //=========================================================================
237 void WxBlackBoxFrame::bbHide()
239 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
240 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
241 WxBlackBoxWindow::bbHide();
243 bbGetBlackBox()->bbUserOnHide();
245 //=========================================================================
249 //=========================================================================
250 // WxBlackBoxDialogWrapper
251 //=========================================================================
253 //=========================================================================
254 WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
256 : WxBlackBoxWindow(box),
259 bbtkDebugMessage("Wx",9,
260 "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
261 <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
264 //=========================================================================
266 //=========================================================================
267 WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
270 //=========================================================================
272 //=========================================================================
273 void WxBlackBoxDialogWrapper::bbShow()
275 bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
276 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
277 WxBlackBoxWindow::bbShow();
278 int i = mWrapped->ShowModal();
280 mWrapped->SetReturnCode( i );
282 //=========================================================================
284 //=========================================================================
285 void WxBlackBoxDialogWrapper::bbHide()
287 bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
288 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
289 WxBlackBoxWindow::bbHide();
292 //=========================================================================
297 //=========================================================================
299 //=========================================================================
301 //=========================================================================
302 WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
305 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
306 mBox->bbSetWidget(this);
308 //=========================================================================
310 //=========================================================================
311 WxBlackBoxWidget::~WxBlackBoxWidget()
313 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
314 mBox->bbSetWidget(0);
315 //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
317 //=========================================================================
322 //=========================================================================
323 // WxBlackBoxWidgetEventHandler
324 //=========================================================================
326 //=========================================================================
327 WxBlackBoxWidgetEventHandler::
328 WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box,
335 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
337 mBox->bbSetWidgetEventHandler(this);
339 Connect ( mWindow->GetId(),
341 (wxObjectEventFunction)
342 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
343 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
345 mWindow->PushEventHandler(this);
348 //=========================================================================
350 //=========================================================================
351 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
353 bbtkDebugMessage("Wx",9,
354 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
355 <<mBox->bbGetFullName()<<")"<<std::endl);
356 mBox->bbSetWidgetEventHandler(0);
358 //=========================================================================
360 //=========================================================================
361 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
363 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
364 <<mBox->bbGetFullName()<<"]"<<std::endl);
365 mBox->bbSetOutputWidget(0);
366 mBox->bbSetModifiedStatus();
370 //=========================================================================
379 //=========================================================================
380 wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
383 bbtkDebugMessageInc("Kernel",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
385 BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
386 if (i==b->bbGetInputConnectorMap().end())
388 bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
390 <<" does not have any 'Parent' input ?!?");
392 Connection* c = i->second->GetConnection();
395 bbtkDebugMessage("Kernel",9,
396 "-> The input 'Parent' of the box "
398 <<" is not connected."<<std::endl);
402 std::map< Connection*, wxWindow *>::const_iterator j
403 = mConnectionToWindowMap.find(c);
405 if (j==mConnectionToWindowMap.end())
407 bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
409 <<") no window provided by parent ?!?");
412 bbtkDebugDecTab("Kernel",9);
415 //=========================================================================
418 //=========================================================================
420 //=========================================================================
422 //=========================================================================
423 //=========================================================================
424 //=========================================================================
425 //=========================================================================
426 BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
427 //=========================================================================
429 //=========================================================================
430 void WxBlackBox::bbUserConstructor()
432 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
435 //=========================================================================
437 //=========================================================================
438 void WxBlackBox::bbUserCopyConstructor()
440 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
444 //=========================================================================
447 //=========================================================================
448 void WxBlackBox::bbUserDestructor()
450 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
452 delete bbGetWindow();
455 bbtkDebugMessage("Kernel",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
457 //=========================================================================
461 //=========================================================================
462 WxBlackBox::Widget* WxBlackBox::bbGetWidget()
464 if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead())
466 bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
467 bbGetFullName()<<"] : Widget is dead : deleting it"
469 delete bbGetOutputWidget();
470 bbSetOutputWidget(0);
472 return bbGetOutputWidget();
474 //=========================================================================
478 //=========================================================================
480 * \brief Initialize the attributes of the class
483 void WxBlackBox::bbInitAttributes()
487 // bbSetInputWinParent(0);
488 bbSetInputWinTitle(bbGetName());
489 bbSetInputWinWidth(800);
490 bbSetInputWinHeight(800);
491 bbSetInputWinDialog(false);
492 bbSetOutputWidget(0);
494 bbSetWidgetEventHandler(0);
496 //=========================================================================
498 //=========================================================================
499 /// Main processing method of the box.
500 void WxBlackBox::bbExecute(bool force)
502 bbtkDebugMessageInc("Process",1,
503 "=> WxBlackBox::bbExecute() ["
504 <<bbGetFullName()<<"]"<<std::endl);
506 // If the output 'Widget' is connected then
507 // we must execute the parent box
508 BlackBox::OutputConnectorMapType::const_iterator i
509 = bbGetOutputConnectorMap().find("Widget");
511 if ( i->second->GetConnectionVector().size() != 0 )
513 bbtkDebugMessage("Process",2,
514 "-> Output 'Widget' connected : transfering execution to parent"
517 i->second->GetConnectionVector().front().lock()
518 ->GetBlackBoxTo()->bbExecute(force);
521 // else call 'standard' BlackBox execution method
524 BlackBox::bbExecute(force);
528 bbtkDebugMessageDec("Process",1,
529 "<= WxBlackBox::bbExecute() ["
530 <<bbGetFullName()<<"]"<<std::endl);
532 //=========================================================================
535 //=========================================================================
536 /// Main processing method of the box.
537 IOStatus WxBlackBox::bbBackwardUpdate( Connection::Pointer caller )
539 bbtkDebugMessageInc("Process",1,
540 "=> WxBlackBox::bbBackwardUpdate("
541 <<(caller?caller->GetFullName():"0")<<") ["
542 <<bbGetFullName()<<"]"<<std::endl);
544 if (bbGetExecuting())
546 bbtkWarning(bbGetFullName()<<" : Cyclic execution stopped");
549 bbSetExecuting(true);
551 // If the caller is not the connection to the output widget
552 // and the output 'Widget' is connected then
553 // we must execute the parent box
556 ((caller!=0)&&(caller->GetBlackBoxFromOutput()!="Widget"))
559 BlackBox::OutputConnectorMapType::const_iterator i
560 = bbGetOutputConnectorMap().find("Widget") ;
562 i->second->GetConnectionVector().size() != 0 )
564 bbtkDebugMessage("Process",2,
565 "-> Output 'Widget' connected : transfering execution to parent"
568 i->second->GetConnectionVector().front().lock()
569 ->GetBlackBoxTo()->bbExecute(false);
573 // call 'standard' BlackBox execution method
576 bbSetExecuting(false);
577 AtomicBlackBox::bbBackwardUpdate(caller);
580 bbtkDebugMessageDec("Process",1,
581 "<= WxBlackBox::bbBackwardUpdate() ["
582 <<bbGetFullName()<<"]"<<std::endl);
584 bbSetExecuting(false);
587 //=========================================================================
588 void WxBlackBox::bbProcess()
590 if (bbGetOutputWidget()==0) this->bbUserCreateWidget();
591 this->bbUserProcess();
594 //=========================================================================
596 //==================================================================
597 /// Specific methods for window creation during pipeline execution
598 /// Shows the window associated to the box
599 /// (called after bbProcess during bbExecute)
600 void WxBlackBox::bbShowWindow()
602 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
603 <<bbGetFullName()<<"]"<<std::endl);
605 // If Event Handler for the widget does not exist or is obsolete : create it
606 if (bbGetOutputWidget()!=0)
608 if (bbGetWidgetEventHandler()==0)
610 bbtkDebugMessage("Process",3,
611 "-> No widget event handler : creating one"
613 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
614 bbGetOutputWidget());
616 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
617 ( bbGetOutputWidget() ) )
619 bbtkDebugMessage("Process",3,
620 "-> Obsolete widget event handler : re-creating one"
622 delete bbGetWidgetEventHandler();
623 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
624 bbGetOutputWidget());
626 // Sets the name of the wxWindow to the input WinTitle
627 bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
630 // If the output 'Widget' is connected then it's gonna
631 // be captured by its parent window : nothing to do
632 if ( (*bbGetOutputConnectorMap().find("Widget")).second
633 ->GetConnectionVector().size() != 0 )
636 bbtkDebugMessage("Process",2,
637 "-> Output 'Widget' connected : nothing to do"
639 bbtkDebugDecTab("Process",1);
645 // If the window already exists : no need creating it
646 if (bbGetWindow()!=0)
648 bbtkDebugMessage("Process",2,
649 "-> Window already exists"
651 show = bbGetWindow();
653 // Else if the widget exists : create window
654 else if (bbGetOutputWidget()!=0)
656 bbtkDebugMessage("Process",2,
657 "-> Widget exists : creating the window"
661 // Input WinDialog set to true : creating a Dialog
662 if (bbGetInputWinDialog())
664 bbtkDebugMessage("Process",2,
665 " Input WinDialog set to true : creating a Dialog"
667 show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
669 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
670 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
672 // Input WinDialog set to false : creating a Frame
675 bbtkDebugMessage("Process",2,
676 " Input WinDialog set to false : creating a Frame"
678 show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
680 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
681 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
685 // No window nor widget : error
688 bbtkError("WxBlackBox::bbShowWindow() ["
690 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
695 if (true) //!show->IsShown())
701 bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
705 bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
706 <<bbGetFullName()<<"]"<<std::endl);
707 bbtkDebugDecTab("Process",1);
709 //==================================================================
714 //==================================================================
715 void WxBlackBox::bbHideWindow()
717 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
718 <<bbGetFullName()<<"]"<<std::endl);
720 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
722 bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
723 <<bbGetFullName()<<"]"<<std::endl);
725 //==================================================================
728 //==================================================================
729 WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
731 if (bbGetWindow()!=0) return bbGetWindow();
732 BlackBox::OutputConnectorMapType::const_iterator i
733 = bbGetOutputConnectorMap().find("Widget");
734 if ( i->second->GetConnectionVector().size() != 0 )
736 return boost::static_pointer_cast<WxBlackBox>
737 (i->second->GetConnectionVector().front().lock()->GetBlackBoxTo())
738 ->bbGetContainingWindow();
742 //==================================================================
745 //==================================================================
746 wxWindow* WxBlackBox::bbGetWxParent() { return Wx::GetTopWindow(); }
747 //==================================================================
750 //==================================================================
751 bool WxBlackBox::bbIsShown()
753 if (bbGetContainingWindow()!=0)
754 return bbGetContainingWindow()->bbIsShown();
757 //==================================================================