diff options
Diffstat (limited to 'binfilter/bf_sw/source/core/unocore/sw_unoftn.cxx')
-rw-r--r-- | binfilter/bf_sw/source/core/unocore/sw_unoftn.cxx | 589 |
1 files changed, 589 insertions, 0 deletions
diff --git a/binfilter/bf_sw/source/core/unocore/sw_unoftn.cxx b/binfilter/bf_sw/source/core/unocore/sw_unoftn.cxx new file mode 100644 index 000000000000..47b1afc5d8bb --- /dev/null +++ b/binfilter/bf_sw/source/core/unocore/sw_unoftn.cxx @@ -0,0 +1,589 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifdef _MSC_VER +#pragma hdrstop +#endif + +#include <osl/mutex.hxx> +#include <vcl/svapp.hxx> +#include <rtl/uuid.h> + +#include <errhdl.hxx> + +#include <unoobj.hxx> +#include <unomap.hxx> +#include <unoprnms.hxx> + +#include <horiornt.hxx> + +#include <doc.hxx> +#include <ftnidx.hxx> +#include <fmtftn.hxx> +#include <txtftn.hxx> +#include <ndtxt.hxx> +#include <unocrsr.hxx> +#include <hints.hxx> +namespace binfilter { + +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 rtl::OUString; + +/****************************************************************** + * + ******************************************************************/ +/* -----------------------------13.03.00 12:15-------------------------------- + + ---------------------------------------------------------------------------*/ +const uno::Sequence< sal_Int8 > & SwXFootnote::getUnoTunnelId() +{ + static uno::Sequence< sal_Int8 > aSeq = ::binfilter::CreateUnoTunnelId(); + return aSeq; +} +/* -----------------------------10.03.00 18:04-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Int64 SAL_CALL SwXFootnote::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 SwXText::getSomething( rId ); +} +/* -----------------------------06.04.00 16:36-------------------------------- + + ---------------------------------------------------------------------------*/ +OUString SwXFootnote::getImplementationName(void) throw( RuntimeException ) +{ + return C2U("SwXFootnote"); +} +/* -----------------------------06.04.00 16:36-------------------------------- + + ---------------------------------------------------------------------------*/ +BOOL SwXFootnote::supportsService(const OUString& rServiceName) throw( RuntimeException ) +{ + return !rServiceName.compareToAscii("com.sun.star.text.Footnote") || + !rServiceName.compareToAscii("com.sun.star.text.TextContent") || + !rServiceName.compareToAscii("com.sun.star.text.Text") || + (m_bIsEndnote && !rServiceName.compareToAscii("com.sun.star.text.Endnote")); +; +} +/* -----------------------------06.04.00 16:36-------------------------------- + + ---------------------------------------------------------------------------*/ +Sequence< OUString > SwXFootnote::getSupportedServiceNames(void) throw( RuntimeException ) +{ + Sequence< OUString > aRet(m_bIsEndnote ? 4 : 3); + OUString* pArray = aRet.getArray(); + pArray[0] = C2U("com.sun.star.text.Footnote"); + pArray[1] = C2U("com.sun.star.text.TextContent"); + pArray[2] = C2U("com.sun.star.text.Text"); + if(m_bIsEndnote) + pArray[3] = C2U("com.sun.star.text.Endnote"); + return aRet; +} +/*-- 10.12.98 15:31:44--------------------------------------------------- + + -----------------------------------------------------------------------*/ +TYPEINIT1(SwXFootnote, SwClient); + +SwXFootnote::SwXFootnote(sal_Bool bEndnote) : + aLstnrCntnr( (text::XTextContent*)this), + SwXText(0, CURSOR_FOOTNOTE), + pFmtFtn(0), + m_bIsDescriptor(sal_True), + m_bIsEndnote(bEndnote) +{ + +} +/*-- 10.12.98 15:31:45--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXFootnote::SwXFootnote(SwDoc* pDoc, const SwFmtFtn& rFmt) : + SwXText(pDoc, CURSOR_FOOTNOTE), + aLstnrCntnr( (text::XTextContent*)this), + pFmtFtn(&rFmt), + m_bIsDescriptor(sal_False), + m_bIsEndnote(rFmt.IsEndNote()) +{ + GetDoc()->GetUnoCallBack()->Add(this); +} +/*-- 10.12.98 15:31:45--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwXFootnote::~SwXFootnote() +{ + +} +/* -----------------------------21.03.00 15:39-------------------------------- + + ---------------------------------------------------------------------------*/ +uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL SwXFootnote::getTypes( ) throw(uno::RuntimeException) +{ + uno::Sequence< uno::Type > aFtnTypes = SwXFootnoteBaseClass::getTypes(); + uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes(); + + long nIndex = aFtnTypes.getLength(); + aFtnTypes.realloc( aFtnTypes.getLength() + aTextTypes.getLength()); + + uno::Type* pFtnTypes = aFtnTypes.getArray(); + const uno::Type* pTextTypes = aTextTypes.getConstArray(); + for(long nPos = 0; nPos < aTextTypes.getLength(); nPos++) + pFtnTypes[nIndex++] = pTextTypes[nPos]; + + return aFtnTypes; +} + +/* -----------------------------21.03.00 15:39-------------------------------- + + ---------------------------------------------------------------------------*/ +uno::Sequence< sal_Int8 > SAL_CALL SwXFootnote::getImplementationId( ) throw(uno::RuntimeException) +{ + SolarMutexGuard aGuard; + static Sequence< sal_Int8 > aId( 16 ); + static sal_Bool bInit = sal_False; + if(!bInit) + { + rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True ); + bInit = sal_True; + } + return aId; +} +/* -----------------------------21.03.00 15:46-------------------------------- + + ---------------------------------------------------------------------------*/ +uno::Any SAL_CALL SwXFootnote::queryInterface( const uno::Type& aType ) throw(uno::RuntimeException) +{ + uno::Any aRet = SwXFootnoteBaseClass::queryInterface(aType); + if(aRet.getValueType() == ::getCppuVoidType() ) + aRet = SwXText::queryInterface(aType); + return aRet; +} + +/*-- 10.12.98 15:31:47--------------------------------------------------- + + -----------------------------------------------------------------------*/ +OUString SwXFootnote::getLabel(void) throw( uno::RuntimeException ) +{ + SolarMutexGuard aGuard; + String sRet; + const SwFmtFtn* pFmt = SwXFootnote::FindFmt(); + if(pFmt) + sRet = pFmt->GetNumStr(); + else if(m_bIsDescriptor) + return m_sLabel; + else + throw uno::RuntimeException(); + return sRet; +} +/*-- 10.12.98 15:31:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::setLabel(const OUString& aLabel) throw( uno::RuntimeException ) +{ + SolarMutexGuard aGuard; + const SwFmtFtn* pFmt = FindFmt(); + if(pFmt) + { + const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn(); + DBG_ASSERT(pTxtFtn, "kein TextNode?"); + SwTxtNode& rTxtNode = (SwTxtNode&)pTxtFtn->GetTxtNode(); + + SwPaM aPam(rTxtNode, *pTxtFtn->GetStart()); + GetDoc()->SetCurFtn(aPam, aLabel, pFmt->GetNumber(), pFmt->IsEndNote()); + } + else if(m_bIsDescriptor) + m_sLabel = String(aLabel); + else + throw uno::RuntimeException(); + +} +/* -----------------18.02.99 13:32------------------- + * + * --------------------------------------------------*/ +void SwXFootnote::attachToRange(const uno::Reference< text::XTextRange > & xTextRange) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + if(!m_bIsDescriptor) + throw uno::RuntimeException(); + uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY); + SwXTextRange* pRange = 0; + OTextCursorHelper* pCursor = 0; + if(xRangeTunnel.is()) + { + pRange = (SwXTextRange*)xRangeTunnel->getSomething( + SwXTextRange::getUnoTunnelId()); + pCursor = (OTextCursorHelper*)xRangeTunnel->getSomething( + OTextCursorHelper::getUnoTunnelId()); + } + SwDoc* pDoc = pRange ? (SwDoc*)pRange->GetDoc() : pCursor ? (SwDoc*)pCursor->GetDoc() : 0; + if(pDoc) + { + SwUnoInternalPaM aPam(*pDoc); + //das muss jetzt sal_True liefern + SwXTextRange::XTextRangeToSwPaM(aPam, xTextRange); + + UnoActionContext aCont(pDoc); + SwTxtAttr* pTxtAttr = 0; + pDoc->DeleteAndJoin(aPam); + aPam.DeleteMark(); + SwFmtFtn aFootNote(m_bIsEndnote); + if(m_sLabel.Len()) + aFootNote.SetNumStr(m_sLabel); + SfxItemSet aSet(pDoc->GetAttrPool(), RES_TXTATR_FTN, RES_TXTATR_FTN, 0L); + aSet.Put(aFootNote); + SwXTextCursor::SetCrsrAttr(aPam, aSet, 0); + + pTxtAttr = aPam.GetNode()->GetTxtNode()->GetTxtAttr( + aPam.GetPoint()->nContent.GetIndex()-1, RES_TXTATR_FTN ); + + if(pTxtAttr) + { + const SwFmtFtn& rFtn = pTxtAttr->GetFtn(); + pFmtFtn = &rFtn; + pDoc->GetUnoCallBack()->Add(this); + //force creation of sequence id - is used for references + if(pDoc->IsInReading()) + ((SwTxtFtn*)pTxtAttr)->SetSeqNo(pDoc->GetFtnIdxs().Count()); + else + ((SwTxtFtn*)pTxtAttr)->SetSeqRefNo(); + } + m_bIsDescriptor = sal_False; + SetDoc(pDoc); + } + else + throw lang::IllegalArgumentException(); +} +/*-- 10.12.98 15:31:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::attach(const uno::Reference< text::XTextRange > & xTextRange) + throw( lang::IllegalArgumentException, uno::RuntimeException ) +{ + SolarMutexGuard aGuard; + attachToRange( xTextRange ); +} +/*-- 10.12.98 15:31:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< text::XTextRange > SwXFootnote::getAnchor(void) throw( uno::RuntimeException ) +{ + SolarMutexGuard aGuard; + uno::Reference< text::XTextRange > aRef; + const SwFmtFtn* pFmt = FindFmt(); + if(pFmt) + { + const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn(); + SwPosition aPos( pTxtFtn->GetTxtNode() ); + aRef = SwXTextRange::CreateTextRangeFromPosition((SwDoc*)GetDoc(), aPos, 0); + } + else + throw uno::RuntimeException(); + return aRef; +} +/*-- 10.12.98 15:31:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::dispose(void) throw( uno::RuntimeException ) +{ + SolarMutexGuard aGuard; + const SwFmtFtn* pFmt = FindFmt(); + if(pFmt) + { + const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn(); + DBG_ASSERT(pTxtFtn, "kein TextNode?"); + SwTxtNode& rTxtNode = (SwTxtNode&)pTxtFtn->GetTxtNode(); + xub_StrLen nPos = *pTxtFtn->GetStart(); + SwPaM aPam(rTxtNode, nPos, rTxtNode, nPos+1 ); + GetDoc()->DeleteAndJoin( aPam ); + } + else + throw uno::RuntimeException(); + +} +/*-- 10.12.98 15:31:49--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException ) +{ + if(!GetRegisteredIn()) + throw uno::RuntimeException(); + aLstnrCntnr.AddListener(aListener); +} +/*-- 10.12.98 15:31:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException ) +{ + if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener)) + throw uno::RuntimeException(); +} +/* -----------------06.05.99 15:31------------------- + * + * --------------------------------------------------*/ +const SwStartNode *SwXFootnote::GetStartNode() const +{ + const SwStartNode *pSttNd = 0; + const SwFmtFtn* pFmt = FindFmt(); + if(pFmt) + { + const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn(); + if( pTxtFtn ) + pSttNd = pTxtFtn->GetStartNode()->GetNode().GetStartNode(); + } + return pSttNd; +} + +uno::Reference< text::XTextCursor > SwXFootnote::createCursor() throw ( ::com::sun::star::uno::RuntimeException) +{ + return createTextCursor(); +} +/*-- 10.12.98 15:31:50--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< text::XTextCursor > SwXFootnote::createTextCursor(void) throw( uno::RuntimeException ) +{ + SolarMutexGuard aGuard; + uno::Reference< text::XTextCursor > aRef; + const SwFmtFtn* pFmt = FindFmt(); + if(pFmt) + { + const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn(); + SwPosition aPos( *pTxtFtn->GetStartNode() ); + SwXTextCursor* pXCrsr = new SwXTextCursor(this, aPos, CURSOR_FOOTNOTE, GetDoc()); + aRef = (text::XWordCursor*)pXCrsr; + SwUnoCrsr* pUnoCrsr = pXCrsr->GetCrsr(); + pUnoCrsr->Move(fnMoveForward, fnGoNode); + } + else + throw uno::RuntimeException(); + return aRef; +} +/*-- 10.12.98 15:31:51--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< text::XTextCursor > SwXFootnote::createTextCursorByRange( + const uno::Reference< text::XTextRange > & aTextPosition) + throw( uno::RuntimeException ) +{ + SolarMutexGuard aGuard; + const SwFmtFtn* pFmt = FindFmt(); + uno::Reference< text::XTextCursor > aRef; + SwUnoInternalPaM aPam(*GetDoc()); + if(pFmt && SwXTextRange::XTextRangeToSwPaM(aPam, aTextPosition)) + { + const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn(); + + // skip section nodes to find 'true' start node + const SwNode* pStart = aPam.GetNode()->FindFootnoteStartNode(); + while( pStart->IsSectionNode() ) + pStart = pStart->FindStartNode(); + + if( pStart == &pTxtFtn->GetStartNode()->GetNode()) + aRef = (text::XWordCursor*)new SwXTextCursor(this , *aPam.GetPoint(), CURSOR_FOOTNOTE, GetDoc(), aPam.GetMark()); + } + else + throw uno::RuntimeException(); + return aRef; +} +/*-- 13.06.00 14:28:23--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Reference< XEnumeration > SwXFootnote::createEnumeration() throw( RuntimeException ) +{ + SolarMutexGuard aGuard; + uno::Reference< container::XEnumeration > aRef; + uno::XInterface* pRet = 0; + const SwFmtFtn* pFmt = FindFmt(); + if(pFmt) + { + const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn(); + SwPosition aPos( *pTxtFtn->GetStartNode() ); + SwXTextCursor* pXCrsr = new SwXTextCursor(this, aPos, CURSOR_FOOTNOTE, GetDoc()); + SwUnoCrsr* pUnoCrsr = pXCrsr->GetCrsr(); + pUnoCrsr->Move(fnMoveForward, fnGoNode); + aRef = new SwXParagraphEnumeration(this, pUnoCrsr, CURSOR_FOOTNOTE); + } + return aRef; +} +/*-- 13.06.00 14:28:24--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Type SwXFootnote::getElementType( ) throw(RuntimeException) +{ + return ::getCppuType((Reference<XTextRange>*)0); +} +/*-- 13.06.00 14:28:24--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwXFootnote::hasElements( ) throw(RuntimeException) +{ + return sal_True; +} +/* -----------------------------07.01.00 12:39-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwXFootnote::Invalidate() +{ + if(GetRegisteredIn()) + { + ((SwModify*)GetRegisteredIn())->Remove(this); + pFmtFtn = 0; + aLstnrCntnr.Disposing(); + SetDoc(0); + } +} +/* -----------------18.01.99 09:12------------------- + * + * --------------------------------------------------*/ +void SwXFootnote::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew) +{ + switch( pOld ? pOld->Which() : 0 ) + { + case RES_REMOVE_UNO_OBJECT: + case RES_OBJECTDYING: + if( (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject ) + Invalidate(); + 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() ) + Invalidate(); + break; + case RES_FOOTNOTE_DELETED: + if( (void*)pFmtFtn == ((SwPtrMsgPoolItem *)pOld)->pObject ) + Invalidate(); + break; + } +} +/*-- 11.09.00 13:12:03--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Reference< XPropertySetInfo > SwXFootnote::getPropertySetInfo( ) + throw(RuntimeException) +{ + static uno::Reference< beans::XPropertySetInfo > xRef = + new SfxItemPropertySetInfo(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_FOOTNOTE)); + return xRef; +} +/*-- 11.09.00 13:12:04--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::setPropertyValue( const ::rtl::OUString&, + const Any& ) + throw(UnknownPropertyException, PropertyVetoException, + IllegalArgumentException, WrappedTargetException, RuntimeException) +{ + //no values to be set + throw IllegalArgumentException(); +} +/*-- 11.09.00 13:12:04--------------------------------------------------- + + -----------------------------------------------------------------------*/ +Any SwXFootnote::getPropertyValue( const OUString& rPropertyName ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ + SolarMutexGuard aGuard; + Any aRet; + if(!SwXParagraph::getDefaultTextContentValue(aRet, rPropertyName)) + { + if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_START_REDLINE))|| + rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_END_REDLINE))) + { + //redline can only be returned if it's a living object + if(!m_bIsDescriptor) + aRet = SwXText::getPropertyValue(rPropertyName); + } + else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_REFERENCE_ID))) + { + const SwFmtFtn* pFmt = FindFmt(); + if(pFmt) + { + const SwTxtFtn* pTxtFtn = pFmt->GetTxtFtn(); + DBG_ASSERT(pTxtFtn, "no TextNode?"); + aRet <<= (sal_Int16)pTxtFtn->GetSeqRefNo(); + } + } + else + { + UnknownPropertyException aExcept; + aExcept.Message = rPropertyName; + throw aExcept; + } + } + return aRet; +} +/*-- 11.09.00 13:12:04--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::addPropertyChangeListener( const OUString& aPropertyName, + const Reference< XPropertyChangeListener >& xListener ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ +} +/*-- 11.09.00 13:12:04--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::removePropertyChangeListener( const OUString& aPropertyName, + const Reference< XPropertyChangeListener >& aListener ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ +} +/*-- 11.09.00 13:12:04--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::addVetoableChangeListener( const OUString& PropertyName, + const Reference< XVetoableChangeListener >& aListener ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ +} +/*-- 11.09.00 13:12:05--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwXFootnote::removeVetoableChangeListener( const OUString& PropertyName, + const Reference< XVetoableChangeListener >& aListener ) + throw(UnknownPropertyException, WrappedTargetException, RuntimeException) +{ +} + + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |