]> Creatis software - crea.git/blob - src/creawxVTKRenderWindowInteractor.h
d0b90df118ebf30372847cfc518cb695d084b6f2
[crea.git] / src / creawxVTKRenderWindowInteractor.h
1 /*=========================================================================
2
3   Program:   Visualization Toolkit
4   Module:    $RCSfile: creawxVTKRenderWindowInteractor.h,v $
5   Language:  C++
6   Date:      $Date: 2010/01/22 19:16:54 $
7   Version:   $Revision: 1.3 $
8
9   Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
10   All rights reserved.
11   See Copyright.txt or http://www.kitware.com/Copyright.htm 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 notice for more information.
16
17 =========================================================================*/
18
19 // .NAME  creawxVTKRenderWindowInteractor - class to enable VTK to render to 
20 // and interact with wxWindow.
21 // .SECTION Description
22 //  creawxVTKRenderWindowInteractor provide a VTK widget for wxWindow. This class
23 // was completely rewrote to have the 'Look & Feel' of the python version:
24 // creawxVTKRenderWindowInteractor.py
25 // .SECTION Caveats 
26 //  - There is a know bug that prevent this class to works for more info see 
27 // WX_USE_X_CAPTURE. This bug only affect wxGTK from 2.3.2 to wxGTK 2.4.0.
28 //  - Furthermore this class is tempated over either wxWindows or wxGLCanvas,
29 // in wxWindows 2.3.1 and earlier, the wxGLCanvas had scroll bars, you can avoid
30 // this effect by playing with WX_BASE_CLASS at your risk (you might end up with
31 // lot of flickering.)
32 //  - This class might not be easily readable as it tried to work with VTK 3.2
33 //  and 4.x. This class doesn't support reparenting with VTK 4.2 and earlier.
34 // .SECTION see also
35 // creawxVTKRenderWindowInteractor.py creawxVTKRenderWindow.py
36
37 #ifndef _creawxVTKRenderWindowInteractor_h_
38 #define _creawxVTKRenderWindowInteractor_h_
39
40 #ifdef USE_WXWIDGETS
41 #ifdef USE_VTK
42
43 #include <creaSystem.h>
44 #include <creaWx.h>
45
46 /*
47 // For compilers that support precompilation, includes "wx/wx.h".
48 #include "wx/wxprec.h"
49
50 #ifdef __BORLANDC__
51 #  pragma hdrstop
52 #endif
53
54 #ifndef WX_PRECOMP
55 #include <wx/wx.h>
56 #endif
57 */
58 #include <wx/timer.h>
59 #include <wx/dcclient.h>
60
61 // vtk includes
62 #include "vtkRenderWindowInteractor.h"
63 #include "vtkRenderWindow.h"
64
65 // Apparently since wxGTK 2.8.0 one can finally use wxWindow (just as in any
66 // other port):
67 #if (!wxCHECK_VERSION(2, 8, 0))
68 #define USE_WXGLCANVAS
69 #endif
70
71
72 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
73 # if wxUSE_GLCANVAS
74 #    include <wx/glcanvas.h>
75 # else
76 #    error "problem of wxGLCanvas, you need to build wxWidgets with opengl"
77 # endif //wxUSE_GLCANVAS
78 #endif //__WXGTK__
79
80 // Motif version (renamed into wxX11 for wxWindow 2.4 and newer)
81 #if defined(__WXMOTIF__) 
82 # error This GUI is not supported by creawxVTKRenderWindowInteractor for now
83 #endif
84
85
86 // wx forward declarations
87 class wxPaintEvent;
88 class wxMouseEvent;
89 class wxTimerEvent;
90 class wxKeyEvent;
91 class wxSizeEvent;
92
93 //=======================================================================
94 // LG : NAMESPACE IS NECESSARY TO AVOID CONFLICTING SYMBOLS IN DYN LIBS
95 namespace crea
96 {
97
98
99 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
100 class CREA_EXPORT creawxVTKRenderWindowInteractor : public wxGLCanvas, virtual public vtkRenderWindowInteractor
101 #else
102 class CREA_EXPORT creawxVTKRenderWindowInteractor : virtual public vtkRenderWindowInteractor, public wxWindow
103 #endif //__WXGTK__
104 {
105   DECLARE_DYNAMIC_CLASS(creawxVTKRenderWindowInteractor)
106   
107   public:
108     //constructors
109     creawxVTKRenderWindowInteractor();
110
111     creawxVTKRenderWindowInteractor(wxWindow *parent,
112                                 wxWindowID id,
113                                 const wxPoint &pos = wxDefaultPosition,
114                                 const wxSize &size = wxDefaultSize,
115                                 long style = wxWANTS_CHARS | wxNO_FULL_REPAINT_ON_RESIZE,
116                                 const wxString &name = wxPanelNameStr);
117         //vtk ::New()
118     static creawxVTKRenderWindowInteractor * New();
119     void PrintSelf(ostream& os, vtkIndent indent);
120
121           //destructor
122     ~creawxVTKRenderWindowInteractor();
123
124 #if defined(_WIN32)
125     const char * creawxVTKRenderWindowInteractor::GetClassName() const;
126 #endif //_WIN32
127
128
129     // vtkRenderWindowInteractor overrides
130     void Initialize();
131     void Enable();
132     bool Enable(bool enable);
133     void Disable();
134     void Start();
135     void UpdateSize(int x, int y);
136     int CreateTimer(int timertype);
137     int DestroyTimer();
138     void TerminateApp() {};
139
140     // event handlers
141     void OnPaint(wxPaintEvent &event);
142     void OnEraseBackground (wxEraseEvent& event);
143     void OnMotion(wxMouseEvent &event);
144
145     void OnButtonDown(wxMouseEvent &event);
146     void OnButtonUp(wxMouseEvent &event);
147 #if !(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1)
148     void OnEnter(wxMouseEvent &event);
149     void OnLeave(wxMouseEvent &event);
150     void OnKeyDown(wxKeyEvent &event);
151     void OnKeyUp(wxKeyEvent &event);
152 #endif
153     void OnTimer(wxTimerEvent &event);
154     void OnSize(wxSizeEvent &event);
155     void OnMouseWheel(wxMouseEvent& event);
156
157     void Render();
158     void SetRenderWhenDisabled(int newValue);
159
160     // Description:
161     // Prescribe that the window be created in a stereo-capable mode. This
162     // method must be called before the window is realized. Default if off.
163     vtkGetMacro(Stereo,int);
164     vtkBooleanMacro(Stereo,int);
165     virtual void SetStereo(int capable);
166
167     // Description:
168     // As CaptureMouse could be a problem sometimes on a window box
169     // This method allow to set or not the CaptureMouse.
170     // This method actually will works only if WX_USE_X_CAPTURE was set to 1
171     vtkSetMacro(UseCaptureMouse,int);
172     vtkBooleanMacro(UseCaptureMouse,int);
173
174   protected:
175     wxTimer timer;
176     int ActiveButton;
177     int RenderAllowed;
178     long GetHandleHack();
179     int Stereo;
180     
181   private:
182     long Handle;
183     bool Created;
184     int RenderWhenDisabled;
185     int UseCaptureMouse;
186
187     DECLARE_EVENT_TABLE()
188 };
189
190
191 // LG : EO namespace crea
192 //======================================================================
193
194 #endif // USE_WX
195 #endif // USE_VTK
196 #endif //_creawxVTKRenderWindowInteractor_h_