]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.h
*** empty log message ***
[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/24 10:11:28 $
7   Version:   $Revision: 1.14 $
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     /// Is set to true before transfering update to parent 
189     /// in order to not re-transfer a second time...
190     bool bbmUpdateTransferedToParent;
191
192     bool bbGetUpdateTransferedToParent() const { return bbmUpdateTransferedToParent; }
193     void bbSetUpdateTransferedToParent(bool b) 
194     { bbmUpdateTransferedToParent = b; }
195
196   };
197   //=================================================================
198  
199
200   //======================================================================
201   /// Defines the bbUserCreateWidget method
202 #define BBTK_CREATE_WIDGET(CALLBACK)                                    \
203   public:                                                               \
204   inline void bbUserCreateWidget()                                      \
205   {                                                                     \
206     bbtkDebugMessageInc("process",1,"**> Creating widget for ["         \
207                         <<bbGetFullName()<<"]"<<std::endl);             \
208     CALLBACK();                                                         \
209     bbtkDebugMessageInc("process",1,"<** Creating widget for ["         \
210                         <<bbGetFullName()<<"]"<<std::endl);             \
211   }
212   
213   //======================================================================
214
215   //=================================================================
216   // WxBlackBoxDescriptor declaration
217   BBTK_BEGIN_DESCRIBE_BLACK_BOX(WxBlackBox,bbtk::AtomicBlackBox);
218   BBTK_NAME("WxBlackBox");
219   // BBTK_DESCRIPTION("Widget box. The inputs marked with (*) are only used if the widget is not inserted in another widget.\n");
220   BBTK_CATEGORY("widget");
221   BBTK_INPUT(WxBlackBox,WinTitle,
222              "Title of the window (*)",
223              std::string,"");
224   BBTK_INPUT(WxBlackBox,WinWidth,
225              "Width of the window (* : only used if the widget is not inserted in another widget)",int,"");
226   BBTK_INPUT(WxBlackBox,WinHeight,
227              "Height of the window (*)",int,"");
228   BBTK_INPUT(WxBlackBox,WinDialog,
229              "Set to 'true' to create a dialog window, i.e. which blocks the pipeline until it is closed (modal) (*)",bool,"");
230   BBTK_INPUT(WxBlackBox,WinHide,
231              "Any signal received hides the window (*)",Void,"");
232   BBTK_OUTPUT(WxBlackBox,Widget,"Output widget",wxWindow*,"");
233   BBTK_END_DESCRIBE_BLACK_BOX(WxBlackBox);
234   //=================================================================
235
236
237
238
239
240
241
242
243
244   //==================================================================
245   // The base of the hierarchy of windows associated to a WxBlackBox
246   class BBTK_EXPORT WxBlackBoxWindow //: public wxWindow
247   {
248   public:
249     WxBlackBoxWindow(WxBlackBox::Pointer box);
250     virtual ~WxBlackBoxWindow();
251     virtual void bbShow();
252     virtual void bbHide();
253     bool bbIsShown() { return mShown; }
254     virtual WxBlackBox::Pointer bbGetBlackBox() { return mBox.lock(); }
255     virtual wxDialog* bbGetDialog() { return 0; } 
256     virtual wxFrame* bbGetFrame() { return 0; } 
257   private:
258     WxBlackBox::WeakPointer mBox;
259     bool mShown;
260   };
261   //==================================================================
262
263   //==================================================================
264   // Dialog window which is modal
265   class BBTK_EXPORT  WxBlackBoxDialog : public wxDialog, public WxBlackBoxWindow
266   {
267   public:
268     WxBlackBoxDialog(WxBlackBox::Pointer box, 
269                      wxWindow *parent, wxString title, wxSize size);
270     ~WxBlackBoxDialog();
271     void bbShow();  
272     void bbHide();
273     wxDialog* bbGetDialog() { return this; } 
274   };
275   //==================================================================
276
277   //==================================================================
278   // Frame window which is not modal
279   class BBTK_EXPORT  WxBlackBoxFrame : public wxFrame, public WxBlackBoxWindow
280   {
281   public:
282     WxBlackBoxFrame(WxBlackBox::Pointer box,
283                     wxWindow *parent, wxString title, wxSize size);
284     ~WxBlackBoxFrame();
285     void bbShow();
286     void bbHide();
287     wxFrame* bbGetFrame() { return this; } 
288   };
289   //==================================================================
290
291
292
293   //=================================================================
294   // Handles the destroy events of a widget associated to a WxBlackBox 
295   // in order to signal the widget death to its associated box
296   class BBTK_EXPORT WxBlackBoxWidgetEventHandler : public wxEvtHandler
297   {
298   public:
299     /// Ctor with the box and widget 
300     WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box, wxWindow *widget );
301     /// Dtor
302     ~WxBlackBoxWidgetEventHandler();
303     /// Returns true iff is the handler for that window  
304     bool IsHandlerOf( wxWindow* w ) { return mWindow == w; }
305     // wxWindow* GetWxWindow() { return mWindow; }
306     /// Method processing the destroy event of the widget
307     void OnWindowDestroy(wxWindowDestroyEvent&);
308     //
309     //bool IsDead() { return mDead; }
310
311   private:
312     WxBlackBox::WeakPointer mBox;
313     wxWindow* mWindow;
314     //bool mDead;
315   };  
316   //=================================================================
317
318
319
320 } //namespace bbtk
321
322 #endif  //__bbtkWxBlackBox_h__
323
324 #endif  //_USE_WXWIDGETS_