/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

#ifndef STUB_THUMBNAILMANAGER_QT_H
#define STUB_THUMBNAILMANAGER_QT_H

#include <QObject>
#include <QPixmap.h>
#include <QMap>

class QString;
class QSize;

/** default priority value */
const int tnmWrapperPriorityIdle = -100;

class ThumbnailManager : public QObject
    {
    Q_OBJECT

public:
    /** Thumbnail size. */
    enum ThumbnailSize
    {
        /**
         * Small thumbnail
         */
        ThumbnailSmall = 0,
        /**
         * Medium thumbnail
         */
        ThumbnailMedium,
        /**
         * Large thumbnail
         */
        ThumbnailLarge
    };

    /** Mode of thumbnail creation. */
    enum ThumbnailMode
        {
        /**
         * Default mode. This means that:
         * - Thumbnail must be as large as requested (unless the actual object is smaller).
         * - Smaller thumbnails may be up scaled to desired resolution.
         * - Aspect ratio is maintained and thumbnails are not cropped. The
         *   resulting thumbnail may smaller in either width or height if
         *   the aspect ratio of the object does not match the aspect ratio
         *   of the requested size.
         */
        Default = 0,

        /**
         * Allow thumbnails which are smaller than requested are. Thumbnail
         * bitmaps are never up scaled if this flag is set.
         */
        AllowAnySize = 1,

        /**
         * New thumbnail images are not created if this flag is set. Only
         * existing thumbnails may be returned. If a requested thumbnail does
         * not exist null pixmap will be returned.
         */
        DoNotCreate = 2,

        /**
         * Thumbnail images are cropped to match requested aspect ratio. If
         * this mode is set, the size of the resulting thumbnail always
         * matches the requested size.
         */
        CropToAspectRatio = 4
    };

    /**  Quality versus speed preference setting */
    enum QualityPreference
    {
        /**
         * Prefer thumbnails in the highest quality possible disregarding
         * any negative impact on performance.
         */
        OptimizeForQuality,

        /**
         * Get thumbnails as fast as possible, even if
         * it means lower quality.
         */
        OptimizeForPerformance
    };

    /** Display modes. */
    enum DisplayMode
    {
        /** No display mode */
        None,

        /** Monochrome display mode (1 bpp) */
        Gray2,

        /** Four grayscales display mode (2 bpp) */
        Gray4,

        /** 16 grayscales display mode (4 bpp) */
        Gray16,

        /** 256 grayscales display mode (8 bpp) */
        Gray256,

        /** Low colour GA 16 colour display mode (4 bpp) */
        Color16,

        /** 256 colour display mode (8 bpp) */
        Color256,

        /** 64,000 colour display mode (16 bpp) */
        Color64K,

        /** True colour display mode (24 bpp) */
        Color16M,

        /** (Not an actual display mode used for moving buffers containing bitmaps) */
        Rgb,

        /** 4096 colour display (12 bpp). */
        Color4K,

        /** True colour display mode (32 bpp, but top byte is unused and unspecified) */
        Color16MU,

        /** Display mode with alpha (24bpp colour plus 8bpp alpha) */
        Color16MA,

        /** Pre-multiplied Alpha display mode
         * (24bpp color multiplied with the alpha channel value, plus 8bpp alpha) */
        Color16MAP
    };

public:


    /**
     * Constructor
     *
     * @param parentPtr parent
     */
    ThumbnailManager( QObject* parentPtr = NULL );

    /**
     * Destructor
     */
    virtual ~ThumbnailManager();

    /**
     * Get quality versus performance preference.
     *
     * @return quality versus performance preference
     */
    QualityPreference qualityPreference() const;

    /**
     * Set quality versus performance preference.
     *
     * @param qualityPreference New quality versus performance preference
     *                           value.
     * @return true on success
     */
    bool setQualityPreference( QualityPreference qualityPreference );

    /**
     * Get the current display mode for thumbnail bitmaps.
     *
     * @return current display mode for thumbnail bitmaps
     */
    DisplayMode displayMode() const;

    /**
     * Set new display mode for thumbnail bitmaps.
     *
     * @param displayMode new display mode for thumbnail bitmaps.
     * @return true on success
     */
    bool setDisplayMode( DisplayMode displayMode );

    /**
     * Get the current desired size for thumbnail bitmaps.
     *
     * @return Current desired size for thumbnail bitmaps (in pixels).
     */
    QSize thumbnailSize() const;

    /**
     * Set desired size for thumbnail bitmaps.
     *
     * @param thumbnailSize New desired thumbnail size.
     * @return true on success
     */
    bool setThumbnailSize( const QSize& thumbnailSize );

    /**
     * Set desired size for thumbnail bitmaps.
     *
     * @param thumbnailSize New desired thumbnail size.
     * @return true on success
     */
    bool setThumbnailSize( ThumbnailSize thumbnailSize );

    /**
     * Get current mode for thumbnail generation.
     *
     * @return Current mode.
     */
    ThumbnailMode mode() const;

    /**
     * Set mode for thumbnail generation.
     *
     * @param mode New flags.
     * @return true on success
     */
    bool setMode( ThumbnailMode mode );

    /**
     * Get a thumbnail for an object file. If a thumbnail already exists, it
     * is loaded and if a thumbnail does not exist, it is created
     * transparently. If thumbnail loadinf fails thumbnailReady signal is emited
     * with null pixmap and error code.
     *
     * @param fileName      Source object or file
     * @param clientData    Pointer to arbitrary client data.
     *                      This pointer is not used by the API for
     *                      anything other than returning it in the
     *                      ThumbnailReady signal.
     * @param priority      Priority for this operation
     * @return              Thumbnail request ID or -1 if request failed. This can be used to
     *                      cancel the request or change priority.
     *                      The ID is specific to this tnm
     *                      instance and may not be shared with other
     *                      instances.
     */
    int getThumbnail( const QString& fileName, void * clientData = NULL,
            int priority = tnmWrapperPriorityIdle );

    /**
     * Get a persistent thumbnail for an object file. If a thumbnail already
     * exists, it is loaded and if a thumbnail does not exist, it is created
     * transparently. If thumbnail loading fails thumbnailReady signal is emited
     * with null pixmap and error code.
     *
     * @param thumbnailId   Thumbnail ID
     * @param clientData    Pointer to arbitrary client data.
     *                      This pointer is not used by the API for
     *                      anything other than returning it in the
     *                      ThumbnailReady signal.
     * @param priority      Priority for this operation
     * @return              Thumbnail request ID or -1 if request failed. This can be used to
     *                      cancel the request or change priority.
     *                      The ID is specific to this tnm
     *                      instance and may not be shared with other
     *                      instances.
     */
    int getThumbnail( unsigned long int thumbnailId, void * clientData = NULL,
            int priority = tnmWrapperPriorityIdle );

    /**
     * Set a thumbnail for an object file generated from pixmap delivered.
     * thumbnailReady() signal will be emited when the operation is complete.
     *
     * @param source             Pixmap from which the thumbnail will be created
     * @param fileName           file name
     * @param clientData         Pointer to arbitrary client data.
     *                           This pointer is not used by the API for
     *                           anything other than returning it in the
     *                           ThumbnailReady callback.
     * @param priority           Priority for this operation
     * @return                   Thumbnail request ID or -1 if request failed. This can be used to
     *                           cancel the request or change priority.
     *
     */
    int setThumbnail( const QPixmap& source, const QString& fileName,
            void * clientData = NULL, int priority = tnmWrapperPriorityIdle );

    /**
     * Delete all thumbnails for a given object. This is an asynchronous
     * operation, which always returns immediately.
     *
     * @param fileName      Source file
     */
    void deleteThumbnails( const QString& fileName );

    /**
     * Delete all thumbnails for a given object. This is an asynchronous
     * operation, which always returns immediately.
     *
     * @param thumbnailId      thumbnail id
     */
    void deleteThumbnails( unsigned long int thumbnailId );

    /**
     * Cancel a thumbnail operation.
     *
     * @param id      Request ID for the operation to be cancelled.
     * @return         true if cancelling was successful.
     */
    bool cancelRequest( int id );

    /**
     * Change the priority of a queued thumbnail operation.
     *
     * @param id           Request ID for the request which to assign a new
     *                      priority.
     * @param newPriority  New priority value
     * @return              true if change was successful.
     */
    bool changePriority( int id, int newPriority );

signals:
    /**
     * Final thumbnail bitmap generation or loading is complete.
     *
     * @param pixmap     An object representing the resulting thumbnail.
     * @param clientData Client data
     * @param id         Request ID for the operation
     * @param errorCode  error code
     */
    void thumbnailReady( QPixmap , void * , int , int );

public: // Test methods.

    void emitThumbnailReady(int tnId, bool emitNullThumb = false);
    
    /**
     * Emits thumbnailReady signal.
     * 
     * @param pixmap     An object representing the resulting thumbnail.
     * @param clientData Client data
     * @param id         Request ID for the operation
     * @param errorCode  error code
     */
    void emitThumbnailReady(QPixmap pixmap, void *internal, int id, int errorCode);

public: // Test data.

    ThumbnailSize mThumbSize;
    QualityPreference mQuality;
    ThumbnailMode mMode;

    struct TnRequest
    {
       QString name;
       void *id;
       int priority;
       bool cancelled;

       TnRequest(QString name, void *id, int priority, bool cancelled) {
           this->name = name;
           this->id = id;
           this->priority = priority;
           this->cancelled = cancelled;
       }

       TnRequest() {
           name = QString("");
           id = 0;
           priority = tnmWrapperPriorityIdle;
           cancelled = false;
       }
    };

    static QMap<int, TnRequest> mRequests;

    static bool mGetThumbFails;
    static int mThumbnailReadyError;
    static int mCancelRequestCount;
};

#endif // STUB_THUMBNAILMANAGER_QT
