#ifndef ImageRenderWidget_H
#define ImageRenderWidget_H

#include <QWidget>
#include <QMap>
#include <QPoint>

class QImage;
class QRect;
class QSize;
class QKeyEvent;
class QWheelEvent;
class QMouseEvent;
class KeyEvent;
class MouseEvent;
class ClientSocket;


class ImageRenderWidget : public QWidget
{
    Q_OBJECT
public:
    ImageRenderWidget(QWidget *parent = 0);
    ~ImageRenderWidget();
    void setCurrentConnection( ClientSocket *conn );

public slots:
    void updateImage( );
    void handleFramebufferResize( const QSize &size );
    void listenForEvents( bool listen );
    void enableNativeKeySyms();
    void enableRelativePointer();

signals:
    void gotKeyEvent( const KeyEvent &event );
    void gotNativeKeyEvent( const KeyEvent &event );
    void gotMouseEvent( const MouseEvent &event );
    void mergeFramebufferChange( const QRect &area, const QImage &img );
    void framebufferResize( const QSize &size );

protected:
    virtual bool event( QEvent *event );
    virtual bool eventFilter(QObject *obj, QEvent *event);
    virtual void keyPressEvent ( QKeyEvent * event );
    virtual void keyReleaseEvent ( QKeyEvent * event );
    virtual void mouseMoveEvent ( QMouseEvent * event );
    virtual void mousePressEvent ( QMouseEvent * event );
    virtual void mouseReleaseEvent ( QMouseEvent * event );
    virtual void mouseDoubleClickEvent ( QMouseEvent * event );
    virtual void wheelEvent ( QWheelEvent * event );
    virtual void enterEvent ( QEvent * event );
    virtual void leaveEvent ( QEvent * event );

private:
    void processMouseEvent( QMouseEvent *event );
    void translateKeyEvent( QKeyEvent *event );
    void translateNativeKeyEvent( QKeyEvent *event );
    void unpressModifiers();
    QPoint accelerate( const QPoint &pos ) const;
    bool toggleMouseGrab(QKeyEvent *event);
    void toggleMouseGrab( );
    bool shouldCaptureEvent();
    QPoint moveMouse( const QPoint &newPoint );

private:
    QMap<quint32,bool> m_mods;
    QPoint m_lastPos;
    bool m_listening;
    bool m_isMouseGrabbed;
    bool m_useNativeKeySyms;
    bool m_useRelativePointer;

    static const quint8 m_keyCodeMap[61];
    ClientSocket *m_connection;
    QWidget *m_view;
    QImage m_fb;
};

#endif // ImageRenderWidget_H

