1 /*=========================================================================
4 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
6 Date: $Date: 2008/01/28 14:32:54 $
7 Version: $Revision: 1.3 $
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"
41 //=========================================================================
42 wxWindow* WxBlackBox::bbGlobalGetTopWindow()
46 //=========================================================================
48 //=========================================================================
49 void WxBlackBox::bbGlobalSetTopWindow(wxWindow* w)
53 bbtkGlobalError("WxBlackBox::bbGlobalSetTopWindow : top window already set !");
57 //=========================================================================
60 //=========================================================================
61 void WxBlackBox::bbGlobalDecNbWindowsAlive()
65 if ( (bbmgNbWindowsAlive==0) &&
66 bbmgTopWindow && (!bbmgTopWindow->IsShown()))
68 bbmgTopWindow->Close();
72 //=========================================================================
74 //=========================================================================
75 void WxBlackBox::bbGlobalDecNbWindowsShown()
78 if ( (bbmgNbWindowsShown==0) &&
79 bbmgTopWindow && (!bbmgTopWindow->IsShown()))
81 bbmgTopWindow->Close();
84 //=========================================================================
86 //=========================================================================
88 wxWindow* WxBlackBox::bbmgTopWindow =0;
89 int WxBlackBox::bbmgNbWindowsAlive = 0;
90 int WxBlackBox::bbmgNbWindowsShown = 0;
91 //=========================================================================
97 //=========================================================================
99 //=========================================================================
103 //=========================================================================
104 WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox* box)
105 : mBox(box), mShown(false)
107 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
108 mBox->bbGetFullName()<<")"<<std::endl);
109 mBox->bbSetWindow(this);
110 WxBlackBox::bbGlobalIncNbWindowsAlive();
111 bbtkDebugMessage("Wx",9," -> Number of windows alive = "
112 <<WxBlackBox::bbGlobalGetNbWindowsAlive()<<std::endl);
114 //=========================================================================
116 //=========================================================================
117 WxBlackBoxWindow::~WxBlackBoxWindow()
119 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() ["<<
120 mBox->bbGetFullName()<<"]"<<std::endl);
122 mBox->bbSetWindow(0);
123 WxBlackBox::bbGlobalDecNbWindowsAlive();
124 bbtkDebugMessage("Wx",9," -> Number of windows alive = "
125 <<WxBlackBox::bbGlobalGetNbWindowsAlive()<<std::endl);
129 //=========================================================================
131 //=========================================================================
132 void WxBlackBoxWindow::bbShow()
134 if (bbIsShown()) return;
135 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<<
136 mBox->bbGetFullName()<<"]"<<std::endl);
137 WxBlackBox::bbGlobalIncNbWindowsShown();
139 bbtkDebugMessage("Wx",9," -> Number of windows shown = "
140 <<WxBlackBox::bbGlobalGetNbWindowsShown()<<std::endl);
142 //=========================================================================
144 //=========================================================================
145 void WxBlackBoxWindow::bbHide()
147 if (!bbIsShown()) return;
148 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbHide() ["<<
149 mBox->bbGetFullName()<<"]"<<std::endl);
150 WxBlackBox::bbGlobalDecNbWindowsShown();
152 bbtkDebugMessage("Wx",9," -> Number of windows shown = "
153 <<WxBlackBox::bbGlobalGetNbWindowsShown()<<std::endl);
155 //=========================================================================
159 //=========================================================================
161 //=========================================================================
163 //=========================================================================
164 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox* box,
169 WxBlackBoxWindow(box),
183 bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
184 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
185 <<title<<",size)"<<std::endl);
186 // Insert the widget into the window
187 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
188 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
189 widget->Reparent(this);
190 sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
191 //SetAutoLayout(true);
195 //=========================================================================
197 //=========================================================================
198 void WxBlackBoxDialog::bbShow()
200 bbtkDebugMessage("Wx",5,"WxBlackBoxDialog::bbShow() ["
201 <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
202 WxBlackBoxWindow::bbShow();
203 SetReturnCode( wxDialog::ShowModal() );
205 //=========================================================================
207 //=========================================================================
208 void WxBlackBoxDialog::bbHide()
210 bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::bbHide() ["<<
211 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
212 WxBlackBoxWindow::bbHide();
215 //=========================================================================
217 //=========================================================================
218 WxBlackBoxDialog::~WxBlackBoxDialog()
221 //=========================================================================
227 //=========================================================================
229 //=========================================================================
231 //=========================================================================
232 WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox* box,
236 : WxBlackBoxWindow(box),
250 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
251 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
252 <<title<<",size)"<<std::endl);
253 // Insert the widget into the window
254 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
255 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
256 wxFrame* frame = (wxFrame*)this;
257 widget->Reparent(frame);
258 sizer->Add( widget, 1, wxALL|wxGROW, 2);
259 // frame->SetAutoLayout(true);
260 frame->SetSizer(sizer);
264 //=========================================================================
266 //=========================================================================
267 WxBlackBoxFrame::~WxBlackBoxFrame()
270 //=========================================================================
272 //=========================================================================
273 void WxBlackBoxFrame::bbShow()
275 bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow("
276 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
277 WxBlackBoxWindow::bbShow();
280 //=========================================================================
282 //=========================================================================
283 void WxBlackBoxFrame::bbHide()
285 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
286 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
287 WxBlackBoxWindow::bbHide();
290 //=========================================================================
294 //=========================================================================
295 // WxBlackBoxDialogWrapper
296 //=========================================================================
298 //=========================================================================
299 WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
301 : WxBlackBoxWindow(box),
304 bbtkDebugMessage("Wx",9,
305 "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
306 <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
309 //=========================================================================
311 //=========================================================================
312 WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
315 //=========================================================================
317 //=========================================================================
318 void WxBlackBoxDialogWrapper::bbShow()
320 bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
321 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
322 WxBlackBoxWindow::bbShow();
323 int i = mWrapped->ShowModal();
325 mWrapped->SetReturnCode( i );
327 //=========================================================================
329 //=========================================================================
330 void WxBlackBoxDialogWrapper::bbHide()
332 bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
333 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
334 WxBlackBoxWindow::bbHide();
337 //=========================================================================
342 //=========================================================================
344 //=========================================================================
346 //=========================================================================
347 WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
350 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
351 mBox->bbSetWidget(this);
353 //=========================================================================
355 //=========================================================================
356 WxBlackBoxWidget::~WxBlackBoxWidget()
358 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
359 mBox->bbSetWidget(0);
360 //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
362 //=========================================================================
367 //=========================================================================
368 // WxBlackBoxWidgetEventHandler
369 //=========================================================================
371 //=========================================================================
372 WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler( WxBlackBox* box,
379 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
381 mBox->bbSetWidgetEventHandler(this);
383 Connect ( mWindow->GetId(),
385 (wxObjectEventFunction)
386 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
387 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
389 mWindow->PushEventHandler(this);
392 //=========================================================================
394 //=========================================================================
395 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
397 bbtkDebugMessage("Wx",9,
398 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
399 <<mBox->bbGetFullName()<<")"<<std::endl);
400 mBox->bbSetWidgetEventHandler(0);
402 //=========================================================================
404 //=========================================================================
405 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
407 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
408 <<mBox->bbGetFullName()<<"]"<<std::endl);
409 mBox->bbSetOutputWidget(0);
410 mBox->bbSetModifiedStatus();
414 //=========================================================================
423 //=========================================================================
424 wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
427 bbtkDebugMessageInc("Core",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
429 BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
430 if (i==b->bbGetInputConnectorMap().end())
432 bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
434 <<" does not have any 'Parent' input ?!?");
436 Connection* c = i->second->GetConnection();
439 bbtkDebugMessage("Core",9,
440 "-> The input 'Parent' of the box "
442 <<" is not connected."<<std::endl);
446 std::map< Connection*, wxWindow *>::const_iterator j
447 = mConnectionToWindowMap.find(c);
449 if (j==mConnectionToWindowMap.end())
451 bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
453 <<") no window provided by parent ?!?");
456 bbtkDebugDecTab("Core",9);
459 //=========================================================================
462 //=========================================================================
464 //=========================================================================
466 //=========================================================================
467 //=========================================================================
468 //=========================================================================
469 //=========================================================================
470 BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,UserBlackBox);
471 //=========================================================================
473 //=========================================================================
474 void WxBlackBox::bbUserConstructor()
476 bbtkDebugMessage("Core",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
479 //=========================================================================
481 //=========================================================================
482 void WxBlackBox::bbUserCopyConstructor()
484 bbtkDebugMessage("Core",9,"WxBlackBox::bbUserCopyConstructor()"
488 //=========================================================================
491 //=========================================================================
492 void WxBlackBox::bbUserDestructor()
494 bbtkDebugMessage("Core",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
496 delete bbGetWindow();
499 bbtkDebugMessage("Core",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
501 //=========================================================================
505 //=========================================================================
506 WxBlackBox::Widget* WxBlackBox::bbGetWidget()
508 if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead())
510 bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
511 bbGetFullName()<<"] : Widget is dead : deleting it"
513 delete bbGetOutputWidget();
514 bbSetOutputWidget(0);
516 return bbGetOutputWidget();
518 //=========================================================================
522 //=========================================================================
524 * \brief Initialize the attributes of the class
527 void WxBlackBox::bbInitAttributes()
531 // bbSetInputWinParent(0);
532 bbSetInputWinTitle("...");
533 bbSetInputWinWidth(800);
534 bbSetInputWinHeight(800);
535 bbSetInputWinDialog(false);
536 bbSetOutputWidget(0);
538 bbSetWidgetEventHandler(0);
540 //=========================================================================
544 //==================================================================
545 /// Specific methods for window creation during pipeline execution
546 /// Shows the window associated to the box
547 /// (called after bbProcess during bbExecute)
548 void WxBlackBox::bbShowWindow()
550 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
551 <<bbGetFullName()<<"]"<<std::endl);
553 // If Event Handler for the widget does not exist or is obsolete : create it
554 if (bbGetOutputWidget()!=0)
556 if (bbGetWidgetEventHandler()==0)
558 bbtkDebugMessage("Process",3,
559 "-> No widget event handler : creating one"
561 new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
563 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
564 ( bbGetOutputWidget() ) )
566 bbtkDebugMessage("Process",3,
567 "-> Obsolete widget event handler : re-creating one"
569 delete bbGetWidgetEventHandler();
570 new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
574 // If the output 'Widget' is connected then it's gonna
575 // be captured by its parent window : nothing to do
576 if ( (*bbGetOutputConnectorMap().find("Widget")).second
577 ->GetConnectionVector().size() != 0 )
580 bbtkDebugMessage("Process",2,
581 "-> Output 'Widget' connected : nothing to do"
583 bbtkDebugDecTab("Process",1);
589 // If the window already exists : no need creating it
590 if (bbGetWindow()!=0)
592 bbtkDebugMessage("Process",2,
593 "-> Window already exists"
595 show = bbGetWindow();
597 // Else if the widget exists : create window
598 else if (bbGetOutputWidget()!=0)
600 bbtkDebugMessage("Process",2,
601 "-> Widget exists : creating the window"
605 // Input WinDialog set to true : creating a Dialog
606 if (bbGetInputWinDialog())
608 bbtkDebugMessage("Process",2,
609 " Input WinDialog set to true : creating a Dialog"
611 show = (Window*) new WxBlackBoxDialog( this,
612 bbGlobalGetTopWindow(),
613 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
614 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
616 // Input WinDialog set to false : creating a Frame
619 bbtkDebugMessage("Process",2,
620 " Input WinDialog set to false : creating a Frame"
622 show = (Window*) new WxBlackBoxFrame( this,
623 bbGlobalGetTopWindow(),
624 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
625 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
629 // No window nor widget : error
632 bbtkError("WxBlackBox::bbShowWindow() ["
634 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
639 if (true) //!show->IsShown())
645 bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
649 bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
650 <<bbGetFullName()<<"]"<<std::endl);
651 bbtkDebugDecTab("Process",1);
653 //==================================================================
658 //==================================================================
659 void WxBlackBox::bbHideWindow()
661 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
662 <<bbGetFullName()<<"]"<<std::endl);
664 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
666 bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
667 <<bbGetFullName()<<"]"<<std::endl);
669 //==================================================================