/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ // This snippet of code is included by rngitem.cxx but not compiled directly. // Ugly hack, probably due to lack of templates in the 20th century. static inline NUMTYPE Count_Impl(const NUMTYPE * pRanges) { NUMTYPE nCount = 0; for (; *pRanges; pRanges += 2) nCount += 2; return nCount; } // ----------------------------------------------------------------------- TYPEINIT1_AUTOFACTORY(SfxXRangeItem, SfxPoolItem); TYPEINIT1_AUTOFACTORY(SfxXRangesItem, SfxPoolItem); NUMTYPE Count_Impl( const NUMTYPE *pRanges ); // ----------------------------------------------------------------------- SfxXRangeItem::SfxXRangeItem() { nFrom = 0; nTo = 0; } // ----------------------------------------------------------------------- SfxXRangeItem::SfxXRangeItem( sal_uInt16 which, NUMTYPE from, NUMTYPE to ): SfxPoolItem( which ), nFrom( from ), nTo( to ) { } // ----------------------------------------------------------------------- SfxXRangeItem::SfxXRangeItem( const SfxXRangeItem& rItem ) : SfxPoolItem( rItem ) { nFrom = rItem.nFrom; nTo = rItem.nTo; } // ----------------------------------------------------------------------- SfxItemPresentation SfxXRangeItem::GetPresentation ( SfxItemPresentation /*ePresentation*/, SfxMapUnit /*eCoreMetric*/, SfxMapUnit /*ePresentationMetric*/, XubString& rText, const IntlWrapper * ) const { rText = rtl::OUString::valueOf(static_cast(nFrom)); rText += ':'; rText += rtl::OUString::valueOf(static_cast(nTo)); return SFX_ITEM_PRESENTATION_NAMELESS; } // ----------------------------------------------------------------------- int SfxXRangeItem::operator==( const SfxPoolItem& rItem ) const { DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" ); SfxXRangeItem* pT = (SfxXRangeItem*)&rItem; if( nFrom==pT->nFrom && nTo==pT->nTo ) return 1; return 0; } // ----------------------------------------------------------------------- SfxPoolItem* SfxXRangeItem::Clone(SfxItemPool *) const { return new SfxXRangeItem( Which(), nFrom, nTo ); } // ----------------------------------------------------------------------- SfxPoolItem* SfxXRangeItem::Create(SvStream &rStream, sal_uInt16) const { NUMTYPE nVon(0), nBis(0); rStream >> nVon; rStream >> nBis; return new SfxXRangeItem( Which(), nVon, nBis ); } // ----------------------------------------------------------------------- SvStream& SfxXRangeItem::Store(SvStream &rStream, sal_uInt16) const { rStream << nFrom; rStream << nTo; return rStream; } //========================================================================= SfxXRangesItem::SfxXRangesItem() : _pRanges(0) { } //------------------------------------------------------------------------- SfxXRangesItem::SfxXRangesItem( sal_uInt16 nWID, SvStream &rStream ) : SfxPoolItem( nWID ) { NUMTYPE nCount(0); rStream >> nCount; _pRanges = new NUMTYPE[nCount + 1]; for ( NUMTYPE n = 0; n < nCount; ++n ) rStream >> _pRanges[n]; _pRanges[nCount] = 0; } //------------------------------------------------------------------------- SfxXRangesItem::SfxXRangesItem( const SfxXRangesItem& rItem ) : SfxPoolItem( rItem ) { NUMTYPE nCount = Count_Impl(rItem._pRanges) + 1; _pRanges = new NUMTYPE[nCount]; memcpy( _pRanges, rItem._pRanges, sizeof(NUMTYPE) * nCount ); } //------------------------------------------------------------------------- SfxXRangesItem::~SfxXRangesItem() { delete _pRanges; } //------------------------------------------------------------------------- int SfxXRangesItem::operator==( const SfxPoolItem &rItem ) const { const SfxXRangesItem &rOther = (const SfxXRangesItem&) rItem; if ( !_pRanges && !rOther._pRanges ) return sal_True; if ( _pRanges || rOther._pRanges ) return sal_False; NUMTYPE n; for ( n = 0; _pRanges[n] && rOther._pRanges[n]; ++n ) if ( *_pRanges != rOther._pRanges[n] ) return 0; return !_pRanges[n] && !rOther._pRanges[n]; } //------------------------------------------------------------------------- SfxItemPresentation SfxXRangesItem::GetPresentation( SfxItemPresentation /*ePres*/, SfxMapUnit /*eCoreMetric*/, SfxMapUnit /*ePresMetric*/, XubString &/*rText*/, const IntlWrapper * ) const { HACK(n. i.) return SFX_ITEM_PRESENTATION_NONE; } //------------------------------------------------------------------------- SfxPoolItem* SfxXRangesItem::Clone( SfxItemPool * ) const { return new SfxXRangesItem( *this ); } //------------------------------------------------------------------------- SfxPoolItem* SfxXRangesItem::Create( SvStream &rStream, sal_uInt16 ) const { return new SfxXRangesItem( Which(), rStream ); } //------------------------------------------------------------------------- SvStream& SfxXRangesItem::Store( SvStream &rStream, sal_uInt16 ) const { NUMTYPE nCount = Count_Impl( _pRanges ); rStream >> nCount; for ( NUMTYPE n = 0; _pRanges[n]; ++n ) rStream >> _pRanges[n]; return rStream; } #undef NUMTYPE #undef SfxXRangeItem #undef SfxXRangesItem /* vim:set shiftwidth=4 softtabstop=4 expandtab: */