/*
 *   Copyright 2007-2008 Aaron Seigo <aseigo@kde.org>
 *
 *   This program 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, or
 *   (at your option) any later version.
 *
 *   This program 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 General Public License for more details
 *
 *   You should have received a copy of the GNU Library General Public
 *   License along with this program; if not, write to the
 *   Free Software Foundation, Inc.,
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#ifndef KCONFIGLOADER_P_H
#define KCONFIGLOADER_P_H

#include <QUrl>

class ConfigLoaderPrivate
{
public:
    ConfigLoaderPrivate()
        : saveDefaults(false)
    {
    }

    ~ConfigLoaderPrivate()
    {
        clearData();
    }

    void clearData()
    {
        qDeleteAll(bools);
        qDeleteAll(strings);
        qDeleteAll(stringlists);
        qDeleteAll(colors);
        qDeleteAll(fonts);
        qDeleteAll(ints);
        qDeleteAll(uints);
        qDeleteAll(urls);
        qDeleteAll(dateTimes);
        qDeleteAll(doubles);
        qDeleteAll(intlists);
        qDeleteAll(longlongs);
        qDeleteAll(points);
        qDeleteAll(rects);
        qDeleteAll(sizes);
        qDeleteAll(ulonglongs);
        qDeleteAll(urllists);
    }

    bool *newBool()
    {
        bool *v = new bool;
        bools.append(v);
        return v;
    }

    QString *newString()
    {
        QString *v = new QString;
        strings.append(v);
        return v;
    }

    QStringList *newStringList()
    {
        QStringList *v = new QStringList;
        stringlists.append(v);
        return v;
    }

    QColor *newColor()
    {
        QColor *v = new QColor;
        colors.append(v);
        return v;
    }

    QFont *newFont()
    {
        QFont *v = new QFont;
        fonts.append(v);
        return v;
    }

    qint32 *newInt()
    {
        qint32 *v = new qint32;
        ints.append(v);
        return v;
    }

    quint32 *newUint()
    {
        quint32 *v = new quint32;
        uints.append(v);
        return v;
    }

    QUrl *newUrl()
    {
        QUrl *v = new QUrl;
        urls.append(v);
        return v;
    }

    QDateTime *newDateTime()
    {
        QDateTime *v = new QDateTime;
        dateTimes.append(v);
        return v;
    }

    double *newDouble()
    {
        double *v = new double;
        doubles.append(v);
        return v;
    }

    QList<qint32> *newIntList()
    {
        QList<qint32> *v = new QList<qint32>;
        intlists.append(v);
        return v;
    }

    qint64 *newLongLong()
    {
        qint64 *v = new qint64;
        longlongs.append(v);
        return v;
    }

    QPoint *newPoint()
    {
        QPoint *v = new QPoint;
        points.append(v);
        return v;
    }

    QRect *newRect()
    {
        QRect *v = new QRect;
        rects.append(v);
        return v;
    }

    QSize *newSize()
    {
        QSize *v = new QSize;
        sizes.append(v);
        return v;
    }

    quint64 *newULongLong()
    {
        quint64 *v = new quint64;
        ulonglongs.append(v);
        return v;
    }

    QList<QUrl> *newUrlList()
    {
        QList<QUrl> *v = new QList<QUrl>();
        urllists.append(v);
        return v;
    }

    void parse(KConfigLoader *loader, QIODevice *xml);

    /**
     * Whether or not to write out default values.
     *
     * @param writeDefaults true if defaults should be written out
     */
    void setWriteDefaults(bool writeDefaults)
    {
        saveDefaults = writeDefaults;
    }

    /**
     * @return true if default values will also be written out
     */
    bool writeDefaults() const
    {
        return saveDefaults;
    }

    QList<bool *> bools;
    QList<QString *> strings;
    QList<QStringList *> stringlists;
    QList<QColor *> colors;
    QList<QFont *> fonts;
    QList<qint32 *> ints;
    QList<quint32 *> uints;
    QList<QUrl *> urls;
    QList<QDateTime *> dateTimes;
    QList<double *> doubles;
    QList<QList<qint32> *> intlists;
    QList<qint64 *> longlongs;
    QList<QPoint *> points;
    QList<QRect *> rects;
    QList<QSize *> sizes;
    QList<quint64 *> ulonglongs;
    QList<QList<QUrl> *> urllists;
    QString baseGroup;
    QStringList groups;
    QHash<QString, QString> keysToNames;
    bool saveDefaults;
};

#endif
