X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkWxBlackBox.cxx;h=08c58c97554c34a08cd8bd92af7c73f8967a8026;hb=d2e9b6b072310e5fd087c6f412eb2f148c4d0638;hp=e99469cad07d2576e08d2906ed2a2947b86512e3;hpb=0391cd0cbb90e513fdc877a6eed61534b28f70ff;p=bbtk.git diff --git a/kernel/src/bbtkWxBlackBox.cxx b/kernel/src/bbtkWxBlackBox.cxx index e99469c..08c58c9 100644 --- a/kernel/src/bbtkWxBlackBox.cxx +++ b/kernel/src/bbtkWxBlackBox.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkWxBlackBox.cxx,v $ Language: C++ - Date: $Date: 2008/12/03 09:38:02 $ - Version: $Revision: 1.32 $ + Date: $Date: 2009/05/28 14:22:11 $ + Version: $Revision: 1.42 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -39,6 +39,8 @@ */ #include "bbtkWxBlackBox.h" +#include "bbtkBlackBoxOutputConnector.h" + //#include "bbtkWxContainerBlackBox.h" #include @@ -53,75 +55,135 @@ namespace bbtk + //========================================================================= - // WxBlackBoxWindow + // WxFrame //========================================================================= + //================================================================== + class WxFrame : public wxFrame + { + public: + WxFrame(WxBlackBox::Pointer b, + wxWindow *parent, + wxString title, + wxSize size); + ~WxFrame(); + void OnCloseWindow(wxCloseEvent& event); - //========================================================================= - WxBlackBoxWindow::WxBlackBoxWindow(WxBlackBox::Pointer box) - : mBox(box), mShown(false) - { - bbtkDebugMessage("wx",9,"WxBlackBoxWindow::WxBlackBoxWindow("<< - mBox.lock()->bbGetFullName()<<")"<bbSetWindow(this); + WxBlackBox::WeakPointer mBox; + DECLARE_EVENT_TABLE(); + + }; + + BEGIN_EVENT_TABLE(WxFrame, wxFrame) + // EVT_CLOSE(WxFrame::OnCloseWindow) + END_EVENT_TABLE(); + //================================================================== + + //================================================================== + WxFrame::WxFrame(WxBlackBox::Pointer b, + wxWindow *parent, + wxString title, + wxSize size) + : + wxFrame( parent, + -1, + title, + wxDefaultPosition, + size, + wxRESIZE_BORDER | + wxSYSTEM_MENU | + wxCLOSE_BOX | + wxMAXIMIZE_BOX | + wxMINIMIZE_BOX | + wxCAPTION + ), + mBox(b) + { + bbtkDebugMessage("widget",9,"["<bbGetName()<<"] WxFrame()" + <bbSetWindow(this); + // Insert the widget into the window + wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); + b->bbUserCreateWidget(this); + wxWindow* widget = b->bbGetOutputWidget(); + sizer->Add( widget, 1, wxALL|wxGROW, 2); + SetSizer(sizer); + Layout(); } - //========================================================================= + //================================================================== + //================================================================== + WxFrame::~WxFrame() + { + if (mBox.lock()) + bbtkDebugMessage("widget",9,"["<bbGetName() + <<"] $$$$$$$$$$$$$$$$$$$ ~WxFrame()" + <bbSetWindow(0); + Wx::DecNbWindowsAlive(); + } + //================================================================== + //================================================================== + void WxFrame::OnCloseWindow(wxCloseEvent& event) + { + if (mBox.lock()) + bbtkDebugMessage("widget",9,"["<bbGetName() + <<"] $$$$$$$$$$$$$$$ WxFrame::OnCloseWindow()"<bbSetWindow(0); + Wx::DecNbWindowsAlive(); + + bbtkDebugMessage("widget",9, + "$$$$$$$$$$$$$$$ Destroy !!!"<Destroy(); + } + //================================================================== + - //========================================================================= - WxBlackBoxWindow::~WxBlackBoxWindow() - { - bbtkDebugMessage("wx",9,"WxBlackBoxWindow::~WxBlackBoxWindow() " - <bbSetWindow(0); - } - } - //========================================================================= - //========================================================================= - void WxBlackBoxWindow::bbShow() - { - if (bbIsShown()) return; - bbtkDebugMessage("wx",9,"WxBlackBoxWindow::bbShow()"<bbGetFullName()<<","<bbGetName()<<"]" + <bbSetWindow(this); // Insert the widget into the window wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); - // LG 22/11/08 : new widget pipeline - bbGetBlackBox()->bbCreateWidgetAndEventHandler(this); - wxWindow* widget = bbGetBlackBox()->bbGetOutputWidget(); -// old : widget->Reparent(this); - sizer->Add( widget, 1, wxALL|wxEXPAND, 2); - //SetAutoLayout(true); + b->bbUserCreateWidget(this); + wxWindow* widget = b->bbGetOutputWidget(); + sizer->Add( widget, 1, wxALL|wxGROW, 2); 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); - mBox.lock()->bbSetModifiedStatus(); - } - //========================================================================= + //================================================================== + WxDialog::~WxDialog() + { + bbtkDebugMessage("widget",9,"WxDialog::~WxDialog()"<bbSetWindow(0); + // Wx::DecNbWindowsAlive(); + } + //================================================================== + //================================================================== + void WxDialog::OnCloseWindow(wxCloseEvent& event) + { + bbtkDebugMessage("widget",9,"WxDialog::OnCloseWindow()"<bbSetWindow(0); + Wx::DecNbWindowsAlive(); + this->Destroy(); + } + //================================================================== @@ -337,7 +237,7 @@ namespace bbtk - //========================================================================= + //========================================================================= // WxBlackBox //========================================================================= @@ -345,535 +245,125 @@ namespace bbtk //========================================================================= //========================================================================= //========================================================================= - BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,AtomicBlackBox); + BBTK_BLACK_BOX_IMPLEMENTATION(WxBlackBox,WidgetBlackBox); //========================================================================= //========================================================================= - void WxBlackBox::bbUserConstructor() + void WxBlackBox::bbUserSetDefaultValues() { - bbtkDebugMessage("Kernel",9,"WxBlackBox::bbUserConstructor()"< WxBlackBox::bbUserDestructor() ["<IsDead()) - { - bbtkDebugMessage("wx",9,"WxBlackBox::bbGetWidget() ["<< - bbGetFullName()<<"] : Widget is dead : deleting it" - < WxBlackBox::bbUserFinalizeProcessing()"< WxBlackBox::bbCreateDialogWindow() - parent = " + <(), + Wx::GetTopWindow(), + std2wx( bbGetInputWinTitle() + + " - bbtk (c) CREATIS-LRMN"), + wxSize( bbGetInputWinWidth() , + bbGetInputWinHeight() ) ); + w->Show(false); + // w->ShowModal(); + } + //========================================================================= + + //================================================================== + + //================================================================== + /// Callback for creating a Frame window + void WxBlackBox::bbCreateFrameWindow() { - /* - bbtkDebugMessageInc("process",2, - "=> WxBlackBox::bbExecute("<<(int)force<<") [" - <second->GetConnectionVector().size() != 0 ) - { - bbtkDebugMessage("process",3, - "-> Output 'Widget' connected : transfering execution to parent" - <second->GetConnectionVector().front() //.lock() - ->GetBlackBoxTo()->bbExecute(force); - - } - */ - /* - if (false) - { - } - // else call 'standard' BlackBox execution method - else - { - */ - return AtomicBlackBox::bbExecute(force); - /* - } - // - - bbtkDebugMessageDec("process",2, - "<= WxBlackBox::bbExecute() [" - < WxBlackBox::bbCreateFrameWindow() - parent = " + <(), + Wx::GetTopWindow(), + std2wx( bbGetInputWinTitle() + + " - bbtk (c) CREATIS-LRMN"), + wxSize( bbGetInputWinWidth() , + bbGetInputWinHeight() ) ); + w->Show(); + } + //================================================================== + + //================================================================== + void WxBlackBox::bbSetWindow(wxWindow* w) { - bbtkDebugMessage("process",3, - "=> WxBlackBox::bbBackwardUpdate(" - <<(caller?caller->GetFullName():"0")<<") [" - <GetFullName():"0")<<") [" - <second->GetConnectionVector().size() != 0 ) - - { - BlackBox::Pointer to = - i->second->GetConnectionVector()[0]->GetBlackBoxTo(); - - if (caller) - { - bbtkDebugMessage("process",3, - "-> Output 'Widget' connected to '" - <bbGetFullName()<<"' - caller->to = '" - <GetBlackBoxTo()->bbGetFullName() - <<"'" - < Output 'Widget' connected to '" - <bbGetFullName()<<"'" - <GetBlackBoxTo() != to)&& - (!bbGetUpdateTransferedToParent())&& - (!to->bbGetExecuting()) - ) - ) - { - bbtkDebugMessage("process",3, - " ... Transfering update order to parent" - <second->GetConnectionVector().front() //.lock() - ->GetBlackBoxTo()->bbExecute(false); - } - else - { - bbSetUpdateTransferedToParent(false); - bbtkDebugMessage("process",3, - " ... No need to transfer to parent" - <GetBlackBoxFromOutput()!="Widget")) - ) - { - } - */ - // call 'standard' BlackBox execution method - if (!bbGetUpdateTransferedToParent()) + bbtkBlackBoxDebugMessage("widget",9,"==> WxBlackBox::bbSetWindow("<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("wx",1,"=> WxBlackBox::bbShowWindow() [" - < 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())); - } - - // If the output 'Widget' is connected then it's gonna - // be captured by its parent window : nothing to do - if ( (*bbGetOutputConnectorMap().find("Widget")).second - ->GetConnectionVector().size() != 0 ) - { - - bbtkDebugMessage("wx",2, - "-> Output 'Widget' connected : nothing to do" - < Window already exists" - < Widget exists : creating the window" + bbtkBlackBoxDebugMessage("widget",3,"==> WxBlackBox::bbShowWindow()" <(), - // bbGetWxParent(), - // LG 24/11/08 : New widget pipeline - Wx::GetTopWindow(), - std2wx( bbGetInputWinTitle() + " - bbtk (c) CREATIS LRMN"), - wxSize( bbGetInputWinWidth() , bbGetInputWinHeight() ) ); + ((WxDialog*)bbmWindow)->ShowModal(); } - // Input WinDialog set to false : creating a Frame - else + 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() ) ); - } - - } - // No window nor widget : error - else - { - bbtkError("WxBlackBox::bbShowWindow() [" - <IsShown()) - { - show->bbShow(); - } - else - { - bbtkDebugMessage("wx",2,"-> Already shown : nothing to do"< WxBlackBox::bbHideWindow() [" - <bbHide(); - - bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbHideWindow() [" - < WxBlackBox::bbCloseWindow() [" - <bbClose(); - - bbtkDebugMessageDec("wx",2,"<= WxBlackBox::bbCloseWindow() [" - <Show(); + bbSetShown(true); + } + } } - //================================================================== + //================================================================== - //================================================================== - WxBlackBox::Window* WxBlackBox::bbGetContainingWindow() + //================================================================== + void WxBlackBox::bbDestroyWindow() { - if (bbGetWindow()!=0) return bbGetWindow(); - BlackBox::OutputConnectorMapType::const_iterator i - = bbGetOutputConnectorMap().find("Widget"); - if ( i->second->GetConnectionVector().size() != 0 ) + bbtkBlackBoxDebugMessage("widget",3,"==> WxBlackBox::bbDestroyWindow("< - (i->second->GetConnectionVector().front() //.lock() - ->GetBlackBoxTo())->bbGetContainingWindow(); + // wxWindow* w = bbGetWindow(); + //bbSetWindow(0); + // WE SHOULD DESTROY THE WINDOW WITH THE Close METHOD + // HOWEVER I + //w->Close(true); + // + delete bbGetWindow(); + bbSetShown(false); } - return 0; - } - //================================================================== - + bbtkBlackBoxDebugMessage("widget",3,"<== WxBlackBox::bbDestroyWindow("<bbIsShown(); - return false; } - //================================================================== + //================================================================== + }//namespace bbtk