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