/************************************************************************
 * $Id: droppeditem.h 661 2011-04-05 13:16:53Z elzubeir $
 *
 * ------------
 * Description:
 * ------------
 *
 * (C) Copyright 2009-2011 ALLCONTENT. All rights reserved.
 *
 * -----------------
 * Revision Details:    (Updated by Revision Control System)
 * -----------------
 *  $Date: 2011-04-05 17:16:53 +0400 (Tue, 05 Apr 2011) $
 *  $Author: elzubeir $
 *  $Revision: 661 $
 *  $HeadURL: file:///opt/svn/socialhose/trunk/app/ClippingStation/droppeditem.h $
 *
 ************************************************************************/

#ifndef DROPPED_ITEM_H
#define DROPPED_ITEM_H

#include <QGraphicsPixmapItem>
#include <QGraphicsSceneMouseEvent>

/**
        \brief Purpose of this class is to display the pixmap dropped on the page item.
*/

#include "droppeditemzoomdialog.h"

class PageItem;
class DroppedItemZoomDialog;

class DroppedItem : public QGraphicsPixmapItem
{
public:
    enum { Type = UserType + 1 };

    //! \fn DroppedItem()
    //!     constructor
    //! \param[in] pixmap: containing the dropped image
    //! \param[in] scenePos position of the image in the scene
    //! \param[in] prec: precentage to the scale
    //! \author elzubeir
    DroppedItem(const QPixmap & pixmap, const QPointF & scenePos, qreal prec, QGraphicsItem * parent = 0); ///< ctor

    //! \fn ~DroppedItem()
    //!     desctuctor
    //! \author elzubeir
    ~DroppedItem();

    //! \fn paint()
    //!     override the paints function
    //! \author elzubeir
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

    //! \fn boundingRect()
    //!     the bounding rectangle of the item
    //! \returns the bounding rectangle of the item
    //! \author elzubeir
    QRectF boundingRect() const;

    //! \fn type()
    //!     the type of the item
    //! \returns the type of the item
    //! \author elzubeir
    int type() const;

protected:
    //! \fn keyPressEvent()
    //!     overrides the keyPressEvent() function
    //! \author elzubeir
    virtual void keyPressEvent(QKeyEvent * event);

    //! \fn mouseDoubleClickEvent()
    //!     overrides the function
    //! \author elzubeir
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);

    //! \fn mousePressEvent()
    //!     overrides the function
    //! \author elzubeir
    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);

    //! \fn mouseMoveEvent()
    //!     overrides the function
    //! \author elzubeir
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);

    //! \fn mouseReleaseEvent()
    //!     overrides the function
    //! \author elzubeir
    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

public:
    //! \fn zoom()
    //!     zoom the item to a value
    //! \param[in] value to zoom the item to.
    //! \author elzubeir
    void zoom(int value);

private:
    //! \fn checkBoundary()
    //!     check if the point is on the item's boundaries
    //! \param[in] point of the current point to check
    //! \param[in] bool for tweaking part.
    //! \author elzubeir
    void checkBoundary(QPoint pt, bool t);

    //! \fn checkBoundary()
    //!     check if the point (x,y) are on the boundary
    //! \param[in] x: x value of the point
    //! \param[in] y: y value of the point
    //! \author elzubeir
    void checkBoundary(qreal x, qreal y);

    //! \fn getScaledImage()
    //!     get the image scaled
    //! \returns scaled image
    //! \author elzubeir
    QImage getScaledImage();

private:

    //! original pixmap
    QPixmap m_originalPixmap;

    //! image width
    qreal m_imageWidth;

    //! current value
    int m_currentValue;

    //! original image
    QImage m_originalImage;

    //! zoom dialog
    DroppedItemZoomDialog *m_zoomDlg;

    //! a4 page item
    PageItem* m_pageItem;

    //! should we do twaking
    bool m_tweaking;

    //! on what part we do weaking
    QString m_tweakingpart ;

    //! points for top/let, top/right, bottom/left, bottom/right
    QPoint m_tl, m_tr, m_bl, m_br ;

    //! rectangle of the current item
    QRect m_rectangle;
};

#endif // DROPPED_ITEM_H
