You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/knode/kncollectionviewitem.cpp

173 lines
5.1 KiB

/*
kncollectionviewitem.cpp
KNode, the KDE newsreader
Copyright (c) 1999-2004 the KNode authors.
See file AUTHORS for details
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <qdragobject.h>
#include <qpainter.h>
#include <kiconloader.h>
#include <kstringhandler.h>
#include "kncollectionviewitem.h"
#include "kncollectionview.h"
#include "kngroup.h"
#include "knfolder.h"
#include "knglobals.h"
#include "knconfigmanager.h"
KNCollectionViewItem::KNCollectionViewItem( KFolderTree *parent, Protocol protocol, Type type) :
KFolderTreeItem(parent, QString::null, protocol, type), coll(0)
{
setIcon();
}
KNCollectionViewItem::KNCollectionViewItem( KFolderTreeItem *it, Protocol protocol, Type type, int unread, int total ) :
KFolderTreeItem(it, QString::null, protocol, type, unread, total), coll(0)
{
setIcon();
}
KNCollectionViewItem::~KNCollectionViewItem()
{
if(coll) coll->setListItem(0);
}
void KNCollectionViewItem::setIcon() {
if ( protocol() == KFolderTreeItem::News ) {
// news servers/groups
switch ( type() ) {
case KFolderTreeItem::Root:
setPixmap( 0, SmallIcon("server") );
break;
default:
setPixmap( 0, UserIcon("group") );
}
} else {
// local folders
switch ( type() ) {
case KFolderTreeItem::Outbox:
setPixmap( 0, SmallIcon("folder_outbox") );
break;
case KFolderTreeItem::Drafts:
setPixmap( 0, SmallIcon("edit") );
break;
case KFolderTreeItem::SentMail:
setPixmap( 0, SmallIcon("folder_sent_mail") );
break;
default:
setPixmap( 0, SmallIcon("folder") );
}
}
}
int KNCollectionViewItem::compare(QListViewItem *i, int col, bool ascending) const
{
KFolderTreeItem *other = static_cast<KFolderTreeItem*>(i);
// folders should be always on the bottom
if (protocol() == KFolderTreeItem::Local) {
if (other && other->protocol() == KFolderTreeItem::News)
return ascending ? 1 : -1;
}
// news servers should be always on top
if (protocol() == KFolderTreeItem::News) {
if (other && other->protocol() == KFolderTreeItem::Local)
return ascending ? -1 : 1;
}
return KFolderTreeItem::compare(i, col, ascending);
}
bool KNCollectionViewItem::acceptDrag(QDropEvent* event) const
{
if (event && coll && coll->type()==KNCollection::CTfolder) {
if (event->provides("x-knode-drag/article"))
return !(static_cast<KNFolder*>(coll)->isRootFolder()); // don't drop articles on the root folder
else if (event->provides("x-knode-drag/folder"))
return !isSelected(); // don't drop on itself
}
return false;
}
void KNCollectionViewItem::paintCell( QPainter * p, const QColorGroup & cg,int column, int width, int align )
{
KFolderTree *ft = static_cast<KFolderTree*>( listView() );
// we only need to deal with the case where we paint the folder/group name
// and the unread count is displayed in a separate column
if ( !ft->isUnreadActive() || column != 0 ) {
KFolderTreeItem::paintCell( p, cg, column, width, align );
return;
}
// find out if we will use bold font, necessary for the text squeezing
if ( (column == 0 || column == ft->unreadIndex()) && ( mUnread > 0 ) ) {
QFont f = p->font();
f.setWeight(QFont::Bold);
p->setFont(f);
}
// consider pixmap size for squeezing
int pxWidth = 8;
const QPixmap *px = pixmap(column);
if (px)
pxWidth += px->width();
// temporary set the squeezed text and use the parent class to paint it
QString curText = text( column );
if ( p->fontMetrics().width( curText ) > width - pxWidth ) {
setText( column, squeezeFolderName( curText, p->fontMetrics(), width - pxWidth ) );
KFolderTreeItem::paintCell( p, cg, column, width, align );
setText( column, curText );
} else
KFolderTreeItem::paintCell( p, cg, column, width, align );
}
QString KNCollectionViewItem::squeezeFolderName( const QString &text,
const QFontMetrics &fm,
uint width ) const
{
if (protocol() == KFolderTreeItem::News && type() == KFolderTreeItem::Other) {
QString t(text);
int curPos = 0, nextPos = 0;
QString temp;
while ( (uint)fm.width(t) > width && nextPos != -1 ) {
nextPos = t.find('.', curPos);
if ( nextPos != -1 ) {
temp = t[curPos];
t.replace( curPos, nextPos - curPos, temp );
curPos += 2;
}
}
if ( (uint)fm.width( t ) > width )
t = KStringHandler::rPixelSqueeze( t, fm, width );
return t;
} else
return KFolderTreeItem::squeezeFolderName( text, fm, width );
}