1 /*=========================================================================
4 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
6 Date: $Date: 2008/01/22 15:02:00 $
7 Version: $Revision: 1.1.1.1 $
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"
40 //=========================================================================
41 wxWindow* WxBlackBox::bbGlobalGetTopWindow()
45 //=========================================================================
47 //=========================================================================
48 void WxBlackBox::bbGlobalSetTopWindow(wxWindow* w)
52 bbtkGlobalError("WxBlackBox::bbGlobalSetTopWindow : top window already set !");
56 //=========================================================================
59 //=========================================================================
60 void WxBlackBox::bbGlobalDecNbWindowsAlive()
64 if ( (bbmgNbWindowsAlive==0) &&
65 bbmgTopWindow && (!bbmgTopWindow->IsShown()))
67 bbmgTopWindow->Close();
71 //=========================================================================
73 //=========================================================================
74 void WxBlackBox::bbGlobalDecNbWindowsShown()
77 if ( (bbmgNbWindowsShown==0) &&
78 bbmgTopWindow && (!bbmgTopWindow->IsShown()))
80 bbmgTopWindow->Close();
83 //=========================================================================
85 //=========================================================================
87 wxWindow* WxBlackBox::bbmgTopWindow =0;
88 int WxBlackBox::bbmgNbWindowsAlive = 0;
89 int WxBlackBox::bbmgNbWindowsShown = 0;
90 //=========================================================================
96 //=========================================================================
98 //=========================================================================
102 //=========================================================================
103 WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox* box)
104 : mBox(box), mShown(false)
106 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
107 mBox->bbGetFullName()<<")"<<std::endl);
108 mBox->bbSetWindow(this);
109 WxBlackBox::bbGlobalIncNbWindowsAlive();
110 bbtkDebugMessage("Wx",9," -> Number of windows alive = "
111 <<WxBlackBox::bbGlobalGetNbWindowsAlive()<<std::endl);
113 //=========================================================================
115 //=========================================================================
116 WxBlackBoxWindow::~WxBlackBoxWindow()
118 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() ["<<
119 mBox->bbGetFullName()<<"]"<<std::endl);
121 mBox->bbSetWindow(0);
122 WxBlackBox::bbGlobalDecNbWindowsAlive();
123 bbtkDebugMessage("Wx",9," -> Number of windows alive = "
124 <<WxBlackBox::bbGlobalGetNbWindowsAlive()<<std::endl);
128 //=========================================================================
130 //=========================================================================
131 void WxBlackBoxWindow::bbShow()
133 if (bbIsShown()) return;
134 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<<
135 mBox->bbGetFullName()<<"]"<<std::endl);
136 WxBlackBox::bbGlobalIncNbWindowsShown();
138 bbtkDebugMessage("Wx",9," -> Number of windows shown = "
139 <<WxBlackBox::bbGlobalGetNbWindowsShown()<<std::endl);
141 //=========================================================================
143 //=========================================================================
144 void WxBlackBoxWindow::bbHide()
146 if (!bbIsShown()) return;
147 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbHide() ["<<
148 mBox->bbGetFullName()<<"]"<<std::endl);
149 WxBlackBox::bbGlobalDecNbWindowsShown();
151 bbtkDebugMessage("Wx",9," -> Number of windows shown = "
152 <<WxBlackBox::bbGlobalGetNbWindowsShown()<<std::endl);
154 //=========================================================================
158 //=========================================================================
160 //=========================================================================
162 //=========================================================================
163 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox* box,
168 WxBlackBoxWindow(box),
182 bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
183 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
184 <<title<<",size)"<<std::endl);
185 // Insert the widget into the window
186 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
187 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
188 widget->Reparent(this);
189 sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
190 //SetAutoLayout(true);
194 //=========================================================================
196 //=========================================================================
197 void WxBlackBoxDialog::bbShow()
199 bbtkDebugMessage("Wx",5,"WxBlackBoxDialog::bbShow() ["
200 <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
201 WxBlackBoxWindow::bbShow();
202 SetReturnCode( wxDialog::ShowModal() );
204 //=========================================================================
206 //=========================================================================
207 void WxBlackBoxDialog::bbHide()
209 bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::bbHide() ["<<
210 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
211 WxBlackBoxWindow::bbHide();
214 //=========================================================================
216 //=========================================================================
217 WxBlackBoxDialog::~WxBlackBoxDialog()
220 //=========================================================================
226 //=========================================================================
228 //=========================================================================
230 //=========================================================================
231 WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox* box,
235 : WxBlackBoxWindow(box),
249 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
250 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
251 <<title<<",size)"<<std::endl);
252 // Insert the widget into the window
253 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
254 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
255 wxFrame* frame = (wxFrame*)this;
256 widget->Reparent(frame);
257 sizer->Add( widget, 1, wxALL|wxGROW, 2);
258 // frame->SetAutoLayout(true);
259 frame->SetSizer(sizer);
263 //=========================================================================
265 //=========================================================================
266 WxBlackBoxFrame::~WxBlackBoxFrame()
269 //=========================================================================
271 //=========================================================================
272 void WxBlackBoxFrame::bbShow()
274 bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow("
275 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
276 WxBlackBoxWindow::bbShow();
279 //=========================================================================
281 //=========================================================================
282 void WxBlackBoxFrame::bbHide()
284 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
285 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
286 WxBlackBoxWindow::bbHide();
289 //=========================================================================
293 //=========================================================================
294 // WxBlackBoxDialogWrapper
295 //=========================================================================
297 //=========================================================================
298 WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
300 : WxBlackBoxWindow(box),
303 bbtkDebugMessage("Wx",9,
304 "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
305 <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
308 //=========================================================================
310 //=========================================================================
311 WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
314 //=========================================================================
316 //=========================================================================
317 void WxBlackBoxDialogWrapper::bbShow()
319 bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
320 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
321 WxBlackBoxWindow::bbShow();
322 int i = mWrapped->ShowModal();
324 mWrapped->SetReturnCode( i );
326 //=========================================================================
328 //=========================================================================
329 void WxBlackBoxDialogWrapper::bbHide()
331 bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
332 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
333 WxBlackBoxWindow::bbHide();
336 //=========================================================================
341 //=========================================================================
343 //=========================================================================
345 //=========================================================================
346 WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
349 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
350 mBox->bbSetWidget(this);
352 //=========================================================================
354 //=========================================================================
355 WxBlackBoxWidget::~WxBlackBoxWidget()
357 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
358 mBox->bbSetWidget(0);
359 //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
361 //=========================================================================
366 //=========================================================================
367 // WxBlackBoxWidgetEventHandler
368 //=========================================================================
370 //=========================================================================
371 WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler( WxBlackBox* box,
378 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
380 mBox->bbSetWidgetEventHandler(this);
382 Connect ( mWindow->GetId(),
384 (wxObjectEventFunction)
385 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
386 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
388 mWindow->PushEventHandler(this);
391 //=========================================================================
393 //=========================================================================
394 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
396 bbtkDebugMessage("Wx",9,
397 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
398 <<mBox->bbGetFullName()<<")"<<std::endl);
399 mBox->bbSetWidgetEventHandler(0);
401 //=========================================================================
403 //=========================================================================
404 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
406 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
407 <<mBox->bbGetFullName()<<"]"<<std::endl);
408 mBox->bbSetOutputWidget(0);
409 mBox->bbSetModifiedStatus();
413 //=========================================================================
422 //=========================================================================
423 wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
426 bbtkDebugMessageInc("Core",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
428 BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
429 if (i==b->bbGetInputConnectorMap().end())
431 bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
433 <<" does not have any 'Parent' input ?!?");
435 Connection* c = i->second->GetConnection();
438 bbtkDebugMessage("Core",9,
439 "-> The input 'Parent' of the box "
441 <<" is not connected."<<std::endl);
445 std::map< Connection*, wxWindow *>::const_iterator j
446 = mConnectionToWindowMap.find(c);
448 if (j==mConnectionToWindowMap.end())
450 bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
452 <<") no window provided by parent ?!?");
455 bbtkDebugDecTab("Core",9);
458 //=========================================================================
461 //=========================================================================
463 //=========================================================================
465 //=========================================================================
466 //=========================================================================
467 //=========================================================================
468 //=========================================================================
469 BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,UserBlackBox);
470 //=========================================================================
472 //=========================================================================
473 void WxBlackBox::bbUserConstructor()
475 bbtkDebugMessage("Core",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
478 //=========================================================================
480 //=========================================================================
481 void WxBlackBox::bbUserCopyConstructor()
483 bbtkDebugMessage("Core",9,"WxBlackBox::bbUserCopyConstructor()"
487 //=========================================================================
490 //=========================================================================
491 void WxBlackBox::bbUserDestructor()
493 bbtkDebugMessage("Core",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
495 delete bbGetWindow();
498 bbtkDebugMessage("Core",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
500 //=========================================================================
504 //=========================================================================
505 WxBlackBox::Widget* WxBlackBox::bbGetWidget()
507 if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead())
509 bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
510 bbGetFullName()<<"] : Widget is dead : deleting it"
512 delete bbGetOutputWidget();
513 bbSetOutputWidget(0);
515 return bbGetOutputWidget();
517 //=========================================================================
521 //=========================================================================
523 * \brief Initialize the attributes of the class
526 void WxBlackBox::bbInitAttributes()
530 // bbSetInputWinParent(0);
531 bbSetInputWinTitle("...");
532 bbSetInputWinWidth(800);
533 bbSetInputWinHeight(800);
534 bbSetInputWinDialog(false);
535 bbSetOutputWidget(0);
537 bbSetWidgetEventHandler(0);
539 //=========================================================================
543 //==================================================================
544 /// Specific methods for window creation during pipeline execution
545 /// Shows the window associated to the box
546 /// (called after bbProcess during bbExecute)
547 void WxBlackBox::bbShowWindow(Connection* caller)
549 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
550 <<bbGetFullName()<<"]"<<std::endl);
552 // If Event Handler for the widget does not exist or is obsolete : create it
553 if (bbGetOutputWidget()!=0)
555 if (bbGetWidgetEventHandler()==0)
557 bbtkDebugMessage("Process",3,
558 "-> No widget event handler : creating one"
560 new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
562 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
563 ( bbGetOutputWidget() ) )
565 bbtkDebugMessage("Process",3,
566 "-> Obsolete widget event handler : re-creating one"
568 delete bbGetWidgetEventHandler();
569 new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
573 // If the output 'Widget' is connected then it's gonna
574 // be captured by its parent window : nothing to do
575 if ( (*bbGetOutputConnectorMap().find("Widget")).second
576 ->GetConnectionVector().size() != 0 )
579 bbtkDebugMessage("Process",2,
580 "-> Output 'Widget' connected : nothing to do"
582 bbtkDebugDecTab("Process",1);
588 // If the window already exists : no need creating it
589 if (bbGetWindow()!=0)
591 bbtkDebugMessage("Process",2,
592 "-> Window already exists"
594 show = bbGetWindow();
596 // Else if the widget exists : create window
597 else if (bbGetOutputWidget()!=0)
599 bbtkDebugMessage("Process",2,
600 "-> Widget exists : creating the window"
604 // Input WinDialog set to true : creating a Dialog
605 if (bbGetInputWinDialog())
607 bbtkDebugMessage("Process",2,
608 " Input WinDialog set to true : creating a Dialog"
610 show = (Window*) new WxBlackBoxDialog( this,
611 bbGlobalGetTopWindow(),
612 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
613 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
615 // Input WinDialog set to false : creating a Frame
618 bbtkDebugMessage("Process",2,
619 " Input WinDialog set to false : creating a Frame"
621 show = (Window*) new WxBlackBoxFrame( this,
622 bbGlobalGetTopWindow(),
623 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
624 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
628 // No window nor widget : error
631 bbtkError("WxBlackBox::bbShowWindow() ["
633 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
638 if (true) //!show->IsShown())
644 bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
648 bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
649 <<bbGetFullName()<<"]"<<std::endl);
650 bbtkDebugDecTab("Process",1);
652 //==================================================================
657 //==================================================================
658 void WxBlackBox::bbHideWindow()
660 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
661 <<bbGetFullName()<<"]"<<std::endl);
663 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
665 bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
666 <<bbGetFullName()<<"]"<<std::endl);
668 //==================================================================