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.
tdevelop/vcs/cvsservice/annotateview.cpp

222 lines
6.7 KiB

/***************************************************************************
* 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 <bernd@mail.berlios.de> *
* Copyright (c) 2003-2005 André Wöbbeking <Woebbeking@web.de> *
* *
* 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 <tqheader.h>
#include <tqdatetime.h>
#include <tqpainter.h>
#include <tdeglobalsettings.h>
#include <tdeglobal.h>
#include <tdelocale.h>
#include <kdebug.h>
#include "annotatepage.h"
class AnnotateViewItem : public TQListViewItem
{
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<AnnotateViewItem*>(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 TDEGlobal::locale()->formatDate(m_logDate.date(), true);
case ContentColumn:
return m_content;
default:
;
};
return TQString();
}
void AnnotateViewItem::paintCell(TQPainter *p, const TQColorGroup &, int col, int width, int align)
{
TQColor backgroundColor;
switch (col)
{
case LineNumberColumn:
backgroundColor = TDEGlobalSettings::highlightColor();
p->setPen(TDEGlobalSettings::highlightedTextColor());
break;
default:
backgroundColor = m_odd ? TDEGlobalSettings::baseColor()
: TDEGlobalSettings::alternateBackgroundColor();
p->setPen(TDEGlobalSettings::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)
: TDEListView(parent, name), TQToolTip( viewport() ),
m_page(parent)
{
setFrameStyle(TQFrame::WinPanel | TQFrame::Sunken);
setAllColumnsShowFocus(true);
setShowToolTips(false);
header()->hide();
addColumn(TQString());
addColumn(TQString());
addColumn(TQString());
addColumn(TQString());
setSorting(AnnotateViewItem::LineNumberColumn);
setColumnAlignment(AnnotateViewItem::LineNumberColumn, TQt::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<AnnotateViewItem*>( 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, "<nobr><b>"+item->text(AnnotateViewItem::AuthorColumn)+"</b></nobr><br>"
"<nobr>"+item->text(AnnotateViewItem::DateColumn)+"</nobr>"
"<pre>"+item->m_comment+"</pre>");
}
}
void AnnotateView::itemClicked(TQListViewItem *item)
{
kdDebug(9006) << "itemClicked()" << endl;
AnnotateViewItem * line = dynamic_cast<AnnotateViewItem*>(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"