/* This file is part of the KDE project
   Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@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 kovariable_h
#define kovariable_h

#include <tqstring.h>
#include <tqdatetime.h>
#include <tqasciidict.h>
#include <tqptrlist.h>
#include <tqmap.h>
#include <tqobject.h>
#include <tdeaction.h>
#include "KoRichText.h"
#include <tqvariant.h>
#include <koffice_export.h>

class TQDomElement;
// Always add new types at the _end_ of this list (but before VT_ALL of course).
// (and update KWView::setupActions)
enum VariableType {
    VT_NONE             = -1,

    VT_DATE             = 0,
    VT_DATE_VAR_KWORD10 = 1,
    VT_TIME             = 2,
    VT_TIME_VAR_KWORD10 = 3,
    VT_PGNUM            = 4,
    // No number 5
    VT_CUSTOM           = 6,
    VT_MAILMERGE        = 7,
    VT_FIELD            = 8,
    VT_LINK             = 9,
    VT_NOTE             = 10,
    VT_FOOTNOTE         = 11,
    VT_STATISTIC        = 12,

    VT_ALL              = 256
};

enum VariableFormat {
    VF_DATE   = 0,
    VF_TIME   = 1,
    VF_STRING = 2,
    VF_NUM    = 3
};

class KoVariable;
class KoOasisSettings;

class KOTEXT_EXPORT KoVariableSettings
{
 public:
    KoVariableSettings();
    virtual ~KoVariableSettings();

    int startingPageNumber()const { return m_startingPageNumber; }
    void setStartingPageNumber(int num) { m_startingPageNumber=num; }

    bool displayLink() const{ return m_displayLink; }
    void setDisplayLink( bool b) { m_displayLink=b; }

    bool underlineLink() const { return m_underlineLink; }
    void setUnderlineLink( bool b) { m_underlineLink=b; }

    bool displayComment() const { return m_displayComment; }
    void setDisplayComment( bool b) { m_displayComment=b; }

    bool displayFieldCode() const { return m_displayFieldCode; }
    void setDisplayFieldCode( bool b) { m_displayFieldCode=b; }

    virtual void save( TQDomElement &parentElem );
    virtual void load( TQDomElement &elem );

    TQDateTime lastPrintingDate() const;
    void setLastPrintingDate( const TQDateTime & _date);

    TQDateTime creationDate() const;
    void setCreationDate( const TQDateTime & _date);

    TQDateTime modificationDate() const;
    void setModificationDate( const TQDateTime & _date);

    virtual void saveOasis( KoXmlWriter &settingsWriter ) const;
    virtual void loadOasis(const KoOasisSettings&settingsDoc);


 private:
    int m_startingPageNumber;
    bool m_displayLink;
    bool m_displayComment;
    bool m_underlineLink;
    bool m_displayFieldCode;
    class KoVariableSettingPrivate;
    KoVariableSettingPrivate *d;
};

/**
 * Class: KoVariableFormat
 * Base class for a variable format - held by KWDocument.
 * Example of formats are time, date, string, number, floating-point number...
 * The reason for formats to be separated is that it allows to
 * customize the formats, to implement subformats (various date formats, etc.).
 */
class KOTEXT_EXPORT KoVariableFormat
{
public:
    KoVariableFormat() {}
    virtual ~KoVariableFormat() {}
    /**
     * Return a key describing this format.
     * Used for the flyweight pattern in KoVariableFormatCollection
     */
    virtual TQCString key() const = 0;
    /**
     * @return the key for a given set of properties.
     * Use this key to lookup the format in the "variable format" collection.
     * @param props properties of this format, e.g. DD/MM/YYYY for a date format.
     */
    virtual TQCString getKey( const TQString& props ) const = 0;
    /**
     * Create a format from this key.
     */
    virtual void load( const TQCString &key ) = 0;
    /**
     * Use this format to convert a piece of data into a string.
     */
    virtual TQString convert(const TQVariant& data ) const = 0;
    /**
     * Set the properties of this format, e.g. DD/MM/YYYY for a date format.
     * WARNING: if you call this, you might be modifying a format that
     * other variables use as well. Don't do it, use getKey.
     */
    virtual void setFormatProperties( const TQString& ) {}
    /**
     * @return the properties of this format, e.g. DD/MM/YYYY for a date format.
     */
    virtual TQString formatProperties() const { return TQString(); }
    /**
     * @return the list of available properties strings (e.g. hh:mm:ss)
     */
    virtual TQStringList formatPropsList() const { return TQStringList(); }
    /**
     * @return the translated version of the list of format properties
     */
    virtual TQStringList translatedFormatPropsList() const { return TQStringList(); }
};

