* Sorting messages: replaced sorting algorithm, which caused

random hangs, with stock qsort -- hopefully working now ;-)

* Fixed: folder list went out of scope (current item pointing to
nowhere) when folder was deleted.

* Composer: fixed broken confirm-close dialog.

* Increased version to better match upcoming Kde-1.1 release.

* Added call to kapp->quit() when last window is closed.

svn path=/trunk/kdenetwork/kmail/; revision=11183
wilder-work
Stefan Taferner 28 years ago
parent 690e907810
commit fed80bf3b5
  1. 14
      ChangeLog
  2. 9
      kmcomposewin.cpp
  3. 2
      kmfolder.cpp
  4. 24
      kmfoldertree.cpp
  5. 1
      kmfoldertree.h
  6. 16
      kmheaders.cpp
  7. 2
      kmmainwin.cpp
  8. 63
      kmmsglist.cpp
  9. 2
      kmmsglist.h
  10. 2
      kmreaderwin.cpp
  11. 4
      kmtopwidget.cpp
  12. 6
      kmtopwidget.h
  13. 2
      kmversion.h

@ -1,3 +1,17 @@
1998-10-08 Stefan Taferner <taferner@kde.org> (KMail-1.0.5)
* Sorting messages: replaced sorting algorithm, which caused
random hangs, with stock qsort -- hopefully working now ;-)
* Fixed: folder list went out of scope (current item pointing to
nowhere) when folder was deleted.
* Composer: fixed broken confirm-close dialog.
* Increased version to better match upcoming Kde-1.1 release.
* Added call to kapp->quit() when last window is closed.
1998-09-26 Stefan Taferner <taferner@kde.org> (KMail-0.8.1)
* Fixed crash upon close of a main- or composer window.

