00001 #include <QtCore/QtDebug>
00002 #include <QtCore/QMultiMap>
00003 #include <QtCore/QListIterator>
00004
00005 #include "ACE/foldertableitem.h"
00006
00007
00008 FolderTableItem::FolderTableItem( const QList<QVariant>& data, RootFolderTableItem* parent, bool newItem ):
00009 tableItemData( data ),
00010 rootTableItem( parent ),
00011 clonedSourceItem( 0 ),
00012 hidden( false ),
00013 newItem( newItem )
00014 {}
00015
00016 void FolderTableItem::setClonedSourceItem( FolderTableItem* newClonedSourceItem )
00017 {
00018 clonedSourceItem = newClonedSourceItem;
00019 }
00020
00021 FolderTableItem* FolderTableItem::getClonedSourceItem()
00022 {
00023 return clonedSourceItem;
00024 }
00025
00026 int FolderTableItem::columnCount() const
00027 {
00028 return tableItemData.count();
00029 }
00030
00031 RootFolderTableItem* FolderTableItem::parent()
00032 {
00033 return rootTableItem;
00034 }
00035
00036 int FolderTableItem::row() const
00037 {
00038 if ( rootTableItem )
00039 return rootTableItem->childTableItems.indexOf( const_cast<FolderTableItem*>( this ) );
00040
00041 return 0;
00042 }
00043
00044 bool FolderTableItem::isNew() const
00045 {
00046 return newItem;
00047 }
00048
00049 bool FolderTableItem::isHidden() const
00050 {
00051 return hidden;
00052 }
00053
00054 void FolderTableItem::setHidden( bool enabled )
00055 {
00056 hidden = enabled;
00057 }
00058
00059 unsigned FolderTableItem::getChannelId() const
00060 {
00061 return tableItemData.first().toUInt();
00062 }
00063
00064 void FolderTableItem::setOld()
00065 {
00066 newItem = false;
00067 }
00068
00069 QList<QVariant> FolderTableItem::data() const
00070 {
00071 return tableItemData;
00072 }
00073
00074 QVariant FolderTableItem::data( int column ) const
00075 {
00076 return tableItemData[ column ];
00077 }
00078
00079 void FolderTableItem::setData( const QVariant& data, int column )
00080 {
00081 tableItemData.replace( column, data );
00082 }
00083
00084
00085 RootFolderTableItem::RootFolderTableItem( const QList<QString>& headerNames, const QList< QPair< QString, QVariant > >& headerTypes )
00086 : headerNameList( headerNames ),
00087 headerTypeList( headerTypes )
00088 {}
00089
00090 RootFolderTableItem::~RootFolderTableItem()
00091 {
00092 qDeleteAll( childTableItems );
00093 }
00094
00095 QList<FolderTableItem*> RootFolderTableItem::getChildren() const
00096 {
00097 return childTableItems;
00098 }
00099
00100 void RootFolderTableItem::appendChild( FolderTableItem* item )
00101 {
00102 childTableItems.append( item );
00103 }
00104
00105 void RootFolderTableItem::insertChild( FolderTableItem* item, int row )
00106 {
00107 childTableItems.insert( row, item );
00108 }
00109
00110 void RootFolderTableItem::removeChildAt( int row )
00111 {
00112 childTableItems.removeAt( row );
00113 }
00114
00115 FolderTableItem* RootFolderTableItem::child( int row )
00116 {
00117 return childTableItems[ row ];
00118 }
00119
00120 int RootFolderTableItem::childCount() const
00121 {
00122 return childTableItems.count();
00123 }
00124
00125 int RootFolderTableItem::columnCount() const
00126 {
00127 return headerNameList.count();
00128 }
00129
00130 QString RootFolderTableItem::header( int column ) const
00131 {
00132 return headerNameList[ column ];
00133 }
00134
00135 int RootFolderTableItem::headerPos( const QString& headerName ) const
00136 {
00137 return headerNameList.indexOf( headerName );
00138 }
00139
00140 QPair< QString, QVariant > RootFolderTableItem::headerType( int column ) const
00141 {
00142 if ( column > columnCount() )
00143 return qMakePair( QString(), QVariant( QVariant::Invalid ) );
00144 return headerTypeList[ column ];
00145 }
00146
00147 bool RootFolderTableItem::setHeader( const QString& data, int column )
00148 {
00149 headerNameList.replace( column, data );
00150 return true;
00151 }
00152
00153 QList< FolderTableItem* > RootFolderTableItem::newItems() const
00154 {
00155 QList< FolderTableItem* > newItemList;
00156 foreach ( FolderTableItem* childTableItem, childTableItems)
00157 {
00158 if ( childTableItem->isNew() )
00159 newItemList.append( childTableItem );
00160 }
00161 return newItemList;
00162 }
00163
00164 bool RootFolderTableItem::anyNew() const
00165 {
00166 return !newItems().isEmpty();
00167 }
00168
00169
00170 bool RootFolderTableItem::isFiltered() const
00171 {
00172 foreach ( FolderTableItem* childTableItem, childTableItems )
00173 {
00174 if ( childTableItem->isHidden() )
00175 return true;
00176 }
00177 return false;
00178 }
00179
00180 QMap< int, FolderTableItem* > RootFolderTableItem::filteredChildren() const
00181 {
00182 QMap< int, FolderTableItem* > fChildren;
00183 int pos( 0 );
00184
00185 fChildren.clear();
00186 foreach ( FolderTableItem* childTableItem, childTableItems )
00187 {
00188 if ( !childTableItem->isHidden() )
00189 fChildren[ pos ] = childTableItem;
00190 pos++;
00191 }
00192 return fChildren;
00193 }
00194
00195 int RootFolderTableItem::find( unsigned channelId ) const
00196 {
00197 foreach ( FolderTableItem* childTableItem, childTableItems )
00198 {
00199 if ( childTableItem->getChannelId() == channelId )
00200 return childTableItem->row();
00201 }
00202 return -1;
00203 }
00204
00205 void RootFolderTableItem::sort( int column, Qt::SortOrder order )
00206 {
00207 QVariant::Type columnType = headerType( column ).second.type();
00208 if ( columnType == QVariant::Bool )
00209 sort1<bool>( column, order );
00210 else if ( columnType == QVariant::Char )
00211 sort1<int>( column, order );
00212 else if (columnType == QVariant::Int )
00213 sort1<int>( column, order );
00214 else if ( columnType == QVariant::UInt )
00215 sort1<unsigned int>( column, order );
00216 else if ( columnType == QVariant::ULongLong )
00217 sort1<unsigned long long>( column, order );
00218 else if ( columnType == QVariant::LongLong )
00219 sort1<long long>( column, order );
00220 else if ( columnType == QVariant::Double )
00221 sort1<double>( column, order );
00222 else if ( columnType == QVariant::String )
00223 sort1<QString>( column, order );
00224 else
00225 return;
00226 }
00227
00228 template <typename ColumnType>
00229 void RootFolderTableItem::sort1( int column, Qt::SortOrder order )
00230 {
00231 QMultiMap< ColumnType, int > sortedList;
00232
00233 QList< int > intList;
00234
00235 sortedList.clear();
00236 intList.clear();
00237
00238 int pos( 0 );
00239
00240 if ( isFiltered() )
00241 {
00242 QMap< int, FolderTableItem* > fChildren = filteredChildren();
00243 QList< int > filteredChildrenPos = fChildren.keys();
00244
00245
00246
00247 foreach ( pos, filteredChildrenPos )
00248 {
00249 QVariant v = fChildren.value( pos )->tableItemData.at( column );
00250 sortedList.insert( v.value<ColumnType>(), pos );
00251 }
00252
00253
00254
00255
00256 intList = sortedList.values();
00257 QListIterator< int > i( intList );
00258
00259 if ( order == Qt::AscendingOrder )
00260 {
00261
00262
00263 foreach ( pos, filteredChildrenPos )
00264 {
00265 childTableItems.replace( pos, fChildren.value( i.next() ) );
00266 }
00267 }
00268 else
00269 {
00270 i.toBack();
00271 foreach ( pos, filteredChildrenPos )
00272 {
00273 childTableItems.replace( pos, fChildren.value( i.previous() ) );
00274 }
00275 }
00276
00277 return;
00278 }
00279
00280
00281
00282
00283
00284 foreach ( FolderTableItem* childTableItem, childTableItems )
00285 {
00286 QVariant v = childTableItem->tableItemData.at( column );
00287 sortedList.insert( v.value<ColumnType>(), pos++ );
00288 }
00289
00290
00291
00292
00293 intList = sortedList.values();
00294
00295
00296
00297 if ( order == Qt::AscendingOrder )
00298 {
00299 foreach ( pos, intList )
00300 {
00301 childTableItems.append( childTableItems.at( pos ) );
00302 }
00303 }
00304 else
00305 {
00306 QListIterator<int> i( intList );
00307 i.toBack();
00308 while ( i.hasPrevious() )
00309 {
00310 childTableItems.append( childTableItems.at( i.previous() ) );
00311 }
00312 }
00313
00314
00315 for ( pos=0; pos < sortedList.size(); ++pos )
00316 {
00317 childTableItems.removeFirst();
00318 }
00319 }
00320