/**
 * Implementation of the "date" formats
 * TODO: merge with KoVariableTimeFormat, for a single TQDateTime-based class.
 */
class KOTEXT_EXPORT KoVariableDateFormat : public KoVariableFormat
{
public:
    KoVariableDateFormat();
    virtual TQString convert(const TQVariant& data ) const;
    virtual TQCString key() const;
    virtual TQCString getKey( const TQString& props ) const;
    virtual void load( const TQCString &key );

    /// Set the format string (e.g. DDMMYYYY)
    virtual void setFormatProperties( const TQString& props ) {
        m_strFormat = props;
    }
    /// @return the format string (e.g. DDMMYYYY)
    virtual TQString formatProperties() const { return m_strFormat; }

    /// @return the list of available format strings
    virtual TQStringList formatPropsList() const { return staticFormatPropsList(); }

    /// @return the translated version of the list of formats
    virtual TQStringList translatedFormatPropsList() const { return staticTranslatedFormatPropsList(); }

    static TQStringList staticFormatPropsList();
    static TQStringList staticTranslatedFormatPropsList();

private:
    TQString m_strFormat;
};

/**
 * Implementation of the "time" formats
 */
class KOTEXT_EXPORT KoVariableTimeFormat : public KoVariableFormat
{
public:
    KoVariableTimeFormat();
    virtual TQString convert(const TQVariant& data ) const;
    virtual TQCString key() const;
    virtual TQCString getKey( const TQString& props ) const;
    virtual void load( const TQCString & /*key*/ );

    /// Set the format string (e.g. hh:mm:ss)
    virtual void setFormatProperties( const TQString& props ) {
        m_strFormat = props;
    }
    /// @return the format string (e.g. hh:mm:ss)
    virtual TQString formatProperties() const { return m_strFormat; }

    /// @return the list of available properties strings (e.g. hh:mm:ss)
    virtual TQStringList formatPropsList() const { return staticFormatPropsList(); }

    /// @return the translated version of the list of format properties
    virtual TQStringList translatedFormatPropsList() const { return staticTranslatedFormatPropsList(); }

    static TQStringList staticFormatPropsList();
    static TQStringList staticTranslatedFormatPropsList();

private:
    TQString m_strFormat;
};


/**
 * Implementation of the string format
 */
class KoVariableStringFormat : public KoVariableFormat
{
public:
    KoVariableStringFormat() : KoVariableFormat() {}
    virtual TQString convert(const TQVariant& data ) const;
    virtual TQCString key() const;
    virtual TQCString getKey( const TQString& props ) const;
    virtual void load( const TQCString & /*key*/ ) {}
};


class KOTEXT_EXPORT KoVariableNumberFormat : public KoVariableFormat
{
public:
    KoVariableNumberFormat() : KoVariableFormat() {}
    virtual TQString convert(const TQVariant& data ) const;
    virtual TQCString key() const;
    virtual TQCString getKey( const TQString& props ) const;
    virtual void load( const TQCString & /*key*/ ) {}
};


/**
 * The collection of formats for variables.
 * Example: date (short or long), time, string (prefix/suffix), number (prefix/suffix, decimals?)...
 * Implements the flyweight pattern to share formats and create them on demand.
 * Each KoDocument holds a KoVariableFormatCollection.
 */
class KOTEXT_EXPORT KoVariableFormatCollection
{
public:
    KoVariableFormatCollection();

    /**
     * Forget (and erase) all the formats this collection knows about
     */
    void clear() { m_dict.clear(); }

    /**
     * Find or create the format for the given @p key
     */
    KoVariableFormat *format( const TQCString &key );

    // TODO Refcounting and removing unused formats
    // Not critical, that we don't delete unused formats until closing the doc...
protected:
    KoVariableFormat *createFormat( const TQCString &key );

private:
    TQAsciiDict<KoVariableFormat> m_dict;
};

