1 /*=========================================================================
3 Module: $RCSfile: bbtkWxBlackBox.h,v $
5 Date: $Date: 2008/11/25 11:17:13 $
6 Version: $Revision: 1.21 $
7 ========================================================================*/
10 /* ---------------------------------------------------------------------
12 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
13 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
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.
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
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 * ------------------------------------------------------------------------ */
32 * \brief Short description in one line
34 * Long description which
35 * can span multiple lines
47 #ifdef _USE_WXWIDGETS_
50 #ifndef __bbtkWxBlackBox_h__
51 #define __bbtkWxBlackBox_h__
55 #include "bbtkAtomicBlackBox.h"
64 //==================================================================
65 // Forward declaration of the class of window associated to a WxBlackBox
66 class WxBlackBoxWindow;
67 //==================================================================
69 //==================================================================
70 // Forward declaration of the widget event handler class
71 class WxBlackBoxWidgetEventHandler;
72 //==================================================================
75 //==================================================================
76 /// Widget black boxes
77 class BBTK_EXPORT WxBlackBox : public bbtk::AtomicBlackBox
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*);
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);
93 typedef WxBlackBoxWindow Window;
95 /// Returns the **OWN** window associated to the box
96 /// If 0 returned = no window
97 Window* bbGetWindow() { return bbmWindow; }
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.
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'
107 Window* bbGetContainingWindow();
109 /// Returns the parent wxWindow that must be used to create the widget
111 // LG 24/11/08 : New widget pipeline
112 // wxWindow* bbGetWxParent();
114 /// Returns true iff the 'containing window' exists and is shown
115 /// (see bbGetContainingWindow).
118 //==================================================================
119 /// User callback invoked when the containing window is shown
120 virtual void bbUserOnShow() {}
121 //==================================================================
123 //==================================================================
124 /// User callback invoked when the containing window is hidden
125 virtual void bbUserOnHide() {}
126 //==================================================================
128 // LG 24/11/08 : New widget pipeline
129 void bbCreateWidgetAndEventHandler(wxWindow* parent);
135 //==================================================================
136 /// User callback called in the box contructor
137 virtual void bbUserConstructor();
138 /// User callback called in the box copy constructor
139 virtual void bbUserCopyConstructor(bbtk::BlackBox::Pointer);
140 /// User callback called in the box destructor
141 virtual void bbUserDestructor();
142 //==================================================================
144 //==================================================================
145 /// User callback for creating the widget associated to the box
146 /// ** Must be defined **
147 // LG 24/11/08 : New widget pipeline
148 virtual void bbUserCreateWidget(wxWindow* parent)
150 bbtkError(bbGetTypeName()<<" is a WxBlackBox whose bbUserCreateWidget methods is not overloaded : is it a feature or a bug ?!?");
152 //==================================================================
155 wxWindow* bbCreateWidgetOfInput(const std::string& in, wxWindow* parent);
158 //==================================================================
159 /// Main processing method of the box.
160 virtual IOStatus bbBackwardUpdate( Connection::Pointer caller );
161 //==================================================================
165 //==================================================================
166 /// Overloaded processing method for WxBlackBoxes :
167 /// 1) if the widget is null then
168 /// calls the user defined widget creation method : bbUserCreateWidget()
169 /// 2) calls the user defined processing method : bbUserProcess()
170 /// 3) displays the window : bbShowWindow();
171 virtual void bbProcess();
172 //==================================================================
174 //==================================================================
175 /// If necessary creates the WxBlackBoxWindow associated to the box
177 /// (does nothing if the box output 'Widget' is connected which
178 /// means that the box does not have its own window but is contained
179 /// into another window)
181 /// Hides the WxBlackBoxWindow associated to the box (if exists)
183 /// Closes (destroys) the WxBlackBoxWindow associated to the box (if exists)
184 void bbCloseWindow();
185 //==================================================================
189 friend class WxBlackBoxWindow;
190 friend class WxBlackBoxWidgetEventHandler;
193 inline void bbSetWindow(Window* w) { bbmWindow=w; }
195 /// Sets the Widget Event Handler
196 inline void bbSetWidgetEventHandler(WxBlackBoxWidgetEventHandler* w)
197 { bbmWidgetEventHandler = w; }
198 /// Gets the Widget Event Handler
199 inline WxBlackBoxWidgetEventHandler* bbGetWidgetEventHandler()
200 { return bbmWidgetEventHandler; }
203 /// The WxBlackBoxWindow associated to the box
205 /// The WxBlackBoxWidgetEventHandler associated to the box
206 WxBlackBoxWidgetEventHandler* bbmWidgetEventHandler;
209 void bbInitAttributes();
214 /// For Forward update mechanism when execution is called
215 /// on a contained window
216 /// Is set to true before transfering update to parent
217 /// in order to not re-transfer a second time...
218 bool bbmUpdateTransferedToParent;
220 bool bbGetUpdateTransferedToParent() const { return bbmUpdateTransferedToParent; }
221 void bbSetUpdateTransferedToParent(bool b)
222 { bbmUpdateTransferedToParent = b; }
225 //=================================================================
228 //======================================================================
229 /// Defines the bbUserCreateWidget method
230 #define BBTK_CREATE_WIDGET(CALLBACK) \
232 inline void bbUserCreateWidget(wxWindow* parent) \
234 bbtkDebugMessageInc("wx",1,"**> Creating widget for [" \
235 <<bbGetFullName()<<"]"<<std::endl); \
237 bbtkDebugMessageInc("wx",1,"<** Creating widget for [" \
238 <<bbGetFullName()<<"]"<<std::endl); \
241 //======================================================================
243 //======================================================================
244 /// Defines the bbUserOnShow method
245 #define BBTK_ON_SHOW_WIDGET(CALLBACK) \
247 inline void bbUserOnShow() \
249 bbtkDebugMessageInc("wx",1,"**> Showing [" \
250 <<bbGetFullName()<<"]"<<std::endl); \
252 bbtkDebugMessageInc("wx",1,"<** Showing [" \
253 <<bbGetFullName()<<"]"<<std::endl); \
256 //======================================================================
258 //=================================================================
259 // WxBlackBoxDescriptor declaration
260 BBTK_BEGIN_DESCRIBE_BLACK_BOX(WxBlackBox,bbtk::AtomicBlackBox);
261 BBTK_NAME("WxBlackBox");
262 // BBTK_DESCRIPTION("Widget box. The inputs marked with (*) are only used if the widget is not inserted in another widget.\n");
263 BBTK_CATEGORY("widget");
264 BBTK_INPUT(WxBlackBox,WinTitle,
265 "Title of the window (*)",
267 BBTK_INPUT(WxBlackBox,WinWidth,
268 "Width of the window (* : only used if the widget is not connected to a Layout box)",int,"");
269 BBTK_INPUT(WxBlackBox,WinHeight,
270 "Height of the window (*)",int,"");
271 BBTK_INPUT(WxBlackBox,WinDialog,
272 "Set to 'true' to create a dialog window, i.e. which blocks the pipeline until it is closed (modal) (*)",bool,"");
273 BBTK_INPUT(WxBlackBox,WinHide,
274 "Any signal received hides the window (*)",Void,"signal");
275 BBTK_INPUT(WxBlackBox,WinClose,
276 "Any signal received closes the window (*)",Void,"signal");
277 BBTK_OUTPUT(WxBlackBox,Widget,"Output widget",wxWindow*,"");
278 BBTK_END_DESCRIBE_BLACK_BOX(WxBlackBox);
279 //=================================================================
289 //==================================================================
290 // The base of the hierarchy of windows associated to a WxBlackBox
291 class BBTK_EXPORT WxBlackBoxWindow //: public wxWindow
294 WxBlackBoxWindow(WxBlackBox::Pointer box);
295 virtual ~WxBlackBoxWindow();
296 virtual void bbShow();
297 virtual void bbHide();
298 virtual void bbClose();
299 bool bbIsShown() { return mShown; }
300 virtual WxBlackBox::Pointer bbGetBlackBox() { return mBox.lock(); }
301 virtual wxDialog* bbGetDialog() { return 0; }
302 virtual wxFrame* bbGetFrame() { return 0; }
304 WxBlackBox::WeakPointer mBox;
307 //==================================================================
309 //==================================================================
310 // Dialog window which is modal
311 class BBTK_EXPORT WxBlackBoxDialog : public wxDialog, public WxBlackBoxWindow
314 WxBlackBoxDialog(WxBlackBox::Pointer box,
315 wxWindow *parent, wxString title, wxSize size);
320 wxDialog* bbGetDialog() { return this; }
322 //==================================================================
324 //==================================================================
325 // Frame window which is not modal
326 class BBTK_EXPORT WxBlackBoxFrame : public wxFrame, public WxBlackBoxWindow
329 WxBlackBoxFrame(WxBlackBox::Pointer box,
330 wxWindow *parent, wxString title, wxSize size);
335 wxFrame* bbGetFrame() { return this; }
337 //==================================================================
341 //=================================================================
342 // Handles the destroy events of a widget associated to a WxBlackBox
343 // in order to signal the widget death to its associated box
344 class BBTK_EXPORT WxBlackBoxWidgetEventHandler : public wxEvtHandler
347 /// Ctor with the box and widget
348 WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box, wxWindow *widget );
350 ~WxBlackBoxWidgetEventHandler();
351 /// Returns true iff is the handler for that window
352 bool IsHandlerOf( wxWindow* w ) { return mWindow == w; }
353 // wxWindow* GetWxWindow() { return mWindow; }
354 /// Method processing the destroy event of the widget
355 void OnWindowDestroy(wxWindowDestroyEvent&);
357 //bool IsDead() { return mDead; }
360 WxBlackBox::WeakPointer mBox;
364 //=================================================================
370 #endif //__bbtkWxBlackBox_h__
372 #endif //_USE_WXWIDGETS_