hgwidgets_plat/hgcacheproxymodel_api/inc/hgcacheproxymodel.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 27 May 2010 13:59:05 +0300
changeset 3 c863538fcbb6
parent 2 49c70dcc3f17
permissions -rw-r--r--
Revision: 201019 Kit: 2010121

/*
* 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:
*
*  Version     : %version: 6 %
*/

#ifndef HGCACHEPROXYMODEL_H_
#define HGCACHEPROXYMODEL_H_

#include <QAbstractItemModel>
#include <QSortFilterProxyModel>

#include <hgwidgets/hgdataprovidermodel.h>

#ifdef BUILD_CACHEPROXYMODEL
#define CACHEPROXYMODEL_EXPORT Q_DECL_EXPORT
#else
#define CACHEPROXYMODEL_EXPORT Q_DECL_IMPORT
#endif

class HgBufferManager;

const int KDefaultCacheSize = 120;
const int KDefaultCacheTreshold = 30;

class HgBufferManagerObserver
{
public:
    enum HgRequestOrder {
        HgRequestOrderAscending,
        HgRequestOrderDescending
    };   

    virtual void release(int start, int end) = 0;
    virtual void request(int start, int end, HgRequestOrder order = HgRequestOrderAscending) = 0;  
};

class CACHEPROXYMODEL_EXPORT HgCacheProxyModel : public QAbstractItemModel, public HgBufferManagerObserver, public HgDataProviderModelObserver
{
    Q_OBJECT
public:
    HgCacheProxyModel(QObject *parent = 0);
    ~HgCacheProxyModel();   
    
    void setDataProvider(HgDataProviderModel *dataProvider, int cacheSize = KDefaultCacheSize, int cacheTreshold = KDefaultCacheTreshold);
    HgDataProviderModel* DataProvider();
    void resizeCache(int newSize, int newTreshold);
    
//from QAbstractItemModel
    virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
    virtual QModelIndex parent(const QModelIndex &child) const;
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
    virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const;
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
    virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole);
    virtual QMap<int, QVariant> itemData(const QModelIndex &index) const;
    virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles);
    virtual QStringList mimeTypes() const;
    virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
    virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
    virtual Qt::DropActions supportedDropActions() const;
    virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
    virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex());
    virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
    virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex());
    virtual void fetchMore(const QModelIndex &parent);
    virtual bool canFetchMore(const QModelIndex &parent) const;
    virtual Qt::ItemFlags flags(const QModelIndex &index) const;
    virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
    virtual QModelIndex buddy(const QModelIndex &index) const;
    virtual QModelIndexList match(const QModelIndex &start, int role,
                                  const QVariant &value, int hits = 1,
                                  Qt::MatchFlags flags =
                                  Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const;
    virtual QSize span(const QModelIndex &index) const;

// for sorting
    Qt::CaseSensitivity sortCaseSensitivity() const;
    void setSortCaseSensitivity(Qt::CaseSensitivity cs);
    bool isSortLocaleAware() const;
    void setSortLocaleAware(bool on);
    int sortColumn() const;
    Qt::SortOrder sortOrder() const;
    bool dynamicSortFilter() const;
    void setDynamicSortFilter(bool enable);
    int sortRole() const;
    void setSortRole(int role);

//for filtering
    QRegExp filterRegExp() const;
    void setFilterRegExp(const QRegExp &regExp);
    int filterKeyColumn() const;
    void setFilterKeyColumn(int column);
    Qt::CaseSensitivity filterCaseSensitivity() const;
    void setFilterCaseSensitivity(Qt::CaseSensitivity cs);
    int filterRole() const;
    void setFilterRole(int role);
    
public slots:
    virtual bool submit();
    virtual void revert();
    
public:
//from HgBufferManagerObserver
    virtual void release(int start, int end);
    virtual void request(int start, int end, HgRequestOrder order = HgRequestOrderAscending);  
    
private:
    int count()const;
    QModelIndex mapToSource(const QModelIndex &index)const;
    QModelIndex mapToSource(int row, int col) const;
    int mapToDataProviderIndex(int myIndex) const;
    int mapFromDataProviderIndex(int myIndex) const;
    void releaseAll();
    void setBufferPosition(int pos) const;
    
private slots:
    void sourceColumnsAboutToBeInserted( const QModelIndex & parent, int start, int end);
    void sourceColumnsAboutToBeMoved( const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationColumn );
    void sourceColumnsAboutToBeRemoved( const QModelIndex & parent, int start, int end);
    void sourceColumnsInserted( const QModelIndex & parent, int start, int end );
    void sourceColumnsMoved( const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationColumn );
    void sourceColumnsRemoved( const QModelIndex & parent, int start, int end );
    void sourceDataChanged( const QModelIndex & topLeft, const QModelIndex & bottomRight );
    void sourceHeaderDataChanged( Qt::Orientation orientation, int first, int last );
    void sourceLayoutAboutToBeChanged();
    void sourceLayoutChanged();
    void sourceModelAboutToBeReset();
    void sourceModelReset();
    void sourceRowsAboutToBeInserted( const QModelIndex & parent, int start, int end );
    void sourceRowsAboutToBeMoved( const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationRow );
    void sourceRowsAboutToBeRemoved( const QModelIndex & parent, int start, int end );
    void sourceRowsInserted( const QModelIndex & parent, int start, int end );
    void sourceRowsMoved( const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationRow );
    void sourceRowsRemoved( const QModelIndex & parent, int start, int end );
    
//from HgDataProviderModelObserver    
public:
    virtual void dataUpdated(int from, int to);
    
private:
    HgBufferManager* mBufferManager;
    QSortFilterProxyModel* mSortFilterProxyModel;
    HgDataProviderModel* mDataProviderModel;
    mutable bool mSupressBM;
    mutable int mCurrentPos;
};

#endif // HGCACHEPROXYMODEL_H_