]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxBlackBox.h
bbtk now depends on crea !
[bbtk.git] / kernel / src / bbtkWxBlackBox.h
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbtkWxBlackBox.h,v $
4   Language:  C++
5   Date:      $Date: 2008/12/11 15:30:04 $
6   Version:   $Revision: 1.24 $
7 ========================================================================*/
8
9
10 /* ---------------------------------------------------------------------
11
12 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
13 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
14 *
15 *  This software is governed by the CeCILL-B license under French law and 
16 *  abiding by the rules of distribution of free software. You can  use, 
17 *  modify and/ or redistribute the software under the terms of the CeCILL-B 
18 *  license as circulated by CEA, CNRS and INRIA at the following URL 
19 *  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
20 *  or in the file LICENSE.txt.
21 *
22 *  As a counterpart to the access to the source code and  rights to copy,
23 *  modify and redistribute granted by the license, users are provided only
24 *  with a limited warranty  and the software's author,  the holder of the
25 *  economic rights,  and the successive licensors  have only  limited
26 *  liability. 
27 *
28 *  The fact that you are presently reading this means that you have had
29 *  knowledge of the CeCILL-B license and that you accept its terms.
30 * ------------------------------------------------------------------------ */                                                                         
31 /**
32  * \brief Short description in one line
33  * 
34  * Long description which 
35  * can span multiple lines
36  */
37 /**
38  * \file 
39  * \brief 
40  */
41 /**
42  * \class bbtk::
43  * \brief 
44  */
45
46
47 #ifdef USE_WXWIDGETS
48
49
50 #ifndef __bbtkWxBlackBox_h__
51 #define __bbtkWxBlackBox_h__
52
53
54 #include "bbtkWx.h"
55 #include "bbtkAtomicBlackBox.h"
56
57
58 namespace bbtk
59 {
60
61
62
63
64   //==================================================================
65   // Forward declaration of the class of window associated to a WxBlackBox
66   class WxBlackBoxWindow;
67   //==================================================================
68
69   //==================================================================
70   // Forward declaration of the widget event handler class
71   class WxBlackBoxWidgetEventHandler;
72   //==================================================================
73
74
75   //==================================================================
76   /// Widget black boxes
77   class BBTK_EXPORT WxBlackBox : public bbtk::AtomicBlackBox  
78   { 
79     BBTK_BLACK_BOX_INTERFACE(WxBlackBox,bbtk::AtomicBlackBox);
80     BBTK_DECLARE_INPUT(WinTitle,std::string);
81     BBTK_DECLARE_INPUT(WinWidth,int);
82     BBTK_DECLARE_INPUT(WinHeight,int);
83     BBTK_DECLARE_INPUT(WinDialog,bool);
84     BBTK_DECLARE_INPUT(WinHide,Void);
85     BBTK_DECLARE_INPUT(WinClose,Void);
86     BBTK_DECLARE_OUTPUT(Widget, wxWindow*);
87
88   public:
89     /// 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 (as the container window must be created and displayed - this box will be executed by the normal pipeline recursion mechanism)
90     //   virtual void bbExecute(bool force = false);
91
92
93     typedef WxBlackBoxWindow Window;
94     
95     /// Returns the **OWN** window associated to the box
96     /// If 0 returned = no window
97     Window* bbGetWindow() { return bbmWindow; }
98
99     /// Returns the window containing the widget associated to the box
100     /// Which can be the own window of **ANOTHER** box in case of 
101     /// a hierarchy of widgets.
102     /// More precisely :
103     /// If bbGetWindow() != 0 then returns bbGetWindow()
104     /// Else if the output 'Widget' is connected 
105     ///  then returns bbGetContainingWindow() of the box connected to 'Widget'
106     /// Else returns 0;
107     Window* bbGetContainingWindow();
108
109     /// Returns true iff the 'containing window' exists and is shown 
110     /// (see bbGetContainingWindow).
111     bool bbIsShown();
112
113     //==================================================================    
114     /// User callback invoked when the containing window is shown
115     virtual void bbUserOnShow() {}
116     //==================================================================    
117  
118     //==================================================================    
119     /// User callback invoked when the containing window is hidden
120     virtual void bbUserOnHide() {}
121     //==================================================================    
122
123
124     //==================================================================    
125     void bbCreateWidgetAndEventHandler(wxWindow* parent); 
126     //==================================================================    
127           
128   protected:
129     
130   
131     //==================================================================
132     /// User callback called in the box contructor
133     virtual void bbUserConstructor();
134     /// User callback called in the box copy constructor
135     virtual void bbUserCopyConstructor(bbtk::BlackBox::Pointer);
136     /// User callback called in the box destructor
137     virtual void bbUserDestructor();
138     //==================================================================    
139
140     //==================================================================    
141     /// User callback for creating the widget associated to the box
142     /// ** Must be defined **
143     virtual void bbUserCreateWidget(wxWindow* parent) 
144     {
145       bbtkError(bbGetTypeName()<<" is a WxBlackBox whose bbUserCreateWidget methods is not overloaded : is it a feature or a bug ?!?");
146     }
147     //==================================================================    
148
149
150     //==================================================================    
151     // For layout widgets : creates and returns the widget 
152     // of the box connected to input in
153     wxWindow* bbCreateWidgetOfInput(const std::string& in, wxWindow* parent);
154     //==================================================================    
155
156  
157
158     //==================================================================
159     /// Overloaded processing method for WxBlackBoxes which handles 
160     /// the window creation if needed
161     virtual void bbProcess();
162     //==================================================================
163
164     //==================================================================
165     /// If necessary creates the WxBlackBoxWindow associated to the box
166     /// and shows it 
167     /// (does nothing if the box output 'Widget' is connected which 
168     /// means that the box does not have its own window but is contained 
169     /// into another window)
170     //    void bbShowWindow();
171     /// Hides the WxBlackBoxWindow associated to the box (if exists)
172     void bbHideWindow();
173     /// Closes (destroys) the WxBlackBoxWindow associated to the box (if exists)
174     void bbCloseWindow();
175     //==================================================================
176
177   private:
178     /// friendship
179     friend class WxBlackBoxWindow;
180     friend class WxBlackBoxWidgetEventHandler;
181
182     /// Sets the window
183     inline void bbSetWindow(Window* w) { bbmWindow=w; }
184
185     /// Sets the Widget Event Handler
186     inline void bbSetWidgetEventHandler(WxBlackBoxWidgetEventHandler* w) 
187     { bbmWidgetEventHandler = w; }
188     /// Gets the Widget Event Handler
189     inline WxBlackBoxWidgetEventHandler* bbGetWidgetEventHandler()
190     { return bbmWidgetEventHandler; }
191
192
193     /// The WxBlackBoxWindow associated to the box
194     Window* bbmWindow;
195     /// The WxBlackBoxWidgetEventHandler associated to the box
196     WxBlackBoxWidgetEventHandler* bbmWidgetEventHandler;
197
198
199     void bbInitAttributes();
200
201   protected :
202
203
204     /// For Forward update mechanism when execution is called 
205     /// on a contained window
206     /// Is set to true before transfering update to parent 
207     /// in order to not re-transfer a second time...
208     /*
209     bool bbmUpdateTransferedToParent;
210
211     bool bbGetUpdateTransferedToParent() const { return bbmUpdateTransferedToParent; }
212     void bbSetUpdateTransferedToParent(bool b) 
213     { bbmUpdateTransferedToParent = b; }
214     */
215   };
216   //=================================================================
217  
218
219   //======================================================================
220   /// Defines the bbUserCreateWidget method
221 #define BBTK_CREATE_WIDGET(CALLBACK)                                    \
222   public:                                                               \
223   inline void bbUserCreateWidget(wxWindow* parent)                                      \
224   {                                                                     \
225     bbtkDebugMessageInc("wx",1,"**> Creating widget for ["              \
226                         <<bbGetFullName()<<"]"<<std::endl);             \
227     CALLBACK(parent);                                                           \
228     bbtkDebugMessageInc("wx",1,"<** Creating widget for ["              \
229                         <<bbGetFullName()<<"]"<<std::endl);             \
230   }
231   
232   //======================================================================
233
234   //======================================================================
235   /// Defines the bbUserOnShow method
236 #define BBTK_ON_SHOW_WIDGET(CALLBACK)                                   \
237   public:                                                               \
238   inline void bbUserOnShow()                                    \
239   {                                                                     \
240     bbtkDebugMessageInc("wx",1,"**> Showing ["          \
241                         <<bbGetFullName()<<"]"<<std::endl);             \
242     CALLBACK();                                                         \
243     bbtkDebugMessageInc("wx",1,"<** Showing ["          \
244                         <<bbGetFullName()<<"]"<<std::endl);             \
245   }
246   
247   //======================================================================
248
249   //=================================================================
250   // WxBlackBoxDescriptor declaration
251   BBTK_BEGIN_DESCRIBE_BLACK_BOX(WxBlackBox,bbtk::AtomicBlackBox);
252   BBTK_NAME("WxBlackBox");
253   // BBTK_DESCRIPTION("Widget box. The inputs marked with (*) are only used if the widget is not inserted in another widget.\n");
254   BBTK_CATEGORY("widget");
255   BBTK_INPUT(WxBlackBox,WinTitle,
256              "Title of the window (*)",
257              std::string,"");
258   BBTK_INPUT(WxBlackBox,WinWidth,
259              "Width of the window (* : only used if the widget is not connected to a Layout box)",int,"");
260   BBTK_INPUT(WxBlackBox,WinHeight,
261              "Height of the window (*)",int,"");
262   BBTK_INPUT(WxBlackBox,WinDialog,
263              "Set to 'true' to create a dialog window, i.e. which blocks the pipeline until it is closed (modal) (*)",bool,"");
264   BBTK_INPUT(WxBlackBox,WinHide,
265              "Any signal received hides the window (*)",Void,"signal");
266   BBTK_INPUT(WxBlackBox,WinClose,
267              "Any signal received closes the window (*)",Void,"signal");
268   BBTK_OUTPUT(WxBlackBox,Widget,"Output widget",wxWindow*,"");
269   BBTK_END_DESCRIBE_BLACK_BOX(WxBlackBox);
270   //=================================================================
271
272
273
274
275
276
277
278
279
280   //==================================================================
281   // The base of the hierarchy of windows associated to a WxBlackBox
282   class BBTK_EXPORT WxBlackBoxWindow //: public wxWindow
283   {
284   public:
285     WxBlackBoxWindow(WxBlackBox::Pointer box);
286     virtual ~WxBlackBoxWindow();
287     virtual void bbShow();
288     virtual void bbHide();
289     virtual void bbClose();
290     bool bbIsShown() { return mShown; }
291     virtual WxBlackBox::Pointer bbGetBlackBox() { return mBox.lock(); }
292     virtual wxDialog* bbGetDialog() { return 0; } 
293     virtual wxFrame* bbGetFrame() { return 0; } 
294   private:
295     WxBlackBox::WeakPointer mBox;
296     bool mShown;
297   };
298   //==================================================================
299
300   //==================================================================
301   // Dialog window which is modal
302   class BBTK_EXPORT  WxBlackBoxDialog : public wxDialog, public WxBlackBoxWindow
303   {
304   public:
305     WxBlackBoxDialog(WxBlackBox::Pointer box, 
306                      wxWindow *parent, wxString title, wxSize size);
307     ~WxBlackBoxDialog();
308     void bbShow();  
309     void bbHide();
310     void bbClose();
311     wxDialog* bbGetDialog() { return this; } 
312   };
313   //==================================================================
314
315   //==================================================================
316   // Frame window which is not modal
317   class BBTK_EXPORT  WxBlackBoxFrame : public wxFrame, public WxBlackBoxWindow
318   {
319   public:
320     WxBlackBoxFrame(WxBlackBox::Pointer box,
321                     wxWindow *parent, wxString title, wxSize size);
322     ~WxBlackBoxFrame();
323     void bbShow();
324     void bbHide();
325     void bbClose();
326     wxFrame* bbGetFrame() { return this; } 
327   };
328   //==================================================================
329
330
331
332   //=================================================================
333   // Handles the destroy events of a widget associated to a WxBlackBox 
334   // in order to signal the widget death to its associated box
335   class BBTK_EXPORT WxBlackBoxWidgetEventHandler : public wxEvtHandler
336   {
337   public:
338     /// Ctor with the box and widget 
339     WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box, wxWindow *widget );
340     /// Dtor
341     ~WxBlackBoxWidgetEventHandler();
342     /// Returns true iff is the handler for that window  
343     bool IsHandlerOf( wxWindow* w ) { return mWindow == w; }
344     // wxWindow* GetWxWindow() { return mWindow; }
345     /// Method processing the destroy event of the widget
346     void OnWindowDestroy(wxWindowDestroyEvent&);
347     //
348     //bool IsDead() { return mDead; }
349
350   private:
351     WxBlackBox::WeakPointer mBox;
352     wxWindow* mWindow;
353     //bool mDead;
354   };  
355   //=================================================================
356
357
358
359 } //namespace bbtk
360
361 #endif  //__bbtkWxBlackBox_h__
362
363 #endif  //USE_WXWIDGETS