/* This file is part of the KDE project
   Copyright (C) 1998, 1999, 2000 Torben Weis <weis@kde.org>
   Copyright (C) 2004 David Faure <faure@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 KO_DOCUMENT_INFO_H
#define KO_DOCUMENT_INFO_H

#include <qobject.h>
#include <qmap.h>
#include <kconfig.h>
#include <koffice_export.h>

class QString;
class QStringList;
class QDomDocument;
class QDomElement;
class QDomNode;
class QDateTime;
class KoStore;
class KoDocumentInfoPage;
class KoXmlWriter;

class KOFFICECORE_EXPORT KoDocumentInfo : public QObject
{
    Q_OBJECT
public:
    KoDocumentInfo( QObject* parent = 0, const char* name = 0 );
    virtual ~KoDocumentInfo();

    bool load( const QDomDocument& doc );
    bool loadOasis( const QDomDocument& metaDoc );

    QDomDocument save();
    bool saveOasis( KoStore* store );

    /**
     * This info has an accessor because it's the most commonly used.
     * Equivalent to page("about")->title() (but checking that the page exists)
     */
    QString title() const;
    QString creator() const;

    KoDocumentInfoPage* page( const QString& name ) const;
    QStringList pages() const;
    void documentInfochanged() { emit sigDocumentInfoModifed();}
 signals:
    void sigDocumentInfoModifed();
};

class KOFFICECORE_EXPORT KoDocumentInfoPage : public QObject
{
public:
    KoDocumentInfoPage( QObject *parent, const char* name );

    virtual bool load( const QDomElement& e ) = 0;
    virtual QDomElement save( QDomDocument& doc ) = 0;
    virtual bool loadOasis( const QDomNode& metaDoc ) = 0;
    virtual bool saveOasis( KoXmlWriter &xmlWriter ) = 0;
};

class KOFFICECORE_EXPORT KoDocumentInfoAuthor : public KoDocumentInfoPage
{
    Q_OBJECT
public:
    KoDocumentInfoAuthor( KoDocumentInfo* info );
    ~KoDocumentInfoAuthor();

    virtual bool load( const QDomElement& e );
    virtual QDomElement save( QDomDocument& doc );
    virtual bool loadOasis( const QDomNode& metaDoc );
    virtual bool saveOasis( KoXmlWriter &xmlWriter );

    QString fullName() const;
    QString initial() const;
    QString title() const;
    QString company() const;
    QString email() const;
    QString telephoneHome() const;
    QString telephoneWork() const;
    QString fax() const;
    QString country() const;
    QString postalCode() const;
    QString city() const;
    QString street() const;
    QString position() const;

    void setFullName( const QString& n );
    void setTitle( const QString& n );
    void setCompany( const QString& n );
    void setEmail( const QString& n );
    void setTelephoneHome( const QString& n );
    void setTelephoneWork( const QString& n );
    void setFax( const QString& n );
    void setCountry( const QString& n );
    void setPostalCode( const QString& n );
    void setCity( const QString& n );
    void setStreet( const QString& n );
    void setInitial( const QString& n );
    void setPosition( const QString& n );
    void initParameters();

private:
    QString m_fullName;
    QString m_title;
    QString m_company;
    QString m_email;
    QString m_telephoneHome;
    QString m_telephoneWork;
    QString m_fax;
    QString m_country;
    QString m_postalCode;
    QString m_city;
    QString m_street;
    QString m_initial;
    QString m_position;
    KConfig *m_emailCfg;
};

class KOFFICECORE_EXPORT KoDocumentInfoAbout : public KoDocumentInfoPage
{
    Q_OBJECT
public:
    KoDocumentInfoAbout( KoDocumentInfo* info );

    virtual bool load( const QDomElement& e );
    virtual QDomElement save( QDomDocument& doc );
    virtual bool loadOasis( const QDomNode& metaDoc );
    virtual bool saveOasis( KoXmlWriter &xmlWriter );

    QString title() const;
    QString abstract() const;
    QString subject() const;
    QString keywords() const;
    QString initialCreator() const;
    QString editingCycles() const;
    QString creationDate() const;
    QString modificationDate() const;

    void setKeywords( const QString &n );
    void setSubject( const QString& n );

    void setTitle( const QString& n );
    void setAbstract( const QString& n );
    void saveParameters();

public slots:
    void resetMetaData();

private:
    KoDocumentInfo* m_docInfo;
    QString m_title;
    QString m_abstract;
    QString m_keywords;
    QString m_subject;
    QString m_initialCreator;
    QDateTime m_creationDate;
    QDateTime m_modificationDate;
    int m_editingCycles;
    bool m_firstSave;
};

class KOFFICECORE_EXPORT KoDocumentInfoUserMetadata : public KoDocumentInfoPage
{
    Q_OBJECT
public:
    KoDocumentInfoUserMetadata( KoDocumentInfo* info );

    virtual bool load( const QDomElement& e );
    virtual QDomElement save( QDomDocument& doc );
    virtual bool loadOasis( const QDomNode& metaDoc );
    virtual bool saveOasis( KoXmlWriter &xmlWriter );

    QMap<QString, QString>* metadataList() { return &m_metaList; }

private:
    QMap<QString, QString>  m_metaList;
    QStringList             m_reserved;
};

#endif
