diff --git a/kmfolder.cpp b/kmfolder.cpp index 413592587..f787b5356 100644 --- a/kmfolder.cpp +++ b/kmfolder.cpp @@ -60,7 +60,7 @@ static int _rename(const char* oldname, const char* newname) //----------------------------------------------------------------------------- -KMFolder :: KMFolder(KMFolderDir* aParent, const QString& aName) : +KMFolder :: KMFolder(KMFolderDir* aParent, const QString& aName) : KMFolderInherited(aParent, aName), mMsgList(INIT_MSGS) { //-- in case that the compiler has problems with the static version above: @@ -80,7 +80,7 @@ KMFolder :: KMFolder(KMFolderDir* aParent, const QString& aName) : mType = "plain"; mAcctList = NULL; mDirty = FALSE; - unreadMsgs = -1; + mUnreadMsgs = -1; needsCompact = FALSE; mChild = 0; } @@ -137,7 +137,7 @@ const QString KMFolder::subdirLocation() const sLocation += name(); sLocation += ".directory"; - return sLocation; + return sLocation; } //----------------------------------------------------------------------------- @@ -157,7 +157,7 @@ KMFolderDir* KMFolder::createChildFolder() } if (!ok) { - QString wmsg = QString(" '%1': %2").arg(childDir).arg(strerror(errno)); + QString wmsg = QString(" '%1': %2").arg(childDir).arg(strerror(errno)); KMessageBox::information(0,i18n("Failed to create directory") + wmsg); return 0; } @@ -183,7 +183,7 @@ int KMFolder::open() mFilesLocked = FALSE; mStream = fopen(location(), "r+"); // messages file - if (!mStream) + if (!mStream) { kdDebug() << "Cannot open folder `" << (const char*)location() << "': " << strerror(errno) << endl; mOpenCount = 0; @@ -196,7 +196,7 @@ int KMFolder::open() { QString str; mIndexStream = NULL; - str = i18n("Folder `%1' changed. Recreating index.") + str = i18n("Folder `%1' changed. Recreating index.") .arg(name()); emit statusMsg(str); } @@ -272,7 +272,7 @@ void KMFolder::close(bool aForced) if (mOpenCount > 0) mOpenCount--; if (mOpenCount > 0 && !aForced) return; - if (mAutoCreateIndex) + if (mAutoCreateIndex) { if (mDirty) writeIndex(); else sync(); @@ -289,6 +289,7 @@ void KMFolder::close(bool aForced) mStream = NULL; mIndexStream = NULL; mFilesLocked = FALSE; + mUnreadMsgs = -1; mMsgList.reset(INIT_MSGS); } @@ -319,7 +320,7 @@ int KMFolder::lock() { rc = fcntl(fileno(mIndexStream), F_SETLK, &fl); - if (rc < 0) + if (rc < 0) { kdDebug() << "Cannot lock index of folder `" << (const char*)location() << "': " << strerror(errno) << endl; rc = errno; @@ -414,7 +415,7 @@ int KMFolder::createIndexFromContents() if (!fgets(line, MAX_LINE, mStream)) atEof = TRUE; if (atEof || - (strncmp(line,MSG_SEPERATOR_START, msgSepLen)==0 && + (strncmp(line,MSG_SEPERATOR_START, msgSepLen)==0 && regexp.match(line) >= 0)) { size = pos - offs; @@ -469,7 +470,7 @@ int KMFolder::createIndexFromContents() while (line [i]=='\t' || line [i]==' ') i++; if (line [i] < ' ' && line [i]>0) inHeader = FALSE; else if (lastStr) *lastStr += line + i; - } + } else lastStr = NULL; if (inHeader && (line [0]=='\n' || line [0]=='\r')) @@ -477,8 +478,8 @@ int KMFolder::createIndexFromContents() if (!inHeader) continue; /* -sanders Make all messages read when auto-recreating index - if ((needStatus & 1) && strncasecmp(line, "Status:", 7) == 0 && - isblank(line[7])) + if ((needStatus & 1) && strncasecmp(line, "Status:", 7) == 0 && + isblank(line[7])) { for(i=0; i<4 && line[i+8] > ' '; i++) status[i] = line[i+8]; @@ -630,7 +631,7 @@ void KMFolder::readIndex() mMsgList.clear(); if (!readIndexHeader()) return; - unreadMsgs = 0; + mUnreadMsgs = 0; mDirty = FALSE; mHeaderOffset = ftell(mIndexStream); @@ -642,7 +643,7 @@ void KMFolder::readIndex() mi = new KMMsgInfo(this); mi->fromIndexString(line); - if (mi->status() == KMMsgStatusDeleted) + if (mi->status() == KMMsgStatusDeleted) { delete mi; // skip messages that are marked as deleted mDirty = TRUE; @@ -658,7 +659,7 @@ void KMFolder::readIndex() #endif if ((mi->status() == KMMsgStatusNew) || (mi->status() == KMMsgStatusUnread)) - ++unreadMsgs; + ++mUnreadMsgs; mMsgList.append(mi); } } @@ -725,11 +726,11 @@ void KMFolder::removeMsg(int idx) if (mb->status()==KMMsgStatusUnread || mb->status()==KMMsgStatusNew) { - --unreadMsgs; + --mUnreadMsgs; emit numUnreadMsgsChanged( this ); } - if (!mQuiet) + if (!mQuiet) emit msgRemoved(idx, msgIdMD5); else mChanged = TRUE; @@ -753,7 +754,7 @@ KMMessage* KMFolder::take(int idx) msg = (KMMessage*)mMsgList.take(idx); if (msg->status()==KMMsgStatusUnread || msg->status()==KMMsgStatusNew) { - --unreadMsgs; + --mUnreadMsgs; emit numUnreadMsgsChanged( this ); } msg->setParent(NULL); @@ -792,7 +793,7 @@ KMMsgInfo* KMFolder::unGetMsg(int idx) if(!(idx >= 0 && idx <= mMsgList.high())) return 0L; - + mb = mMsgList[idx]; if (!mb) return NULL; @@ -895,7 +896,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret) if (msgParent==this) { if (name() == "outbox") //special case for Edit message. - { + { // debug ("Editing message in outbox"); editing = true; } @@ -928,7 +929,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret) // write message to folder file fseek(mStream, -2, SEEK_END); fread(endStr, 1, 2, mStream); // ensure separating empty line - if (ftell(mStream) > 0 && endStr[0]!='\n') + if (ftell(mStream) > 0 && endStr[0]!='\n') { if (endStr[1]!='\n') { @@ -941,12 +942,12 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret) fseek(mStream,0,SEEK_END); // this is needed on solaris and others revert = ftell(mStream); int error = ferror(mStream); - if (error) + if (error) { if (opened) close(); return error; } - + fprintf(mStream, "From %s %s\n", (const char *)aMsg->fromEmail(), (const char *)aMsg->dateShortStr()); offs = ftell(mStream); @@ -978,7 +979,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret) if (aMsg->status()==KMMsgStatusUnread || aMsg->status()==KMMsgStatusNew) { - ++unreadMsgs; + ++mUnreadMsgs; emit numUnreadMsgsChanged( this ); } @@ -995,7 +996,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret) clearerr(mIndexStream); fseek(mIndexStream, 0, SEEK_END); revert = ftell(mIndexStream); - fprintf(mIndexStream, "%s\n", (const char*)aMsg->asIndexString()); + fprintf(mIndexStream, "%s\n", (const char*)aMsg->asIndexString()); fflush(mIndexStream); error = ferror(mIndexStream); if (error) { @@ -1017,7 +1018,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret) // some "paper work" if (aIndex_ret) *aIndex_ret = idx; - if (!mQuiet) + if (!mQuiet) emit msgAdded(idx); else mChanged = TRUE; @@ -1028,7 +1029,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret) // Return success! // (Don't return status of stream, it may have been closed already.) return 0; -} +} //----------------------------------------------------------------------------- @@ -1050,7 +1051,7 @@ int KMFolder::rename(const QString& aName, KMFolderDir *aParent) oldName = name(); oldParent = parent(); if (aParent) - setParent( aParent ); + setParent( aParent ); setName(aName); newLoc = location(); @@ -1075,7 +1076,7 @@ int KMFolder::rename(const QString& aName, KMFolderDir *aParent) } } } - + if (aParent) { if (oldParent->findRef( this ) != -1) oldParent->take(); @@ -1086,7 +1087,7 @@ int KMFolder::rename(const QString& aName, KMFolderDir *aParent) aParent->inSort( mChild ); } } - + if (openCount > 0) { open(); @@ -1139,11 +1140,11 @@ int KMFolder::expunge() mOpenCount = openCount; } - unreadMsgs = 0; + mUnreadMsgs = 0; emit numUnreadMsgsChanged( this ); - if (mAutoCreateIndex) + if (mAutoCreateIndex) writeConfig(); - if (!mQuiet) + if (!mQuiet) emit changed(); else mChanged = TRUE; @@ -1166,7 +1167,7 @@ int KMFolder::compact() return 0; kdDebug() << "Compacting " << endl; tempName = "." + name(); - + tempName += ".compacted"; unlink(path() + "/" + tempName); tempFolder = new KMFolder(parent(), tempName); //sven: we create it @@ -1201,7 +1202,7 @@ int KMFolder::compact() close(TRUE); mMsgList.clear(TRUE); - if (!rc) { + if (!rc) { _rename(tempName, location()); _rename(tempFolder->indexLocation(), indexLocation()); } @@ -1221,7 +1222,7 @@ int KMFolder::compact() } quiet(FALSE); - if (!mQuiet) + if (!mQuiet) emit changed(); else mChanged = TRUE; @@ -1281,26 +1282,17 @@ const QString KMFolder::label() const //----------------------------------------------------------------------------- int KMFolder::countUnread() { - register int i; - - if (unreadMsgs > -1) - return unreadMsgs; + if (mUnreadMsgs > -1) + return mUnreadMsgs; readConfig(); - if (unreadMsgs > -1) - return unreadMsgs; + if (mUnreadMsgs > -1) + return mUnreadMsgs; - open(); - for (i=0, unreadMsgs=0; istatus()==KMMsgStatusUnread || - mMsgList[i]->status()==KMMsgStatusNew) - unreadMsgs++; - } + open(); // will update unreadMsgs close(); - - return unreadMsgs; + return mUnreadMsgs; } //----------------------------------------------------------------------------- @@ -1318,7 +1310,7 @@ void KMFolder::msgStatusChanged(const KMMsgStatus oldStatus, if (deltaUnread != 0) { mDirty = TRUE; - unreadMsgs += deltaUnread; + mUnreadMsgs += deltaUnread; emit numUnreadMsgsChanged( this ); } } @@ -1328,7 +1320,7 @@ void KMFolder::msgStatusChanged(const KMMsgStatus oldStatus, void KMFolder::headerOfMsgChanged(const KMMsgBase* aMsg) { int idx = mMsgList.find((KMMsgBasePtr)aMsg); - if (idx >= 0 && !mQuiet) + if (idx >= 0 && !mQuiet) emit msgHeaderChanged(idx); else mChanged = TRUE; @@ -1368,7 +1360,8 @@ void KMFolder::readConfig() { KConfig* config = kapp->config(); config->setGroup("Folder-" + idString()); - unreadMsgs = config->readNumEntry("UnreadMsgs", -1); + if (mUnreadMsgs == -1) + mUnreadMsgs = config->readNumEntry("UnreadMsgs", -1); } //----------------------------------------------------------------------------- @@ -1385,12 +1378,6 @@ void KMFolder::correctUnreadMsgsCount() int i; open(); - for (i=0, unreadMsgs=0; istatus()==KMMsgStatusUnread || - mMsgList[i]->status()==KMMsgStatusNew) - unreadMsgs++; - } close(); emit numUnreadMsgsChanged( this ); } diff --git a/kmfolder.h b/kmfolder.h index d4051d471..2eaf39e76 100644 --- a/kmfolder.h +++ b/kmfolder.h @@ -6,7 +6,7 @@ * Major changes: * * 23-10-97: Stefan Taferner - * Source incompatible change! Index of messages now starts at zero + * Source incompatible change! Index of messages now starts at zero * instead of one. * msgSubject(), msgFrom(), msgDate(), and msgStatus() are gone. Use * getMsgBase()->subject() etc. instead. @@ -124,7 +124,7 @@ public: /** Number of messages in this folder. */ virtual int count() const { return mMsgList.count(); } - /** Number of new or unread messages in this folder. + /** Number of new or unread messages in this folder. Rather slow (count loop) */ virtual int countUnread(); @@ -151,7 +151,7 @@ public: virtual void markNewAsUnread(); /** Create a new folder with the name of this object and open it. - Returns zero on success and an error code equal to the + Returns zero on success and an error code equal to the c-library fopen call otherwise. */ virtual int create(); @@ -161,7 +161,7 @@ public: virtual int remove(); /** Delete contents of folder. Forces a close *but* opens the - folder again afterwards. Returns errno(3) error code or zero on + folder again afterwards. Returns errno(3) error code or zero on success. */ virtual int expunge(); @@ -173,7 +173,7 @@ public: and an errno on failure. */ virtual int compact(); - /** Physically rename the folder. Returns zero on success and an errno + /** Physically rename the folder. Returns zero on success and an errno on failure. */ virtual int rename(const QString& newName, KMFolderDir *aParent = 0); @@ -213,7 +213,7 @@ public: bool hasAccounts() const { return (mAcctList != NULL); } /** Tell the folder that a header field that is usually used for - the index (subject, from, ...) has changed of given message. + the index (subject, from, ...) has changed of given message. This method is usually called from within KMMessage::setSubject/set... */ virtual void headerOfMsgChanged(const KMMsgBase*); @@ -261,8 +261,8 @@ protected: /** Read index header. Called from within readIndex(). */ virtual bool readIndexHeader(); - /** Create index file from messages file and fill the message-info list - mMsgList. Returns 0 on success and an errno value (see fopen) on + /** Create index file from messages file and fill the message-info list + mMsgList. Returns 0 on success and an errno value (see fopen) on failure. */ virtual int createIndexFromContents(); @@ -289,10 +289,10 @@ protected: /* Write the config file */ virtual void writeConfig(); - + /* Read the config file */ virtual void readConfig(); - + FILE* mStream; // file with the messages FILE* mIndexStream; // table of contents file KMMsgList mMsgList; // list of index entries or messages @@ -306,7 +306,7 @@ protected: QString mWhoField; // name of the field that is used for "From" in listbox bool mIsSystemFolder; KMAcctList* mAcctList; - long unreadMsgs; // number of unread messages, -1 if not yet set + int mUnreadMsgs; // number of unread messages, -1 if not yet set bool needsCompact; //sven: true if on destruct folder needs to be compacted. KMFolderDir* mChild; }; diff --git a/kmfoldertree.cpp b/kmfoldertree.cpp index ecacb3b2b..2906c86a3 100644 --- a/kmfoldertree.cpp +++ b/kmfoldertree.cpp @@ -48,7 +48,7 @@ public: KMPaintInfo *aPaintInfo ) : QListViewItem( parent, i18n("Mail") ), folder( 0 ), - unread( 0 ), + unread( QString::null ), mPaintInfo( aPaintInfo ) {} @@ -58,7 +58,7 @@ public: KMPaintInfo *aPaintInfo ) : QListViewItem( parent, folder->label() ), folder( folder ), - unread( 0 ), + unread( QString::null ), mPaintInfo( aPaintInfo ) {} @@ -104,7 +104,7 @@ void paintCell( QPainter * p, const QColorGroup & cg, QString t = text( column ); if ( !t.isEmpty() ) { - if( folder && folder->countUnread() > 0 ) { + if( folder && (folder->countUnread() > 0) ) { QFont f = p->font(); f.setWeight(QFont::Bold); p->setFont(f); @@ -116,7 +116,7 @@ void paintCell( QPainter * p, const QColorGroup & cg, p->setPen( mPaintInfo->colUnread ); if (column == 0) p->drawText( br.right(), 0, width-marg-br.right(), height(), - align | AlignVCenter, unread); + align | AlignVCenter, unread ); } } @@ -157,7 +157,7 @@ KMFolderTree::KMFolderTree(QWidget *parent,const char *name) initMetaObject(); - // Espen 2000-05-14: Getting rid of thick ugly frames + // Espen 2000-05-14: Getting rid of thick ugly frames setLineWidth(0); mUpdateTimer = NULL; @@ -253,7 +253,7 @@ void KMFolderTree::readConfig (void) mPaintInfo.pixmapOn = TRUE; mPaintInfo.pixmap = QPixmap( pixmapFile ); } - + readColorConfig(); // Custom/Ssystem font support @@ -498,7 +498,19 @@ void KMFolderTree::doFolderSelected( QListViewItem* qlvi ) if (!folder || folder->isDir()) { emit folderSelected(0); // Root has been selected } - else emit folderSelected(folder); + else { + QString extendedName; + emit folderSelected(folder); + if (folder && (folder->countUnread() > 0) ) { + QString num; + num.setNum(folder->countUnread()); + extendedName = " (" + num + ")"; + } + if (extendedName != fti->unread) { + fti->unread = extendedName; + fti->repaint(); + } + } } //----------------------------------------------------------------------------- @@ -581,7 +593,7 @@ void KMFolderTree::addChildFolder() if (fti->folder) dir = fti->folder->child(); - KMFolderDialog *d = + KMFolderDialog *d = new KMFolderDialog(0, dir, topLevelWidget(), i18n("Create Child Folder") ); if (d->exec()) { @@ -828,7 +840,7 @@ void KMFolderTree::keyPressEvent( QKeyEvent * e ) } //Seems to behave sensibly even if ShiftButton is down, suprising - if (cntrl) { + if (cntrl) { disconnect(this,SIGNAL(currentChanged(QListViewItem*)), this,SLOT(doFolderSelected(QListViewItem*))); switch (e->key()) {