@ -185,6 +185,8 @@ KMComposeWin::KMComposeWin(KMMessage *aMsg) : KMComposeWinInherited(),
//-----------------------------------------------------------------------------
KMComposeWin::~KMComposeWin()
{
debug("~KMComposeWin()");
writeConfig();
if (mAutoDeleteMsg && mMsg) delete mMsg;
@ -887,10 +889,13 @@ bool KMComposeWin::applyChanges(void)
//-----------------------------------------------------------------------------
void KMComposeWin::closeEvent(QCloseEvent* e)
{
int rc;
if(mEditor->isModified())
{
if((KMsgBox::yesNo(0,i18n("KMail Confirm"),
i18n("Close and discard\nedited message?")) == 2))
rc = KMsgBox::yesNo(0,i18n("KMail Confirm"),
i18n("Close and discard\nedited message?"));
if (rc != 1)
{
e->ignore();
return;

@ -705,7 +705,7 @@ int KMFolder::moveMsg(KMMessage* aMsg, int* aIndex_ret)
rc = addMsg(aMsg, aIndex_ret);
close();
debug("KMFolder::moveMsg() rc=%i",rc);
// debug("KMFolder::moveMsg() rc=%i",rc);
return rc;
}

@ -28,8 +28,6 @@ KMFolderTree::KMFolderTree(QWidget *parent,const char *name) :
initMetaObject();
mLastIdx = -1;
mDropZone = new KDNDDropZone(this, DndRawData);
connect(mDropZone, SIGNAL(dropAction(KDNDDropZone*)),
this, SLOT(doDropAction(KDNDDropZone*)));
@ -120,6 +118,7 @@ void KMFolderTree::reload(void)
void KMFolderTree::doFolderListChanged()
{
uint idx = currentItem();
debug("doFolderListChanged()");
reload();
if (idx >= 0 && idx < count()) setCurrentItem(idx);
}
@ -188,23 +187,20 @@ void KMFolderTree::doFolderSelected(int index, int)
{
KMFolder* folder;
if (index < 0 || index == mLastIdx) return;
mLastIdx = index;
if (index < 0) return;
folder = (KMFolder*)mList.at(index);
printf("doFolderSelected\n");
if(folder)
{
if (folder->isDir())
{
if (folder->isDir())
{
debug("Folder `%s' is a directory -> ignoring it.",
(const char*)folder->name());
emit folderSelected(NULL);
}
else emit folderSelected(folder);
debug("Folder `%s' is a directory -> ignoring it.",
(const char*)folder->name());
emit folderSelected(NULL);
}
else emit folderSelected(folder);
}
}

@ -41,7 +41,6 @@ protected:
KMFolderNodeList mList;
KDNDDropZone* mDropZone;
int mLastIdx;
};
#endif

@ -277,6 +277,12 @@ void KMHeaders::headerClicked(int column)
KMMsgBasePtr cur;
const char* sortStr = "(unknown)";
QString msg;
static bool working = FALSE;
if (working) return;
working = TRUE;
kbp->busy();
if (idx >= 0) cur = (*mFolder)[idx];
else cur = NULL;
@ -302,13 +308,12 @@ void KMHeaders::headerClicked(int column)
else if (mSortCol==(int)KMMsgList::sfFrom) sortStr = i18n("sender");
else if (mSortCol==(int)KMMsgList::sfStatus) sortStr = i18n("status");
if (mSortDescending) msg.sprintf(i18n("Sorting messages descending by %s"), sortStr);
if (mSortDescending) msg.sprintf(i18n("Sorting messages descending by %s"),
sortStr);
else msg.sprintf(i18n("Sorting messages ascending by %s"), sortStr);
mOwner->statusMsg(msg);
kbp->busy();
sort();
kbp->idle();
if (cur) idx = mFolder->find(cur);
else idx = 0;
@ -317,6 +322,11 @@ void KMHeaders::headerClicked(int column)
idx -= 3;
if (idx < 0) idx = 0;
setTopItem(idx);
mOwner->statusMsg(msg);
kapp->processEvents(200);
working = FALSE;
kbp->idle();
}

@ -120,6 +120,8 @@ KMMainWin::KMMainWin(QWidget *, char *name) :
//-----------------------------------------------------------------------------
KMMainWin::~KMMainWin()
{
debug("~KMMainWin()");
writeConfig();
if (mHeaders) delete mHeaders;

@ -4,6 +4,9 @@
#include <assert.h>
#include <stdlib.h>
static KMMsgList::SortField sSortField;
static bool sSortDescending;
//-----------------------------------------------------------------------------
KMMsgList::KMMsgList(int initSize): KMMsgListInherited(initSize)
@ -181,8 +184,11 @@ void KMMsgList::rethinkHigh(void)
}
}
void KMMsgList::qsort(int left, int right, SortField aField, bool aDescending) {
debug("KMmsgList::qsort()");
//-----------------------------------------------------------------------------
void KMMsgList::qsort(int left, int right, SortField aField, bool aDescending)
{
// debug("KMmsgList::qsort()");
if(right <= left)
return;
@ -192,7 +198,7 @@ void KMMsgList::qsort(int left, int right, SortField aField, bool aDescending) {
int j = right;
// $markus: Yes, I am paranoid ;-)
if((i + j / 2) < 0 || (i +j / 2) > KMMsgListInherited::size())
if((i + j / 2) < 0 || (i + j / 2) > KMMsgListInherited::size())
return;
KMMsgBasePtr pivot = KMMsgListInherited::at((int)((i + j) / 2));
@ -212,40 +218,47 @@ void KMMsgList::qsort(int left, int right, SortField aField, bool aDescending) {
}
} while(i <= j);
if(left < j)
this->qsort(left, j, aField, aDescending);
if(i < right)
this->qsort(i, right, aField, aDescending);
if(left < j) qsort(left, j, aField, aDescending);
if(i < right) qsort(i, right, aField, aDescending);
debug("KMsgList::qsort() leaving");
// debug("KMsgList::qsort() leaving");
}
//-----------------------------------------------------------------------------
int qsortCompFunc(const void* a, const void* b)
{
return KMMsgList::msgSortCompFunc(*(KMMsgBasePtr*)a, *(KMMsgBasePtr*)b,
sSortField, sSortDescending);
}
//-----------------------------------------------------------------------------
void KMMsgList::sort(SortField aField, bool aDescending)
{
#define SLOW_SORT
#ifndef SLOW_SORT
qsort(0, mHigh-1, aField, aDescending);
#else
#else /*SLOW_SORT*/
debug("KMMsgList::sort()");
int i, j;
KMMsgBasePtr mb;
KMMsgBasePtr sortList[mHigh];
int i;
if (mHigh < 2) return;
for (j=0; j<mHigh; j++)
{
for (i=0; i<mHigh-1; i++)
{
if (msgSortCompFunc(KMMsgListInherited::at(i), KMMsgListInherited::at(i+1),
aField, aDescending) > 0)
{
mb = KMMsgListInherited::at(i);
KMMsgListInherited::at(i) = KMMsgListInherited::at(i+1);
KMMsgListInherited::at(i+1) = mb;
}
}
}
#endif
sSortField = aField;
sSortDescending = aDescending;
for (i=0; i<mHigh; i++)
sortList[i] = KMMsgListInherited::at(i);
::qsort(sortList, mHigh, sizeof(KMMsgBasePtr), &qsortCompFunc);
for (i=0; i<mHigh; i++)
KMMsgListInherited::at(i) = sortList[i];
#endif /*SLOW_SORT*/
}

@ -72,6 +72,8 @@ public:
int size(void) const { return ((int)KMMsgListInherited::size()); }
protected:
friend int qsortCompFunc(const void* a, const void* b);
/** Set mHigh to proper value */
void rethinkHigh(void);

@ -652,8 +652,6 @@ void KMReaderWin::slotUrlOn(const char* aUrl)
KMMessagePart msgPart;
id = msgPartFromUrl(aUrl);
debug("id: %i",id);
if (id <= 0)
{
emit statusMsg(aUrl);

@ -19,18 +19,22 @@
#include "kmtopwidget.h"
#include <kapp.h>
int KMTopLevelWidget::sWindowCount = 0;
//-----------------------------------------------------------------------------
KMTopLevelWidget::KMTopLevelWidget(const char* aName):
KMTopLevelWidgetInherited(aName)
{
initMetaObject();
sWindowCount++;
}
//-----------------------------------------------------------------------------
KMTopLevelWidget::~KMTopLevelWidget()
{
sWindowCount--;
if (sWindowCount <= 0) kapp->quit();
}

@ -53,7 +53,11 @@ public:
// virtual bool close(bool forceKill=FALSE);
protected:
virtual void closeEvent(QCloseEvent*);
virtual void closeEvent(QCloseEvent*);
private:
// app->quit() is called when sWindowCount<=0 in destructor
static int sWindowCount;
};
#endif /*kmtopwidget_h*/

@ -3,6 +3,6 @@
#ifndef kmversion_h
#define kmversion_h
#define KMAIL_VERSION "0.8.1"
#define KMAIL_VERSION "1.0.5"
#endif /*kmversion_h*/

Loading…
Cancel
Save