1 /*=========================================================================
4 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
6 Date: $Date: 2008/07/25 07:44:12 $
7 Version: $Revision: 1.26 $
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();
59 //=========================================================================
61 //=========================================================================
62 WxBlackBoxWindow::~WxBlackBoxWindow()
64 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() "
67 Wx::DecNbWindowsAlive();
70 mBox.lock()->bbSetWindow(0);
73 //=========================================================================
76 //=========================================================================
77 void WxBlackBoxWindow::bbShow()
79 if (bbIsShown()) return;
80 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbShow()"<<std::endl);
81 Wx::IncNbWindowsShown();
84 //=========================================================================
86 //=========================================================================
87 void WxBlackBoxWindow::bbHide()
89 if (!bbIsShown()) return;
90 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbHide()"<<std::endl);
91 Wx::DecNbWindowsShown();
94 //=========================================================================
96 //=========================================================================
97 void WxBlackBoxWindow::bbClose()
100 //=========================================================================
103 //=========================================================================
105 //=========================================================================
107 //=========================================================================
108 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox::Pointer box,
125 WxBlackBoxWindow(box)
127 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
128 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
129 <<title<<",size)"<<std::endl);
130 // Insert the widget into the window
131 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
132 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
133 widget->Reparent(this);
134 sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
135 //SetAutoLayout(true);
139 //=========================================================================
141 //=========================================================================
142 void WxBlackBoxDialog::bbShow()
144 if (bbIsShown()) return;
145 bbtkDebugMessage("wx",5,"WxBlackBoxDialog::bbShow() ["
146 <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
147 WxBlackBoxWindow::bbShow();
148 SetReturnCode( wxDialog::ShowModal() );
151 //=========================================================================
153 //=========================================================================
154 void WxBlackBoxDialog::bbHide()
156 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbHide()"<<std::endl);
157 WxBlackBoxWindow::bbHide();
160 //=========================================================================
162 //=========================================================================
163 void WxBlackBoxDialog::bbClose()
165 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbClose()"<<std::endl);
168 //=========================================================================
170 //=========================================================================
171 WxBlackBoxDialog::~WxBlackBoxDialog()
174 //=========================================================================
180 //=========================================================================
182 //=========================================================================
184 //=========================================================================
185 WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox::Pointer box,
201 WxBlackBoxWindow(box)
203 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
204 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
205 <<title<<",size)"<<std::endl);
206 // Insert the widget into the window
207 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
208 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
209 wxFrame* frame = (wxFrame*)this;
210 widget->Reparent(frame);
211 sizer->Add( widget, 1, wxALL|wxGROW, 2);
212 // frame->SetAutoLayout(true);
213 frame->SetSizer(sizer);
217 //=========================================================================
219 //=========================================================================
220 WxBlackBoxFrame::~WxBlackBoxFrame()
223 //=========================================================================
225 //=========================================================================
226 void WxBlackBoxFrame::bbShow()
228 if (bbIsShown()) return;
229 bbtkDebugMessage("wx",5,"WxBlackBoxFrame::bbShow("
230 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
231 WxBlackBoxWindow::bbShow();
233 // This Update is ** MANDATORY **
234 // to synchronize wxvtkRenderWindowInteractor objects
235 // (force wx objects creation **NOW**)
244 if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnShow();
246 //=========================================================================
248 //=========================================================================
249 void WxBlackBoxFrame::bbHide()
251 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbHide()"<<std::endl);
252 WxBlackBoxWindow::bbHide();
254 if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnHide();
256 //=========================================================================
258 //=========================================================================
259 void WxBlackBoxFrame::bbClose()
261 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbClose()"<<std::endl);
264 //=========================================================================
268 //=========================================================================
269 // WxBlackBoxWidgetEventHandler
270 //=========================================================================
272 //=========================================================================
273 WxBlackBoxWidgetEventHandler::
274 WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box,
280 bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox.lock()->bbGetFullName()<<")"<<std::endl);
282 mBox.lock()->bbSetWidgetEventHandler(this);
284 Connect ( mWindow->GetId(),
286 (wxObjectEventFunction)
287 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
288 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
290 mWindow->PushEventHandler(this);
293 //=========================================================================
295 //=========================================================================
296 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
298 if (mBox.expired()) return;
299 bbtkDebugMessage("wx",9,
300 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() ["
301 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
302 mBox.lock()->bbSetWidgetEventHandler(0);
304 //=========================================================================
306 //=========================================================================
307 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
309 if (mBox.expired()) return;
310 bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
311 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
312 mBox.lock()->bbSetOutputWidget(0);
313 mBox.lock()->bbSetModifiedStatus();
315 //=========================================================================
323 //=========================================================================
325 //=========================================================================
327 //=========================================================================
328 //=========================================================================
329 //=========================================================================
330 //=========================================================================
331 BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
332 //=========================================================================
334 //=========================================================================
335 void WxBlackBox::bbUserConstructor()
337 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
340 //=========================================================================
342 //=========================================================================
343 void WxBlackBox::bbUserCopyConstructor()
345 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
349 //=========================================================================
352 //=========================================================================
353 void WxBlackBox::bbUserDestructor()
355 bbtkDebugMessage("wx",9,"==> WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
357 delete bbGetWindow();
360 bbtkDebugMessage("wx",9,"<== WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
362 //=========================================================================
366 //=========================================================================
367 WxBlackBox::Widget* WxBlackBox::bbGetWidget()
369 if (bbGetOutputWidget() && bbGetOutputWidget()->IsDead())
371 bbtkDebugMessage("wx",9,"WxBlackBox::bbGetWidget() ["<<
372 bbGetFullName()<<"] : Widget is dead : deleting it"
374 delete bbGetOutputWidget();
375 bbSetOutputWidget(0);
377 return bbGetOutputWidget();
379 //=========================================================================
383 //=========================================================================
385 * \brief Initialize the attributes of the class
388 void WxBlackBox::bbInitAttributes()
392 // bbSetInputWinParent(0);
393 bbSetInputWinTitle(bbGetName());
394 bbSetInputWinWidth(800);
395 bbSetInputWinHeight(800);
396 bbSetInputWinDialog(false);
397 bbSetOutputWidget(0);
399 bbSetWidgetEventHandler(0);
400 bbSetUpdateTransferedToParent(false);
402 //=========================================================================
404 //=========================================================================
405 /// Main processing method of the box.
406 void WxBlackBox::bbExecute(bool force)
408 bbtkDebugMessageInc("process",2,
409 "=> WxBlackBox::bbExecute() ["
410 <<bbGetFullName()<<"]"<<std::endl);
412 // If the output 'Widget' is connected then
413 // we must execute the parent box
414 BlackBox::OutputConnectorMapType::const_iterator i
415 = bbGetOutputConnectorMap().find("Widget");
417 if ( i->second->GetConnectionVector().size() != 0 )
419 bbtkDebugMessage("process",3,
420 "-> Output 'Widget' connected : transfering execution to parent"
423 i->second->GetConnectionVector().front() //.lock()
424 ->GetBlackBoxTo()->bbExecute(force);
427 // else call 'standard' BlackBox execution method
430 BlackBox::bbExecute(force);
434 bbtkDebugMessageDec("process",2,
435 "<= WxBlackBox::bbExecute() ["
436 <<bbGetFullName()<<"]"<<std::endl);
438 //=========================================================================
441 //=========================================================================
442 /// Main processing method of the box.
443 IOStatus WxBlackBox::bbBackwardUpdate( Connection::Pointer caller )
445 bbtkDebugMessage("process",3,
446 "=> WxBlackBox::bbBackwardUpdate("
447 <<(caller?caller->GetFullName():"0")<<") ["
448 <<bbGetFullName()<<"]"<<std::endl);
449 // If the caller's box to is not the box to connected to the
451 if ( ! (( bbGetStatus() == MODIFIED ) ||
452 ( bbBoxProcessModeIsAlways() )) )
454 bbtkDebugMessage("process",3,"Up-to-date : nothing to do"<<std::endl);
455 bbtkDebugMessage("process",3,
456 "<= WxBlackBox::bbBackwardUpdate("
457 <<(caller?caller->GetFullName():"0")<<") ["
458 <<bbGetFullName()<<"]"<<std::endl);
459 return bbGetStatus();
462 BlackBox::OutputConnectorMapType::const_iterator i
463 = bbGetOutputConnectorMap().find("Widget") ;
464 if ( i->second->GetConnectionVector().size() != 0 )
467 BlackBox::Pointer to =
468 i->second->GetConnectionVector()[0]->GetBlackBoxTo();
472 bbtkDebugMessage("process",3,
473 "-> Output 'Widget' connected to '"
474 <<to->bbGetFullName()<<"' - caller->to = '"
475 <<caller->GetBlackBoxTo()->bbGetFullName()
481 bbtkDebugMessage("process",3,
482 "-> Output 'Widget' connected to '"
483 <<to->bbGetFullName()<<"'"
488 (caller->GetBlackBoxTo() != to))&&
489 (!bbGetUpdateTransferedToParent())&&
490 (to->bbGetStatus()!=UPDATING))
492 bbtkDebugMessage("process",3,
493 " ... Transfering update order to parent"
496 bbSetUpdateTransferedToParent(true);
497 i->second->GetConnectionVector().front() //.lock()
498 ->GetBlackBoxTo()->bbExecute(false);
502 bbSetUpdateTransferedToParent(false);
503 bbtkDebugMessage("process",3,
504 " ... No need to transfer to parent"
510 // If the caller is not the connection to the output widget
511 // and the output 'Widget' is connected then
512 // we must execute the parent box
514 // (this is the role of the flag UpdateTransferedToParent)
516 ((caller!=0)&&(caller->GetBlackBoxFromOutput()!="Widget"))
521 // call 'standard' BlackBox execution method
522 if (!bbGetUpdateTransferedToParent())
524 AtomicBlackBox::bbBackwardUpdate(caller);
527 bbtkDebugMessageDec("process",3,
528 "<= WxBlackBox::bbBackwardUpdate() ["
529 <<bbGetFullName()<<"]"<<std::endl);
531 return bbGetStatus();
536 //=========================================================================
537 void WxBlackBox::bbProcess()
539 if (bbGetOutputWidget()==0) this->bbUserCreateWidget();
540 this->bbUserProcess();
542 // this->bbUserOnShow();
544 //=========================================================================
546 //==================================================================
547 /// Specific methods for window creation during pipeline execution
548 /// Shows the window associated to the box
549 /// (called after bbProcess during bbExecute)
550 void WxBlackBox::bbShowWindow()
552 bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbShowWindow() ["
553 <<bbGetFullName()<<"]"<<std::endl);
555 // If Event Handler for the widget does not exist or is obsolete : create it
556 if (bbGetOutputWidget()!=0)
558 if (bbGetWidgetEventHandler()==0)
560 bbtkDebugMessage("wx",3,
561 "-> No widget event handler : creating one"
563 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
564 bbGetOutputWidget());
566 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
567 ( bbGetOutputWidget() ) )
569 bbtkDebugMessage("wx",3,
570 "-> Obsolete widget event handler : re-creating one"
572 delete bbGetWidgetEventHandler();
573 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
574 bbGetOutputWidget());
576 // Sets the name of the wxWindow to the input WinTitle
577 bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
580 // If the output 'Widget' is connected then it's gonna
581 // be captured by its parent window : nothing to do
582 if ( (*bbGetOutputConnectorMap().find("Widget")).second
583 ->GetConnectionVector().size() != 0 )
586 bbtkDebugMessage("wx",2,
587 "-> Output 'Widget' connected : nothing to do"
594 // If the window already exists : no need creating it
595 if (bbGetWindow()!=0)
597 bbtkDebugMessage("wx",2,
598 "-> Window already exists"
600 show = bbGetWindow();
602 // Else if the widget exists : create window
603 else if (bbGetOutputWidget()!=0)
605 bbtkDebugMessage("wx",2,
606 "-> Widget exists : creating the window"
610 // Input WinDialog set to true : creating a Dialog
611 if (bbGetInputWinDialog())
613 bbtkDebugMessage("wx",2,
614 " Input WinDialog set to true : creating a Dialog"
616 show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
618 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
619 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
621 // Input WinDialog set to false : creating a Frame
624 bbtkDebugMessage("process",2,
625 " Input WinDialog set to false : creating a Frame"
627 show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
629 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
630 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
634 // No window nor widget : error
637 bbtkError("WxBlackBox::bbShowWindow() ["
639 <<"] : No widget. Did you set the box output 'Widget' in the processing method of the box ?");
644 if (true) //!show->IsShown())
650 bbtkDebugMessage("wx",2,"-> Already shown : nothing to do"<<std::endl);
654 bbtkDebugMessage("wx",1,"<= WxBlackBox::bbShowWindow() ["
655 <<bbGetFullName()<<"]"<<std::endl);
658 //==================================================================
663 //==================================================================
664 void WxBlackBox::bbHideWindow()
666 bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbHideWindow() ["
667 <<bbGetFullName()<<"]"<<std::endl);
669 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
671 bbtkDebugMessageDec("wx",1,"<= WxBlackBox::bbHideWindow() ["
672 <<bbGetFullName()<<"]"<<std::endl);
674 //==================================================================
677 //==================================================================
678 void WxBlackBox::bbCloseWindow()
680 bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbCloseWindow() ["
681 <<bbGetFullName()<<"]"<<std::endl);
683 if (bbGetWindow()!=0) bbGetWindow()->bbClose();
685 bbtkDebugMessageDec("wx",1,"<= WxBlackBox::bbCloseWindow() ["
686 <<bbGetFullName()<<"]"<<std::endl);
688 //==================================================================
690 //==================================================================
691 WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
693 if (bbGetWindow()!=0) return bbGetWindow();
694 BlackBox::OutputConnectorMapType::const_iterator i
695 = bbGetOutputConnectorMap().find("Widget");
696 if ( i->second->GetConnectionVector().size() != 0 )
698 return boost::static_pointer_cast<WxBlackBox>
699 (i->second->GetConnectionVector().front() //.lock()
700 ->GetBlackBoxTo())->bbGetContainingWindow();
704 //==================================================================
707 //==================================================================
708 wxWindow* WxBlackBox::bbGetWxParent() { return Wx::GetTopWindow(); }
709 //==================================================================
712 //==================================================================
713 bool WxBlackBox::bbIsShown()
715 if (bbGetContainingWindow()!=0)
716 return bbGetContainingWindow()->bbIsShown();
719 //==================================================================