/*========================================================================= Program: bbtk Module: $RCSfile: bbtkWxBlackBox.cxx,v $ Language: C++ Date: $Date: 2009/03/23 13:06:41 $ Version: $Revision: 1.37 $ =========================================================================*/ /* --------------------------------------------------------------------- * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale) * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux * * This software is governed by the CeCILL-B license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL-B * license as circulated by CEA, CNRS and INRIA at the following URL * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html * or in the file LICENSE.txt. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL-B license and that you accept its terms. * ------------------------------------------------------------------------ */ #ifdef _USE_WXWIDGETS_ /** * \file * \brief */ #include "bbtkWxBlackBox.h" #include "bbtkBlackBoxOutputConnector.h" //#include "bbtkWxContainerBlackBox.h" #include //#include "bbtkData.h" //#include "bbtkFactory.h" namespace bbtk { //========================================================================= // WxBlackBoxWindow //========================================================================= //========================================================================= WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox::Pointer box) : mBox(box), mShown(false) { bbtkDebugMessage("wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<< mBox.lock()->bbGetFullName()<<")"<bbSetWindow(this); Wx::IncNbWindowsAlive(); } //========================================================================= //========================================================================= WxBlackBoxWindow::~WxBlackBoxWindow() { bbtkDebugMessage("wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() " <bbSetWindow(0); } } //========================================================================= //========================================================================= void WxBlackBoxWindow::bbShow() { if (bbIsShown()) return; bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbShow()"<bbUserOnShow(); } //========================================================================= //========================================================================= void WxBlackBoxWindow::bbHide() { if (!bbIsShown()) return; bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbHide()"<bbGetFullName()<<","<bbCreateWidgetAndEventHandler(this); wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget(); // old : widget->Reparent(this); sizer->Add( widget, 1, wxALL|wxEXPAND, 2); //SetAutoLayout(true); SetSizer(sizer); Layout(); } //========================================================================= //========================================================================= void WxBlackBoxDialog::bbShow() { if (bbIsShown()) return; bbtkDebugMessage("wx",5,"WxBlackBoxDialog::bbShow() [" <bbGetFullName()<<"]"<bbGetFullName()<<","<bbCreateWidgetAndEventHandler(this); wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget(); wxFrame* frame = (wxFrame*)this; // old : widget->Reparent(frame); sizer->Add( widget, 1, wxALL|wxGROW, 2); // frame->SetAutoLayout(true); frame->SetSizer(sizer); //frame->Fit(); frame->Layout(); } //========================================================================= //========================================================================= WxBlackBoxFrame::~WxBlackBoxFrame() { } //========================================================================= //========================================================================= void WxBlackBoxFrame::bbShow() { if (bbIsShown()) return; bbtkDebugMessage("wx",5,"WxBlackBoxFrame::bbShow(" <bbGetFullName()<<")"<bbUserOnShow(); } //========================================================================= //========================================================================= void WxBlackBoxFrame::bbHide() { bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbHide()"<bbUserOnHide(); } //========================================================================= //========================================================================= void WxBlackBoxFrame::bbClose() { bbtkDebugMessage("wx",9,"WxBlackBoxFrame::bbClose()"<bbGetFullName()<<")"<bbSetWidgetEventHandler(this); Connect ( mWindow->GetId(), wxEVT_DESTROY, (wxObjectEventFunction) (void (wxEvtHandler::*)(wxWindowDestroyEvent& c)) &WxBlackBoxWidgetEventHandler::OnWindowDestroy ); mWindow->PushEventHandler(this); } //========================================================================= //========================================================================= WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() { if (mBox.expired()) return; bbtkDebugMessage("wx",9, "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() [" <bbGetFullName()<<"]"<bbSetWidgetEventHandler(0); } //========================================================================= //========================================================================= void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&) { if (mBox.expired()) return; bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() [" <bbGetFullName()<<"]"<bbSetOutputWidget(0); // LGSIGNAL // mBox.lock()->bbSetModifiedStatus(); } //========================================================================= //========================================================================= // WxBlackBox //========================================================================= //========================================================================= //========================================================================= //========================================================================= //========================================================================= BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox); //========================================================================= //========================================================================= void WxBlackBox::bbUserConstructor() { bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"< WxBlackBox::bbUserDestructor() ["<GetConnectionVector().size() == 0 ) { Window* show = 0; // If the window already exists : no need creating it if (bbGetWindow()!=0) { bbtkDebugMessage("wx",2, "-> Window already exists" < Creating the window" <(), Wx::GetTopWindow(), std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"), wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() )); //bbGetInputWinWidth() , bbGetInputWinHeight() ) ); // show->bbGetDialog()->Update(); // show->bbGetDialog()->Refresh(); //show->bbGetDialog()->Iconize(true); show->bbGetDialog()->Show(true); // show->bbGetDialog()->Show(false); // show->bbGetDialog()->SetSize(wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() )); } // Input WinDialog set to false : creating a Frame else { bbtkDebugMessage("process",2, " Input WinDialog set to false : creating a Frame" <(), Wx::GetTopWindow(), std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"), wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) ); // show->bbGetFrame()->Update(); // show->bbGetFrame()->Refresh(); show->bbGetFrame()->Show(); } } // else bbGetWindow // show->bbShow(); } // bbGetOutputConnectorMap().find("Widget")).second->GetConnectionVector().size() } //========================================================================= //========================================================================= void WxBlackBox::bbShowWidget() { // Show the window Window *show = bbGetWindow(); if (show!=NULL) { show->bbShow(); } } //========================================================================= //========================================================================= void WxBlackBox::bbProcess() { // TODO : update the window size and title this->bbUserProcess(); } //========================================================================= /* EED BORRAME original 18 mars 2009 //========================================================================= void WxBlackBox::bbProcess() { // If output widget not connected : have to create and show the window if ( (*bbGetOutputConnectorMap().find("Widget")).second->GetConnectionVector().size() == 0 ) { Window* show = 0; // If the window already exists : no need creating it if (bbGetWindow()!=0) { bbtkDebugMessage("wx",2, "-> Window already exists" < Creating the window" <(), Wx::GetTopWindow(), std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"), wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) ); } // Input WinDialog set to false : creating a Frame else { bbtkDebugMessage("process",2, " Input WinDialog set to false : creating a Frame" <(), Wx::GetTopWindow(), std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"), wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) ); } } // Show the window show->bbShow(); } this->bbUserProcess(); } //========================================================================= */ //========================================================================= void WxBlackBox::bbCreateWidgetAndEventHandler(wxWindow* parent) { if (bbGetOutputWidget()==0) { this->bbUserCreateWidget(parent); } // If Event Handler for the widget does not exist or is obsolete : create it if (bbGetOutputWidget()!=0) { if (bbGetWidgetEventHandler()==0) { bbtkDebugMessage("wx",3, "-> No widget event handler : creating one" <(), bbGetOutputWidget()); } else if ( ! bbGetWidgetEventHandler()->IsHandlerOf ( bbGetOutputWidget() ) ) { bbtkDebugMessage("wx",3, "-> Obsolete widget event handler : re-creating one" <(), bbGetOutputWidget()); } // Sets the name of the wxWindow to the input WinTitle bbGetOutputWidget()->SetName(bbtk::std2wx(bbGetInputWinTitle())); } } //========================================================================= //========================================================================= wxWindow* WxBlackBox::bbCreateWidgetOfInput(const std::string& in, wxWindow* parent) { wxWindow* w = 0; // If input is connected BlackBoxInputConnector* c = bbGetInputConnectorMap().find(in)->second ; if ( c->IsConnected() ) { // Get black box from BlackBox::Pointer from = c->GetConnection()->GetBlackBoxFrom(); // Cast it into a WxBlackBox WxBlackBox::Pointer wfrom = boost::dynamic_pointer_cast(from); // Call bbCreateWidgetAndEventHandler wfrom->bbCreateWidgetAndEventHandler(parent); // Get the widget created w = wfrom->bbGetOutputWidget(); } return w; } //================================================================== //================================================================== void WxBlackBox::bbHideWindow() { bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbHideWindow() [" <bbHide(); bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbHideWindow() [" < WxBlackBox::bbCloseWindow() [" <bbClose(); bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbCloseWindow() [" <second->GetConnectionVector().size() != 0 ) { return boost::static_pointer_cast (i->second->GetConnectionVector().front() //.lock() ->GetBlackBoxTo())->bbGetContainingWindow(); } return 0; } //================================================================== //================================================================== bool WxBlackBox::bbIsShown() { if (bbGetContainingWindow()!=0) return bbGetContainingWindow()->bbIsShown(); return false; } //================================================================== }//namespace bbtk #endif