/* This file is part of the KDE project Copyright (C) 1998, 1999 Reginald Stadlbauer 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 #include #include #include #include #include #include #include "KoRichText.h" #include #include 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 m_dict; }; class KoVariable; class KoVariableFormat; class KoDocument; class KoVariableFormatCollection; class KoTextDocument; class KoVariableCollection; class KOTEXT_EXPORT KoVariableCollection : public TQObject { Q_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 recalcVariables(int type); // For custom variables void setVariableValue( const TQString &name, const TQString &value ); TQString getVariableValue( const TQString &name ) const; const TQPtrList& 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 popupActionList() const; protected slots: // This is here because variables and formats are not TQObjects void slotChangeSubType(); void slotChangeFormat(); private: //typedef TQMap VariableSubTextMap; //VariableSubTextMap m_variableSubTextMap; TQPtrList 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 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