Version: 6.3.1

src/SUIT/SUIT_TreeModel.h

Go to the documentation of this file.
00001 // Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // This library is free software; you can redistribute it and/or
00004 // modify it under the terms of the GNU Lesser General Public
00005 // License as published by the Free Software Foundation; either
00006 // version 2.1 of the License.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // Lesser General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU Lesser General Public
00014 // License along with this library; if not, write to the Free Software
00015 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00016 //
00017 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00018 //
00019 
00020 // File:   SUIT_TreeModel.h
00021 // Author: Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
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
Copyright © 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS