00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef SUIT_TREEMODEL_H
00024 #define SUIT_TREEMODEL_H
00025
00026 #include "SUIT.h"
00027
00028 #include <Qtx.h>
00029
00030 #include <QAbstractItemModel>
00031 #include <QSortFilterProxyModel>
00032 #include <QModelIndex>
00033 #include <QItemDelegate>
00034 #include <QVariant>
00035 #include <QMap>
00036
00037 #ifdef WIN32
00038 #pragma warning( disable:4251 )
00039 #endif
00040
00041 class SUIT_DataObject;
00042 class SUIT_TreeModel;
00043
00044 class SUIT_EXPORT SUIT_DataSearcher
00045 {
00046 public:
00047 virtual SUIT_DataObject* findObject( const QString& ) const = 0;
00048 };
00049
00050 class SUIT_EXPORT SUIT_AbstractModel
00051 {
00052 SUIT_DataSearcher* mySearcher;
00053
00054 public:
00055 SUIT_AbstractModel();
00056
00057 operator const QAbstractItemModel*() const;
00058 operator QAbstractItemModel*();
00059 operator const QObject*() const;
00060
00061 virtual SUIT_DataObject* root() const = 0;
00062 virtual void setRoot( SUIT_DataObject* ) = 0;
00063 virtual SUIT_DataObject* object( const QModelIndex& = QModelIndex() ) const = 0;
00064 virtual QModelIndex index( const SUIT_DataObject*, int = 0 ) const = 0;
00065 virtual bool autoDeleteTree() const = 0;
00066 virtual void setAutoDeleteTree( const bool ) = 0;
00067 virtual bool autoUpdate() const = 0;
00068 virtual void setAutoUpdate( const bool ) = 0;
00069 virtual bool updateModified() const = 0;
00070 virtual void setUpdateModified( const bool ) = 0;
00071 virtual QAbstractItemDelegate* delegate() const = 0;
00072 virtual bool customSorting( const int ) const = 0;
00073 virtual bool lessThan( const QModelIndex& left, const QModelIndex& right ) const = 0;
00074
00075 virtual void updateTree( const QModelIndex& ) = 0;
00076 virtual void updateTree( SUIT_DataObject* = 0 ) = 0;
00077
00078 virtual void registerColumn( const int group_id, const QString& name, const int custom_id ) = 0;
00079 virtual void unregisterColumn( const int group_id, const QString& name ) = 0;
00080 virtual void setColumnIcon( const QString& name, const QPixmap& icon ) = 0;
00081 virtual QPixmap columnIcon( const QString& name ) const = 0;
00082 virtual void setAppropriate( const QString& name, const Qtx::Appropriate appr ) = 0;
00083 virtual Qtx::Appropriate appropriate( const QString& name ) const = 0;
00084 virtual void setVisibilityState(const QString& id, Qtx::VisibilityState state) = 0;
00085 virtual void setVisibilityStateForAll(Qtx::VisibilityState state) = 0;
00086 virtual Qtx::VisibilityState visibilityState(const QString& id) const = 0;
00087 virtual void setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags ) = 0;
00088 virtual Qtx::HeaderViewFlags headerFlags( const QString& name ) const = 0;
00089 virtual void emitClicked( SUIT_DataObject* obj, const QModelIndex& index) = 0;
00090
00091 virtual SUIT_DataSearcher* searcher() const;
00092 virtual void setSearcher( SUIT_DataSearcher* );
00093 };
00094
00095
00096 class SUIT_EXPORT SUIT_TreeModel : public QAbstractItemModel, public SUIT_AbstractModel
00097 {
00098 Q_OBJECT
00099
00100 private:
00101 class TreeItem;
00102 class TreeSync;
00103 typedef SUIT_DataObject* ObjPtr;
00104 typedef SUIT_TreeModel::TreeItem* ItemPtr;
00105
00106 public:
00108 typedef enum {
00109 DisplayRole = Qt::DisplayRole,
00110 DecorationRole = Qt::DecorationRole,
00111 EditRole = Qt::EditRole,
00112 ToolTipRole = Qt::ToolTipRole,
00113 StatusTipRole = Qt::StatusTipRole,
00114 WhatsThisRole = Qt::WhatsThisRole,
00115 FontRole = Qt::FontRole,
00116 TextAlignmentRole = Qt::TextAlignmentRole,
00117 BackgroundRole = Qt::BackgroundRole,
00118 ForegroundRole = Qt::ForegroundRole,
00119 CheckStateRole = Qt::CheckStateRole,
00120 SizeHintRole = Qt::SizeHintRole,
00121 BaseColorRole = Qt::UserRole,
00122 TextColorRole,
00123 HighlightRole,
00124 HighlightedTextRole,
00125 AppropriateRole = Qtx::AppropriateRole
00126 } Role;
00127
00128 SUIT_TreeModel( QObject* = 0 );
00129 SUIT_TreeModel( SUIT_DataObject*, QObject* = 0 );
00130 ~SUIT_TreeModel();
00131
00132 SUIT_DataObject* root() const;
00133 void setRoot( SUIT_DataObject* );
00134
00135 virtual QVariant data( const QModelIndex&, int = DisplayRole ) const;
00136 virtual bool setData( const QModelIndex&, const QVariant&, int = EditRole );
00137 virtual Qt::ItemFlags flags( const QModelIndex& ) const;
00138 virtual QVariant headerData( int, Qt::Orientation, int = Qt::DisplayRole ) const;
00139
00140 virtual QModelIndex index( int, int, const QModelIndex& = QModelIndex() ) const;
00141 virtual QModelIndex parent( const QModelIndex& ) const;
00142
00143 virtual int columnCount( const QModelIndex& = QModelIndex() ) const;
00144 virtual int rowCount( const QModelIndex& = QModelIndex() ) const;
00145 virtual void registerColumn( const int group_id, const QString& name, const int custom_id );
00146 virtual void unregisterColumn( const int group_id, const QString& name );
00147 virtual void setColumnIcon( const QString& name, const QPixmap& icon );
00148 virtual QPixmap columnIcon( const QString& name ) const;
00149 virtual void setAppropriate( const QString& name, const Qtx::Appropriate appr );
00150 virtual Qtx::Appropriate appropriate( const QString& name ) const;
00151 virtual void setVisibilityState(const QString& id, Qtx::VisibilityState state);
00152 virtual void setVisibilityStateForAll(Qtx::VisibilityState state);
00153 virtual Qtx::VisibilityState visibilityState(const QString& id) const;
00154 virtual void setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags );
00155 virtual Qtx::HeaderViewFlags headerFlags( const QString& name ) const;
00156 virtual void emitClicked( SUIT_DataObject* obj, const QModelIndex& index);
00157
00158
00159 SUIT_DataObject* object( const QModelIndex& = QModelIndex() ) const;
00160 QModelIndex index( const SUIT_DataObject*, int = 0 ) const;
00161
00162 bool autoDeleteTree() const;
00163 void setAutoDeleteTree( const bool );
00164
00165 bool autoUpdate() const;
00166 void setAutoUpdate( const bool );
00167
00168 bool updateModified() const;
00169 void setUpdateModified( const bool );
00170
00171 virtual bool customSorting( const int ) const;
00172 virtual bool lessThan( const QModelIndex& left, const QModelIndex& right ) const;
00173
00174 QAbstractItemDelegate* delegate() const;
00175
00176
00177 virtual void updateTreeModel(SUIT_DataObject*,TreeItem*);
00178
00179 public slots:
00180 virtual void updateTree( const QModelIndex& );
00181 virtual void updateTree( SUIT_DataObject* = 0 );
00182
00183 signals:
00184 void modelUpdated();
00185 void clicked( SUIT_DataObject*, int );
00186
00187 private:
00188 void initialize();
00189
00190 TreeItem* rootItem() const;
00191 TreeItem* treeItem( const QModelIndex& ) const;
00192 TreeItem* treeItem( const SUIT_DataObject* ) const;
00193 SUIT_DataObject* object( const TreeItem* ) const;
00194
00195 TreeItem* createItem( SUIT_DataObject*, TreeItem* = 0, TreeItem* = 0 );
00196 TreeItem* createItemAtPos( SUIT_DataObject*, TreeItem* = 0, int pos=0 );
00197 void updateItem( TreeItem* );
00198 void removeItem( TreeItem* );
00199
00200 private slots:
00201 void onInserted( SUIT_DataObject*, SUIT_DataObject* );
00202 void onRemoved( SUIT_DataObject*, SUIT_DataObject* );
00203
00204 private:
00205 typedef QMap<SUIT_DataObject*, TreeItem*> ItemMap;
00206 typedef struct
00207 {
00208 QString myName;
00209 QMap<int,int> myIds;
00210 QPixmap myIcon;
00211 Qtx::HeaderViewFlags myHeaderFlags;
00212 Qtx::Appropriate myAppropriate;
00213
00214 } ColumnInfo;
00215
00216 typedef QMap<QString,Qtx::VisibilityState> VisibilityMap;
00217
00218 SUIT_DataObject* myRoot;
00219 TreeItem* myRootItem;
00220 ItemMap myItems;
00221 VisibilityMap myVisibilityMap;
00222 bool myAutoDeleteTree;
00223 bool myAutoUpdate;
00224 bool myUpdateModified;
00225 QVector<ColumnInfo> myColumns;
00226
00227 friend class SUIT_TreeModel::TreeSync;
00228 };
00229
00230 class SUIT_EXPORT SUIT_ProxyModel : public QSortFilterProxyModel, public SUIT_AbstractModel
00231 {
00232 Q_OBJECT
00233
00234 public:
00235 SUIT_ProxyModel( QObject* = 0 );
00236 SUIT_ProxyModel( SUIT_DataObject*, QObject* = 0 );
00237 SUIT_ProxyModel( SUIT_AbstractModel*, QObject* = 0 );
00238 ~SUIT_ProxyModel();
00239
00240 SUIT_DataObject* root() const;
00241 void setRoot( SUIT_DataObject* );
00242
00243 SUIT_DataObject* object( const QModelIndex& = QModelIndex() ) const;
00244 QModelIndex index( const SUIT_DataObject*, int = 0 ) const;
00245
00246 bool autoDeleteTree() const;
00247 void setAutoDeleteTree( const bool );
00248
00249 bool autoUpdate() const;
00250 void setAutoUpdate( const bool );
00251
00252 bool updateModified() const;
00253 void setUpdateModified( const bool );
00254
00255 bool isSortingEnabled() const;
00256 bool customSorting( const int ) const;
00257
00258 virtual bool lessThan( const QModelIndex&, const QModelIndex& ) const;
00259 virtual void registerColumn( const int group_id, const QString& name, const int custom_id );
00260 virtual void unregisterColumn( const int group_id, const QString& name );
00261 virtual void setColumnIcon( const QString& name, const QPixmap& icon );
00262 virtual QPixmap columnIcon( const QString& name ) const;
00263 virtual void setAppropriate( const QString& name, const Qtx::Appropriate appr );
00264 virtual Qtx::Appropriate appropriate( const QString& name ) const;
00265 virtual void setVisibilityState(const QString& id, Qtx::VisibilityState state);
00266 virtual void setVisibilityStateForAll(Qtx::VisibilityState state);
00267 virtual Qtx::VisibilityState visibilityState(const QString& id) const;
00268 virtual void setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags );
00269 virtual Qtx::HeaderViewFlags headerFlags( const QString& name ) const;
00270 virtual void emitClicked( SUIT_DataObject* obj, const QModelIndex& index);
00271
00272 virtual SUIT_DataSearcher* searcher() const;
00273 virtual void setSearcher( SUIT_DataSearcher* );
00274
00275 QAbstractItemDelegate* delegate() const;
00276
00277 public slots:
00278 virtual void updateTree( const QModelIndex& );
00279 virtual void updateTree( SUIT_DataObject* = 0 );
00280 void setSortingEnabled( bool );
00281
00282 signals:
00283 void modelUpdated();
00284 void clicked( SUIT_DataObject*, int );
00285
00286 protected:
00287 SUIT_AbstractModel* treeModel() const;
00288 virtual bool filterAcceptsRow( int, const QModelIndex& ) const;
00289
00290 private:
00291 bool mySortingEnabled;
00292 };
00293
00294 class SUIT_EXPORT SUIT_ItemDelegate : public QItemDelegate
00295 {
00296 Q_OBJECT
00297
00298 public:
00299 SUIT_ItemDelegate( QObject* = 0 );
00300
00301 virtual void paint( QPainter*, const QStyleOptionViewItem&,
00302 const QModelIndex& ) const;
00303
00304 virtual QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
00305 };
00306
00307 #ifdef WIN32
00308 #pragma warning( default:4251 )
00309 #endif
00310
00311 #endif // SUIT_TREEMODEL_H