/*************************************************************************** * Copyright (C) 2005 by Robert Gruber * * rgruber@users.sourceforge.net * * * * This file has been taken from cervisia an adapted to fit my needs: * * Copyright (C) 1999-2002 Bernd Gehrmann * * Copyright (c) 2003-2005 André Wöbbeking * * * * 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. * * * ***************************************************************************/ #include "annotateview.h" #include #include #include #include #include #include #include #include "annotatepage.h" class AnnotateViewItem : public QListViewItem { friend class AnnotateView; public: enum { LineNumberColumn, AuthorColumn, DateColumn,ContentColumn }; AnnotateViewItem(AnnotateView *parent, TQString rev, TQString author, TQDateTime date, TQString content, TQString comment, bool odd, int linenumber); virtual int compare(TQListViewItem *item, int col, bool ascending) const; virtual int width(const TQFontMetrics &, const TQListView *, int col) const; virtual TQString text(int col) const; virtual void paintCell(TQPainter *, const TQColorGroup &, int, int, int); private: TQString m_revision; TQString m_author; TQString m_content; TQString m_comment; TQDateTime m_logDate; bool m_odd; int m_lineNumber; static const int BORDER; }; const int AnnotateViewItem::BORDER = 4; AnnotateViewItem::AnnotateViewItem(AnnotateView *parent, TQString rev, TQString author, TQDateTime date, TQString content, TQString comment, bool odd, int linenumber) : TQListViewItem(parent) , m_revision(rev) , m_author(author) , m_content(content) , m_comment(comment) , m_logDate(date) , m_odd(odd) , m_lineNumber(linenumber) {} int AnnotateViewItem::compare(TQListViewItem *item, int, bool) const { int linenum1 = m_lineNumber; int linenum2 = static_cast(item)->m_lineNumber; return (linenum2 > linenum1)? -1 : (linenum2 < linenum1)? 1 : 0; } TQString AnnotateViewItem::text(int col) const { switch (col) { case LineNumberColumn: return TQString::number(m_lineNumber); case AuthorColumn: return (m_revision + TQChar(' ') + m_author); case DateColumn: return KGlobal::locale()->formatDate(m_logDate.date(), true); case ContentColumn: return m_content; default: ; }; return TQString::null; } void AnnotateViewItem::paintCell(TQPainter *p, const TQColorGroup &, int col, int width, int align) { TQColor backgroundColor; switch (col) { case LineNumberColumn: backgroundColor = KGlobalSettings::highlightColor(); p->setPen(KGlobalSettings::highlightedTextColor()); break; default: backgroundColor = m_odd ? KGlobalSettings::baseColor() : KGlobalSettings::alternateBackgroundColor(); p->setPen(KGlobalSettings::textColor()); break; }; p->fillRect(0, 0, width, height(), backgroundColor); TQString str = text(col); if (str.isEmpty()) return; if (align & (AlignTop || AlignBottom) == 0) align |= AlignVCenter; p->drawText(BORDER, 0, width - 2*BORDER, height(), align, str); } int AnnotateViewItem::width(const TQFontMetrics &fm, const TQListView *, int col) const { return fm.width(text(col)) + 2*BORDER; } /******************************************************************************/ /*****************Definition of class AnnotateView ****************************/ /******************************************************************************/ AnnotateView::AnnotateView(AnnotatePage *parent, const char *name) : KListView(parent, name), TQToolTip( viewport() ), m_page(parent) { setFrameStyle(TQFrame::WinPanel | TQFrame::Sunken); setAllColumnsShowFocus(true); setShowToolTips(false); header()->hide(); addColumn(TQString::null); addColumn(TQString::null); addColumn(TQString::null); addColumn(TQString::null); setSorting(AnnotateViewItem::LineNumberColumn); setColumnAlignment(AnnotateViewItem::LineNumberColumn, Qt::AlignRight); connect( this, TQT_SIGNAL(executed(TQListViewItem*)), this, TQT_SLOT(itemClicked(TQListViewItem*)) ); } void AnnotateView::addLine(TQString rev, TQString author, TQDateTime date, TQString content, TQString comment, bool odd) { new AnnotateViewItem(this, rev, author, date, content, comment, odd, childCount()+1); } TQSize AnnotateView::sizeHint() const { TQFontMetrics fm(fontMetrics()); return TQSize(100 * fm.width("0"), 20 * fm.lineSpacing()); } void AnnotateView::maybeTip( const TQPoint & p ) { AnnotateViewItem * item = dynamic_cast( itemAt( p ) ); if (!item) return; const int column(header()->sectionAt(p.x())); if (column != AnnotateViewItem::AuthorColumn && column != AnnotateViewItem::DateColumn) { return; } TQRect r = itemRect( item ); //get the dimension of the author + the date column TQRect headerRect = header()->sectionRect(AnnotateViewItem::AuthorColumn); headerRect = headerRect.unite(header()->sectionRect(AnnotateViewItem::DateColumn)); r.setLeft(headerRect.left()); r.setWidth(headerRect.width()); if (r.isValid()) { tip( r, ""+item->text(AnnotateViewItem::AuthorColumn)+"
" ""+item->text(AnnotateViewItem::DateColumn)+"" "
"+item->m_comment+"
"); } } void AnnotateView::itemClicked(TQListViewItem *item) { kdDebug(9006) << "itemClicked()" << endl; AnnotateViewItem * line = dynamic_cast(item); if (line) { kdDebug(9006) << "requesting annotate for revision " << line->m_revision << endl; emit m_page->requestAnnotate(line->m_revision); } else { kdDebug(9006) << "This is not an AnnotateViewItem" << endl; } } #include "annotateview.moc"