]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.h
92d711d3bc488bbbee1ae3a4ca3629a9d2237394
[bbtk.git] / kernel / src / bbtkWxBlackBox.h
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkWxBlackBox.h,v $
5   Language:  C++
6   Date:      $Date: 2008/04/18 12:59:16 $
7   Version:   $Revision: 1.11 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*//**
18  * \brief Short description in one line
19  * 
20  * Long description which 
21  * can span multiple lines
22  */
23 /**
24  * \file 
25  * \brief 
26  */
27 /**
28  * \class bbtk::
29  * \brief 
30  */
31
32
33 #ifdef _USE_WXWIDGETS_
34
35
36 #ifndef __bbtkWxBlackBox_h__
37 #define __bbtkWxBlackBox_h__
38
39
40 #include "bbtkWx.h"
41 #include "bbtkAtomicBlackBox.h"
42
43
44 namespace bbtk
45 {
46
47
48
49
50   //==================================================================
51   // Forward declaration of the class of window associated to a WxBlackBox
52   class WxBlackBoxWindow;
53   //==================================================================
54
55   //==================================================================
56   // Forward declaration of the widget event handler class
57   class WxBlackBoxWidgetEventHandler;
58   //==================================================================
59
60
61   //==================================================================
62   /// Widget black boxes
63   class BBTK_EXPORT WxBlackBox : public bbtk::AtomicBlackBox  
64   { 
65     BBTK_BLACK_BOX_INTERFACE(WxBlackBox,bbtk::AtomicBlackBox);
66     //   BBTK_DECLARE_INPUT(WinParent,WxParentToChildData*);
67     BBTK_DECLARE_INPUT(WinTitle,std::string);
68     BBTK_DECLARE_INPUT(WinWidth,int);
69     BBTK_DECLARE_INPUT(WinHeight,int);
70     BBTK_DECLARE_INPUT(WinDialog,bool);
71     BBTK_DECLARE_INPUT(WinHide,Void);
72     BBTK_DECLARE_OUTPUT(Widget, wxWindow*);//WxBlackBoxWidget*);
73
74   public:
75     typedef WxBlackBoxWindow Window;
76     
77     /// Returns the **OWN** window associated to the box
78     /// If 0 returned = no window
79     Window* bbGetWindow() { return bbmWindow; }
80
81     /// Returns the window containing the widget associated to the box
82     /// Which can be the own window of **ANOTHER** box in case of 
83     /// a hierarchy of widgets.
84     /// More precisely :
85     /// If bbGetWindow() != 0 then returns bbGetWindow()
86     /// Else if the output 'Widget' is connected 
87     ///  then returns bbGetContainingWindow() of the box connected to 'Widget'
88     /// Else returns 0;
89     Window* bbGetContainingWindow();
90
91     /// Returns the parent wxWindow that must be used to create the widget 
92     wxWindow* bbGetWxParent();
93
94     /// Returns true iff the 'containing window' exists and is shown 
95     /// (see bbGetContainingWindow).
96     bool bbIsShown();
97
98     //==================================================================    
99     /// User callback invoked when the containing window is shown
100     virtual void bbUserOnShow() {}
101     //==================================================================    
102  
103     //==================================================================    
104     /// User callback invoked when the containing window is hidden
105     virtual void bbUserOnHide() {}
106     //==================================================================    
107
108   protected:
109     
110   
111     //==================================================================
112     /// User callback called in the box contructor
113     virtual void bbUserConstructor();
114     /// User callback called in the box copy constructor
115     virtual void bbUserCopyConstructor();
116     /// User callback called in the box destructor
117     virtual void bbUserDestructor();
118     //==================================================================    
119
120     //==================================================================    
121     /// User callback for creating the widget associated to the box
122     /// ** Must be defined **
123     virtual void bbUserCreateWidget() 
124     {
125       bbtkError(bbGetTypeName()<<" is a WxBlackBox whose bbUserCreateWidget methods is not overloaded : is it a feature or a bug ?!?");
126     }
127     //==================================================================    
128
129
130     
131
132     //==================================================================
133     /// Main processing method of the box.
134     virtual IOStatus bbBackwardUpdate( Connection::Pointer caller );
135     //==================================================================
136
137
138
139     //==================================================================
140     /// Overloaded processing method for WxBlackBoxes :
141     /// 1) if the widget is null then 
142     ///    calls the user defined widget creation method : bbUserCreateWidget()
143     /// 2) calls the user defined processing method : bbUserProcess()
144     /// 3) displays the window : bbShowWindow();
145     virtual void bbProcess();
146     //==================================================================
147
148     //==================================================================
149     /// If necessary creates the WxBlackBoxWindow associated to the box
150     /// and shows it 
151     /// (does nothing if the box output 'Widget' is connected which 
152     /// means that the box does not have its own window but is contained 
153     /// into another window)
154     void bbShowWindow();
155     /// Hides the WxBlackBoxWindow associated to the box (if exists)
156     void bbHideWindow();
157     //==================================================================
158
159   private:
160     /// friendship
161     friend class WxBlackBoxWindow;
162     friend class WxBlackBoxWidgetEventHandler;
163
164     /// Sets the window
165     inline void bbSetWindow(Window* w) { bbmWindow=w; }
166
167     /// Sets the Widget Event Handler
168     inline void bbSetWidgetEventHandler(WxBlackBoxWidgetEventHandler* w) 
169     { bbmWidgetEventHandler = w; }
170     /// Gets the Widget Event Handler
171     inline WxBlackBoxWidgetEventHandler* bbGetWidgetEventHandler()
172     { return bbmWidgetEventHandler; }
173
174
175     /// The WxBlackBoxWindow associated to the box
176     Window* bbmWindow;
177     /// The WxBlackBoxWidgetEventHandler associated to the box
178     WxBlackBoxWidgetEventHandler* bbmWidgetEventHandler;
179
180
181     void bbInitAttributes();
182
183   protected :
184     /// Main processing method of the box. Overloaded to handle windows inclusion : if the output Widget is connected then the execution is transfered to the box to which it is connected (the container window must be created and displayed - this box will be also executed by the normal pipeline recursion mechanism)
185     virtual void bbExecute(bool force = false);
186
187   };
188   //=================================================================
189  
190
191   //======================================================================
192   /// Defines the bbUserCreateWidget method
193 #define BBTK_CREATE_WIDGET(CALLBACK)                                    \
194   public:                                                               \
195   inline void bbUserCreateWidget()                                      \
196   {                                                                     \
197     bbtkDebugMessageInc("Process",1,"=> "<<bbGetTypeName()<<"::bbUserCreateWidget() [" \
198                         <<bbGetFullName()<<"]"<<std::endl);             \
199     CALLBACK();                                                         \
200     bbtkDebugMessageDec("Process",1,"<= "<<bbGetTypeName()<<"::bbUserCreateWidget() [" \
201                         <<bbGetFullName()<<"]"<<std::endl);             \
202   }
203   
204   //======================================================================
205
206   //=================================================================
207   // WxBlackBoxDescriptor declaration
208   BBTK_BEGIN_DESCRIBE_BLACK_BOX(WxBlackBox,bbtk::AtomicBlackBox);
209   BBTK_NAME("WxBlackBox");
210   // BBTK_DESCRIPTION("Widget box. The inputs marked with (*) are only used if the widget is not inserted in another widget.\n");
211   BBTK_CATEGORY("widget");
212   BBTK_INPUT(WxBlackBox,WinTitle,
213              "Title of the window (*)",
214              std::string,"");
215   BBTK_INPUT(WxBlackBox,WinWidth,
216              "Width of the window (* : only used if the widget is not inserted in another widget)",int,"");
217   BBTK_INPUT(WxBlackBox,WinHeight,
218              "Height of the window (*)",int,"");
219   BBTK_INPUT(WxBlackBox,WinDialog,
220              "Set to 'true' to create a dialog window, i.e. which blocks the pipeline until it is closed (modal) (*)",bool,"");
221   BBTK_INPUT(WxBlackBox,WinHide,
222              "Any signal received hides the window (*)",Void,"");
223   BBTK_OUTPUT(WxBlackBox,Widget,"Output widget",wxWindow*,"");
224   BBTK_END_DESCRIBE_BLACK_BOX(WxBlackBox);
225   //=================================================================
226
227
228
229
230
231
232
233
234
235   //==================================================================
236   // The base of the hierarchy of windows associated to a WxBlackBox
237   class BBTK_EXPORT WxBlackBoxWindow //: public wxWindow
238   {
239   public:
240     WxBlackBoxWindow(WxBlackBox::Pointer box);
241     virtual ~WxBlackBoxWindow();
242     virtual void bbShow();
243     virtual void bbHide();
244     bool bbIsShown() { return mShown; }
245     virtual WxBlackBox::Pointer bbGetBlackBox() { return mBox; }
246     virtual wxDialog* bbGetDialog() { return 0; } 
247     virtual wxFrame* bbGetFrame() { return 0; } 
248   private:
249     WxBlackBox::Pointer mBox;
250     bool mShown;
251   };
252   //==================================================================
253
254   //==================================================================
255   // Dialog window which is modal
256   class BBTK_EXPORT  WxBlackBoxDialog : public wxDialog, public WxBlackBoxWindow
257   {
258   public:
259     WxBlackBoxDialog(WxBlackBox::Pointer box, 
260                      wxWindow *parent, wxString title, wxSize size);
261     ~WxBlackBoxDialog();
262     void bbShow();  
263     void bbHide();
264     wxDialog* bbGetDialog() { return this; } 
265   };
266   //==================================================================
267
268   //==================================================================
269   // Frame window which is not modal
270   class BBTK_EXPORT  WxBlackBoxFrame : public wxFrame, public WxBlackBoxWindow
271   {
272   public:
273     WxBlackBoxFrame(WxBlackBox::Pointer box,
274                     wxWindow *parent, wxString title, wxSize size);
275     ~WxBlackBoxFrame();
276     void bbShow();
277     void bbHide();
278     wxFrame* bbGetFrame() { return this; } 
279   };
280   //==================================================================
281
282
283
284   //=================================================================
285   // Handles the destroy events of a widget associated to a WxBlackBox 
286   // in order to signal the widget death to its associated box
287   class BBTK_EXPORT WxBlackBoxWidgetEventHandler : public wxEvtHandler
288   {
289   public:
290     /// Ctor with the box and widget 
291     WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box, wxWindow *widget );
292     /// Dtor
293     ~WxBlackBoxWidgetEventHandler();
294     /// Returns true iff is the handler for that window  
295     bool IsHandlerOf( wxWindow* w ) { return mWindow == w; }
296     // wxWindow* GetWxWindow() { return mWindow; }
297     /// Method processing the destroy event of the widget
298     void OnWindowDestroy(wxWindowDestroyEvent&);
299     //
300     //bool IsDead() { return mDead; }
301
302   private:
303     WxBlackBox::Pointer mBox;
304     wxWindow* mWindow;
305     //bool mDead;
306   };  
307   //=================================================================
308
309
310
311 } //namespace bbtk
312
313 #endif  //__bbtkWxBlackBox_h__
314
315 #endif  //_USE_WXWIDGETS_