diff options
Diffstat (limited to 'svl/inc/svl/poolitem.hxx')
-rw-r--r-- | svl/inc/svl/poolitem.hxx | 488 |
1 files changed, 488 insertions, 0 deletions
diff --git a/svl/inc/svl/poolitem.hxx b/svl/inc/svl/poolitem.hxx new file mode 100644 index 000000000000..c0cf53fb6ded --- /dev/null +++ b/svl/inc/svl/poolitem.hxx @@ -0,0 +1,488 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _SFXPOOLITEM_HXX +#define _SFXPOOLITEM_HXX + +#include "svl/svldllapi.h" +#include <com/sun/star/uno/Any.hxx> + +#define TF_POOLABLE +#include <sal/config.h> +#include <tools/rtti.hxx> +#include <limits.h> +#include <tools/solar.h> +#include <tools/debug.hxx> +#include <tools/string.hxx> +#include <svl/svarray.hxx> +#include <svl/hint.hxx> + +typedef long SfxArgumentError; + +class SbxVariable; +class SbxObject; +class SvStream; +class Color; +class IntlWrapper; + +namespace com { namespace sun { namespace star { namespace uno { class Any; } } } } + +#define SFX_ITEMS_DIRECT 0xffff +#define SFX_ITEMS_NULL 0xfff0 // anstelle StoreSurrogate + +#define SFX_ITEMS_POOLDEFAULT 0xffff +#define SFX_ITEMS_STATICDEFAULT 0xfffe +#define SFX_ITEMS_DELETEONIDLE 0xfffd + +#define SFX_ITEMS_OLD_MAXREF 0xffef +#define SFX_ITEMS_MAXREF 0xfffffffe +#define SFX_ITEMS_SPECIAL 0xffffffff + +#define CONVERT_TWIPS 0x80 //Uno-Konvertierung fuer Massangaben (fuer MemberId) + +// ----------------------------------------------------------------------- + +// UNO3 shortcuts + +// warning, if there is no boolean inside the any this will always return the value false +inline sal_Bool Any2Bool( const ::com::sun::star::uno::Any&rValue ) +{ + sal_Bool nValue = sal_False; + if( rValue.hasValue() ) + { + if( rValue.getValueType() == ::getCppuBooleanType() ) + { + nValue = *(sal_Bool*)rValue.getValue(); + } + else + { + sal_Int32 nNum = 0; + if( rValue >>= nNum ) + nValue = nNum != 0; + } + } + + return nValue; +} + +inline ::com::sun::star::uno::Any Bool2Any( sal_Bool bValue ) +{ + return ::com::sun::star::uno::Any( &bValue, ::getCppuBooleanType() ); +} + +// ----------------------------------------------------------------------- + +//! Notloesung!!! +enum SfxFieldUnit +{ + SFX_FUNIT_NONE, SFX_FUNIT_MM, SFX_FUNIT_CM, SFX_FUNIT_M, SFX_FUNIT_KM, + SFX_FUNIT_TWIP, SFX_FUNIT_POINT, SFX_FUNIT_PICA, + SFX_FUNIT_INCH, SFX_FUNIT_FOOT, SFX_FUNIT_MILE, SFX_FUNIT_CUSTOM +}; + +enum SfxMapUnit +{ + SFX_MAPUNIT_100TH_MM, + SFX_MAPUNIT_10TH_MM, + SFX_MAPUNIT_MM, + SFX_MAPUNIT_CM, + SFX_MAPUNIT_1000TH_INCH, + SFX_MAPUNIT_100TH_INCH, + SFX_MAPUNIT_10TH_INCH, + SFX_MAPUNIT_INCH, + SFX_MAPUNIT_POINT, + SFX_MAPUNIT_TWIP, + SFX_MAPUNIT_PIXEL, + SFX_MAPUNIT_SYSFONT, + SFX_MAPUNIT_APPFONT, + SFX_MAPUNIT_RELATIVE, + SFX_MAPUNIT_ABSOLUTE +}; + +// ----------------------------------------------------------------------- + +enum SfxItemPresentation + +/* [Beschreibung] + + Die Werte dieses Enums bezeichnen den Grad der textuellen + Presentation eines Items nach Aufruf der virtuellen Methode + <SfxPoolItem::GetPresentation()const>. +*/ + +{ + SFX_ITEM_PRESENTATION_NONE, + SFX_ITEM_PRESENTATION_NAMEONLY, + SFX_ITEM_PRESENTATION_NAMELESS, + SFX_ITEM_PRESENTATION_COMPLETE +}; + +// ----------------------------------------------------------------------- + +typedef USHORT SfxItemState; + +#define SFX_ITEM_UNKNOWN 0x0000 + +#define SFX_ITEM_DISABLED 0x0001 +#define SFX_ITEM_READONLY 0x0002 + +#define SFX_ITEM_DONTCARE 0x0010 +#define SFX_ITEM_DEFAULT 0x0020 +#define SFX_ITEM_SET 0x0030 + +// old stuff - dont use!!! +#define SFX_ITEM_AVAILABLE SFX_ITEM_DEFAULT +#define SFX_ITEM_OFF SFX_ITEM_DEFAULT +#define SFX_ITEM_ON SFX_ITEM_SET + +DBG_NAMEEX_VISIBILITY(SfxPoolItem, SVL_DLLPUBLIC) +DBG_NAMEEX(SfxVoidItem) +DBG_NAMEEX(SfxItemHandle) + +class SvXMLUnitConverter; +class SfxItemPool; +class SfxItemSet; + +class String; +namespace rtl +{ + class OUString; +} + +// ----------------------------------------------------------------------- + +class SVL_DLLPUBLIC SfxPoolItem +{ +friend class SfxItemPool; +friend class SfxItemDesruptor_Impl; +friend class SfxItemPoolCache; +friend class SfxItemSet; +friend class SfxVoidItem; + + ULONG nRefCount; // Referenzzaehler + USHORT nWhich; + USHORT nKind; + +private: + inline void SetRefCount( ULONG n ); + inline void SetKind( USHORT n ); +public: + inline ULONG AddRef( ULONG n = 1 ) const; +private: + inline ULONG ReleaseRef( ULONG n = 1 ) const; + SVL_DLLPRIVATE long Delete_Impl(void*); + +#if 0 + // @@@ virtual, but private, and dummy impl. @@@ + virtual void Store( SvStream & ) const; + virtual void GetVersion() const; +#endif + +protected: + SfxPoolItem( USHORT nWhich = 0 ); + SfxPoolItem( const SfxPoolItem& ); + +public: + TYPEINFO(); + virtual ~SfxPoolItem(); + + void SetWhich( USHORT nId ) { + DBG_CHKTHIS(SfxPoolItem, 0); + nWhich = nId; } + USHORT Which() const { + DBG_CHKTHIS(SfxPoolItem, 0); + return nWhich; } + virtual int operator==( const SfxPoolItem& ) const = 0; + int operator!=( const SfxPoolItem& rItem ) const + { return !(*this == rItem); } + virtual int Compare( const SfxPoolItem &rWith ) const; + virtual int Compare( const SfxPoolItem &rWith, const IntlWrapper& rIntlWrapper ) const; + + virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePresentation, + SfxMapUnit eCoreMetric, + SfxMapUnit ePresentationMetric, + XubString &rText, + const IntlWrapper * pIntlWrapper = 0 ) const; + + virtual USHORT GetVersion( USHORT nFileFormatVersion ) const; + virtual int ScaleMetrics( long lMult, long lDiv ); + virtual int HasMetrics() const; + + virtual BOOL QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const; + virtual BOOL PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ); + + virtual SfxPoolItem* Create( SvStream &, USHORT nItemVersion ) const; + virtual SvStream& Store( SvStream &, USHORT nItemVersion ) const; + virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const = 0; + + ULONG GetRefCount() const { return nRefCount; } + inline USHORT GetKind() const { return nKind; } + + /** Read in a Unicode string from a streamed byte string representation. + + @param rStream Some (input) stream. Its Stream/TargetCharSets must + be set to correct values! + + @param rString On success, returns the reconstructed Unicode string. + + @return True if the string was successfuly read and reconstructed. + */ + static bool readByteString(SvStream & rStream, UniString & rString); + + /** Write a byte string representation of a Unicode string into a stream. + + @param rStream Some (output) stream. Its Stream/TargetCharSets must + be set to correct values! + + @param rString Some Unicode string. + */ + static void writeByteString(SvStream & rStream, + UniString const & rString); + + /** Read in a Unicode string from either a streamed Unicode or byte string + representation. + + @param rStream Some (input) stream. If bUnicode is false, its + Stream/TargetCharSets must be set to correct values! + + @param rString On success, returns the reconstructed Unicode string. + + @param bUnicode Whether to read in a stream Unicode (true) or byte + string (false) representation. + + @return True if the string was successfuly read and reconstructed. + */ + static bool readUnicodeString(SvStream & rStream, UniString & rString, + bool bUnicode); + + /** Write a Unicode string representation of a Unicode string into a + stream. + + @param rStream Some (output) stream. + + @param rString Some Unicode string. + */ + static void writeUnicodeString(SvStream & rStream, + UniString const & rString); + +private: + SfxPoolItem& operator=( const SfxPoolItem& ); // n.i.!! +}; + +// ----------------------------------------------------------------------- + +inline void SfxPoolItem::SetRefCount( ULONG n ) +{ + DBG_CHKTHIS( SfxPoolItem, 0 ); + nRefCount = n; + nKind = 0; +} + +inline void SfxPoolItem::SetKind( USHORT n ) +{ + DBG_CHKTHIS( SfxPoolItem, 0 ); + nRefCount = SFX_ITEMS_SPECIAL; + nKind = n; +} + +inline ULONG SfxPoolItem::AddRef( ULONG n ) const +{ + DBG_CHKTHIS( SfxPoolItem, 0 ); + DBG_ASSERT( nRefCount <= SFX_ITEMS_MAXREF, "AddRef mit nicht-Pool-Item" ); + DBG_ASSERT( ULONG_MAX - nRefCount > n, "AddRef: Referenzzaehler ueberschlaegt sich" ); + return ( ((SfxPoolItem *)this)->nRefCount += n ); +} + +inline ULONG SfxPoolItem::ReleaseRef( ULONG n ) const +{ + DBG_CHKTHIS( SfxPoolItem, 0 ); + DBG_ASSERT( nRefCount <= SFX_ITEMS_MAXREF, "AddRef mit nicht-Pool-Item" ); + DBG_ASSERT( nRefCount >= n, "ReleaseRef: Referenzzaehler ueberschlaegt sich" ); + ((SfxPoolItem *)this)->nRefCount -= n; + return nRefCount; +} + +// ----------------------------------------------------------------------- + +inline int IsPoolDefaultItem(const SfxPoolItem *pItem ) +{ + return pItem && pItem->GetKind() == SFX_ITEMS_POOLDEFAULT; +} + +inline int IsStaticDefaultItem(const SfxPoolItem *pItem ) +{ + return pItem && pItem->GetKind() == SFX_ITEMS_STATICDEFAULT; +} + +inline int IsDefaultItem( const SfxPoolItem *pItem ) +{ + return pItem && pItem->GetKind() >= SFX_ITEMS_STATICDEFAULT; +} + +inline int IsPooledItem( const SfxPoolItem *pItem ) +{ + return pItem && pItem->GetRefCount() > 0 && pItem->GetRefCount() <= SFX_ITEMS_MAXREF; +} + +inline int IsInvalidItem(const SfxPoolItem *pItem) +{ + return pItem == (SfxPoolItem *)-1; +} + +// ----------------------------------------------------------------------- + +class SVL_DLLPUBLIC SfxVoidItem: public SfxPoolItem +{ + SfxVoidItem & operator=( const SfxVoidItem& ); // not implemented. +public: + TYPEINFO(); + SfxVoidItem( USHORT nWhich ); + SfxVoidItem( USHORT nWhich, SvStream & ); + SfxVoidItem( const SfxVoidItem& ); + ~SfxVoidItem(); + + virtual int operator==( const SfxPoolItem& ) const; + + virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres, + SfxMapUnit eCoreMetric, + SfxMapUnit ePresMetric, + XubString &rText, + const IntlWrapper * = 0 ) const; + + // von sich selbst eine Kopie erzeugen + virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const; + void SetWhich(USHORT nWh) { nWhich = nWh; } +}; + +// ----------------------------------------------------------------------- + +class SVL_DLLPUBLIC SfxSetItem: public SfxPoolItem +{ + SfxItemSet *pSet; + + SfxSetItem & operator=( const SfxSetItem& ); // not implemented. + +public: + TYPEINFO(); + SfxSetItem( USHORT nWhich, SfxItemSet *pSet ); + SfxSetItem( USHORT nWhich, const SfxItemSet &rSet ); + SfxSetItem( const SfxSetItem&, SfxItemPool *pPool = 0 ); + ~SfxSetItem(); + + virtual int operator==( const SfxPoolItem& ) const; + + virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres, + SfxMapUnit eCoreMetric, + SfxMapUnit ePresMetric, + XubString &rText, + const IntlWrapper * = 0 ) const; + + // von sich selbst eine Kopie erzeugen + virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const = 0; + virtual SfxPoolItem* Create(SvStream &, USHORT nVersion) const = 0; + virtual SvStream& Store(SvStream &, USHORT nVer) const; + + const SfxItemSet& GetItemSet() const + { return *pSet; } + SfxItemSet& GetItemSet() + { return *pSet; } +}; + +// ----------------------------------------------------------------------- + +#if 0 /* @@@ NOT USED @@@ */ +class SfxInvalidItem: public SfxPoolItem +{ +friend class SfxItemSet; + + const SfxPoolItem* pDefaultItem; + +private: + TYPEINFO(); + SfxInvalidItem( USHORT nWhich, const SfxPoolItem &rDefault ); + SfxInvalidItem( const SfxInvalidItem& ); + virtual ~SfxInvalidItem(); + +public: + virtual int operator==( const SfxPoolItem& ) const; + + virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres, + SfxMapUnit eCoreMetric, + SfxMapUnit ePresMetric, + XubString &rText, + const IntlWrapper * = 0 ) const; + const SfxPoolItem* GetDefaultItem() const { return pDefaultItem; } + + // von sich selbst eine Kopie erzeugen + virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const; + virtual SfxPoolItem* Create(SvStream &, USHORT nVersion) const; + virtual SvStream& Store(SvStream &, USHORT nVer ) const; +}; +#endif /* @@@ NOT USED @@@ */ + +// ----------------------------------------------------------------------- +// Handle Klasse fuer PoolItems + +class SVL_DLLPUBLIC SfxItemHandle +{ + USHORT *pRef; + SfxPoolItem *pItem; +public: + SfxItemHandle( SfxPoolItem& ); + SfxItemHandle( const SfxItemHandle& ); + ~SfxItemHandle(); + + const SfxItemHandle &operator=(const SfxItemHandle &); + const SfxPoolItem &GetItem() const { return *pItem; } +}; + +// ----------------------------------------------------------------------- + +DECL_PTRHINT(SVL_DLLPUBLIC, SfxPoolItemHint, SfxPoolItem); + +// ----------------------------------------------------------------------- + +#if 0 /* @@@ NOT USED @@@ */ +class SfxItemChangedHint: public SfxHint +{ + const SfxPoolItem& _rOld; + const SfxPoolItem& _rNew; + +public: + TYPEINFO(); \ + SfxItemChangedHint( const SfxPoolItem &rOld, + const SfxPoolItem &rNew ) + : _rOld( rOld ), + _rNew( rNew ) + {} + + const SfxPoolItem& GetOldItem() const { return _rOld; } + const SfxPoolItem& GetNewItem() const { return _rNew; } +}; + +#endif /* @@@ NOT USED @@@ */ + +#endif // #ifndef _SFXPOOLITEM_HXX |