blob: 43c037679fd0ca40ea2b4bf630a6cbc24f80ed36 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_X_NOTE_HELPER_IMPL_HXX
#define INCLUDED_X_NOTE_HELPER_IMPL_HXX
namespace writerfilter {
namespace doctok
{
template <class T>
sal_uInt32 XNoteHelper<T>::getCount() const
{
sal_uInt32 nResult = 0;
if (mpCps.get() != NULL && mpCps->getCount() > 8)
nResult = ( mpCps->getCount() / 4) - 2;
return nResult;
}
template <class T>
CpAndFc XNoteHelper<T>::getCpAndFc(sal_uInt32 nPos)
{
// There are getCount() + 1 entries in mpOffsets => greater
if (nPos > getCount())
throw ExceptionNotFound("getCpAndFc");
Cp aCp(mCpAndFcOffset.getCp() + mpCps->getU32(nPos * 4));
Fc aFc(mpPieceTable->cp2fc(aCp));
CpAndFc aCpAndFc(aCp, aFc, meType);
return aCpAndFc;
}
template <class T>
CpAndFc XNoteHelper<T>::getRefCpAndFc(sal_uInt32 nPos)
{
// There are getCount() entries in mpRefs => greater or equal
if (nPos >= getCount())
throw ExceptionNotFound("");
Cp aCp(mpRefs->getFc(nPos));
Fc aFc(mpPieceTable->cp2fc(aCp));
CpAndFc aCpAndFc(aCp, aFc, meType);
return aCpAndFc;
}
template <class T>
writerfilter::Reference<Stream>::Pointer_t
XNoteHelper<T>::get(sal_uInt32 nPos)
{
// There are getCount() entries => greater or equal
if (nPos >= getCount())
throw ExceptionNotFound("get");
writerfilter::Reference<Stream>::Pointer_t pResult;
CpAndFc aCpAndFcStart(getCpAndFc(nPos));
CpAndFc aCpAndFcEnd(getCpAndFc(nPos + 1));
if (aCpAndFcStart < aCpAndFcEnd)
pResult = writerfilter::Reference<Stream>::Pointer_t
(new WW8DocumentImpl(*mpDocument, aCpAndFcStart, aCpAndFcEnd));
return pResult;
}
template <class T>
sal_uInt32 XNoteHelper<T>::getIndexOfCpAndFc(const CpAndFc & rCpAndFc)
{
sal_uInt32 nResult = getCount();
sal_uInt32 n = nResult;
while (n > 0)
{
--n;
Cp aCp(mpRefs->getFc(n));
Fc aFc(mpPieceTable->cp2fc(aCp));
CpAndFc aCpAndFc(aCp, aFc, meType);
if (aCpAndFc <= rCpAndFc)
{
nResult = n;
break;
}
}
return nResult;
}
template <class T>
writerfilter::Reference<Stream>::Pointer_t
XNoteHelper<T>::get(const CpAndFc & rCpAndFc)
{
writerfilter::Reference<Stream>::Pointer_t pResult;
sal_uInt32 n = getIndexOfCpAndFc(rCpAndFc);
if (n < getCount())
pResult = get(n);
return pResult;
}
template <class T>
T *
XNoteHelper<T>::getRef(sal_uInt32 nIndex)
{
return mpRefs->getEntryPointer(nIndex);
}
template <class T>
T *
XNoteHelper<T>::getRef(const CpAndFc & rCpAndFc)
{
T * pResult = NULL;
sal_uInt32 n = getIndexOfCpAndFc(rCpAndFc);
if (n < getCount())
{
pResult = getRef(n);
}
return pResult;
}
template <class T>
void XNoteHelper<T>::init()
{
for (sal_uInt32 n = 0; n < getCount(); ++n)
{
CpAndFc aCpAndFc(getCpAndFc(n));
mpDocument->insertCpAndFc(aCpAndFc);
CpAndFc aCpAndFcRef(getRefCpAndFc(n));
mpDocument->insertCpAndFc(aCpAndFcRef);
}
}
}}
#endif // INCLUDED_X_NOTE_HELPER_IMPL_HXX