1 /*=========================================================================
3 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
5 Date: $Date: 2009/03/23 13:06:41 $
6 Version: $Revision: 1.37 $
7 =========================================================================*/
9 /* ---------------------------------------------------------------------
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
14 * This software is governed by the CeCILL-B license under French law and
15 * abiding by the rules of distribution of free software. You can use,
16 * modify and/ or redistribute the software under the terms of the CeCILL-B
17 * license as circulated by CEA, CNRS and INRIA at the following URL
18 * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
19 * or in the file LICENSE.txt.
21 * As a counterpart to the access to the source code and rights to copy,
22 * modify and redistribute granted by the license, users are provided only
23 * with a limited warranty and the software's author, the holder of the
24 * economic rights, and the successive licensors have only limited
27 * The fact that you are presently reading this means that you have had
28 * knowledge of the CeCILL-B license and that you accept its terms.
29 * ------------------------------------------------------------------------ */
32 #ifdef _USE_WXWIDGETS_
41 #include "bbtkWxBlackBox.h"
42 #include "bbtkBlackBoxOutputConnector.h"
44 //#include "bbtkWxContainerBlackBox.h"
45 #include <wx/dialog.h>
47 //#include "bbtkData.h"
48 //#include "bbtkFactory.h"
59 //=========================================================================
61 //=========================================================================
65 //=========================================================================
66 WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox::Pointer box)
67 : mBox(box), mShown(false)
69 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<<
70 mBox.lock()->bbGetFullName()<<")"<<std::endl);
71 mBox.lock()->bbSetWindow(this);
72 Wx::IncNbWindowsAlive();
74 //=========================================================================
76 //=========================================================================
77 WxBlackBoxWindow::~WxBlackBoxWindow()
79 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() "
82 Wx::DecNbWindowsAlive();
85 mBox.lock()->bbSetWindow(0);
88 //=========================================================================
91 //=========================================================================
92 void WxBlackBoxWindow::bbShow()
94 if (bbIsShown()) return;
95 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbShow()"<<std::endl);
96 Wx::IncNbWindowsShown();
98 if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnShow();
100 //=========================================================================
102 //=========================================================================
103 void WxBlackBoxWindow::bbHide()
105 if (!bbIsShown()) return;
106 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbHide()"<<std::endl);
107 Wx::DecNbWindowsShown();
110 //=========================================================================
112 //=========================================================================
113 void WxBlackBoxWindow::bbClose()
116 //=========================================================================
119 //=========================================================================
121 //=========================================================================
123 //=========================================================================
124 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox::Pointer box,
141 WxBlackBoxWindow(box)
143 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
144 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
145 <<title<<",size)"<<std::endl);
146 // Insert the widget into the window
147 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
148 // LG 22/11/08 : new widget pipeline
149 bbGetBlackBox()->bbCreateWidgetAndEventHandler(this);
150 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
151 // old : widget->Reparent(this);
152 sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
153 //SetAutoLayout(true);
157 //=========================================================================
159 //=========================================================================
160 void WxBlackBoxDialog::bbShow()
162 if (bbIsShown()) return;
163 bbtkDebugMessage("wx",5,"WxBlackBoxDialog::bbShow() ["
164 <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
165 WxBlackBoxWindow::bbShow();
167 SetReturnCode( wxDialog::ShowModal() );
170 //=========================================================================
172 //=========================================================================
173 void WxBlackBoxDialog::bbHide()
175 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbHide()"<<std::endl);
176 WxBlackBoxWindow::bbHide();
179 //=========================================================================
181 //=========================================================================
182 void WxBlackBoxDialog::bbClose()
184 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbClose()"<<std::endl);
187 //=========================================================================
189 //=========================================================================
190 WxBlackBoxDialog::~WxBlackBoxDialog()
193 //=========================================================================
199 //=========================================================================
201 //=========================================================================
203 //=========================================================================
204 WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox::Pointer box,
220 WxBlackBoxWindow(box)
222 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
223 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
224 <<title<<",size)"<<std::endl);
225 // Insert the widget into the window
226 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
227 // LG 22/11/08 : new widget pipeline
228 bbGetBlackBox()->bbCreateWidgetAndEventHandler(this);
229 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
230 wxFrame* frame = (wxFrame*)this;
231 // old : widget->Reparent(frame);
232 sizer->Add( widget, 1, wxALL|wxGROW, 2);
233 // frame->SetAutoLayout(true);
234 frame->SetSizer(sizer);
238 //=========================================================================
240 //=========================================================================
241 WxBlackBoxFrame::~WxBlackBoxFrame()
244 //=========================================================================
246 //=========================================================================
247 void WxBlackBoxFrame::bbShow()
249 if (bbIsShown()) return;
250 bbtkDebugMessage("wx",5,"WxBlackBoxFrame::bbShow("
251 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
252 WxBlackBoxWindow::bbShow();
254 // This Update is ** MANDATORY **
255 // to synchronize wxvtkRenderWindowInteractor objects
256 // (force wx objects creation **NOW**)
265 // if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnShow();
267 //=========================================================================
269 //=========================================================================
270 void WxBlackBoxFrame::bbHide()
272 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbHide()"<<std::endl);
273 WxBlackBoxWindow::bbHide();
275 if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnHide();
277 //=========================================================================
279 //=========================================================================
280 void WxBlackBoxFrame::bbClose()
282 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbClose()"<<std::endl);
285 //=========================================================================
289 //=========================================================================
290 // WxBlackBoxWidgetEventHandler
291 //=========================================================================
293 //=========================================================================
294 WxBlackBoxWidgetEventHandler::
295 WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box,
301 bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox.lock()->bbGetFullName()<<")"<<std::endl);
303 mBox.lock()->bbSetWidgetEventHandler(this);
305 Connect ( mWindow->GetId(),
307 (wxObjectEventFunction)
308 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
309 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
311 mWindow->PushEventHandler(this);
314 //=========================================================================
316 //=========================================================================
317 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
319 if (mBox.expired()) return;
320 bbtkDebugMessage("wx",9,
321 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() ["
322 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
323 mBox.lock()->bbSetWidgetEventHandler(0);
325 //=========================================================================
327 //=========================================================================
328 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
330 if (mBox.expired()) return;
331 bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
332 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
333 mBox.lock()->bbSetOutputWidget(0);
335 // mBox.lock()->bbSetModifiedStatus();
337 //=========================================================================
345 //=========================================================================
347 //=========================================================================
349 //=========================================================================
350 //=========================================================================
351 //=========================================================================
352 //=========================================================================
353 BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
354 //=========================================================================
356 //=========================================================================
357 void WxBlackBox::bbUserConstructor()
359 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
362 //=========================================================================
364 //=========================================================================
365 void WxBlackBox::bbUserCopyConstructor(bbtk::BlackBox::Pointer)
367 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
371 //=========================================================================
374 //=========================================================================
375 void WxBlackBox::bbUserDestructor()
377 bbtkDebugMessage("wx",9,"==> WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
379 delete bbGetWindow();
382 bbtkDebugMessage("wx",9,"<== WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
384 //=========================================================================
387 //=========================================================================
389 * \brief Initialize the attributes of the class
392 void WxBlackBox::bbInitAttributes()
396 // bbSetInputWinParent(0);
397 bbSetInputWinTitle(bbGetName());
398 bbSetInputWinWidth(800);
399 bbSetInputWinHeight(800);
400 bbSetInputWinDialog(false);
401 bbSetOutputWidget(0);
403 bbSetWidgetEventHandler(0);
404 // bbSetUpdateTransferedToParent(false);
406 //=========================================================================
409 //=========================================================================
410 void WxBlackBox::bbCreateWidget()
412 // If output widget not connected : have to create and show the window
413 if ( (*bbGetOutputConnectorMap().find("Widget")).second->GetConnectionVector().size() == 0 )
416 // If the window already exists : no need creating it
417 if (bbGetWindow()!=0)
419 bbtkDebugMessage("wx",2,
420 "-> Window already exists"
422 show = bbGetWindow();
424 // Else create window
427 bbtkDebugMessage("wx",2,
428 "-> Creating the window"
431 // Input WinDialog set to true : creating a Dialog
432 if (bbGetInputWinDialog())
434 bbtkDebugMessage("wx",2,
435 " Input WinDialog set to true : creating a Dialog"
437 show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
439 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
440 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ));
441 //bbGetInputWinWidth() , bbGetInputWinHeight() ) );
442 // show->bbGetDialog()->Update();
443 // show->bbGetDialog()->Refresh();
445 //show->bbGetDialog()->Iconize(true);
446 show->bbGetDialog()->Show(true);
447 // show->bbGetDialog()->Show(false);
448 // show->bbGetDialog()->SetSize(wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ));
451 // Input WinDialog set to false : creating a Frame
454 bbtkDebugMessage("process",2,
455 " Input WinDialog set to false : creating a Frame"
457 show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
459 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
460 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
461 // show->bbGetFrame()->Update();
462 // show->bbGetFrame()->Refresh();
463 show->bbGetFrame()->Show();
466 } // else bbGetWindow
469 } // bbGetOutputConnectorMap().find("Widget")).second->GetConnectionVector().size()
471 //=========================================================================
474 //=========================================================================
475 void WxBlackBox::bbShowWidget()
478 Window *show = bbGetWindow();
484 //=========================================================================
487 //=========================================================================
488 void WxBlackBox::bbProcess()
490 // TODO : update the window size and title
491 this->bbUserProcess();
493 //=========================================================================
495 /* EED BORRAME original 18 mars 2009
496 //=========================================================================
497 void WxBlackBox::bbProcess()
499 // If output widget not connected : have to create and show the window
500 if ( (*bbGetOutputConnectorMap().find("Widget")).second->GetConnectionVector().size() == 0 )
503 // If the window already exists : no need creating it
504 if (bbGetWindow()!=0)
506 bbtkDebugMessage("wx",2,
507 "-> Window already exists"
509 show = bbGetWindow();
511 // Else create window
514 bbtkDebugMessage("wx",2,
515 "-> Creating the window"
518 // Input WinDialog set to true : creating a Dialog
519 if (bbGetInputWinDialog())
521 bbtkDebugMessage("wx",2,
522 " Input WinDialog set to true : creating a Dialog"
524 show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
526 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
527 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
529 // Input WinDialog set to false : creating a Frame
532 bbtkDebugMessage("process",2,
533 " Input WinDialog set to false : creating a Frame"
535 show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
537 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
538 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
548 this->bbUserProcess();
551 //=========================================================================
555 //=========================================================================
556 void WxBlackBox::bbCreateWidgetAndEventHandler(wxWindow* parent)
558 if (bbGetOutputWidget()==0)
560 this->bbUserCreateWidget(parent);
562 // If Event Handler for the widget does not exist or is obsolete : create it
563 if (bbGetOutputWidget()!=0)
565 if (bbGetWidgetEventHandler()==0)
567 bbtkDebugMessage("wx",3,
568 "-> No widget event handler : creating one"
570 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
571 bbGetOutputWidget());
573 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
574 ( bbGetOutputWidget() ) )
576 bbtkDebugMessage("wx",3,
577 "-> Obsolete widget event handler : re-creating one"
579 delete bbGetWidgetEventHandler();
580 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
581 bbGetOutputWidget());
583 // Sets the name of the wxWindow to the input WinTitle
584 bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
589 //=========================================================================
592 //=========================================================================
593 wxWindow* WxBlackBox::bbCreateWidgetOfInput(const std::string& in,
597 // If input is connected
598 BlackBoxInputConnector* c = bbGetInputConnectorMap().find(in)->second ;
599 if ( c->IsConnected() )
601 // Get black box from
602 BlackBox::Pointer from =
603 c->GetConnection()->GetBlackBoxFrom();
604 // Cast it into a WxBlackBox
605 WxBlackBox::Pointer wfrom = boost::dynamic_pointer_cast<WxBlackBox>(from);
606 // Call bbCreateWidgetAndEventHandler
607 wfrom->bbCreateWidgetAndEventHandler(parent);
608 // Get the widget created
609 w = wfrom->bbGetOutputWidget();
613 //==================================================================
616 //==================================================================
617 void WxBlackBox::bbHideWindow()
619 bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbHideWindow() ["
620 <<bbGetFullName()<<"]"<<std::endl);
622 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
624 bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbHideWindow() ["
625 <<bbGetFullName()<<"]"<<std::endl);
627 //==================================================================
630 //==================================================================
631 void WxBlackBox::bbCloseWindow()
633 bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbCloseWindow() ["
634 <<bbGetFullName()<<"]"<<std::endl);
636 if (bbGetWindow()!=0) bbGetWindow()->bbClose();
638 bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbCloseWindow() ["
639 <<bbGetFullName()<<"]"<<std::endl);
641 //==================================================================
643 //==================================================================
644 WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
646 if (bbGetWindow()!=0) return bbGetWindow();
647 BlackBox::OutputConnectorMapType::const_iterator i
648 = bbGetOutputConnectorMap().find("Widget");
649 if ( i->second->GetConnectionVector().size() != 0 )
651 return boost::static_pointer_cast<WxBlackBox>
652 (i->second->GetConnectionVector().front() //.lock()
653 ->GetBlackBoxTo())->bbGetContainingWindow();
657 //==================================================================
660 //==================================================================
661 bool WxBlackBox::bbIsShown()
663 if (bbGetContainingWindow()!=0)
664 return bbGetContainingWindow()->bbIsShown();
667 //==================================================================