1 /*=========================================================================
4 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
6 Date: $Date: 2008/02/08 10:05:38 $
7 Version: $Revision: 1.7 $
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 //=========================================================================
78 //=========================================================================
79 void WxBlackBoxWindow::bbShow()
81 if (bbIsShown()) return;
82 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<<
83 mBox->bbGetFullName()<<"]"<<std::endl);
84 Wx::IncNbWindowsShown();
86 bbtkDebugMessage("Wx",9," -> Number of windows shown = "
87 <<Wx::GetNbWindowsShown()<<std::endl);
89 //=========================================================================
91 //=========================================================================
92 void WxBlackBoxWindow::bbHide()
94 if (!bbIsShown()) return;
95 bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbHide() ["<<
96 mBox->bbGetFullName()<<"]"<<std::endl);
97 Wx::DecNbWindowsShown();
99 bbtkDebugMessage("Wx",9," -> Number of windows shown = "
100 <<Wx::GetNbWindowsShown()<<std::endl);
102 //=========================================================================
106 //=========================================================================
108 //=========================================================================
110 //=========================================================================
111 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox* box,
116 WxBlackBoxWindow(box),
130 bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
131 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
132 <<title<<",size)"<<std::endl);
133 // Insert the widget into the window
134 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
135 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
136 widget->Reparent(this);
137 sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
138 //SetAutoLayout(true);
142 //=========================================================================
144 //=========================================================================
145 void WxBlackBoxDialog::bbShow()
147 bbtkDebugMessage("Wx",5,"WxBlackBoxDialog::bbShow() ["
148 <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
149 WxBlackBoxWindow::bbShow();
150 SetReturnCode( wxDialog::ShowModal() );
152 //=========================================================================
154 //=========================================================================
155 void WxBlackBoxDialog::bbHide()
157 bbtkDebugMessage("Wx",9,"WxBlackBoxDialog::bbHide() ["<<
158 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
159 WxBlackBoxWindow::bbHide();
162 //=========================================================================
164 //=========================================================================
165 WxBlackBoxDialog::~WxBlackBoxDialog()
168 //=========================================================================
174 //=========================================================================
176 //=========================================================================
178 //=========================================================================
179 WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox* box,
183 : WxBlackBoxWindow(box),
197 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
198 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
199 <<title<<",size)"<<std::endl);
200 // Insert the widget into the window
201 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
202 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
203 wxFrame* frame = (wxFrame*)this;
204 widget->Reparent(frame);
205 sizer->Add( widget, 1, wxALL|wxGROW, 2);
206 // frame->SetAutoLayout(true);
207 frame->SetSizer(sizer);
211 //=========================================================================
213 //=========================================================================
214 WxBlackBoxFrame::~WxBlackBoxFrame()
217 //=========================================================================
219 //=========================================================================
220 void WxBlackBoxFrame::bbShow()
222 bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow("
223 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
224 WxBlackBoxWindow::bbShow();
227 //=========================================================================
229 //=========================================================================
230 void WxBlackBoxFrame::bbHide()
232 bbtkDebugMessage("Wx",9,"WxBlackBoxFrame::bbHide() ["<<
233 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
234 WxBlackBoxWindow::bbHide();
237 //=========================================================================
241 //=========================================================================
242 // WxBlackBoxDialogWrapper
243 //=========================================================================
245 //=========================================================================
246 WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper(WxBlackBox* box,
248 : WxBlackBoxWindow(box),
251 bbtkDebugMessage("Wx",9,
252 "WxBlackBoxDialogWrapper::WxBlackBoxDialogWrapper("
253 <<bbGetBlackBox()->bbGetFullName()<<","<<wrapped
256 //=========================================================================
258 //=========================================================================
259 WxBlackBoxDialogWrapper::~WxBlackBoxDialogWrapper()
262 //=========================================================================
264 //=========================================================================
265 void WxBlackBoxDialogWrapper::bbShow()
267 bbtkDebugMessage("Wx",5,"WxBlackBoxDialogWrapper::bbShow("
268 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
269 WxBlackBoxWindow::bbShow();
270 int i = mWrapped->ShowModal();
272 mWrapped->SetReturnCode( i );
274 //=========================================================================
276 //=========================================================================
277 void WxBlackBoxDialogWrapper::bbHide()
279 bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<<
280 bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
281 WxBlackBoxWindow::bbHide();
284 //=========================================================================
289 //=========================================================================
291 //=========================================================================
293 //=========================================================================
294 WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box)
297 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<<box->bbGetFullName()<<")"<<std::endl);
298 mBox->bbSetWidget(this);
300 //=========================================================================
302 //=========================================================================
303 WxBlackBoxWidget::~WxBlackBoxWidget()
305 bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
306 mBox->bbSetWidget(0);
307 //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<<mBox->bbGetFullName()<<")"<<std::endl);
309 //=========================================================================
314 //=========================================================================
315 // WxBlackBoxWidgetEventHandler
316 //=========================================================================
318 //=========================================================================
319 WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler( WxBlackBox* box,
326 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox->bbGetFullName()<<")"<<std::endl);
328 mBox->bbSetWidgetEventHandler(this);
330 Connect ( mWindow->GetId(),
332 (wxObjectEventFunction)
333 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
334 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
336 mWindow->PushEventHandler(this);
339 //=========================================================================
341 //=========================================================================
342 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
344 bbtkDebugMessage("Wx",9,
345 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler("
346 <<mBox->bbGetFullName()<<")"<<std::endl);
347 mBox->bbSetWidgetEventHandler(0);
349 //=========================================================================
351 //=========================================================================
352 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
354 bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
355 <<mBox->bbGetFullName()<<"]"<<std::endl);
356 mBox->bbSetOutputWidget(0);
357 mBox->bbSetModifiedStatus();
361 //=========================================================================
370 //=========================================================================
371 wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b)
374 bbtkDebugMessageInc("Kernel",9,"WxParentToChildData::GetWindowInWhichToInsert("<<b->bbGetFullName()<<")"<<std::endl);
376 BlackBox::InputConnectorMapType::const_iterator i = b->bbGetInputConnectorMap().find("WinParent");
377 if (i==b->bbGetInputConnectorMap().end())
379 bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box "
381 <<" does not have any 'Parent' input ?!?");
383 Connection* c = i->second->GetConnection();
386 bbtkDebugMessage("Kernel",9,
387 "-> The input 'Parent' of the box "
389 <<" is not connected."<<std::endl);
393 std::map< Connection*, wxWindow *>::const_iterator j
394 = mConnectionToWindowMap.find(c);
396 if (j==mConnectionToWindowMap.end())
398 bbtkError("WxParentToChildData::GetWindowInWhichToInsert("
400 <<") no window provided by parent ?!?");
403 bbtkDebugDecTab("Kernel",9);
406 //=========================================================================
409 //=========================================================================
411 //=========================================================================
413 //=========================================================================
414 //=========================================================================
415 //=========================================================================
416 //=========================================================================
417 BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
418 //=========================================================================
420 //=========================================================================
421 void WxBlackBox::bbUserConstructor()
423 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
426 //=========================================================================
428 //=========================================================================
429 void WxBlackBox::bbUserCopyConstructor()
431 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
435 //=========================================================================
438 //=========================================================================
439 void WxBlackBox::bbUserDestructor()
441 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserDestructor()"<<std::endl);
443 delete bbGetWindow();
446 bbtkDebugMessage("Kernel",9,"EO WxBlackBox::bbUserDestructor()"<<std::endl);
448 //=========================================================================
452 //=========================================================================
453 WxBlackBox::Widget* WxBlackBox::bbGetWidget()
455 if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead())
457 bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<<
458 bbGetFullName()<<"] : Widget is dead : deleting it"
460 delete bbGetOutputWidget();
461 bbSetOutputWidget(0);
463 return bbGetOutputWidget();
465 //=========================================================================
469 //=========================================================================
471 * \brief Initialize the attributes of the class
474 void WxBlackBox::bbInitAttributes()
478 // bbSetInputWinParent(0);
479 bbSetInputWinTitle(bbGetName());
480 bbSetInputWinWidth(800);
481 bbSetInputWinHeight(800);
482 bbSetInputWinDialog(false);
483 bbSetOutputWidget(0);
485 bbSetWidgetEventHandler(0);
487 //=========================================================================
491 //==================================================================
492 /// Specific methods for window creation during pipeline execution
493 /// Shows the window associated to the box
494 /// (called after bbProcess during bbExecute)
495 void WxBlackBox::bbShowWindow()
497 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
498 <<bbGetFullName()<<"]"<<std::endl);
500 // If Event Handler for the widget does not exist or is obsolete : create it
501 if (bbGetOutputWidget()!=0)
503 if (bbGetWidgetEventHandler()==0)
505 bbtkDebugMessage("Process",3,
506 "-> No widget event handler : creating one"
508 new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
510 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
511 ( bbGetOutputWidget() ) )
513 bbtkDebugMessage("Process",3,
514 "-> Obsolete widget event handler : re-creating one"
516 delete bbGetWidgetEventHandler();
517 new WxBlackBoxWidgetEventHandler(this,bbGetOutputWidget());
519 // Sets the name of the wxWindow to the input WinTitle
520 bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
523 // If the output 'Widget' is connected then it's gonna
524 // be captured by its parent window : nothing to do
525 if ( (*bbGetOutputConnectorMap().find("Widget")).second
526 ->GetConnectionVector().size() != 0 )
529 bbtkDebugMessage("Process",2,
530 "-> Output 'Widget' connected : nothing to do"
532 bbtkDebugDecTab("Process",1);
538 // If the window already exists : no need creating it
539 if (bbGetWindow()!=0)
541 bbtkDebugMessage("Process",2,
542 "-> Window already exists"
544 show = bbGetWindow();
546 // Else if the widget exists : create window
547 else if (bbGetOutputWidget()!=0)
549 bbtkDebugMessage("Process",2,
550 "-> Widget exists : creating the window"
554 // Input WinDialog set to true : creating a Dialog
555 if (bbGetInputWinDialog())
557 bbtkDebugMessage("Process",2,
558 " Input WinDialog set to true : creating a Dialog"
560 show = (Window*) new WxBlackBoxDialog( this,
562 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
563 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
565 // Input WinDialog set to false : creating a Frame
568 bbtkDebugMessage("Process",2,
569 " Input WinDialog set to false : creating a Frame"
571 show = (Window*) new WxBlackBoxFrame( this,
573 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
574 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
578 // No window nor widget : error
581 bbtkError("WxBlackBox::bbShowWindow() ["
583 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
588 if (true) //!show->IsShown())
594 bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
598 bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
599 <<bbGetFullName()<<"]"<<std::endl);
600 bbtkDebugDecTab("Process",1);
602 //==================================================================
607 //==================================================================
608 void WxBlackBox::bbHideWindow()
610 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
611 <<bbGetFullName()<<"]"<<std::endl);
613 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
615 bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
616 <<bbGetFullName()<<"]"<<std::endl);
618 //==================================================================