/* This file is part of the KDE project
   Copyright (C) 2005 Dag Andersen <kplato@kde.org>

   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 KPTDOUBLELISTVIEWBASE_H
#define KPTDOUBLELISTVIEWBASE_H

#include <tqcolor.h>
#include <tqmap.h>
#include <tqptrvector.h>
#include <tqsplitter.h>

#include <tdelistview.h>

class TQListViewItem;

class TDEListViewItem;
class KPrinter;

namespace KPlato
{

class View;
class Project;

class ListView : public TDEListView
{
public:
    ListView(TQWidget *parent)
    : TDEListView(parent)
    {}
    
    virtual void paintToPrinter(TQPainter * p, int cx, int cy, int cw, int ch);
};

/**
 * The class DoubleListViewBase provides a double listview
 * where the right listview (the slave) containes columns of
 * double values and the left listview (the master) is the 'item' listview
 * and also provides for a sum total column of the values in the slave listview.
 * This makes it possible to scroll the slave listview and still see the values
 * in the master listview.
 */
class DoubleListViewBase : public TQSplitter
{
    TQ_OBJECT
  
public:

    DoubleListViewBase(TQWidget *parent, bool description=false);

    //~DoubleListViewBase();

    ListView *masterListView() const { return m_masterList; }
    ListView *slaveListView() const { return m_slaveList; }
    void setOpen(TQListViewItem *item, bool open);
    
    void setNameHeader(TQString text);
    void setTotalHeader(TQString text);
    void setDescriptionHeader(TQString text);
    void addSlaveColumn(TQString text);
    virtual void print(KPrinter &printer);

    virtual void calculate();
    void clearLists();
    virtual void createSlaveItems();
    void clearSlaveList();
    void setFormat(int fieldwidth=0, char fmt='f', int prec=0);
    void setMasterFormat(int fieldwidth=0, char fmt='f', int prec=0);
    void setSlaveFormat(int fieldwidth=0, char fmt='f', int prec=0);
    virtual TQSize sizeHint() const;
    
    class MasterListItem;
    class SlaveListItem : public TDEListViewItem {
    public:
        SlaveListItem(MasterListItem *master, TQListView *parent, TQListViewItem *after, bool highlight=false);
        SlaveListItem(MasterListItem *master, TQListViewItem *parent, TQListViewItem *after, bool highlight=false);
        ~SlaveListItem();
        void masterItemDeleted() { m_masterItem = 0; }
        
        virtual void setColumn(int col, double value);
        virtual void clearColumn(int col);
        
        double value(int col) const { return m_valueMap[col]; }
        void setLimit(int col, double limit);
        void setHighlight(bool on) { m_highlight = on; }

        virtual void paintCell(TQPainter *p, const TQColorGroup &cg, int column, int width, int align);
        
        void setFormat(int fieldwidth=0, char fmt='f', int prec=0);

    protected:
        MasterListItem *m_masterItem;
        double m_value;
        bool m_highlight;

        TQMap<int, double> m_valueMap;
        TQMap<int, double> m_limitMap;
        
        int m_fieldwidth;
        char m_fmt;
        int m_prec;
    };

    class MasterListItem : public TDEListViewItem {
    public:
        MasterListItem(TQListView *parent, bool highlight=false);
        MasterListItem(TQListView *parent, TQString text, bool highlight=false);
        MasterListItem(TQListViewItem *parent, bool highlight=false);
        MasterListItem(TQListViewItem *parent, TQString text, bool highlight=false);
        ~MasterListItem();
        
        /// Creates slaveitems for myself and my children
        void createSlaveItems(TQListView *lv, TQListViewItem *after=0);
        void slaveItemDeleted();
        void setSlaveOpen(bool on);
        SlaveListItem *slaveItem() const { return m_slaveItem; }
        double value() const { return m_value; }
        
        void setTotal(double tot);
        double calcTotal();
        void addToTotal(double v);
        void setSlaveItem(int col, double value);
        void setSlaveLimit(int col, double limit);
        void setLimit(double limit) { m_limit = limit; }
        void setHighlight(bool on) { m_highlight = on; }
        void setSlaveHighlight(bool on);
        void clearColumn(int col);
        void calcSlaveItems();
        virtual double calcSlaveItems(int col);

        virtual void paintCell(TQPainter *p, const TQColorGroup &cg, int column, int width, int align);    

        void setFormat(int fieldwidth=0, char fmt='f', int prec=0);

    protected:
        SlaveListItem *m_slaveItem;
        double m_value;
        double m_limit;
        bool m_highlight;
        
        TQMap<int, double> m_valueMap;
    
        int m_fieldwidth;
        char m_fmt;
        int m_prec;
    };

public:
    virtual void paintContents(TQPainter *p);
    
protected slots:
    void slotExpanded(TQListViewItem* item);
    void slotCollapsed(TQListViewItem* item);

private:

private:
    ListView *m_masterList;
    ListView *m_slaveList;
    
    int m_fieldwidth;
    char m_fmt;
    int m_prec;
};

}  //KPlato namespace

#endif
