00001 #ifndef FOLDERTABLEMODEL_H
00002 #define FOLDERTABLEMODEL_H
00003
00004 #include <QtCore/QAbstractTableModel>
00005 #include <QtCore/QModelIndex>
00006 #include <QtCore/QVariant>
00007 #include <QtCore/QSet>
00008 #include <QtCore/QDateTime>
00009
00010 #include <vector>
00011 #include <string>
00012
00013 #include "ACE/foldertableitem.h"
00014 #include "ACE/accesstocool.h"
00015
00016 enum DisplayAsMask { noMask, octMask, decMask, hexMask, datetimeMask, blobMask, clobMask };
00017 enum ColumnResponse { noResponse, readonlyResponse, confirmResponse };
00018
00019 class RootFolderTableItem;
00020 class QValidator;
00021 class FolderTableModel;
00022
00023
00024 typedef bool ( FolderTableModel::*FilterFunction0 )( int );
00025
00026
00027 class FolderTableModel : public QAbstractTableModel
00028 {
00029 Q_OBJECT
00030
00031 public:
00032 FolderTableModel( cool::IFolderPtr folderPtr, cool::ValidityKey start = cool::ValidityKeyMin, cool::ValidityKey end = cool::ValidityKeyMax, cool::ChannelSelection channels = cool::ChannelSelection(), QString tag = "", QObject* parent = 0 );
00033 ~FolderTableModel();
00034
00035 QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const;
00036 QVariant rawData( const QModelIndex& index ) const;
00037 QVariant headerData( int section, Qt::Orientation orientation = Qt::Horizontal, int role = Qt::DisplayRole ) const;
00038 QModelIndex index( int row, int column, const QModelIndex& parent = QModelIndex() ) const;
00039 QModelIndex parent( const QModelIndex& index ) const;
00040 int rowCount( const QModelIndex& parent = QModelIndex() ) const;
00041 int columnCount( const QModelIndex& parent = QModelIndex() ) const;
00042 Qt::ItemFlags flags( const QModelIndex& index ) const;
00043 bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole );
00044 void setData( const QModelIndexList& indexList, const QVariant& value, int role = Qt::EditRole );
00045 bool canSetDisplayAsMask( const QModelIndex& index ) const;
00046 bool canSetDisplayAsMask( const QModelIndexList& indexList ) const;
00047 bool setHeaderData( int section, Qt::Orientation orientation, const QVariant& value, int role = Qt::EditRole );
00048 bool removeRows( int row, int count = 1, const QModelIndex& parent = QModelIndex() );
00049 bool insertRows( int row, int count = 1, const QModelIndex& parent = QModelIndex() );
00050 QVariant::Type getQVariantType( const std::string& coolType ) const;
00051 QVariant::Type getQVariantType( const QModelIndex& index ) const;
00052 QVariant::Type getQVariantType( const QString& field ) const;
00053 QVariant::Type getQVariantType( int column ) const;
00054 QString getCoolTypeString( const QModelIndex& index ) const;
00055 RootFolderTableItem* getRootTableItem() const;
00056 void setDefaultCopyRow( int row );
00057 QList< int > filter( FilterFunction0 f, bool inverse, bool allChannels = true, int rowStartPos = -1, int rowEndPos = -1 );
00058 QList< int > filter_mres( bool inverse = true );
00059 int filter_mre_singleChannel( int row );
00060 bool filter_mre( int row );
00061 QList< FolderTableItem* > _updateValidityKeys( QList< FolderTableItem* > newTableItems );
00062 bool commit();
00063 bool isNewRow( int row ) const;
00064 DisplayAsMask getDisplayAsMask( int column ) const;
00065 ColumnResponse getColumnResponse( int column ) const;
00066 bool hasMask( int column ) const;
00067 void setDisplayAsMask( const QModelIndex& index, DisplayAsMask dMask );
00068 QString getInputMask( const QModelIndex& index ) const;
00069 QVariant getMaskedData( FolderTableItem*& item, int column ) const;
00070 QValidator* getValidator( const QModelIndex& index ) const;
00071 QValidator* getValidator( unsigned int column ) const;
00072 void sort( int column, Qt::SortOrder order );
00073 int compare( const QModelIndex& index, QString value );
00074 int compareQVariants( QVariant A, QVariant B );
00075 void setFiltered( bool enabled = true );
00076 bool isFiltered() const;
00077
00078 QSet< unsigned int > newRowChannelIds( QList< FolderTableItem* > newTableItems = QList< FolderTableItem* >() ) const;
00079
00080 private:
00081 cool::IFolderPtr coolFolderPtr;
00082 const cool::IRecordSpecification& payloadSpec;
00083 bool filtered;
00084 RootFolderTableItem* rootTableItem;
00085 int defaultCopyRow;
00086 QString newRowColour, modifiedColour, maskColour, filteredColour;
00087 QHash< int, DisplayAsMask > displayAsMaskHash;
00088 QHash< int, ColumnResponse > columnResponseHash;
00089
00090 void setupFolderTableModelData( cool::ValidityKey start, cool::ValidityKey end, cool::ChannelSelection channels, QString tag );
00091 QVariant qStringToQVariant( QString value, bool* ok, int column, int base = 0 );
00092 QVariant applyMaskToQVariant( QString format, QVariant currentValue, int column, bool* ok, int fieldWidth = 1, int base = 10, const QChar& fillChar = QLatin1Char( ' ' ) ) const;
00093
00094 signals:
00095 void modelChanged( const FolderTableModel* thisModel, const bool changed );
00096
00097 };
00098
00099 #endif
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110