1 /*=========================================================================
4 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
6 Date: $Date: 2008/04/23 14:49:28 $
7 Version: $Revision: 1.15 $
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.lock()->bbGetFullName()<<")"<<std::endl);
56 mBox.lock()->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() "
69 Wx::DecNbWindowsAlive();
72 mBox.lock()->bbSetWindow(0);
77 bbtkDebugMessage("wx",5," -> Number of windows alive = "
78 <<Wx::GetNbWindowsAlive()<<std::endl);
80 //=========================================================================
83 //=========================================================================
84 void WxBlackBoxWindow::bbShow()
86 if (bbIsShown()) return;
87 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbShow()"<<std::endl);
88 Wx::IncNbWindowsShown();
90 bbtkDebugMessage("wx",5," -> Number of windows shown = "
91 <<Wx::GetNbWindowsShown()<<std::endl);
93 //=========================================================================
95 //=========================================================================
96 void WxBlackBoxWindow::bbHide()
98 if (!bbIsShown()) return;
99 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbHide()"<<std::endl);
100 Wx::DecNbWindowsShown();
102 bbtkDebugMessage("wx",5," -> Number of windows shown = "
103 <<Wx::GetNbWindowsShown()<<std::endl);
105 //=========================================================================
109 //=========================================================================
111 //=========================================================================
113 //=========================================================================
114 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox::Pointer box,
119 WxBlackBoxWindow(box),
133 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
134 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
135 <<title<<",size)"<<std::endl);
136 // Insert the widget into the window
137 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
138 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
139 widget->Reparent(this);
140 sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
141 //SetAutoLayout(true);
145 //=========================================================================
147 //=========================================================================
148 void WxBlackBoxDialog::bbShow()
150 bbtkDebugMessage("wx",5,"WxBlackBoxDialog::bbShow() ["
151 <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
152 WxBlackBoxWindow::bbShow();
153 SetReturnCode( wxDialog::ShowModal() );
155 //=========================================================================
157 //=========================================================================
158 void WxBlackBoxDialog::bbHide()
160 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbHide()"<<std::endl);
161 WxBlackBoxWindow::bbHide();
164 //=========================================================================
166 //=========================================================================
167 WxBlackBoxDialog::~WxBlackBoxDialog()
170 //=========================================================================
176 //=========================================================================
178 //=========================================================================
180 //=========================================================================
181 WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox::Pointer box,
185 : WxBlackBoxWindow(box),
199 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
200 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
201 <<title<<",size)"<<std::endl);
202 // Insert the widget into the window
203 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
204 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
205 wxFrame* frame = (wxFrame*)this;
206 widget->Reparent(frame);
207 sizer->Add( widget, 1, wxALL|wxGROW, 2);
208 // frame->SetAutoLayout(true);
209 frame->SetSizer(sizer);
213 //=========================================================================
215 //=========================================================================
216 WxBlackBoxFrame::~WxBlackBoxFrame()
219 //=========================================================================
221 //=========================================================================
222 void WxBlackBoxFrame::bbShow()
224 bbtkDebugMessage("wx",5,"WxBlackBoxFrame::bbShow("
225 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
226 WxBlackBoxWindow::bbShow();
228 // This Update is ** MANDATORY **
229 // to synchronize wxvtkRenderWindowInteractor objects
230 // (force wx objects creation **NOW**)
232 if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnShow();
233 // wxFrame::SetFocus();
235 //=========================================================================
237 //=========================================================================
238 void WxBlackBoxFrame::bbHide()
240 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbHide()"<<std::endl);
241 WxBlackBoxWindow::bbHide();
243 if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnHide();
245 //=========================================================================
250 //=========================================================================
251 // WxBlackBoxWidgetEventHandler
252 //=========================================================================
254 //=========================================================================
255 WxBlackBoxWidgetEventHandler::
256 WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box,
262 bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox.lock()->bbGetFullName()<<")"<<std::endl);
264 mBox.lock()->bbSetWidgetEventHandler(this);
266 Connect ( mWindow->GetId(),
268 (wxObjectEventFunction)
269 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
270 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
272 mWindow->PushEventHandler(this);
275 //=========================================================================
277 //=========================================================================
278 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
280 if (mBox.expired()) return;
281 bbtkDebugMessage("wx",9,
282 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() ["
283 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
284 mBox.lock()->bbSetWidgetEventHandler(0);
286 //=========================================================================
288 //=========================================================================
289 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
291 if (mBox.expired()) return;
292 bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
293 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
294 mBox.lock()->bbSetOutputWidget(0);
295 mBox.lock()->bbSetModifiedStatus();
297 //=========================================================================
305 //=========================================================================
307 //=========================================================================
309 //=========================================================================
310 //=========================================================================
311 //=========================================================================
312 //=========================================================================
313 BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
314 //=========================================================================
316 //=========================================================================
317 void WxBlackBox::bbUserConstructor()
319 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
322 //=========================================================================
324 //=========================================================================
325 void WxBlackBox::bbUserCopyConstructor()
327 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
331 //=========================================================================
334 //=========================================================================
335 void WxBlackBox::bbUserDestructor()
337 bbtkDebugMessage("wx",9,"==> WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
339 delete bbGetWindow();
342 bbtkDebugMessage("wx",9,"<== WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
344 //=========================================================================
348 //=========================================================================
349 WxBlackBox::Widget* WxBlackBox::bbGetWidget()
351 if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead())
353 bbtkDebugMessage("wx",9,"WxBlackBox::bbGetWidget() ["<<
354 bbGetFullName()<<"] : Widget is dead : deleting it"
356 delete bbGetOutputWidget();
357 bbSetOutputWidget(0);
359 return bbGetOutputWidget();
361 //=========================================================================
365 //=========================================================================
367 * \brief Initialize the attributes of the class
370 void WxBlackBox::bbInitAttributes()
374 // bbSetInputWinParent(0);
375 bbSetInputWinTitle(bbGetName());
376 bbSetInputWinWidth(800);
377 bbSetInputWinHeight(800);
378 bbSetInputWinDialog(false);
379 bbSetOutputWidget(0);
381 bbSetWidgetEventHandler(0);
382 bbSetUpdateTransferedToParent(false);
384 //=========================================================================
386 //=========================================================================
387 /// Main processing method of the box.
388 void WxBlackBox::bbExecute(bool force)
390 bbtkDebugMessageInc("Process",1,
391 "=> WxBlackBox::bbExecute() ["
392 <<bbGetFullName()<<"]"<<std::endl);
394 // If the output 'Widget' is connected then
395 // we must execute the parent box
396 BlackBox::OutputConnectorMapType::const_iterator i
397 = bbGetOutputConnectorMap().find("Widget");
399 if ( i->second->GetConnectionVector().size() != 0 )
401 bbtkDebugMessage("Process",2,
402 "-> Output 'Widget' connected : transfering execution to parent"
405 i->second->GetConnectionVector().front() //.lock()
406 ->GetBlackBoxTo()->bbExecute(force);
409 // else call 'standard' BlackBox execution method
412 BlackBox::bbExecute(force);
416 bbtkDebugMessageDec("Process",1,
417 "<= WxBlackBox::bbExecute() ["
418 <<bbGetFullName()<<"]"<<std::endl);
420 //=========================================================================
423 //=========================================================================
424 /// Main processing method of the box.
425 IOStatus WxBlackBox::bbBackwardUpdate( Connection::Pointer caller )
427 bbtkDebugMessage("Process",1,
428 "=> WxBlackBox::bbBackwardUpdate("
429 <<(caller?caller->GetFullName():"0")<<") ["
430 <<bbGetFullName()<<"]"<<std::endl);
431 // If the caller's box to is not the box to connected to the
433 if ( ! (( bbGetStatus() == MODIFIED ) ||
434 ( bbBoxProcessModeIsAlways() )) )
436 bbtkDebugMessage("Process",2,"Up-to-date : nothing to do"<<std::endl);
437 bbtkDebugMessage("Process",1,
438 "<= WxBlackBox::bbBackwardUpdate("
439 <<(caller?caller->GetFullName():"0")<<") ["
440 <<bbGetFullName()<<"]"<<std::endl);
441 return bbGetStatus();
444 BlackBox::OutputConnectorMapType::const_iterator i
445 = bbGetOutputConnectorMap().find("Widget") ;
446 if ( i->second->GetConnectionVector().size() != 0 )
449 BlackBox::Pointer to =
450 i->second->GetConnectionVector()[0]->GetBlackBoxTo();
454 bbtkDebugMessage("Process",2,
455 "-> Output 'Widget' connected to '"
456 <<to->bbGetFullName()<<"' - caller->to = '"
457 <<caller->GetBlackBoxTo()->bbGetFullName()
463 bbtkDebugMessage("Process",2,
464 "-> Output 'Widget' connected to '"
465 <<to->bbGetFullName()<<"'"
470 (caller->GetBlackBoxTo() != to))&&
471 (!bbGetUpdateTransferedToParent()))
473 bbtkDebugMessage("Process",2,
474 " ... Transfering update order to parent"
477 bbSetUpdateTransferedToParent(true);
478 i->second->GetConnectionVector().front() //.lock()
479 ->GetBlackBoxTo()->bbExecute(false);
483 bbSetUpdateTransferedToParent(false);
484 bbtkDebugMessage("Process",2,
485 " ... No need to transfer to parent"
491 // If the caller is not the connection to the output widget
492 // and the output 'Widget' is connected then
493 // we must execute the parent box
495 // (this is the role of the flag UpdateTransferedToParent)
497 ((caller!=0)&&(caller->GetBlackBoxFromOutput()!="Widget"))
502 // call 'standard' BlackBox execution method
503 if (!bbGetUpdateTransferedToParent())
505 AtomicBlackBox::bbBackwardUpdate(caller);
508 bbtkDebugMessageDec("Process",1,
509 "<= WxBlackBox::bbBackwardUpdate() ["
510 <<bbGetFullName()<<"]"<<std::endl);
514 //=========================================================================
515 void WxBlackBox::bbProcess()
517 if (bbGetOutputWidget()==0) this->bbUserCreateWidget();
518 this->bbUserProcess();
521 //=========================================================================
523 //==================================================================
524 /// Specific methods for window creation during pipeline execution
525 /// Shows the window associated to the box
526 /// (called after bbProcess during bbExecute)
527 void WxBlackBox::bbShowWindow()
529 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() ["
530 <<bbGetFullName()<<"]"<<std::endl);
532 // If Event Handler for the widget does not exist or is obsolete : create it
533 if (bbGetOutputWidget()!=0)
535 if (bbGetWidgetEventHandler()==0)
537 bbtkDebugMessage("Process",3,
538 "-> No widget event handler : creating one"
540 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
541 bbGetOutputWidget());
543 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
544 ( bbGetOutputWidget() ) )
546 bbtkDebugMessage("Process",3,
547 "-> Obsolete widget event handler : re-creating one"
549 delete bbGetWidgetEventHandler();
550 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
551 bbGetOutputWidget());
553 // Sets the name of the wxWindow to the input WinTitle
554 bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
557 // If the output 'Widget' is connected then it's gonna
558 // be captured by its parent window : nothing to do
559 if ( (*bbGetOutputConnectorMap().find("Widget")).second
560 ->GetConnectionVector().size() != 0 )
563 bbtkDebugMessage("Process",2,
564 "-> Output 'Widget' connected : nothing to do"
566 bbtkDebugDecTab("Process",1);
572 // If the window already exists : no need creating it
573 if (bbGetWindow()!=0)
575 bbtkDebugMessage("Process",2,
576 "-> Window already exists"
578 show = bbGetWindow();
580 // Else if the widget exists : create window
581 else if (bbGetOutputWidget()!=0)
583 bbtkDebugMessage("Process",2,
584 "-> Widget exists : creating the window"
588 // Input WinDialog set to true : creating a Dialog
589 if (bbGetInputWinDialog())
591 bbtkDebugMessage("Process",2,
592 " Input WinDialog set to true : creating a Dialog"
594 show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
596 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
597 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
599 // Input WinDialog set to false : creating a Frame
602 bbtkDebugMessage("Process",2,
603 " Input WinDialog set to false : creating a Frame"
605 show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
607 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
608 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
612 // No window nor widget : error
615 bbtkError("WxBlackBox::bbShowWindow() ["
617 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
622 if (true) //!show->IsShown())
628 bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"<<std::endl);
632 bbtkDebugMessage("Process",1,"<= WxBlackBox::bbShowWindow() ["
633 <<bbGetFullName()<<"]"<<std::endl);
634 bbtkDebugDecTab("Process",1);
636 //==================================================================
641 //==================================================================
642 void WxBlackBox::bbHideWindow()
644 bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbHideWindow() ["
645 <<bbGetFullName()<<"]"<<std::endl);
647 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
649 bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() ["
650 <<bbGetFullName()<<"]"<<std::endl);
652 //==================================================================
655 //==================================================================
656 WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
658 if (bbGetWindow()!=0) return bbGetWindow();
659 BlackBox::OutputConnectorMapType::const_iterator i
660 = bbGetOutputConnectorMap().find("Widget");
661 if ( i->second->GetConnectionVector().size() != 0 )
663 return boost::static_pointer_cast<WxBlackBox>
664 (i->second->GetConnectionVector().front() //.lock()
665 ->GetBlackBoxTo())->bbGetContainingWindow();
669 //==================================================================
672 //==================================================================
673 wxWindow* WxBlackBox::bbGetWxParent() { return Wx::GetTopWindow(); }
674 //==================================================================
677 //==================================================================
678 bool WxBlackBox::bbIsShown()
680 if (bbGetContainingWindow()!=0)
681 return bbGetContainingWindow()->bbIsShown();
684 //==================================================================