diff options
Diffstat (limited to 'sw/source/core/unocore/unoobj.cxx')
-rw-r--r-- | sw/source/core/unocore/unoobj.cxx | 6024 |
1 files changed, 6024 insertions, 0 deletions
diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx new file mode 100644 index 000000000000..8f836c90b044 --- /dev/null +++ b/sw/source/core/unocore/unoobj.cxx @@ -0,0 +1,6024 @@ +/************************************************************************* + * + * $RCSfile: unoobj.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-19 00:08:28 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifdef PRECOMPILED +#include "core_pch.hxx" +#endif + +#pragma hdrstop + + +#ifndef _RTL_USTRBUF_HXX_ +#include <rtl/ustrbuf.hxx> +#endif +#include <swtypes.hxx> +#include <hintids.hxx> +#include <cmdid.h> +#ifndef _HINTS_HXX //autogen +#include <hints.hxx> +#endif +#ifndef _BOOKMRK_HXX //autogen +#include <bookmrk.hxx> +#endif +#ifndef _FRMFMT_HXX //autogen +#include <frmfmt.hxx> +#endif +#ifndef _DOC_HXX //autogen +#include <doc.hxx> +#endif +#ifndef _NDTXT_HXX //autogen +#include <ndtxt.hxx> +#endif +#ifndef _NDNOTXT_HXX //autogen +#include <ndnotxt.hxx> +#endif +#ifndef _UNOCRSR_HXX +#include <unocrsr.hxx> +#endif +#ifndef _SWUNDO_HXX //autogen +#include <swundo.hxx> +#endif +#ifndef _ROOTFRM_HXX //autogen +#include <rootfrm.hxx> +#endif +#ifndef _FLYFRM_HXX //autogen +#include <flyfrm.hxx> +#endif +#ifndef _FTNIDX_HXX //autogen +#include <ftnidx.hxx> +#endif +#ifndef _LINKMGR_HXX +#include <so3/linkmgr.hxx> +#endif +#ifndef _DOCARY_HXX +#include <docary.hxx> +#endif +#ifndef _PARATR_HXX +#include <paratr.hxx> +#endif +#ifndef _URLOBJ_HXX //autogen +#include <tools/urlobj.hxx> +#endif +#include <pam.hxx> +#ifndef _SVARRAY_HXX //autogen +#include <svtools/svarray.hxx> +#endif +#ifndef _CACHESTR_HXX //autogen +#include <tools/cachestr.hxx> +#endif +#ifndef _SHELLIO_HXX //autogen +#include <shellio.hxx> +#endif +#include <swerror.h> +#ifndef _SWTBLFMT_HXX //autogen +#include <swtblfmt.hxx> +#endif +#ifndef _FMTHBSH_HXX +#include <fmthbsh.hxx> +#endif +#ifndef _SWDOCSH_HXX //autogen +#include <docsh.hxx> +#endif +#ifndef _SFXSTYLE_HXX //autogen +#include <svtools/style.hxx> +#endif +#ifndef _DOCSTYLE_HXX //autogen +#include <docstyle.hxx> +#endif +#ifndef _CHARFMT_HXX //autogen +#include <charfmt.hxx> +#endif +#ifndef _TXTFLD_HXX //autogen +#include <txtfld.hxx> +#endif +#ifndef _FMTFLD_HXX //autogen +#include <fmtfld.hxx> +#endif +/*#ifndef _FMTHBSH_HXX //autogen +#include <fmthbsh.hxx> +#endif +*/#ifndef _FMTPDSC_HXX //autogen +#include <fmtpdsc.hxx> +#endif +#ifndef _PAGEDESC_HXX //autogen +#include <pagedesc.hxx> +#endif +#ifndef _POOLFMT_HRC +#include <poolfmt.hrc> +#endif +#ifndef _POOLFMT_HXX +#include <poolfmt.hxx> +#endif +#ifndef _EDIMP_HXX //autogen +#include <edimp.hxx> +#endif +#ifndef _FCHRFMT_HXX //autogen +#include <fchrfmt.hxx> +#endif +#ifndef _CNTFRM_HXX //autogen +#include <cntfrm.hxx> +#endif +#ifndef _PAGEFRM_HXX //autogen +#include <pagefrm.hxx> +#endif +#ifndef _TOX_HXX +#include <tox.hxx> +#endif +#ifndef _SFX_DOCFILT_HACK_HXX //autogen +#include <sfx2/docfilt.hxx> +#endif +#ifndef _SFXDOCFILE_HXX //autogen +#include <sfx2/docfile.hxx> +#endif +#ifndef _SFX_FCONTNR_HXX //autogen +#include <sfx2/fcontnr.hxx> +#endif +#ifndef _FMTRFMRK_HXX //autogen +#include <fmtrfmrk.hxx> +#endif +#ifndef _TXTRFMRK_HXX //autogen +#include <txtrfmrk.hxx> +#endif +#ifndef _UNOCLBCK_HXX +#include <unoclbck.hxx> +#endif +#ifndef _UNOOBJ_HXX +#include <unoobj.hxx> +#endif +#ifndef _UNOMAP_HXX +#include <unomap.hxx> +#endif +#ifndef SW_UNOMID_HXX +#include <unomid.h> +#endif +#ifndef _UNOSETT_HXX +#include <unosett.hxx> +#endif +#ifndef _UNOPRNMS_HXX +#include <unoprnms.hxx> +#endif +#ifndef _UNOTBL_HXX +#include <unotbl.hxx> +#endif +#ifndef _UNODRAW_HXX +#include <unodraw.hxx> +#endif +#ifndef _UNOCOLL_HXX +#include <unocoll.hxx> +#endif +#ifndef _UNOSTYLE_HXX +#include <unostyle.hxx> +#endif +#ifndef _UNOFIELD_HXX +#include <unofield.hxx> +#endif +#ifndef _FMTANCHR_HXX //autogen +#include <fmtanchr.hxx> +#endif +#ifndef _SVX_FLSTITEM_HXX //autogen +#include <svx/flstitem.hxx> +#endif +#ifndef _CTRLTOOL_HXX //autogen +#include <svtools/ctrltool.hxx> +#endif +#ifndef _SFXENUMITEM_HXX +#include <svtools/eitem.hxx> +#endif +#ifndef _FLYPOS_HXX +#include <flypos.hxx> +#endif +#ifndef _TXTFTN_HXX //autogen +#include <txtftn.hxx> +#endif +#ifndef _SECTION_HXX //autogen +#include <section.hxx> +#endif +#ifndef _FMTFTN_HXX //autogen +#include <fmtftn.hxx> +#endif + +#ifndef _COM_SUN_STAR_TEXT_WRAPTEXTMODE_HPP_ +#include <com/sun/star/text/WrapTextMode.hpp> +#endif +#ifndef _COM_SUN_STAR_TEXT_TEXTCONTENTANCHORTYPE_HPP_ +#include <com/sun/star/text/TextContentAnchorType.hpp> +#endif +#ifndef _COM_SUN_STAR_STYLE_PAGESTYLELAYOUT_HPP_ +#include <com/sun/star/style/PageStyleLayout.hpp> +#endif +#ifndef _COM_SUN_STAR_TEXT_XTEXTDOCUMENT_HPP_ +#include <com/sun/star/text/XTextDocument.hpp> +#endif +#ifndef _COM_SUN_STAR_STYLE_XSTYLEFAMILIESSUPPLIER_HPP_ +#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> +#endif +#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_ +#include <com/sun/star/container/XNameContainer.hpp> +#endif +#ifndef _UNOIDX_HXX +#include <unoidx.hxx> +#endif +#ifndef _UNOFRAME_HXX +#include <unoframe.hxx> +#endif +#ifndef _FMTHDFT_HXX //autogen +#include <fmthdft.hxx> +#endif +#ifndef _OSL_MUTEX_HXX_ //autogen +#include <osl/mutex.hxx> +#endif +#ifndef _VOS_MUTEX_HXX_ //autogen +#include <vos/mutex.hxx> +#endif +#ifndef _SV_SVAPP_HXX //autogen +#include <vcl/svapp.hxx> +#endif +#ifndef _FMTFLCNT_HXX //autogen +#include <fmtflcnt.hxx> +#endif +#define _SVSTDARR_USHORTS +#define _SVSTDARR_USHORTSSORT +#include <svtools/svstdarr.hxx> +#ifndef _SVX_BRSHITEM_HXX //autogen +#include <svx/brshitem.hxx> +#endif +#ifndef _SFXSTRITEM_HXX +#include <svtools/stritem.hxx> +#endif +#ifndef _FMTCLDS_HXX //autogen +#include <fmtclds.hxx> +#endif +#ifndef _RTL_UUID_H_ +#include <rtl/uuid.h> +#endif + +//TODO: new Interface & new uno::Exception for protected content +#define EXCEPT_ON_PROTECTION(rUnoCrsr) \ + if((rUnoCrsr).HasReadonlySel()) \ + throw uno::RuntimeException(); + +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::beans; + +using namespace ::rtl; + +//collectn.cxx +BOOL lcl_IsNumeric(const String&); +/**************************************************************************** + static methods +****************************************************************************/ +::com::sun::star::uno::Sequence< sal_Int8 > CreateUnoTunnelId() +{ + static osl::Mutex aCreateMutex; + osl::Guard<osl::Mutex> aGuard( aCreateMutex ); + uno::Sequence< sal_Int8 > aSeq( 16 ); + rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True ); + return aSeq; +} +/**************************************************************************** + Hilfsklassen +****************************************************************************/ +class SwParaSelection +{ + SwUnoCrsr* pUnoCrsr; +public: + SwParaSelection(SwUnoCrsr* pCrsr); + ~SwParaSelection(); +}; + +SwParaSelection::SwParaSelection(SwUnoCrsr* pCrsr) : + pUnoCrsr(pCrsr) +{ + if(pUnoCrsr->HasMark()) + pUnoCrsr->DeleteMark(); + // steht er schon am Anfang? + if(pUnoCrsr->GetPoint()->nContent != 0) + pUnoCrsr->MovePara(fnParaCurr, fnParaStart); + // oder gleichzeitig am Ende? + if(pUnoCrsr->GetPoint()->nContent != pUnoCrsr->GetCntntNode()->Len()) + { + pUnoCrsr->SetMark(); + pUnoCrsr->MovePara(fnParaCurr, fnParaEnd); + } +} + +SwParaSelection::~SwParaSelection() +{ + if(pUnoCrsr->GetPoint()->nContent != 0) + { + pUnoCrsr->DeleteMark(); + pUnoCrsr->MovePara(fnParaCurr, fnParaStart); + } +} +/* -----------------13.05.98 12:15------------------- + * + * --------------------------------------------------*/ +SwUnoInternalPaM::SwUnoInternalPaM(SwDoc& rDoc) : + SwPaM(rDoc.GetNodes()) +{ +} +SwUnoInternalPaM::~SwUnoInternalPaM() +{ + while( GetNext() != this) + { + delete GetNext(); + } +} + +SwUnoInternalPaM& SwUnoInternalPaM::operator=(const SwPaM& rPaM) +{ + const SwPaM* pTmp = &rPaM; + *GetPoint() = *rPaM.GetPoint(); + if(rPaM.HasMark()) + { + SetMark(); + *GetMark() = *rPaM.GetMark(); + } + else + DeleteMark(); + while(&rPaM != (pTmp = (const SwPaM*)pTmp->GetNext())) + { + if(pTmp->HasMark()) + new SwPaM(*pTmp->GetMark(), *pTmp->GetPoint(), this); + else + new SwPaM(*pTmp->GetPoint(), this); + } + return *this; +} +/**************************************************************************** + ActionContext +****************************************************************************/ +UnoActionContext::UnoActionContext(SwDoc* pDc) : + pDoc(pDc) +{ + SwRootFrm* pRootFrm = pDoc->GetRootFrm(); + if(pRootFrm) + pRootFrm->StartAllAction(); +} +/*-----------------04.03.98 11:56------------------- + +--------------------------------------------------*/ +UnoActionContext::~UnoActionContext() +{ + //das Doc kann hier schon entfernt worden sein + if(pDoc) + { + SwRootFrm* pRootFrm = pDoc->GetRootFrm(); + if(pRootFrm) + pRootFrm->EndAllAction(); + } +} + +/**************************************************************************** + ActionRemoveContext +****************************************************************************/ +UnoActionRemoveContext::UnoActionRemoveContext(SwDoc* pDc) : + pDoc(pDc) +{ + SwRootFrm* pRootFrm = pDoc->GetRootFrm(); + if(pRootFrm) + pRootFrm->UnoRemoveAllActions(); +} +/* -----------------07.07.98 12:05------------------- + * + * --------------------------------------------------*/ +UnoActionRemoveContext::~UnoActionRemoveContext() +{ + SwRootFrm* pRootFrm = pDoc->GetRootFrm(); + if(pRootFrm) + pRootFrm->UnoRestoreAllActions(); + +} + +/*-----------------09.03.98 08:29------------------- + +--------------------------------------------------*/ +void SwXTextCursor::SelectPam(SwPaM& rCrsr, sal_Bool bExpand) +{ + if(bExpand) + { + if(!rCrsr.HasMark()) + rCrsr.SetMark(); + } + else if(rCrsr.HasMark()) + rCrsr.DeleteMark(); + +} +/* -----------------11.06.98 14:19------------------- + * + * --------------------------------------------------*/ +sal_Bool lcl_IsEndOfPara(SwPaM& rUnoCrsr) +{ + return rUnoCrsr.GetCntntNode() && + rUnoCrsr.GetPoint()->nContent == rUnoCrsr.GetCntntNode()->Len(); +} + +/* -----------------11.06.98 14:19------------------- + * + * --------------------------------------------------*/ +inline sal_Bool lcl_IsStartOfPara(SwPaM& rUnoCrsr) +{ + return rUnoCrsr.GetPoint()->nContent == 0; +} + +/* -----------------20.05.98 14:59------------------- + * + * --------------------------------------------------*/ +void lcl_Append(sal_Unicode*& pCurrent, const SVBT16* pStr, sal_uInt32 nLen) +{ + for(sal_uInt32 i = 0; i < nLen; i++) + { + sal_uInt16 nVal = SVBT16ToShort( *pStr ); + pStr += 1; + *pCurrent++ = nVal; + } +} + +void SwXTextCursor::getTextFromPam(SwPaM& aCrsr, OUString& rBuffer) +{ + if(!aCrsr.HasMark()) + return; + SvCacheStream aStream(20480); + WriterRef xWrt; + SwIoSystem::GetWriter( C2S(FILTER_TEXT_DLG), xWrt ); + if( xWrt.Is() ) + { + SwWriter aWriter(aStream, aCrsr); + xWrt->bASCII_NoLastLineEnd = sal_True; + SwAsciiOptions aOpt = xWrt->GetAsciiOptions(); + aOpt.SetCharSet( RTL_TEXTENCODING_UNICODE ); + xWrt->SetAsciiOptions( aOpt ); + xWrt->bUCS2_WithStartChar = FALSE; + + if(!IsError( aWriter.Write( xWrt ))) + { + long lLen = aStream.GetSize(); + lLen /= 2; + sal_Unicode* pUnicodeBuffer = new sal_Unicode[lLen], + *pCurrentBuffer = pUnicodeBuffer; + const void* pStr = aStream.GetBuffer(); + if(pStr) + { + lcl_Append(pCurrentBuffer, (SVBT16*)pStr, lLen); + } + else + { + aStream.Seek( 0 ); + aStream.ResetError(); + char *pBuffer = new char[16384]; + long lLocalLen = lLen; + while(lLocalLen > 0) + { + long nRead = aStream.Read( pBuffer, 16384 ); + lcl_Append(pCurrentBuffer, (SVBT16*)pBuffer, nRead / 2); + lLocalLen -= nRead; + } + delete pBuffer; + } + rBuffer = OUString(pUnicodeBuffer, lLen); + delete pUnicodeBuffer; + } + } +} + +/* -----------------21.07.98 11:36------------------- + * + * --------------------------------------------------*/ +void lcl_InsertFile(SwUnoCrsr* pUnoCrsr, + const String& rFileName, + const String& rFilterName, + const String& rFilterOption, + const String& rPassword) +{ + SfxMedium* pMed = 0; + SwDoc* pDoc = pUnoCrsr->GetDoc(); + SwDocShell* pDocSh = pDoc->GetDocShell(); + if(!pDocSh || !rFileName.Len()) + return; + + const SfxFilter* pFilter = 0; + + SfxObjectFactory& rFact = pDocSh->GetFactory(); + const sal_uInt16 nCount = rFact.GetFilterCount(); + if(rFilterName.Len()) + for( sal_uInt16 i = 0; i < nCount; i++ ) + { + const SfxFilter* pFlt = rFact.GetFilter( i ); + if( pFlt->GetName() == rFilterName || + pFlt->GetFilterName() == rFilterName ) + { + pFilter = pFlt; + break; + } + } + if ( !pFilter ) + { + pMed = new SfxMedium(rFileName, STREAM_READ, sal_True, sal_True, 0, 0 ); + SfxFilterMatcher aMatcher( rFact.GetFilterContainer() ); + ErrCode nErr = aMatcher.GuessFilter( *pMed, &pFilter, sal_False ); + if ( nErr || !pFilter) + DELETEZ(pMed); + else + pMed->SetFilter( pFilter ); + } + else + { + pMed = new SfxMedium(rFileName, STREAM_READ, sal_True, sal_True, + pFilter, 0); + if(rFilterOption.Len()) + { + SfxItemSet* pSet = pMed->GetItemSet(); + SfxStringItem aOptionItem(SID_FILE_FILTEROPTIONS, rFilterOption); + pSet->Put(aOptionItem); + } + } + + if( !pMed ) + return; + + SfxObjectShellRef aRef( pDocSh ); + + pDocSh->RegisterTransfer( *pMed ); + pMed->DownLoad(); // ggfs. den DownLoad anstossen + if( aRef.Is() && 1 < aRef->GetRefCount() ) // noch gueltige Ref? + { + SwReader* pRdr; + SfxItemSet* pSet = pMed->GetItemSet(); + pSet->Put(SfxBoolItem(FN_API_CALL, sal_True)); + if(rPassword.Len()) + pSet->Put(SfxStringItem(SID_PASSWORD, rPassword)); + Reader *pRead = pDocSh->StartConvertFrom( *pMed, &pRdr, 0, pUnoCrsr); + if( pRead ) + { + String sTmpBaseURL( INetURLObject::GetBaseURL() ); + INetURLObject::SetBaseURL( pMed->GetName() ); + + UnoActionContext aContext(pDoc); + + if(pUnoCrsr->HasMark()) + pDoc->DeleteAndJoin(*pUnoCrsr); + + SwNodeIndex aSave( pUnoCrsr->GetPoint()->nNode, -1 ); + xub_StrLen nCntnt = pUnoCrsr->GetPoint()->nContent.GetIndex(); + + sal_uInt32 nErrno = pRdr->Read( *pRead ); // und Dokument einfuegen + + if(!nErrno) + { + aSave++; + pUnoCrsr->SetMark(); + pUnoCrsr->GetMark()->nNode = aSave; + + SwCntntNode* pCntNode = aSave.GetNode().GetCntntNode(); + if( !pCntNode ) + nCntnt = 0; + pUnoCrsr->GetMark()->nContent.Assign( pCntNode, nCntnt ); + } + + delete pRdr; + + INetURLObject::SetBaseURL( sTmpBaseURL ); + + // ggfs. alle Verzeichnisse updaten: +/* if( pWrtShell->IsUpdateTOX() ) + { + SfxRequest aReq( *this, FN_UPDATE_TOX ); + Execute( aReq ); + pWrtShell->SetUpdateTOX( sal_False ); // wieder zurueck setzen + }*/ + + } + } + delete pMed; +} +/* -----------------06.07.98 07:33------------------- + * + * --------------------------------------------------*/ +void lcl_setCharStyle(SwDoc* pDoc, const uno::Any aValue, SfxItemSet& rSet) + throw (lang::IllegalArgumentException) +{ + SwDocShell* pDocSh = pDoc->GetDocShell(); + if(pDocSh) + { + OUString uStyle; + aValue >>= uStyle; + String sStyle(SwXStyleFamilies::GetUIName(uStyle, SFX_STYLE_FAMILY_CHAR)); + SwDocStyleSheet* pStyle = + (SwDocStyleSheet*)pDocSh->GetStyleSheetPool()->Find(sStyle, SFX_STYLE_FAMILY_CHAR); + if(pStyle) + { + SwFmtCharFmt aFmt(pStyle->GetCharFmt()); + rSet.Put(aFmt); + } + else + { + throw lang::IllegalArgumentException(); + } + + } +}; +/* -----------------30.06.98 08:46------------------- + * + * --------------------------------------------------*/ +void lcl_SetTxtFmtColl(const uno::Any& rAny, SwPaM& rPaM) + throw (lang::IllegalArgumentException) +{ + SwDoc* pDoc = rPaM.GetDoc(); + SwDocShell* pDocSh = pDoc->GetDocShell(); + if(!pDocSh) + return; + OUString uStyle; + rAny >>= uStyle; + String sStyle(SwXStyleFamilies::GetUIName(uStyle, SFX_STYLE_FAMILY_PARA)); + SwDocStyleSheet* pStyle = + (SwDocStyleSheet*)pDocSh->GetStyleSheetPool()->Find(sStyle, SFX_STYLE_FAMILY_PARA); + if(pStyle) + { + SwTxtFmtColl *pLocal = pStyle->GetCollection(); + UnoActionContext aAction(pDoc); + pDoc->StartUndo( UNDO_START ); + FOREACHUNOPAM_START(&rPaM) + pDoc->SetTxtFmtColl(*PUNOPAM, pLocal); + FOREACHUNOPAM_END() + pDoc->EndUndo( UNDO_END ); + } + else + { + throw lang::IllegalArgumentException(); + } + +} +/* -----------------06.07.98 07:38------------------- + * + * --------------------------------------------------*/ + void lcl_setPageDesc(SwDoc* pDoc, const uno::Any& aValue, SfxItemSet& rSet) + { + if(aValue.getValueType() != ::getCppuType((const OUString*)0)) + return; + SwFmtPageDesc* pNewDesc = 0; + const SfxPoolItem* pItem; + if(SFX_ITEM_SET == rSet.GetItemState( RES_PAGEDESC, sal_True, &pItem ) ) + { + pNewDesc = new SwFmtPageDesc(*((SwFmtPageDesc*)pItem)); + } + if(!pNewDesc) + pNewDesc = new SwFmtPageDesc(); + OUString uDescName; + aValue >>= uDescName; + String sDescName(SwXStyleFamilies::GetUIName(uDescName, SFX_STYLE_FAMILY_PAGE)); + if(!pNewDesc->GetPageDesc() || pNewDesc->GetPageDesc()->GetName() != sDescName) + { + sal_uInt16 nCount = pDoc->GetPageDescCnt(); + sal_Bool bPut = sal_False; + if(sDescName.Len()) + { + SwPageDesc* pPageDesc = ::GetPageDescByName_Impl(*pDoc, sDescName); + if(pPageDesc) + { + pPageDesc->Add( pNewDesc ); + bPut = sal_True; + } + else + { + throw lang::IllegalArgumentException(); + } + } + if(!bPut) + { + rSet.ClearItem(RES_BREAK); + rSet.Put(SwFmtPageDesc()); + } + else + rSet.Put(*pNewDesc); + } + + delete pNewDesc; +} +/* -----------------30.06.98 10:29------------------- + * + * --------------------------------------------------*/ +void lcl_SetNodeNumStart( SwPaM& rCrsr, uno::Any aValue ) +{ + sal_Int16 nTmp; + aValue >>= nTmp; + sal_uInt16 nStt = (nTmp < 0 ? USHRT_MAX : (sal_uInt16)nTmp); + SwDoc* pDoc = rCrsr.GetDoc(); + UnoActionContext aAction(pDoc); + + if( rCrsr.GetNext() != &rCrsr ) // Mehrfachselektion ? + { + pDoc->StartUndo( UNDO_START ); + SwPamRanges aRangeArr( rCrsr ); + SwPaM aPam( *rCrsr.GetPoint() ); + for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n ) + pDoc->SetNodeNumStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), nStt ); + pDoc->EndUndo( UNDO_END ); + } + else + pDoc->SetNodeNumStart( *rCrsr.GetPoint(), nStt ); +} + +/* -----------------30.06.98 10:30------------------- + * + * --------------------------------------------------*/ +sal_Int16 lcl_IsNodeNumStart(SwPaM& rPam, beans::PropertyState& eState) +{ + const SwTxtNode* pTxtNd = rPam.GetNode()->GetTxtNode(); + if( pTxtNd && pTxtNd->GetNum() && pTxtNd->GetNumRule() ) + { + eState = beans::PropertyState_DIRECT_VALUE; + sal_uInt16 nTmp = pTxtNd->GetNum()->GetSetValue(); + return USHRT_MAX == nTmp ? -1 : (sal_Int16)nTmp; + } + eState = beans::PropertyState_DEFAULT_VALUE; + return -1; +} +/* -----------------25.05.98 11:41------------------- + * + * --------------------------------------------------*/ +void lcl_setNumberingProperty(const uno::Any& rValue, SwPaM& rPam) +{ + if(rValue.getValueType() == ::getCppuType((const uno::Reference<container::XIndexReplace>*)0)) + { + uno::Reference< XIndexReplace > * pxNum = (uno::Reference< XIndexReplace > *)rValue.getValue(); + if(!(*pxNum).is()) + return; + SwXNumberingRules* pSwNum = 0; + + uno::Reference<lang::XUnoTunnel> xNumTunnel((*pxNum), uno::UNO_QUERY); + if(xNumTunnel.is()) + { + pSwNum = (SwXNumberingRules*) + xNumTunnel->getSomething( SwXNumberingRules::getUnoTunnelId() ); + } + + if(pSwNum && pSwNum->GetNumRule()) + { + SwDoc* pDoc = rPam.GetDoc(); + SwNumRule aRule(*pSwNum->GetNumRule()); + const String* pNewCharStyles = pSwNum->GetNewCharStyleNames(); + const String* pBulletFontNames = pSwNum->GetBulletFontNames(); + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + SwNumFmt aFmt(aRule.Get( i )); + if( pNewCharStyles[i].Len() && + pNewCharStyles[i] != SwXNumberingRules::GetInvalidStyle() && + (!aFmt.GetCharFmt() || pNewCharStyles[i] != aFmt.GetCharFmt()->GetName())) + { + if(!pNewCharStyles[i].Len()) + aFmt.SetCharFmt(0); + else + { + + // CharStyle besorgen und an der chaos::Rule setzen + sal_uInt16 nChCount = pDoc->GetCharFmts()->Count(); + SwCharFmt* pCharFmt = 0; + for(sal_uInt16 i = 0; i< nChCount; i++) + { + SwCharFmt& rChFmt = *((*(pDoc->GetCharFmts()))[i]);; + if(rChFmt.GetName() == pNewCharStyles[i]) + { + pCharFmt = &rChFmt; + break; + } + } + + if(!pCharFmt) + { + SfxStyleSheetBasePool* pPool = pDoc->GetDocShell()->GetStyleSheetPool(); + SfxStyleSheetBase* pBase; + pBase = pPool->Find(pNewCharStyles[i], SFX_STYLE_FAMILY_CHAR); + // soll das wirklich erzeugt werden? + if(!pBase) + pBase = &pPool->Make(pNewCharStyles[i], SFX_STYLE_FAMILY_PAGE); + pCharFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt(); + } + if(pCharFmt) + aFmt.SetCharFmt(pCharFmt); + } + } + //jetzt nochmal fuer Fonts + if(pBulletFontNames[i] != SwXNumberingRules::GetInvalidStyle() && + ((pBulletFontNames[i].Len() && !aFmt.GetBulletFont()) || + pBulletFontNames[i].Len() && + aFmt.GetBulletFont()->GetName() != pBulletFontNames[i] )) + { + const SvxFontListItem* pFontListItem = + (const SvxFontListItem* )pDoc->GetDocShell() + ->GetItem( SID_ATTR_CHAR_FONTLIST ); + const FontList* pList = pFontListItem->GetFontList(); + + FontInfo aInfo = pList->Get( + pBulletFontNames[i],WEIGHT_NORMAL, ITALIC_NONE); + Font aFont(aInfo); + aFmt.SetBulletFont(&aFont); + } + aRule.Set( i, aFmt ); + } + UnoActionContext aAction(rPam.GetDoc()); + rPam.GetDoc()->SetNumRule( rPam, aRule ); + } + } +} + +/* -----------------17.09.98 09:44------------------- + * + * --------------------------------------------------*/ +sal_Bool lcl_setCrsrPropertyValue(const SfxItemPropertyMap* pMap, + SwPaM& rPam, + SfxItemSet& rSet, + const uno::Any& aValue, + sal_Bool& rPut ) throw (lang::IllegalArgumentException) +{ + sal_Bool bRet = sal_True; + rPut = sal_True; + if(aValue.getValueType() == ::getCppuVoidType()) + bRet = sal_False; + else + { + switch(pMap->nWID) + { + case RES_TXTATR_CHARFMT: + lcl_setCharStyle(rPam.GetDoc(), aValue, rSet); + break; + case FN_UNO_PARA_STYLE : + lcl_SetTxtFmtColl(aValue, rPam); + rPut = sal_False; + break; + case FN_UNO_PAGE_STYLE : + break; + case FN_UNO_NUM_START_VALUE : + lcl_SetNodeNumStart( rPam, aValue ); + break; + case FN_UNO_NUM_LEVEL : + case FN_UNO_IS_NUMBER : + { + SwTxtNode* pTxtNd = rPam.GetNode()->GetTxtNode(); + const SwNumRule* pRule = pTxtNd->GetNumRule(); + // hier wird Multiselektion nicht beruecksichtigt + if( pRule && pTxtNd->GetNum() ) + { + if( FN_UNO_NUM_LEVEL == pMap->nWID) + { + sal_Int16 nLevel; + aValue >>= nLevel; + sal_Int16 nOldLevel = pTxtNd->GetNum()->GetLevel() & ~NO_NUMLEVEL; + if(nLevel < MAXLEVEL && nOldLevel != nLevel) + { + UnoActionContext aAction(rPam.GetDoc()); + sal_Bool bDown = nLevel > nOldLevel; + sal_Int8 nMove = (sal_Int8)(bDown ? nLevel - nOldLevel : nOldLevel - nLevel); + while( nMove-- ) + { + rPam.GetDoc()->NumUpDown( rPam, bDown ); + } + } + } + else + { + BOOL bIsNumber = *(sal_Bool*) aValue.getValue(); + SwNodeNum aNum = *pTxtNd->GetNum(); + sal_Int16 nOldLevel = aNum.GetLevel() & ~NO_NUMLEVEL; + if(!bIsNumber) + nOldLevel |= NO_NUMLEVEL; + aNum.SetLevel(nOldLevel); + pTxtNd->UpdateNum( aNum ); + + } + rPut = sal_False; + } + //PROPERTY_MAYBEVOID! + } + break; + case FN_UNO_NUM_RULES: + lcl_setNumberingProperty(aValue, rPam); + rPut = sal_False; + break; + case RES_PARATR_DROP: + { + if( MID_DROPCAP_CHAR_STYLE_NAME == pMap->nMemberId) + { + if(aValue.getValueType() == ::getCppuType((const OUString*)0)) + { + SwFmtDrop* pDrop = 0; + const SfxPoolItem* pItem; + if(SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_DROP, sal_True, &pItem ) ) + pDrop = new SwFmtDrop(*((SwFmtDrop*)pItem)); + if(!pDrop) + pDrop = new SwFmtDrop(); + OUString uStyle; + aValue >>= uStyle; + String sStyle(SwXStyleFamilies::GetUIName(uStyle, SFX_STYLE_FAMILY_CHAR)); + SwDocStyleSheet* pStyle = + (SwDocStyleSheet*)rPam.GetDoc()->GetDocShell()->GetStyleSheetPool()->Find(sStyle, SFX_STYLE_FAMILY_CHAR); + if(pStyle) + pDrop->SetCharFmt(pStyle->GetCharFmt()); + else + throw lang::IllegalArgumentException(); + rSet.Put(*pDrop); + delete pDrop; + } + else + throw lang::IllegalArgumentException(); + } + else + bRet = sal_False; + } + break; + case RES_PAGEDESC : + if(MID_PAGEDESC_PAGEDESCNAME == pMap->nMemberId ) + { + lcl_setPageDesc(rPam.GetDoc(), aValue, rSet); + break; + } + //hier kein break + default: bRet = sal_False; + } + } +return bRet; +} +/* -----------------30.03.99 10:52------------------- + * spezielle Properties am Cursor zuruecksetzen + * --------------------------------------------------*/ +void lcl_resetCrsrPropertyValue(const SfxItemPropertyMap* pMap, SwPaM& rPam) +{ + SwDoc* pDoc = rPam.GetDoc(); + switch(pMap->nWID) + { + case FN_UNO_PARA_STYLE : +// lcl_SetTxtFmtColl(aValue, pUnoCrsr); + break; + case FN_UNO_PAGE_STYLE : + break; + case FN_UNO_NUM_START_VALUE : + { + UnoActionContext aAction(pDoc); + + if( rPam.GetNext() != &rPam ) // Mehrfachselektion ? + { + pDoc->StartUndo( UNDO_START ); + SwPamRanges aRangeArr( rPam ); + SwPaM aPam( *rPam.GetPoint() ); + for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n ) + pDoc->SetNodeNumStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), 1 ); + pDoc->EndUndo( UNDO_END ); + } + else + pDoc->SetNodeNumStart( *rPam.GetPoint(), 0 ); + } + + break; + case FN_UNO_NUM_LEVEL : + break; + case FN_UNO_NUM_RULES: +// lcl_setNumberingProperty(aValue, pUnoCrsr); + break; + } +} + +/* -----------------30.06.98 08:39------------------- + * + * --------------------------------------------------*/ +SwFmtColl* SwXTextCursor::GetCurTxtFmtColl(SwPaM& rPam, BOOL bConditional) +{ + static const sal_uInt16 nMaxLookup = 255; + SwFmtColl *pFmt = 0; + +// if ( GetCrsrCnt() > nMaxLookup ) +// return 0; + sal_Bool bError = sal_False; + FOREACHUNOPAM_START(&rPam) + + sal_uInt32 nSttNd = PUNOPAM->GetMark()->nNode.GetIndex(), + nEndNd = PUNOPAM->GetPoint()->nNode.GetIndex(); + xub_StrLen nSttCnt = PUNOPAM->GetMark()->nContent.GetIndex(), + nEndCnt = PUNOPAM->GetPoint()->nContent.GetIndex(); + + if( nSttNd > nEndNd || ( nSttNd == nEndNd && nSttCnt > nEndCnt )) + { + sal_uInt32 nTmp = nSttNd; nSttNd = nEndNd; nEndNd = nTmp; + nTmp = nSttCnt; nSttCnt = nEndCnt; nEndCnt = (sal_uInt16)nTmp; + } + + if( nEndNd - nSttNd >= nMaxLookup ) + { + pFmt = 0; + break; + } + + const SwNodes& rNds = rPam.GetDoc()->GetNodes(); + for( sal_uInt32 n = nSttNd; n <= nEndNd; ++n ) + { + const SwTxtNode* pNd = rNds[ n ]->GetTxtNode(); + if( pNd ) + { + SwFmtColl* pNdFmt = bConditional ? pNd->GetFmtColl() + : &pNd->GetAnyFmtColl(); + if( !pFmt ) + pFmt = pNdFmt; + else if( pFmt != pNdFmt ) + { + bError = sal_True; + break; + } + } + } + if(bError) + break; + FOREACHUNOPAM_END() + return bError ? 0 : pFmt; +} +/* -----------------04.07.98 15:15------------------- + * + * --------------------------------------------------*/ +String lcl_GetCurPageStyle(SwPaM& rPaM) +{ + String sRet; + const SwPageFrm* pPage = rPaM.GetCntntNode()->GetFrm()->FindPageFrm(); + if(pPage) + { + sRet = SwXStyleFamilies::GetProgrammaticName( + pPage->GetPageDesc()->GetName(), SFX_STYLE_FAMILY_PAGE); + } + return sRet; +} +/* -----------------25.05.98 11:40------------------- + * + * --------------------------------------------------*/ +uno::Any lcl_getNumberingProperty(SwPaM& rPam, beans::PropertyState& eState) +{ + uno::Any aAny; + const SwNumRule* pNumRule = rPam.GetDoc()->GetCurrNumRule( *rPam.GetPoint() ); + if(pNumRule) + { + uno::Reference< container::XIndexReplace > xNum = new SwXNumberingRules(*pNumRule); + aAny.setValue(&xNum, ::getCppuType((const uno::Reference<container::XIndexReplace>*)0)); + eState = beans::PropertyState_DIRECT_VALUE; + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + return aAny; +} + +/* -----------------16.09.98 12:27------------------- + * Lesen spezieller Properties am Cursor + * --------------------------------------------------*/ +sal_Bool lcl_getCrsrPropertyValue(const SfxItemPropertyMap* pMap + , SwPaM& rPam + , const SfxItemSet& rSet + , uno::Any& rAny + , beans::PropertyState& eState ) +{ + + eState = beans::PropertyState_DIRECT_VALUE; +// PropertyState_DEFAULT_VALUE +// PropertyState_AMBIGUOUS_VALUE + sal_Bool bDone = sal_True; + switch(pMap->nWID) + { + case FN_UNO_PARA_CHAPTER_NUMBERING_LEVEL: + { + SwFmtColl* pFmt = SwXTextCursor::GetCurTxtFmtColl(rPam, FALSE); + sal_Int8 nRet = -1; + if(pFmt && ((SwTxtFmtColl*)pFmt)->GetOutlineLevel() != NO_NUMBERING) + nRet = ((SwTxtFmtColl*)pFmt)->GetOutlineLevel(); + rAny <<= nRet; + } + break; + case FN_UNO_PARA_CONDITIONAL_STYLE_NAME: + case FN_UNO_PARA_STYLE : + { + String sVal; + SwFmtColl* pFmt = SwXTextCursor::GetCurTxtFmtColl(rPam, FN_UNO_PARA_CONDITIONAL_STYLE_NAME == pMap->nWID); + if(pFmt) + sVal = SwXStyleFamilies::GetProgrammaticName(pFmt->GetName(), SFX_STYLE_FAMILY_PARA); + rAny <<= OUString(sVal); + if(!sVal.Len()) + eState = beans::PropertyState_AMBIGUOUS_VALUE; + } + break; + case FN_UNO_PAGE_STYLE : + { + String sVal = lcl_GetCurPageStyle(rPam); + rAny <<= OUString(sVal); + if(!sVal.Len()) + eState = beans::PropertyState_AMBIGUOUS_VALUE; + } + break; + case FN_UNO_NUM_START_VALUE : + { + sal_Int16 nValue = lcl_IsNodeNumStart(rPam, eState); + rAny <<= nValue; + } + break; + case FN_UNO_NUM_LEVEL : + case FN_UNO_IS_NUMBER : + { + const SwTxtNode* pTxtNd = rPam.GetNode()->GetTxtNode(); + const SwNumRule* pRule = pTxtNd->GetNumRule(); + // hier wird Multiselektion nicht beruecksichtigt + if( pRule && pTxtNd->GetNum() ) + { + if(pMap->nWID == FN_UNO_NUM_LEVEL) + rAny <<= (sal_Int16)(pTxtNd->GetNum()->GetLevel()&~NO_NUMLEVEL); + else + { + BOOL bIsNumber = 0 == (pTxtNd->GetNum()->GetLevel() & NO_NUMLEVEL); + rAny.setValue(&bIsNumber, ::getBooleanCppuType()); + } + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + //PROPERTY_MAYBEVOID! + } + break; + case FN_UNO_NUM_RULES : + rAny = lcl_getNumberingProperty(rPam, eState); + break; + case RES_PAGEDESC : + if(MID_PAGEDESC_PAGEDESCNAME == pMap->nMemberId ) + { + const SfxPoolItem* pItem; + if(SFX_ITEM_SET == rSet.GetItemState( RES_PAGEDESC, sal_True, &pItem ) ) + { + const SwPageDesc* pDesc = ((const SwFmtPageDesc*)pItem)->GetPageDesc(); + if(pDesc) + rAny <<= OUString( + SwXStyleFamilies::GetProgrammaticName(pDesc->GetName(), SFX_STYLE_FAMILY_PAGE)); + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + else + bDone = sal_False; + break; + case FN_UNO_DOCUMENT_INDEX_MARK: + { + SwTxtAttr* pTxtAttr = rPam.GetNode()->GetTxtNode()->GetTxtAttr( + rPam.GetPoint()->nContent, RES_TXTATR_TOXMARK); + if(pTxtAttr) + { + const SwTOXMark& rMark = pTxtAttr->GetTOXMark(); + uno::Reference< XDocumentIndexMark > xRef = SwXDocumentIndexMark::GetObject( + (SwTOXType*)rMark.GetTOXType(), &rMark, rPam.GetDoc()); + rAny.setValue(&xRef, ::getCppuType((uno::Reference<XDocumentIndex>*)0)); + } + else + //auch hier - nicht zu unterscheiden + eState = beans::PropertyState_DEFAULT_VALUE; + } + break; + case FN_UNO_DOCUMENT_INDEX: + { + const SwTOXBase* pBase = rPam.GetDoc()->GetCurTOX( + *rPam.Start() ); + if( pBase ) + { + uno::Reference< XDocumentIndex > aRef = new SwXDocumentIndex( + (const SwTOXBaseSection*)pBase, rPam.GetDoc() ); + DBG_ERROR("kein Test auf mehrfache Erzeugung!") + rAny.setValue(&aRef, ::getCppuType((uno::Reference<XDocumentIndex>*)0)); + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + break; + case FN_UNO_TEXT_FIELD: + { + const SwPosition *pPos = rPam.Start(); + const SwTxtNode *pTxtNd = + rPam.GetDoc()->GetNodes()[pPos->nNode.GetIndex()]->GetTxtNode(); + SwTxtAttr* pTxtAttr = + pTxtNd ? pTxtNd->GetTxtAttr(pPos->nContent, RES_TXTATR_FIELD) + : 0; + if(pTxtAttr) + { + + const SwFmtFld& rFld = pTxtAttr->GetFld(); + SwClientIter aIter(*rFld.GetFld()->GetTyp()); + SwXTextField* pFld = 0; + SwXTextField* pTemp = (SwXTextField*)aIter.First(TYPE(SwXTextField)); + while(pTemp && !pFld) + { + if(pTemp->GetFldFmt() == &rFld) + pFld = pTemp; + pTemp = (SwXTextField*)aIter.Next(); + } + if(!pFld) + pFld = new SwXTextField( rFld, rPam.GetDoc()); + uno::Reference< XTextField > xRet = pFld; + rAny.setValue(&xRet, ::getCppuType((uno::Reference<XTextField>*)0)); + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + break; +/* laesst sich nicht feststellen +* case FN_UNO_BOOKMARK: + { + if() + { + uno::Reference< XBookmark > xBkm = SwXBookmarks::GetObject(rBkm); + rAny.set(&xBkm, ::getCppuType((const XBookmark*)0)()); + } + } + break;*/ + case FN_UNO_TEXT_TABLE: + case FN_UNO_CELL: + { + SwStartNode* pSttNode = rPam.GetNode()->FindStartNode(); + SwStartNodeType eType = pSttNode->GetStartNodeType(); + if(SwTableBoxStartNode == eType) + { + const SwTableNode* pTblNode = pSttNode->FindTableNode(); + SwFrmFmt* pTableFmt = (SwFrmFmt*)pTblNode->GetTable().GetFrmFmt(); + SwTable& rTable = ((SwTableNode*)pSttNode)->GetTable(); + if(FN_UNO_TEXT_TABLE == pMap->nWID) + { + uno::Reference< XTextTable > xTable = SwXTextTables::GetObject(*pTableFmt); + rAny.setValue(&xTable, ::getCppuType((uno::Reference<XTextTable>*)0)); + } + else + { + SwTableBox* pBox = pSttNode->GetTblBox(); + uno::Reference< table::XCell > xCell = SwXCell::CreateXCell(pTableFmt, pBox); + rAny.setValue(&xCell, ::getCppuType((uno::Reference<table::XCell>*)0)); + } + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + break; + case FN_UNO_TEXT_FRAME: + { + SwStartNode* pSttNode = rPam.GetNode()->FindStartNode(); + SwStartNodeType eType = pSttNode->GetStartNodeType(); + + SwFrmFmt* pFmt; + if(eType == SwFlyStartNode && 0 != (pFmt = pSttNode->GetFlyFmt())) + { + uno::Reference< XTextFrame > xFrm = (SwXTextFrame*) SwXFrames::GetObject(*pFmt, FLYCNTTYPE_FRM); + rAny.setValue(&xFrm, ::getCppuType((uno::Reference<XTextFrame>*)0)); + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + break; + case FN_UNO_TEXT_SECTION: + { + SwSection* pSect = rPam.GetDoc()->GetCurrSection(*rPam.GetPoint()); + if(pSect) + { + uno::Reference< XTextSection > xSect = SwXTextSections::GetObject( *pSect->GetFmt() ); + rAny.setValue(&xSect, ::getCppuType((uno::Reference<XTextSection>*)0) ); + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + break; + case FN_UNO_ENDNOTE: + case FN_UNO_FOOTNOTE: + { + SwTxtAttr* pTxtAttr = rPam.GetNode()->GetTxtNode()-> + GetTxtAttr(rPam.GetPoint()->nContent, RES_TXTATR_FTN); + if(pTxtAttr) + { + const SwFmtFtn& rFtn = pTxtAttr->GetFtn(); + if(rFtn.IsEndNote() == (FN_UNO_ENDNOTE == pMap->nWID)) + { + uno::Reference< XFootnote > xFoot = new SwXFootnote(rPam.GetDoc(), rFtn); + rAny.setValue(&xFoot, ::getCppuType((uno::Reference<XFootnote>*)0)); + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + break; + case FN_UNO_REFERENCE_MARK: + { + SwTxtAttr* pTxtAttr = rPam.GetNode()->GetTxtNode()-> + GetTxtAttr(rPam.GetPoint()->nContent, RES_TXTATR_REFMARK); + if(pTxtAttr) + { + const SwFmtRefMark& rRef = pTxtAttr->GetRefMark(); + uno::Reference< XTextContent > xRef = SwXReferenceMarks::GetObject( rPam.GetDoc(), &rRef ); + rAny.setValue(&xRef, ::getCppuType((uno::Reference<XTextContent>*)0)); + } + else + eState = beans::PropertyState_DEFAULT_VALUE; + } + break; + case RES_TXTATR_CHARFMT: + // kein break hier! + default: bDone = sal_False; + } + return bDone; +} + +/* -----------------26.06.98 16:20------------------- + * Hilfsfunktion fuer PageDesc + * --------------------------------------------------*/ + SwPageDesc* GetPageDescByName_Impl(SwDoc& rDoc, const String& rName) + { + SwPageDesc* pRet = 0; + sal_uInt16 nDCount = rDoc.GetPageDescCnt(); + for( sal_uInt16 i = 0; i < nDCount; i++ ) + { + SwPageDesc* pDsc = &rDoc._GetPageDesc( i ); + if(pDsc->GetName() == rName) + { + pRet = pDsc; + break; + } + } + if(!pRet) + { + for(i = RC_POOLPAGEDESC_BEGIN; i <= STR_POOLPAGE_ENDNOTE; ++i) + { + const String aFmtName(SW_RES(i)); + if(aFmtName == rName) + { + pRet = rDoc.GetPageDescFromPool( RES_POOLPAGE_BEGIN + i - RC_POOLPAGEDESC_BEGIN ); + break; + } + } + } + + return pRet; + } +/****************************************************************************** + ****************************************************************************** + ****************************************************************************** + * Taskforce ONE51 + ******************************************************************************/ +/* -----------------24.02.99 14:18------------------- + * Der StartNode muss in einem existierenden Header/Footen liegen + * --------------------------------------------------*/ +sal_Bool lcl_IsStarNodeInFormat(sal_Bool bHeader, SwStartNode* pSttNode, + const SwFrmFmt* pFrmFmt, SwFrmFmt*& rpFormat) +{ + sal_Bool bRet = sal_False; + const SfxItemSet& rSet = pFrmFmt->GetAttrSet(); + const SfxPoolItem* pItem; + SwFrmFmt* pHeadFootFmt; + if(SFX_ITEM_SET == rSet.GetItemState(bHeader ? RES_HEADER : RES_FOOTER, sal_True, &pItem) && + 0 != (pHeadFootFmt = bHeader ? + ((SwFmtHeader*)pItem)->GetHeaderFmt() : + ((SwFmtFooter*)pItem)->GetFooterFmt())) + { + const SwFmtCntnt& rFlyCntnt = pHeadFootFmt->GetCntnt(); + const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode(); + const SwStartNode* pCurSttNode = rNode.FindSttNodeByType( + bHeader ? SwHeaderStartNode : SwFooterStartNode); + if(pCurSttNode && pCurSttNode == pSttNode) + { + bRet = sal_True; + rpFormat = pHeadFootFmt; + } + } + return bRet; +} + +/* -----------------03.11.98 15:58------------------- + * + * --------------------------------------------------*/ +uno::Reference< XTextRange > CreateTextRangeFromPosition(SwDoc* pDoc, + const SwPosition& rPos, const SwPosition* pMark) +{ + uno::Reference< XTextRange > aRet; + SwUnoCrsr* pNewCrsr = pDoc->CreateUnoCrsr(rPos, sal_False); + if(pMark) + { + pNewCrsr->SetMark(); + *pNewCrsr->GetMark() = *pMark; + } + uno::Reference< XText > xParentText; + //jetzt besorgen wir uns mal den Parent: + SwStartNode* pSttNode = rPos.nNode.GetNode().FindStartNode(); + while(pSttNode && pSttNode->IsSectionNode()) + { + pSttNode = pSttNode->FindStartNode(); + } + SwStartNodeType eType = pSttNode->GetStartNodeType(); + switch(eType) + { + case SwTableBoxStartNode: + { + const SwTableNode* pTblNode = pSttNode->FindTableNode(); + SwFrmFmt* pTableFmt = (SwFrmFmt*)pTblNode->GetTable().GetFrmFmt(); + SwTableBox* pBox = pSttNode->GetTblBox(); + + if( pBox ) + aRet = new SwXTextRange(*pTableFmt, *pBox, *pNewCrsr); + else + aRet = new SwXTextRange(*pTableFmt, *pSttNode, *pNewCrsr); + } + break; + case SwFlyStartNode: + { + SwFrmFmt* pFmt; + if(0 != (pFmt = pSttNode->GetFlyFmt())) + { + aRet = new SwXTextRange(*pFmt, *pNewCrsr); + + } + } + break; + case SwHeaderStartNode: + case SwFooterStartNode: + { + sal_Bool bHeader = SwHeaderStartNode == eType; + sal_uInt16 nPDescCount = pDoc->GetPageDescCnt(); + for(sal_uInt16 i = 0; i < nPDescCount; i++) + { + const SwPageDesc& rDesc = pDoc->GetPageDesc( i ); + const SwFrmFmt* pFrmFmtMaster = &rDesc.GetMaster(); + const SwFrmFmt* pFrmFmtLeft = &rDesc.GetLeft(); + + SwFrmFmt* pHeadFootFmt = 0; + if(!lcl_IsStarNodeInFormat(bHeader, pSttNode, pFrmFmtMaster, pHeadFootFmt)) + lcl_IsStarNodeInFormat(bHeader, pSttNode, pFrmFmtLeft, pHeadFootFmt); + + if(pHeadFootFmt) + { + SwXHeadFootText* pxHdFt = (SwXHeadFootText*)SwClientIter( *pHeadFootFmt ). + First( TYPE( SwXHeadFootText )); + xParentText = pxHdFt; + if(!pxHdFt) + xParentText = new SwXHeadFootText(*pHeadFootFmt, bHeader); + break; + } + } + } + break; + case SwFootnoteStartNode: + { + sal_uInt16 n, nFtnCnt = pDoc->GetFtnIdxs().Count(); + SwTxtFtn* pTxtFtn; + uno::Reference< XFootnote > xRef; + for( n = 0; n < nFtnCnt; ++n ) + { + pTxtFtn = pDoc->GetFtnIdxs()[ n ]; + const SwFmtFtn& rFtn = pTxtFtn->GetFtn(); + const SwTxtFtn* pTxtFtn = rFtn.GetTxtFtn(); +#ifdef DEBUG + const SwStartNode* pTmpSttNode = pTxtFtn->GetStartNode()->GetNode(). + FindSttNodeByType(SwFootnoteStartNode); +#endif + + if(pSttNode == pTxtFtn->GetStartNode()->GetNode(). + FindSttNodeByType(SwFootnoteStartNode)) + { + aRet = new SwXFootnote(pDoc, rFtn); + break; + } + } + } + break; + default: + { + // dann ist es der Body-Text + uno::Reference<frame::XModel> xModel = pDoc->GetDocShell()->GetBaseModel(); + uno::Reference< XTextDocument > xDoc( + xModel, uno::UNO_QUERY); + xParentText = xDoc->getText(); + } + } + if(!aRet.is()) + aRet = new SwXTextRange(*pNewCrsr, xParentText); + return aRet; +} +/****************************************************************** + * SwXTextCursor + ******************************************************************/ +/*-----------------24.03.98 14:49------------------- + +--------------------------------------------------*/ +uno::Reference< uno::XInterface > SwXTextCursor_NewInstance_Impl() +{ + return (cppu::OWeakObject*)new SwXTextCursor(); +}; +/*-- 09.12.98 14:19:19--------------------------------------------------- + + -----------------------------------------------------------------------*/ +OUString SwXTextCursor::getImplementationName(void) throw( RuntimeException ) +{ + return C2U("SwXTextCursor"); +} +/*-- 09.12.98 14:19:19--------------------------------------------------- + + -----------------------------------------------------------------------*/ +BOOL SwXTextCursor::supportsService(const OUString& rServiceName) throw( RuntimeException ) +{ + String sServiceName(rServiceName); + return sServiceName.EqualsAscii("com.sun.star.text.TextCursor") || + sServiceName.EqualsAscii("com.sun.star.style.CharacterProperties")|| + sServiceName.EqualsAscii("com.sun.star.style.ParagraphProperties"); +} +/*-- 09.12.98 14:19:19--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Sequence< OUString > SwXTextCursor::getSupportedServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(3); + OUString* pArray = aRet.getArray(); + pArray[0] = C2U("com.sun.star.text.TextCursor"); + pArray[1] = C2U("com.sun.star.style.CharacterProperties"); + pArray[2] = C2U("com.sun.star.style.ParagraphProperties"); + return aRet; +} +/*-- 09.12.98 14:19:19--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextCursor::SwXTextCursor(uno::Reference< XText > xParent, const SwPosition& rPos, + CursorType eSet, SwDoc* pDoc, const SwPosition* pMark) : + aLstnrCntnr(( util::XSortable*)this), + xParentText(xParent), + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + pLastSortOptions(0), + eType(eSet) +{ + SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(rPos, sal_False); + if(pMark) + { + pUnoCrsr->SetMark(); + *pUnoCrsr->GetMark() = *pMark; + } + pUnoCrsr->Add(this); +} +/*-- 09.12.98 14:19:19--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextCursor::SwXTextCursor(SwXText* pParent) : + xParentText(pParent), + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + pLastSortOptions(0), + eType(CURSOR_INVALID), + aLstnrCntnr( (util::XSortable*)this) +{ + +} +/* -----------------04.03.99 09:02------------------- + * + * --------------------------------------------------*/ +SwXTextCursor::SwXTextCursor(uno::Reference< XText > xParent, + SwUnoCrsr* pSourceCrsr, CursorType eSet) : + aLstnrCntnr( (util::XSortable*)this), + xParentText(xParent), + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + pLastSortOptions(0), + eType(eSet) +{ + SwUnoCrsr* pUnoCrsr = pSourceCrsr->GetDoc()->CreateUnoCrsr(*pSourceCrsr->GetPoint(), sal_False); + if(pSourceCrsr->HasMark()) + { + pUnoCrsr->SetMark(); + *pUnoCrsr->GetMark() = *pSourceCrsr->GetMark(); + } + pUnoCrsr->Add(this); +} + +/*-- 09.12.98 14:19:20--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextCursor::~SwXTextCursor() +{ + SwUnoCrsr* pUnoCrsr = GetCrsr(); + delete pUnoCrsr; + delete pLastSortOptions; +} +/*-- 09.12.98 14:19:18--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::DeleteAndInsert(const String& rText) +{ + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + // Start/EndAction + SwDoc* pDoc = pUnoCrsr->GetDoc(); + UnoActionContext aAction(pDoc); + xub_StrLen nTxtLen = rText.Len(); + pDoc->StartUndo(UNDO_INSERT); + SwCursor *_pStartCrsr = pUnoCrsr; + do + { + if(_pStartCrsr->HasMark()) + { + pDoc->DeleteAndJoin(*_pStartCrsr); + } + if(nTxtLen) + { + //OPT: GetSystemCharSet + if( !pDoc->Insert(*_pStartCrsr, rText) ) + ASSERT( sal_False, "Doc->Insert(Str) failed." ); + SwXTextCursor::SelectPam(*pUnoCrsr, sal_True); + _pStartCrsr->Left(rText.Len()); + } + } while( (_pStartCrsr=(SwCursor*)_pStartCrsr->GetNext()) != pUnoCrsr ); + pDoc->EndUndo(UNDO_INSERT); + } +} +/* -----------------------------10.03.00 18:02-------------------------------- + + ---------------------------------------------------------------------------*/ +const uno::Sequence< sal_Int8 > & SwXTextCursor::getUnoTunnelId() +{ + static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId(); + return aSeq; +} +/* -----------------------------10.03.00 18:04-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Int64 SAL_CALL SwXTextCursor::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; +} + +/*-- 09.12.98 14:18:12--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::collapseToStart(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + if(*pUnoCrsr->GetPoint() < *pUnoCrsr->GetMark()) + pUnoCrsr->Exchange(); + if(pUnoCrsr->HasMark()) + pUnoCrsr->DeleteMark(); + } + else + { + throw uno::RuntimeException(); + } +} +/*-- 09.12.98 14:18:14--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::collapseToEnd(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + if(pUnoCrsr->HasMark()) + { + if(*pUnoCrsr->GetPoint() < *pUnoCrsr->GetMark()) + pUnoCrsr->Exchange(); + pUnoCrsr->DeleteMark(); + } + } + else + { + throw uno::RuntimeException(); + } +} +/*-- 09.12.98 14:18:41--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::isCollapsed(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_True; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr && pUnoCrsr->GetMark()) + { + bRet = (*pUnoCrsr->GetPoint() == *pUnoCrsr->GetMark()); + } + return bRet; +} +/*-- 09.12.98 14:18:42--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::goLeft(sal_Int16 nCount, sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + bRet = pUnoCrsr->Left( nCount); + } + else + { + throw uno::RuntimeException(); + } + return bRet; +} +/*-- 09.12.98 14:18:42--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::goRight(sal_Int16 nCount, sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + bRet = pUnoCrsr->Right(nCount); + } + else + { + throw uno::RuntimeException(); + } + return bRet; +} +/*-- 09.12.98 14:18:43--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::gotoStart(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + if(eType == CURSOR_BODY) + { + pUnoCrsr->Move( fnMoveBackward, fnGoDoc ); + //check, that the cursor is not in a table + SwTableNode* pTblNode = pUnoCrsr->GetNode()->FindTableNode(); + SwCntntNode* pCont = 0; + while( pTblNode ) + { + pUnoCrsr->GetPoint()->nNode = *pTblNode->EndOfSectionNode(); + pCont = GetDoc()->GetNodes().GoNext(&pUnoCrsr->GetPoint()->nNode); + pTblNode = pCont->FindTableNode(); + } + if(pCont) + pUnoCrsr->GetPoint()->nContent.Assign(pCont, 0); + const SwStartNode* pTmp = pUnoCrsr->GetNode()->FindStartNode(); + if(pTmp->IsSectionNode()) + { + SwSectionNode* pSectionStartNode = (SwSectionNode*)pTmp; + if(pSectionStartNode->GetSection().IsHiddenFlag()) + { + pCont = GetDoc()->GetNodes().GoNextSection( + &pUnoCrsr->GetPoint()->nNode, sal_True, sal_False); + if(pCont) + pUnoCrsr->GetPoint()->nContent.Assign(pCont, 0); + } + } + } + else if(eType == CURSOR_FRAME || + eType == CURSOR_TBLTEXT || + eType == CURSOR_HEADER || + eType == CURSOR_FOOTER || + eType == CURSOR_FOOTNOTE) + { + pUnoCrsr->MoveSection( fnSectionCurr, fnSectionStart); + } + else + DBG_WARNING("not implemented") + ; + } + else + { + throw uno::RuntimeException(); + } +} +/*-- 09.12.98 14:18:43--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::gotoEnd(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + if(eType == CURSOR_BODY) + pUnoCrsr->Move( fnMoveForward, fnGoDoc ); + else if(eType == CURSOR_FRAME || + eType == CURSOR_TBLTEXT || + eType == CURSOR_HEADER || + eType == CURSOR_FOOTER || + eType == CURSOR_FOOTNOTE) + { + pUnoCrsr->MoveSection( fnSectionCurr, fnSectionEnd); + } + else + DBG_WARNING("not implemented"); + ; + } + else + { + throw uno::RuntimeException(); + } +} +/* -----------------05.03.99 07:27------------------- + * + * --------------------------------------------------*/ +void SwXTextCursor::gotoRange(const uno::Reference< XTextRange > & xRange, sal_Bool bExpand ) + throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pOwnCursor = GetCrsr(); + if(!pOwnCursor || !xRange.is()) + { + throw uno::RuntimeException(); + } + + uno::Reference<lang::XUnoTunnel> xRangeTunnel( xRange, uno::UNO_QUERY); + SwXTextRange* pRange = 0; + SwXTextCursor* pCursor = 0; + if(xRangeTunnel.is()) + { + pRange = (SwXTextRange*)xRangeTunnel->getSomething( + SwXTextRange::getUnoTunnelId()); + pCursor = (SwXTextCursor*)xRangeTunnel->getSomething( + SwXTextCursor::getUnoTunnelId()); + } + + SwStartNodeType eSearchNodeType = SwNormalStartNode; + switch(eType) + { + case CURSOR_FRAME: eSearchNodeType = SwFlyStartNode; break; + case CURSOR_TBLTEXT: eSearchNodeType = SwTableBoxStartNode; break; + case CURSOR_FOOTNOTE: eSearchNodeType = SwFootnoteStartNode; break; + case CURSOR_HEADER: eSearchNodeType = SwHeaderStartNode; break; + case CURSOR_FOOTER: eSearchNodeType = SwFooterStartNode; break; + //case CURSOR_INVALID: + //case CURSOR_BODY: + } + const SwStartNode* pOwnStartNode = pOwnCursor->GetNode()-> + FindSttNodeByType(eSearchNodeType); + + const SwNode* pSrcNode = 0; + if(pCursor && pCursor->GetCrsr()) + { + pSrcNode = pCursor->GetCrsr()->GetNode(); + } + else if(pRange && pRange->GetBookmark()) + { + SwBookmark* pBkm = pRange->GetBookmark(); + pSrcNode = &pBkm->GetPos().nNode.GetNode(); + } + const SwStartNode* pTmp = pSrcNode ? pSrcNode->FindSttNodeByType(eSearchNodeType) : 0; + + //SectionNodes ueberspringen + while(pTmp && pTmp->IsSectionNode()) + { + pTmp = pTmp->FindStartNode(); + } + if(pOwnStartNode != pTmp) + { + throw uno::RuntimeException(); + } + + //jetzt muss die Selektion erweitert werden + if(bExpand) + { + // der Cursor soll alles einschliessen, was bisher von ihm und dem uebergebenen + // Range eingeschlossen wurde + SwPosition aOwnLeft(*pOwnCursor->GetPoint()); + SwPosition aOwnRight(pOwnCursor->HasMark() ? *pOwnCursor->GetMark() : aOwnLeft); + if(aOwnRight < aOwnLeft) + { + SwPosition aTmp = aOwnLeft; + aOwnLeft = aOwnRight; + aOwnRight = aTmp; + } + SwPosition* pParamLeft; + SwPosition* pParamRight; + if(pCursor) + { + const SwUnoCrsr* pTmp = pCursor->GetCrsr(); + pParamLeft = new SwPosition(*pTmp->GetPoint()); + pParamRight = new SwPosition(pTmp->HasMark() ? *pTmp->GetMark() : *pParamLeft); + } + else + { + SwBookmark* pBkm = pRange->GetBookmark(); + pParamLeft = new SwPosition(pBkm->GetPos()); + pParamRight = new SwPosition(pBkm->GetOtherPos() ? *pBkm->GetOtherPos() : *pParamLeft); + } + if(*pParamRight < *pParamLeft) + { + SwPosition* pTmp = pParamLeft; + pParamLeft = pParamRight; + pParamRight = pTmp; + } + // jetzt sind vier SwPositions da, zwei davon werden gebraucht, also welche? + if(aOwnRight < *pParamRight) + *pOwnCursor->GetPoint() = aOwnRight; + else + *pOwnCursor->GetPoint() = *pParamRight; + pOwnCursor->SetMark(); + if(aOwnLeft < *pParamLeft) + *pOwnCursor->GetMark() = *pParamLeft; + else + *pOwnCursor->GetMark() = aOwnLeft; + delete pParamLeft; + delete pParamRight; + } + else + { + //der Cursor soll dem uebergebenen Range entsprechen + if(pCursor) + { + const SwUnoCrsr* pTmp = pCursor->GetCrsr(); + *pOwnCursor->GetPoint() = *pTmp->GetPoint(); + if(pTmp->HasMark()) + { + pOwnCursor->SetMark(); + *pOwnCursor->GetMark() = *pTmp->GetMark(); + } + else + pOwnCursor->DeleteMark(); + } + else + { + SwBookmark* pBkm = pRange->GetBookmark(); + *pOwnCursor->GetPoint() = pBkm->GetPos(); + if(pBkm->GetOtherPos()) + { + pOwnCursor->SetMark(); + *pOwnCursor->GetMark() = *pBkm->GetOtherPos(); + } + else + pOwnCursor->DeleteMark(); + } + } +} + +/*-- 09.12.98 14:18:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::isStartOfWord(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + bRet = pUnoCrsr->IsStartWord(); + } + else + { + throw uno::RuntimeException(); + } + return bRet; +} +/*-- 09.12.98 14:18:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::isEndOfWord(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + bRet = pUnoCrsr->IsEndWord(); + } + else + { + throw uno::RuntimeException(); + } + return bRet; +} +/*-- 09.12.98 14:18:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoNextWord(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + //Probleme gibt's noch mit einem Absatzanfang, an dem kein Wort beginnt. + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + //Absatzende? + if(pUnoCrsr->GetCntntNode() && + pUnoCrsr->GetPoint()->nContent == pUnoCrsr->GetCntntNode()->Len()) + bRet = pUnoCrsr->Right(); + else + { + bRet = pUnoCrsr->GoNextWord(); + //if there is no next word within the current paragraph try to go to the start of the next paragraph + if(!bRet) + bRet = pUnoCrsr->MovePara(fnParaNext, fnParaStart); + } + } + else + { + throw uno::RuntimeException(); + } + return bRet; +} +/*-- 09.12.98 14:18:45--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoPreviousWord(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + // hier machen Leerzeichen am Absatzanfang Probleme + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + //Absatzanfang ? + if(pUnoCrsr->GetPoint()->nContent == 0) + bRet = pUnoCrsr->Left(); + else + { + bRet = pUnoCrsr->GoPrevWord(); + if(pUnoCrsr->GetPoint()->nContent == 0) + pUnoCrsr->Left(); + } + } + else + { + throw uno::RuntimeException(); + } + return bRet; +} +/*-- 09.12.98 14:18:45--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoEndOfWord(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + if(!pUnoCrsr->IsEndWord()) + { + bRet = pUnoCrsr->GoEndWord(); + } + } + else + { + throw uno::RuntimeException(); + } + return bRet; +} +/*-- 09.12.98 14:18:46--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoStartOfWord(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + sal_Bool bRet = FALSE; + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + if(!pUnoCrsr->IsStartWord()) + { + bRet = pUnoCrsr->GoStartWord(); + } + } + else + { + throw uno::RuntimeException(); + } + return bRet; +} +/*-- 09.12.98 14:18:46--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::isStartOfSentence(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + // Absatzanfang? + bRet = pUnoCrsr->GetPoint()->nContent == 0; + // mitMarkierung ->kein Satzanfang + if(!bRet && !pUnoCrsr->HasMark()) + { + SwCursor aCrsr(*pUnoCrsr->GetPoint()); + aCrsr.LeftRight(sal_True, 1); + aCrsr.SetMark(); + if(aCrsr.LeftRight(sal_True, 1)) + { + SwTxtNode* pTxtNd = aCrsr.GetNode()->GetTxtNode(); + if( pTxtNd ) + { + xub_StrLen nStt = aCrsr.Start()->nContent.GetIndex(); + String aTxt = pTxtNd->GetExpandTxt( nStt, + aCrsr.End()->nContent.GetIndex() - nStt ); + char cChar = aTxt.GetChar(0); + switch(cChar) + { + case ';': + case '.': + case ':': + case '!': + case '?': + bRet = sal_True; + break; + } + } + } + } + } + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::isEndOfSentence(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + //Absatzende? + bRet = pUnoCrsr->GetCntntNode() && + pUnoCrsr->GetPoint()->nContent == pUnoCrsr->GetCntntNode()->Len(); + // mitMarkierung ->kein Satzende + if(!bRet && !pUnoCrsr->HasMark()) + { + SwCursor aCrsr(*pUnoCrsr->GetPoint()); + aCrsr.SetMark(); + if(aCrsr.LeftRight(sal_True, 1)) + { + SwTxtNode* pTxtNd = aCrsr.GetNode()->GetTxtNode(); + if( pTxtNd ) + { + xub_StrLen nStt = aCrsr.Start()->nContent.GetIndex(); + String aTxt = pTxtNd->GetExpandTxt( nStt, + aCrsr.End()->nContent.GetIndex() - nStt ); + char cChar = aTxt.GetChar(0); + switch(cChar) + { + case ';': + case '.': + case ':': + case '!': + case '?': + bRet = sal_True; + break; + } + } + } + } + } + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoNextSentence(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + bRet = pUnoCrsr->GoSentence(SwCursor::NEXT_SENT); + if(!bRet) + bRet = pUnoCrsr->MovePara(fnParaNext, fnParaStart); + } + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoPreviousSentence(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + bRet = pUnoCrsr->GoSentence(SwCursor::PREV_SENT); + if(!bRet) + { + if(0 != (bRet = pUnoCrsr->MovePara(fnParaPrev, fnParaStart))) + { + pUnoCrsr->MovePara(fnParaCurr, fnParaEnd); + //at the end of a paragraph move to the sentence end again + // + pUnoCrsr->GoSentence(SwCursor::PREV_SENT); + } + } + } + else + throw uno::RuntimeException(); + return bRet; +} +/* -----------------15.10.99 08:24------------------- + + --------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoStartOfSentence(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + // if we're at the para start then we wont move + // but bRet is also true if GoSentence failed but + // the start of the sentence is reached + bRet = lcl_IsStartOfPara(*pUnoCrsr) + || pUnoCrsr->GoSentence(SwCursor::START_SENT) || + lcl_IsStartOfPara(*pUnoCrsr); + } + else + throw uno::RuntimeException(); + return bRet; +} +/* -----------------15.10.99 08:24------------------- + + --------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoEndOfSentence(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + // bRet is true if GoSentence() succeeded or if the + // MovePara() succeeded while the end of the para is + // not reached already + sal_Bool bAlreadyParaEnd = lcl_IsEndOfPara(*pUnoCrsr); + bRet = !bAlreadyParaEnd && + (pUnoCrsr->GoSentence(SwCursor::END_SENT) || + pUnoCrsr->MovePara(fnParaCurr, fnParaEnd)); + + } + else + throw uno::RuntimeException(); + return bRet; +} + +/*-- 09.12.98 14:18:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::isStartOfParagraph(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + bRet = lcl_IsStartOfPara(*pUnoCrsr); + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::isEndOfParagraph(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + bRet = lcl_IsEndOfPara(*pUnoCrsr); + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoStartOfParagraph(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr ) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + bRet = lcl_IsStartOfPara(*pUnoCrsr); + if(!bRet) + bRet = pUnoCrsr->MovePara(fnParaCurr, fnParaStart); + } + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoEndOfParagraph(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + bRet = lcl_IsEndOfPara(*pUnoCrsr); + if(!bRet) + pUnoCrsr->MovePara(fnParaCurr, fnParaEnd); + } + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoNextParagraph(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + bRet = pUnoCrsr->MovePara(fnParaNext, fnParaStart); + } + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextCursor::gotoPreviousParagraph(sal_Bool Expand) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SwXTextCursor::SelectPam(*pUnoCrsr, Expand); + bRet = pUnoCrsr->MovePara(fnParaPrev, fnParaStart); + } + else + throw uno::RuntimeException(); + return bRet; +} +/*-- 09.12.98 14:18:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XText > SwXTextCursor::getText(void) throw( uno::RuntimeException ) +{ + return xParentText; +} +/*-- 09.12.98 14:18:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XTextRange > SwXTextCursor::getStart(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextRange > xRet; + SwUnoCrsr* pUnoCrsr = ((SwXTextCursor*)this)->GetCrsr(); + if( pUnoCrsr) + { + SwPaM aPam(*pUnoCrsr->Start()); + uno::Reference< XText > xParent = getText(); + xRet = new SwXTextRange(aPam, xParent); + } + else + throw uno::RuntimeException(); + return xRet; +} +/*-- 09.12.98 14:18:51--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XTextRange > SwXTextCursor::getEnd(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextRange > xRet; + SwUnoCrsr* pUnoCrsr = ((SwXTextCursor*)this)->GetCrsr(); + if( pUnoCrsr) + { + SwPaM aPam(*pUnoCrsr->End()); + uno::Reference< XText > xParent = getText(); + xRet = new SwXTextRange(aPam, xParent); + } + else + throw uno::RuntimeException(); + return xRet; +} +/*-- 09.12.98 14:18:51--------------------------------------------------- + + -----------------------------------------------------------------------*/ +OUString SwXTextCursor::getString(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + OUString aTxt; + SwUnoCrsr* pUnoCrsr = ((SwXTextCursor*)this)->GetCrsr(); + if( pUnoCrsr) + { +/* if( pUnoCrsr->GetPoint()->nNode.GetIndex() == + pUnoCrsr->GetMark()->nNode.GetIndex() ) + { + SwTxtNode* pTxtNd = pUnoCrsr->GetNode()->GetTxtNode(); + if( pTxtNd ) + { + sal_uInt16 nStt = pUnoCrsr->Start()->nContent.GetIndex(); + aTxt = pTxtNd->GetExpandTxt( nStt, + pUnoCrsr->End()->nContent.GetIndex() - nStt ); + } + } + else +*/ { + //Text ueber mehrere Absaetze + SwXTextCursor::getTextFromPam(*pUnoCrsr, aTxt); + } + } + else + throw uno::RuntimeException(); + return aTxt; +} +/*-- 09.12.98 14:18:52--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::setString(const OUString& aString) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(!pUnoCrsr) + throw uno::RuntimeException(); + + EXCEPT_ON_PROTECTION(*pUnoCrsr) + + DeleteAndInsert(aString); +} +/* -----------------------------03.05.00 12:56-------------------------------- + + ---------------------------------------------------------------------------*/ +Any SwXTextCursor::GetPropertyValue( + SwPaM& rPaM, const SfxItemPropertySet& rPropSet, const OUString& rPropertyName) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + Any aAny; + SfxItemSet aSet(rPaM.GetDoc()->GetAttrPool(), + RES_CHRATR_BEGIN, RES_PARATR_NUMRULE, + RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER, + RES_FILL_ORDER, RES_FRMATR_END -1, + 0L); + SwXTextCursor::GetCrsrAttr(rPaM, aSet); + + String aPropertyName(rPropertyName); + const SfxItemPropertyMap* pMap = SfxItemPropertyMap::GetByName( + rPropSet.getPropertyMap(), rPropertyName); + BOOL bDone = FALSE; + if(pMap) + { + PropertyState eTemp; + bDone = lcl_getCrsrPropertyValue(pMap, rPaM, aSet, aAny, eTemp ); + if(!bDone) + aAny = rPropSet.getPropertyValue(aPropertyName, aSet); + } + else + throw UnknownPropertyException(); + return aAny; +} +/* -----------------------------03.05.00 12:57-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwXTextCursor::SetPropertyValue( + SwPaM& rPaM, const SfxItemPropertySet& rPropSet, const OUString& rPropertyName, const Any& aValue) + throw (UnknownPropertyException, PropertyVetoException, + IllegalArgumentException, WrappedTargetException, RuntimeException) +{ + Any aAny; + EXCEPT_ON_PROTECTION(rPaM) + + SwDoc* pDoc = rPaM.GetDoc(); + const SfxItemPropertyMap* pMap = SfxItemPropertyMap::GetByName( + rPropSet.getPropertyMap(), rPropertyName); + if(pMap) + { + SfxItemSet rSet(pDoc->GetAttrPool(), + pMap->nWID, pMap->nWID); + SwXTextCursor::GetCrsrAttr(rPaM, rSet); + BOOL bDef = FALSE; + BOOL bPut; + if(!lcl_setCrsrPropertyValue(pMap, rPaM, rSet, aValue, bPut )) + rPropSet.setPropertyValue(rPropertyName, aValue, rSet); + if(bPut) + SwXTextCursor::SetCrsrAttr(rPaM, rSet); + } + else + throw UnknownPropertyException(); +} +/* -----------------------------03.05.00 13:16-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< PropertyState > SwXTextCursor::GetPropertyStates( + SwPaM& rPaM, SfxItemPropertySet& rPropSet, + const Sequence< OUString >& PropertyNames) + throw(UnknownPropertyException, RuntimeException) +{ + const OUString* pNames = PropertyNames.getConstArray(); + Sequence< PropertyState > aRet(PropertyNames.getLength()); + PropertyState* pStates = aRet.getArray(); + for(INT32 i = 0; i < PropertyNames.getLength(); i++) + pStates[i] = GetPropertyState(rPaM, rPropSet, pNames[i]); + return aRet; +} +/* -----------------------------03.05.00 13:17-------------------------------- + + ---------------------------------------------------------------------------*/ +PropertyState SwXTextCursor::GetPropertyState( + SwPaM& rPaM, SfxItemPropertySet& rPropSet, const OUString& rPropertyName) + throw(UnknownPropertyException, RuntimeException) +{ + PropertyState eRet = PropertyState_DEFAULT_VALUE; + SfxItemSet aSet(rPaM.GetDoc()->GetAttrPool(), + RES_CHRATR_BEGIN, RES_PARATR_NUMRULE, + RES_FILL_ORDER, RES_FRMATR_END -1, + 0L); + SwXTextCursor::GetCrsrAttr(rPaM, aSet, FALSE); + String aPropertyName(rPropertyName); + const SfxItemPropertyMap* pMap = SfxItemPropertyMap::GetByName( + rPropSet.getPropertyMap(), rPropertyName); + + if(pMap) + { + Any aAny; + BOOL bDone = lcl_getCrsrPropertyValue(pMap, rPaM, aSet, aAny, eRet ); + if(!bDone) + eRet = rPropSet.getPropertyState(aPropertyName, aSet); + //try again to find out if a value has been inherited + if(beans::PropertyState_DIRECT_VALUE == eRet) + { + SfxItemSet aDirectSet(rPaM.GetDoc()->GetAttrPool(), + RES_CHRATR_BEGIN, RES_PARATR_NUMRULE, + RES_FILL_ORDER, RES_FRMATR_END -1, + 0L); + SwXTextCursor::GetCrsrAttr(rPaM, aDirectSet, TRUE); + bDone = lcl_getCrsrPropertyValue(pMap, rPaM, aDirectSet, aAny, eRet ); + if(!bDone) + eRet = rPropSet.getPropertyState(aPropertyName, aDirectSet); + } + } + else + throw UnknownPropertyException(); + return eRet; +} +/* -----------------------------03.05.00 13:20-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwXTextCursor::SetPropertyToDefault( + SwPaM& rPaM, const SfxItemPropertySet& rPropSet, + const OUString& rPropertyName) + throw(UnknownPropertyException, RuntimeException) +{ + NAMESPACE_VOS(OGuard) aGuard(Application::GetSolarMutex()); + SwDoc* pDoc = rPaM.GetDoc(); + const SfxItemPropertyMap* pMap = SfxItemPropertyMap::GetByName( + rPropSet.getPropertyMap(), rPropertyName); + if(pMap) + { + if(pMap->nWID < RES_FRMATR_END) + { + SvUShortsSort aWhichIds; + aWhichIds.Insert(pMap->nWID); + if(pMap->nWID < RES_PARATR_BEGIN) + pDoc->ResetAttr(rPaM, TRUE, &aWhichIds); + else + { + //fuer Absatzattribute muss die Selektion jeweils auf + //Absatzgrenzen erweitert werden + SwPosition aStart = *rPaM.Start(); + SwPosition aEnd = *rPaM.End(); + SwUnoCrsr* pTemp = pDoc->CreateUnoCrsr(aStart, FALSE); + if(!lcl_IsStartOfPara(*pTemp)) + { + pTemp->MovePara(fnParaCurr, fnParaStart); + } + pTemp->SetMark(); + *pTemp->GetPoint() = aEnd; + //pTemp->Exchange(); + SwXTextCursor::SelectPam(*pTemp, TRUE); + if(!lcl_IsEndOfPara(*pTemp)) + { + pTemp->MovePara(fnParaCurr, fnParaEnd); + } + pDoc->ResetAttr(*pTemp, TRUE, &aWhichIds); + delete pTemp; + } + } + else + lcl_resetCrsrPropertyValue(pMap, rPaM); + } + else + throw UnknownPropertyException(); +} +/* -----------------------------03.05.00 13:19-------------------------------- + + ---------------------------------------------------------------------------*/ +Any SwXTextCursor::GetPropertyDefault( + SwPaM& rPaM, const SfxItemPropertySet& rPropSet, + const OUString& rPropertyName) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + Any aRet; + SwDoc* pDoc = rPaM.GetDoc(); + const SfxItemPropertyMap* pMap = SfxItemPropertyMap::GetByName( + rPropSet.getPropertyMap(), rPropertyName); + if(pMap) + { + if(pMap->nWID < RES_FRMATR_END) + { + const SfxPoolItem& rDefItem = + pDoc->GetAttrPool().GetDefaultItem(pMap->nWID); + rDefItem.QueryValue(aRet, pMap->nMemberId); + } + } + else + throw UnknownPropertyException(); + return aRet; +} +/*-- 09.12.98 14:18:54--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< beans::XPropertySetInfo > SwXTextCursor::getPropertySetInfo(void) throw( uno::RuntimeException ) +{ + static uno::Reference< beans::XPropertySetInfo > xRef = aPropSet.getPropertySetInfo(); + return xRef; +} +/*-- 09.12.98 14:18:54--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue) + throw( beans::UnknownPropertyException, beans::PropertyVetoException, + lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Any aAny; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SetPropertyValue(*pUnoCrsr, aPropSet, rPropertyName, aValue); + } + else + throw uno::RuntimeException(); + +} +/*-- 09.12.98 14:18:55--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Any SwXTextCursor::getPropertyValue(const OUString& rPropertyName) + throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Any aAny; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + aAny = GetPropertyValue(*pUnoCrsr, aPropSet, rPropertyName); + } + else + throw uno::RuntimeException(); + return aAny; + +} +/*-- 09.12.98 14:18:55--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::addPropertyChangeListener(const OUString& PropertyName, const uno::Reference< beans::XPropertyChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + DBG_WARNING("not implemented") +} +/*-- 09.12.98 14:18:57--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::removePropertyChangeListener(const OUString& PropertyName, const uno::Reference< beans::XPropertyChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + DBG_WARNING("not implemented") +} +/*-- 09.12.98 14:18:57--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::addVetoableChangeListener(const OUString& PropertyName, const uno::Reference< beans::XVetoableChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + DBG_WARNING("not implemented") +} +/*-- 09.12.98 14:18:58--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::removeVetoableChangeListener(const OUString& PropertyName, const uno::Reference< beans::XVetoableChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + DBG_WARNING("not implemented") +} +/*-- 05.03.99 11:36:11--------------------------------------------------- + + -----------------------------------------------------------------------*/ +beans::PropertyState SwXTextCursor::getPropertyState(const OUString& rPropertyName) + throw( beans::UnknownPropertyException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + beans::PropertyState eRet = beans::PropertyState_DEFAULT_VALUE; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + eRet = GetPropertyState(*pUnoCrsr, aPropSet, rPropertyName); + } + else + throw RuntimeException(); + return eRet; +} +/*-- 05.03.99 11:36:11--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Sequence< beans::PropertyState > SwXTextCursor::getPropertyStates( + const uno::Sequence< OUString >& PropertyNames) + throw( beans::UnknownPropertyException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(!pUnoCrsr) + throw RuntimeException(); + return GetPropertyStates(*pUnoCrsr, aPropSet, PropertyNames); +} +/*-- 05.03.99 11:36:12--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::setPropertyToDefault(const OUString& rPropertyName) + throw( beans::UnknownPropertyException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + SetPropertyToDefault(*pUnoCrsr, aPropSet, rPropertyName); + } + else + throw uno::RuntimeException(); +} +/*-- 05.03.99 11:36:12--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Any SwXTextCursor::getPropertyDefault(const OUString& rPropertyName) + throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + uno::Any aRet; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + aRet = GetPropertyDefault(*pUnoCrsr, aPropSet, rPropertyName); + } + else + throw uno::RuntimeException(); + return aRet; +} +/*-- 09.12.98 14:18:58--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::insertDocumentFromURL(const OUString& rURL, + const uno::Sequence< beans::PropertyValue >& aOptions) + throw( lang::IllegalArgumentException, io::IOException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + String sFilterName; + String sFilterOption; + String sPassword; + OUString uFilterName(C2U( UNO_NAME_FILTER_NAME )); + OUString uFilterOption(C2U( UNO_NAME_FILTER_OPTION )); + OUString uPassword(C2U( UNO_NAME_PASSWORD )); + sal_Bool bIllegalArgument = sal_False; + + for ( int n = 0; n < aOptions.getLength(); ++n ) + { + // get Property-Value from options + const beans::PropertyValue &rProp = aOptions.getConstArray()[n]; + uno::Any aValue( rProp.Value ); + + // FilterName-Property? + if ( rProp.Name == uFilterName ) + { + if ( rProp.Value.getValueType() == ::getCppuType((const OUString*)0)) + { + OUString uFilterName; + rProp.Value >>= uFilterName; + sFilterName = String(uFilterName); + } + else if ( rProp.Value.getValueType() != ::getVoidCppuType() ) + bIllegalArgument = sal_True; + } + else if( rProp.Name == uFilterOption ) + { + if ( rProp.Value.getValueType() == ::getCppuType((const OUString*)0)) + { + OUString uFilterOption; + rProp.Value >>= uFilterOption; + sFilterOption = String(uFilterOption) ; + } + else if ( rProp.Value.getValueType() != ::getVoidCppuType() ) + + bIllegalArgument = sal_True; + } + else if( rProp.Name == uPassword ) + { + if ( rProp.Value.getValueType() == ::getCppuType((const OUString*)0)) + { + OUString uPassword; + rProp.Value >>= uPassword; + sPassword = String(uPassword ); + } + else if ( rProp.Value.getValueType() != ::getVoidCppuType() ) + bIllegalArgument = sal_True; + } + else if(rProp.Value.getValueType() != ::getVoidCppuType()) + bIllegalArgument = sal_True; + } + if(bIllegalArgument) + throw lang::IllegalArgumentException(); + lcl_InsertFile(pUnoCrsr, rURL, sFilterName, sFilterOption, sPassword); + } + else + throw uno::RuntimeException(); +} +/*-- 09.12.98 14:18:58--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Sequence< beans::PropertyValue > SwXTextCursor::createSortDescriptor(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Sequence< beans::PropertyValue > aRet(12); + beans::PropertyValue* pArray = aRet.getArray(); + + uno::Any aVal; + sal_Bool bFalse = sal_False; + sal_Bool bTrue = sal_True; + aVal.setValue( &bFalse, ::getCppuBooleanType()); + pArray[0] = beans::PropertyValue(C2U("IsSortInTable"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + String sSpace(String::CreateFromAscii(" ")); + sal_Unicode uSpace = sSpace.GetChar(0); + aVal.setValue( &uSpace, ::getCppuCharType()); + pArray[1] = beans::PropertyValue(C2U("Delimiter"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal.setValue( &bTrue, ::getCppuBooleanType()); + pArray[2] = beans::PropertyValue(C2U("SortColumns"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal <<= (INT16)1; + pArray[3] = beans::PropertyValue(C2U("SortRowOrColumnNo0"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal.setValue( &bTrue, ::getCppuBooleanType()); + pArray[4] = beans::PropertyValue(C2U("IsSortNumeric0"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal.setValue( &bTrue, ::getCppuBooleanType()); + pArray[5] = beans::PropertyValue(C2U("IsSortAscending0"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal <<= (INT16)1; + pArray[6] = beans::PropertyValue(C2U("SortRowOrColumnNo1"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal.setValue( &bTrue, ::getCppuBooleanType()); + pArray[7] = beans::PropertyValue(C2U("IsSortNumeric1"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal.setValue( &bTrue, ::getCppuBooleanType()); + pArray[8] = beans::PropertyValue(C2U("IsSortAscending1"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal <<= (INT16)1; + pArray[9] = beans::PropertyValue(C2U("SortRowOrColumnNo2"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal.setValue( &bTrue, ::getCppuBooleanType()); + pArray[10] = beans::PropertyValue(C2U("IsSortNumeric2"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + + aVal.setValue( &bTrue, ::getCppuBooleanType()); + pArray[11] = beans::PropertyValue(C2U("IsSortAscending2"), -1, aVal, beans::PropertyState_DIRECT_VALUE); + return aRet; +} +/*-- 09.12.98 14:19:00--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::sort(const uno::Sequence< beans::PropertyValue >& rDescriptor) + throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + + const beans::PropertyValue* pProperties = rDescriptor.getConstArray(); + SwSortOptions aSortOpt; + + aSortOpt.bTable = sal_False; + aSortOpt.nDeli = ' '; + aSortOpt.eDirection = SRT_COLUMNS; + + aSortOpt.aKeys; + SwSortKey* pKey1 = new SwSortKey; + pKey1->nColumnId = USHRT_MAX; + pKey1->eSortKeyType = SRT_NUMERIC; + pKey1->eSortOrder = SRT_ASCENDING; + + SwSortKey* pKey2 = new SwSortKey; + pKey2->nColumnId = USHRT_MAX; + pKey2->eSortKeyType = SRT_NUMERIC; + pKey2->eSortOrder = SRT_ASCENDING; + + SwSortKey* pKey3 = new SwSortKey; + pKey3->nColumnId = USHRT_MAX; + pKey3->eSortKeyType = SRT_NUMERIC; + pKey3->eSortOrder = SRT_ASCENDING; + SwSortKey* aKeys[3] = {pKey1, pKey2, pKey3}; + + for( int n = 0; n < rDescriptor.getLength(); ++n ) + { + uno::Any aValue( pProperties[n].Value ); +// String sPropName = pProperties[n].Name; + const OUString& rPropName = pProperties[n].Name; + if( COMPARE_EQUAL == rPropName.compareToAscii("IsSortInTable")) + { + if ( aValue.getValueType() == ::getBooleanCppuType() ) + { + aValue >>= aSortOpt.bTable; + } + else + throw uno::RuntimeException(); + } + else if(COMPARE_EQUAL == rPropName.compareToAscii("Delimiter")) + { + if ( aValue.getValueType() == ::getCppuType((sal_Unicode*)0)) + { + sal_Unicode uChar; + aValue >>= uChar; + aSortOpt.nDeli = uChar; + } + else + throw uno::RuntimeException(); + } + else if(COMPARE_EQUAL == rPropName.compareToAscii("SortColumns")) + { + if ( aValue.getValueType() == ::getBooleanCppuType() ) + { + sal_Bool bTemp; + aValue >>= bTemp; + aSortOpt.eDirection = bTemp ? SRT_COLUMNS : SRT_ROWS; + } + else + throw uno::RuntimeException(); + } + else if(COMPARE_EQUAL == rPropName.compareToAscii("SortRowOrColumnNo", 17) && + rPropName.getLength() == 18 && + (rPropName.getStr()[17] >= '0' && rPropName.getStr()[17] <= '9')) + { + sal_uInt16 nIndex = rPropName.getStr()[17]; + nIndex -= '0'; + sal_Int16 nCol = -1; + if( aValue.getValueType() == ::getCppuType((const sal_Int16*)0) && nIndex < 3) + aValue >>= nCol; + if( nCol >= 0 ) + { + aKeys[nIndex]->nColumnId = nCol; + } + else + throw uno::RuntimeException(); + } + else if(0 == rPropName.search(C2U("IsSortNumeric")) && + rPropName.getLength() == 14 && + (rPropName.getStr()[13] >= '0' && rPropName.getStr()[13] <= '9')) + { + sal_uInt16 nIndex = rPropName.getStr()[13]; + nIndex = nIndex - '0'; + if ( aValue.getValueType() == ::getBooleanCppuType() && nIndex < 3 ) + { + sal_Bool bTemp; + aValue >>= bTemp; + aKeys[nIndex]->eSortKeyType = bTemp ? SRT_NUMERIC : SRT_APLHANUM; + } + else + throw uno::RuntimeException(); + } + else if(0 == rPropName.search(C2U("IsSortAscending")) && rPropName.getLength() == 16 && + lcl_IsNumeric(String(rPropName[(sal_uInt16)15]))) + { + sal_uInt16 nIndex = rPropName.getStr()[13]; + if ( aValue.getValueType() == ::getBooleanCppuType() && nIndex < 3 ) + { + sal_Bool bTemp; + aValue >>= bTemp; + aKeys[nIndex]->eSortOrder = bTemp ? SRT_ASCENDING : SRT_DESCENDING; + } + else + throw uno::RuntimeException(); + } + } + if(pKey1->nColumnId != USHRT_MAX) + aSortOpt.aKeys.C40_INSERT(SwSortKey, pKey1, aSortOpt.aKeys.Count()); + if(pKey2->nColumnId != USHRT_MAX) + aSortOpt.aKeys.C40_INSERT(SwSortKey, pKey2, aSortOpt.aKeys.Count()); + if(pKey3->nColumnId != USHRT_MAX) + aSortOpt.aKeys.C40_INSERT(SwSortKey, pKey3, aSortOpt.aKeys.Count()); + + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr && aSortOpt.aKeys.Count()) + { + if(pUnoCrsr->HasMark()) + { + UnoActionContext aContext( pUnoCrsr->GetDoc() ); + pUnoCrsr->GetDoc()->SortText(*pUnoCrsr, aSortOpt); + } + } + else + throw uno::RuntimeException(); +} +/*-- 10.12.98 11:52:15--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void ClientModify(SwClient* pClient, SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + switch( pOld ? pOld->Which() : 0 ) + { + case RES_REMOVE_UNO_OBJECT: + case RES_OBJECTDYING: + if( (void*)pClient->GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject ) + ((SwModify*)pClient->GetRegisteredIn())->Remove(pClient); + break; + + case RES_FMT_CHG: + // wurden wir an das neue umgehaengt und wird das alte geloscht? + if( ((SwFmtChg*)pNew)->pChangedFmt == pClient->GetRegisteredIn() && + ((SwFmtChg*)pOld)->pChangedFmt->IsFmtInDTOR() ) + ((SwModify*)pClient->GetRegisteredIn())->Remove(pClient); + break; + } +} + +/* -----------------------------03.04.00 09:11-------------------------------- + + ---------------------------------------------------------------------------*/ +Reference< XEnumeration > SAL_CALL SwXTextCursor::createContentEnumeration(const OUString& rServiceName) throw( RuntimeException ) +{ + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if( !pUnoCrsr || 0 != rServiceName.compareToAscii("com.sun.star.text.TextContent") ) + throw RuntimeException(); + + Reference< XEnumeration > xRet = new SwXParaFrameEnumeration(*pUnoCrsr, PARAFRAME_PORTION_TEXTRANGE); + return xRet; +} +/* -----------------------------03.04.00 09:11-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< OUString > SAL_CALL SwXTextCursor::getAvailableServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(1); + OUString* pArray = aRet.getArray(); + pArray[0] = OUString::createFromAscii("com.sun.star.text.TextContent"); + return aRet; +} +/*-- 09.12.98 14:19:00--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + ClientModify(this, pOld, pNew); + if(!GetRegisteredIn()) + aLstnrCntnr.Disposing(); + +} +/*-- 09.12.98 14:19:01--------------------------------------------------- + + -----------------------------------------------------------------------*/ +const SwPaM* SwXTextCursor::GetPaM() const +{ + return GetCrsr() ? GetCrsr() : 0; +} +/*-- 09.12.98 14:19:02--------------------------------------------------- + + -----------------------------------------------------------------------*/ +const SwDoc* SwXTextCursor::GetDoc()const +{ + return GetCrsr() ? GetCrsr()->GetDoc() : 0; +} +/* -----------------22.07.99 13:52------------------- + + --------------------------------------------------*/ +SwDoc* SwXTextCursor::GetDoc() +{ + return GetCrsr() ? GetCrsr()->GetDoc() : 0; +} + +/*-- 09.12.98 14:19:03--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::SetCrsrAttr(SwPaM& rPam, const SfxItemSet& rSet, sal_Bool bTableMode) +{ + sal_uInt16 nFlags = 0;//??? + SwDoc* pDoc = rPam.GetDoc(); + //StartEndAction + UnoActionContext aAction(pDoc); + SwPaM* pCrsr = &rPam; + if( pCrsr->GetNext() != pCrsr ) // Ring von Cursorn + { + pDoc->StartUndo(UNDO_INSATTR); + + SwPaM *_pStartCrsr = &rPam; + do + { + if( _pStartCrsr->HasMark() && ( bTableMode || + *_pStartCrsr->GetPoint() != *_pStartCrsr->GetMark() )) + pDoc->Insert(*_pStartCrsr, rSet, nFlags ); + } while( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) != &rPam ); + + pDoc->EndUndo(UNDO_INSATTR); + } + else + { +// if( !HasSelection() ) +// UpdateAttr(); + pDoc->Insert( *pCrsr, rSet, nFlags ); + } +} +/*-- 09.12.98 14:19:04--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextCursor::GetCrsrAttr(SwPaM& rPam, SfxItemSet& rSet, BOOL bCurrentAttrOnly) +{ +static const sal_uInt16 nMaxLookup = 255; + SfxItemSet aSet( *rSet.GetPool(), rSet.GetRanges() ); + SfxItemSet *pSet = &rSet; + SwPaM *_pStartCrsr = &rPam; + do + { + sal_uInt32 nSttNd = _pStartCrsr->GetMark()->nNode.GetIndex(), + nEndNd = _pStartCrsr->GetPoint()->nNode.GetIndex(); + xub_StrLen nSttCnt = _pStartCrsr->GetMark()->nContent.GetIndex(), + nEndCnt = _pStartCrsr->GetPoint()->nContent.GetIndex(); + + if( nSttNd > nEndNd || ( nSttNd == nEndNd && nSttCnt > nEndCnt )) + { + sal_uInt32 nTmp = nSttNd; nSttNd = nEndNd; nEndNd = nTmp; + nTmp = nSttCnt; nSttCnt = nEndCnt; nEndCnt = (sal_uInt16)nTmp; + } + + if( nEndNd - nSttNd >= nMaxLookup ) + { + rSet.ClearItem(); + rSet.InvalidateAllItems(); + return;// uno::Any(); + } + + // beim 1.Node traegt der Node die Werte in den GetSet ein (Initial) + // alle weiteren Nodes werden zum GetSet zu gemergt + for( sal_uInt32 n = nSttNd; n <= nEndNd; ++n ) + { + SwNode* pNd = rPam.GetDoc()->GetNodes()[ n ]; + switch( pNd->GetNodeType() ) + { + case ND_TEXTNODE: + { + xub_StrLen nStt = n == nSttNd ? nSttCnt : 0, + nEnd = n == nEndNd ? nEndCnt + : ((SwTxtNode*)pNd)->GetTxt().Len(); + ((SwTxtNode*)pNd)->GetAttr( *pSet, nStt, nEnd, bCurrentAttrOnly, !bCurrentAttrOnly ); + } + break; + case ND_GRFNODE: + case ND_OLENODE: + ((SwCntntNode*)pNd)->GetAttr( *pSet ); + break; + + default: + pNd = 0; + } + + if( pNd ) + { + if( pSet != &rSet ) + rSet.MergeValues( aSet ); + + if( aSet.Count() ) + aSet.ClearItem(); + + } + pSet = &aSet; + } + } while( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) != &rPam ); +} +/****************************************************************** + * SwXParagraphEnumeration + ******************************************************************/ +/* -----------------------------06.04.00 16:33-------------------------------- + + ---------------------------------------------------------------------------*/ +OUString SwXParagraphEnumeration::getImplementationName(void) throw( RuntimeException ) +{ + return C2U("SwXParagraphEnumeration"); +} +/* -----------------------------06.04.00 16:33-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwXParagraphEnumeration::supportsService(const OUString& rServiceName) throw( RuntimeException ) +{ + return C2U("com.sun.star.text.ParagraphEnumeration") == rServiceName; +} +/* -----------------------------06.04.00 16:33-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< OUString > SwXParagraphEnumeration::getSupportedServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(1); + OUString* pArray = aRet.getArray(); + pArray[0] = C2U("com.sun.star.text.ParagraphEnumeration"); + return aRet; +} +/*-- 10.12.98 11:52:12--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXParagraphEnumeration::SwXParagraphEnumeration(SwXText* pParent, + SwPosition& rPos, + CursorType eType) : + xParentText(pParent), + bFirstParagraph(sal_True), + eCursorType(eType) +{ + SwUnoCrsr* pUnoCrsr = pParent->GetDoc()->CreateUnoCrsr(rPos, sal_False); + pUnoCrsr->Add(this); +} + +/*-- 10.12.98 11:52:12--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXParagraphEnumeration::SwXParagraphEnumeration(SwXText* pParent, + SwUnoCrsr* pCrsr, + CursorType eType) : + SwClient(pCrsr), + xParentText(pParent), + bFirstParagraph(sal_True), + eCursorType(eType) +{ +} +/*-- 10.12.98 11:52:12--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXParagraphEnumeration::~SwXParagraphEnumeration() +{ + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + delete pUnoCrsr; + +} +/*-- 10.12.98 11:52:13--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXParagraphEnumeration::hasMoreElements(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Bool bRet = sal_False; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + if(bFirstParagraph) + bRet = sal_True; + else + { + SwPosition* pStart = pUnoCrsr->GetPoint(); + SwUnoCrsr* pNewCrsr = pUnoCrsr->GetDoc()->CreateUnoCrsr(*pStart, sal_False); + //man soll hier auch in Tabellen landen duerfen + if(CURSOR_TBLTEXT != eCursorType) + pNewCrsr->SetRemainInSection( sal_False ); + + //was mache ich, wenn ich schon in einer Tabelle stehe? + SwStartNode* pSttNode = pUnoCrsr->GetNode()->FindStartNode(); + SwStartNodeType eType = pSttNode->GetStartNodeType(); + if(CURSOR_TBLTEXT != eCursorType && + SwTableBoxStartNode == eType) + { + // wir haben es mit einer Tabelle zu tun + FASTBOOL bMoved = pNewCrsr->MoveTable( fnTableCurr, fnTableEnd ); + } + bRet = pNewCrsr->MovePara(fnParaNext, fnParaStart); + delete pNewCrsr; + } + } + return bRet; +} +/*-- 10.12.98 11:52:14--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Any SwXParagraphEnumeration::nextElement(void) + throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextContent > aRef; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + XText* pText = xParentText.get(); + sal_Bool bInTable = sal_False; + if(!bFirstParagraph) + { + //man soll hier auch in Tabellen landen duerfen + if(CURSOR_TBLTEXT != eCursorType) + { + pUnoCrsr->SetRemainInSection( sal_False ); + //was mache ich, wenn ich schon in einer Tabelle stehe? + SwTableNode* pTblNode = pUnoCrsr->GetNode()->FindTableNode(); + if(pTblNode) + { + // wir haben es mit einer Tabelle zu tun - also ans Ende + FASTBOOL bMoved = pUnoCrsr->MoveTable( fnTableCurr, fnTableEnd ); + pUnoCrsr->GetPoint()->nNode = pTblNode->EndOfSectionIndex(); + if(!pUnoCrsr->Move(fnMoveForward, fnGoNode)) + { + throw container::NoSuchElementException(); + } + else + bInTable = sal_True; + + } + } + } + + if( bFirstParagraph || bInTable || pUnoCrsr->MovePara(fnParaNext, fnParaStart)) + { + bFirstParagraph = sal_False; + SwPosition* pStart = pUnoCrsr->GetPoint(); + //steht man nun in einer Tabelle, oder in einem einfachen Absatz? + + SwTableNode* pTblNode = pUnoCrsr->GetNode()->FindTableNode(); + if(CURSOR_TBLTEXT != eCursorType && pTblNode) + { + // wir haben es mit einer Tabelle zu tun + SwFrmFmt* pTableFmt = (SwFrmFmt*)pTblNode->GetTable().GetFrmFmt(); + XTextTable* pTable = SwXTextTables::GetObject( *pTableFmt ); + aRef = (XTextContent*)(SwXTextTable*)pTable; + } + else + { + SwUnoCrsr* pNewCrsr = pUnoCrsr->GetDoc()->CreateUnoCrsr(*pStart, sal_False); + aRef = (XTextContent*)new SwXParagraph((SwXText*)pText, pNewCrsr); + } + } + else + throw container::NoSuchElementException(); + + } + else + throw uno::RuntimeException(); + + uno::Any aRet(&aRef, ::getCppuType((uno::Reference<XTextContent>*)0)); + return aRet; +} +void SwXParagraphEnumeration::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + ClientModify(this, pOld, pNew); +} + +/****************************************************************** + * SwXTextRange + ******************************************************************/ +TYPEINIT1(SwXTextRange, SwClient); + +/* -----------------10.12.98 13:19------------------- + * + * --------------------------------------------------*/ +/*uno::Reference< uno::XInterface > SwXTextRange_NewInstance_Impl() +{ + return *new SwXTextRange(); +}; +/* -----------------------------10.03.00 18:02-------------------------------- + + ---------------------------------------------------------------------------*/ +const uno::Sequence< sal_Int8 > & SwXTextRange::getUnoTunnelId() +{ + static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId(); + return aSeq; +} +/* -----------------------------10.03.00 18:02-------------------------------- + + ---------------------------------------------------------------------------*/ + //XUnoTunnel +sal_Int64 SAL_CALL SwXTextRange::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:34-------------------------------- + + ---------------------------------------------------------------------------*/ +OUString SwXTextRange::getImplementationName(void) throw( RuntimeException ) +{ + return C2U("SwXTextRange"); +} +/* -----------------------------06.04.00 16:34-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwXTextRange::supportsService(const OUString& rServiceName) throw( RuntimeException ) +{ + String sServiceName(rServiceName); + return sServiceName.EqualsAscii("com.sun.star.text.TextRange") || + sServiceName.EqualsAscii("com.sun.star.style.CharacterProperties")|| + sServiceName.EqualsAscii("com.sun.star.style.ParagraphProperties"); +} +/* -----------------------------06.04.00 16:34-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< OUString > SwXTextRange::getSupportedServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(2); + OUString* pArray = aRet.getArray(); + pArray[0] = C2U("com.sun.star.text.TextRange"); + pArray[1] = C2U("com.sun.star.style.CharacterProperties"); + pArray[2] = C2U("com.sun.star.style.ParagraphProperties"); + return aRet; +} +/*-- 10.12.98 12:54:42--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRange::SwXTextRange() : + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + pDoc(0), + aObjectDepend(this, 0), + pBox(0), + pBoxStartNode(0), + eRangePosition(RANGE_INVALID) +{ +} +/*-- 10.12.98 12:54:43--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRange::SwXTextRange(SwPaM& rPam, const uno::Reference< XText > & rxParent) : + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + xParentText(rxParent), + aObjectDepend(this, 0), + pDoc(rPam.GetDoc()), + pBox(0), + pBoxStartNode(0), + eRangePosition(RANGE_IN_TEXT) +{ + //Bookmark an der anlegen + _CreateNewBookmark(rPam); +} +/*-- 10.12.98 12:54:43--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRange::SwXTextRange(SwFrmFmt& rFmt, SwPaM& rPam) : + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + aObjectDepend(this, &rFmt), + pDoc(rPam.GetDoc()), + pBox(0), + pBoxStartNode(0), + eRangePosition(RANGE_IN_FRAME) +{ + //Bookmark an der anlegen + _CreateNewBookmark(rPam); +} +/*-- 10.12.98 12:54:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRange::SwXTextRange(SwFrmFmt& rTblFmt, SwTableBox& rTblBox, SwPaM& rPam) : + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + pDoc(rPam.GetDoc()), + aObjectDepend(this, &rTblFmt), + pBox(&rTblBox), + pBoxStartNode(0), + eRangePosition(RANGE_IN_CELL) +{ + //Bookmark an der anlegen + _CreateNewBookmark(rPam); +} +/* -----------------------------09.08.00 16:07-------------------------------- + + ---------------------------------------------------------------------------*/ +SwXTextRange::SwXTextRange(SwFrmFmt& rTblFmt, const SwStartNode& rStartNode, SwPaM& rPam) : + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + pDoc(rPam.GetDoc()), + aObjectDepend(this, &rTblFmt), + pBox(0), + pBoxStartNode(&rStartNode), + eRangePosition(RANGE_IN_CELL) +{ + //Bookmark an der anlegen + _CreateNewBookmark(rPam); +} +/* -----------------19.02.99 11:39------------------- + * + * --------------------------------------------------*/ +SwXTextRange::SwXTextRange(SwFrmFmt& rTblFmt) : + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + aObjectDepend(this, &rTblFmt), + pDoc(rTblFmt.GetDoc()), + pBox(0), + pBoxStartNode(0), + eRangePosition(RANGE_IS_TABLE) +{ +} + +/*-- 10.12.98 12:54:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRange::~SwXTextRange() +{ + if(GetBookmark()) + pDoc->DelBookmark( GetBookmark()->GetName() ); +} +/*-- 10.12.98 12:54:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextRange::_CreateNewBookmark(SwPaM& rPam) +{ + SwBookmark* pBkm = GetBookmark(); + if(pBkm) + pDoc->DelBookmark( pBkm->GetName() ); + KeyCode aCode; + String sBookmarkName(C2S("SwXTextPosition")); + String sShortName; + rPam.GetDoc()->MakeUniqueBookmarkName(sBookmarkName); + + SwBookmark* pMark = pDoc->MakeBookmark(rPam, aCode, + sBookmarkName, sShortName, UNO_BOOKMARK); + pMark->Add(this); +} +/*-- 10.12.98 12:54:45--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextRange::DeleteAndInsert(const String& rText) throw( uno::RuntimeException ) +{ + SwBookmark* pBkm = GetBookmark(); + if(pBkm ) + { + const SwPosition& rPoint = pBkm->GetPos(); + const SwPosition* pMark = pBkm->GetOtherPos(); + SwCursor aNewCrsr( rPoint); + SwDoc* pDoc = aNewCrsr.GetDoc(); + if(pMark) + { + aNewCrsr.SetMark(); + *aNewCrsr.GetMark() = *pMark; + } + EXCEPT_ON_PROTECTION(aNewCrsr) + + UnoActionContext aAction(aNewCrsr.GetDoc()); + pDoc->StartUndo(UNDO_INSERT); + if(aNewCrsr.HasMark()) + pDoc->DeleteAndJoin(aNewCrsr); + + if(rText.Len()) + { + if( !pDoc->Insert(aNewCrsr, rText) ) + ASSERT( sal_False, "Doc->Insert(Str) failed." ); + SwXTextCursor::SelectPam(aNewCrsr, sal_True); + aNewCrsr.Left(rText.Len()); + } + _CreateNewBookmark(aNewCrsr); + pDoc->EndUndo(UNDO_INSERT); + } + +} + +/*-- 10.12.98 12:54:46--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XText > SwXTextRange::getText(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(!xParentText.is()) + { + if(eRangePosition == RANGE_IN_FRAME && + aObjectDepend.GetRegisteredIn()) + { + SwFrmFmt* pFrmFmt = (SwFrmFmt*)aObjectDepend.GetRegisteredIn(); + SwXTextFrame* pxFrm = (SwXTextFrame*)SwClientIter( *pFrmFmt ). + First( TYPE( SwXTextFrame )); + if(pxFrm) + ((SwXTextRange*)this)->xParentText = pxFrm; + else + ((SwXTextRange*)this)->xParentText = new SwXTextFrame(*pFrmFmt); + ((SwModify*)aObjectDepend.GetRegisteredIn())-> + Remove(&((SwXTextRange*)this)->aObjectDepend); + + } + else if(eRangePosition == RANGE_IN_CELL && + aObjectDepend.GetRegisteredIn()) + { + const SwStartNode* pSttNd = pBoxStartNode ? pBoxStartNode : pBox->GetSttNd(); + const SwTableNode* pTblNode = pSttNd->FindTableNode(); + const SwFrmFmt* pTableFmt = pTblNode->GetTable().GetFrmFmt(); + ((SwXTextRange*)this)->xParentText = + pBox ? SwXCell::CreateXCell((SwFrmFmt*)pTableFmt, pBox) + : new SwXCell( (SwFrmFmt*)pTableFmt, *pBoxStartNode ); + ((SwModify*)aObjectDepend.GetRegisteredIn())-> + Remove(&((SwXTextRange*)this)->aObjectDepend); + } + else if(eRangePosition == RANGE_IN_CELL && + aObjectDepend.GetRegisteredIn()) + { + //die Tabelle muss schon einen Parent kennen! + DBG_WARNING("not implemented") + } + else + { + // jetzt noch alle Faelle finden, die nicht abgedeckt sind + // (Body, Kopf-/Fusszeilen, Fussnotentext ) + DBG_WARNING("not implemented") + } + } + return xParentText; +} +/*-- 10.12.98 12:54:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XTextRange > SwXTextRange::getStart(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextRange > xRet; + SwBookmark* pBkm = GetBookmark(); + if(pBkm) + { + SwPaM aPam(pBkm->GetPos()); + xRet = new SwXTextRange(aPam, xParentText); + } + else if(eRangePosition == RANGE_IS_TABLE) + { + //start und ende sind mit this identisch, wenn es eine Tabelle ist + xRet = this; + } + else + throw uno::RuntimeException(); + return xRet; +} +/*-- 10.12.98 12:54:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XTextRange > SwXTextRange::getEnd(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextRange > xRet; + SwBookmark* pBkm = GetBookmark(); + if(pBkm) + { + SwPaM aPam(pBkm->GetOtherPos()? *pBkm->GetOtherPos() : pBkm->GetPos()); + xRet = new SwXTextRange(aPam, xParentText); + } + else if(eRangePosition == RANGE_IS_TABLE) + { + //start und ende sind mit this identisch, wenn es eine Tabelle ist + xRet = this; + } + else + throw uno::RuntimeException(); + return xRet; +} +/*-- 10.12.98 12:54:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +OUString SwXTextRange::getString(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwBookmark* pBkm = GetBookmark(); + OUString sRet; + //fuer Tabellen gibt es keine Bookmark, also auch keinen Text + //evtl. koennte man hier die Tabelle als ASCII exportieren? + if(pBkm && pBkm->GetOtherPos()) + { + const SwPosition& rPoint = pBkm->GetPos(); + const SwPosition* pMark = pBkm->GetOtherPos(); + SwPaM aCrsr(*pMark, rPoint); +/* if( rPoint.nNode.GetIndex() == + pMark->nNode.GetIndex() ) + { + SwTxtNode* pTxtNd = aCrsr.GetNode()->GetTxtNode(); + if( pTxtNd ) + { + sal_uInt16 nStt = aCrsr.Start()->nContent.GetIndex(); + sRet = pTxtNd->GetExpandTxt( nStt, + aCrsr.End()->nContent.GetIndex() - nStt ); + } + } + else +*/ { + SwXTextCursor::getTextFromPam(aCrsr, sRet); + } + } + return sRet; +} +/*-- 10.12.98 12:54:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextRange::setString(const OUString& aString) + throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(RANGE_IN_CELL == eRangePosition) + { + //setString in Tabellen kann nicht erlaubt werden + throw uno::RuntimeException(); + } + else + DeleteAndInsert(aString); +} +/*-- 10.12.98 12:54:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextRange::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + sal_Bool bAlreadyRegisterred = 0 != GetRegisteredIn(); + ClientModify(this, pOld, pNew); + if(aObjectDepend.GetRegisteredIn()) + { + ClientModify(&aObjectDepend, pOld, pNew); + // if the depend was removed then the range must be removed too + if(!aObjectDepend.GetRegisteredIn() && GetRegisteredIn()) + ((SwModify*)GetRegisteredIn())->Remove(this); + // or if the range has been removed but the depend ist still + // connected then the depend must be removed + else if(bAlreadyRegisterred && !GetRegisteredIn() && + aObjectDepend.GetRegisteredIn()) + ((SwModify*)aObjectDepend.GetRegisteredIn())->Remove(&aObjectDepend); + } +} +/*-- 10.12.98 12:54:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextRange::GetPositions(SwPaM& rToFill) const +{ + sal_Bool bRet = sal_False; + SwBookmark* pBkm = GetBookmark(); + if(pBkm) + { + *rToFill.GetPoint() = pBkm->GetPos(); + if(pBkm->GetOtherPos()) + { + rToFill.SetMark(); + *rToFill.GetMark() = *pBkm->GetOtherPos(); + } + else + rToFill.DeleteMark(); + bRet = sal_True; + } + return bRet; +} +/*-- 10.12.98 12:54:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextRange::XTextRangeToSwPaM( SwUnoInternalPaM& rToFill, + const uno::Reference< XTextRange > & xTextRange) +{ + sal_Bool bRet = sal_False; + + uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY); + SwXTextRange* pRange = 0; + SwXTextCursor* pCursor = 0; + if(xRangeTunnel.is()) + { + pRange = (SwXTextRange*)xRangeTunnel->getSomething( + SwXTextRange::getUnoTunnelId()); + pCursor = (SwXTextCursor*)xRangeTunnel->getSomething( + SwXTextCursor::getUnoTunnelId()); + } + + if(pRange && pRange->GetDoc() == rToFill.GetDoc()) + { + bRet = pRange->GetPositions(rToFill); + } + else + { + const SwPaM* pPam = 0; + if(pCursor && pCursor->GetDoc() == rToFill.GetDoc() && + 0 != (pPam = pCursor->GetPaM())) + { + DBG_ASSERT((SwPaM*)pPam->GetNext() == pPam, "was machen wir mit Ringen?" ) + bRet = sal_True; + *rToFill.GetPoint() = *pPam->GetPoint(); + if(pPam->HasMark()) + { + rToFill.SetMark(); + *rToFill.GetMark() = *pPam->GetMark(); + } + else + rToFill.DeleteMark(); + } + } + return bRet; +} +/* -----------------------------03.04.00 09:11-------------------------------- + + ---------------------------------------------------------------------------*/ +Reference< XEnumeration > SAL_CALL SwXTextRange::createContentEnumeration( + const OUString& rServiceName) + throw( RuntimeException ) +{ + SwBookmark* pBkm = GetBookmark(); + if( !pBkm || COMPARE_EQUAL != rServiceName.compareToAscii("com.sun.star.text.TextContent") ) + throw RuntimeException(); + + const SwPosition& rPoint = pBkm->GetPos(); + const SwPosition* pMark = pBkm->GetOtherPos(); + SwUnoCrsr* pNewCrsr = pDoc->CreateUnoCrsr(rPoint, FALSE); + if(pMark && *pMark != rPoint) + { + pNewCrsr->SetMark(); + *pNewCrsr->GetMark() = *pMark; + } + Reference< XEnumeration > xRet = new SwXParaFrameEnumeration(*pNewCrsr, PARAFRAME_PORTION_TEXTRANGE); + delete pNewCrsr; + return xRet; +} +/* -----------------------------03.04.00 09:11-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< OUString > SAL_CALL SwXTextRange::getAvailableServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(1); + OUString* pArray = aRet.getArray(); + pArray[0] = OUString::createFromAscii("com.sun.star.text.TextContent"); + return aRet; +} +/*-- 03.05.00 12:41:46--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Reference< XPropertySetInfo > SAL_CALL SwXTextRange::getPropertySetInfo( ) throw(RuntimeException) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + static Reference< XPropertySetInfo > xRef = + aPropSet.getPropertySetInfo(); + return xRef; +} +/*-- 03.05.00 12:41:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SAL_CALL SwXTextRange::setPropertyValue( + const OUString& rPropertyName, const Any& rValue ) + throw(UnknownPropertyException, PropertyVetoException, + IllegalArgumentException, WrappedTargetException, RuntimeException) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(!GetDoc() || !GetBookmark()) + throw RuntimeException(); + SwPaM aPaM(GetDoc()->GetNodes()); + SwXTextRange::GetPositions(aPaM); + SwXTextCursor::SetPropertyValue(aPaM, aPropSet, rPropertyName, rValue); +} +/*-- 03.05.00 12:41:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Any SAL_CALL SwXTextRange::getPropertyValue( const OUString& rPropertyName ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(!GetDoc() || !GetBookmark()) + throw RuntimeException(); + SwPaM aPaM(((SwDoc*)GetDoc())->GetNodes()); + SwXTextRange::GetPositions(aPaM); + return SwXTextCursor::GetPropertyValue(aPaM, aPropSet, rPropertyName); +} +/*-- 03.05.00 12:41:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SAL_CALL SwXTextRange::addPropertyChangeListener( + const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + DBG_WARNING("not implemented") +} +/*-- 03.05.00 12:41:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SAL_CALL SwXTextRange::removePropertyChangeListener( + const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + DBG_WARNING("not implemented") +} +/*-- 03.05.00 12:41:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SAL_CALL SwXTextRange::addVetoableChangeListener( + const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + DBG_WARNING("not implemented") +} +/*-- 03.05.00 12:41:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SAL_CALL SwXTextRange::removeVetoableChangeListener( + const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + DBG_WARNING("not implemented") +} +/*-- 03.05.00 12:41:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +PropertyState SAL_CALL SwXTextRange::getPropertyState( const OUString& rPropertyName ) + throw(UnknownPropertyException, RuntimeException) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(!GetDoc() || !GetBookmark()) + throw RuntimeException(); + SwPaM aPaM(((SwDoc*)GetDoc())->GetNodes()); + SwXTextRange::GetPositions(aPaM); + return SwXTextCursor::GetPropertyState(aPaM, aPropSet, rPropertyName); +} +/*-- 03.05.00 12:41:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Sequence< PropertyState > SAL_CALL SwXTextRange::getPropertyStates( + const Sequence< OUString >& rPropertyName ) throw(UnknownPropertyException, RuntimeException) +{ + NAMESPACE_VOS(OGuard) aGuard(Application::GetSolarMutex()); + if(!GetDoc() || !GetBookmark()) + throw RuntimeException(); + SwPaM aPaM(((SwDoc*)GetDoc())->GetNodes()); + SwXTextRange::GetPositions(aPaM); + return SwXTextCursor::GetPropertyStates(aPaM, aPropSet, rPropertyName); +} +/*-- 03.05.00 12:41:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SAL_CALL SwXTextRange::setPropertyToDefault( const OUString& rPropertyName ) + throw(UnknownPropertyException, RuntimeException) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(!GetDoc() || !GetBookmark()) + throw RuntimeException(); + SwPaM aPaM(((SwDoc*)GetDoc())->GetNodes()); + SwXTextRange::GetPositions(aPaM); + SwXTextCursor::SetPropertyToDefault(aPaM, aPropSet, rPropertyName); +} +/*-- 03.05.00 12:41:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Any SAL_CALL SwXTextRange::getPropertyDefault( const OUString& rPropertyName ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(!GetDoc() || !GetBookmark()) + throw RuntimeException(); + SwPaM aPaM(((SwDoc*)GetDoc())->GetNodes()); + SwXTextRange::GetPositions(aPaM); + return SwXTextCursor::GetPropertyDefault(aPaM, aPropSet, rPropertyName); +} + +/****************************************************************** + * SwXTextRanges + ******************************************************************/ +/* -----------------------------13.03.00 12:15-------------------------------- + + ---------------------------------------------------------------------------*/ +const uno::Sequence< sal_Int8 > & SwXTextRanges::getUnoTunnelId() +{ + static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId(); + return aSeq; +} +/* -----------------------------10.03.00 18:04-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Int64 SAL_CALL SwXTextRanges::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; +} +/**************************************************************************** + * Text positions + * Bis zum ersten Zugriff auf eine TextPosition wird ein SwCursor gehalten, + * danach wird ein Array mit uno::Reference< XTextPosition > angelegt + * +****************************************************************************/ +SV_IMPL_PTRARR(XTextRangeArr, XTextRangeRefPtr); +/* -----------------------------06.04.00 16:36-------------------------------- + + ---------------------------------------------------------------------------*/ +OUString SwXTextRanges::getImplementationName(void) throw( RuntimeException ) +{ + return C2U("SwXTextRanges"); +} +/* -----------------------------06.04.00 16:36-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwXTextRanges::supportsService(const OUString& rServiceName) throw( RuntimeException ) +{ + return C2U("com.sun.star.text.TextRanges") == rServiceName; +} +/* -----------------------------06.04.00 16:36-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< OUString > SwXTextRanges::getSupportedServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(1); + OUString* pArray = aRet.getArray(); + pArray[0] = C2U("com.sun.star.text.TextRanges"); + return aRet; +} +/*-- 10.12.98 13:57:20--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRanges::SwXTextRanges() : + pRangeArr(0) +{ + +} +/*-- 10.12.98 13:57:21--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRanges::SwXTextRanges( SwUnoCrsr* pCrsr, uno::Reference< XText > xParent) : + SwClient(pCrsr), + xParentText(xParent), + pRangeArr(0) +{ + +} +/*-- 10.12.98 13:57:22--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRanges::SwXTextRanges(SwPaM* pCrsr) : + pRangeArr(0) +{ + SwUnoCrsr* pUnoCrsr = pCrsr->GetDoc()->CreateUnoCrsr(*pCrsr->GetPoint()); + if(pCrsr->HasMark()) + { + pUnoCrsr->SetMark(); + *pUnoCrsr->GetMark() = *pCrsr->GetMark(); + } + if(pCrsr->GetNext() != pCrsr) + { + SwPaM *_pStartCrsr = (SwPaM *)pCrsr->GetNext(); + do + { + //neuen PaM erzeugen + SwPaM* pPaM = _pStartCrsr->HasMark() ? + new SwPaM(*_pStartCrsr->GetMark(), *_pStartCrsr->GetPoint()) : + new SwPaM(*_pStartCrsr->GetPoint()); + //und in den Ring einfuegen + pPaM->MoveTo(pUnoCrsr); + + } while( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) != pCrsr ); + } + + pUnoCrsr->Add(this); +} +/*-- 10.12.98 13:57:22--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextRanges::~SwXTextRanges() +{ + SwUnoCrsr* pCrsr = GetCrsr(); + delete pCrsr; + if(pRangeArr) + { + pRangeArr->DeleteAndDestroy(0, pRangeArr->Count()); + delete pRangeArr; + } +} +/*-- 10.12.98 13:57:24--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Int32 SwXTextRanges::getCount(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + sal_Int32 nRet = 0; + SwUnoCrsr* pCrsr = GetCrsr(); + if(pCrsr) + { + FOREACHUNOPAM_START(pCrsr) + nRet++; + FOREACHUNOPAM_END() + } + else if(pRangeArr) + nRet = pRangeArr->Count(); + return nRet; +} +/*-- 10.12.98 13:57:25--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Any SwXTextRanges::getByIndex(sal_Int32 nIndex) + throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextRange > aRef; + XTextRangeArr* pArr = ((SwXTextRanges*)this)->GetRangesArray(); + if(pArr && pArr->Count() > nIndex) + { + XTextRangeRefPtr pRef = pArr->GetObject(nIndex); + aRef = *pRef; + } + else + throw lang::IndexOutOfBoundsException(); + uno::Any aRet(&aRef, ::getCppuType((uno::Reference<XTextRange>*)0)); + return aRet; +} +/*-- 10.12.98 13:57:25--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Type SwXTextRanges::getElementType(void) throw( uno::RuntimeException ) +{ + return ::getCppuType((uno::Reference<XTextRange>*)0); +} +/*-- 10.12.98 13:57:26--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextRanges::hasElements(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + return getCount() > 0; +} +/* -----------------10.12.98 14:25------------------- + * + * --------------------------------------------------*/ +XTextRangeArr* SwXTextRanges::GetRangesArray() +{ + SwUnoCrsr* pCrsr = GetCrsr(); + if(!pRangeArr && pCrsr) + { + pRangeArr = new XTextRangeArr(); + FOREACHUNOPAM_START(pCrsr) + uno::Reference< XTextRange > * pPtr = new uno::Reference< XTextRange > ; + // in welcher Umgebung steht denn der PaM? + SwStartNode* pSttNode = PUNOPAM->GetNode()->FindStartNode(); + SwStartNodeType eType = pSttNode->GetStartNodeType(); + uno::Reference< XText > xCurParentRef; + switch(eType) + { + case SwTableBoxStartNode: + { + SwTableBox* pBox = pSttNode->GetTblBox(); + *pPtr = new SwXTextRange(*pBox->GetFrmFmt(), *pBox, *PUNOPAM); + } + break; + case SwFlyStartNode: + { + SwFrmFmt* pFlyFmt = pSttNode->GetFlyFmt(); + SwXTextFrame* pxFrm = (SwXTextFrame*)SwClientIter( *pFlyFmt ). + First( TYPE( SwXTextFrame )); + if(pxFrm) + xCurParentRef = pxFrm; + else + *pPtr = new SwXTextRange(*pFlyFmt, *PUNOPAM); + } + break; + case SwFootnoteStartNode: + { + const SwFtnIdxs& rIdxs = pCrsr->GetDoc()->GetFtnIdxs(); + sal_uInt16 n, nFtnCnt = rIdxs.Count(); + for( n = 0; n < nFtnCnt; ++n ) + { + const SwTxtFtn* pFtn = rIdxs[ n ]; + + const SwStartNode* pTemp = 0; + const SwNode& rNode = pFtn->GetStartNode()->GetNode(); + if(rNode.GetNodeType() == ND_STARTNODE) + pTemp = (const SwStartNode*)&rNode; + if(pSttNode == pTemp) + { + const SwFmtFtn& rFtn = pFtn->GetFtn(); + //TODO: schon existierendes Fussnotenobjekt wiederfinden! + xCurParentRef = new SwXFootnote(pCrsr->GetDoc(), rFtn); + break; + } + } + } + break; + case SwHeaderStartNode: + case SwFooterStartNode: + { + //PageStyle besorgen, HeaderText anlegen/erfragen, + //und dann SwXTextPosition damit anlegen + String sPageStyleName = lcl_GetCurPageStyle(*pCrsr); + uno::Reference< style::XStyleFamiliesSupplier > xStyleSupp( + pCrsr->GetDoc()->GetDocShell()->GetBaseModel(), uno::UNO_QUERY); + + uno::Reference< container::XNameAccess > xStyles = xStyleSupp->getStyleFamilies(); + uno::Any aStyleFamily = xStyles->getByName(C2U("PageStyles")); + + uno::Reference< container::XNameContainer > xFamily = + *(uno::Reference< container::XNameContainer > *)aStyleFamily.getValue(); + uno::Any aStyle = xFamily->getByName(sPageStyleName); + uno::Reference< style::XStyle > xStyle = *(uno::Reference< style::XStyle > *)aStyle.getValue(); + + uno::Reference< beans::XPropertySet > xPropSet(xStyle, uno::UNO_QUERY); + uno::Any aLayout = xPropSet->getPropertyValue(C2U(UNO_NAME_PAGE_STYLE_LAYOUT)); + + style::PageStyleLayout eLayout = *(style::PageStyleLayout*)aLayout.getValue(); + uno::Any aShare = xPropSet->getPropertyValue(C2U(UNO_NAME_HEADER_SHARE_CONTENT)); + sal_Bool bShare; + aShare >>= bShare; + sal_Bool bLeft = sal_False; + sal_Bool bRight = sal_False; + //jetzt evtl. noch zw. linker/rechter Kopf-/Fusszeile unterscheiden + if(!bShare && eLayout == style::PageStyleLayout_MIRRORED) + { + uno::Reference<lang::XUnoTunnel> xTunnel(xStyle, uno::UNO_QUERY); + SwXPageStyle* pStyle = (SwXPageStyle*) + xTunnel->getSomething( SwXPageStyle::getUnoTunnelId()); + + DBG_ASSERT(pStyle, "Was ist das fuer ein style::XStyle?") + bLeft = pSttNode == pStyle->GetStartNode(eType == SwHeaderStartNode, sal_True); + bRight = !bLeft; + } + uno::Any aParent; + sal_Bool bFooter = eType == SwFooterStartNode; + if(eLayout == style::PageStyleLayout_LEFT || bLeft) + aParent = xPropSet->getPropertyValue(C2U(bFooter ? UNO_NAME_FOOTER_TEXT_LEFT : UNO_NAME_HEADER_TEXT_LEFT)); + else if(eLayout == style::PageStyleLayout_RIGHT) + aParent = xPropSet->getPropertyValue(C2U(bFooter ? UNO_NAME_FOOTER_TEXT_RIGHT : UNO_NAME_HEADER_TEXT_RIGHT)); + else + aParent = xPropSet->getPropertyValue(C2U(bFooter ? UNO_NAME_FOOTER_TEXT : UNO_NAME_HEADER_TEXT)); + + if(aParent.getValueType() != ::getVoidCppuType()) + { + uno::Reference< XText > xText = *(uno::Reference< XText > *)aParent.getValue(); + xCurParentRef = xText; + } + } + + + break; +// case SwNormalStartNode: + default: + { + if(!xParentText.is()) + { + uno::Reference< XTextDocument > xDoc( + pCrsr->GetDoc()->GetDocShell()->GetBaseModel(), uno::UNO_QUERY); + xParentText = xDoc->getText(); + } + xCurParentRef = xParentText; + } + } + + if(xCurParentRef.is()) + *pPtr = new SwXTextRange(*PUNOPAM, xCurParentRef); + if(pPtr->is()) + pRangeArr->Insert(pPtr, pRangeArr->Count()); + FOREACHUNOPAM_END() + pCrsr->Remove( this ); + } + return pRangeArr; +} +/*-- 10.12.98 13:57:02--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextRanges::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + ClientModify(this, pOld, pNew); +} + + +/****************************************************************** + * SwXParagraph + ******************************************************************/ +/* -----------------------------11.07.00 12:10-------------------------------- + + ---------------------------------------------------------------------------*/ +SwXParagraph* SwXParagraph::GetImplementation(Reference< XInterface> xRef ) +{ + uno::Reference<lang::XUnoTunnel> xParaTunnel( xRef, uno::UNO_QUERY); + if(xParaTunnel.is()) + return (SwXParagraph*)xParaTunnel->getSomething(SwXParagraph::getUnoTunnelId()); + return 0; +} +/* -----------------------------13.03.00 12:15-------------------------------- + + ---------------------------------------------------------------------------*/ +const uno::Sequence< sal_Int8 > & SwXParagraph::getUnoTunnelId() +{ + static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId(); + return aSeq; +} +/* -----------------------------10.03.00 18:04-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Int64 SAL_CALL SwXParagraph::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:37-------------------------------- + + ---------------------------------------------------------------------------*/ +OUString SwXParagraph::getImplementationName(void) throw( RuntimeException ) +{ + return C2U("SwXParagraph"); +} +/* -----------------------------06.04.00 16:37-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwXParagraph::supportsService(const OUString& rServiceName) throw( RuntimeException ) +{ + String sServiceName(rServiceName); + return sServiceName.EqualsAscii("com.sun.star.text.TextContent") || + sServiceName.EqualsAscii("com.sun.star.text.Paragraph") || + sServiceName.EqualsAscii("com.sun.star.style.CharacterProperties")|| + sServiceName.EqualsAscii("com.sun.star.style.ParagraphProperties"); +} +/* -----------------------------06.04.00 16:37-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< OUString > SwXParagraph::getSupportedServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(4); + OUString* pArray = aRet.getArray(); + pArray[0] = C2U("com.sun.star.text.Paragraph"); + pArray[1] = C2U("com.sun.star.style.CharacterProperties"); + pArray[2] = C2U("com.sun.star.style.ParagraphProperties"); + pArray[3] = C2U("com.sun.star.text.TextContent"); + return aRet; +} +/*-- 11.12.98 08:12:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXParagraph::SwXParagraph() : + aLstnrCntnr( (XTextRange*)this), + xParentText(0), + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + m_bIsDescriptor(TRUE) +{ +} + +/*-- 11.12.98 08:12:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXParagraph::SwXParagraph(SwXText* pParent, SwUnoCrsr* pCrsr) : + SwClient(pCrsr), + xParentText(pParent), + aLstnrCntnr( (XTextRange*)this), + aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR)), + m_bIsDescriptor(FALSE) +{ +} +/*-- 11.12.98 08:12:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXParagraph::~SwXParagraph() +{ + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + delete pUnoCrsr; +} +/* -----------------------------11.07.00 14:48-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwXParagraph::attachToText(SwXText* pParent, SwUnoCrsr* pCrsr) +{ + DBG_ASSERT(m_bIsDescriptor, "Paragraph is not a descriptor") + if(m_bIsDescriptor) + { + m_bIsDescriptor = FALSE; + pCrsr->Add(this); + xParentText = pParent; + if(m_sText.getLength()) + { + try { setString(m_sText); } + catch(...){} + m_sText = OUString(); + } + } +} +/*-- 11.12.98 08:12:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< beans::XPropertySetInfo > SwXParagraph::getPropertySetInfo(void) + throw( uno::RuntimeException ) +{ + static uno::Reference< beans::XPropertySetInfo > xRef; + if(!xRef.is()) + { + uno::Reference< beans::XPropertySetInfo > xInfo = aPropSet.getPropertySetInfo(); + // PropertySetInfo verlaengern! + const uno::Sequence<beans::Property> aPropSeq = xInfo->getProperties(); + xRef = new SfxExtItemPropertySetInfo( + aSwMapProvider.GetPropertyMap(PROPERTY_MAP_PARAGRAPH_EXTENSIONS), + aPropSeq ); + } + return xRef; +} +/*-- 11.12.98 08:12:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue) + throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, + lang::WrappedTargetException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Any aAny; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + if(rPropertyName.equals(C2U(UNO_NAME_TEXT_WRAP)) || + rPropertyName.equals(C2U(UNO_NAME_ANCHOR_TYPE)) || + rPropertyName.equals(C2U(UNO_NAME_ANCHOR_TYPES))) + { + throw IllegalArgumentException(); + } + SwParaSelection aParaSel(pUnoCrsr); + SwXTextCursor::SetPropertyValue(*pUnoCrsr, aPropSet, rPropertyName, aValue); + } + else + throw uno::RuntimeException(); +} +/*-- 11.12.98 08:12:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Any SwXParagraph::getPropertyValue(const OUString& rPropertyName) + throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Any aAny; + SwUnoCrsr* pUnoCrsr = ((SwXParagraph*)this)->GetCrsr(); + if(pUnoCrsr) + { + if(!SwXParagraph::getDefaultTextContentValue(aAny, rPropertyName)) + { + SwParaSelection aParaSel(pUnoCrsr); + aAny = SwXTextCursor::GetPropertyValue(*pUnoCrsr, aPropSet, rPropertyName); + } + } + else + throw uno::RuntimeException(); + return aAny; + +} +/* -----------------------------12.09.00 11:09-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwXParagraph::getDefaultTextContentValue(Any& rAny, const OUString& rPropertyName, USHORT nWID) +{ + if(!nWID) + { + if(0 == rPropertyName.compareToAscii(UNO_NAME_ANCHOR_TYPE)) + nWID = FN_UNO_ANCHOR_TYPE; + else if(0 == rPropertyName.compareToAscii(UNO_NAME_ANCHOR_TYPES)) + nWID = FN_UNO_ANCHOR_TYPES; + else if(0 == rPropertyName.compareToAscii(UNO_NAME_TEXT_WRAP)) + nWID = FN_UNO_TEXT_WRAP; + else + return FALSE; + } + + switch(nWID) + { + case FN_UNO_TEXT_WRAP: rAny <<= WrapTextMode_NONE; break; + case FN_UNO_ANCHOR_TYPE: rAny <<= TextContentAnchorType_AT_PARAGRAPH; break; + case FN_UNO_ANCHOR_TYPES: + { Sequence<TextContentAnchorType> aTypes(1); + TextContentAnchorType* pArray = aTypes.getArray(); + pArray[0] = TextContentAnchorType_AT_PARAGRAPH; + rAny.setValue(&aTypes, ::getCppuType((uno::Sequence<TextContentAnchorType>*)0)); + } + break; + default: + return FALSE; + } + return TRUE; +} +/*-- 11.12.98 08:12:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::addPropertyChangeListener( + const OUString& PropertyName, + const uno::Reference< beans::XPropertyChangeListener > & aListener) + throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + DBG_WARNING("not implemented") +} +/*-- 11.12.98 08:12:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::removePropertyChangeListener(const OUString& PropertyName, const uno::Reference< beans::XPropertyChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + DBG_WARNING("not implemented") +} +/*-- 11.12.98 08:12:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::addVetoableChangeListener(const OUString& PropertyName, const uno::Reference< beans::XVetoableChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + DBG_WARNING("not implemented") +} +/*-- 11.12.98 08:12:51--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::removeVetoableChangeListener(const OUString& PropertyName, const uno::Reference< beans::XVetoableChangeListener > & aListener) + throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + DBG_WARNING("not implemented") +} + +/*-- 05.03.99 11:37:30--------------------------------------------------- + + -----------------------------------------------------------------------*/ +beans::PropertyState SwXParagraph::getPropertyState(const OUString& rPropertyName) + throw( beans::UnknownPropertyException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + beans::PropertyState eRet = beans::PropertyState_DEFAULT_VALUE; + SwUnoCrsr* pUnoCrsr = ((SwXParagraph*)this)->GetCrsr(); + if(pUnoCrsr) + { + // Absatz selektieren + SwParaSelection aParaSel(pUnoCrsr); + SfxItemSet aSet(pUnoCrsr->GetDoc()->GetAttrPool(), + RES_CHRATR_BEGIN, RES_PARATR_NUMRULE, + RES_FILL_ORDER, RES_FRMATR_END -1, + 0L); + SwXTextCursor::GetCrsrAttr(*pUnoCrsr, aSet); + if(rPropertyName.equals(C2U(UNO_NAME_PAGE_DESC_NAME))) + { + // Sonderbehandlung RES_PAGEDESC + const SfxPoolItem* pItem; + if(SFX_ITEM_SET == aSet.GetItemState( RES_PAGEDESC, sal_True, &pItem ) ) + { + eRet = beans::PropertyState_DIRECT_VALUE; + } + } + else if(rPropertyName.equals(C2U(UNO_NAME_NUMBERING_RULES))) + { + //wenn eine Numerierung gesetzt ist, dann hier herausreichen, sonst nichts tun + lcl_getNumberingProperty(*pUnoCrsr, eRet); + } + else if(rPropertyName.equals(C2U(UNO_NAME_PARA_STYLE_NAME)) || + rPropertyName.equals(C2U(UNO_NAME_PARA_CONDITIONAL_STYLE_NAME))) + { + SwFmtColl* pFmt = SwXTextCursor::GetCurTxtFmtColl(*pUnoCrsr, + rPropertyName.equals(C2U(UNO_NAME_PARA_CONDITIONAL_STYLE_NAME))); + if(!pFmt) + eRet = beans::PropertyState_AMBIGUOUS_VALUE; + } + else if(rPropertyName.equals(C2U(UNO_NAME_PAGE_STYLE_NAME))) + { + String sVal = lcl_GetCurPageStyle(*pUnoCrsr); + if(!sVal.Len()) + eRet = beans::PropertyState_AMBIGUOUS_VALUE; + } + else + { + eRet = aPropSet.getPropertyState(rPropertyName, aSet); + } + } + else + throw uno::RuntimeException(); + return eRet; +} +/*-- 05.03.99 11:37:32--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Sequence< beans::PropertyState > SwXParagraph::getPropertyStates( + const uno::Sequence< OUString >& PropertyNames) + throw( beans::UnknownPropertyException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + const OUString* pNames = PropertyNames.getConstArray(); + uno::Sequence< beans::PropertyState > aRet(PropertyNames.getLength()); + beans::PropertyState* pStates = aRet.getArray(); + for(sal_Int32 i = 0; i < PropertyNames.getLength(); i++) + pStates[i] = getPropertyState(pNames[i]); + return aRet; +} +/*-- 05.03.99 11:37:33--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::setPropertyToDefault(const OUString& rPropertyName) + throw( beans::UnknownPropertyException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + { + // Absatz selektieren + SwParaSelection aParaSel(pUnoCrsr); + SwDoc* pDoc = pUnoCrsr->GetDoc(); + const SfxItemPropertyMap* pMap = SfxItemPropertyMap::GetByName( + aPropSet.getPropertyMap(), rPropertyName); + if(pMap) + { + if(pMap->nWID < RES_FRMATR_END) + { + SvUShortsSort aWhichIds; + aWhichIds.Insert(pMap->nWID); + if(pMap->nWID < RES_PARATR_BEGIN) + pUnoCrsr->GetDoc()->ResetAttr(*pUnoCrsr, sal_True, &aWhichIds); + else + { + //fuer Absatzattribute muss die Selektion jeweils auf + //Absatzgrenzen erweitert werden + SwPosition aStart = *pUnoCrsr->Start(); + SwPosition aEnd = *pUnoCrsr->End(); + SwUnoCrsr* pTemp = pUnoCrsr->GetDoc()->CreateUnoCrsr(aStart, sal_False); + if(!lcl_IsStartOfPara(*pTemp)) + { + pTemp->MovePara(fnParaCurr, fnParaStart); + } + pTemp->SetMark(); + *pTemp->GetPoint() = aEnd; + //pTemp->Exchange(); + SwXTextCursor::SelectPam(*pTemp, sal_True); + if(!lcl_IsEndOfPara(*pTemp)) + { + pTemp->MovePara(fnParaCurr, fnParaEnd); + } + pTemp->GetDoc()->ResetAttr(*pTemp, sal_True, &aWhichIds); + delete pTemp; + } + } + else + lcl_resetCrsrPropertyValue(pMap, *pUnoCrsr); + } + else + throw beans::UnknownPropertyException(); + } + else + throw uno::RuntimeException(); +} +/*-- 05.03.99 11:37:33--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Any SwXParagraph::getPropertyDefault(const OUString& rPropertyName) + throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) +{ + uno::Any aRet; + SwUnoCrsr* pUnoCrsr = ((SwXParagraph*)this)->GetCrsr(); + if(pUnoCrsr) + { + SwDoc* pDoc = pUnoCrsr->GetDoc(); + const SfxItemPropertyMap* pMap = SfxItemPropertyMap::GetByName( + aPropSet.getPropertyMap(), rPropertyName); + if(pMap) + { + if(pMap->nWID < RES_FRMATR_END) + { + const SfxPoolItem& rDefItem = + pUnoCrsr->GetDoc()->GetAttrPool().GetDefaultItem(pMap->nWID); + rDefItem.QueryValue(aRet, pMap->nMemberId); + } + } + else + throw beans::UnknownPropertyException(); + } + else + throw uno::RuntimeException(); + + return aRet; +} +/*-- 11.12.98 08:12:51--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::attach(const uno::Reference< XTextRange > & xTextRange) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + +} +/*-- 11.12.98 08:12:51--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XTextRange > SwXParagraph::getAnchor(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextRange > aRet; + SwUnoCrsr* pUnoCrsr = ((SwXParagraph*)this)->GetCrsr(); + if(pUnoCrsr) + { + // Absatz selektieren + SwParaSelection aSelection(pUnoCrsr); + aRet = new SwXTextRange(*pUnoCrsr, xParentText); + } + else + throw uno::RuntimeException(); + return aRet; +} +/*-- 11.12.98 08:12:52--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::dispose(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = ((SwXParagraph*)this)->GetCrsr(); + if(pUnoCrsr) + { + // Absatz selektieren + SwParaSelection aSelection(pUnoCrsr); + pUnoCrsr->GetDoc()->DeleteAndJoin(*pUnoCrsr); + pUnoCrsr->Remove(this); + } + else + throw uno::RuntimeException(); +} +/*-- 11.12.98 08:12:52--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException ) +{ + if(!GetRegisteredIn()) + throw uno::RuntimeException(); + aLstnrCntnr.AddListener(aListener); +} +/*-- 11.12.98 08:12:53--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException ) +{ + if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener)) + throw uno::RuntimeException(); +} +/*-- 11.12.98 08:12:53--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< container::XEnumeration > SwXParagraph::createEnumeration(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< container::XEnumeration > aRef; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr) + aRef = new SwXTextPortionEnumeration(*pUnoCrsr, xParentText); + else + throw uno::RuntimeException(); + return aRef; + +} +/*-- 11.12.98 08:12:54--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Type SwXParagraph::getElementType(void) throw( uno::RuntimeException ) +{ + return ::getCppuType((uno::Reference<XTextRange>*)0); +} +/*-- 11.12.98 08:12:54--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXParagraph::hasElements(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(((SwXParagraph*)this)->GetCrsr()) + return sal_True; + else + return sal_False; +} +/*-- 11.12.98 08:12:55--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XText > SwXParagraph::getText(void) throw( uno::RuntimeException ) +{ + return xParentText; +} +/*-- 11.12.98 08:12:55--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XTextRange > SwXParagraph::getStart(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextRange > xRet; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if( pUnoCrsr) + { + SwPaM aPam(*pUnoCrsr->Start()); + uno::Reference< XText > xParent = getText(); + xRet = new SwXTextRange(aPam, xParent); + } + else + throw uno::RuntimeException(); + return xRet; +} +/*-- 11.12.98 08:12:56--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< XTextRange > SwXParagraph::getEnd(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + uno::Reference< XTextRange > xRet; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if( pUnoCrsr) + { + SwPaM aPam(*pUnoCrsr->End()); + uno::Reference< XText > xParent = getText(); + xRet = new SwXTextRange(aPam, xParent); + } + else + throw uno::RuntimeException(); + return xRet; +} +/*-- 11.12.98 08:12:56--------------------------------------------------- + + -----------------------------------------------------------------------*/ +OUString SwXParagraph::getString(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + OUString aRet; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if( pUnoCrsr) + aRet = pUnoCrsr->GetNode()->GetTxtNode()->GetTxt(); + else if(IsDescriptor()) + aRet = m_sText; + else + throw uno::RuntimeException(); + return aRet; +} +/* -----------------11.12.98 10:07------------------- + * + * --------------------------------------------------*/ +void SwXTextCursor::SetString(SwUnoCrsr& rUnoCrsr, const OUString& rString) +{ + // Start/EndAction + SwDoc* pDoc = rUnoCrsr.GetDoc(); + UnoActionContext aAction(pDoc); + String aText(rString); + xub_StrLen nTxtLen = aText.Len(); + pDoc->StartUndo(UNDO_INSERT); + if(rUnoCrsr.HasMark()) + pDoc->DeleteAndJoin(rUnoCrsr); + if(nTxtLen) + { + //OPT: GetSystemCharSet + if( !pDoc->Insert(rUnoCrsr, aText) ) + ASSERT( sal_False, "Doc->Insert(Str) failed." ); + SwXTextCursor::SelectPam(rUnoCrsr, sal_True); + rUnoCrsr.Left(nTxtLen); + } + pDoc->EndUndo(UNDO_INSERT); +} +/*-- 11.12.98 08:12:57--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::setString(const OUString& aString) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + SwUnoCrsr* pUnoCrsr = GetCrsr(); + + if(pUnoCrsr) + { + EXCEPT_ON_PROTECTION(*pUnoCrsr) + if(!lcl_IsStartOfPara(*pUnoCrsr)) + pUnoCrsr->MovePara(fnParaCurr, fnParaStart); + SwXTextCursor::SelectPam(*pUnoCrsr, sal_True); + if(pUnoCrsr->GetNode()->GetTxtNode()->GetTxt().Len()) + pUnoCrsr->MovePara(fnParaCurr, fnParaEnd); + SwXTextCursor::SetString(*pUnoCrsr, aString); + SwXTextCursor::SelectPam(*pUnoCrsr, sal_False); + } + else if(IsDescriptor()) + m_sText = aString; + else + throw uno::RuntimeException(); + +} +/* -----------------23.03.99 12:49------------------- + * + * --------------------------------------------------*/ +uno::Reference< container::XEnumeration > SwXParagraph::createContentEnumeration(const OUString& rServiceName) + throw( uno::RuntimeException ) +{ + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if( !pUnoCrsr || COMPARE_EQUAL != rServiceName.compareToAscii("com.sun.star.text.TextContent") ) + throw uno::RuntimeException(); + + uno::Reference< container::XEnumeration > xRet = new SwXParaFrameEnumeration(*pUnoCrsr, PARAFRAME_PORTION_PARAGRAPH); + return xRet; +} +/* -----------------23.03.99 12:49------------------- + * + * --------------------------------------------------*/ +uno::Sequence< OUString > SwXParagraph::getAvailableServiceNames(void) throw( uno::RuntimeException ) +{ + uno::Sequence< OUString > aRet(1); + OUString* pArray = aRet.getArray(); + pArray[0] = C2U("com.sun.star.text.TextContent"); + return aRet; +} +/*-- 11.12.98 08:12:58--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParagraph::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + ClientModify(this, pOld, pNew); + if(!GetRegisteredIn()) + aLstnrCntnr.Disposing(); +} +/****************************************************************** + * SwXParaFrameEnumeration + ******************************************************************/ +SV_IMPL_PTRARR(SwDependArr, SwDepend*); +/* -----------------------------06.04.00 16:39-------------------------------- + + ---------------------------------------------------------------------------*/ +OUString SwXParaFrameEnumeration::getImplementationName(void) throw( RuntimeException ) +{ + return C2U("SwXParaFrameEnumeration"); +} +/* -----------------------------06.04.00 16:39-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwXParaFrameEnumeration::supportsService(const OUString& rServiceName) throw( RuntimeException ) +{ + return C2U("com.sun.star.util.ContentEnumeration") == rServiceName; +} +/* -----------------------------06.04.00 16:39-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< OUString > SwXParaFrameEnumeration::getSupportedServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(1); + OUString* pArray = aRet.getArray(); + pArray[0] = C2U("com.sun.star.util.ContentEnumeration"); + return aRet; +} +/*-- 23.03.99 13:22:29--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXParaFrameEnumeration::SwXParaFrameEnumeration(const SwUnoCrsr& rUnoCrsr, + sal_uInt8 nParaFrameMode, + SwFrmFmt* pFmt) +{ + SwDoc* pDoc = rUnoCrsr.GetDoc(); + SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(*rUnoCrsr.GetPoint(), sal_False); + if(rUnoCrsr.HasMark()) + { + pUnoCrsr->SetMark(); + *pUnoCrsr->GetMark() = *rUnoCrsr.GetMark(); + } + pUnoCrsr->Add(this); + + if(PARAFRAME_PORTION_PARAGRAPH == nParaFrameMode) + { + //alle Rahmen, Grafiken und OLEs suchen, die an diesem Absatz gebunden sind + sal_uInt16 nCount = pDoc->GetFlyCount(); + for( sal_uInt16 i = 0; i < nCount; i++) + { + SwFrmFmt* pFmt = pDoc->GetFlyNum(i); + //steht der Anker in diesem Node und ist er absatzgebunden? + const SwNodeIndex nOwnNode = rUnoCrsr.GetPoint()->nNode; + if( pFmt->GetAnchor().GetAnchorId() == FLY_AT_CNTNT ) + { + const SwFmtAnchor& rAnchor = pFmt->GetAnchor(); + const SwPosition* pAnchorPos = rAnchor.GetCntntAnchor(); + if(pAnchorPos->nNode == nOwnNode) + { + //jetzt einen SwDepend anlegen und in das Array einfuegen + SwDepend* pNewDepend = new SwDepend(this, pFmt); + aFrameArr.C40_INSERT(SwDepend, pNewDepend, aFrameArr.Count()); + } + } + } + } + else if(pFmt) + { + //jetzt einen SwDepend anlegen und in das Array einfuegen + SwDepend* pNewDepend = new SwDepend(this, pFmt); + aFrameArr.C40_INSERT(SwDepend, pNewDepend, aFrameArr.Count()); + } + else if((PARAFRAME_PORTION_CHAR == nParaFrameMode) || (PARAFRAME_PORTION_TEXTRANGE == nParaFrameMode)) + { + SwPosFlyFrms aFlyFrms; + //get all frames that are bound at paragraph or at character + pDoc->GetAllFlyFmts(aFlyFrms, pUnoCrsr);//, bDraw); + for(USHORT i = 0; i < aFlyFrms.Count(); i++) + { + SwPosFlyFrm* pPosFly = aFlyFrms[i]; + SwFrmFmt* pFrmFmt = (SwFrmFmt*)&pPosFly->GetFmt(); + //jetzt einen SwDepend anlegen und in das Array einfuegen + SwDepend* pNewDepend = new SwDepend(this, pFrmFmt); + aFrameArr.C40_INSERT(SwDepend, pNewDepend, aFrameArr.Count()); + } + //created from any text range + if(pUnoCrsr->HasMark()) + { + if(pUnoCrsr->Start() != pUnoCrsr->GetPoint()) + pUnoCrsr->Exchange(); + do + { + FillFrame(*pUnoCrsr); + pUnoCrsr->Right(); + } + while(*pUnoCrsr->Start() < *pUnoCrsr->End()); + } + FillFrame(*pUnoCrsr); + } +} +/*-- 23.03.99 13:22:30--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXParaFrameEnumeration::~SwXParaFrameEnumeration() +{ + aFrameArr.DeleteAndDestroy(0, aFrameArr.Count()); +} +/* -----------------------------03.04.00 10:15-------------------------------- + Description: Search for a FLYCNT text attribute at the cursor point + and fill the frame into the array + ---------------------------------------------------------------------------*/ +void SwXParaFrameEnumeration::FillFrame(SwUnoCrsr& rUnoCrsr) +{ + // search for objects at the cursor - anchored at/as char + SwTxtAttr* pTxtAttr = rUnoCrsr.GetNode()->GetTxtNode()->GetTxtAttr( + rUnoCrsr.GetPoint()->nContent, RES_TXTATR_FLYCNT); + if(pTxtAttr) + { + const SwFmtFlyCnt& rFlyCnt = pTxtAttr->GetFlyCnt(); + SwFrmFmt* pFrmFmt = rFlyCnt.GetFrmFmt(); + //jetzt einen SwDepend anlegen und in das Array einfuegen + SwDepend* pNewDepend = new SwDepend(this, pFrmFmt); + aFrameArr.C40_INSERT(SwDepend, pNewDepend, aFrameArr.Count()); + } +} +/*-- 23.03.99 13:22:32--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXParaFrameEnumeration::hasMoreElements(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(!GetCrsr()) + throw uno::RuntimeException(); + return xNextObject.is() ? sal_True : CreateNextObject(); +} +/*-- 23.03.99 13:22:33--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Any SwXParaFrameEnumeration::nextElement(void) + throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + if(!GetCrsr()) + throw uno::RuntimeException(); + if(!xNextObject.is() && aFrameArr.Count()) + { + CreateNextObject(); + } + if(!xNextObject.is()) + throw container::NoSuchElementException(); + uno::Any aRet(&xNextObject, ::getCppuType((uno::Reference<XTextContent>*)0)); + xNextObject = 0; + return aRet; +} +/* -----------------23.03.99 13:38------------------- + * + * --------------------------------------------------*/ +sal_Bool SwXParaFrameEnumeration::CreateNextObject() +{ + if(!aFrameArr.Count()) + return sal_False; + SwDepend* pDepend = aFrameArr.GetObject(0); + aFrameArr.Remove(0); + SwFrmFmt* pFormat = (SwFrmFmt*)pDepend->GetRegisteredIn(); + delete pDepend; + // das Format sollte hier immer vorhanden sein, sonst waere + // der Client im Modify geloescht worden + const SwNodeIndex* pIdx = pFormat->GetCntnt().GetCntntIdx(); + const SwNode* pNd = GetCrsr()->GetDoc()->GetNodes()[ pIdx->GetIndex() + 1 ]; + + FlyCntType eType; + if(!pNd->IsNoTxtNode()) + eType = FLYCNTTYPE_FRM; + else if(pNd->IsGrfNode()) + eType = FLYCNTTYPE_GRF; + else + eType = FLYCNTTYPE_OLE; + + uno::Reference< container::XNamed > xFrame = SwXFrames::GetObject(*pFormat, eType); + xNextObject = uno::Reference< XTextContent >(xFrame, uno::UNO_QUERY); + + return xNextObject.is(); +} + +/*-- 23.03.99 13:22:37--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXParaFrameEnumeration::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + switch( pOld ? pOld->Which() : 0 ) + { + case RES_REMOVE_UNO_OBJECT: + case RES_OBJECTDYING: + if( (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject ) + ((SwModify*)GetRegisteredIn())->Remove(this); + break; + + case RES_FMT_CHG: + // wurden wir an das neue umgehaengt und wird das alte geloscht? + if( ((SwFmtChg*)pNew)->pChangedFmt == GetRegisteredIn() && + ((SwFmtChg*)pOld)->pChangedFmt->IsFmtInDTOR() ) + ((SwModify*)GetRegisteredIn())->Remove(this); + break; + } + if(!GetRegisteredIn()) + { + aFrameArr.DeleteAndDestroy(0, aFrameArr.Count()); + xNextObject = 0; + } + else + { + //dann war es vielleicht ein Frame am Absatz? + for(sal_uInt16 i = aFrameArr.Count(); i; i--) + { + SwDepend* pDepend = aFrameArr.GetObject(i-1); + if(!pDepend->GetRegisteredIn()) + { + delete pDepend; + aFrameArr.Remove(i-1); + } + } + } +} +/****************************************************************** + * SwXTextPortionEnumeration + ******************************************************************/ +/* -----------------------------13.03.00 12:15-------------------------------- + + ---------------------------------------------------------------------------*/ +const uno::Sequence< sal_Int8 > & SwXTextPortionEnumeration::getUnoTunnelId() +{ + static uno::Sequence< sal_Int8 > aSeq = ::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) : + xParent(xParentText), + bAtEnd(sal_False), + bFirstPortion(sal_True) +{ + SwUnoCrsr* pUnoCrsr = rParaCrsr.GetDoc()->CreateUnoCrsr(*rParaCrsr.GetPoint(), sal_False); + pUnoCrsr->Add(this); + + //alle Rahmen, Grafiken und OLEs suchen, die an diesem Absatz AM ZEICHEN gebunden sind + SwDoc* pDoc = pUnoCrsr->GetDoc(); + sal_uInt16 nCount = pDoc->GetFlyCount(); + const SwNodeIndex nOwnNode = pUnoCrsr->GetPoint()->nNode; + for( sal_uInt16 i = 0; i < nCount; i++) + { + SwFrmFmt* pFmt = pDoc->GetFlyNum(i); + //steht der Anker in diesem Node und ist er absatzgebunden? + if( pFmt->GetAnchor().GetAnchorId() == FLY_AUTO_CNTNT ) + { + const SwFmtAnchor& rAnchor = pFmt->GetAnchor(); + const SwPosition* pAnchorPos = rAnchor.GetCntntAnchor(); + if(pAnchorPos->nNode == nOwnNode) + { + //jetzt einen SwDepend anlegen und sortiert in das Array einfuegen + SwDepend* pNewDepend = new SwDepend(this, pFmt); + const SwFmtAnchor& rNewAnchor = pFmt->GetAnchor(); + const SwPosition* pNewAnchorPos = rNewAnchor.GetCntntAnchor(); + xub_StrLen nInsertIndex = pNewAnchorPos->nContent.GetIndex(); + + for(sal_uInt16 nFrame = 0; nFrame < aFrameArr.Count(); nFrame++) + { + SwDepend* pCurDepend = aFrameArr.GetObject(nFrame); + SwFrmFmt* pFormat = (SwFrmFmt*)pCurDepend->GetRegisteredIn(); + const SwFmtAnchor& rAnchor = pFormat->GetAnchor(); + const SwPosition* pAnchorPos = rAnchor.GetCntntAnchor(); + + if(pAnchorPos->nContent.GetIndex() > nInsertIndex) + { + aFrameArr.C40_INSERT(SwDepend, pNewDepend, nFrame); + pNewDepend = 0; + break; + } + } + if(pNewDepend) + aFrameArr.C40_INSERT(SwDepend, pNewDepend, aFrameArr.Count()); + } + } + } + CreatePortions(); +} +/*-- 27.01.99 10:44:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXTextPortionEnumeration::~SwXTextPortionEnumeration() +{ + for(sal_uInt16 nFrame = aFrameArr.Count(); nFrame; nFrame--) + { + SwDepend* pCurDepend = aFrameArr.GetObject(nFrame - 1); + delete pCurDepend; + aFrameArr.Remove(nFrame - 1); + } + SwUnoCrsr* pUnoCrsr = GetCrsr(); + delete pUnoCrsr; +} +/*-- 27.01.99 10:44:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXTextPortionEnumeration::hasMoreElements(void) throw( uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + return aPortionArr.Count() > 0; +} +/*-- 27.01.99 10:44:45--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Any SwXTextPortionEnumeration::nextElement(void) + throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) +{ + vos::OGuard aGuard(Application::GetSolarMutex()); + 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> xParent, 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, xParent, PORTION_REFMARK_START)), + rArr.Count()); + pPortion->SetRefMark(xContent); + pPortion->SetIsCollapsed(pAttr->GetEnd() ? FALSE : TRUE); + } + else + { + rArr.Insert( + new Reference< XTextRange >(pPortion = new SwXTextPortion(*pUnoCrsr, xParent, PORTION_REFMARK_END)), + rArr.Count()); + pPortion->SetRefMark(xContent); + } +} +//----------------------------------------------------------------------------- +void lcl_InsertTOXMarkPortion( + XTextRangeArr& rArr, SwUnoCrsr* pUnoCrsr, Reference<XText> xParent, SwTxtAttr* pAttr, BOOL bEnd) +{ + SwDoc* pDoc = pUnoCrsr->GetDoc(); + SwTOXMark& rTOXMark = ((SwTOXMark&)pAttr->GetAttr()); + + SwClientIter aIter(*(SwTOXType*)rTOXMark.GetTOXType()); + SwXDocumentIndexMark* pxMark = (SwXDocumentIndexMark*) + aIter.First(TYPE(SwXDocumentIndexMark)); + while( pxMark ) + { + if(pxMark->GetTOXMark() == &rTOXMark) + break; + pxMark = (SwXDocumentIndexMark*)aIter.Next(); + } + + Reference<XTextContent> xContent = pxMark; + if(!xContent.is()) + xContent = new SwXDocumentIndexMark(rTOXMark.GetTOXType(), &rTOXMark, pDoc); + + SwXTextPortion* pPortion; + if(!bEnd) + { + rArr.Insert( + new Reference< XTextRange >(pPortion = new SwXTextPortion(*pUnoCrsr, xParent, PORTION_TOXMARK_START)), + rArr.Count()); + pPortion->SetTOXMark(xContent); + pPortion->SetIsCollapsed(pAttr->GetEnd() ? FALSE : TRUE); + } + if(bEnd) + { + rArr.Insert( + new Reference< XTextRange >(pPortion = new SwXTextPortion(*pUnoCrsr, xParent, 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; +} + +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> xParent, 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, xParent, PORTION_BOOKMARK_START)), + rPortionArr.Count()); + pPortion->SetBookmark(pPtr->xBookmark); + pPortion->SetIsCollapsed(BKM_TYPE_START_END == pPtr->nBkmType ? TRUE : FALSE); + + } + if(BKM_TYPE_END == pPtr->nBkmType) + { + rPortionArr.Insert( + new Reference< XTextRange >(pPortion = new SwXTextPortion(*pUnoCrsr, xParent, PORTION_BOOKMARK_END)), + rPortionArr.Count()); + pPortion->SetBookmark(pPtr->xBookmark); + } + rBkmArr.Remove((USHORT)0); + delete pPtr; + } +} +//----------------------------------------------------------------------------- +void SwXTextPortionEnumeration::CreatePortions() +{ + uno::Any aRet; + SwUnoCrsr* pUnoCrsr = GetCrsr(); + if(pUnoCrsr /*&& !bAtEnd*/) + { + SwXBookmarkPortionArr aBkmArr; + SwDoc* pDoc = pUnoCrsr->GetDoc(); + const SwNodeIndex nOwnNode = pUnoCrsr->GetPoint()->nNode; + //search for all bookmarks that start or end in this paragraph + const SwBookmarks& rMarks = pDoc->GetBookmarks(); + sal_uInt16 nArrLen = rMarks.Count(); + 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, pDoc ), nType, rPos1.nContent.GetIndex() ); + + aBkmArr.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, pDoc ), nType, pPos2->nContent.GetIndex() ); + aBkmArr.Insert(pBkmPtr); + } + } +#ifdef DEBUG + 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(); + } + if(!bFirstPortion && pUnoCrsr->GetCntntNode() && + pUnoCrsr->GetPoint()->nContent == pUnoCrsr->GetCntntNode()->Len()) + { + //hier sollte man nie ankommen! + bAtEnd = sal_True; + } + else + { + SwNode* pNode = pUnoCrsr->GetNode(); + 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(!pUnoCrsr->GetCntntNode()->Len()) + { + if(pHints) + { + DBG_ERROR("hints not exported") + } + if(aBkmArr.Count()) + { + lcl_ExportBookmark(aBkmArr, 0, pUnoCrsr, xParent, aPortionArr); + } + // der Absatz ist leer, also nur Portion erzeugen und raus + xRef = new SwXTextPortion(*pUnoCrsr, xParent, ePortionType); + } + 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(); + } + + 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_ExportBookmark(aBkmArr, nCurrentIndex, pUnoCrsr, xParent, aPortionArr); + if(pHints) + { + 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)) + { + switch( nAttrWhich ) + { + case RES_TXTATR_TOXMARK: + lcl_InsertTOXMarkPortion( + aPortionArr, pUnoCrsr, xParent, pAttr, TRUE); + ePortionType = PORTION_TEXT; + DBG_ERROR("ToxMark"); + break; + case RES_TXTATR_REFMARK: + lcl_InsertRefMarkPortion( + aPortionArr, pUnoCrsr, xParent, 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)) + { + switch( nAttrWhich ) + { + case RES_TXTATR_FIELD: + pUnoCrsr->Right(1); + bAttrFound = sal_True; + ePortionType = PORTION_FIELD; + break; + case RES_TXTATR_FLYCNT : + pUnoCrsr->Right(1); + pUnoCrsr->Exchange(); + bAttrFound = sal_True; + ePortionType = PORTION_FRAME; + break; + case RES_TXTATR_FTN : + { + pUnoCrsr->Right(1); + SwXTextPortion* pPortion; + xRef = pPortion = new SwXTextPortion(*pUnoCrsr, xParent, 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; + aPortionArr.Insert( + new Reference< XTextRange >( + pPortion = new SwXTextPortion( + *pUnoCrsr, xParent, PORTION_CONTROL_CHAR)), + aPortionArr.Count()); + pPortion->SetControlChar(3); + ePortionType = PORTION_TEXT; + } + break; + case RES_TXTATR_HARDBLANK: + { + ePortionType = PORTION_CONTROL_CHAR; + SwXTextPortion* pPortion; + aPortionArr.Insert( + new Reference< XTextRange >( + pPortion = new SwXTextPortion( + *pUnoCrsr, xParent, PORTION_CONTROL_CHAR)), + aPortionArr.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( + aPortionArr, pUnoCrsr, xParent, pAttr, FALSE); + ePortionType = PORTION_TEXT; + DBG_ERROR("ToxMark"); + break; + case RES_TXTATR_REFMARK: + lcl_InsertRefMarkPortion( + aPortionArr, pUnoCrsr, xParent, pAttr, FALSE); + ePortionType = PORTION_TEXT; + break; + default: + DBG_ERROR("was fuer ein Attribut?"); + } + + } + nStartIndex++; + } + + if(!bAttrFound) + { + // hier wird nach Uebergaengen zwischen Attributen gesucht, die nach der + // aktuellen Cursorposition liegen + // wenn dabei ein Rahmen 'ueberholt' wird, dann muss auch in der TextPortion unterbrochen werden + + 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(aBkmArr.Count() && aBkmArr.GetObject(0)->nIndex < nMovePos) + { + DBG_ASSERT(aBkmArr.GetObject(0)->nIndex > nCurrentIndex, + "forgotten bookmark(s)") + nMovePos = aBkmArr.GetObject(0)->nIndex; + } + // liegt die Endposition nach dem naechsten Rahmen, dann aufbrechen + if(nFirstFrameIndex != USHRT_MAX && nMovePos > nFirstFrameIndex) + nMovePos = nFirstFrameIndex; + + if(nMovePos > nCurrentIndex) + pUnoCrsr->Right(nMovePos - nCurrentIndex); + else + pUnoCrsr->MovePara(fnParaCurr, fnParaEnd); + } + } + else if(USHRT_MAX != nFirstFrameIndex) + { + pUnoCrsr->Right(nFirstFrameIndex - nCurrentIndex); + } + else + { + lcl_ExportBookmark(aBkmArr, nCurrentIndex, pUnoCrsr, xParent, aPortionArr); + if(!aBkmArr.Count()) + sal_Bool bMove = pUnoCrsr->MovePara(fnParaCurr, fnParaEnd); + else + { + SwXBookmarkPortion_ImplPtr pPtr = aBkmArr.GetObject(0); + sal_uInt16 nMovePos = pPtr->nIndex; + DBG_ASSERT(nMovePos > nCurrentIndex, "wrong move index") + pUnoCrsr->Right(nMovePos - nCurrentIndex); + } + } + } + if(!xRef.is()) + xRef = new SwXTextPortion(*pUnoCrsr, xParent, ePortionType); + aPortionArr.Insert(new Reference<XTextRange>(xRef), aPortionArr.Count()); + } + else + { + DBG_ERROR("kein TextNode - was nun?") + } + } + if(*pUnoCrsr->GetPoint() < *pUnoCrsr->GetMark()) + pUnoCrsr->Exchange(); + + // Absatzende ? + if(pUnoCrsr->GetCntntNode() && + pUnoCrsr->GetPoint()->nContent == pUnoCrsr->GetCntntNode()->Len()) + bAtEnd = sal_True; + } + } +} +/*-- 27.01.99 10:44:45--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXTextPortionEnumeration::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + ClientModify(this, pOld, pNew); +} + +/* -----------------22.04.99 11:24------------------- + * + * --------------------------------------------------*/ +typedef uno::Reference< lang::XEventListener > * XEventListenerPtr; +SV_DECL_PTRARR(SwEvtLstnrArray, XEventListenerPtr, 4, 4); +SV_IMPL_PTRARR(SwEvtLstnrArray, XEventListenerPtr); + +/*-- 22.04.99 11:24:59--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwEventListenerContainer::SwEventListenerContainer( uno::XInterface* pxParent) : + pListenerArr(0), + pxParent(pxParent) +{ +} +/*-- 22.04.99 11:24:59--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwEventListenerContainer::~SwEventListenerContainer() +{ + if(pListenerArr && pListenerArr->Count()) + { + pListenerArr->DeleteAndDestroy(0, pListenerArr->Count()); + } + delete pListenerArr; +} +/*-- 22.04.99 11:24:59--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwEventListenerContainer::AddListener(const uno::Reference< lang::XEventListener > & rxListener) +{ + if(!pListenerArr) + pListenerArr = new SwEvtLstnrArray; + uno::Reference< lang::XEventListener > * pInsert = new uno::Reference< lang::XEventListener > ; + *pInsert = rxListener; + pListenerArr->Insert(pInsert, pListenerArr->Count()); +} +/*-- 22.04.99 11:25:00--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwEventListenerContainer::RemoveListener(const uno::Reference< lang::XEventListener > & rxListener) +{ + if(!pListenerArr) + return sal_False; + else + { + lang::XEventListener* pLeft = rxListener.get(); + for(sal_uInt16 i = 0; i < pListenerArr->Count(); i++) + { + XEventListenerPtr pElem = pListenerArr->GetObject(i); + lang::XEventListener* pRight = pElem->get(); + if(pLeft == pRight) + { + pListenerArr->Remove(i); + delete pElem; + return sal_True; + } + } + } + return sal_False; +} +/*-- 22.04.99 11:25:00--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwEventListenerContainer::Disposing() +{ + if(!pListenerArr) + return; + + lang::EventObject aObj(pxParent); + for(sal_uInt16 i = 0; i < pListenerArr->Count(); i++) + { + XEventListenerPtr pElem = pListenerArr->GetObject(i); + (*pElem)->disposing(aObj); + } + pListenerArr->DeleteAndDestroy(0, pListenerArr->Count()); +} +/*------------------------------------------------------------------------ + + $Log: not supported by cvs2svn $ + Revision 1.262 2000/09/18 16:04:33 willem.vandorp + OpenOffice header added. + + Revision 1.261 2000/09/12 13:03:59 os + #78700# types of text content properties corrected + + Revision 1.260 2000/09/12 11:42:58 os + #78682# support of service TextContent + + Revision 1.259 2000/09/11 08:33:01 os + #76672# get page no corrected + + Revision 1.258 2000/09/11 06:57:15 os + bookmarks start/end corrected + + Revision 1.257 2000/09/07 07:57:47 os + SwXTextPortion - new properties: IsCollapsed, IsStart + + Revision 1.256 2000/09/05 15:21:03 os + footnote property at SwTextPortion + + Revision 1.255 2000/09/05 09:40:58 os + CreatePortions: create selected textportion for footnotes + + Revision 1.254 2000/09/04 12:50:48 os + TextPortionEnumeration almost completed + + Revision 1.253 2000/09/01 14:35:51 os + text portion generation almost completed + + Revision 1.252 2000/08/31 15:01:59 os + SwXTextPortionEnumeration: Fill Array of portions in Ctor + getPropertyState corrected + + Revision 1.251 2000/08/30 16:49:58 jp + use CharClass instead of international + + Revision 1.250 2000/08/29 11:29:20 os + prevent reading of inherited properties + + Revision 1.249 2000/08/25 08:46:58 os + +property DropCapCharStyleName + + Revision 1.248 2000/08/24 15:14:27 os + new Property: NumberingIsNumber + + Revision 1.247 2000/08/24 11:14:34 mib + bug fixes for XML import + + Revision 1.246 2000/08/22 14:52:17 os + #77933# GotoNextWord: if GoNextWord fails goto next paragraph + + Revision 1.245 2000/08/18 08:37:11 os + #77726# SwSriter - additional parameter + + Revision 1.244 2000/08/09 14:50:16 os + create cell objects without SwTableBox* + + Revision 1.243 2000/08/02 14:56:21 mib + - NumberingLevel, NumberingStartValue now sal_Int16 + - TextField property fixed + - ParaStyleName and ParaConditionalStyleName fixed + + Revision 1.242 2000/07/27 12:33:04 jp + GetCurTxtFmtColl(): returns the right Collection + + Revision 1.241 2000/07/21 11:59:42 os + #76495# SwXParagraph: TextContent service corrected + + Revision 1.240 2000/07/19 10:59:43 os + properties added/renamed + + Revision 1.239 2000/07/11 13:43:43 os + #76708# insert/remove paragraphs before/behind tables + + Revision 1.238 2000/06/29 09:18:05 os + #76417# gotoStartOfWord returns correctly + + Revision 1.237 2000/06/29 08:48:43 os + #76365# SwXParagraph::set/getPropertyValue: call SwXTextCursor::Get/SetPropertyValue + + Revision 1.236 2000/06/29 08:10:23 os + #76495# SwXParagraph::set/getPropertyValue corrected; + + Revision 1.235 2000/06/27 12:10:33 os + #76423# programmatic style names + + Revision 1.234 2000/05/30 11:20:14 os + #76026# SwXParagraph::XServiceInfo completed + + Revision 1.233 2000/05/16 17:21:32 jp + Changes for Unicode + + Revision 1.232 2000/05/16 09:14:55 os + project usr removed + + Revision 1.231 2000/05/04 15:16:36 os + reduce size of unoobj.cxx + + Revision 1.230 2000/05/04 08:58:12 os + #75145# XPropertySet/XPropertyState now available at SwXTextRange + + Revision 1.229 2000/04/27 10:46:56 os + UNICODE + + Revision 1.228 2000/04/26 11:35:19 os + GetName() returns String& + + Revision 1.227 2000/04/19 13:35:30 os + UNICODE + + Revision 1.226 2000/04/11 08:31:03 os + UNICODE + + Revision 1.225 2000/04/04 15:08:03 os + #74484# XTextRangeCompare impl. #74483# ContentEnumeration available at SwXTextRange/SwXTextCursor + + Revision 1.224 2000/03/27 10:21:10 os + UNO III + + Revision 1.223 2000/03/24 10:31:52 os + #65681# SwXReferenceMark: always add to UnoCallBack + + Revision 1.222 2000/03/21 15:42:24 os + UNOIII + + Revision 1.221 2000/03/13 16:08:18 os + #74154# Exceptions have to be declared + + Revision 1.220 2000/03/07 17:00:32 hjs + #65293# includes + + +------------------------------------------------------------------------*/ + |