summaryrefslogtreecommitdiff
path: root/binfilter/bf_sw/source/core/unocore/sw_unoportenum.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_sw/source/core/unocore/sw_unoportenum.cxx')
-rw-r--r--binfilter/bf_sw/source/core/unocore/sw_unoportenum.cxx923
1 files changed, 0 insertions, 923 deletions
diff --git a/binfilter/bf_sw/source/core/unocore/sw_unoportenum.cxx b/binfilter/bf_sw/source/core/unocore/sw_unoportenum.cxx
deleted file mode 100644
index b96c4943c923..000000000000
--- a/binfilter/bf_sw/source/core/unocore/sw_unoportenum.cxx
+++ /dev/null
@@ -1,923 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * 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.
- *
- ************************************************************************/
-
-
-#ifdef _MSC_VER
-#pragma hdrstop
-#endif
-
-#include <bookmrk.hxx>
-
-#include <horiornt.hxx>
-
-#include <doc.hxx>
-#include <txatbase.hxx>
-#include <ndhints.hxx>
-#include <ndtxt.hxx>
-#include <unocrsr.hxx>
-#include <docary.hxx>
-#include <fmthbsh.hxx>
-#include <tox.hxx>
-#include <unoclbck.hxx>
-
-#include <errhdl.hxx>
-
-#include <unoobj.hxx>
-#include <unoredline.hxx>
-#include <fmtanchr.hxx>
-#include <unoidx.hxx>
-#include <redline.hxx>
-#include <crsskip.hxx>
-#include <osl/mutex.hxx>
-#include <vcl/svapp.hxx>
-namespace binfilter {
-
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::text;
-
-using rtl::OUString;
-
-/******************************************************************
- * SwXTextPortionEnumeration
- ******************************************************************/
-/* -----------------------------13.03.00 12:15--------------------------------
-
- ---------------------------------------------------------------------------*/
-const uno::Sequence< sal_Int8 > & SwXTextPortionEnumeration::getUnoTunnelId()
-{
- static uno::Sequence< sal_Int8 > aSeq = ::binfilter::CreateUnoTunnelId();
- return aSeq;
-}
-/* -----------------------------10.03.00 18:04--------------------------------
-
- ---------------------------------------------------------------------------*/
-sal_Int64 SAL_CALL SwXTextPortionEnumeration::getSomething( const uno::Sequence< sal_Int8 >& rId )
- throw(uno::RuntimeException)
-{
- if( rId.getLength() == 16
- && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
- rId.getConstArray(), 16 ) )
- {
- return (sal_Int64)this;
- }
- return 0;
-}
-/* -----------------------------06.04.00 16:39--------------------------------
-
- ---------------------------------------------------------------------------*/
-OUString SwXTextPortionEnumeration::getImplementationName(void) throw( RuntimeException )
-{
- return C2U("SwXTextPortionEnumeration");
-}
-/* -----------------------------06.04.00 16:39--------------------------------
-
- ---------------------------------------------------------------------------*/
-BOOL SwXTextPortionEnumeration::supportsService(const OUString& rServiceName) throw( RuntimeException )
-{
- return C2U("com.sun.star.text.TextPortionEnumeration") == rServiceName;
-}
-/* -----------------------------06.04.00 16:39--------------------------------
-
- ---------------------------------------------------------------------------*/
-Sequence< OUString > SwXTextPortionEnumeration::getSupportedServiceNames(void) throw( RuntimeException )
-{
- Sequence< OUString > aRet(1);
- OUString* pArray = aRet.getArray();
- pArray[0] = C2U("com.sun.star.text.TextPortionEnumeration");
- return aRet;
-}
-/*-- 27.01.99 10:44:43---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-SwXTextPortionEnumeration::SwXTextPortionEnumeration(
- SwPaM& rParaCrsr,
- uno::Reference< XText > xParentText,
- sal_Int32 nStart,
- sal_Int32 nEnd
- ) :
- xParent(xParentText),
- bAtEnd(sal_False),
- bFirstPortion(sal_True),
- nStartPos(nStart),
- nEndPos(nEnd)
-{
- SwUnoCrsr* pUnoCrsr = rParaCrsr.GetDoc()->CreateUnoCrsr(*rParaCrsr.GetPoint(), sal_False);
- pUnoCrsr->Add(this);
-
- DBG_ASSERT(nEnd == -1 || (nStart <= nEnd &&
- nEnd <= pUnoCrsr->Start()->nNode.GetNode().GetTxtNode()->GetTxt().Len()),
- "start or end value invalid!");
- //alle Rahmen, Grafiken und OLEs suchen, die an diesem Absatz
- // AM ZEICHEN gebunden sind
- ::binfilter::CollectFrameAtNode( *this, pUnoCrsr->GetPoint()->nNode,
- aFrameArr, TRUE );
- CreatePortions();
-}
-/*-- 27.01.99 10:44:44---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-SwXTextPortionEnumeration::~SwXTextPortionEnumeration()
-{
- for(sal_uInt16 nFrame = aFrameArr.Count(); nFrame; )
- delete aFrameArr.GetObject( --nFrame );
- aFrameArr.Remove(0, aFrameArr.Count());
-
- if( aPortionArr.Count() )
- aPortionArr.DeleteAndDestroy(0, aPortionArr.Count() );
-
- SwUnoCrsr* pUnoCrsr = GetCrsr();
- delete pUnoCrsr;
-}
-/*-- 27.01.99 10:44:44---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-sal_Bool SwXTextPortionEnumeration::hasMoreElements(void) throw( uno::RuntimeException )
-{
- SolarMutexGuard aGuard;
- return aPortionArr.Count() > 0;
-}
-/*-- 27.01.99 10:44:45---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-uno::Any SwXTextPortionEnumeration::nextElement(void)
- throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
-{
- SolarMutexGuard aGuard;
- if(!aPortionArr.Count())
- throw container::NoSuchElementException();
- XTextRangeRefPtr pPortion = aPortionArr.GetObject(0);
- Any aRet(pPortion, ::getCppuType((uno::Reference<XTextRange>*)0));
- aPortionArr.Remove(0);
- delete pPortion;
- return aRet;
-}
-/* -----------------------------31.08.00 14:28--------------------------------
-
- ---------------------------------------------------------------------------*/
-void lcl_InsertRefMarkPortion(
- XTextRangeArr& rArr, SwUnoCrsr* pUnoCrsr, Reference<XText>& rParent, SwTxtAttr* pAttr, BOOL bEnd)
-{
- SwDoc* pDoc = pUnoCrsr->GetDoc();
- SwFmtRefMark& rRefMark = ((SwFmtRefMark&)pAttr->GetAttr());
- Reference<XTextContent> xContent = ((SwUnoCallBack*)pDoc->GetUnoCallBack())->GetRefMark(rRefMark);
- if(!xContent.is())
- xContent = new SwXReferenceMark(pDoc, &rRefMark);
-
- SwXTextPortion* pPortion;
- if(!bEnd)
- {
- rArr.Insert(
- new Reference< XTextRange >(pPortion = new SwXTextPortion(pUnoCrsr, rParent, PORTION_REFMARK_START)),
- rArr.Count());
- pPortion->SetRefMark(xContent);
- pPortion->SetCollapsed(pAttr->GetEnd() ? FALSE : TRUE);
- }
- else
- {
- rArr.Insert(
- new Reference< XTextRange >(pPortion = new SwXTextPortion(pUnoCrsr, rParent, PORTION_REFMARK_END)),
- rArr.Count());
- pPortion->SetRefMark(xContent);
- }
-}
-//-----------------------------------------------------------------------------
-void lcl_InsertRubyPortion( XTextRangeArr& rArr, SwUnoCrsr* pUnoCrsr,
- Reference<XText>& rParent, SwTxtAttr* pAttr, BOOL bEnd)
-{
- SwXRubyPortion* pPortion;
- rArr.Insert(
- new Reference< XTextRange >(pPortion = new SwXRubyPortion(*pUnoCrsr, *(SwTxtRuby*)pAttr, rParent,
- bEnd)),
- rArr.Count());
- pPortion->SetCollapsed(pAttr->GetEnd() ? FALSE : TRUE);
-}
-//-----------------------------------------------------------------------------
-void lcl_InsertTOXMarkPortion(
- XTextRangeArr& rArr, SwUnoCrsr* pUnoCrsr, Reference<XText>& rParent, SwTxtAttr* pAttr, BOOL bEnd)
-{
- SwDoc* pDoc = pUnoCrsr->GetDoc();
- SwTOXMark& rTOXMark = ((SwTOXMark&)pAttr->GetAttr());
-
- Reference<XTextContent> xContent =
- ((SwUnoCallBack*)pDoc->GetUnoCallBack())->GetTOXMark(rTOXMark);
- if(!xContent.is())
- xContent = new SwXDocumentIndexMark(rTOXMark.GetTOXType(), &rTOXMark, pDoc);
-
- SwXTextPortion* pPortion;
- if(!bEnd)
- {
- rArr.Insert(
- new Reference< XTextRange >(pPortion = new SwXTextPortion(pUnoCrsr, rParent, PORTION_TOXMARK_START)),
- rArr.Count());
- pPortion->SetTOXMark(xContent);
- pPortion->SetCollapsed(pAttr->GetEnd() ? FALSE : TRUE);
- }
- if(bEnd)
- {
- rArr.Insert(
- new Reference< XTextRange >(pPortion = new SwXTextPortion(pUnoCrsr, rParent, PORTION_TOXMARK_END)),
- rArr.Count());
- pPortion->SetTOXMark(xContent);
- }
-}
-//-----------------------------------------------------------------------------
-#define BKM_TYPE_START 0
-#define BKM_TYPE_END 1
-#define BKM_TYPE_START_END 2
-struct SwXBookmarkPortion_Impl
-{
- SwXBookmark* pBookmark;
- Reference<XTextContent> xBookmark;
- BYTE nBkmType;
- ULONG nIndex;
-
- SwXBookmarkPortion_Impl( SwXBookmark* pXMark, BYTE nType, ULONG nIdx) :
- pBookmark(pXMark),
- xBookmark(pXMark),
- nBkmType(nType),
- nIndex(nIdx){}
-
- // compare by nIndex
- BOOL operator < (const SwXBookmarkPortion_Impl &rCmp) const;
- BOOL operator ==(const SwXBookmarkPortion_Impl &rCmp) const;
-
-};
-BOOL SwXBookmarkPortion_Impl::operator ==(const SwXBookmarkPortion_Impl &rCmp) const
-{
- return nIndex == rCmp.nIndex &&
- pBookmark == rCmp.pBookmark &&
- nBkmType == rCmp.nBkmType;
-}
-
-BOOL SwXBookmarkPortion_Impl::operator < (const SwXBookmarkPortion_Impl &rCmp) const
-{
- return nIndex < rCmp.nIndex;
-}
-
-typedef SwXBookmarkPortion_Impl* SwXBookmarkPortion_ImplPtr;
-SV_DECL_PTRARR_SORT(SwXBookmarkPortionArr, SwXBookmarkPortion_ImplPtr, 0, 2)
-SV_IMPL_OP_PTRARR_SORT(SwXBookmarkPortionArr, SwXBookmarkPortion_ImplPtr)
-//-----------------------------------------------------------------------------
-void lcl_ExportBookmark(
- SwXBookmarkPortionArr& rBkmArr, ULONG nIndex,
- SwUnoCrsr* pUnoCrsr, Reference<XText> & rParent, XTextRangeArr& rPortionArr)
-{
- SwXBookmarkPortion_ImplPtr pPtr;
- while(rBkmArr.Count() && nIndex == (pPtr = rBkmArr.GetObject(0))->nIndex)
- {
- SwXTextPortion* pPortion;
- if(BKM_TYPE_START == pPtr->nBkmType || BKM_TYPE_START_END == pPtr->nBkmType)
- {
- rPortionArr.Insert(
- new Reference< XTextRange >(pPortion = new SwXTextPortion(pUnoCrsr, rParent, PORTION_BOOKMARK_START)),
- rPortionArr.Count());
- pPortion->SetBookmark(pPtr->xBookmark);
- pPortion->SetCollapsed(BKM_TYPE_START_END == pPtr->nBkmType ? TRUE : FALSE);
-
- }
- if(BKM_TYPE_END == pPtr->nBkmType)
- {
- rPortionArr.Insert(
- new Reference< XTextRange >(pPortion = new SwXTextPortion(pUnoCrsr, rParent, PORTION_BOOKMARK_END)),
- rPortionArr.Count());
- pPortion->SetBookmark(pPtr->xBookmark);
- }
- rBkmArr.Remove((USHORT)0);
- delete pPtr;
- }
-}
-/* -----------------------------18.12.00 14:51--------------------------------
-
- ---------------------------------------------------------------------------*/
-//-----------------------------------------------------------------------------
-#define REDLINE_PORTION_START_REMOVE 0//removed redlines are visible
-#define REDLINE_PORTION_END_REMOVE 1//removed redlines are visible
-#define REDLINE_PORTION_REMOVE 2//removed redlines are NOT visible
-#define REDLINE_PORTION_INSERT_START 3
-#define REDLINE_PORTION_INSERT_END 4
-
-struct SwXRedlinePortion_Impl
-{
- const SwRedline* pRedline;
- sal_Bool bStart;
-
- SwXRedlinePortion_Impl(const SwRedline* pRed, sal_Bool bIsStart) :
- pRedline(pRed),
- bStart(bIsStart)
- {}
-
- USHORT GetIndexPos()
- {
- const SwPosition* pOwnPos = bStart ?
- pRedline->Start() : pRedline->End();
- return pOwnPos->nContent.GetIndex();
- }
- // compare by Position
- BOOL operator < (const SwXRedlinePortion_Impl &rCmp) const
- { const SwPosition* pOwnPos = bStart ?
- pRedline->Start() : pRedline->End();
- const SwPosition* pCmpPos = rCmp.bStart ?
- rCmp.pRedline->Start() : rCmp.pRedline->End();
- return *pOwnPos <= *pCmpPos;
- }
-
- BOOL operator ==(const SwXRedlinePortion_Impl &rCmp) const
- {return pRedline == rCmp.pRedline &&
- bStart == rCmp.bStart;}
-};
-typedef SwXRedlinePortion_Impl* SwXRedlinePortion_ImplPtr;
-SV_DECL_PTRARR_SORT(SwXRedlinePortionArr, SwXRedlinePortion_ImplPtr, 0, 2)
-SV_IMPL_OP_PTRARR_SORT(SwXRedlinePortionArr, SwXRedlinePortion_ImplPtr)
-
-//-----------------------------------------------------------------------------
-Reference<XTextRange> lcl_ExportHints(SwpHints* pHints,
- XTextRangeArr& rPortionArr,
- SwUnoCrsr* pUnoCrsr,
- Reference<XText> & rParent,
- const xub_StrLen nCurrentIndex,
- SwTextPortionType& ePortionType,
- const xub_StrLen& nFirstFrameIndex,
- SwXBookmarkPortionArr& aBkmArr,
- SwXRedlinePortionArr& aRedArr,
- sal_Int32 nEndPos )
-{
- Reference<XTextRange> xRef;
- SwDoc* pDoc = pUnoCrsr->GetDoc();
- sal_Bool bAttrFound = sal_False;
- //search for special text attributes - first some ends
- sal_uInt16 nEndIndex = 0;
- sal_uInt16 nNextEnd = 0;
- while(nEndIndex < pHints->GetEndCount() &&
- (!pHints->GetEnd(nEndIndex)->GetEnd() ||
- nCurrentIndex >= (nNextEnd = (*pHints->GetEnd(nEndIndex)->GetEnd()))))
- {
- if(pHints->GetEnd(nEndIndex)->GetEnd())
- {
- SwTxtAttr* pAttr = pHints->GetEnd(nEndIndex);
- USHORT nAttrWhich = pAttr->Which();
- if(nNextEnd == nCurrentIndex &&
- ( RES_TXTATR_TOXMARK == nAttrWhich ||
- RES_TXTATR_REFMARK == nAttrWhich ||
- RES_TXTATR_CJK_RUBY == nAttrWhich))
- {
- switch( nAttrWhich )
- {
- case RES_TXTATR_TOXMARK:
- lcl_InsertTOXMarkPortion(
- rPortionArr, pUnoCrsr, rParent, pAttr, TRUE);
- ePortionType = PORTION_TEXT;
- break;
- case RES_TXTATR_REFMARK:
- lcl_InsertRefMarkPortion(
- rPortionArr, pUnoCrsr, rParent, pAttr, TRUE);
- ePortionType = PORTION_TEXT;
- break;
- case RES_TXTATR_CJK_RUBY:
- lcl_InsertRubyPortion(
- rPortionArr, pUnoCrsr, rParent, pAttr, TRUE);
- ePortionType = PORTION_TEXT;
- break;
- }
- }
- }
- nEndIndex++;
- }
- //then som starts
- sal_uInt16 nStartIndex = 0;
- sal_uInt16 nNextStart = 0;
- while(nStartIndex < pHints->GetStartCount() &&
- nCurrentIndex >= (nNextStart = (*pHints->GetStart(nStartIndex)->GetStart())))
- {
- SwTxtAttr* pAttr = pHints->GetStart(nStartIndex);
- USHORT nAttrWhich = pAttr->Which();
- if(nNextStart == nCurrentIndex &&
- (!pAttr->GetEnd() ||
- RES_TXTATR_TOXMARK == nAttrWhich ||
- RES_TXTATR_REFMARK == nAttrWhich||
- RES_TXTATR_CJK_RUBY == nAttrWhich))
- {
- switch( nAttrWhich )
- {
- case RES_TXTATR_FIELD:
- pUnoCrsr->Right(1,CRSR_SKIP_CHARS);
- bAttrFound = sal_True;
- ePortionType = PORTION_FIELD;
- break;
- case RES_TXTATR_FLYCNT :
- pUnoCrsr->Right(1,CRSR_SKIP_CHARS);
- pUnoCrsr->Exchange();
- bAttrFound = sal_True;
- ePortionType = PORTION_FRAME;
- break;
- case RES_TXTATR_FTN :
- {
- pUnoCrsr->Right(1,CRSR_SKIP_CHARS);
- SwXTextPortion* pPortion;
- xRef = pPortion = new SwXTextPortion(pUnoCrsr, rParent, PORTION_FOOTNOTE);
- Reference<XTextContent> xContent =
- Reference<XTextContent>(
- SwXFootnotes::GetObject(*pDoc, pAttr->SwTxtAttr::GetFtn()),
- UNO_QUERY);
- pPortion->SetFootnote(xContent);
- bAttrFound = sal_True;
- ePortionType = PORTION_TEXT;
- }
- break;
- case RES_TXTATR_SOFTHYPH :
- {
- SwXTextPortion* pPortion;
- rPortionArr.Insert(
- new Reference< XTextRange >(
- pPortion = new SwXTextPortion(
- pUnoCrsr, rParent, PORTION_CONTROL_CHAR)),
- rPortionArr.Count());
- pPortion->SetControlChar(3);
- ePortionType = PORTION_TEXT;
- }
- break;
- case RES_TXTATR_HARDBLANK:
- {
- ePortionType = PORTION_CONTROL_CHAR;
- SwXTextPortion* pPortion;
- rPortionArr.Insert(
- new Reference< XTextRange >(
- pPortion = new SwXTextPortion(
- pUnoCrsr, rParent, PORTION_CONTROL_CHAR)),
- rPortionArr.Count());
- const SwFmtHardBlank& rFmt = pAttr->GetHardBlank();
- if(rFmt.GetChar() == '-')
- pPortion->SetControlChar(2);//HARD_HYPHEN
- else
- pPortion->SetControlChar(4);//HARD_SPACE
- ePortionType = PORTION_TEXT;
- }
- break;
- case RES_TXTATR_TOXMARK:
- lcl_InsertTOXMarkPortion(
- rPortionArr, pUnoCrsr, rParent, pAttr, FALSE);
- ePortionType = PORTION_TEXT;
- break;
- case RES_TXTATR_REFMARK:
- if(!pAttr->GetEnd())
- {
- pUnoCrsr->Right(1,CRSR_SKIP_CHARS);
- bAttrFound = sal_True;
- }
- lcl_InsertRefMarkPortion(
- rPortionArr, pUnoCrsr, rParent, pAttr, FALSE);
- ePortionType = PORTION_TEXT;
- if(!pAttr->GetEnd())
- {
- if(*pUnoCrsr->GetPoint() < *pUnoCrsr->GetMark())
- pUnoCrsr->Exchange();
- pUnoCrsr->DeleteMark();
- }
- break;
- case RES_TXTATR_CJK_RUBY:
- if(pAttr->GetEnd())
- {
- lcl_InsertRubyPortion(
- rPortionArr, pUnoCrsr, rParent, pAttr, FALSE);
- ePortionType = PORTION_TEXT;
- }
- break;
- default:
- DBG_ERROR("was fuer ein Attribut?");
- }
-
- }
- nStartIndex++;
- }
-
- if(!bAttrFound)
- {
- // search for attribute changes behind the current cursor position
- // break up at frames, bookmarks, redlines
-
- nStartIndex = 0;
- nNextStart = 0;
- while(nStartIndex < pHints->GetStartCount() &&
- nCurrentIndex >= (nNextStart = (*pHints->GetStart(nStartIndex)->GetStart())))
- nStartIndex++;
-
- sal_uInt16 nEndIndex = 0;
- sal_uInt16 nNextEnd = 0;
- while(nEndIndex < pHints->GetEndCount() &&
- nCurrentIndex >= (nNextEnd = (*pHints->GetEnd(nEndIndex)->GetAnyEnd())))
- nEndIndex++;
- //nMovePos legt die neue EndPosition fest
- sal_uInt16 nMovePos = nNextStart > nCurrentIndex && nNextStart < nNextEnd ? nNextStart : nNextEnd;
- if (nMovePos <= nCurrentIndex)
- nMovePos = pUnoCrsr->GetCntntNode()->Len();
-
- if(nEndPos > 0 && nMovePos > nEndPos)
- nMovePos = (USHORT)nEndPos;
-
- if(aBkmArr.Count() && aBkmArr.GetObject(0)->nIndex < nMovePos)
- {
- DBG_ASSERT(aBkmArr.GetObject(0)->nIndex > nCurrentIndex,
- "forgotten bookmark(s)");
- nMovePos = aBkmArr.GetObject(0)->nIndex;
- }
- // break up portions for redlines
- if (aRedArr.Count() && aRedArr.GetObject(0)->GetIndexPos() < nMovePos)
- {
- nMovePos = aRedArr.GetObject(0)->GetIndexPos();
- }
- // break up if the destination is behind a frame
- if(nFirstFrameIndex != STRING_MAXLEN && nMovePos > nFirstFrameIndex)
- nMovePos = nFirstFrameIndex;
-
- if(nMovePos > nCurrentIndex)
-// pUnoCrsr->Right(nMovePos - nCurrentIndex);
- pUnoCrsr->GetPoint()->nContent = nMovePos;
- else
- {
- // ensure proper exit: move to paragraph end
- // (this should not be necessary any more; we assert it only
- // happens when the above would move to the end of the
- // paragraph anyway)
- DBG_ASSERT(nMovePos == pUnoCrsr->GetCntntNode()->Len()||
- (nEndPos > 0 && nMovePos == nEndPos),
- "may only happen at paragraph end");
- pUnoCrsr->MovePara(fnParaCurr, fnParaEnd);
- }
- }
- return xRef;
-}
-//-----------------------------------------------------------------------------
-void lcl_FillBookmarkArray(SwDoc& rDoc,SwUnoCrsr& rUnoCrsr, SwXBookmarkPortionArr& rBkmArr )
-{
- const SwBookmarks& rMarks = rDoc.GetBookmarks();
- sal_uInt16 nArrLen = rMarks.Count();
- if ( nArrLen > 0 )
- {
- const SwNodeIndex nOwnNode = rUnoCrsr.GetPoint()->nNode;
- //search for all bookmarks that start or end in this paragraph
- for( sal_uInt16 n = 0; n < nArrLen; ++n )
- {
- SwBookmark* pMark = rMarks.GetObject( n );
- if( !pMark->IsBookMark() )
- continue;
-
- const SwPosition& rPos1 = pMark->GetPos();
- const SwPosition* pPos2 = pMark->GetOtherPos();
- BOOL bBackward = pPos2 ? rPos1 > *pPos2: FALSE;
- if(rPos1.nNode == nOwnNode)
- {
- BYTE nType = bBackward ? BKM_TYPE_END : BKM_TYPE_START;
- if(!pPos2)
- {
- nType = BKM_TYPE_START_END;
- }
- SwXBookmarkPortion_ImplPtr pBkmPtr = new SwXBookmarkPortion_Impl(
- SwXBookmarks::GetObject( *pMark, &rDoc ), nType, rPos1.nContent.GetIndex() );
-
- rBkmArr.Insert(pBkmPtr);
-
- }
- if(pPos2 && pPos2->nNode == nOwnNode)
- {
- BYTE nType = bBackward ? BKM_TYPE_START : BKM_TYPE_END;
- SwXBookmarkPortion_ImplPtr pBkmPtr = new SwXBookmarkPortion_Impl(
- SwXBookmarks::GetObject( *pMark, &rDoc ), nType, pPos2->nContent.GetIndex() );
- rBkmArr.Insert(pBkmPtr);
- }
- }
- }
-}
-//-----------------------------------------------------------------------------
-void lcl_FillRedlineArray(SwDoc& rDoc,SwUnoCrsr& rUnoCrsr, SwXRedlinePortionArr& rRedArr )
-{
- const SwRedlineTbl& rRedTbl = rDoc.GetRedlineTbl();
- USHORT nRedTblCount = rRedTbl.Count();
-
- if ( nRedTblCount > 0 )
- {
- const SwPosition* pStart = rUnoCrsr.GetPoint();
- const SwNodeIndex nOwnNode = pStart->nNode;
- SwRedlineMode eRedMode = rDoc.GetRedlineMode();
-
- for(USHORT nRed = 0; nRed < nRedTblCount; nRed++)
- {
- const SwRedline* pRedline = rRedTbl[nRed];
- const SwPosition* pRedStart = pRedline->Start();
- const SwNodeIndex nRedNode = pRedStart->nNode;
- SwRedlineType nType = pRedline->GetType();
- if(nOwnNode == nRedNode)
- {
- SwXRedlinePortion_ImplPtr pToInsert = new SwXRedlinePortion_Impl(pRedline, TRUE);
- rRedArr.Insert(pToInsert);
- }
- if(pRedline->HasMark() && pRedline->End()->nNode == nOwnNode)
- {
- SwXRedlinePortion_ImplPtr pToInsert = new SwXRedlinePortion_Impl(pRedline, FALSE);
- rRedArr.Insert(pToInsert);
- }
- }
- }
-}
-/* -----------------------------19.12.00 12:25--------------------------------
-
- ---------------------------------------------------------------------------*/
-void lcl_ExportRedline(
- SwXRedlinePortionArr& rRedlineArr, ULONG nIndex,
- SwUnoCrsr* pUnoCrsr, Reference<XText> & rParent, XTextRangeArr& rPortionArr)
-{
- SwXRedlinePortion_ImplPtr pPtr;
- while(rRedlineArr.Count() && 0 != (pPtr = rRedlineArr.GetObject(0)) &&
- ((pPtr->bStart && (nIndex == pPtr->pRedline->Start()->nContent.GetIndex()))||
- (!pPtr->bStart && (nIndex == pPtr->pRedline->End()->nContent.GetIndex()))))
- {
- SwXTextPortion* pPortion;
- rPortionArr.Insert(
- new Reference< XTextRange >(pPortion = new SwXRedlinePortion(
- pPtr->pRedline, *pUnoCrsr, rParent,
- pPtr->bStart)),
- rPortionArr.Count());
- rRedlineArr.Remove((USHORT)0);
- delete pPtr;
- }
-}
-/* -----------------------------19.12.00 13:09--------------------------------
-
- ---------------------------------------------------------------------------*/
-void lcl_ExportBkmAndRedline(
- SwXBookmarkPortionArr& rBkmArr,
- SwXRedlinePortionArr& rRedlineArr, ULONG nIndex,
- SwUnoCrsr* pUnoCrsr, Reference<XText> & rParent, XTextRangeArr& rPortionArr)
-{
- if (rBkmArr.Count())
- lcl_ExportBookmark(rBkmArr, nIndex, pUnoCrsr, rParent, rPortionArr);
-
- if (rRedlineArr.Count())
- lcl_ExportRedline(rRedlineArr, nIndex, pUnoCrsr, rParent, rPortionArr);
-}
-//-----------------------------------------------------------------------------
-sal_Int32 lcl_GetNextIndex(SwXBookmarkPortionArr& rBkmArr, SwXRedlinePortionArr& rRedlineArr)
-{
- sal_Int32 nRet = -1;
- if(rBkmArr.Count())
- {
- SwXBookmarkPortion_ImplPtr pPtr = rBkmArr.GetObject(0);
- nRet = pPtr->nIndex;
- }
- if(rRedlineArr.Count())
- {
- SwXRedlinePortion_ImplPtr pPtr = rRedlineArr.GetObject(0);
- USHORT nTmp = pPtr->GetIndexPos();
- if(nRet < 0 || nTmp < nRet)
- nRet = nTmp;
- }
- return nRet;
-};
-//-----------------------------------------------------------------------------
-void SwXTextPortionEnumeration::CreatePortions()
-{
- SwUnoCrsr* pUnoCrsr = GetCrsr();
- // set the start if a selection should be exported
- if(nStartPos > 0 && pUnoCrsr->Start()->nContent.GetIndex() != nStartPos)
- {
- if(pUnoCrsr->HasMark())
- pUnoCrsr->DeleteMark();
- DBG_ASSERT(pUnoCrsr->Start()->nNode.GetNode().GetTxtNode() &&
- nStartPos <= pUnoCrsr->Start()->nNode.GetNode().GetTxtNode()->GetTxt().Len(),
- "Incorrect start position" );
- pUnoCrsr->Right((xub_StrLen)nStartPos,CRSR_SKIP_CHARS);
- }
- if(pUnoCrsr /*&& !bAtEnd*/)
- {
- SwXBookmarkPortionArr aBkmArr;
- SwXRedlinePortionArr aRedArr;
-
- SwDoc* pDoc = pUnoCrsr->GetDoc();
- lcl_FillRedlineArray(*pDoc, *pUnoCrsr, aRedArr);
- lcl_FillBookmarkArray(*pDoc, *pUnoCrsr, aBkmArr );
-#if OSL_DEBUG_LEVEL > 1
- for(long i_debug = 0; i_debug <aBkmArr.Count(); i_debug++)
- {
- SwXBookmarkPortion_ImplPtr pPtr = aBkmArr.GetObject(i_debug);
- }
-
-#endif
- while(!bAtEnd)
- {
- if(pUnoCrsr->HasMark())
- {
- if(*pUnoCrsr->GetPoint() < *pUnoCrsr->GetMark())
- pUnoCrsr->Exchange();
- pUnoCrsr->DeleteMark();
- }
- SwNode* pNode = pUnoCrsr->GetNode();
- SwCntntNode *pCNd = pNode->GetCntntNode();
- if(!bFirstPortion && pCNd &&
- pUnoCrsr->GetPoint()->nContent == pCNd->Len())
- {
- //hier sollte man nie ankommen!
- bAtEnd = sal_True;
- }
- else
- {
- if(ND_TEXTNODE == pNode->GetNodeType())
- {
- SwTxtNode* pTxtNode = (SwTxtNode*)pNode;
- SwpHints* pHints = pTxtNode->GetpSwpHints();
- SwTextPortionType ePortionType = PORTION_TEXT;
- xub_StrLen nCurrentIndex = pUnoCrsr->GetPoint()->nContent.GetIndex();
- xub_StrLen nFirstFrameIndex = STRING_MAXLEN;
- uno::Reference< XTextRange > xRef;
- if(!pCNd->Len())
- {
- lcl_ExportBkmAndRedline(aBkmArr, aRedArr, 0, pUnoCrsr, xParent, aPortionArr);
- // the paragraph is empty
- xRef = new SwXTextPortion(pUnoCrsr, xParent, ePortionType);
- // are there any frames?
- while(aFrameArr.Count())
- {
- SwDepend* pCurDepend = aFrameArr.GetObject(0);
- if(pCurDepend->GetRegisteredIn())
- {
- //the previously created portion has to be inserted here
- aPortionArr.Insert(new Reference<XTextRange>(xRef), aPortionArr.Count());
- xRef = new SwXTextPortion(pUnoCrsr, xParent,
- *(SwFrmFmt*)pCurDepend->GetRegisteredIn());
- }
- delete pCurDepend;
- aFrameArr.Remove(0);
- }
- }
- else
- {
- //falls schon Rahmen entsorgt wurden, dann raus hier
- for(sal_uInt16 nFrame = aFrameArr.Count(); nFrame; nFrame--)
- {
- SwDepend* pCurDepend = aFrameArr.GetObject(nFrame - 1);
- if(!pCurDepend->GetRegisteredIn())
- {
- delete pCurDepend;
- aFrameArr.Remove(nFrame - 1);
- }
- }
-
- //zunaechst den ersten Frame im aFrameArr finden (bezogen auf die Position im Absatz)
- SwDepend* pFirstFrameDepend = 0;
- //Eintraege im aFrameArr sind sortiert!
- if(aFrameArr.Count())
- {
- SwDepend* pCurDepend = aFrameArr.GetObject(0);
- SwFrmFmt* pFormat = (SwFrmFmt*)pCurDepend->GetRegisteredIn();
- const SwFmtAnchor& rAnchor = pFormat->GetAnchor();
- const SwPosition* pAnchorPos = rAnchor.GetCntntAnchor();
- pFirstFrameDepend = pCurDepend;
- nFirstFrameIndex = pAnchorPos->nContent.GetIndex();
- if(nEndPos > 0 && nFirstFrameIndex >= nEndPos)
- nFirstFrameIndex = USHRT_MAX;
- }
-
- SwXTextCursor::SelectPam(*pUnoCrsr, sal_True);
-
- //ist hier schon ein Rahmen faellig?
- if(nCurrentIndex == nFirstFrameIndex)
- {
- xRef = new SwXTextPortion(pUnoCrsr, xParent,
- *(SwFrmFmt*)pFirstFrameDepend->GetRegisteredIn());
- SwDepend* pCurDepend = aFrameArr.GetObject(0);
- delete pCurDepend;
- aFrameArr.Remove(0);
- }
- }
- if(!xRef.is())
- {
- lcl_ExportBkmAndRedline(aBkmArr, aRedArr, nCurrentIndex, pUnoCrsr, xParent, aPortionArr);
- if(pHints)
- {
- xRef = lcl_ExportHints(pHints,
- aPortionArr,
- pUnoCrsr,
- xParent,
- nCurrentIndex,
- ePortionType,
- nFirstFrameIndex,
- aBkmArr,
- aRedArr,
- nEndPos);
-
- }
- else if(USHRT_MAX != nFirstFrameIndex)
- {
- pUnoCrsr->Right(nFirstFrameIndex - nCurrentIndex,CRSR_SKIP_CHARS);
- }
- else
- {
- sal_Int32 nNextIndex = lcl_GetNextIndex(aBkmArr, aRedArr);
- if(nEndPos > 0 && (nNextIndex > nEndPos || nNextIndex < 0))
- {
- nNextIndex = nEndPos;
- bAtEnd = sal_True;
- }
- if(nNextIndex < 0)
- sal_Bool bMove = pUnoCrsr->MovePara(fnParaCurr, fnParaEnd);
- else
- {
- DBG_ASSERT(nNextIndex > nCurrentIndex, "wrong move index");
- pUnoCrsr->Right(nNextIndex - nCurrentIndex,CRSR_SKIP_CHARS);
- }
- }
- }
- if(!xRef.is() && pUnoCrsr->HasMark() )
- xRef = new SwXTextPortion(pUnoCrsr, xParent, ePortionType);
- if(xRef.is())
- aPortionArr.Insert(new Reference<XTextRange>(xRef), aPortionArr.Count());
- }
- else
- {
- DBG_ERROR("kein TextNode - was nun?");
- }
- }
- if(*pUnoCrsr->GetPoint() < *pUnoCrsr->GetMark())
- pUnoCrsr->Exchange();
-
- // Absatzende ?
- pNode = pUnoCrsr->GetNode();
- pCNd = pNode->GetCntntNode();
- sal_Int32 nLocalEnd = nEndPos > 0 ? nEndPos : pCNd->Len();
- if( pCNd && pUnoCrsr->GetPoint()->nContent == (xub_StrLen)nLocalEnd)
- {
- bAtEnd = sal_True;
- lcl_ExportBkmAndRedline(aBkmArr, aRedArr, nLocalEnd,
- pUnoCrsr, xParent, aPortionArr);
- if(ND_TEXTNODE == pNode->GetNodeType())
- {
- SwTxtNode* pTxtNode = (SwTxtNode*)pNode;
- SwpHints* pHints = pTxtNode->GetpSwpHints();
- if(pHints)
- {
- SwTextPortionType ePortionType = PORTION_TEXT;
- Reference<XTextRange> xRef = lcl_ExportHints(pHints,
- aPortionArr,
- pUnoCrsr,
- xParent,
- nLocalEnd,
- ePortionType,
- STRING_MAXLEN,
- aBkmArr,
- aRedArr,
- nEndPos);
- if(xRef.is())
- aPortionArr.Insert(new Reference<XTextRange>(xRef), aPortionArr.Count());
- }
- }
- while(aFrameArr.Count())
- {
- SwDepend* pCurDepend = aFrameArr.GetObject(0);
- if(pCurDepend->GetRegisteredIn())
- {
- Reference<XTextRange> xRef = new SwXTextPortion(pUnoCrsr, xParent,
- *(SwFrmFmt*)pCurDepend->GetRegisteredIn());
- aPortionArr.Insert(new Reference<XTextRange>(xRef), aPortionArr.Count());
- }
- delete pCurDepend;
- aFrameArr.Remove(0);
- }
-
- }
- }
- }
-}
-/*-- 27.01.99 10:44:45---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-void SwXTextPortionEnumeration::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
-{
- ClientModify(this, pOld, pNew);
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */