krop's commit fixes my problem in a better way, reverting
[kdepim.git] / kmail / kmmsglist.cpp
blob05fc5f4beda84d93d52ece3c60f0c09d78243557
1 // kmmsglist.cpp
4 #include "kmmsglist.h"
5 #include "kmmsgdict.h" // FIXME Till - move those into kmfolderindex
6 #include "kmkernel.h"
7 #include <assert.h>
8 #include <stdlib.h>
10 //-----------------------------------------------------------------------------
11 KMMsgList::KMMsgList(int initSize)
12 : QVector<KMMsgBase*>( initSize, static_cast<KMMsgBase*>( 0 ) ),
13 mHigh( 0 ), mCount( 0 )
18 //-----------------------------------------------------------------------------
19 KMMsgList::~KMMsgList()
21 clear( true );
25 //-----------------------------------------------------------------------------
26 void KMMsgList::clear( bool doDelete, bool syncDict )
28 if ( mHigh > 0 )
29 for ( unsigned int i = mHigh; i > 0; i-- )
31 KMMsgBase * msg = at(i-1);
32 if ( msg ) {
33 if ( syncDict )
34 KMMsgDict::mutableInstance()->remove( msg );
35 operator[]( i-1 ) = 0;
36 if ( doDelete )
37 delete msg;
40 mHigh = 0;
41 mCount = 0;
45 //-----------------------------------------------------------------------------
46 bool KMMsgList::resize( unsigned int aSize )
48 unsigned int oldSize = size();
49 KMMsgBase* msg;
51 // delete messages that will get lost, if any
52 if ( aSize < mHigh ) {
53 for ( unsigned int i = aSize; i < mHigh; i++ )
55 msg = operator[]( i );
56 if ( msg ) {
57 delete msg;
58 mCount--;
60 mHigh = aSize;
64 // do the resizing
65 QVector<KMMsgBase*>::resize( aSize );
67 // initialize new elements
68 for ( unsigned int i = oldSize; i < aSize; i++ )
69 operator[]( i ) = 0;
71 return true;
75 //-----------------------------------------------------------------------------
76 bool KMMsgList::reset(unsigned int aSize)
78 if ( !resize( aSize ) )
79 return false;
81 clear();
82 return true;
86 //-----------------------------------------------------------------------------
87 void KMMsgList::set( unsigned int idx, KMMsgBase* aMsg )
89 if ( idx >= static_cast<unsigned int>( size() ) )
90 resize( idx > 2 * static_cast<unsigned int>( size() ) ? idx + 16 : 2 * size() );
92 if ( !at(idx) && aMsg )
93 mCount++;
94 else if ( at(idx) && !aMsg )
95 mCount--;
97 delete at(idx);
99 operator[]( idx ) = aMsg;
101 if ( !aMsg || idx >= mHigh )
102 rethinkHigh();
106 //-----------------------------------------------------------------------------
107 void KMMsgList::insert( unsigned int idx, KMMsgBase* aMsg, bool syncDict )
109 if ( idx >= static_cast<unsigned int>( size() ) )
110 resize( idx > 2 * static_cast<unsigned int>( size() ) ? idx + 16 : 2 * size() );
112 if ( aMsg )
113 mCount++;
115 for ( unsigned int i = mHigh; i > idx; i-- ) {
116 if ( syncDict )
117 KMMsgDict::mutableInstance()->remove( at( i - 1 ) );
118 operator[]( i ) = at( i-1 );
119 if ( syncDict )
120 KMMsgDict::mutableInstance()->insert( at(i), i );
123 operator[]( idx ) = aMsg;
124 if ( syncDict )
125 KMMsgDict::mutableInstance()->insert( at(idx), idx );
127 mHigh++;
131 //-----------------------------------------------------------------------------
132 unsigned int KMMsgList::append( KMMsgBase* aMsg, bool syncDict )
134 const unsigned int idx = mHigh;
135 insert( idx, aMsg, syncDict ); // mHigh gets modified in here
136 return idx;
140 //-----------------------------------------------------------------------------
141 void KMMsgList::remove( unsigned int idx )
143 assert( idx < static_cast<unsigned int>( size() ) );
144 if ( at(idx) ) {
145 mCount--;
146 KMMsgDict::mutableInstance()->remove( at(idx) );
149 mHigh--;
150 for ( unsigned int i = idx; i < mHigh; i++ ) {
151 KMMsgDict::mutableInstance()->update( at(i + 1), i + 1, i );
152 operator[]( i ) = at( i+1 );
155 operator[]( mHigh ) = 0;
157 rethinkHigh();
161 //-----------------------------------------------------------------------------
162 KMMsgBase* KMMsgList::take( unsigned int idx )
164 KMMsgBase* msg = at( idx );
165 remove( idx );
166 return msg;
170 //-----------------------------------------------------------------------------
171 void KMMsgList::rethinkHigh()
173 unsigned int sz = size();
175 if ( mHigh < sz && at(mHigh) )
177 // forward search
178 while ( mHigh < sz && at(mHigh) )
179 mHigh++;
181 else
183 // backward search
184 while ( mHigh > 0 && !at(mHigh-1) )
185 mHigh--;