/***************************************************************************
 *   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"
