#include "qxtheaderview.h"
/****************************************************************************
** Copyright (c) 2006 - 2011, the LibQxt project.
** See the Qxt AUTHORS file for a list of authors and copyright holders.
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are met:
**     * Redistributions of source code must retain the above copyright
**       notice, this list of conditions and the following disclaimer.
**     * Redistributions in binary form must reproduce the above copyright
**       notice, this list of conditions and the following disclaimer in the
**       documentation and/or other materials provided with the distribution.
**     * Neither the name of the LibQxt project nor the
**       names of its contributors may be used to endorse or promote products
**       derived from this software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
** <http://libqxt.org>  <foundation@libqxt.org>
*****************************************************************************/


class QxtHeaderViewPrivate : public QxtPrivate<QxtHeaderView>
{
public:
    QXT_DECLARE_PUBLIC(QxtHeaderView)

    QxtHeaderViewPrivate();

    bool proportional;
    QMap<int, int> factors;
};

QxtHeaderViewPrivate::QxtHeaderViewPrivate() : proportional(false)
{
}

/*!
    \class QxtHeaderView
    \inmodule QxtGui
    \brief The QxtHeaderView class is an extended QHeaderView with optionally proportional section sizes.
 */

/*!
    Constructs a new QxtHeaderView with \a orientation and \a parent.
 */

QxtHeaderView::QxtHeaderView(Qt::Orientation orientation, QWidget* parent)
        : QHeaderView(orientation, parent)
{
    QXT_INIT_PRIVATE(QxtHeaderView);
}

/*!
    \property QxtHeaderView::proportionalSectionSizes
    \brief whether section sizes are proportional.

    The default value is \c true.

    \bold {Note:} Enabling proportional sections sizes sets resize mode
    QHeaderView::Fixed, which means that the user cannot resize
    sections.
 */
bool QxtHeaderView::hasProportionalSectionSizes() const
{
    return qxt_d().proportional;
}

void QxtHeaderView::setProportionalSectionSizes(bool enabled)
{
    if (qxt_d().proportional != enabled)
    {
        qxt_d().proportional = enabled;
        if (enabled)
            setResizeMode(QHeaderView::Fixed);
    }
}

/*!
    Returns the stretch factor of the section at \a logicalIndex.

    \sa setSectionStretchFactor()
 */
int QxtHeaderView::sectionStretchFactor(int logicalIndex) const
{
    return qxt_d().factors.value(logicalIndex);
}

/*!
    Sets the stretch \a factor of the section at \a logicalIndex.

    \sa sectionStretchFactor()
 */
void QxtHeaderView::setSectionStretchFactor(int logicalIndex, int factor)
{
    qxt_d().factors.insert(logicalIndex, factor);
}

/*!
    \reimp
 */
void QxtHeaderView::resizeEvent(QResizeEvent* event)
{
    QHeaderView::resizeEvent(event);
    if (qxt_d().proportional)
    {
        int total = 0;
        for (int i = 0; i < count(); ++i)
            total += qxt_d().factors.value(i, 1);

        int totalSize = 0;
        for (int i = 0; i < count() - 1; ++i)
        {
            qreal factor = qxt_d().factors.value(i, 1) / static_cast<qreal>(total);
            int sectionSize = factor * (orientation() == Qt::Horizontal ? width() : height());
            sectionSize = qMax(minimumSectionSize(), sectionSize);
            resizeSection(i, sectionSize);
            totalSize += sectionSize;
        }
        // avoid rounding errors, give rest to the last section
        resizeSection(count() - 1, width() - totalSize);
    }
}
