1 /*=========================================================================
3 Program: Visualization Toolkit
4 Module: $RCSfile: creawxVTKRenderWindowInteractor.cxx,v $
6 Date: $Date: 2008/12/11 14:27:00 $
7 Version: $Revision: 1.2 $
9 Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen
11 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
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.
17 =========================================================================*/
21 #include "creawxVTKRenderWindowInteractor.h"
23 //This is needed for vtk 3.1 :
24 #ifndef VTK_MAJOR_VERSION
25 # include "vtkVersion.h"
28 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
29 # include "vtkCommand.h"
31 # include "vtkInteractorStyle.h"
36 //Keep this for compatibilty reason, this was introduced in wxGTK 2.4.0
37 #if (!wxCHECK_VERSION(2, 4, 0))
38 wxWindow* wxGetTopLevelParent(wxWindow *win)
40 while ( win && !win->IsTopLevel() )
41 win = win->GetParent();
46 //=======================================================================
48 // To access objc calls on cocoa
51 #import <Cocoa/Cocoa.h>
52 // This trick is no longer need in VTK CVS, should get rid of that:
55 #error Build mismatch you need both wxWidgets and VTK to be configure against Cocoa to work
56 #endif //VTK_USE_COCOA
60 # include <gdk/gdkx.h> // GDK_WINDOW_XWINDOW is found here in wxWidgets 2.8.0
61 # include "gdk/gdkprivate.h"
63 #include <wx/gtk/win_gtk.h>
65 #include <wx/gtk1/win_gtk.h>
67 #define GetXWindow(wxwin) (wxwin)->m_wxwindow ? \
68 GDK_WINDOW_XWINDOW(GTK_PIZZA((wxwin)->m_wxwindow)->bin_window) : \
69 GDK_WINDOW_XWINDOW((wxwin)->m_widget->window)
73 #include "wx/x11/privx.h"
74 #define GetXWindow(wxwin) ((Window)(wxwin)->GetHandle())
78 //For more info on this class please go to:
80 //This hack is for some buggy wxGTK version:
81 #if wxCHECK_VERSION(2, 3, 2) && !wxCHECK_VERSION(2, 4, 1) && defined(__WXGTK__)
82 # define WX_USE_X_CAPTURE 0
84 # define WX_USE_X_CAPTURE 1
87 #define ID_creawxVTKRenderWindowInteractor_TIMER 1001
92 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
93 IMPLEMENT_DYNAMIC_CLASS(creawxVTKRenderWindowInteractor, wxGLCanvas)
95 IMPLEMENT_DYNAMIC_CLASS(creawxVTKRenderWindowInteractor, wxWindow)
98 //---------------------------------------------------------------------------
99 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
100 BEGIN_EVENT_TABLE(creawxVTKRenderWindowInteractor, wxGLCanvas)
102 BEGIN_EVENT_TABLE(creawxVTKRenderWindowInteractor, wxWindow)
104 //refresh window by doing a Render
105 EVT_PAINT (creawxVTKRenderWindowInteractor::OnPaint)
106 EVT_ERASE_BACKGROUND(creawxVTKRenderWindowInteractor::OnEraseBackground)
107 EVT_MOTION (creawxVTKRenderWindowInteractor::OnMotion)
109 //Bind the events to the event converters
110 EVT_LEFT_DOWN (creawxVTKRenderWindowInteractor::OnButtonDown)
111 EVT_MIDDLE_DOWN (creawxVTKRenderWindowInteractor::OnButtonDown)
112 EVT_RIGHT_DOWN (creawxVTKRenderWindowInteractor::OnButtonDown)
113 EVT_LEFT_UP (creawxVTKRenderWindowInteractor::OnButtonUp)
114 EVT_MIDDLE_UP (creawxVTKRenderWindowInteractor::OnButtonUp)
115 EVT_RIGHT_UP (creawxVTKRenderWindowInteractor::OnButtonUp)
116 #if !(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1)
117 EVT_ENTER_WINDOW(creawxVTKRenderWindowInteractor::OnEnter)
118 EVT_LEAVE_WINDOW(creawxVTKRenderWindowInteractor::OnLeave)
119 EVT_MOUSEWHEEL (creawxVTKRenderWindowInteractor::OnMouseWheel)
120 // If we use EVT_KEY_DOWN instead of EVT_CHAR, capital versions
121 // of all characters are always returned. EVT_CHAR also performs
122 // other necessary keyboard-dependent translations.
123 //EVT_KEY_DOWN (creawxVTKRenderWindowInteractor::OnKeyDown)
124 EVT_CHAR (creawxVTKRenderWindowInteractor::OnKeyDown)
125 EVT_KEY_UP (creawxVTKRenderWindowInteractor::OnKeyUp)
127 EVT_TIMER (ID_creawxVTKRenderWindowInteractor_TIMER, creawxVTKRenderWindowInteractor::OnTimer)
128 EVT_SIZE (creawxVTKRenderWindowInteractor::OnSize)
131 //---------------------------------------------------------------------------
132 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
133 creawxVTKRenderWindowInteractor::creawxVTKRenderWindowInteractor() : vtkRenderWindowInteractor(), wxGLCanvas()
135 creawxVTKRenderWindowInteractor::creawxVTKRenderWindowInteractor() : vtkRenderWindowInteractor(), wxWindow()
137 , timer(this, ID_creawxVTKRenderWindowInteractor_TIMER)
138 , ActiveButton(wxEVT_NULL)
143 , RenderWhenDisabled(1)
147 this->RenderWindow = NULL;
148 this->SetRenderWindow(vtkRenderWindow::New());
149 this->RenderWindow->Delete();
151 //this->SetBackgroundColour( wxColour(255,0,255) );
153 //---------------------------------------------------------------------------
154 creawxVTKRenderWindowInteractor::creawxVTKRenderWindowInteractor(wxWindow *parent,
159 const wxString &name)
160 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
161 : vtkRenderWindowInteractor(), wxGLCanvas(parent, id, pos, size, style, name)
163 : vtkRenderWindowInteractor(), wxWindow(parent, id, pos, size, style, name)
165 , timer(this, ID_creawxVTKRenderWindowInteractor_TIMER)
166 , ActiveButton(wxEVT_NULL)
171 , RenderWhenDisabled(1)
175 this->RenderWindow = NULL;
176 this->SetRenderWindow(vtkRenderWindow::New());
177 this->RenderWindow->Delete();
179 // this->SetBackgroundColour( wxColour(255,0,0) );
181 //---------------------------------------------------------------------------
182 creawxVTKRenderWindowInteractor::~creawxVTKRenderWindowInteractor()
184 // LG : trompe la mort !
185 SetRenderWindow(NULL);
186 SetReferenceCount(0);
188 //---------------------------------------------------------------------------
189 creawxVTKRenderWindowInteractor * creawxVTKRenderWindowInteractor::New()
191 // we don't make use of the objectfactory, because we're not registered
192 return new creawxVTKRenderWindowInteractor;
194 //---------------------------------------------------------------------------
195 void creawxVTKRenderWindowInteractor::Initialize()
197 int *size = RenderWindow->GetSize();
198 // enable everything and start rendering
200 //RenderWindow->Start();
202 // set the size in the render window interactor
206 // this is initialized
209 //---------------------------------------------------------------------------
210 void creawxVTKRenderWindowInteractor::Enable()
212 // if already enabled then done
218 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
223 //---------------------------------------------------------------------------
224 bool creawxVTKRenderWindowInteractor::Enable(bool enable)
226 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
227 return wxGLCanvas::Enable(enable);
229 return wxWindow::Enable(enable);
232 //---------------------------------------------------------------------------
233 void creawxVTKRenderWindowInteractor::Disable()
235 // if already disabled then done
239 // that's it (we can't remove the event handler like it should be...)
243 //---------------------------------------------------------------------------
244 void creawxVTKRenderWindowInteractor::Start()
246 // the interactor cannot control the event loop
247 vtkErrorMacro( << "creawxVTKRenderWindowInteractor::Start() "
248 "interactor cannot control event loop.");
250 //---------------------------------------------------------------------------
251 void creawxVTKRenderWindowInteractor::UpdateSize(int x, int y)
255 // if the size changed tell render window
256 if ( x != Size[0] || y != Size[1] )
258 // adjust our (vtkRenderWindowInteractor size)
261 // and our RenderWindow's size
262 RenderWindow->SetSize(x, y);
266 //---------------------------------------------------------------------------
267 int creawxVTKRenderWindowInteractor::CreateTimer(int WXUNUSED(timertype))
269 // it's a one shot timer
270 if (!timer.Start(10, TRUE))
276 //---------------------------------------------------------------------------
277 int creawxVTKRenderWindowInteractor::DestroyTimer()
282 //---------------------------------------------------------------------------
283 void creawxVTKRenderWindowInteractor::OnTimer(wxTimerEvent& WXUNUSED(event))
288 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
290 InvokeEvent(vtkCommand::TimerEvent, NULL);
293 InteractorStyle->OnTimer();
297 //---------------------------------------------------------------------------
298 // NOTE on implementation:
299 // Bad luck you ended up in the only tricky place of this code.
300 // A few note, wxWidgets still refuse to provide such convenient method
301 // so I have to maintain it myself, eventhough this is completely integrated
303 // Anyway if this happen to break for you then compare to a recent version of wxPython
304 // and look for the function long wxPyGetWinHandle(wxWindow* win)
305 // in wxPython/src/helpers.cpp
306 long creawxVTKRenderWindowInteractor::GetHandleHack()
308 //helper function to hide the MSW vs GTK stuff
311 // __WXMSW__ is for Win32
312 //__WXMAX__ stands for using Carbon C-headers, using either the CarbonLib/CFM or the native Mach-O builds (which then also use the latest features available)
313 // __WXGTK__ is for both gtk 1.2.x and gtk 2.x
314 #if defined(__WXMSW__) || defined(__WXMAC__)
315 handle_tmp = (long)this->GetHandle();
318 //__WXCOCOA__ stands for using the objective-c Cocoa API
320 // Here is how to find the NSWindow
321 wxTopLevelWindow* toplevel = dynamic_cast<wxTopLevelWindow*>(
322 wxGetTopLevelParent( this ) );
323 if (toplevel != NULL )
325 handle_tmp = (long)toplevel->GetNSWindow();
327 // The NSView will be deducted from
328 // [(NSWindow*)Handle contentView]
329 // if only I knew how to write that in c++
332 // Find and return the actual X-Window.
333 #if defined(__WXGTK__) || defined(__WXX11__)
334 return (long)GetXWindow(this);
338 // handle_tmp = (long)this->GetXWindow();
343 //---------------------------------------------------------------------------
344 void creawxVTKRenderWindowInteractor::OnPaint(wxPaintEvent& WXUNUSED(event))
347 //must always be here
350 //do it here rather than in the cstor: this is safer.
353 Handle = GetHandleHack();
354 RenderWindow->SetWindowId(reinterpret_cast<void *>(Handle));
356 RenderWindow->SetParentId(reinterpret_cast<void *>(this->GetParent()->GetHWND()));
359 // get vtk to render to the wxWindows
360 //bbtkDebugMessage("Wx",9,"creawxVTKRenderWindowInteractor::OnPaint"<<std::endl);
361 //std::cout << "creawxVTKRenderWindowInteractor::OnPaint"<<std::endl;
364 #if defined(__WXGTK__) && defined(USE_WXGLCANVAS)
365 // bbtkDebugMessage("Core",9,"creawxVTKRenderWindowInteractor::OnPaint public wxGLCanvas, virtual public vtkRenderWindowInteractor \n");
367 // bbtkDebugMessage("Core",9,"creawxVTKRenderWindowInteractor::OnPaint public wxWindow, virtual public vtkRenderWindowInteractor \n");
371 //---------------------------------------------------------------------------
372 void creawxVTKRenderWindowInteractor::OnEraseBackground(wxEraseEvent &event)
374 //printf("EED creawxVTKRenderWindowInteractor::OnEraseBackground \n");
375 //turn off background erase to reduce flickering on MSW
378 //---------------------------------------------------------------------------
379 void creawxVTKRenderWindowInteractor::OnSize(wxSizeEvent& WXUNUSED(event))
382 GetClientSize(&w, &h);
390 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
391 InvokeEvent(vtkCommand::ConfigureEvent, NULL);
393 //this will check for Handle
396 //---------------------------------------------------------------------------
397 void creawxVTKRenderWindowInteractor::OnMotion(wxMouseEvent &event)
404 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
405 SetEventInformationFlipY(event.GetX(), event.GetY(),
406 event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
408 InvokeEvent(vtkCommand::MouseMoveEvent, NULL);
410 InteractorStyle->OnMouseMove(event.ControlDown(), event.ShiftDown(),
411 event.GetX(), Size[1] - event.GetY() - 1);
414 //---------------------------------------------------------------------------
415 #if !(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1)
416 void creawxVTKRenderWindowInteractor::OnEnter(wxMouseEvent &event)
423 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
425 SetEventInformationFlipY(event.GetX(), event.GetY(),
426 event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
428 InvokeEvent(vtkCommand::EnterEvent, NULL);
431 InteractorStyle->OnEnter(event.ControlDown(), event.ShiftDown(),
432 event.GetX(), Size[1] - event.GetY() - 1);
435 //---------------------------------------------------------------------------
436 void creawxVTKRenderWindowInteractor::OnLeave(wxMouseEvent &event)
443 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
445 SetEventInformationFlipY(event.GetX(), event.GetY(),
446 event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
448 InvokeEvent(vtkCommand::LeaveEvent, NULL);
451 InteractorStyle->OnLeave(event.ControlDown(), event.ShiftDown(),
452 event.GetX(), Size[1] - event.GetY() - 1);
455 //---------------------------------------------------------------------------
456 void creawxVTKRenderWindowInteractor::OnKeyDown(wxKeyEvent &event)
463 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
465 int keycode = event.GetKeyCode();
469 // TODO: Unicode in non-Unicode mode ??
473 SetEventInformationFlipY(event.GetX(), event.GetY(),
474 event.ControlDown(), event.ShiftDown(), key, 0, NULL);
476 InvokeEvent(vtkCommand::KeyPressEvent, NULL);
477 InvokeEvent(vtkCommand::CharEvent, NULL);
479 InteractorStyle->OnKeyDown(event.ControlDown(), event.ShiftDown(),
480 event.GetKeyCode(), 1);
484 //---------------------------------------------------------------------------
485 void creawxVTKRenderWindowInteractor::OnKeyUp(wxKeyEvent &event)
492 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
494 int keycode = event.GetKeyCode();
498 // TODO: Unicode in non-Unicode mode ??
502 SetEventInformationFlipY(event.GetX(), event.GetY(),
503 event.ControlDown(), event.ShiftDown(), key, 0, NULL);
504 InvokeEvent(vtkCommand::KeyReleaseEvent, NULL);
506 InteractorStyle->OnKeyUp(event.ControlDown(), event.ShiftDown(),
507 event.GetKeyCode(), 1);
511 #endif //!(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1)
512 //---------------------------------------------------------------------------
513 void creawxVTKRenderWindowInteractor::OnButtonDown(wxMouseEvent &event)
515 if (!Enabled || (ActiveButton != wxEVT_NULL))
519 ActiveButton = event.GetEventType();
521 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
522 SetEventInformationFlipY(event.GetX(), event.GetY(),
523 event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
526 if(event.RightDown())
528 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
530 InvokeEvent(vtkCommand::RightButtonPressEvent, NULL);
533 InteractorStyle->OnRightButtonDown(event.ControlDown(), event.ShiftDown(),
534 event.GetX(), Size[1] - event.GetY() - 1);
537 else if(event.LeftDown())
539 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
541 InvokeEvent(vtkCommand::LeftButtonPressEvent, NULL);
544 InteractorStyle->OnLeftButtonDown(event.ControlDown(), event.ShiftDown(),
545 event.GetX(), Size[1] - event.GetY() - 1);
548 else if(event.MiddleDown())
550 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
552 InvokeEvent(vtkCommand::MiddleButtonPressEvent, NULL);
555 InteractorStyle->OnMiddleButtonDown(event.ControlDown(), event.ShiftDown(),
556 event.GetX(), Size[1] - event.GetY() - 1);
559 //save the button and capture mouse until the button is released
561 //1. it is possible (WX_USE_X_CAPTURE)
562 //2. user decided to.
563 if ((ActiveButton != wxEVT_NULL) && WX_USE_X_CAPTURE && UseCaptureMouse)
568 //---------------------------------------------------------------------------
569 void creawxVTKRenderWindowInteractor::OnButtonUp(wxMouseEvent &event)
571 //EVT_xxx_DOWN == EVT_xxx_UP - 1
572 //This is only needed if two mouse buttons are pressed at the same time.
573 //In wxWindows 2.4 and later: better use of wxMOUSE_BTN_RIGHT or
574 //wxEVT_COMMAND_RIGHT_CLICK
575 if (!Enabled || (ActiveButton != (event.GetEventType()-1)))
580 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
581 SetEventInformationFlipY(event.GetX(), event.GetY(),
582 event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
585 if(ActiveButton == wxEVT_RIGHT_DOWN)
587 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
589 InvokeEvent(vtkCommand::RightButtonReleaseEvent, NULL);
592 InteractorStyle->OnRightButtonUp(event.ControlDown(), event.ShiftDown(),
593 event.GetX(), Size[1] - event.GetY() - 1);
596 else if(ActiveButton == wxEVT_LEFT_DOWN)
598 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
600 InvokeEvent(vtkCommand::LeftButtonReleaseEvent, NULL);
603 InteractorStyle->OnLeftButtonUp(event.ControlDown(), event.ShiftDown(),
604 event.GetX(), Size[1] - event.GetY() - 1);
607 else if(ActiveButton == wxEVT_MIDDLE_DOWN)
609 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0)
611 InvokeEvent(vtkCommand::MiddleButtonReleaseEvent, NULL);
614 InteractorStyle->OnMiddleButtonUp(event.ControlDown(), event.ShiftDown(),
615 event.GetX(), Size[1] - event.GetY() - 1);
618 //if the ActiveButton is realeased, then release mouse capture
619 if ((ActiveButton != wxEVT_NULL) && WX_USE_X_CAPTURE && UseCaptureMouse)
623 ActiveButton = wxEVT_NULL;
625 //---------------------------------------------------------------------------
626 void creawxVTKRenderWindowInteractor::OnMouseWheel(wxMouseEvent& event)
628 // Mouse wheel was only added after VTK 4.4 (I think...)
629 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 2)
631 //Set vtk event information ... The numebr of wheel rotations is stored in
632 //the x varible. y varible is zero
633 SetEventInformationFlipY(event.GetWheelRotation() / event.GetWheelDelta(), 0,
634 event.ControlDown(), event.ShiftDown(), '\0', 0, NULL);
635 if(event.GetWheelRotation() > 0)
639 // InvokeEvent(vtkCommand::MouseWheelForwardEvent, NULL);
645 // InvokeEvent(vtkCommand::MouseWheelBackwardEvent, NULL);
651 //---------------------------------------------------------------------------
652 void creawxVTKRenderWindowInteractor::Render()
655 if (!RenderWhenDisabled)
657 //the user doesn't want us to render when the toplevel frame
658 //is disabled - first find the top level parent
659 wxWindow *topParent = wxGetTopLevelParent(this);
662 //if it exists, check whether it's enabled
663 //if it's not enabeld, RenderAllowed will be false
664 RenderAllowed = topParent->IsEnabled();
670 if(Handle && (Handle == GetHandleHack()) )
672 RenderWindow->Render();
674 #if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 2)
675 else if(GetHandleHack())
677 //this means the user has reparented us; let's adapt to the
678 //new situation by doing the WindowRemap dance
679 //store the new situation
680 Handle = GetHandleHack();
681 RenderWindow->SetNextWindowId(reinterpret_cast<void *>(Handle));
682 RenderWindow->WindowRemap();
683 RenderWindow->Render();
688 //---------------------------------------------------------------------------
689 void creawxVTKRenderWindowInteractor::SetRenderWhenDisabled(int newValue)
691 //Change value of __RenderWhenDisabled ivar.
692 //If __RenderWhenDisabled is false (the default), this widget will not
693 //call Render() on the RenderWindow if the top level frame (i.e. the
694 //containing frame) has been disabled.
696 //This prevents recursive rendering during wxSafeYield() calls.
697 //wxSafeYield() can be called during the ProgressMethod() callback of
698 //a VTK object to have progress bars and other GUI elements updated -
699 //it does this by disabling all windows (disallowing user-input to
700 //prevent re-entrancy of code) and then handling all outstanding
703 //However, this often triggers an OnPaint() method for creawxVTKRWIs,
704 //resulting in a Render(), resulting in Update() being called whilst
707 RenderWhenDisabled = (bool)newValue;
709 //---------------------------------------------------------------------------
711 // Set the variable that indicates that we want a stereo capable window
712 // be created. This method can only be called before a window is realized.
714 void creawxVTKRenderWindowInteractor::SetStereo(int capable)
716 if (Stereo != capable)
719 RenderWindow->StereoCapableWindowOn();
720 RenderWindow->SetStereoTypeToCrystalEyes();
725 //---------------------------------------------------------------------------
728 void creawxVTKRenderWindowInteractor::PrintSelf(ostream& os, vtkIndent indent)
730 this->Superclass::PrintSelf(os, indent);
735 const char * creawxVTKRenderWindowInteractor::GetClassName() const
737 return "creawxVTKRenderWindowInteractor";
743 //=======================================================================