/***************************************************************************
*   Copyright (C) 2004-2006 by Thomas Fischer                             *
*   fischer@unix-ag.uni-kl.de                                             *
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, 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 General Public License     *
*   along with this program; if not, write to the                         *
*   Free Software Foundation, Inc.,                                       *
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
***************************************************************************/
#ifndef BIBTEXFILE_H
#define BIBTEXFILE_H

#include <tqobject.h>
#include <tqvaluelist.h>

#include "entryfield.h"

class TQDir;
class TQString;
class TQChar;
class TQStringList;
class TQWaitCondition;
class TQProcess;
class TQIODevice;

namespace BibTeX
{
    class Element;
    class Entry;
    class String;
    class FileExporter;

    static const TQString Months[] =
    {
        TQString( "January" ), TQString( "February" ), TQString( "March" ), TQString( "April" ), TQString( "May" ), TQString( "June" ), TQString( "July" ), TQString( "August" ), TQString( "September" ), TQString( "October" ), TQString( "November" ), TQString( "December" )
    };

    static const TQString MonthsTriple[] =
    {
        TQString( "jan" ), TQString( "feb" ), TQString( "mar" ), TQString( "apr" ), TQString( "may" ), TQString( "jun" ), TQString( "jul" ), TQString( "aug" ), TQString( "sep" ), TQString( "oct" ), TQString( "nov" ), TQString( "dec" )
    };

    class File : public TQObject
    {
        TQ_OBJECT

        friend class FileExporterXML;
        friend class FileExporterBibTeX;
        friend class FileExporterRIS;
        friend class FileExporter;
        friend class FileParser;

    public:
        typedef TQValueList<Element*> ElementList;

        enum FileFormat { formatUndefined = 0, formatBibTeX = 1, formatXML = 2, formatHTML = 3, formatPDF = 4, formatPS = 5, formatRTF = 6, formatRIS = 7, formatEndNote = 8, formatISI = 9, formatDocBook5 = 10, formatMODS = 11, formatWordBib = 12, formatAds = 13, formatEndNoteXML = 14 };
        enum Encoding {encImplicit = 0, encLaTeX = 1, encUTF8 = 2};
        enum StringProtection { spNone, spParanthesis, spQuote, spBoth };

        File( );
        ~File();

        unsigned int count() const;
        Element* at( const unsigned int index );
        void append( const File *other, const Element *after = NULL );
        void appendElement( Element *element, const Element *after = NULL );
        void deleteElement( Element *element );
        static Element* cloneElement( Element *element );

        Element *containsKey( const TQString &key );
        const Element *containsKeyConst( const TQString &key ) const;
        TQStringList allKeys();
        TQString text();

        ElementList::iterator begin();
        ElementList::iterator end();
        ElementList::const_iterator constBegin() const;
        ElementList::const_iterator constEnd() const;

        TQStringList getAllValuesAsStringList( const EntryField::FieldType fieldType ) const;
        TQMap<TQString, int> getAllValuesAsStringListWithCount( const EntryField::FieldType fieldType ) const;
        void replaceValue( const TQString& oldText, const TQString& newText, const EntryField::FieldType fieldType );
        BibTeX::Entry *completeReferencedFieldsConst( const BibTeX::Entry *entry ) const;
        void completeReferencedFields( BibTeX::Entry *entry ) const;

        TQString fileName;

    protected:
        ElementList elements;

    private:
        void clearElements();

    };

}

#endif
