diff options
Diffstat (limited to 'svl/source/items/ctypeitm.cxx')
-rw-r--r-- | svl/source/items/ctypeitm.cxx | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/svl/source/items/ctypeitm.cxx b/svl/source/items/ctypeitm.cxx new file mode 100644 index 000000000000..69302ebdb868 --- /dev/null +++ b/svl/source/items/ctypeitm.cxx @@ -0,0 +1,254 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ctypeitm.cxx,v $ + * $Revision: 1.7.136.1 $ + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svl.hxx" +#include <com/sun/star/uno/Any.hxx> + +#include <unotools/intlwrapper.hxx> +#include <tools/stream.hxx> +#include <svl/ctypeitm.hxx> + +//============================================================================ +// The following defines are copied from chaos/source/items/cstritem.cxx: +#define CNTSTRINGITEM_STREAM_MAGIC ( (UINT32)0xfefefefe ) +#define CNTSTRINGITEM_STREAM_SEEKREL (-( (long)( sizeof( UINT32 ) ) ) ) + +//============================================================================ +// +// class CntContentTypeItem Implementation. +// +//============================================================================ + +TYPEINIT1_AUTOFACTORY( CntContentTypeItem, CntUnencodedStringItem ); + +#define CONTENT_TYPE_NOT_INIT ( (INetContentType)-1 ) + +//---------------------------------------------------------------------------- +CntContentTypeItem::CntContentTypeItem() +: CntUnencodedStringItem(), + _eType( CONTENT_TYPE_NOT_INIT ) +{ +} + +//---------------------------------------------------------------------------- +CntContentTypeItem::CntContentTypeItem( USHORT which, const XubString& rType ) +: CntUnencodedStringItem( which, rType ), + _eType( CONTENT_TYPE_NOT_INIT ) +{ +} + +//---------------------------------------------------------------------------- +CntContentTypeItem::CntContentTypeItem( USHORT which, + const INetContentType eType ) +: CntUnencodedStringItem( which, INetContentTypes::GetContentType( eType ) ), + _eType( eType ) +{ +} + +//---------------------------------------------------------------------------- +CntContentTypeItem::CntContentTypeItem( const CntContentTypeItem& rOrig ) +: CntUnencodedStringItem( rOrig ), + _eType( rOrig._eType ), + _aPresentation( rOrig._aPresentation ) +{ +} + +//============================================================================ +// virtual +USHORT CntContentTypeItem::GetVersion(USHORT) const +{ + return 1; // because it uses SfxPoolItem::read/writeUnicodeString() +} + +//---------------------------------------------------------------------------- +// virtual +SfxPoolItem* CntContentTypeItem::Create( SvStream& rStream, + USHORT nItemVersion ) const +{ + // CntContentTypeItem used to be derived from CntStringItem, so take that + // into account: + UniString aValue; + readUnicodeString(rStream, aValue, nItemVersion >= 1); + UINT32 nMagic = 0; + rStream >> nMagic; + if (nMagic == CNTSTRINGITEM_STREAM_MAGIC) + { + BOOL bEncrypted = FALSE; + rStream >> bEncrypted; + DBG_ASSERT(!bEncrypted, + "CntContentTypeItem::Create() reads encrypted data"); + } + else + rStream.SeekRel(CNTSTRINGITEM_STREAM_SEEKREL); + + return new CntContentTypeItem(Which(), aValue); +} + +//---------------------------------------------------------------------------- +// virtual +SvStream & CntContentTypeItem::Store(SvStream & rStream, USHORT) const +{ + // CntContentTypeItem used to be derived from CntStringItem, so take that + // into account: + writeUnicodeString(rStream, GetValue()); + rStream << CNTSTRINGITEM_STREAM_MAGIC << BOOL(FALSE); + return rStream; +} + +//---------------------------------------------------------------------------- +// virtual +int CntContentTypeItem::operator==( const SfxPoolItem& rOrig ) const +{ + const CntContentTypeItem& rOther = (const CntContentTypeItem&)rOrig; + + if ( ( _eType != CONTENT_TYPE_NOT_INIT ) && + ( rOther._eType != CONTENT_TYPE_NOT_INIT ) ) + return _eType == rOther._eType; + else + return CntUnencodedStringItem::operator==( rOther ); +} + +//---------------------------------------------------------------------------- +// virtual +SfxPoolItem* CntContentTypeItem::Clone( SfxItemPool* /* pPool */ ) const +{ + return new CntContentTypeItem( *this ); +} + +//---------------------------------------------------------------------------- +void CntContentTypeItem::SetValue( const XubString& rNewVal ) +{ + // De-initialize enum type and presentation. + _eType = CONTENT_TYPE_NOT_INIT; + _aPresentation.Erase(); + + CntUnencodedStringItem::SetValue( rNewVal ); +} + +//---------------------------------------------------------------------------- +void CntContentTypeItem::SetPresentation( const XubString& rNewVal ) +{ + _aPresentation = rNewVal; +} + +//---------------------------------------------------------------------------- +int CntContentTypeItem::Compare( const SfxPoolItem &rWith, const IntlWrapper& rIntlWrapper ) const +{ + String aOwnText, aWithText; + GetPresentation( SFX_ITEM_PRESENTATION_NAMELESS, + SFX_MAPUNIT_APPFONT, SFX_MAPUNIT_APPFONT, aOwnText, &rIntlWrapper ); + rWith.GetPresentation( SFX_ITEM_PRESENTATION_NAMELESS, + SFX_MAPUNIT_APPFONT, SFX_MAPUNIT_APPFONT, aWithText, &rIntlWrapper ); + return rIntlWrapper.getCollator()->compareString( aOwnText, aWithText ); +} + +//---------------------------------------------------------------------------- +SfxItemPresentation CntContentTypeItem::GetPresentation( + SfxItemPresentation ePres, + SfxMapUnit eCoreMetric, + SfxMapUnit ePresMetric, + XubString & rText, + const IntlWrapper * pIntlWrapper) const +{ + if (_aPresentation.Len() == 0) + { + DBG_ASSERT(pIntlWrapper, + "CntContentTypeItem::GetPresentation(): No IntlWrapper"); + if (pIntlWrapper) + SAL_CONST_CAST(CntContentTypeItem *, this)->_aPresentation + = INetContentTypes::GetPresentation(GetEnumValue(), + pIntlWrapper-> + getLocale()); + } + if (_aPresentation.Len() > 0) + { + rText = _aPresentation; + return SFX_ITEM_PRESENTATION_COMPLETE; + } + else + return CntUnencodedStringItem::GetPresentation(ePres, eCoreMetric, + ePresMetric, rText, + pIntlWrapper); +} + +//---------------------------------------------------------------------------- +INetContentType CntContentTypeItem::GetEnumValue() const +{ + if ( _eType == CONTENT_TYPE_NOT_INIT ) + { + // Not yet initialized... Get enum value for string content type. + + CntContentTypeItem* pVarThis = SAL_CONST_CAST( CntContentTypeItem*, this ); + + pVarThis->_eType = INetContentTypes::GetContentType( GetValue() ); + } + + return _eType; +} + +//---------------------------------------------------------------------------- +void CntContentTypeItem::SetValue( const INetContentType eType ) +{ + SetValue( INetContentTypes::GetContentType( eType ) ); + + // Note: SetValue( const String& ....) resets _eType. Set new enum value + // after(!) calling it. + _eType = eType; +} + +//---------------------------------------------------------------------------- +// virtual +BOOL CntContentTypeItem::QueryValue( com::sun::star::uno::Any& rVal,BYTE ) const +{ + rVal <<= rtl::OUString(GetValue()); + return true; +} + +//---------------------------------------------------------------------------- +// virtual +BOOL CntContentTypeItem::PutValue( const com::sun::star::uno::Any& rVal,BYTE ) +{ + rtl::OUString aValue; + if ( rVal >>= aValue ) + { + // SetValue with an empty string resets the item; so call that + // function when PutValue is called with an empty string + if (aValue.getLength() == 0) + SetValue(aValue); + else + SetValue( + INetContentTypes::RegisterContentType(aValue, UniString())); + return true; + } + + DBG_ERROR( "CntContentTypeItem::PutValue - Wrong type!" ); + return false; +} |