#include "qrootcanvas.h"
#include <QDebug>
#include "TVirtualX.h"
QRootCanvas::QRootCanvas(QWidget *parent) : QWidget(parent)
{
    setAttribute(Qt::WA_PaintOnScreen,false);
    setAttribute(Qt::WA_OpaquePaintEvent,true);
    setAttribute(Qt::WA_NativeWindow,true);
    setUpdatesEnabled(kFALSE);
    setMouseTracking(kTRUE);
    setMinimumSize(300,200);
    timer=new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(handleRootEvents()));
    timer->start(100);
    fCanvas=new TCanvas("canvas",width(),height(),gVirtualX->AddWindow(ULong_t(winId()),UInt_t(width()),UInt_t(height())));
    fCanvas->cd();


}

QRootCanvas::~QRootCanvas()
{
    delete fCanvas;
}

void QRootCanvas::handleRootEvents()
{
    gSystem->ProcessEvents();
}

void QRootCanvas::mouseMoveEvent(QMouseEvent *e)
{
    if (fCanvas) {
       switch (e->button()) {
          case Qt::LeftButton :
             fCanvas->HandleInput(kButton1Motion, e->x(), e->y());
             break;
          case Qt::MidButton :
             fCanvas->HandleInput(kButton2Motion, e->x(), e->y());
             break;
          case Qt::RightButton :
             fCanvas->HandleInput(kButton3Motion, e->x(), e->y());
             break;
          default:
             break;
       }
    }
}

void QRootCanvas::mousePressEvent(QMouseEvent *e)
{
    if (fCanvas) {
       switch (e->button()) {
          case Qt::LeftButton :
             fCanvas->HandleInput(kButton1Down, e->x(), e->y());
             break;
          case Qt::MidButton :
             fCanvas->HandleInput(kButton2Down, e->x(), e->y());
             break;
          case Qt::RightButton :
             // does not work properly on Linux...
             // ...adding setAttribute(Qt::WA_PaintOnScreen, true)
             // seems to cure the problem
             fCanvas->HandleInput(kButton3Down, e->x(), e->y());
             break;
          default:
             break;
       }
    }
}

void QRootCanvas::mouseReleaseEvent(QMouseEvent *e)
{
    if (fCanvas) {
       switch (e->button()) {
          case Qt::LeftButton :
             fCanvas->HandleInput(kButton1Up, e->x(), e->y());
             break;
          case Qt::MidButton :
             fCanvas->HandleInput(kButton2Up, e->x(), e->y());
             break;
          case Qt::RightButton :
             // does not work properly on Linux...
             // ...adding setAttribute(Qt::WA_PaintOnScreen, true)
             // seems to cure the problem
             fCanvas->HandleInput(kButton3Up, e->x(), e->y());
             break;
          default:
             break;
       }
    }
}

void QRootCanvas::paintEvent(QPaintEvent *)
{
    if(fCanvas){
        fCanvas->Resize();
        fCanvas->Update();
    }
}

void QRootCanvas::resizeEvent(QResizeEvent *e)
{
    if(fCanvas){
        fCanvas->SetCanvasSize(UInt_t(e->size().width()),UInt_t(e->size().height()));
        fCanvas->Resize();
        fCanvas->Update();
    }
}