/****************************************************************************
 ** Copyright (C) 2001-2006 Klarälvdalens Datakonsult AB.  All rights reserved.
 **
 ** This file is part of the KD Gantt library.
 **
 ** This file may be distributed and/or modified under the terms of the
 ** GNU General Public License version 2 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.GPL included in the
 ** packaging of this file.
 **
 ** Licensees holding valid commercial KD Gantt licenses may use this file in
 ** accordance with the KD Gantt Commercial License Agreement provided with
 ** the Software.
 **
 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 **
 ** See http://www.kdab.net/kdgantt for
 **   information about KD Gantt Commercial License Agreements.
 **
 ** Contact info@kdab.net if any conditions of this
 ** licensing are not clear to you.
 **
 **********************************************************************/
#ifndef KDGANTTDATETIMEGRID_H
#define KDGANTTDATETIMEGRID_H

#include "kdganttabstractgrid.h"

#include <QDateTime>
#include <QSet>

namespace KDGantt
{
class KDGANTT_EXPORT DateTimeScaleFormatter
{
    KDGANTT_DECLARE_PRIVATE_BASE_POLYMORPHIC(DateTimeScaleFormatter)
public:
    enum Range {
        Second,
        Minute,
        Hour,
        Day,
        Week,
        Month,
        Year
    };
    DateTimeScaleFormatter(Range range, const QString &formatString,
                           Qt::Alignment alignment = Qt::AlignCenter);
    DateTimeScaleFormatter(Range range, const QString &formatString,
                           const QString &templ, Qt::Alignment alignment = Qt::AlignCenter);
    DateTimeScaleFormatter(const DateTimeScaleFormatter &other);
    virtual ~DateTimeScaleFormatter();

    DateTimeScaleFormatter &operator=(const DateTimeScaleFormatter &other);

    QString format() const;
    Range range() const;
    Qt::Alignment alignment() const;

    virtual QDateTime nextRangeBegin(const QDateTime &datetime) const;
    virtual QDateTime currentRangeBegin(const QDateTime &datetime) const;

    QString format(const QDateTime &datetime) const;
    virtual QString text(const QDateTime &datetime) const;
};

class KDGANTT_EXPORT DateTimeGrid : public AbstractGrid
{
    Q_OBJECT
    KDGANTT_DECLARE_PRIVATE_DERIVED(DateTimeGrid)
public:
    enum Scale { ScaleAuto,
                 ScaleHour,
                 ScaleDay,
                 ScaleWeek,
                 ScaleMonth,
                 ScaleUserDefined
               };

    DateTimeGrid();
    virtual ~DateTimeGrid();

    QDateTime startDateTime() const;
    void setStartDateTime(const QDateTime &dt);

    qreal dayWidth() const;
    void setDayWidth(qreal);

    qreal mapFromDateTime(const QDateTime &dt) const;
    QDateTime mapToDateTime(qreal x) const;

    void setWeekStart(Qt::DayOfWeek);
    Qt::DayOfWeek weekStart() const;

    void setFreeDays(const QSet<Qt::DayOfWeek> &fd);
    QSet<Qt::DayOfWeek> freeDays() const;

    void setScale(Scale s);
    Scale scale() const;

    void setUserDefinedLowerScale(DateTimeScaleFormatter *lower);
    void setUserDefinedUpperScale(DateTimeScaleFormatter *upper);
    DateTimeScaleFormatter *userDefinedLowerScale() const;
    DateTimeScaleFormatter *userDefinedUpperScale() const;

    bool rowSeparators() const;
    void setRowSeparators(bool enable);

    void setNoInformationBrush(const QBrush &brush);
    QBrush noInformationBrush() const;

    Span mapToChart(const QModelIndex &idx) const Q_DECL_OVERRIDE;
    /*reimp*/ bool mapFromChart(const Span &span, const QModelIndex &idx,
                                const QList<Constraint> &constraints = QList<Constraint>()) const Q_DECL_OVERRIDE;
    /*reimp*/ void paintGrid(QPainter *painter,
                             const QRectF &sceneRect, const QRectF &exposedRect,
                             AbstractRowController *rowController = 0,
                             QWidget *widget = Q_NULLPTR) Q_DECL_OVERRIDE;
    /*reimp*/ void paintHeader(QPainter *painter,
                               const QRectF &headerRect, const QRectF &exposedRect,
                               qreal offset, QWidget *widget = Q_NULLPTR) Q_DECL_OVERRIDE;

protected:
    virtual void paintHourScaleHeader(QPainter *painter,
                                      const QRectF &headerRect, const QRectF &exposedRect,
                                      qreal offset, QWidget *widget = Q_NULLPTR);
    virtual void paintDayScaleHeader(QPainter *painter,
                                     const QRectF &headerRect, const QRectF &exposedRect,
                                     qreal offset, QWidget *widget = Q_NULLPTR);

    virtual void paintUserDefinedHeader(QPainter *painter,
                                        const QRectF &headerRect, const QRectF &exposedRect,
                                        qreal offset, const DateTimeScaleFormatter *formatter,
                                        QWidget *widget = Q_NULLPTR);
};
}

#ifndef QT_NO_DEBUG_STREAM
QDebug KDGANTT_EXPORT operator<<(QDebug dbg, KDGantt::DateTimeScaleFormatter::Range);
#endif

#endif /* KDGANTTDATETIMEGRID_H */

