1 /*=========================================================================
3 Module: $RCSfile: bbtkWxBlackBox.h,v $
5 Date: $Date: 2008/12/08 12:54:27 $
6 Version: $Revision: 1.22 $
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 //==================================================================
129 // LG 24/11/08 : New widget pipeline
130 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 //==================================================================
156 // For layout widgets : creates and returns the widget
157 // of the box connected to input in
158 wxWindow* bbCreateWidgetOfInput(const std::string& in, wxWindow* parent);
159 //==================================================================
162 //==================================================================
163 /// Main processing method of the box.
164 // No more overloaded
165 // virtual void bbBackwardUpdate( Connection::Pointer caller );
166 //==================================================================
170 //==================================================================
171 /// Overloaded processing method for WxBlackBoxes which handles
172 /// the window creation if needed
173 virtual void bbProcess();
174 //==================================================================
176 //==================================================================
177 /// If necessary creates the WxBlackBoxWindow associated to the box
179 /// (does nothing if the box output 'Widget' is connected which
180 /// means that the box does not have its own window but is contained
181 /// into another window)
183 /// Hides the WxBlackBoxWindow associated to the box (if exists)
185 /// Closes (destroys) the WxBlackBoxWindow associated to the box (if exists)
186 void bbCloseWindow();
187 //==================================================================
191 friend class WxBlackBoxWindow;
192 friend class WxBlackBoxWidgetEventHandler;
195 inline void bbSetWindow(Window* w) { bbmWindow=w; }
197 /// Sets the Widget Event Handler
198 inline void bbSetWidgetEventHandler(WxBlackBoxWidgetEventHandler* w)
199 { bbmWidgetEventHandler = w; }
200 /// Gets the Widget Event Handler
201 inline WxBlackBoxWidgetEventHandler* bbGetWidgetEventHandler()
202 { return bbmWidgetEventHandler; }
205 /// The WxBlackBoxWindow associated to the box
207 /// The WxBlackBoxWidgetEventHandler associated to the box
208 WxBlackBoxWidgetEventHandler* bbmWidgetEventHandler;
211 void bbInitAttributes();
216 /// For Forward update mechanism when execution is called
217 /// on a contained window
218 /// Is set to true before transfering update to parent
219 /// in order to not re-transfer a second time...
221 bool bbmUpdateTransferedToParent;
223 bool bbGetUpdateTransferedToParent() const { return bbmUpdateTransferedToParent; }
224 void bbSetUpdateTransferedToParent(bool b)
225 { bbmUpdateTransferedToParent = b; }
228 //=================================================================
231 //======================================================================
232 /// Defines the bbUserCreateWidget method
233 #define BBTK_CREATE_WIDGET(CALLBACK) \
235 inline void bbUserCreateWidget(wxWindow* parent) \
237 bbtkDebugMessageInc("wx",1,"**> Creating widget for [" \
238 <<bbGetFullName()<<"]"<<std::endl); \
240 bbtkDebugMessageInc("wx",1,"<** Creating widget for [" \
241 <<bbGetFullName()<<"]"<<std::endl); \
244 //======================================================================
246 //======================================================================
247 /// Defines the bbUserOnShow method
248 #define BBTK_ON_SHOW_WIDGET(CALLBACK) \
250 inline void bbUserOnShow() \
252 bbtkDebugMessageInc("wx",1,"**> Showing [" \
253 <<bbGetFullName()<<"]"<<std::endl); \
255 bbtkDebugMessageInc("wx",1,"<** Showing [" \
256 <<bbGetFullName()<<"]"<<std::endl); \
259 //======================================================================
261 //=================================================================
262 // WxBlackBoxDescriptor declaration
263 BBTK_BEGIN_DESCRIBE_BLACK_BOX(WxBlackBox,bbtk::AtomicBlackBox);
264 BBTK_NAME("WxBlackBox");
265 // BBTK_DESCRIPTION("Widget box. The inputs marked with (*) are only used if the widget is not inserted in another widget.\n");
266 BBTK_CATEGORY("widget");
267 BBTK_INPUT(WxBlackBox,WinTitle,
268 "Title of the window (*)",
270 BBTK_INPUT(WxBlackBox,WinWidth,
271 "Width of the window (* : only used if the widget is not connected to a Layout box)",int,"");
272 BBTK_INPUT(WxBlackBox,WinHeight,
273 "Height of the window (*)",int,"");
274 BBTK_INPUT(WxBlackBox,WinDialog,
275 "Set to 'true' to create a dialog window, i.e. which blocks the pipeline until it is closed (modal) (*)",bool,"");
276 BBTK_INPUT(WxBlackBox,WinHide,
277 "Any signal received hides the window (*)",Void,"signal");
278 BBTK_INPUT(WxBlackBox,WinClose,
279 "Any signal received closes the window (*)",Void,"signal");
280 BBTK_OUTPUT(WxBlackBox,Widget,"Output widget",wxWindow*,"");
281 BBTK_END_DESCRIBE_BLACK_BOX(WxBlackBox);
282 //=================================================================
292 //==================================================================
293 // The base of the hierarchy of windows associated to a WxBlackBox
294 class BBTK_EXPORT WxBlackBoxWindow //: public wxWindow
297 WxBlackBoxWindow(WxBlackBox::Pointer box);
298 virtual ~WxBlackBoxWindow();
299 virtual void bbShow();
300 virtual void bbHide();
301 virtual void bbClose();
302 bool bbIsShown() { return mShown; }
303 virtual WxBlackBox::Pointer bbGetBlackBox() { return mBox.lock(); }
304 virtual wxDialog* bbGetDialog() { return 0; }
305 virtual wxFrame* bbGetFrame() { return 0; }
307 WxBlackBox::WeakPointer mBox;
310 //==================================================================
312 //==================================================================
313 // Dialog window which is modal
314 class BBTK_EXPORT WxBlackBoxDialog : public wxDialog, public WxBlackBoxWindow
317 WxBlackBoxDialog(WxBlackBox::Pointer box,
318 wxWindow *parent, wxString title, wxSize size);
323 wxDialog* bbGetDialog() { return this; }
325 //==================================================================
327 //==================================================================
328 // Frame window which is not modal
329 class BBTK_EXPORT WxBlackBoxFrame : public wxFrame, public WxBlackBoxWindow
332 WxBlackBoxFrame(WxBlackBox::Pointer box,
333 wxWindow *parent, wxString title, wxSize size);
338 wxFrame* bbGetFrame() { return this; }
340 //==================================================================
344 //=================================================================
345 // Handles the destroy events of a widget associated to a WxBlackBox
346 // in order to signal the widget death to its associated box
347 class BBTK_EXPORT WxBlackBoxWidgetEventHandler : public wxEvtHandler
350 /// Ctor with the box and widget
351 WxBlackBoxWidgetEventHandler( WxBlackBox::Pointer box, wxWindow *widget );
353 ~WxBlackBoxWidgetEventHandler();
354 /// Returns true iff is the handler for that window
355 bool IsHandlerOf( wxWindow* w ) { return mWindow == w; }
356 // wxWindow* GetWxWindow() { return mWindow; }
357 /// Method processing the destroy event of the widget
358 void OnWindowDestroy(wxWindowDestroyEvent&);
360 //bool IsDead() { return mDead; }
363 WxBlackBox::WeakPointer mBox;
367 //=================================================================
373 #endif //__bbtkWxBlackBox_h__
375 #endif //_USE_WXWIDGETS_