class KoVariable;
class KoVariableFormat;
class KoDocument;
class KoVariableFormatCollection;
class KoTextDocument;
class KoVariableCollection;
class KOTEXT_EXPORT KoVariableCollection : public TQObject
{
    TQ_OBJECT
  
public:
    // Note that the KoVariableSettings becomes owned by the collection;
    // we take it as argument so that it can be subclassed though.
    KoVariableCollection(KoVariableSettings *settings, KoVariableFormatCollection *formatCollection);
    ~KoVariableCollection();
    void registerVariable( KoVariable *var );
    void unregisterVariable( KoVariable *var );
    TQValueList<KoVariable *> recalcVariables(int type);

    // For custom variables
    void setVariableValue( const TQString &name, const TQString &value );
    TQString getVariableValue( const TQString &name ) const;

    const TQPtrList<KoVariable>& getVariables() const {
        return variables;
    }
    void clear();

    bool customVariableExist(const TQString &varname)const ;

    virtual KoVariable *createVariable( int type, short int subtype, KoVariableFormatCollection * coll, KoVariableFormat *varFormat,KoTextDocument *textdoc, KoDocument * doc, int _correct , bool _forceDefaultFormat=false, bool loadFootNote= true );

    /// Load variable from OASIS file format (called "field" in the OASIS format)
    virtual KoVariable* loadOasisField( KoTextDocument* textdoc, const TQDomElement& tag, KoOasisContext& context );
    virtual KoVariable* loadOasisFieldCreateVariable( KoTextDocument* textdoc, const TQDomElement& tag, KoOasisContext& context, const TQString &key, int type );

    KoVariableSettings *variableSetting() const { return m_variableSettings; }
    KoVariableFormatCollection *formatCollection() const { return m_formatCollection; }

    /// Variable that's under the popupmenu
    void setVariableSelected(KoVariable * var);
    KoVariable *selectedVariable()const {return m_varSelected;}

    /// List of TDEActions to put into the popupmenu on a variable
    TQPtrList<TDEAction> popupActionList() const;

 protected slots:
    // This is here because variables and formats are not TQObjects
    void slotChangeSubType();
    void slotChangeFormat();

 private:
    //typedef TQMap<TDEAction *, int> VariableSubTextMap;
    //VariableSubTextMap m_variableSubTextMap;

    TQPtrList<KoVariable> variables;
    TQMap< TQString, TQString > varValues; // for custom variables
    KoVariableSettings *m_variableSettings;
    KoVariable *m_varSelected;
    KoVariableFormatCollection *m_formatCollection;
};


// ----------------------------------------------------------------
//                KoVariable and derived classes


class KoDocument;
class KoVariable;
class TQDomElement;
class KoTextFormat;


/**
 * A KoVariable is a custom item, i.e. considered as a single character.
 * KoVariable is the abstract base class.
 */
class KOTEXT_EXPORT KoVariable : public KoTextCustomItem
{
public:
    KoVariable( KoTextDocument *fs, KoVariableFormat *varFormat,KoVariableCollection *varColl );
    virtual ~KoVariable();

    virtual VariableType type() const = 0;
    virtual short int subType() const { return 0; }

    // KoTextCustomItem stuff
    virtual Placement placement() const { return PlaceInline; }
    virtual void resize();
    virtual int ascent() const { return m_ascent; } // for text, ascent != height!
    virtual int widthHint() const { return width; }
    virtual int minimumWidth() const { return width; }
    virtual void drawCustomItem( TQPainter* p, int x, int y, int wpix, int hpix, int ascentpix, int cx, int cy, int cw, int ch, const TQColorGroup& cg, bool selected, int offset,  bool drawingShadow);

    /**
     * Called by drawCustomItem. Some special variables can
     * reimplement drawCustomItem to change the parameters passed to
     * drawCustomItemHelper
     */
    void drawCustomItemHelper( TQPainter* p, int x, int y, int wpix, int hpix, int ascentpix, const TQColorGroup& cg, bool selected, int offset, KoTextFormat* fmt, const TQFont& font, TQColor textColor, bool drawingShadow );

    void setVariableFormat( KoVariableFormat *_varFormat );

    KoVariableFormat *variableFormat() const
        { return m_varFormat; }

    KoVariableCollection *variableColl() const
        { return m_varColl; }

    /**
     * Returns the text to be displayed for this variable
     * It doesn't need to be cached, convert() is fast, and it's the actual
     * value (date, time etc.) that is cached in the variable already.
     */
    virtual TQString text(bool realValue=false);

    virtual TQString fieldCode();

