summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMichael Stahl <mst@openoffice.org>2010-01-08 17:13:57 +0100
committerMichael Stahl <mst@openoffice.org>2010-01-08 17:13:57 +0100
commit069dead98a0b185ff521a31ed26dd81d98a91b7c (patch)
tree99c48e7750526f6b77d7f2a22389dcbe795f3e85 /sw
parent3356582b67bb91d6d438cbf356527a928070d7fa (diff)
swunolocking1: #i105557#: fix locking for SwXHeadFootText:
add Impl struct, and use UnoImplPtr to lock destructor. move all implementation details out of header, into Impl struct. replace broken SwClient iteration with a WeakReference in SwFrmFmt. make constructor protected, and add factory function CreateXHeadFootText. use new XUnoTunnel and XServiceInfo helpers. clean up the implementation a little.
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/unotextbodyhf.hxx18
-rw-r--r--sw/source/core/layout/atrfrm.cxx3
-rw-r--r--sw/source/core/unocore/unoobj2.cxx13
-rw-r--r--sw/source/core/unocore/unostyle.cxx53
-rw-r--r--sw/source/core/unocore/unotext.cxx331
5 files changed, 242 insertions, 176 deletions
diff --git a/sw/inc/unotextbodyhf.hxx b/sw/inc/unotextbodyhf.hxx
index 15c38044e4ff..8fd4e8c2a442 100644
--- a/sw/inc/unotextbodyhf.hxx
+++ b/sw/inc/unotextbodyhf.hxx
@@ -38,8 +38,6 @@
#include <cppuhelper/implbase2.hxx>
-#include <calbck.hxx>
-#include <unoevtlstnr.hxx>
#include <unotext.hxx>
@@ -136,13 +134,12 @@ typedef ::cppu::WeakImplHelper2
class SwXHeadFootText
: public SwXHeadFootText_Base
, public SwXText
- , public SwClient
{
private:
- SwFrmFmt* GetFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }
- BOOL bIsHeader;
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
protected:
@@ -154,14 +151,13 @@ protected:
virtual ~SwXHeadFootText();
-public:
-
- SwXHeadFootText(SwFrmFmt& rHeadFootFmt, BOOL bHeader);
+ SwXHeadFootText(SwFrmFmt & rHeadFootFmt, const bool bIsHeader);
- TYPEINFO();
+public:
- // SwClient
- virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew);
+ static ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >
+ CreateXHeadFootText(SwFrmFmt & rHeadFootFmt, const bool bIsHeader);
+ static bool IsXHeadFootText(SwClient *const pClient);
// XInterface
virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx
index 061826e764f0..9ed5687b075a 100644
--- a/sw/source/core/layout/atrfrm.cxx
+++ b/sw/source/core/layout/atrfrm.cxx
@@ -198,7 +198,8 @@ void DelHFFormat( SwClient *pToRemove, SwFrmFmt *pFmt )
SwClient *pLast = aIter.GoStart();
if( pLast )
do {
- bDel = pLast->IsA( TYPE(SwFrm) )|| pLast->IsA(TYPE(SwXHeadFootText));
+ bDel = pLast->IsA( TYPE(SwFrm) )
+ || SwXHeadFootText::IsXHeadFootText(pLast);
} while( bDel && 0 != ( pLast = aIter++ ));
}
diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx
index 857638d872dc..918ab49d45f0 100644
--- a/sw/source/core/unocore/unoobj2.cxx
+++ b/sw/source/core/unocore/unoobj2.cxx
@@ -1317,17 +1317,10 @@ CreateParentXText(SwDoc & rDoc, const SwPosition& rPos)
pHeadFootFmt);
}
- if(pHeadFootFmt)
+ if (pHeadFootFmt)
{
- SwXHeadFootText* pxHdFt = (SwXHeadFootText*)SwClientIter( *pHeadFootFmt ).
- First( TYPE( SwXHeadFootText ));
- xParentText = pxHdFt;
- if(!pxHdFt)
- {
- xParentText =
- new SwXHeadFootText(*pHeadFootFmt, bHeader);
- }
- break;
+ xParentText = SwXHeadFootText::CreateXHeadFootText(
+ *pHeadFootFmt, bHeader);
}
}
}
diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx
index 1866613e8ab0..940c454b7401 100644
--- a/sw/source/core/unocore/unostyle.cxx
+++ b/sw/source/core/unocore/unostyle.cxx
@@ -3436,6 +3436,29 @@ void SwXPageStyle::setPropertyValues(
/* -----------------------------04.11.03 13:50--------------------------------
---------------------------------------------------------------------------*/
+static uno::Reference<text::XText>
+lcl_makeHeaderFooter(
+ const sal_uInt16 nRes, const bool bHeader, SwFrmFmt const*const pFrmFmt)
+{
+ if (!pFrmFmt) { return 0; }
+
+ const SfxItemSet& rSet = pFrmFmt->GetAttrSet();
+ const SfxPoolItem* pItem;
+ if (SFX_ITEM_SET == rSet.GetItemState(nRes, sal_True, &pItem))
+ {
+ SwFrmFmt *const pHeadFootFmt = (bHeader)
+ ? static_cast<SwFmtHeader*>(const_cast<SfxPoolItem*>(pItem))->
+ GetHeaderFmt()
+ : static_cast<SwFmtFooter*>(const_cast<SfxPoolItem*>(pItem))->
+ GetFooterFmt();
+ if (pHeadFootFmt)
+ {
+ return SwXHeadFootText::CreateXHeadFootText(*pHeadFootFmt, bHeader);
+ }
+ }
+ return 0;
+}
+
uno::Sequence< uno::Any > SAL_CALL SwXPageStyle::GetPropertyValues_Impl(
const uno::Sequence< OUString >& rPropertyNames )
throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
@@ -3468,7 +3491,8 @@ uno::Sequence< uno::Any > SAL_CALL SwXPageStyle::GetPropertyValues_Impl(
GetBasePool()->SetSearchMask(GetFamily(), nSaveMask );
}
sal_uInt16 nRes = 0;
- sal_Bool bHeader = sal_False, bAll = sal_False, bLeft = sal_False, bRight = sal_False;
+ bool bHeader = false;
+ sal_Bool bAll = sal_False, bLeft = sal_False, bRight = sal_False;
switch(pEntry->nWID)
{
case FN_UNO_HEADER_ON:
@@ -3574,7 +3598,7 @@ uno::Sequence< uno::Any > SAL_CALL SwXPageStyle::GetPropertyValues_Impl(
case FN_UNO_HEADER_RIGHT :
bRight = sal_True; goto Header;
Header:
- bHeader = sal_True;
+ bHeader = true;
nRes = RES_HEADER; goto MakeObject;
case FN_UNO_FOOTER :
bAll = sal_True; goto Footer;
@@ -3595,27 +3619,18 @@ MakeObject:
// TextRight does the same as Text and is for
// comptability only.
if( bLeft && !bShare )
+ {
pFrmFmt = &rDesc.GetLeft();
+ }
else
+ {
pFrmFmt = &rDesc.GetMaster();
- if(pFrmFmt)
+ }
+ const uno::Reference< text::XText > xRet =
+ lcl_makeHeaderFooter(nRes, bHeader, pFrmFmt);
+ if (xRet.is())
{
- const SfxItemSet& rSet = pFrmFmt->GetAttrSet();
- const SfxPoolItem* pItem;
- SwFrmFmt* pHeadFootFmt;
- if(SFX_ITEM_SET == rSet.GetItemState(nRes, sal_True, &pItem) &&
- 0 != (pHeadFootFmt = bHeader ?
- ((SwFmtHeader*)pItem)->GetHeaderFmt() :
- ((SwFmtFooter*)pItem)->GetFooterFmt()))
- {
- // gibt es schon ein Objekt dafuer?
- SwXHeadFootText* pxHdFt = (SwXHeadFootText*)SwClientIter( *pHeadFootFmt ).
- First( TYPE( SwXHeadFootText ));
- uno::Reference< text::XText > xRet = pxHdFt;
- if(!pxHdFt)
- xRet = new SwXHeadFootText(*pHeadFootFmt, bHeader);
- pRet[nProp].setValue(&xRet, ::getCppuType((uno::Reference<text::XText>*)0));
- }
+ pRet[nProp] <<= xRet;
}
}
break;
diff --git a/sw/source/core/unocore/unotext.cxx b/sw/source/core/unocore/unotext.cxx
index 03bdaba7e6c4..4fb2a861be21 100644
--- a/sw/source/core/unocore/unotext.cxx
+++ b/sw/source/core/unocore/unotext.cxx
@@ -2613,60 +2613,136 @@ SwXBodyText::hasElements() throw (uno::RuntimeException)
/******************************************************************
* SwXHeadFootText
******************************************************************/
-TYPEINIT1(SwXHeadFootText, SwClient);
-/* -----------------------------06.04.00 16:40--------------------------------
- ---------------------------------------------------------------------------*/
-OUString SwXHeadFootText::getImplementationName(void) throw( uno::RuntimeException )
+class SwXHeadFootText::Impl
+ : public SwClient
{
- return C2U("SwXHeadFootText");
+
+public:
+
+ bool m_bIsHeader;
+
+ Impl( SwXHeadFootText & /*rThis*/,
+ SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
+ : SwClient(& rHeadFootFmt)
+ , m_bIsHeader(bIsHeader)
+ {
+ }
+
+ SwFrmFmt * GetHeadFootFmt() const {
+ return static_cast<SwFrmFmt*>(
+ const_cast<SwModify*>(GetRegisteredIn()));
+ }
+
+ SwFrmFmt & GetHeadFootFmtOrThrow() {
+ SwFrmFmt *const pFmt( GetHeadFootFmt() );
+ if (!pFmt) {
+ throw uno::RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM(
+ "SwXHeadFootText: disposed or invalid")), 0);
+ }
+ return *pFmt;
+ }
+
+ // SwClient
+ virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew);
+
+};
+
+/*-- 11.12.98 10:14:51---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXHeadFootText::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
}
-/* -----------------------------06.04.00 16:40--------------------------------
- ---------------------------------------------------------------------------*/
-BOOL SwXHeadFootText::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+bool SwXHeadFootText::IsXHeadFootText(SwClient *const pClient)
{
- return C2U("com.sun.star.text.Text") == rServiceName;
+ return 0 != dynamic_cast<SwXHeadFootText::Impl*>(pClient);
}
-/* -----------------------------06.04.00 16:40--------------------------------
- ---------------------------------------------------------------------------*/
-uno::Sequence< OUString > SwXHeadFootText::getSupportedServiceNames(void) throw( uno::RuntimeException )
+uno::Reference< text::XText >
+SwXHeadFootText::CreateXHeadFootText(
+ SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
{
- uno::Sequence< OUString > aRet(1);
- OUString* pArray = aRet.getArray();
- pArray[0] = C2U("com.sun.star.text.Text");
- return aRet;
+ // re-use existing SwXHeadFootText
+ // #i105557#: do not iterate over the registered clients: race condition
+ uno::Reference< text::XText > xText(rHeadFootFmt.GetXObject(),
+ uno::UNO_QUERY);
+ if (!xText.is())
+ {
+ SwXHeadFootText *const pXHFT(
+ new SwXHeadFootText(rHeadFootFmt, bIsHeader));
+ xText.set(pXHFT);
+ rHeadFootFmt.SetXObject(xText);
+ }
+ return xText;
}
+
/*-- 11.12.98 10:14:48---------------------------------------------------
-----------------------------------------------------------------------*/
-SwXHeadFootText::SwXHeadFootText(SwFrmFmt& rHeadFootFmt, BOOL bHeader) :
- SwXText(rHeadFootFmt.GetDoc(), bHeader ? CURSOR_HEADER : CURSOR_FOOTER),
- SwClient(&rHeadFootFmt),
- bIsHeader(bHeader)
+SwXHeadFootText::SwXHeadFootText(SwFrmFmt & rHeadFootFmt, const bool bIsHeader)
+ : SwXText(rHeadFootFmt.GetDoc(),
+ (bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER)
+ , m_pImpl( new SwXHeadFootText::Impl(*this, rHeadFootFmt, bIsHeader) )
{
-
}
+
/*-- 11.12.98 10:14:48---------------------------------------------------
-----------------------------------------------------------------------*/
SwXHeadFootText::~SwXHeadFootText()
{
+}
+
+/* -----------------------------06.04.00 16:40--------------------------------
+
+ ---------------------------------------------------------------------------*/
+OUString SAL_CALL
+SwXHeadFootText::getImplementationName() throw (uno::RuntimeException)
+{
+ return C2U("SwXHeadFootText");
+}
+
+/* -----------------------------06.04.00 16:40--------------------------------
+
+ ---------------------------------------------------------------------------*/
+static char const*const g_ServicesHeadFootText[] =
+{
+ "com.sun.star.text.Text",
+};
+static const size_t g_nServicesHeadFootText(
+ sizeof(g_ServicesHeadFootText)/sizeof(g_ServicesHeadFootText[0]));
+
+sal_Bool SAL_CALL SwXHeadFootText::supportsService(const OUString& rServiceName)
+throw (uno::RuntimeException)
+{
+ return ::sw::SupportsServiceImpl(
+ g_nServicesHeadFootText, g_ServicesHeadFootText, rServiceName);
+}
+uno::Sequence< OUString > SAL_CALL
+SwXHeadFootText::getSupportedServiceNames() throw (uno::RuntimeException)
+{
+ return ::sw::GetSupportedServiceNamesImpl(
+ g_nServicesHeadFootText, g_ServicesHeadFootText);
}
+
/*-- 11.12.98 10:14:49---------------------------------------------------
-----------------------------------------------------------------------*/
const SwStartNode *SwXHeadFootText::GetStartNode() const
{
const SwStartNode *pSttNd = 0;
- SwFrmFmt* pHeadFootFmt = GetFmt();
+ SwFrmFmt *const pHeadFootFmt = m_pImpl->GetHeadFootFmt();
if(pHeadFootFmt)
{
const SwFmtCntnt& rFlyCntnt = pHeadFootFmt->GetCntnt();
if( rFlyCntnt.GetCntntIdx() )
+ {
pSttNd = rFlyCntnt.GetCntntIdx()->GetNode().GetStartNode();
+ }
}
return pSttNd;
}
@@ -2679,28 +2755,19 @@ SwXHeadFootText::CreateCursor() throw (uno::RuntimeException)
/* -----------------------------21.03.00 15:39--------------------------------
---------------------------------------------------------------------------*/
-uno::Sequence< uno::Type > SwXHeadFootText::getTypes( ) throw(uno::RuntimeException)
+uno::Sequence< uno::Type > SAL_CALL
+SwXHeadFootText::getTypes() throw (uno::RuntimeException)
{
- uno::Sequence< uno::Type > aHFTypes = SwXHeadFootText_Base::getTypes();
- uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
-
- long nIndex = aHFTypes.getLength();
- aHFTypes.realloc(
- aHFTypes.getLength() +
- aTextTypes.getLength());
-
- uno::Type* pHFTypes = aHFTypes.getArray();
- const uno::Type* pTextTypes = aTextTypes.getConstArray();
- for(long nPos = 0; nPos < aTextTypes.getLength(); nPos++)
- pHFTypes[nIndex++] = pTextTypes[nPos];
-
- return aHFTypes;
+ const uno::Sequence< uno::Type > aTypes = SwXHeadFootText_Base::getTypes();
+ const uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
+ return ::comphelper::concatSequences(aTypes, aTextTypes);
}
/* -----------------------------21.03.00 15:39--------------------------------
---------------------------------------------------------------------------*/
-uno::Sequence< sal_Int8 > SwXHeadFootText::getImplementationId( ) throw(uno::RuntimeException)
+uno::Sequence< sal_Int8 > SAL_CALL
+SwXHeadFootText::getImplementationId() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
static uno::Sequence< sal_Int8 > aId( 16 );
@@ -2715,7 +2782,8 @@ uno::Sequence< sal_Int8 > SwXHeadFootText::getImplementationId( ) throw(uno::Ru
/* -----------------------------21.03.00 15:46--------------------------------
---------------------------------------------------------------------------*/
-uno::Any SwXHeadFootText::queryInterface(const uno::Type& rType)
+uno::Any SAL_CALL
+SwXHeadFootText::queryInterface(const uno::Type& rType)
throw (uno::RuntimeException)
{
const uno::Any ret = SwXHeadFootText_Base::queryInterface(rType);
@@ -2727,135 +2795,128 @@ throw (uno::RuntimeException)
/*-- 11.12.98 10:14:50---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextCursor > SwXHeadFootText::createTextCursor(void) throw( uno::RuntimeException )
+uno::Reference< text::XTextCursor > SAL_CALL
+SwXHeadFootText::createTextCursor() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > xRet;
- SwFrmFmt* pHeadFootFmt = GetFmt();
- if(pHeadFootFmt)
- {
- const SwFmtCntnt& rFlyCntnt = pHeadFootFmt->GetCntnt();
- const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
- SwPosition aPos(rNode);
- SwXTextCursor *const pXCursor = new SwXTextCursor(*GetDoc(), this,
- (bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER, aPos);
- SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
- pUnoCrsr->Move(fnMoveForward, fnGoNode);
-
- //save current start node to be able to check if there is content after the table -
- //otherwise the cursor would be in the body text!
-
- const SwStartNode* pOwnStartNode = rNode.FindSttNodeByType(
- bIsHeader ? SwHeaderStartNode : SwFooterStartNode);
- //steht hier eine Tabelle?
- 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* pNewStartNode = pUnoCrsr->GetNode()->FindSttNodeByType(
- bIsHeader ? SwHeaderStartNode : SwFooterStartNode);
- if(!pNewStartNode || pNewStartNode != pOwnStartNode)
- {
- uno::RuntimeException aExcept;
- aExcept.Message = S2U("no text available");
- throw aExcept;
- }
- xRet = static_cast<text::XWordCursor*>(pXCursor);
- }
- else
- {
- uno::RuntimeException aRuntime;
- aRuntime.Message = C2U(cInvalidObject);
- throw aRuntime;
+
+ SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
+
+ uno::Reference< text::XTextCursor > xRet;
+ const SwFmtCntnt& rFlyCntnt = rHeadFootFmt.GetCntnt();
+ const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
+ SwPosition aPos(rNode);
+ SwXTextCursor *const pXCursor = new SwXTextCursor(*GetDoc(), this,
+ (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER, aPos);
+ SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
+ pUnoCrsr->Move(fnMoveForward, fnGoNode);
+
+ // save current start node to be able to check if there is content
+ // after the table - otherwise the cursor would be in the body text!
+ SwStartNode const*const pOwnStartNode = rNode.FindSttNodeByType(
+ (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
+ // is there a table here?
+ 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);
+ }
+ SwStartNode const*const pNewStartNode =
+ pUnoCrsr->GetNode()->FindSttNodeByType(
+ (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
+ if (!pNewStartNode || (pNewStartNode != pOwnStartNode))
+ {
+ uno::RuntimeException aExcept;
+ aExcept.Message = S2U("no text available");
+ throw aExcept;
}
+ xRet = static_cast<text::XWordCursor*>(pXCursor);
return xRet;
}
+
/*-- 11.12.98 10:14:50---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextCursor > SwXHeadFootText::createTextCursorByRange(
- const uno::Reference< text::XTextRange > & aTextPosition) throw( uno::RuntimeException )
+uno::Reference< text::XTextCursor > SAL_CALL
+SwXHeadFootText::createTextCursorByRange(
+ const uno::Reference< text::XTextRange > & xTextPosition)
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextCursor > xRet;
- SwFrmFmt* pHeadFootFmt = GetFmt();
+
+ SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
+
SwUnoInternalPaM aPam(*GetDoc());
- if (pHeadFootFmt && ::sw::XTextRangeToSwPaM(aPam, aTextPosition))
+ if (!::sw::XTextRangeToSwPaM(aPam, xTextPosition))
{
- SwNode& rNode = pHeadFootFmt->GetCntnt().GetCntntIdx()->GetNode();
- SwPosition aPos(rNode);
- SwPaM aHFPam(aPos);
- aHFPam.Move(fnMoveForward, fnGoNode);
- SwStartNode* pOwnStartNode = aHFPam.GetNode()->FindSttNodeByType(
- bIsHeader ? SwHeaderStartNode : SwFooterStartNode);
- SwStartNode* p1 = aPam.GetNode()->FindSttNodeByType(
- bIsHeader ? SwHeaderStartNode : SwFooterStartNode);
- if(p1 == pOwnStartNode)
- {
- xRet = static_cast<text::XWordCursor*>(
- new SwXTextCursor(*GetDoc(), this,
- (bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER,
- *aPam.GetPoint(), aPam.GetMark()));
- }
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U(cInvalidObject);
+ throw aRuntime;
+ }
+
+ uno::Reference< text::XTextCursor > xRet;
+ SwNode& rNode = rHeadFootFmt.GetCntnt().GetCntntIdx()->GetNode();
+ SwPosition aPos(rNode);
+ SwPaM aHFPam(aPos);
+ aHFPam.Move(fnMoveForward, fnGoNode);
+ SwStartNode *const pOwnStartNode = aHFPam.GetNode()->FindSttNodeByType(
+ (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
+ SwStartNode *const p1 = aPam.GetNode()->FindSttNodeByType(
+ (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode);
+ if (p1 == pOwnStartNode)
+ {
+ xRet = static_cast<text::XWordCursor*>(
+ new SwXTextCursor(*GetDoc(), this,
+ (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER,
+ *aPam.GetPoint(), aPam.GetMark()));
}
return xRet;
}
+
/* -----------------19.03.99 15:44-------------------
*
* --------------------------------------------------*/
-uno::Reference< container::XEnumeration > SwXHeadFootText::createEnumeration(void)
- throw( uno::RuntimeException )
+uno::Reference< container::XEnumeration > SAL_CALL
+SwXHeadFootText::createEnumeration()
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
+
+ SwFrmFmt & rHeadFootFmt( m_pImpl->GetHeadFootFmtOrThrow() );
+
uno::Reference< container::XEnumeration > aRef;
- //wenn this ungueltig ist, dann kommt die uno::Exception aus createTextCursor()
- SwFrmFmt* pHeadFootFmt = GetFmt();
- if(pHeadFootFmt)
- {
- const SwFmtCntnt& rFlyCntnt = pHeadFootFmt->GetCntnt();
- const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
- SwPosition aPos(rNode);
- ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
- GetDoc()->CreateUnoCrsr(aPos, sal_False));
- pUnoCursor->Move(fnMoveForward, fnGoNode);
- aRef = new SwXParagraphEnumeration(this, pUnoCursor,
- (bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER);
- }
- else
- {
- uno::RuntimeException aRuntime;
- aRuntime.Message = C2U(cInvalidObject);
- throw aRuntime;
- }
+ const SwFmtCntnt& rFlyCntnt = rHeadFootFmt.GetCntnt();
+ const SwNode& rNode = rFlyCntnt.GetCntntIdx()->GetNode();
+ SwPosition aPos(rNode);
+ ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
+ GetDoc()->CreateUnoCrsr(aPos, sal_False));
+ pUnoCursor->Move(fnMoveForward, fnGoNode);
+ aRef = new SwXParagraphEnumeration(this, pUnoCursor,
+ (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER);
return aRef;
}
+
/* -----------------19.03.99 15:50-------------------
*
* --------------------------------------------------*/
-uno::Type SwXHeadFootText::getElementType(void) throw( uno::RuntimeException )
+uno::Type SAL_CALL
+SwXHeadFootText::getElementType() throw (uno::RuntimeException)
{
- return ::getCppuType((uno::Reference<text::XTextRange>*)0);
+ return text::XTextRange::static_type();
}
/* -----------------19.03.99 15:50-------------------
*
* --------------------------------------------------*/
-sal_Bool SwXHeadFootText::hasElements(void) throw( uno::RuntimeException )
+sal_Bool SAL_CALL SwXHeadFootText::hasElements() throw (uno::RuntimeException)
{
return sal_True;
}
-/*-- 11.12.98 10:14:51---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-void SwXHeadFootText::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
-{
- ClientModify( this, pOld, pNew);
-}
-