// kmmsglist.cpp #include "kmmsglist.h" #include #include // we need this for sorting. static KMMsgList::SortField sortCriteria; static int* sortIndex; static KMMsgList* sortList; //----------------------------------------------------------------------------- KMMsgList::KMMsgList(int initSize): KMMsgListInherited(initSize) { mHigh = size(); mCount = 0; clear(FALSE); } //----------------------------------------------------------------------------- KMMsgList::~KMMsgList() { clear(TRUE); } //----------------------------------------------------------------------------- void KMMsgList::clear(bool doDelete) { KMMsgBasePtr msg; long i; for (i=mHigh-1; i>=0; i--) { msg = at(i); KMMsgListInherited::at(i) = NULL; if (msg && doDelete) delete msg; } mHigh = 0; mCount = 0; } //----------------------------------------------------------------------------- bool KMMsgList::resize(int aSize) { int i, oldSize = size(); KMMsgBasePtr msg; assert(aSize>=0); // delete messages that will get lost, if any if (aSize < mHigh) { for (i=aSize; i=0); if (idx >= size()) { doubleSize = size() << 1; resize(idx>doubleSize ? idx+16 : doubleSize); } if (!at(idx) && aMsg) mCount++; else if (at(idx) && !aMsg) mCount--; KMMsgListInherited::at(idx) = aMsg; if (!aMsg || idx >= mHigh) rethinkHigh(); } //----------------------------------------------------------------------------- void KMMsgList::insert(int idx, KMMsgBasePtr aMsg) { int i, doubleSize; assert(idx>=0); if (idx >= size()) { doubleSize = size() << 1; resize(idx>doubleSize ? idx+16 : doubleSize); } if (aMsg) mCount++; for (i=mHigh; i>idx; i--) KMMsgListInherited::at(i) = KMMsgListInherited::at(i-1); KMMsgListInherited::at(idx) = aMsg; mHigh++; } //----------------------------------------------------------------------------- int KMMsgList::append(KMMsgBasePtr aMsg) { int idx = mHigh; insert(idx, aMsg); // mHigh gets modified in here return idx; } //----------------------------------------------------------------------------- void KMMsgList::remove(int idx) { int i; assert(idx>=0 && idx0 && !at(mHigh-1)) mHigh--; } } //----------------------------------------------------------------------------- void KMMsgList::sort(SortField aField) { int i; KMMsgBasePtr ptrList[mHigh]; if (mHigh < 2) return; sortIndex = new int[mHigh]; sortCriteria = aField; sortList = this; for (i=0; iat(*(int*)a); KMMsgBasePtr mbB = sortList->at(*(int*)b); int res = 0; if (sortCriteria==sfStatus) res = mbA->compareByStatus(mbB); else if (sortCriteria==sfFrom) res = mbA->compareByFrom(mbB); else if (res==0 || sortCriteria==sfSubject) res = mbA->compareBySubject(mbB); if (res==0 || sortCriteria==sfDate) res = mbA->compareByDate(mbB); return res; }