1 /*=========================================================================
4 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
6 Date: $Date: 2008/03/10 10:01:14 $
7 Version: $Revision: 1.9 $
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* 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",9," -> 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",9," -> 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",9," -> 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",9," -> Number of windows shown = "
101 <<Wx::GetNbWindowsShown()<<std::endl);
103 //=========================================================================
107 //=========================================================================
109 //=========================================================================
111 //=========================================================================
112 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox* 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* 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();
228 //=========================================================================
230 //=========================================================================
231 void WxBlackBoxFrame::bbHide()
233 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
234 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
235 WxBlackBoxWindow::bbHide();
238 //=========================================================================
242 //=========================================================================
243 // WxBlackBoxDialogWrapper
244 //=========================================================================
246 //=========================================================================
247 WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
249 : WxBlackBoxWindow(box),
252 bbtkDebugMessage("Wx",9,
253 "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
254 <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
257 //=========================================================================
259 //=========================================================================
260 WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
263 //=========================================================================
265 //=========================================================================
266 void WxBlackBoxDialogWrapper::bbShow()
268 bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
269 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
270 WxBlackBoxWindow::bbShow();
271 int i = mWrapped->ShowModal();
273 mWrapped->SetReturnCode( i );
275 //=========================================================================
277 //=========================================================================
278 void WxBlackBoxDialogWrapper::bbHide()
280 bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
281 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
282 WxBlackBoxWindow::bbHide();
285 //=========================================================================
290 //=========================================================================
292 //=========================================================================
294 //=========================================================================
295 WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
298 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
299 mBox->bbSetWidget(this);
301 //=========================================================================
303 //=========================================================================
304 WxBlackBoxWidget::~WxBlackBoxWidget()
306 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
307 mBox->bbSetWidget(0);
308 //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
310 //=========================================================================
315 //=========================================================================
316 // WxBlackBoxWidgetEventHandler
317 //=========================================================================
319 //=========================================================================
320 WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler( WxBlackBox* box,
327 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
329 mBox->bbSetWidgetEventHandler(this);
331 Connect ( mWindow->GetId(),
333 (wxObjectEventFunction)
334 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
335 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
337 mWindow->PushEventHandler(this);
340 //=========================================================================
342 //=========================================================================
343 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
345 bbtkDebugMessage("Wx",9,
346 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
347 <<mBox->bbGetFullName()<<")"<<std::endl);
348 mBox->bbSetWidgetEventHandler(0);
350 //=========================================================================
352 //=========================================================================
353 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
355 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
356 <<mBox->bbGetFullName()<<"]"<<std::endl);
357 mBox->bbSetOutputWidget(0);
358 mBox->bbSetModifiedStatus();
362 //=========================================================================
371 //=========================================================================
372 wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
375 bbtkDebugMessageInc("Kernel",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
377 BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
378 if (i==b->bbGetInputConnectorMap().end())
380 bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
382 <<" does not have any 'Parent' input ?!?");
384 Connection* c = i->second->GetConnection();
387 bbtkDebugMessage("Kernel",9,
388 "-> The input 'Parent' of the box "
390 <<" is not connected."<<std::endl);
394 std::map< Connection*, wxWindow *>::const_iterator j
395 = mConnectionToWindowMap.find(c);
397 if (j==mConnectionToWindowMap.end())
399 bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
401 <<") no window provided by parent ?!?");
404 bbtkDebugDecTab("Kernel",9);
407 //=========================================================================
410 //=========================================================================
412 //=========================================================================
414 //=========================================================================
415 //=========================================================================
416 //=========================================================================
417 //=========================================================================
418 BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
419 //=========================================================================
421 //=========================================================================
422 void WxBlackBox::bbUserConstructor()
424 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
427 //=========================================================================
429 //=========================================================================
430 void WxBlackBox::bbUserCopyConstructor()
432 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
436 //=========================================================================
439 //=========================================================================
440 void WxBlackBox::bbUserDestructor()
442 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
444 delete bbGetWindow();
447 bbtkDebugMessage("Kernel",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
449 //=========================================================================
453 //=========================================================================
454 WxBlackBox::Widget* WxBlackBox::bbGetWidget()
456 if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead())
458 bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
459 bbGetFullName()<<"] : Widget is dead : deleting it"
461 delete bbGetOutputWidget();
462 bbSetOutputWidget(0);
464 return bbGetOutputWidget();
466 //=========================================================================
470 //=========================================================================
472 * \brief Initialize the attributes of the class
475 void WxBlackBox::bbInitAttributes()
479 // bbSetInputWinParent(0);
480 bbSetInputWinTitle(bbGetName());
481 bbSetInputWinWidth(800);
482 bbSetInputWinHeight(800);
483 bbSetInputWinDialog(false);
484 bbSetOutputWidget(0);
486 bbSetWidgetEventHandler(0);
488 //=========================================================================
490 //=========================================================================
491 /// Main processing method of the box.
492 void WxBlackBox::bbExecute(bool force)
494 bbtkDebugMessageInc("Process",1,
495 "=> WxBlackBox::bbExecute() ["
496 <<bbGetFullName()<<"]"<<std::endl);
498 // If the output 'Widget' is connected then
499 // we must execute the parent box
500 BlackBox::OutputConnectorMapType::const_iterator i
501 = bbGetOutputConnectorMap().find("Widget");
503 if ( i->second->GetConnectionVector().size() != 0 )
505 bbtkDebugMessage("Process",2,
506 "-> Output 'Widget' connected : transfering execution to parent"
509 i->second->GetConnectionVector().front()
510 ->GetBlackBoxTo()->bbExecute(force);
513 // else call 'standard' BlackBox execution method
516 BlackBox::bbExecute(force);
520 bbtkDebugMessageDec("Process",1,
521 "<= WxBlackBox::bbExecute() ["
522 <<bbGetFullName()<<"]"<<std::endl);
524 //=========================================================================
527 //==================================================================
528 /// Specific methods for window creation during pipeline execution
529 /// Shows the window associated to the box
530 /// (called after bbProcess during bbExecute)
531 void WxBlackBox::bbShowWindow()
533 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
534 <<bbGetFullName()<<"]"<<std::endl);
536 // If Event Handler for the widget does not exist or is obsolete : create it
537 if (bbGetOutputWidget()!=0)
539 if (bbGetWidgetEventHandler()==0)
541 bbtkDebugMessage("Process",3,
542 "-> No widget event handler : creating one"
544 new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
546 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
547 ( bbGetOutputWidget() ) )
549 bbtkDebugMessage("Process",3,
550 "-> Obsolete widget event handler : re-creating one"
552 delete bbGetWidgetEventHandler();
553 new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
555 // Sets the name of the wxWindow to the input WinTitle
556 bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
559 // If the output 'Widget' is connected then it's gonna
560 // be captured by its parent window : nothing to do
561 if ( (*bbGetOutputConnectorMap().find("Widget")).second
562 ->GetConnectionVector().size() != 0 )
565 bbtkDebugMessage("Process",2,
566 "-> Output 'Widget' connected : nothing to do"
568 bbtkDebugDecTab("Process",1);
574 // If the window already exists : no need creating it
575 if (bbGetWindow()!=0)
577 bbtkDebugMessage("Process",2,
578 "-> Window already exists"
580 show = bbGetWindow();
582 // Else if the widget exists : create window
583 else if (bbGetOutputWidget()!=0)
585 bbtkDebugMessage("Process",2,
586 "-> Widget exists : creating the window"
590 // Input WinDialog set to true : creating a Dialog
591 if (bbGetInputWinDialog())
593 bbtkDebugMessage("Process",2,
594 " Input WinDialog set to true : creating a Dialog"
596 show = (Window*) new WxBlackBoxDialog( this,
598 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
599 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
601 // Input WinDialog set to false : creating a Frame
604 bbtkDebugMessage("Process",2,
605 " Input WinDialog set to false : creating a Frame"
607 show = (Window*) new WxBlackBoxFrame( this,
609 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
610 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
614 // No window nor widget : error
617 bbtkError("WxBlackBox::bbShowWindow() ["
619 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
624 if (true) //!show->IsShown())
630 bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
634 bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
635 <<bbGetFullName()<<"]"<<std::endl);
636 bbtkDebugDecTab("Process",1);
638 //==================================================================
643 //==================================================================
644 void WxBlackBox::bbHideWindow()
646 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
647 <<bbGetFullName()<<"]"<<std::endl);
649 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
651 bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
652 <<bbGetFullName()<<"]"<<std::endl);
654 //==================================================================