/***************************************************************************
 *   Copyright (C) 2005 by Ian Reinhart Geiser                             *
 *   geiseri@sourcextreme.com                                              *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include "dhwwidget.h"
#include "dhwpage.h"

#include <QPainter>
#include <QRubberBand>
#include <QMouseEvent>
#include <QApplication>
#include <QCursor>
#include <QTimer>

#include <qdebug.h>

DHWWidget::DHWWidget( QWidget *parent ) :
QFrame(parent), mPage(0), mCurrentLayer(0), mAntialiased(false), mRubberBand(0), mInDrag(false)
{
	
	mRepaintTimer = new QTimer(this);
	mRepaintTimer->setSingleShot ( true );
	connect(mRepaintTimer, SIGNAL( timeout()), SLOT( updateImage() ));
	
	
	setMouseTracking ( true );
	setFocusPolicy(Qt::StrongFocus);
	updateImage(true);
}

DHWWidget::~DHWWidget()
{

}

void DHWWidget::setPage( DHWPage *page )
{
	resetSelection();
	mPage = page;
	updateImage(true);
}

DHWPage *DHWWidget::page()
{
	return mPage;
}

int DHWWidget::currentLayer() const
{
	return mCurrentLayer;
}

void DHWWidget::setCurrentLayer( int currentLayer)
{
	if( mPage )
		if(mPage->layers() < currentLayer )
			mCurrentLayer = currentLayer;
		else
			mCurrentLayer = mPage->layers() - 1;
}

void DHWWidget::updateImage( bool fast )
{
	
	m_cacheImage = QImage( size(), QImage::Format_ARGB32_Premultiplied );
	if( m_cacheImage.isNull() )
		return;
	QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));

	QPainter painter(&m_cacheImage);
	painter.setPen( QPen(Qt::black, 12, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ) );
	painter.setBrush(Qt::white);
	painter.setRenderHint(QPainter::Antialiasing, mAntialiased);
	painter.fillRect(frameRect(), Qt::white);

	if(mPage && !fast )
		mPage->drawLayer(m_cacheImage.size(), &painter, mAntialiased);
	else
	{
		painter.setPen( QPen(Qt::black, 2, Qt::DashDotLine ) );
		painter.drawLine( 0,0, width(), height() );
		painter.drawLine( width(), 0, 0, height() );
	}
	
	QApplication::restoreOverrideCursor();
	update();
	if( fast )
		mRepaintTimer->start(100);
	
}

void DHWWidget::resizeEvent( QResizeEvent * event )
{
	resetSelection();
	updateCorners();
	updateImage(true);
}

void DHWWidget::paintEvent ( QPaintEvent * event )
{
	QPainter painter(this);
	if( !m_cacheImage.isNull() )
		painter.drawImage(frameRect(),m_cacheImage );

}

void DHWWidget::mouseMoveEvent ( QMouseEvent * event )
{
	if( mRubberBand && mInDrag )
	{
		int deltaX = event->pos().x() - mStartPoint.x();
		int deltaY = event->pos().y() - mStartPoint.y();
		mRubberBand->setGeometry( mStartPoint.x(), mStartPoint.y(), deltaX, deltaY);
	}
}

void DHWWidget::mousePressEvent ( QMouseEvent * event )
{
	if( mRubberBand )
		delete mRubberBand;
	mRubberBand = new QRubberBand(QRubberBand::Rectangle, this);
	mRubberBand->setGeometry( mStartPoint.x(), mStartPoint.y(), 0, 0);
	mStartPoint = event->pos();
	mInDrag = true;
	mRubberBand->show();
	QApplication::setOverrideCursor(QCursor(Qt::CrossCursor));
}

void DHWWidget::mouseReleaseEvent ( QMouseEvent * event )
{
	QApplication::restoreOverrideCursor();
	mInDrag = false;
}

void DHWWidget::keyPressEvent ( QKeyEvent * event )
{
	if( event->key() == Qt::Key_Escape)
		resetSelection();
	event->ignore();
}

bool DHWWidget::antialias() const
{
	return mAntialiased;
}

void DHWWidget::setAntialias( bool aa )
{
	mAntialiased = aa;
	updateImage(true);
}

QRect DHWWidget::selection() const
{
	if( mRubberBand )
		return mRubberBand->geometry();
	else
		return QRect(0,0,0,0);
}

void DHWWidget::resetSelection()
{
	delete mRubberBand;
	mRubberBand = 0;
}


void DHWWidget::updateCorners()
{
    int width = frameRect().width();
    int height = frameRect().height();

    QRegion mask( 0, 0, width, height );
    // top-left
    mask -= (QRegion( 0, 0, 1, 2 ) + QRegion( 1, 0, 1, 1 ));
    // top-right
    mask -= (QRegion( width - 1, 0, 1, 2 ) + QRegion( width - 2, 0, 1, 1 ));
    // bottom-left
    mask -= QRegion( 0, height - 1, 1, 1 );
    // bottom-right
    mask -= QRegion( width - 1, height - 1, 1, 1 );
    setMask( mask );
}



