--- /dev/null
+#ifndef __cpExtensions__Interaction__BaseStyle__h__
+#define __cpExtensions__Interaction__BaseStyle__h__
+
+#include <cpExtensions/Config.h>
+#include <vtkInteractorStyle.h>
+#include <map>
+
+// -------------------------------------------------------------------------
+#define cpExtensions_BaseStyle_Commands( C ) \
+ protected: \
+ std::map< T##C##Command, void* > m_##C##Commands; \
+ public: \
+ inline void Add##C##Command( T##C##Command c, void* d ) \
+ { \
+ if( c != NULL ) \
+ { \
+ this->m_##C##Commands[ c ] = d; \
+ this->Modified( ); \
+ } \
+ } \
+ inline void Remove##C##Command( T##C##Command c ) \
+ { \
+ std::map< T##C##Command, void* >::iterator i = \
+ this->m_##C##Commands.find( c ); \
+ if( i != this->m_##C##Commands.end( ) ) \
+ { \
+ this->m_##C##Commands.erase( i ); \
+ this->Modified( ); \
+ } \
+ }
+
+// -------------------------------------------------------------------------
+namespace cpExtensions
+{
+ namespace Interaction
+ {
+ /**
+ */
+ class cpExtensions_EXPORT BaseStyle
+ : public vtkInteractorStyle
+ {
+ public:
+ typedef BaseStyle Self;
+ vtkTypeMacro( BaseStyle, vtkInteractorStyle );
+
+ enum ButtonID
+ {
+ ButtonID_None = 0,
+ ButtonID_Left,
+ ButtonID_Middle,
+ ButtonID_Right
+ };
+
+ // Callbacks types
+ typedef void ( *TMouseCommand )(
+ void*, const ButtonID&, int*, double*, bool, bool, bool
+ );
+ typedef TMouseCommand TMouseClickCommand;
+ typedef TMouseCommand TMouseDoubleClickCommand;
+
+ // Associate callbacks for each event
+ cpExtensions_BaseStyle_Commands( MouseClick );
+ cpExtensions_BaseStyle_Commands( MouseDoubleClick );
+
+ public:
+ static void SetSetDoubleClickDelay( long delay );
+ void DelegateTDxEvent( unsigned long event, void* calldata );
+
+ // Possible mouse motion events
+ virtual void OnMouseMove( ) cpExtensions_OVERRIDE;
+ virtual void OnMouseWheelForward( ) cpExtensions_OVERRIDE { }
+ virtual void OnMouseWheelBackward( ) cpExtensions_OVERRIDE { }
+
+ // Possible mouse click-related events
+ inline ButtonID GetButtonID( ) const { return( this->m_ActiveButton ); }
+
+ virtual void OnLeftButtonDown( ) cpExtensions_OVERRIDE;
+ virtual void OnLeftButtonUp( ) cpExtensions_OVERRIDE;
+ virtual void OnMiddleButtonDown( ) cpExtensions_OVERRIDE;
+ virtual void OnMiddleButtonUp( ) cpExtensions_OVERRIDE;
+ virtual void OnRightButtonDown( ) cpExtensions_OVERRIDE;
+ virtual void OnRightButtonUp( ) cpExtensions_OVERRIDE;
+
+ virtual void OnLeftClick( );
+ virtual void OnLeftDoubleClick( );
+ virtual void OnMiddleClick( );
+ virtual void OnMiddleDoubleClick( );
+ virtual void OnRightClick( );
+ virtual void OnRightDoubleClick( );
+
+ // Keyboard-related events
+ virtual void OnChar( ) cpExtensions_OVERRIDE { }
+ virtual void OnKeyDown( ) cpExtensions_OVERRIDE { }
+ virtual void OnKeyUp( ) cpExtensions_OVERRIDE { }
+ virtual void OnKeyPress( ) cpExtensions_OVERRIDE { }
+ virtual void OnKeyRelease( ) cpExtensions_OVERRIDE { }
+
+ // Other events
+ virtual void OnExpose( ) cpExtensions_OVERRIDE { }
+ virtual void OnConfigure( ) cpExtensions_OVERRIDE { }
+ virtual void OnEnter( ) cpExtensions_OVERRIDE { }
+ virtual void OnLeave( ) cpExtensions_OVERRIDE { }
+
+ virtual void Dolly( ) cpExtensions_OVERRIDE;
+ virtual void Pan( ) cpExtensions_OVERRIDE;
+
+ protected:
+ BaseStyle( );
+ virtual ~BaseStyle( );
+
+ virtual void _Dolly( double factor );
+
+ // Extension interface
+ virtual bool _PickPosition( int idx[ 2 ], double pos[ 3 ] ) = 0;
+
+ // Main event callback
+ static void _ProcessEvents(
+ vtkObject* object,
+ unsigned long event,
+ void* clientdata,
+ void* calldata
+ );
+
+ private:
+ // Purposely not implemented
+ BaseStyle( const Self& );
+ Self& operator=( const Self& );
+
+ protected:
+ double m_MotionFactor;
+
+ /**
+ * Button events
+ */
+ struct _TMouseButtonEvent
+ {
+ static long MaxDoubleClick;
+ long m_LastButtonUp;
+ long m_LastButtonHeld;
+ long m_LastButtonDown;
+
+ inline _TMouseButtonEvent( )
+ { this->Reset( ); }
+ inline void Reset( )
+ {
+ this->m_LastButtonUp = 0;
+ this->m_LastButtonHeld = 0;
+ this->m_LastButtonDown = -1;
+ }
+ inline void Release( )
+ {
+ /* TODO
+ long c = cpExtensions_CHRONO;
+ this->m_LastButtonUp = c;
+ this->m_LastButtonHeld = c - this->m_LastButtonDown;
+ this->m_LastButtonDown = -1;
+ */
+ }
+ inline unsigned char Clicks( )
+ {
+ /* TODO
+ unsigned char n = 0;
+ long c = cpExtensions_CHRONO;
+ if(
+ this->m_LastButtonHeld < MaxDoubleClick &&
+ ( c - this->m_LastButtonUp ) < MaxDoubleClick
+ )
+ {
+ this->Reset( );
+ n = 2;
+ }
+ else
+ n = 1;
+ if( this->m_LastButtonDown < 0 )
+ this->m_LastButtonDown = c;
+ return( n );
+ */
+ return( 1 );
+ }
+ };
+ _TMouseButtonEvent m_LeftButtonEvent;
+ _TMouseButtonEvent m_MiddleButtonEvent;
+ _TMouseButtonEvent m_RightButtonEvent;
+ ButtonID m_ActiveButton;
+ };
+
+ } // ecapseman
+
+} // ecapseman
+
+#endif // __cpExtensions__Interaction__BaseStyle__h__
+
+// eof - $RCSfile$