5 #include "kmmsgdict.h" // FIXME Till - move those into kmfolderindex
10 //-----------------------------------------------------------------------------
11 KMMsgList::KMMsgList(int initSize
)
12 : QVector
<KMMsgBase
*>( initSize
, static_cast<KMMsgBase
*>( 0 ) ),
13 mHigh( 0 ), mCount( 0 )
18 //-----------------------------------------------------------------------------
19 KMMsgList::~KMMsgList()
25 //-----------------------------------------------------------------------------
26 void KMMsgList::clear( bool doDelete
, bool syncDict
)
29 for ( unsigned int i
= mHigh
; i
> 0; i
-- )
31 KMMsgBase
* msg
= at(i
-1);
34 KMMsgDict::mutableInstance()->remove( msg
);
35 operator[]( i
-1 ) = 0;
45 //-----------------------------------------------------------------------------
46 bool KMMsgList::resize( unsigned int aSize
)
48 unsigned int oldSize
= size();
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
);
65 QVector
<KMMsgBase
*>::resize( aSize
);
67 // initialize new elements
68 for ( unsigned int i
= oldSize
; i
< aSize
; i
++ )
75 //-----------------------------------------------------------------------------
76 bool KMMsgList::reset(unsigned int aSize
)
78 if ( !resize( aSize
) )
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
)
94 else if ( at(idx
) && !aMsg
)
99 operator[]( idx
) = aMsg
;
101 if ( !aMsg
|| idx
>= mHigh
)
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() );
115 for ( unsigned int i
= mHigh
; i
> idx
; i
-- ) {
117 KMMsgDict::mutableInstance()->remove( at( i
- 1 ) );
118 operator[]( i
) = at( i
-1 );
120 KMMsgDict::mutableInstance()->insert( at(i
), i
);
123 operator[]( idx
) = aMsg
;
125 KMMsgDict::mutableInstance()->insert( at(idx
), idx
);
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
140 //-----------------------------------------------------------------------------
141 void KMMsgList::remove( unsigned int idx
)
143 assert( idx
< static_cast<unsigned int>( size() ) );
146 KMMsgDict::mutableInstance()->remove( at(idx
) );
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;
161 //-----------------------------------------------------------------------------
162 KMMsgBase
* KMMsgList::take( unsigned int idx
)
164 KMMsgBase
* msg
= at( idx
);
170 //-----------------------------------------------------------------------------
171 void KMMsgList::rethinkHigh()
173 unsigned int sz
= size();
175 if ( mHigh
< sz
&& at(mHigh
) )
178 while ( mHigh
< sz
&& at(mHigh
) )
184 while ( mHigh
> 0 && !at(mHigh
-1) )