/* This file is part of the KDE project
   Copyright (C) 2006 David Nolden <david.nolden.kdevelop@art-master.de>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.
*/

#ifndef FANCYLISTVIEWITEM
#define FANCYLISTVIEWITEM

#include <tqvaluevector.h>
#include <tqpainter.h>
#include <tqfont.h>
#include <tqlistview.h>
#include <tdelistview.h>

class TextPaintStyleStore {
    public:
        class Item {
            public:
            TQFont font;
            TQColor color;
            TQColor background;
            
            Item(const TQFont& f = TQFont(), const TQColor& c = TQColor(), const TQColor b = TQColor() ) : font(f), color(c), background(b) {
            }
            
            bool bgValid() {
                return background.isValid();
            }
            
            bool colValid() {
                return color.isValid();
            }
        };
        
        typedef TQMap<int, Item> Store ;
    
        TextPaintStyleStore( TQFont defaultFont=TQFont() ) {
            m_styles.insert( 0, Item( defaultFont ) );
        }
        
        Item& getStyle( int num ) {
            Store::Iterator it = m_styles.find( num );
            if( it != m_styles.end() ) return *it;
            return m_styles[0];
        }
        
        void addStyle( int num, Item& style ) {
            m_styles[num] = style;
        }
        
        void addStyle( int num, const TQFont& font ) {
            m_styles[num] = Item( font );
        }
        
        bool hasStyle( int num ) {
            Store::Iterator it = m_styles.find( num );
            return ( it != m_styles.end() );
        }
        
    private:
        Store m_styles;
};

class TextPaintItem {
    public:
        struct Item {
            TQString text;
            int style;
            
            Item( const TQString& t = "", int st = 0 ) : text(t), style(st) {
            }
            
        };
        typedef TQValueList<Item> Chain;
        
        Chain& items() {
            return m_chain;
        }
        
        TextPaintItem(const TQString& text="") {
            addItem( text );
        }
        
        Item& addItem(const TQString& item, int style = 0) {
            m_chain.append( Item(item, style) );
            return m_chain.back();
        }
        
        void clear() {
            m_chain.clear();
        }
        
        operator TQString () const {
            TQString ret;
            Chain::const_iterator it = m_chain.begin();
            while(it != m_chain.end()) {
                ret += (*it).text;
                ++it;
            }
            return ret;
        }
        
    private:
        Chain m_chain;
};

///does not support multiple column, a "column" represents a part of the real first column
///TDEListViewItem is only needed for the background-color

class FancyListViewItem : public TDEListViewItem
{
    public:
        FancyListViewItem(TextPaintStyleStore& styles, TQListView *parent, const TQString &label1, const TQString &label2="") : TDEListViewItem(parent, label1, label2), m_styles(styles) {
            init(label1, label2);
        }
        
        FancyListViewItem(TextPaintStyleStore& styles, TQListViewItem *parent, const TQString &label1, const TQString &label2="") : TDEListViewItem(parent, label1, label2), m_styles(styles) {
            init(label1, label2);
        }
        
        virtual void paintCell(TQPainter *painter, const TQColorGroup &cg, int column, int width, int align);
        virtual int width(const TQFontMetrics &fm, const TQListView *lv, int column);
        virtual void setText ( int column, const TQString & text );
        virtual TQString text(int column) const;
        
        inline void clear() {
            m_items.clear();
        }
        
        inline TextPaintItem& item(int column = 0) {
            if(m_items.isEmpty()) {
                m_items.append( TextPaintItem() );
            }
            
            return m_items[column];
        }
        
        void setItem(int column, TextPaintItem item);
    private:
        virtual TQColor backgroundColor(int col);
        void init(const TQString& label1, const TQString& label2);
        int textWidth(const TQFont& font, const TQString& text);
        TQValueVector<TextPaintItem> m_items;
    protected:
        TextPaintStyleStore& m_styles;
};

#endif
