/*========================================================================= Program: bbtk Module: $RCSfile: bbtkWxBlackBox.h,v $ Language: C++ Date: $Date: 2008/01/22 15:02:00 $ Version: $Revision: 1.1.1.1 $ 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. =========================================================================*//** * \brief Short description in one line * * Long description which * can span multiple lines */ /** * \file * \brief */ /** * \class bbtk:: * \brief */ #ifdef _USE_WXWIDGETS_ #ifndef __bbtkWxBlackBox_h__ #define __bbtkWxBlackBox_h__ #include "bbtkWx.h" #include "bbtkUserBlackBox.h" namespace bbtk { //================================================================== // Forward declaration of the class of window associated to a WxBlackBox class WxBlackBoxWindow; //================================================================== //================================================================== // Forward declaration of the widget event handler class class WxBlackBoxWidgetEventHandler; //================================================================== //================================================================== /// Widget black boxes class BBTK_EXPORT WxBlackBox : public bbtk::UserBlackBox { BBTK_USER_BLACK_BOX_INTERFACE(WxBlackBox,bbtk::UserBlackBox); // BBTK_DECLARE_INPUT(WinParent,WxParentToChildData*); BBTK_DECLARE_INPUT(WinTitle,std::string); BBTK_DECLARE_INPUT(WinWidth,int); BBTK_DECLARE_INPUT(WinHeight,int); BBTK_DECLARE_INPUT(WinDialog,bool); BBTK_DECLARE_INPUT(WinHide,Void); BBTK_DECLARE_OUTPUT(Widget, wxWindow*);//WxBlackBoxWidget*); BBTK_PROCESS(Process); public: typedef WxBlackBoxWindow Window; /// Returns the window associated to the box /// If 0 returned = no window Window* bbGetWindow() { return bbmWindow; } /// Returns the Parent Window that must be used to create the widget wxWindow* bbGetWxParent() { return bbGlobalGetTopWindow(); } /// Returns the global parent of all bbtk windows static wxWindow* bbGlobalGetTopWindow(); /// Sets the global parent of all bbtk windows static void bbGlobalSetTopWindow(wxWindow*); static void bbGlobalIncNbWindowsAlive() { bbmgNbWindowsAlive++; } static void bbGlobalDecNbWindowsAlive(); static int bbGlobalGetNbWindowsAlive() { return bbmgNbWindowsAlive; } static bool bbGlobalIsSomeWindowAlive() { return (bbmgNbWindowsAlive>0);} static void bbGlobalDecNbWindowsShown(); static void bbGlobalIncNbWindowsShown() { bbmgNbWindowsShown++; } static int bbGlobalGetNbWindowsShown() { return bbmgNbWindowsShown; } static bool bbGlobalIsSomeWindowShown() { return (bbmgNbWindowsShown>0);} private: static wxWindow* bbmgTopWindow; static int bbmgNbWindowsAlive; static int bbmgNbWindowsShown; protected: //================================================================== /// User callback called in the box contructor virtual void bbUserConstructor(); /// User callback called in the box copy constructor virtual void bbUserCopyConstructor(); /// User callback called in the box destructor virtual void bbUserDestructor(); //================================================================== /* //================================================================== /// User callback for creating the window associated to the box /// Can be overloaded in order to impose your own window to show, /// Typically if your widget is already a dialog that cannot /// be inserted into a parent. /// WARNING : If you use it then your widget will not be inserted /// in the parent window, if any /// (i.e. even if the Parent-Child connection is set) virtual Window* bbUserCreateWindow() { return 0; } //================================================================== //================================================================== /// User callback for creating the widget associated to the box /// Must be defined if bbUserCreateWindow is not virtual Widget* bbUserCreateWidget(wxWindow *parent) { bbtkError(bbGetTypeName()<<" is a WxBlackBox whose bbUserCreateWindow and bbUserCreateWidget methods are both undefined : cannot work !!"); return 0; } //================================================================== */ //================================================================== /// Specific methods for windows creation during pipeline execution //void bbCreateWindow(); void bbShowWindow(Connection* caller); void bbHideWindow(); //================================================================== void Process() { } private: /// friendship friend class WxBlackBoxWindow; friend class WxBlackBoxWidgetEventHandler; /// Sets the window inline void bbSetWindow(Window* w) { bbmWindow=w; } /// Sets the Widget Event Handler inline void bbSetWidgetEventHandler(WxBlackBoxWidgetEventHandler* w) { bbmWidgetEventHandler = w; } /// Gets the Widget Event Handler inline WxBlackBoxWidgetEventHandler* bbGetWidgetEventHandler() { return bbmWidgetEventHandler; } /// The WxBlackBoxWindow associated to the box Window* bbmWindow; /// The WxBlackBoxWidgetEventHandler associated to the box WxBlackBoxWidgetEventHandler* bbmWidgetEventHandler; void bbInitAttributes(); }; //================================================================= //================================================================= // UserBlackBox description BBTK_BEGIN_DESCRIBE_BLACK_BOX(WxBlackBox,bbtk::UserBlackBox); BBTK_NAME("WxBlackBox"); // BBTK_INPUT_NOCOPY(WxBlackBox,WinParent,"Parent widget box", // WxParentToChildData*); BBTK_INPUT(WxBlackBox,WinTitle, "Title of the window (only used if the box is the top window of a Parent-Child hierarchy)", std::string); BBTK_INPUT(WxBlackBox,WinWidth, "Width of the window (only used if the box is the top window of a Parent-Child hierarchy)",int); BBTK_INPUT(WxBlackBox,WinHeight, "Height of the window (only used if the box is the top window of a Parent-Child hierarchy)",int); BBTK_INPUT(WxBlackBox,WinDialog, "Set to 'true' to have a dialog window, i.e. which is modal (steals the focus until closed) (only used if the box is the top window of a Parent-Child hierarchy)",bool); BBTK_INPUT(WxBlackBox,WinHide, "Any signal received hides the window (only active if the box is the top window of a Parent-Child hierarchy)",Void); BBTK_OUTPUT(WxBlackBox,Widget,"Output widget",wxWindow*); BBTK_END_DESCRIBE_BLACK_BOX(WxBlackBox); //================================================================= //================================================================== // The base of the hierarchy of windows associated to a WxBlackBox class BBTK_EXPORT WxBlackBoxWindow //: public wxWindow { public: WxBlackBoxWindow(WxBlackBox* box); virtual ~WxBlackBoxWindow(); virtual void bbShow(); virtual void bbHide(); bool bbIsShown() { return mShown; } virtual WxBlackBox* bbGetBlackBox() { return mBox; } virtual wxDialog* bbGetDialog() { return 0; } virtual wxFrame* bbGetFrame() { return 0; } private: WxBlackBox* mBox; bool mShown; }; //================================================================== //================================================================== // Dialog window which is modal class BBTK_EXPORT WxBlackBoxDialog : public wxDialog, public WxBlackBoxWindow { public: WxBlackBoxDialog(WxBlackBox* box, wxWindow *parent, wxString title, wxSize size); ~WxBlackBoxDialog(); void bbShow(); void bbHide(); wxDialog* bbGetDialog() { return this; } }; //================================================================== //================================================================== // Frame window which is not modal class BBTK_EXPORT WxBlackBoxFrame : public wxFrame, public WxBlackBoxWindow { public: WxBlackBoxFrame(WxBlackBox* box, wxWindow *parent, wxString title, wxSize size); ~WxBlackBoxFrame(); void bbShow(); void bbHide(); wxFrame* bbGetFrame() { return this; } }; //================================================================== /* //================================================================= /// Class from which a user defined widget associated to a WxBlackBox /// should inherit class BBTK_EXPORT WxBlackBoxWidget { public: /// Ctor with the WxBlackBox which created it WxBlackBoxWidget( WxBlackBox* box); /// Dtor virtual ~WxBlackBoxWidget(); /// Returns the WxBlackBox which created it WxBlackBox* GetBlackBox() { return mBox; } /// Returns the WxBlackBox which created it (const) const WxBlackBox* GetBlackBox() const { return mBox; } /// Returns the wxWindow associated to the widget virtual wxWindow* GetWxWindow() { return 0; } virtual bool IsDead() { return false; } private: WxBlackBox* mBox; }; //================================================================= */ //================================================================= // Handles the destroy events of a widget associated to a WxBlackBox // in order to signal the widget death to its associated box class BBTK_EXPORT WxBlackBoxWidgetEventHandler : public wxEvtHandler { public: /// Ctor with the box and widget WxBlackBoxWidgetEventHandler( WxBlackBox* box, wxWindow *widget ); /// Dtor ~WxBlackBoxWidgetEventHandler(); /// Returns true iff is the handler for that window bool IsHandlerOf( wxWindow* w ) { return mWindow == w; } // wxWindow* GetWxWindow() { return mWindow; } /// Method processing the destroy event of the widget void OnWindowDestroy(wxWindowDestroyEvent&); // //bool IsDead() { return mDead; } private: WxBlackBox* mBox; wxWindow* mWindow; //bool mDead; }; //================================================================= /* //================================================================= /// A WxBlackBoxWidget which is a wxPanel also class BBTK_EXPORT WxBlackBoxWidgetPanel : public wxPanel, public WxBlackBoxWidget // public WxBlackBoxWidget, // public wxPanel { public: /// Ctor with the parent and the WxBlackBox which created it WxBlackBoxWidgetPanel(WxBlackBox* box, wxWindow *parent) : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL), WxBlackBoxWidget(box) {} /// Returns the top panel of the widget wxWindow* GetWxWindow() { return (wxWindow*)(wxPanel*)(this); } /// Returns the top panel of the widget wxPanel* GetPanel() { return (wxPanel*)(this); } }; //================================================================= */ } //namespace bbtk #endif //__bbtkWxBlackBox_h__ #endif //_USE_WXWIDGETS_