1 /*=========================================================================
3 Module: $RCSfile: bbtkWxBlackBox.cxx,v $
5 Date: $Date: 2008/12/11 09:50:35 $
6 Version: $Revision: 1.35 $
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();
99 //=========================================================================
101 //=========================================================================
102 void WxBlackBoxWindow::bbHide()
104 if (!bbIsShown()) return;
105 bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbHide()"<<std::endl);
106 Wx::DecNbWindowsShown();
109 //=========================================================================
111 //=========================================================================
112 void WxBlackBoxWindow::bbClose()
115 //=========================================================================
118 //=========================================================================
120 //=========================================================================
122 //=========================================================================
123 WxBlackBoxDialog::WxBlackBoxDialog(WxBlackBox::Pointer box,
140 WxBlackBoxWindow(box)
142 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::WxBlackBoxDialog("<<
143 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
144 <<title<<",size)"<<std::endl);
145 // Insert the widget into the window
146 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
147 // LG 22/11/08 : new widget pipeline
148 bbGetBlackBox()->bbCreateWidgetAndEventHandler(this);
149 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
150 // old : widget->Reparent(this);
151 sizer->Add( widget, 1, wxALL|wxEXPAND, 2);
152 //SetAutoLayout(true);
156 //=========================================================================
158 //=========================================================================
159 void WxBlackBoxDialog::bbShow()
161 if (bbIsShown()) return;
162 bbtkDebugMessage("wx",5,"WxBlackBoxDialog::bbShow() ["
163 <<bbGetBlackBox()->bbGetFullName()<<"]"<<std::endl);
164 WxBlackBoxWindow::bbShow();
165 SetReturnCode( wxDialog::ShowModal() );
168 //=========================================================================
170 //=========================================================================
171 void WxBlackBoxDialog::bbHide()
173 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbHide()"<<std::endl);
174 WxBlackBoxWindow::bbHide();
177 //=========================================================================
179 //=========================================================================
180 void WxBlackBoxDialog::bbClose()
182 bbtkDebugMessage("wx",9,"WxBlackBoxDialog::bbClose()"<<std::endl);
185 //=========================================================================
187 //=========================================================================
188 WxBlackBoxDialog::~WxBlackBoxDialog()
191 //=========================================================================
197 //=========================================================================
199 //=========================================================================
201 //=========================================================================
202 WxBlackBoxFrame::WxBlackBoxFrame(WxBlackBox::Pointer box,
218 WxBlackBoxWindow(box)
220 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::WxBlackBoxFrame("<<
221 bbGetBlackBox()->bbGetFullName()<<","<<parent<<","
222 <<title<<",size)"<<std::endl);
223 // Insert the widget into the window
224 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
225 // LG 22/11/08 : new widget pipeline
226 bbGetBlackBox()->bbCreateWidgetAndEventHandler(this);
227 wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget();
228 wxFrame* frame = (wxFrame*)this;
229 // old : widget->Reparent(frame);
230 sizer->Add( widget, 1, wxALL|wxGROW, 2);
231 // frame->SetAutoLayout(true);
232 frame->SetSizer(sizer);
236 //=========================================================================
238 //=========================================================================
239 WxBlackBoxFrame::~WxBlackBoxFrame()
242 //=========================================================================
244 //=========================================================================
245 void WxBlackBoxFrame::bbShow()
247 if (bbIsShown()) return;
248 bbtkDebugMessage("wx",5,"WxBlackBoxFrame::bbShow("
249 <<bbGetBlackBox()->bbGetFullName()<<")"<<std::endl);
250 WxBlackBoxWindow::bbShow();
252 // This Update is ** MANDATORY **
253 // to synchronize wxvtkRenderWindowInteractor objects
254 // (force wx objects creation **NOW**)
263 if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnShow();
265 //=========================================================================
267 //=========================================================================
268 void WxBlackBoxFrame::bbHide()
270 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbHide()"<<std::endl);
271 WxBlackBoxWindow::bbHide();
273 if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnHide();
275 //=========================================================================
277 //=========================================================================
278 void WxBlackBoxFrame::bbClose()
280 bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbClose()"<<std::endl);
283 //=========================================================================
287 //=========================================================================
288 // WxBlackBoxWidgetEventHandler
289 //=========================================================================
291 //=========================================================================
292 WxBlackBoxWidgetEventHandler::
293 WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box,
299 bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::WxBlackBoxWidgetEventHandler("<<mBox.lock()->bbGetFullName()<<")"<<std::endl);
301 mBox.lock()->bbSetWidgetEventHandler(this);
303 Connect ( mWindow->GetId(),
305 (wxObjectEventFunction)
306 (void (wxEvtHandler::*)(wxWindowDestroyEvent& c))
307 &WxBlackBoxWidgetEventHandler::OnWindowDestroy );
309 mWindow->PushEventHandler(this);
312 //=========================================================================
314 //=========================================================================
315 WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler()
317 if (mBox.expired()) return;
318 bbtkDebugMessage("wx",9,
319 "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() ["
320 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
321 mBox.lock()->bbSetWidgetEventHandler(0);
323 //=========================================================================
325 //=========================================================================
326 void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&)
328 if (mBox.expired()) return;
329 bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() ["
330 <<mBox.lock()->bbGetFullName()<<"]"<<std::endl);
331 mBox.lock()->bbSetOutputWidget(0);
333 // mBox.lock()->bbSetModifiedStatus();
335 //=========================================================================
343 //=========================================================================
345 //=========================================================================
347 //=========================================================================
348 //=========================================================================
349 //=========================================================================
350 //=========================================================================
351 BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox);
352 //=========================================================================
354 //=========================================================================
355 void WxBlackBox::bbUserConstructor()
357 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"<<std::endl);
360 //=========================================================================
362 //=========================================================================
363 void WxBlackBox::bbUserCopyConstructor(bbtk::BlackBox::Pointer)
365 bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserCopyConstructor()"
369 //=========================================================================
372 //=========================================================================
373 void WxBlackBox::bbUserDestructor()
375 bbtkDebugMessage("wx",9,"==> WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
377 delete bbGetWindow();
380 bbtkDebugMessage("wx",9,"<== WxBlackBox::bbUserDestructor() ["<<bbGetFullName()<<"]"<<std::endl);
382 //=========================================================================
385 //=========================================================================
387 * \brief Initialize the attributes of the class
390 void WxBlackBox::bbInitAttributes()
394 // bbSetInputWinParent(0);
395 bbSetInputWinTitle(bbGetName());
396 bbSetInputWinWidth(800);
397 bbSetInputWinHeight(800);
398 bbSetInputWinDialog(false);
399 bbSetOutputWidget(0);
401 bbSetWidgetEventHandler(0);
402 // bbSetUpdateTransferedToParent(false);
404 //=========================================================================
406 //=========================================================================
407 void WxBlackBox::bbProcess()
409 // If output widget not connected : have to create and show the window
410 if ( (*bbGetOutputConnectorMap().find("Widget")).second
411 ->GetConnectionVector().size() == 0 )
414 // If the window already exists : no need creating it
415 if (bbGetWindow()!=0)
417 bbtkDebugMessage("wx",2,
418 "-> Window already exists"
420 show = bbGetWindow();
422 // Else create window
425 bbtkDebugMessage("wx",2,
426 "-> Creating the window"
429 // Input WinDialog set to true : creating a Dialog
430 if (bbGetInputWinDialog())
432 bbtkDebugMessage("wx",2,
433 " Input WinDialog set to true : creating a Dialog"
435 show = (Window*) new WxBlackBoxDialog( GetThisPointer<WxBlackBox>(),
437 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
438 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
440 // Input WinDialog set to false : creating a Frame
443 bbtkDebugMessage("process",2,
444 " Input WinDialog set to false : creating a Frame"
446 show = (Window*) new WxBlackBoxFrame( GetThisPointer<WxBlackBox>(),
448 std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"),
449 wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) );
459 this->bbUserProcess();
462 //=========================================================================
466 //=========================================================================
467 void WxBlackBox::bbCreateWidgetAndEventHandler(wxWindow* parent)
469 if (bbGetOutputWidget()==0)
471 this->bbUserCreateWidget(parent);
473 // If Event Handler for the widget does not exist or is obsolete : create it
474 if (bbGetOutputWidget()!=0)
476 if (bbGetWidgetEventHandler()==0)
478 bbtkDebugMessage("wx",3,
479 "-> No widget event handler : creating one"
481 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
482 bbGetOutputWidget());
484 else if ( ! bbGetWidgetEventHandler()->IsHandlerOf
485 ( bbGetOutputWidget() ) )
487 bbtkDebugMessage("wx",3,
488 "-> Obsolete widget event handler : re-creating one"
490 delete bbGetWidgetEventHandler();
491 new WxBlackBoxWidgetEventHandler(GetThisPointer<WxBlackBox>(),
492 bbGetOutputWidget());
494 // Sets the name of the wxWindow to the input WinTitle
495 bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle()));
500 //=========================================================================
503 //=========================================================================
504 wxWindow* WxBlackBox::bbCreateWidgetOfInput(const std::string& in,
508 // If input is connected
509 BlackBoxInputConnector* c = bbGetInputConnectorMap().find(in)->second ;
510 if ( c->IsConnected() )
512 // Get black box from
513 BlackBox::Pointer from =
514 c->GetConnection()->GetBlackBoxFrom();
515 // Cast it into a WxBlackBox
516 WxBlackBox::Pointer wfrom = boost::dynamic_pointer_cast<WxBlackBox>(from);
517 // Call bbCreateWidgetAndEventHandler
518 wfrom->bbCreateWidgetAndEventHandler(parent);
519 // Get the widget created
520 w = wfrom->bbGetOutputWidget();
524 //==================================================================
527 //==================================================================
528 void WxBlackBox::bbHideWindow()
530 bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbHideWindow() ["
531 <<bbGetFullName()<<"]"<<std::endl);
533 if (bbGetWindow()!=0) bbGetWindow()->bbHide();
535 bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbHideWindow() ["
536 <<bbGetFullName()<<"]"<<std::endl);
538 //==================================================================
541 //==================================================================
542 void WxBlackBox::bbCloseWindow()
544 bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbCloseWindow() ["
545 <<bbGetFullName()<<"]"<<std::endl);
547 if (bbGetWindow()!=0) bbGetWindow()->bbClose();
549 bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbCloseWindow() ["
550 <<bbGetFullName()<<"]"<<std::endl);
552 //==================================================================
554 //==================================================================
555 WxBlackBox::Window* WxBlackBox::bbGetContainingWindow()
557 if (bbGetWindow()!=0) return bbGetWindow();
558 BlackBox::OutputConnectorMapType::const_iterator i
559 = bbGetOutputConnectorMap().find("Widget");
560 if ( i->second->GetConnectionVector().size() != 0 )
562 return boost::static_pointer_cast<WxBlackBox>
563 (i->second->GetConnectionVector().front() //.lock()
564 ->GetBlackBoxTo())->bbGetContainingWindow();
568 //==================================================================
571 //==================================================================
572 bool WxBlackBox::bbIsShown()
574 if (bbGetContainingWindow()!=0)
575 return bbGetContainingWindow()->bbIsShown();
578 //==================================================================