    /// Return the variable value, as a TQVariant, before format conversion
    TQVariant varValue() const { return m_varValue; }

    /**
     * Ask this variable to recalculate and to repaint itself
     * Only use this if you're working on a single variable (e.g. popupmenu).
     * Otherwise, better do the repainting all at once.
     * @see KoVariableCollection::recalcVariables()
     */
    void recalcAndRepaint();

    /** Save the variable. Public API, does the common job and then calls saveVariable. */
    virtual void save( TQDomElement &parentElem );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );

    /** Part of the KoTextCustomItem interface. Returns the code for a variable, see DTD.
      * Do NOT reimplement in koVariable-derived classes.
      */
    virtual int typeId() const { return 4; }

    /// List of available subtypes (translated). Use variableSubType() to map index to ID
    virtual TQStringList subTypeList();

    /// Set this variable's subtype.
    virtual void setVariableSubType( short int /*subtype*/ ) {}

    /**
     * Converts the @p menuNumber to variable subtype number (VST_x)
     */
    virtual short int variableSubType(short int menuNumber){ return menuNumber; }

    TQString convertKlocaleToTQDateTimeFormat( const TQString & _format );

protected:
    /** Variable should reimplement this to implement saving. */
    virtual void saveVariable( TQDomElement &parentElem ) = 0;
    virtual int correctValue() const { return 0;}

    KoVariableFormat *m_varFormat;
    KoVariableCollection *m_varColl;
    TQVariant m_varValue;
    int m_ascent;

    //typedef TQMap<TDEAction *, int> SubTextMap;
    //SubTextMap m_subTextMap;
    class Private;
    Private *d;
};


/**
 * Date-related variables
 */
class KOTEXT_EXPORT KoDateVariable : public KoVariable
{
public:
    KoDateVariable( KoTextDocument *textdoc, short int subtype, KoVariableFormat *_varFormat,KoVariableCollection *_varColl , int _correctDate = 0);

    virtual VariableType type() const
    { return VT_DATE; }

    enum { VST_DATE_FIX = 0, VST_DATE_CURRENT = 1, VST_DATE_LAST_PRINTING = 2, VST_DATE_CREATE_FILE = 3, VST_DATE_MODIFY_FILE =4 };
    static TQStringList actionTexts();

    virtual void recalc();
    virtual TQString fieldCode();
    virtual void resize();
    void setDate( const TQDate & _date ) { m_varValue = TQVariant(_date); }

    virtual void saveVariable( TQDomElement &parentElem );
    virtual int correctValue() const { return m_correctDate;}
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;

    virtual TQStringList subTypeList();
    /// Set this variable's subtype.
    virtual void setVariableSubType( short int subtype )
        { m_subtype = subtype; }
    virtual short int subType() const { return m_subtype; }
    /**
     * Ask the user and return the date format string with prefix "DATE"
     */
    static TQCString formatStr( int & correct );
    /**
     * Return the default date format for old file.
     */
    static TQCString defaultFormat();

protected:
    short int m_subtype;
    int m_correctDate;
};


/**
 * Time-related variables
 */
class KOTEXT_EXPORT KoTimeVariable : public KoVariable
{
public:
    KoTimeVariable( KoTextDocument *textdoc, short int subtype, KoVariableFormat *varFormat, KoVariableCollection *_varColl,  int _correct);

    virtual VariableType type() const
    { return VT_TIME; }

    enum { VST_TIME_FIX = 0, VST_TIME_CURRENT = 1 };
    static TQStringList actionTexts();

    virtual void recalc();
    virtual void resize();
    virtual TQString fieldCode();

    void setTime( const TQTime & _time ) { m_varValue = TQVariant(_time); }

    virtual void saveVariable( TQDomElement &parentElem );
    virtual int correctValue() const { return m_correctTime;}
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;

    virtual TQStringList subTypeList();
    virtual void setVariableSubType( short int subtype )
        { m_subtype = subtype; }
    virtual short int subType() const { return m_subtype; }
    /**
     * Returns the time format string with prefix "TIME"
     */
    static TQCString formatStr(int & _correct);
    /**
     * Return the default date format for old file.
     */
    static TQCString defaultFormat();

protected:
    short int m_subtype;
    int m_correctTime; // in minutes
};



/**
 * A custom variable is a variable whose value is entered
 * by the user.
 */
