summaryrefslogtreecommitdiffstats
path: root/knode/knhdrviewitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'knode/knhdrviewitem.cpp')
-rw-r--r--knode/knhdrviewitem.cpp294
1 files changed, 294 insertions, 0 deletions
diff --git a/knode/knhdrviewitem.cpp b/knode/knhdrviewitem.cpp
new file mode 100644
index 000000000..93b54fc0a
--- /dev/null
+++ b/knode/knhdrviewitem.cpp
@@ -0,0 +1,294 @@
+/*
+ knhdrviewitem.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
+*/
+
+#include <qdragobject.h>
+#include <qpainter.h>
+
+#include <kdeversion.h>
+#include <kdebug.h>
+#include <kstringhandler.h>
+
+#include "knglobals.h"
+#include "knconfigmanager.h"
+#include "knhdrviewitem.h"
+#include "knarticle.h"
+#include "headerview.h"
+
+
+KNHdrViewItem::KNHdrViewItem( KNHeaderView *ref, KNArticle *a ) :
+ KListViewItem( ref )
+{
+ init( a );
+}
+
+
+KNHdrViewItem::KNHdrViewItem( KNHdrViewItem *ref, KNArticle *a ) :
+ KListViewItem( ref )
+{
+ init( a );
+}
+
+
+void KNHdrViewItem::init( KNArticle *a )
+{
+ art = a;
+ mActive = false;
+ for ( int i = 0; i < 5; ++i) // FIXME hardcoded column count
+ mShowToolTip[i] = false;
+}
+
+
+KNHdrViewItem::~KNHdrViewItem()
+{
+ if (mActive) {
+ QListView *lv = listView();
+ if (lv)
+ static_cast<KNHeaderView*>( lv )->activeRemoved();
+ }
+
+ if (art) art->setListItem( 0 );
+}
+
+
+void KNHdrViewItem::expandChildren()
+{
+ QListViewItemIterator it( firstChild() );
+ for ( ; it.current(); ++it) {
+ if (it.current()->depth() <= depth())
+ break;
+ it.current()->setOpen( true );
+ }
+}
+
+
+int KNHdrViewItem::compare( QListViewItem *i, int col, bool ) const
+{
+ KNArticle *otherArticle = static_cast<KNHdrViewItem*>( i )->art;
+ int diff = 0;
+ time_t date1 = 0, date2 = 0;
+
+ switch (col) {
+ case 0:
+ case 1:
+ return text( col ).localeAwareCompare( i->text(col) );
+
+ case 2:
+ if (art->type() == KMime::Base::ATremote) {
+ diff = static_cast<KNRemoteArticle*>( art )->score() - static_cast<KNRemoteArticle*>( otherArticle )->score();
+ return (diff < 0 ? -1 : diff > 0 ? 1 : 0);
+ } else
+ return 0;
+
+ case 3:
+ diff = art->lines()->numberOfLines() - otherArticle->lines()->numberOfLines();
+ return (diff < 0 ? -1 : diff > 0 ? 1 : 0);
+
+ case 4:
+ date1 = art->date()->unixTime();
+ date2 = otherArticle->date()->unixTime();
+ if (art->type() == KMime::Base::ATremote && static_cast<KNHeaderView*>( listView() )->sortByThreadChangeDate()) {
+ if (static_cast<KNRemoteArticle*>( art )->subThreadChangeDate() > date1)
+ date1 = static_cast<KNRemoteArticle*>( art )->subThreadChangeDate();
+ if (static_cast<KNRemoteArticle*>( otherArticle )->subThreadChangeDate() > date2)
+ date2 = static_cast<KNRemoteArticle*>( otherArticle )->subThreadChangeDate();
+ }
+ diff = date1 - date2;
+ return (diff < 0 ? -1 : diff > 0 ? 1 : 0);
+
+ default:
+ return 0;
+ }
+}
+
+
+void KNHdrViewItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment )
+{
+ int xText = 0, xPM = 3, yPM = 0;
+ QColor base;
+ const KPaintInfo *paintInfo = static_cast<KNHeaderView*>( listView() )->paintInfo();
+
+ QPen pen = p->pen();
+ if (isSelected() || mActive) {
+ pen.setColor( cg.highlightedText() );
+ base = cg.highlight();
+ } else {
+ if (greyOut())
+ pen.setColor( greyColor() );
+ else
+ pen.setColor( normalColor() );
+ base = backgroundColor( column );
+ }
+
+ p->setPen( pen );
+
+ p->fillRect( 0, 0, width, height(), QBrush(base) );
+
+ if ( column == paintInfo->subCol ) {
+ QFont font = p->font();
+ font.setBold( firstColBold() );
+ p->setFont( font );
+ const QPixmap *pm;
+
+ for (int i = 0; i < 4; i++) {
+ pm = pixmap( i );
+ if (pm && !pm->isNull()) {
+ yPM = (height() - pm->height()) / 2;
+ p->drawPixmap( xPM, yPM, *pm );
+ xPM += pm->width() + 3;
+ }
+ }
+
+ xText = xPM;
+ }
+
+ if (width - xText - 5 > 0) {
+ int cntWidth = 0;
+ QString t2;
+ QFont f2;
+ if (countUnreadInThread() > 0 && column == paintInfo->subCol && !isOpen()) {
+ t2 = QString( " (%1)" ).arg( countUnreadInThread() );
+ f2 = p->font();
+ f2.setBold( true );
+ cntWidth = QFontMetrics( f2 ).width( t2, -1 );
+ }
+ QString t = KStringHandler::rPixelSqueeze( text( column ), p->fontMetrics(), width - xText - cntWidth - 5 );
+
+ // show tooltip if we have to squeeze the text
+ if ( t != text( column ) )
+ mShowToolTip[column] = true;
+ else
+ mShowToolTip[column] = false;
+
+ p->drawText( xText, 0, width - xText - 5, height(), alignment | AlignVCenter, t );
+ if (cntWidth) {
+ QFont orig = p->font();
+ p->setFont( f2 );
+ QPen pen = p->pen();
+ if (isSelected() || mActive) {
+ pen.setColor( cg.highlightedText() );
+ } else {
+ pen.setColor( cg.link() );
+ }
+ p->setPen( pen );
+ p->drawText( xText + QFontMetrics( orig ).width( t, -1 ), 0, width - xText - 5, height(), alignment | AlignVCenter, t2 );
+ }
+ }
+}
+
+
+int KNHdrViewItem::width( const QFontMetrics &fm, const QListView *, int column )
+{
+ int ret = fm.boundingRect( text(column) ).width();
+ const KPaintInfo *paintInfo = static_cast<KNHeaderView*>( listView() )->paintInfo();
+
+ // all pixmaps are drawn in the first column
+ if ( column == paintInfo->subCol ) {
+ const QPixmap *pm;
+ for (int i = 0; i < 4; ++i) {
+ pm = pixmap( i );
+ if (pm && !pm->isNull())
+ ret += pm->width() + 3;
+ }
+ }
+
+ return ret;
+}
+
+
+QString KNHdrViewItem::text( int col ) const
+{
+ if ( !art )
+ return QString::null;
+ KNHeaderView *hv = static_cast<KNHeaderView*>( listView() );
+
+ if ( col == hv->paintInfo()->subCol ) {
+ return art->subject()->asUnicodeString();
+ }
+
+ if ( col == hv->paintInfo()->sizeCol ) {
+ if ( art->lines()->numberOfLines() != -1 )
+ return QString::number( art->lines()->numberOfLines() );
+ else
+ return QString::null;
+ }
+
+ if ( col == hv->paintInfo()->scoreCol ) {
+ if ( art->type() == KMime::Base::ATremote )
+ return QString::number( static_cast<KNRemoteArticle*>( art )->score() );
+ else
+ return QString::null;
+ }
+
+ if ( col == hv->paintInfo()->dateCol ) {
+ return hv->mDateFormatter.dateString( art->date()->qdt() );
+ } else
+ return KListViewItem::text( col );
+}
+
+
+QDragObject* KNHdrViewItem::dragObject()
+{
+ QDragObject *d = new QStoredDrag( "x-knode-drag/article" , listView()->viewport() );
+ d->setPixmap( knGlobals.configManager()->appearance()->icon( KNConfig::Appearance::posting ) );
+ return d;
+}
+
+
+int KNHdrViewItem::countUnreadInThread()
+{
+ int count = 0;
+ if (knGlobals.configManager()->readNewsGeneral()->showUnread()) {
+ if (art->type() == KMime::Base::ATremote) {
+ count = static_cast<KNRemoteArticle*>( art )->unreadFollowUps();
+ }
+ }
+ return count;
+}
+
+
+bool KNHdrViewItem::greyOut()
+{
+ if (art->type() == KMime::Base::ATremote) {
+ return !static_cast<KNRemoteArticle*>( art )->hasUnreadFollowUps()
+ && static_cast<KNRemoteArticle*>( art )->isRead();
+ } else
+ return false;
+}
+
+
+bool KNHdrViewItem::firstColBold()
+{
+ if(art->type() == KMime::Base::ATremote)
+ return static_cast<KNRemoteArticle*>( art )->isNew();
+ else
+ return false;
+}
+
+
+QColor KNHdrViewItem::normalColor()
+{
+ if (art->type()==KMime::Base::ATremote)
+ return static_cast<KNRemoteArticle*>( art )->color();
+ else
+ return knGlobals.configManager()->appearance()->unreadThreadColor();
+}
+
+
+QColor KNHdrViewItem::greyColor()
+{
+ return knGlobals.configManager()->appearance()->readThreadColor();
+}
+