X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkWxBlackBox.cxx;h=4ccfe67a2b8661f5416806620cb545ef5aad00fd;hb=911e9825791b3ed1777a80ffc1185970bd051193;hp=9e2507ac0e92d06249fe4588db37a368abb8837f;hpb=aeafe748c859675cf481bd9e5e5a5afa84a3fa52;p=bbtk.git diff --git a/kernel/src/bbtkWxBlackBox.cxx b/kernel/src/bbtkWxBlackBox.cxx index 9e2507a..4ccfe67 100644 --- a/kernel/src/bbtkWxBlackBox.cxx +++ b/kernel/src/bbtkWxBlackBox.cxx @@ -1,21 +1,34 @@ -/*========================================================================= - +/*========================================================================= Program: bbtk Module: $RCSfile: bbtkWxBlackBox.cxx,v $ Language: C++ - Date: $Date: 2008/01/28 14:32:54 $ - Version: $Revision: 1.3 $ - - Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de - l'Image). All rights reserved. See Doc/License.txt or - http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - + Date: $Date: 2008/12/08 12:54:27 $ + Version: $Revision: 1.33 $ =========================================================================*/ +/* --------------------------------------------------------------------- + +* 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_ @@ -26,6 +39,8 @@ */ #include "bbtkWxBlackBox.h" +#include "bbtkBlackBoxOutputConnector.h" + //#include "bbtkWxContainerBlackBox.h" #include @@ -38,59 +53,6 @@ namespace bbtk { - //========================================================================= - wxWindow* WxBlackBox::bbGlobalGetTopWindow() - { - return bbmgTopWindow; - } - //========================================================================= - - //========================================================================= - void WxBlackBox::bbGlobalSetTopWindow(wxWindow* w) - { - if ( bbmgTopWindow ) - { - bbtkGlobalError("WxBlackBox::bbGlobalSetTopWindow : top window already set !"); - } - bbmgTopWindow = w; - } - //========================================================================= - - - //========================================================================= - void WxBlackBox::bbGlobalDecNbWindowsAlive() - { - bbmgNbWindowsAlive--; - /* - if ( (bbmgNbWindowsAlive==0) && - bbmgTopWindow && (!bbmgTopWindow->IsShown())) - { - bbmgTopWindow->Close(); - } - */ - } - //========================================================================= - - //========================================================================= - void WxBlackBox::bbGlobalDecNbWindowsShown() - { - bbmgNbWindowsShown--; - if ( (bbmgNbWindowsShown==0) && - bbmgTopWindow && (!bbmgTopWindow->IsShown())) - { - bbmgTopWindow->Close(); - } - } - //========================================================================= - - //========================================================================= - // Static members - wxWindow* WxBlackBox::bbmgTopWindow =0; - int WxBlackBox::bbmgNbWindowsAlive = 0; - int WxBlackBox::bbmgNbWindowsShown = 0; - //========================================================================= - - @@ -101,43 +63,38 @@ namespace bbtk //========================================================================= - WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox* box) + WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox::Pointer box) : mBox(box), mShown(false) { - bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<< - mBox->bbGetFullName()<<")"<bbSetWindow(this); - WxBlackBox::bbGlobalIncNbWindowsAlive(); - bbtkDebugMessage("Wx",9," -> Number of windows alive = " - <bbGetFullName()<<")"<bbSetWindow(this); + Wx::IncNbWindowsAlive(); } //========================================================================= //========================================================================= WxBlackBoxWindow::~WxBlackBoxWindow() { - bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() ["<< - mBox->bbGetFullName()<<"]"<bbSetWindow(0); - WxBlackBox::bbGlobalDecNbWindowsAlive(); - bbtkDebugMessage("Wx",9," -> Number of windows alive = " - <bbSetWindow(0); + } } //========================================================================= + //========================================================================= void WxBlackBoxWindow::bbShow() { if (bbIsShown()) return; - bbtkDebugMessage("Wx",9,"WxBlackBoxWindow::bbShow() ["<< - mBox->bbGetFullName()<<"]"< Number of windows shown = " - <bbGetFullName()<<"]"< Number of windows shown = " - <bbGetFullName()<<","<bbCreateWidgetAndEventHandler(this); wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget(); - widget->Reparent(this); +// old : widget->Reparent(this); sizer->Add( widget, 1, wxALL|wxEXPAND, 2); //SetAutoLayout(true); SetSizer(sizer); @@ -197,23 +158,32 @@ namespace bbtk //========================================================================= void WxBlackBoxDialog::bbShow() { - bbtkDebugMessage("Wx",5,"WxBlackBoxDialog::bbShow() [" + if (bbIsShown()) return; + bbtkDebugMessage("wx",5,"WxBlackBoxDialog::bbShow() [" <bbGetFullName()<<"]"<bbGetFullName()<<"]"<bbGetFullName()<<","<bbCreateWidgetAndEventHandler(this); wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget(); wxFrame* frame = (wxFrame*)this; - widget->Reparent(frame); +// old : widget->Reparent(frame); sizer->Add( widget, 1, wxALL|wxGROW, 2); // frame->SetAutoLayout(true); frame->SetSizer(sizer); @@ -272,95 +244,43 @@ namespace bbtk //========================================================================= void WxBlackBoxFrame::bbShow() { - bbtkDebugMessage("Wx",5,"WxBlackBoxFrame::bbShow(" + if (bbIsShown()) return; + bbtkDebugMessage("wx",5,"WxBlackBoxFrame::bbShow(" <bbGetFullName()<<")"<bbGetFullName()<<"]"<bbGetFullName()<<","<bbGetFullName()<<")"<ShowModal(); - // For Windows : - mWrapped->SetReturnCode( i ); + wxFrame::Update(); + wxFrame::SetFocus(); + if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnShow(); } //========================================================================= //========================================================================= - void WxBlackBoxDialogWrapper::bbHide() + void WxBlackBoxFrame::bbHide() { - bbtkDebugMessage("Wx",9,"WxBlackBoxDialogWrapper::bbHide() ["<< - bbGetBlackBox()->bbGetFullName()<<"]"<Hide(); - } - //========================================================================= - - */ - - /* - //========================================================================= - // WxBlackBoxWidget - //========================================================================= - - //========================================================================= - WxBlackBoxWidget::WxBlackBoxWidget( WxBlackBox* box) - : mBox(box) - { - bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::WxBlackBoxWidget("<bbGetFullName()<<")"<bbSetWidget(this); + wxFrame::Hide(); + if (bbGetBlackBox()) bbGetBlackBox()->bbUserOnHide(); } //========================================================================= //========================================================================= - WxBlackBoxWidget::~WxBlackBoxWidget() + void WxBlackBoxFrame::bbClose() { - bbtkDebugMessage("Wx",9,"WxBlackBoxWidget::~WxBlackBoxWidget("<bbGetFullName()<<")"<bbSetWidget(0); - //bbtkDebugMessage("Wx",9,"EO WxBlackBoxWidget::~WxBlackBoxWidget("<bbGetFullName()<<")"<bbGetFullName()<<")"<bbGetFullName()<<")"<bbSetWidgetEventHandler(this); + mBox.lock()->bbSetWidgetEventHandler(this); Connect ( mWindow->GetId(), wxEVT_DESTROY, @@ -394,22 +314,23 @@ namespace bbtk //========================================================================= WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() { - bbtkDebugMessage("Wx",9, - "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler(" - <bbGetFullName()<<")"<bbSetWidgetEventHandler(0); + if (mBox.expired()) return; + bbtkDebugMessage("wx",9, + "WxBlackBoxWidgetEventHandler::~WxBlackBoxWidgetEventHandler() [" + <bbGetFullName()<<"]"<bbSetWidgetEventHandler(0); } //========================================================================= //========================================================================= void WxBlackBoxWidgetEventHandler::OnWindowDestroy(wxWindowDestroyEvent&) { - bbtkDebugMessage("Wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() [" - <bbGetFullName()<<"]"<bbSetOutputWidget(0); - mBox->bbSetModifiedStatus(); - //mDead = true; - //delete this; + if (mBox.expired()) return; + bbtkDebugMessage("wx",9,"WxBlackBoxWidgetEventHandler::OnWindowDestroy() [" + <bbGetFullName()<<"]"<bbSetOutputWidget(0); + // LGSIGNAL + // mBox.lock()->bbSetModifiedStatus(); } //========================================================================= @@ -419,46 +340,6 @@ namespace bbtk - /* - //========================================================================= - wxWindow* WxParentToChildData::GetWindowInWhichToInsert( const BlackBox* b) - const - { - bbtkDebugMessageInc("Core",9,"WxParentToChildData::GetWindowInWhichToInsert("<bbGetFullName()<<")"<bbGetInputConnectorMap().find("WinParent"); - if (i==b->bbGetInputConnectorMap().end()) - { - bbtkError("WxParentToChildData::GetWindowInWhichToInsert : the box " - <bbGetFullName() - <<" does not have any 'Parent' input ?!?"); - } - Connection* c = i->second->GetConnection(); - if (!c) - { - bbtkDebugMessage("Core",9, - "-> The input 'Parent' of the box " - <bbGetFullName() - <<" is not connected."<::const_iterator j - = mConnectionToWindowMap.find(c); - - if (j==mConnectionToWindowMap.end()) - { - bbtkError("WxParentToChildData::GetWindowInWhichToInsert(" - <bbGetFullName() - <<") no window provided by parent ?!?"); - } - - bbtkDebugDecTab("Core",9); - return j->second; - } - //========================================================================= - */ - //========================================================================= // WxBlackBox //========================================================================= @@ -467,21 +348,21 @@ namespace bbtk //========================================================================= //========================================================================= //========================================================================= - BBTK_USER_BLACK_BOX_IMPLEMENTATION(WxBlackBox,UserBlackBox); + BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox); //========================================================================= //========================================================================= void WxBlackBox::bbUserConstructor() { - bbtkDebugMessage("Core",9,"WxBlackBox::bbUserConstructor()"< WxBlackBox::bbUserDestructor() ["<IsDead()) { - bbtkDebugMessage("Wx",9,"WxBlackBox::bbGetWidget() ["<< + bbtkDebugMessage("wx",9,"WxBlackBox::bbGetWidget() ["<< bbGetFullName()<<"] : Widget is dead : deleting it" < WxBlackBox::bbExecute("<<(int)force<<") [" + <second->GetConnectionVector().size() != 0 ) + { + bbtkWarning("Execution called on '"<bbUserCreateWidget(); + this->bbUserProcess(); + bbShowWindow(); + // this->bbUserOnShow(); + */ + // LG 22/11/08 : new widget pipeline + // If output widget not connected : + 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" + <(), + // bbGetWxParent(), + // LG 24/11/08 : New widget pipeline + 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" + <(), + // bbGetWxParent(), + // LG 24/11/08 : New widget pipeline + Wx::GetTopWindow(), + std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"), + wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) ); + } + + } + + // Show the window + show->bbShow(); + + + } + this->bbUserProcess(); + + } + //========================================================================= + + + + // LG 24/11/08 : New widget pipeline + 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; + } + + /* //================================================================== /// Specific methods for window creation during pipeline execution /// Shows the window associated to the box /// (called after bbProcess during bbExecute) void WxBlackBox::bbShowWindow() { - bbtkDebugMessageInc("Process",1,"=> WxBlackBox::bbShowWindow() [" + bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbShowWindow() [" < No widget event handler : creating one" <(), + bbGetOutputWidget()); } else if ( ! bbGetWidgetEventHandler()->IsHandlerOf ( bbGetOutputWidget() ) ) { - bbtkDebugMessage("Process",3, + 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())); } // If the output 'Widget' is connected then it's gonna @@ -577,10 +624,9 @@ namespace bbtk ->GetConnectionVector().size() != 0 ) { - bbtkDebugMessage("Process",2, + bbtkDebugMessage("wx",2, "-> Output 'Widget' connected : nothing to do" < Window already exists" < Widget exists : creating the window" <(), + // bbGetWxParent(), + // LG 24/11/08 : New widget pipeline + Wx::GetTopWindow(), std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"), wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) ); } // Input WinDialog set to false : creating a Frame else { - bbtkDebugMessage("Process",2, + bbtkDebugMessage("process",2, " Input WinDialog set to false : creating a Frame" <(), + // bbGetWxParent(), + // LG 24/11/08 : New widget pipeline + Wx::GetTopWindow(), std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"), wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) ); } @@ -642,33 +692,77 @@ namespace bbtk } else { - bbtkDebugMessage("Process",2,"-> Already shown : nothing to do"< Already shown : nothing to do"< WxBlackBox::bbHideWindow() [" + bbtkDebugMessageInc("wx",1,"=> WxBlackBox::bbHideWindow() [" <bbHide(); - bbtkDebugMessageDec("Process",1,"<= WxBlackBox::bbHideWindow() [" + 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; + } + //================================================================== + + //================================================================== + // LG 24/11/08 : New widget pipeline + // wxWindow* WxBlackBox::bbGetWxParent() { return Wx::GetTopWindow(); } + //================================================================== + + + //================================================================== + bool WxBlackBox::bbIsShown() + { + if (bbGetContainingWindow()!=0) + return bbGetContainingWindow()->bbIsShown(); + return false; + } + //================================================================== }//namespace bbtk