class KOTEXT_EXPORT KoCustomVariable : public KoVariable
{
public:
    KoCustomVariable(KoTextDocument *textdoc , const TQString &name, KoVariableFormat *varFormat,KoVariableCollection *_varcoll );

    virtual VariableType type() const
    { return VT_CUSTOM; }
    static TQStringList actionTexts();

    virtual void saveVariable( TQDomElement &parentElem );
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;

    TQString name() const { return m_varValue.toString(); }
    virtual void recalc();
    virtual TQString fieldCode();

    virtual TQString text(bool realValue=false);

    TQString value() const;
    void setValue( const TQString &v );

protected:
};


/**
 * Any variable that is a string, and whose value is automatically
 * determined - as opposed to custom variables whose value is
 * entered by the user
 */
class KOTEXT_EXPORT KoFieldVariable : public KoVariable
{
public:
    KoFieldVariable( KoTextDocument *textdoc, short int subtype, KoVariableFormat *varFormat,KoVariableCollection *_varColl, KoDocument *_doc );

    // Do not change existing values, they are saved in document files
    enum FieldSubType { VST_NONE = -1,
                        VST_FILENAME = 0, VST_DIRECTORYNAME = 1,
                        VST_AUTHORNAME = 2, VST_EMAIL = 3, VST_COMPANYNAME = 4,
			VST_PATHFILENAME = 5, VST_FILENAMEWITHOUTEXTENSION=6,
                        VST_TELEPHONE_WORK = 7, VST_FAX = 8, VST_COUNTRY = 9,
                        VST_TITLE = 10, VST_ABSTRACT = 11,
                        VST_POSTAL_CODE = 12, VST_CITY = 13, VST_STREET = 14,
                        VST_AUTHORTITLE = 15, VST_INITIAL = 16, VST_TELEPHONE_HOME = 17, VST_SUBJECT = 18, VST_KEYWORDS=19,VST_AUTHORPOSITION = 20 };

    virtual VariableType type() const
    { return VT_FIELD; }

    virtual void saveVariable( TQDomElement &parentElem );
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;
    virtual TQString fieldCode();

    virtual void recalc();
    virtual TQString text(bool realValue=false);

    TQString value() const { return m_varValue.toString(); }

    static TQStringList actionTexts();
    /**
     * Converts @p menuNumber to field variable subtype number
     */
    virtual short int variableSubType( short int menuNumber );
    /**
     * Converts @p menuNumber to field variable subtype number
     */
    static FieldSubType fieldSubType( short int menuNumber);

    virtual TQStringList subTypeList();
    virtual void setVariableSubType( short int subtype )
        { m_subtype = subtype; }
    virtual short int subType() const { return m_subtype; }

protected:
    short int m_subtype;
    KoDocument *m_doc;
};


class KOTEXT_EXPORT KoMailMergeVariable : public KoVariable
{
public:
    KoMailMergeVariable( KoTextDocument *textdoc, const TQString &name, KoVariableFormat *varFormat, KoVariableCollection *_varColl );

    virtual VariableType type() const
    { return VT_MAILMERGE; }
    static TQStringList actionTexts();
    virtual TQString fieldCode();

    virtual void saveVariable( TQDomElement &parentElem );
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;

    virtual TQString text(bool realValue=false);
    TQString name() const { return m_varValue.toString(); }
    virtual TQString value() const;

protected:
};


/**
 * "current page number" and "number of pages" variables
 * This is a base class, it must be inherited by applications,
 * to provide recalc().
 */
class KOTEXT_EXPORT KoPageVariable : public KoVariable
{
public:
    KoPageVariable( KoTextDocument *textdoc, short int subtype, KoVariableFormat *varFormat ,KoVariableCollection *_varColl);

    virtual VariableType type() const
    { return VT_PGNUM; }

    enum { VST_PGNUM_CURRENT = 0, VST_PGNUM_TOTAL = 1, VST_CURRENT_SECTION = 2 , VST_PGNUM_PREVIOUS = 3, VST_PGNUM_NEXT = 4 };
    static TQStringList actionTexts();
    virtual TQString fieldCode();

    virtual TQStringList subTypeList();

    virtual void setVariableSubType( short int subtype );

    // For the 'current page' variable. This is called by the app e.g. when painting
    // a given page (see KWTextFrameSet::drawFrame and KPTextObject::recalcPageNum)
    void setPgNum( int pgNum ) { m_varValue = TQVariant( pgNum); }
    // For the 'current section title' variable. Same thing.
    void setSectionTitle( const TQString& title );

    virtual short int subType() const { return m_subtype; }

    virtual void recalc() = 0;

    virtual void saveVariable( TQDomElement &parentElem );
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;
protected:
    short int m_subtype;
};


class KOTEXT_EXPORT KoLinkVariable : public KoVariable
{
public:
    KoLinkVariable( KoTextDocument *textdoc, const TQString & _linkName, const TQString & _ulr,KoVariableFormat *varFormat, KoVariableCollection *_varColl );
    virtual void drawCustomItem( TQPainter* p, int x, int y, int wpix, int hpix, int ascentpix, int /*cx*/, int /*cy*/, int /*cw*/, int /*ch*/, const TQColorGroup& cg, bool selected, int offset, bool drawingShadow );

    virtual VariableType type() const
    { return VT_LINK; }

    static TQStringList actionTexts();
    virtual TQString fieldCode();

    virtual void saveVariable( TQDomElement &parentElem );
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;

    virtual TQString text(bool realValue=false);
    TQString value() const { return m_varValue.toString(); }
    TQString url() const { return m_url;}

    virtual void recalc();

    void setLink(const TQString & _linkName, const TQString &_url)
	{
	    m_varValue=TQVariant(_linkName);
	    m_url=_url;
	}

protected:
    TQString m_url;
};


// A custom item that display a small yellow rect. Right-clicking on it shows the comment.
class KOTEXT_EXPORT KoNoteVariable : public KoVariable
{
public:
    KoNoteVariable( KoTextDocument *textdoc, const TQString & _note,KoVariableFormat *varFormat, KoVariableCollection *_varColl );
    virtual void drawCustomItem( TQPainter* p, int x, int y, int wpix, int hpix, int ascentpix, int /*cx*/, int /*cy*/, int /*cw*/, int /*ch*/, const TQColorGroup& cg, bool selected, int offset, bool drawingShadow );

    virtual VariableType type() const
    { return VT_NOTE; }

    static TQStringList actionTexts();
    virtual TQString fieldCode();

    virtual void saveVariable( TQDomElement &parentElem );
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;

    virtual TQString text(bool realValue=false);
    TQString note() const { return m_varValue.toString(); }
    void setNote( const TQString & _note) { m_varValue = TQVariant(_note); }
    virtual void recalc();

    TQString createdNote() const;
protected:
    TQDate m_createdNoteDate;
};


class KOTEXT_EXPORT KoStatisticVariable : public KoVariable
{
public:
    KoStatisticVariable( KoTextDocument *textdoc, short int subtype,
			 KoVariableFormat *varFormat,
			 KoVariableCollection *_varColl);

    enum {
	VST_STATISTIC_NB_WORD                      = 0,
	VST_STATISTIC_NB_SENTENCE                  = 1,
	VST_STATISTIC_NB_LINES                     = 2,
	VST_STATISTIC_NB_CHARACTERE                = 3,
	VST_STATISTIC_NB_NON_WHITESPACE_CHARACTERE = 4,
	VST_STATISTIC_NB_SYLLABLE                  = 5,
	VST_STATISTIC_NB_FRAME                     = 6,
	VST_STATISTIC_NB_EMBEDDED                  = 7,
	VST_STATISTIC_NB_PICTURE                   = 8,
	VST_STATISTIC_NB_TABLE                     = 9
    };

    virtual VariableType type() const
    { return VT_STATISTIC; }
    static TQStringList actionTexts();

    virtual TQStringList subTypeList();

    virtual void saveVariable( TQDomElement &parentElem );
    virtual void load( TQDomElement &elem );
    virtual void loadOasis( const TQDomElement &elem, KoOasisContext& context );
    virtual void saveOasis( KoXmlWriter& writer, KoSavingContext& context ) const;

    virtual short int subType() const { return m_subtype; }

    virtual void setVariableSubType( short int subtype );

    TQString name() const { return m_varValue.toString(); }
    virtual TQString fieldCode();

    TQString value() const;
    void setValue( const TQString &v );
    static void setExtendedType( bool _b) { m_extendedType = _b; }
    static bool extendedType() { return m_extendedType; }
protected:
    short int m_subtype;
    // extend type for kword.
    static bool m_extendedType;
};


#endif
