summaryrefslogtreecommitdiffstats
path: root/knode/kncollectionviewitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'knode/kncollectionviewitem.cpp')
-rw-r--r--knode/kncollectionviewitem.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/knode/kncollectionviewitem.cpp b/knode/kncollectionviewitem.cpp
new file mode 100644
index 000000000..ace78a63a
--- /dev/null
+++ b/knode/kncollectionviewitem.cpp
@@ -0,0 +1,172 @@
+/*
+ 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 );
+}