summaryrefslogtreecommitdiff
path: root/sw/source/core/unocore/unorefmk.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/unocore/unorefmk.cxx')
-rw-r--r--sw/source/core/unocore/unorefmk.cxx861
1 files changed, 509 insertions, 352 deletions
diff --git a/sw/source/core/unocore/unorefmk.cxx b/sw/source/core/unocore/unorefmk.cxx
index 6fc3873db49c..7acabb196e22 100644
--- a/sw/source/core/unocore/unorefmk.cxx
+++ b/sw/source/core/unocore/unorefmk.cxx
@@ -31,18 +31,23 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
-
#include <vos/mutex.hxx>
#include <vcl/svapp.hxx>
-#include <unoobj.hxx>
+
+#include <unomid.h>
+#include <unotextrange.hxx>
+#include <unorefmark.hxx>
+#include <unotextcursor.hxx>
#include <unomap.hxx>
#include <unocrsr.hxx>
+#include <unoevtlstnr.hxx>
#include <doc.hxx>
#include <ndtxt.hxx>
#include <fmtrfmrk.hxx>
#include <txtrfmrk.hxx>
#include <hints.hxx>
+
using namespace ::com::sun::star;
using ::rtl::OUString;
@@ -50,81 +55,191 @@ using ::rtl::OUString;
* SwXReferenceMark
******************************************************************/
-/* -----------------------------13.03.00 12:15--------------------------------
+class SwXReferenceMark::Impl
+ : public SwClient
+{
+
+public:
+ SwEventListenerContainer m_ListenerContainer;
+ bool m_bIsDescriptor;
+ SwDoc * m_pDoc;
+ const SwFmtRefMark * m_pMarkFmt;
+ ::rtl::OUString m_sMarkName;
+
+ Impl( SwXReferenceMark & rThis,
+ SwDoc *const pDoc, SwFmtRefMark const*const pRefMark)
+ : SwClient((pDoc) ? pDoc->GetUnoCallBack() : 0)
+ , m_ListenerContainer(static_cast< ::cppu::OWeakObject* >(&rThis))
+ , m_bIsDescriptor(0 == pRefMark)
+ , m_pDoc(pDoc)
+ , m_pMarkFmt(pRefMark)
+ {
+ if (pRefMark)
+ {
+ m_sMarkName = pRefMark->GetRefName();
+ }
+ }
+
+ bool IsValid() const { return 0 != GetRegisteredIn(); }
+ void InsertRefMark( SwPaM & rPam, SwXTextCursor const*const pCursor );
+ void Invalidate();
+
+ // SwClient
+ virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew);
+
+};
+
+/* -----------------------------07.01.00 12:51--------------------------------
---------------------------------------------------------------------------*/
-const uno::Sequence< sal_Int8 > & SwXReferenceMark::getUnoTunnelId()
+void SwXReferenceMark::Impl::Invalidate()
{
- static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
- return aSeq;
+ if (IsValid())
+ {
+ const_cast<SwModify*>(GetRegisteredIn())->Remove(this);
+ }
+ m_ListenerContainer.Disposing();
+ m_pDoc = 0;
+ m_pMarkFmt = 0;
}
-/* -----------------------------10.03.00 18:04--------------------------------
- ---------------------------------------------------------------------------*/
-sal_Int64 SAL_CALL SwXReferenceMark::getSomething( const uno::Sequence< sal_Int8 >& rId )
- throw(uno::RuntimeException)
+/*-- 11.12.98 10:28:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXReferenceMark::Impl::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew)
{
- if( rId.getLength() == 16
- && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
- rId.getConstArray(), 16 ) )
+ ClientModify(this, pOld, pNew);
+
+ if (!GetRegisteredIn()) // removed => dispose
{
- return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
+ Invalidate();
}
+ else if (pOld)
+ {
+ switch (pOld->Which())
+ {
+ case RES_REFMARK_DELETED:
+ if (static_cast<const void*>(m_pMarkFmt) ==
+ static_cast<SwPtrMsgPoolItem *>(pOld)->pObject)
+ {
+ Invalidate();
+ }
+ break;
+ }
+ }
+}
+
+
+/*-- 11.12.98 10:28:32---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXReferenceMark::SwXReferenceMark(
+ SwDoc *const pDoc, SwFmtRefMark const*const pRefMark)
+ : m_pImpl( new SwXReferenceMark::Impl(*this, pDoc, pRefMark) )
+{
+}
+
+/*-- 11.12.98 10:28:33---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXReferenceMark::~SwXReferenceMark()
+{
+}
+
+SwXReferenceMark *
+SwXReferenceMark::GetReferenceMark(
+ SwModify const& /*rUnoCB*/, SwFmtRefMark const& /*rMarkFmt*/)
+{
+ // #i105557#: do not iterate over the registered clients: race condition
+ // to do this properly requires the SwXReferenceMark to register at the
+ // SwFmtRefMark directly, not at the unocallback
+#if 0
+ SwClientIter aIter( rUnoCB );
+ SwXReferenceMark::Impl * pXMark =
+ static_cast<SwXReferenceMark::Impl*>(
+ aIter.First( TYPE( SwXReferenceMark::Impl ) ));
+ while (pXMark)
+ {
+ if (pXMark->m_pMarkFmt == &rMarkFmt)
+ {
+ return &pXMark->m_rThis;
+ }
+ pXMark = static_cast<SwXReferenceMark::Impl*>(aIter.Next());
+ }
+#endif
return 0;
}
-/* -----------------------------06.04.00 16:41--------------------------------
+
+SwXReferenceMark *
+SwXReferenceMark::CreateXReferenceMark(
+ SwDoc & rDoc, SwFmtRefMark const& rMarkFmt)
+{
+ SwXReferenceMark *const pXMark(
+ GetReferenceMark(*rDoc.GetUnoCallBack(), rMarkFmt) );
+ return (pXMark)
+ ? pXMark
+ : new SwXReferenceMark(&rDoc, &rMarkFmt);
+}
+
+/* -----------------------------13.03.00 12:15--------------------------------
---------------------------------------------------------------------------*/
-OUString SwXReferenceMark::getImplementationName(void) throw( uno::RuntimeException )
+const uno::Sequence< sal_Int8 > & SwXReferenceMark::getUnoTunnelId()
{
- return C2U("SwXReferenceMark");
+ static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
+ return aSeq;
}
-/* -----------------------------06.04.00 16:41--------------------------------
+/* -----------------------------10.03.00 18:04--------------------------------
---------------------------------------------------------------------------*/
-BOOL SwXReferenceMark::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+sal_Int64 SAL_CALL
+SwXReferenceMark::getSomething(const uno::Sequence< sal_Int8 >& rId)
+throw (uno::RuntimeException)
{
- return !rServiceName.compareToAscii("com.sun.star.text.ReferenceMark")||
- !rServiceName.compareToAscii("com.sun.star.text.TextContent");
+ return ::sw::UnoTunnelImpl<SwXReferenceMark>(rId, this);
}
/* -----------------------------06.04.00 16:41--------------------------------
---------------------------------------------------------------------------*/
-uno::Sequence< OUString > SwXReferenceMark::getSupportedServiceNames(void) throw( uno::RuntimeException )
+OUString SAL_CALL SwXReferenceMark::getImplementationName()
+throw (uno::RuntimeException)
{
- uno::Sequence< OUString > aRet(2);
- OUString* pArray = aRet.getArray();
- pArray[0] = C2U("com.sun.star.text.ReferenceMark");
- pArray[1] = C2U("com.sun.star.text.TextContent");
- return aRet;
+ return C2U("SwXReferenceMark");
}
-/*-- 11.12.98 10:28:32---------------------------------------------------
+/* -----------------------------06.04.00 16:41--------------------------------
- -----------------------------------------------------------------------*/
-TYPEINIT1(SwXReferenceMark, SwClient);
+ ---------------------------------------------------------------------------*/
+static char const*const g_ServicesReferenceMark[] =
+{
+ "com.sun.star.text.TextContent",
+ "com.sun.star.text.ReferenceMark",
+};
+static const size_t g_nServicesReferenceMark(
+ sizeof(g_ServicesReferenceMark)/sizeof(g_ServicesReferenceMark[0]));
-SwXReferenceMark::SwXReferenceMark(SwDoc* pDc, const SwFmtRefMark* pRefMark) :
- aLstnrCntnr( (text::XTextContent*)this),
- pDoc(pDc),
- pMark(pRefMark),
- m_bIsDescriptor(0 == pRefMark)
+sal_Bool SAL_CALL
+SwXReferenceMark::supportsService(const OUString& rServiceName)
+throw (uno::RuntimeException)
{
- if(pRefMark)
- sMarkName = pRefMark->GetRefName();
- if(pDoc)
- pDoc->GetUnoCallBack()->Add(this);
+ return ::sw::SupportsServiceImpl(
+ g_nServicesReferenceMark, g_ServicesReferenceMark, rServiceName);
}
-/*-- 11.12.98 10:28:33---------------------------------------------------
+/* -----------------------------06.04.00 16:41--------------------------------
- -----------------------------------------------------------------------*/
-SwXReferenceMark::~SwXReferenceMark()
+ ---------------------------------------------------------------------------*/
+uno::Sequence< OUString > SAL_CALL
+SwXReferenceMark::getSupportedServiceNames()
+throw (uno::RuntimeException)
{
-
+ return ::sw::GetSupportedServiceNamesImpl(
+ g_nServicesReferenceMark, g_ServicesReferenceMark);
}
+
/* -----------------03.11.99 14:14-------------------
--------------------------------------------------*/
-void SwXReferenceMark::InsertRefMark(SwPaM& rPam, SwXTextCursor * pCursor)
+void SwXReferenceMark::Impl::InsertRefMark(SwPaM& rPam,
+ SwXTextCursor const*const pCursor)
{
//! in some cases when this function is called the pDoc pointer member may have become
//! invalid/deleted thus we obtain the document pointer from rPaM where it should always
@@ -132,12 +247,8 @@ void SwXReferenceMark::InsertRefMark(SwPaM& rPam, SwXTextCursor * pCursor)
SwDoc *pDoc2 = rPam.GetDoc();
UnoActionContext aCont(pDoc2);
- SwTxtAttr* pTxtAttr = 0;
- SwFmtRefMark aRefMark(sMarkName);
-// SfxItemSet aSet(pDoc2->GetAttrPool(), RES_TXTATR_REFMARK, RES_TXTATR_REFMARK, 0L);
-// aSet.Put(aRefMark);
+ SwFmtRefMark aRefMark(m_sMarkName);
sal_Bool bMark = *rPam.GetPoint() != *rPam.GetMark();
-// SwXTextCursor::SetCrsrAttr(rPam, aSet, 0);
const bool bForceExpandHints( (!bMark && pCursor)
? pCursor->IsAtEndOfMeta() : false );
@@ -149,294 +260,314 @@ void SwXReferenceMark::InsertRefMark(SwPaM& rPam, SwXTextCursor * pCursor)
pDoc2->InsertPoolItem( rPam, aRefMark, nInsertFlags );
if( bMark && *rPam.GetPoint() > *rPam.GetMark())
- rPam.Exchange();
-
- if( bMark )
- pTxtAttr = rPam.GetNode()->GetTxtNode()->GetTxtAttr(
- rPam.GetPoint()->nContent, RES_TXTATR_REFMARK );
- else
{
- pTxtAttr = rPam.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
- rPam.GetPoint()->nContent.GetIndex()-1, RES_TXTATR_REFMARK );
+ rPam.Exchange();
}
+ SwTxtAttr *const pTxtAttr = (bMark)
+ ? rPam.GetNode()->GetTxtNode()->GetTxtAttr(
+ rPam.GetPoint()->nContent, RES_TXTATR_REFMARK)
+ : rPam.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
+ rPam.GetPoint()->nContent.GetIndex() - 1, RES_TXTATR_REFMARK);
+
if(pTxtAttr)
- pMark = &pTxtAttr->GetRefMark();
+ {
+ m_pMarkFmt = &pTxtAttr->GetRefMark();
+ }
pDoc2->GetUnoCallBack()->Add(this);
}
-/* -----------------18.02.99 13:33-------------------
- *
- * --------------------------------------------------*/
-void SwXReferenceMark::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
- throw( lang::IllegalArgumentException, uno::RuntimeException )
+/*-- 11.12.98 10:28:34---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SAL_CALL
+SwXReferenceMark::attach(const uno::Reference< text::XTextRange > & xTextRange)
+throw (lang::IllegalArgumentException, uno::RuntimeException)
{
- if(!m_bIsDescriptor)
+ vos::OGuard aGuard(Application::GetSolarMutex());
+
+ if (!m_pImpl->m_bIsDescriptor)
+ {
throw uno::RuntimeException();
+ }
uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
SwXTextRange* pRange = 0;
OTextCursorHelper* pCursor = 0;
if(xRangeTunnel.is())
{
- pRange = reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
- pCursor = reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
+ pRange = ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel);
+ pCursor =
+ ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel);
}
- SwDoc* pDocument = pRange ? (SwDoc*)pRange->GetDoc() : pCursor ? (SwDoc*)pCursor->GetDoc() : 0;
- if(pDocument)
+ SwDoc *const pDocument =
+ (pRange) ? pRange->GetDoc() : ((pCursor) ? pCursor->GetDoc() : 0);
+ if (!pDocument)
{
- SwUnoInternalPaM aPam(*pDocument);
- //das muss jetzt sal_True liefern
- SwXTextRange::XTextRangeToSwPaM(aPam, xTextRange);
- InsertRefMark(aPam, dynamic_cast<SwXTextCursor*>(pCursor));
- m_bIsDescriptor = sal_False;
- pDoc = pDocument;
- pDoc->GetUnoCallBack()->Add(this);
- }
- else
throw lang::IllegalArgumentException();
-}
-/*-- 11.12.98 10:28:34---------------------------------------------------
+ }
- -----------------------------------------------------------------------*/
-void SwXReferenceMark::attach(const uno::Reference< text::XTextRange > & xTextRange)
- throw( lang::IllegalArgumentException, uno::RuntimeException )
-{
- vos::OGuard aGuard(Application::GetSolarMutex());
- attachToRange( xTextRange );
+ SwUnoInternalPaM aPam(*pDocument);
+ //das muss jetzt sal_True liefern
+ ::sw::XTextRangeToSwPaM(aPam, xTextRange);
+ m_pImpl->InsertRefMark(aPam, dynamic_cast<SwXTextCursor*>(pCursor));
+ m_pImpl->m_bIsDescriptor = sal_False;
+ m_pImpl->m_pDoc = pDocument;
+ m_pImpl->m_pDoc->GetUnoCallBack()->Add(m_pImpl.get());
}
+
/*-- 11.12.98 10:28:34---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< text::XTextRange > SwXReferenceMark::getAnchor(void) throw( uno::RuntimeException )
+uno::Reference< text::XTextRange > SAL_CALL
+SwXReferenceMark::getAnchor() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- uno::Reference< text::XTextRange > xRet;
- if(IsValid())
+
+ if (m_pImpl->IsValid())
{
- const SwFmtRefMark* pNewMark = pDoc->GetRefMark(sMarkName);
- if(pNewMark && pNewMark == pMark)
+ SwFmtRefMark const*const pNewMark =
+ m_pImpl->m_pDoc->GetRefMark(m_pImpl->m_sMarkName);
+ if (pNewMark && (pNewMark == m_pImpl->m_pMarkFmt))
{
- const SwTxtRefMark* pTxtMark = pMark->GetTxtRefMark();
- if(pTxtMark &&
- &pTxtMark->GetTxtNode().GetNodes() == &pDoc->GetNodes())
+ SwTxtRefMark const*const pTxtMark =
+ m_pImpl->m_pMarkFmt->GetTxtRefMark();
+ if (pTxtMark &&
+ (&pTxtMark->GetTxtNode().GetNodes() ==
+ &m_pImpl->m_pDoc->GetNodes()))
{
- SwTxtNode& rTxtNode = (SwTxtNode&)pTxtMark->GetTxtNode();
- SwPaM* pPam = pTxtMark->GetEnd() ?
- new SwPaM( rTxtNode, *pTxtMark->GetEnd(),
- rTxtNode, *pTxtMark->GetStart()) :
- new SwPaM( rTxtNode, *pTxtMark->GetStart());
-
-
- xRet = SwXTextRange::CreateTextRangeFromPosition(pDoc,
- *pPam->Start(), pPam->End());
- delete pPam;
+ SwTxtNode const& rTxtNode = pTxtMark->GetTxtNode();
+ const ::std::auto_ptr<SwPaM> pPam( (pTxtMark->GetEnd())
+ ? new SwPaM( rTxtNode, *pTxtMark->GetEnd(),
+ rTxtNode, *pTxtMark->GetStart())
+ : new SwPaM( rTxtNode, *pTxtMark->GetStart()) );
+
+ return SwXTextRange::CreateXTextRange(
+ *m_pImpl->m_pDoc, *pPam->Start(), pPam->End());
}
}
}
- return xRet;
+ return 0;
}
/*-- 11.12.98 10:28:35---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::dispose(void) throw( uno::RuntimeException )
+void SAL_CALL SwXReferenceMark::dispose() throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- if(IsValid())
+ if (m_pImpl->IsValid())
{
- const SwFmtRefMark* pNewMark = pDoc->GetRefMark(sMarkName);
- if(pNewMark && pNewMark == pMark)
+ SwFmtRefMark const*const pNewMark =
+ m_pImpl->m_pDoc->GetRefMark(m_pImpl->m_sMarkName);
+ if (pNewMark && (pNewMark == m_pImpl->m_pMarkFmt))
{
- const SwTxtRefMark* pTxtMark = pMark->GetTxtRefMark();
- if(pTxtMark &&
- &pTxtMark->GetTxtNode().GetNodes() == &pDoc->GetNodes())
+ SwTxtRefMark const*const pTxtMark =
+ m_pImpl->m_pMarkFmt->GetTxtRefMark();
+ if (pTxtMark &&
+ (&pTxtMark->GetTxtNode().GetNodes() ==
+ &m_pImpl->m_pDoc->GetNodes()))
{
- SwTxtNode& rTxtNode = (SwTxtNode&)pTxtMark->GetTxtNode();
+ SwTxtNode const& rTxtNode = pTxtMark->GetTxtNode();
xub_StrLen nStt = *pTxtMark->GetStart(),
nEnd = pTxtMark->GetEnd() ? *pTxtMark->GetEnd()
: nStt + 1;
SwPaM aPam( rTxtNode, nStt, rTxtNode, nEnd );
- pDoc->DeleteAndJoin( aPam );
+ m_pImpl->m_pDoc->DeleteAndJoin( aPam );
}
}
}
- else
- throw uno::RuntimeException();
+ else if (m_pImpl->m_bIsDescriptor)
+ {
+ m_pImpl->Invalidate();
+ }
}
/*-- 11.12.98 10:28:35---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
+void SAL_CALL SwXReferenceMark::addEventListener(
+ const uno::Reference< lang::XEventListener > & xListener)
+throw (uno::RuntimeException)
{
- if(!GetRegisteredIn())
+ vos::OGuard g(Application::GetSolarMutex());
+
+ if (!m_pImpl->IsValid())
+ {
throw uno::RuntimeException();
- aLstnrCntnr.AddListener(aListener);
+ }
+ m_pImpl->m_ListenerContainer.AddListener(xListener);
}
/*-- 11.12.98 10:28:35---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
+void SAL_CALL SwXReferenceMark::removeEventListener(
+ const uno::Reference< lang::XEventListener > & xListener)
+throw (uno::RuntimeException)
{
- if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener))
+ vos::OGuard g(Application::GetSolarMutex());
+
+ if (!m_pImpl->IsValid() ||
+ !m_pImpl->m_ListenerContainer.RemoveListener(xListener))
+ {
throw uno::RuntimeException();
+ }
}
/*-- 11.12.98 10:28:36---------------------------------------------------
-----------------------------------------------------------------------*/
-OUString SwXReferenceMark::getName(void) throw( uno::RuntimeException )
+OUString SAL_CALL SwXReferenceMark::getName()
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- if(!IsValid() || !pDoc->GetRefMark(sMarkName))
+ if (!m_pImpl->IsValid() ||
+ !m_pImpl->m_pDoc->GetRefMark(m_pImpl->m_sMarkName))
{
throw uno::RuntimeException();
}
- return sMarkName;
+ return m_pImpl->m_sMarkName;
}
/*-- 11.12.98 10:28:36---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::setName(const OUString& Name_) throw( uno::RuntimeException )
+void SAL_CALL SwXReferenceMark::setName(const OUString& rName)
+throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- if(m_bIsDescriptor)
- sMarkName = String(Name_);
+ if (m_pImpl->m_bIsDescriptor)
+ {
+ m_pImpl->m_sMarkName = rName;
+ }
else
{
- String sNewName(Name_);
- if(!IsValid() || !pDoc->GetRefMark(sMarkName) || pDoc->GetRefMark(sNewName))
+ if (!m_pImpl->IsValid()
+ || !m_pImpl->m_pDoc->GetRefMark(m_pImpl->m_sMarkName)
+ || m_pImpl->m_pDoc->GetRefMark(rName))
{
throw uno::RuntimeException();
}
- const SwFmtRefMark* pCurMark = pDoc->GetRefMark(sMarkName);
- if(sNewName != sMarkName && pCurMark && pCurMark == pMark)
+ SwFmtRefMark const*const pCurMark =
+ m_pImpl->m_pDoc->GetRefMark(m_pImpl->m_sMarkName);
+ if ((rName != m_pImpl->m_sMarkName)
+ && pCurMark && (pCurMark == m_pImpl->m_pMarkFmt))
{
- UnoActionContext aCont(pDoc);
- const SwTxtRefMark* pTxtMark = pMark->GetTxtRefMark();
- if(pTxtMark &&
- &pTxtMark->GetTxtNode().GetNodes() == &pDoc->GetNodes())
+ const UnoActionContext aCont(m_pImpl->m_pDoc);
+ SwTxtRefMark const*const pTxtMark =
+ m_pImpl->m_pMarkFmt->GetTxtRefMark();
+ if (pTxtMark &&
+ (&pTxtMark->GetTxtNode().GetNodes() ==
+ &m_pImpl->m_pDoc->GetNodes()))
{
- SwTxtNode& rTxtNode = (SwTxtNode&)pTxtMark->GetTxtNode();
+ SwTxtNode const& rTxtNode = pTxtMark->GetTxtNode();
xub_StrLen nStt = *pTxtMark->GetStart(),
nEnd = pTxtMark->GetEnd() ? *pTxtMark->GetEnd()
: nStt + 1;
SwPaM aPam( rTxtNode, nStt, rTxtNode, nEnd );
- pDoc->DeleteAndJoin( aPam ); //! deletes the pDoc member in the SwXReferenceMark
- //! The aPam will keep the correct and functional doc though
+ // deletes the m_pImpl->m_pDoc member in the SwXReferenceMark!
+ m_pImpl->m_pDoc->DeleteAndJoin( aPam );
+ // The aPam will keep the correct and functional doc though
- sMarkName = sNewName;
+ m_pImpl->m_sMarkName = rName;
//create a new one
- InsertRefMark( aPam, 0 );
- pDoc = aPam.GetDoc();
+ m_pImpl->InsertRefMark( aPam, 0 );
+ m_pImpl->m_pDoc = aPam.GetDoc();
}
}
}
}
-/* -----------------------------07.01.00 12:51--------------------------------
-
- ---------------------------------------------------------------------------*/
-void SwXReferenceMark::Invalidate()
-{
- if(GetRegisteredIn())
- {
- ((SwModify*)GetRegisteredIn())->Remove(this);
- aLstnrCntnr.Disposing();
- pDoc = 0;
- pMark = 0;
- }
-}
-/*-- 11.12.98 10:28:37---------------------------------------------------
-
- -----------------------------------------------------------------------*/
-void SwXReferenceMark::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_REFMARK_DELETED:
- if( (void*)pMark == ((SwPtrMsgPoolItem *)pOld)->pObject )
- Invalidate();
- break;
- }
-}
/*-- 12.09.00 12:58:20---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Reference< beans::XPropertySetInfo > SwXReferenceMark::getPropertySetInfo( ) throw(uno::RuntimeException)
+uno::Reference< beans::XPropertySetInfo > SAL_CALL
+SwXReferenceMark::getPropertySetInfo() throw (uno::RuntimeException)
{
+ vos::OGuard g(Application::GetSolarMutex());
+
static uno::Reference< beans::XPropertySetInfo > xRef =
- aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARAGRAPH_EXTENSIONS)->getPropertySetInfo();
+ aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARAGRAPH_EXTENSIONS)
+ ->getPropertySetInfo();
return xRef;
}
/*-- 12.09.00 12:58:20---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::setPropertyValue(
+void SAL_CALL SwXReferenceMark::setPropertyValue(
const OUString& /*rPropertyName*/, const uno::Any& /*rValue*/ )
- throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+throw (beans::UnknownPropertyException, beans::PropertyVetoException,
+ lang::IllegalArgumentException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
throw lang::IllegalArgumentException();
}
/*-- 12.09.00 12:58:20---------------------------------------------------
-----------------------------------------------------------------------*/
-uno::Any SwXReferenceMark::getPropertyValue( const OUString& rPropertyName )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+uno::Any SAL_CALL
+SwXReferenceMark::getPropertyValue(const OUString& rPropertyName)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
+ // does not seem to need SolarMutex
uno::Any aRet;
- if(!SwXParagraph::getDefaultTextContentValue(aRet, rPropertyName))
+ if (! ::sw::GetDefaultTextContentValue(aRet, rPropertyName))
+ {
throw beans::UnknownPropertyException();
+ }
return aRet;
}
/*-- 12.09.00 12:58:20---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::addPropertyChangeListener(
- const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+void SAL_CALL SwXReferenceMark::addPropertyChangeListener(
+ const OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
+ OSL_ENSURE(false,
+ "SwXReferenceMark::addPropertyChangeListener(): not implemented");
}
/*-- 12.09.00 12:58:20---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::removePropertyChangeListener(
- const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+void SAL_CALL SwXReferenceMark::removePropertyChangeListener(
+ const OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
+ OSL_ENSURE(false,
+ "SwXReferenceMark::removePropertyChangeListener(): not implemented");
}
/*-- 12.09.00 12:58:20---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::addVetoableChangeListener( const OUString& /*rPropertyName*/,
- const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/ )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+void SAL_CALL SwXReferenceMark::addVetoableChangeListener(
+ const OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
+ OSL_ENSURE(false,
+ "SwXReferenceMark::addVetoableChangeListener(): not implemented");
}
/*-- 12.09.00 12:58:21---------------------------------------------------
-----------------------------------------------------------------------*/
-void SwXReferenceMark::removeVetoableChangeListener(
- const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/ )
- throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+void SAL_CALL SwXReferenceMark::removeVetoableChangeListener(
+ const OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/)
+throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
{
+ OSL_ENSURE(false,
+ "SwXReferenceMark::removeVetoableChangeListener(): not implemented");
}
#include <com/sun/star/lang/DisposedException.hpp>
#include <unometa.hxx>
+#include <unotext.hxx>
#include <unoport.hxx>
#include <txtatr.hxx>
#include <fmtmeta.hxx>
@@ -455,21 +586,22 @@ private:
SwXMeta & m_rMeta;
virtual void PrepareForAttach(uno::Reference< text::XTextRange > & xRange,
- const SwXTextRange* const pRange, const SwPaM * const pPam);
+ const SwPaM & rPam);
- virtual bool CheckForOwnMemberMeta(const SwXTextRange* const pRange,
- const SwPaM* const pPam, bool bAbsorb)
- throw (::com::sun::star::lang::IllegalArgumentException,
- ::com::sun::star::uno::RuntimeException);
+ virtual bool CheckForOwnMemberMeta(const SwPaM & rPam, const bool bAbsorb)
+ throw (lang::IllegalArgumentException, uno::RuntimeException);
protected:
virtual const SwStartNode *GetStartNode() const;
virtual uno::Reference< text::XTextCursor >
- createCursor() throw (uno::RuntimeException);
+ CreateCursor() throw (uno::RuntimeException);
public:
SwXMetaText(SwDoc & rDoc, SwXMeta & rMeta);
+ /// make available for SwXMeta
+ void Invalidate() { SwXText::Invalidate(); };
+
// XInterface
virtual void SAL_CALL acquire() throw()
{ OSL_ENSURE(false, "ERROR: SwXMetaText::acquire"); }
@@ -488,6 +620,8 @@ public:
const uno::Reference< text::XTextRange > & xTextPosition)
throw (uno::RuntimeException);
+ SwXMeta & GetXMeta() { return m_rMeta; }
+
};
SwXMetaText::SwXMetaText(SwDoc & rDoc, SwXMeta & rMeta)
@@ -504,44 +638,21 @@ const SwStartNode *SwXMetaText::GetStartNode() const
}
void SwXMetaText::PrepareForAttach( uno::Reference<text::XTextRange> & xRange,
- const SwXTextRange* const pRange, const SwPaM * const pPam)
+ const SwPaM & rPam)
{
- SwPosition const* pPoint(0);
- SwPosition const* pMark (0);
- if (pRange)
- {
- ::sw::mark::IMark const& rIMark(*pRange->GetBookmark());
- pMark = &rIMark.GetMarkPos();
- if (rIMark.IsExpanded())
- {
- pMark = &rIMark.GetOtherMarkPos();
- }
- }
- else if (pPam)
- {
- pPoint = pPam->GetPoint();
- if (pPam->HasMark())
- {
- pMark = pPam->GetMark();
- }
- }
// create a new cursor to prevent modifying SwXTextRange
- if (pPoint)
- {
- xRange = static_cast<text::XWordCursor*>(
- new SwXTextCursor(&m_rMeta, *pPoint, CURSOR_META, GetDoc(), pMark));
- }
+ xRange = static_cast<text::XWordCursor*>(
+ new SwXTextCursor(*GetDoc(), &m_rMeta, CURSOR_META, *rPam.GetPoint(),
+ (rPam.HasMark()) ? rPam.GetMark() : 0));
}
-bool SwXMetaText::CheckForOwnMemberMeta(const SwXTextRange* const pRange,
- const SwPaM* const pPam, bool bAbsorb)
- throw (::com::sun::star::lang::IllegalArgumentException,
- ::com::sun::star::uno::RuntimeException)
+bool SwXMetaText::CheckForOwnMemberMeta(const SwPaM & rPam, const bool bAbsorb)
+ throw (lang::IllegalArgumentException, uno::RuntimeException)
{
- return m_rMeta.CheckForOwnMemberMeta(pRange, pPam, bAbsorb);
+ return m_rMeta.CheckForOwnMemberMeta(rPam, bAbsorb);
}
-uno::Reference< text::XTextCursor > SwXMetaText::createCursor()
+uno::Reference< text::XTextCursor > SwXMetaText::CreateCursor()
throw (uno::RuntimeException)
{
uno::Reference< text::XTextCursor > xRet;
@@ -556,7 +667,7 @@ throw (uno::RuntimeException)
{
SwPosition aPos(*pTxtNode, nMetaStart);
xRet = static_cast<text::XWordCursor*>(
- new SwXTextCursor(&m_rMeta, aPos, CURSOR_META, GetDoc()));
+ new SwXTextCursor(*GetDoc(), &m_rMeta, CURSOR_META, aPos));
}
}
return xRet;
@@ -572,7 +683,7 @@ SwXMetaText::getImplementationId() throw (uno::RuntimeException)
uno::Reference< text::XTextCursor > SAL_CALL
SwXMetaText::createTextCursor() throw (uno::RuntimeException)
{
- return createCursor();
+ return CreateCursor();
}
uno::Reference< text::XTextCursor > SAL_CALL
@@ -580,7 +691,7 @@ SwXMetaText::createTextCursorByRange(
const uno::Reference<text::XTextRange> & xTextPosition)
throw (uno::RuntimeException)
{
- const uno::Reference<text::XTextCursor> xCursor( createCursor() );
+ const uno::Reference<text::XTextCursor> xCursor( CreateCursor() );
xCursor->gotoRange(xTextPosition, sal_False);
return xCursor;
}
@@ -593,8 +704,12 @@ SwXMetaText::createTextCursorByRange(
// this list is created by SwXTextPortionEnumeration
// the Meta listens at the SwTxtNode and throws away the cache when it changes
-struct SwXMeta::Impl
+class SwXMeta::Impl
+ : public SwClient
{
+
+public:
+
SwEventListenerContainer m_ListenerContainer;
::std::auto_ptr<const TextRangeList_t> m_pTextPortions;
// 3 possible states: not attached, attached, disposed
@@ -603,37 +718,131 @@ struct SwXMeta::Impl
uno::Reference<text::XText> m_xParentText;
SwXMetaText m_Text;
- Impl(SwXMeta & rThis, SwDoc & rDoc,
+ Impl( SwXMeta & rThis, SwDoc & rDoc,
+ ::sw::Meta * const pMeta,
uno::Reference<text::XText> const& xParentText,
- TextRangeList_t const * const pPortions,
- SwTxtMeta const * const pHint)
- : m_ListenerContainer(
- static_cast< ::cppu::OWeakObject* >(&rThis))
+ TextRangeList_t const * const pPortions)
+ : SwClient(pMeta)
+ , m_ListenerContainer(static_cast< ::cppu::OWeakObject* >(&rThis))
, m_pTextPortions( pPortions )
, m_bIsDisposed( false )
- , m_bIsDescriptor( 0 == pHint )
+ , m_bIsDescriptor(0 == pMeta)
, m_xParentText(xParentText)
, m_Text(rDoc, rThis)
{
}
-};
-TYPEINIT1(SwXMeta, SwClient);
+ inline const ::sw::Meta * GetMeta() const;
+ // only for SwXMetaField!
+ inline const ::sw::MetaField * GetMetaField() const;
-inline const ::sw::Meta * SwXMeta::GetMeta() const
+ // SwClient
+ virtual void Modify(SfxPoolItem *pOld, SfxPoolItem *pNew);
+
+};
+
+inline const ::sw::Meta * SwXMeta::Impl::GetMeta() const
{
return static_cast< const ::sw::Meta * >(GetRegisteredIn());
}
+// SwModify
+void SwXMeta::Impl::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew )
+{
+ m_pTextPortions.reset(); // throw away cache (SwTxtNode changed)
+
+ ClientModify(this, pOld, pNew);
+
+ if (!GetRegisteredIn()) // removed => dispose
+ {
+ m_ListenerContainer.Disposing();
+ m_bIsDisposed = true;
+ m_Text.Invalidate();
+ }
+}
+
uno::Reference<text::XText> SwXMeta::GetParentText() const
{
return m_pImpl->m_xParentText;
}
+SwXMeta::SwXMeta(SwDoc *const pDoc, ::sw::Meta *const pMeta,
+ uno::Reference<text::XText> const& xParentText,
+ TextRangeList_t const*const pPortions)
+ : m_pImpl( new SwXMeta::Impl(*this, *pDoc, pMeta, xParentText, pPortions) )
+{
+}
+
+SwXMeta::SwXMeta(SwDoc *const pDoc)
+ : m_pImpl( new SwXMeta::Impl(*this, *pDoc, 0, 0, 0) )
+{
+}
+
+SwXMeta::~SwXMeta()
+{
+}
+
+uno::Reference<rdf::XMetadatable>
+SwXMeta::CreateXMeta(::sw::Meta & rMeta,
+ uno::Reference<text::XText> const& i_xParent,
+ ::std::auto_ptr<TextRangeList_t const> pPortions)
+{
+ // re-use existing SwXMeta
+ // #i105557#: do not iterate over the registered clients: race condition
+ uno::Reference<rdf::XMetadatable> xMeta(rMeta.GetXMeta());
+ if (xMeta.is())
+ {
+ if (pPortions.get()) // set cache in the XMeta to the given portions
+ {
+ const uno::Reference<lang::XUnoTunnel> xUT(xMeta, uno::UNO_QUERY);
+ SwXMeta *const pXMeta(
+ ::sw::UnoTunnelGetImplementation<SwXMeta>(xUT));
+ OSL_ENSURE(pXMeta, "no pXMeta?");
+ // NB: the meta must always be created with the complete content
+ // if SwXTextPortionEnumeration is created for a selection,
+ // it must be checked that the Meta is contained in the selection!
+ pXMeta->m_pImpl->m_pTextPortions = pPortions;
+ // ??? is this necessary?
+ if (pXMeta->m_pImpl->m_xParentText.get() != i_xParent.get())
+ {
+ OSL_ENSURE(false, "SwXMeta with different parent?");
+ pXMeta->m_pImpl->m_xParentText.set(i_xParent);
+ }
+ }
+ return xMeta;
+ }
+
+ // create new SwXMeta
+ SwTxtNode * const pTxtNode( rMeta.GetTxtNode() );
+ OSL_ENSURE(pTxtNode, "CreateXMeta: no text node?");
+ if (!pTxtNode) { return 0; }
+ uno::Reference<text::XText> xParentText(i_xParent);
+ if (!xParentText.is())
+ {
+ SwTxtMeta * const pTxtAttr( rMeta.GetTxtAttr() );
+ OSL_ENSURE(pTxtAttr, "CreateXMeta: no text attr?");
+ if (!pTxtAttr) { return 0; }
+ const SwPosition aPos(*pTxtNode, *pTxtAttr->GetStart());
+ xParentText.set( ::sw::CreateParentXText(*pTxtNode->GetDoc(), aPos) );
+ }
+ if (!xParentText.is()) { return 0; }
+ SwXMeta *const pXMeta( (RES_TXTATR_META == rMeta.GetFmtMeta()->Which())
+ ? new SwXMeta (pTxtNode->GetDoc(), &rMeta, xParentText,
+ pPortions.release()) // temporarily un-auto_ptr :-(
+ : new SwXMetaField(pTxtNode->GetDoc(), &rMeta, xParentText,
+ pPortions.release()));
+ // this is why the constructor is private: need to acquire pXMeta here
+ xMeta.set(pXMeta);
+ // in order to initialize the weak pointer cache in the core object
+ rMeta.SetXMeta(xMeta);
+ return xMeta;
+}
+
+
bool SwXMeta::SetContentRange(
SwTxtNode *& rpNode, xub_StrLen & rStart, xub_StrLen & rEnd ) const
{
- ::sw::Meta const * const pMeta( GetMeta() );
+ ::sw::Meta const * const pMeta( m_pImpl->GetMeta() );
if (pMeta)
{
SwTxtMeta const * const pTxtAttr( pMeta->GetTxtAttr() );
@@ -652,28 +861,9 @@ bool SwXMeta::SetContentRange(
return false;
}
-SwXMeta::SwXMeta(SwDoc *const pDoc,
- uno::Reference<text::XText> const& xParentText,
- TextRangeList_t * const pPortions, SwTxtMeta * const pHint)
- : m_pImpl( new SwXMeta::Impl(*this, *pDoc, xParentText, pPortions, pHint) )
-{
- if (pHint)
- {
- ::sw::Meta * const pMeta(
- static_cast<SwFmtMeta&>(pHint->GetAttr()).GetMeta() );
- ASSERT(pMeta, "SwXMeta: no meta?")
- if (pMeta)
- {
- pMeta->Add(this);
- }
- }
-}
-
-bool SwXMeta::CheckForOwnMemberMeta(const SwXTextRange* const pRange,
- const SwPaM* const pPam, bool bAbsorb)
+bool SwXMeta::CheckForOwnMemberMeta(const SwPaM & rPam, const bool bAbsorb)
throw (lang::IllegalArgumentException, uno::RuntimeException)
{
- ASSERT((pPam && !pRange) || (!pPam && pRange), "ERROR: pam xor range");
SwTxtNode * pTxtNode;
xub_StrLen nMetaStart;
xub_StrLen nMetaEnd;
@@ -681,9 +871,8 @@ bool SwXMeta::CheckForOwnMemberMeta(const SwXTextRange* const pRange,
ASSERT(bSuccess, "no pam?");
if (!bSuccess)
throw lang::DisposedException();
- SwPosition const * const pStartPos( (pPam)
- ? pPam->Start()
- : &pRange->GetBookmark()->GetMarkStart() );
+
+ SwPosition const * const pStartPos( rPam.Start() );
if (&pStartPos->nNode.GetNode() != pTxtNode)
{
throw lang::IllegalArgumentException(
@@ -706,14 +895,9 @@ bool SwXMeta::CheckForOwnMemberMeta(const SwXTextRange* const pRange,
{
bForceExpandHints = true;
}
- const bool bHasEnd( (pPam)
- ? pPam->HasMark()
- : pRange->GetBookmark()->IsExpanded());
- if (bHasEnd && bAbsorb)
+ if (rPam.HasMark() && bAbsorb)
{
- SwPosition const * const pEndPos( (pPam)
- ? pPam->End()
- : &pRange->GetBookmark()->GetMarkEnd() );
+ SwPosition const * const pEndPos( rPam.End() );
if (&pEndPos->nNode.GetNode() != pTxtNode)
{
throw lang::IllegalArgumentException(
@@ -739,16 +923,6 @@ bool SwXMeta::CheckForOwnMemberMeta(const SwXTextRange* const pRange,
return bForceExpandHints;
}
-
-SwXMeta::SwXMeta(SwDoc *const pDoc)
- : m_pImpl( new SwXMeta::Impl(*this, *pDoc, 0, 0, 0) )
-{
-}
-
-SwXMeta::~SwXMeta()
-{
-}
-
const uno::Sequence< sal_Int8 > & SwXMeta::getUnoTunnelId()
{
static uno::Sequence< sal_Int8 > aSeq( ::CreateUnoTunnelId() );
@@ -760,14 +934,7 @@ sal_Int64 SAL_CALL
SwXMeta::getSomething( const uno::Sequence< sal_Int8 > & i_rId )
throw (uno::RuntimeException)
{
- if ( i_rId.getLength() == 16 &&
- 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
- i_rId.getConstArray(), 16 ) )
- {
- return sal::static_int_cast< sal_Int64 >(
- reinterpret_cast< sal_IntPtr >(this) );
- }
- return 0;
+ return ::sw::UnoTunnelImpl<SwXMeta>(i_rId, this);
}
// XServiceInfo
@@ -777,21 +944,26 @@ SwXMeta::getImplementationName() throw (uno::RuntimeException)
return C2U("SwXMeta");
}
+static char const*const g_ServicesMeta[] =
+{
+ "com.sun.star.text.TextContent",
+ "com.sun.star.text.InContentMetadata",
+};
+static const size_t g_nServicesMeta(
+ sizeof(g_ServicesMeta)/sizeof(g_ServicesMeta[0]));
+
sal_Bool SAL_CALL
SwXMeta::supportsService(const ::rtl::OUString& rServiceName)
throw (uno::RuntimeException)
{
- return rServiceName.equalsAscii("com.sun.star.text.TextContent")
- || rServiceName.equalsAscii("com.sun.star.text.InContentMetadata");
+ return ::sw::SupportsServiceImpl(
+ g_nServicesMeta, g_ServicesMeta, rServiceName);
}
uno::Sequence< ::rtl::OUString > SAL_CALL
SwXMeta::getSupportedServiceNames() throw (uno::RuntimeException)
{
- uno::Sequence< ::rtl::OUString > aRet(2);
- aRet[0] = C2U("com.sun.star.text.TextContent");
- aRet[1] = C2U("com.sun.star.text.InContentMetadata");
- return aRet;
+ return ::sw::GetSupportedServiceNamesImpl(g_nServicesMeta, g_ServicesMeta);
}
@@ -881,14 +1053,10 @@ throw (lang::IllegalArgumentException, uno::RuntimeException)
C2S("SwXMeta::attach(): argument is no XUnoTunnel"),
static_cast< ::cppu::OWeakObject* >(this), 0);
}
- SwXTextRange * const pRange(
- reinterpret_cast< SwXTextRange * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething(
- SwXTextRange::getUnoTunnelId() ))) );
- OTextCursorHelper * const pCursor( pRange ? 0 :
- reinterpret_cast< OTextCursorHelper * >(
- sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething(
- OTextCursorHelper::getUnoTunnelId() ))) );
+ SwXTextRange *const pRange(
+ ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel));
+ OTextCursorHelper *const pCursor( (pRange) ? 0 :
+ ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel));
if (!pRange && !pCursor)
{
throw lang::IllegalArgumentException(
@@ -906,7 +1074,7 @@ throw (lang::IllegalArgumentException, uno::RuntimeException)
}
SwUnoInternalPaM aPam(*pDoc);
- SwXTextRange::XTextRangeToSwPaM(aPam, i_xTextRange);
+ ::sw::XTextRangeToSwPaM(aPam, i_xTextRange);
UnoActionContext aContext(pDoc);
@@ -940,10 +1108,10 @@ throw (lang::IllegalArgumentException, uno::RuntimeException)
static_cast< ::cppu::OWeakObject* >(this));
}
- pMeta->Add(this);
+ pMeta->Add(m_pImpl.get());
+ pMeta->SetXMeta(uno::Reference<rdf::XMetadatable>(this));
- m_pImpl->m_xParentText =
- SwXTextRange::CreateParentXText(pDoc, *aPam.GetPoint());
+ m_pImpl->m_xParentText = ::sw::CreateParentXText(*pDoc, *aPam.GetPoint());
m_pImpl->m_bIsDescriptor = false;
}
@@ -986,8 +1154,7 @@ SwXMeta::getAnchor() throw (uno::RuntimeException)
const SwPosition start(*pTxtNode, nMetaStart - 1); // -1 due to CH_TXTATR
const SwPosition end(*pTxtNode, nMetaEnd);
- return SwXTextRange::CreateTextRangeFromPosition(
- pTxtNode->GetDoc(), start, &end);
+ return SwXTextRange::CreateXTextRange(*pTxtNode->GetDoc(), start, &end);
}
// XTextRange
@@ -1097,7 +1264,7 @@ SwXMeta::hasElements() throw (uno::RuntimeException)
{
vos::OGuard g(Application::GetSolarMutex());
- return GetRegisteredIn() ? sal_True : sal_False;
+ return m_pImpl->GetRegisteredIn() ? sal_True : sal_False;
}
// XEnumerationAccess
@@ -1113,7 +1280,7 @@ SwXMeta::createEnumeration() throw (uno::RuntimeException)
if (m_pImpl->m_bIsDescriptor)
{
throw uno::RuntimeException(
- C2S("getAnchor(): not inserted"),
+ C2S("createEnumeration(): not inserted"),
static_cast< ::cppu::OWeakObject* >(this));
}
@@ -1142,12 +1309,12 @@ SwXMeta::createEnumeration() throw (uno::RuntimeException)
// MetadatableMixin
::sfx2::Metadatable* SwXMeta::GetCoreObject()
{
- return const_cast< ::sw::Meta * >(GetMeta());
+ return const_cast< ::sw::Meta * >(m_pImpl->GetMeta());
}
uno::Reference<frame::XModel> SwXMeta::GetModel()
{
- ::sw::Meta const * const pMeta( GetMeta() );
+ ::sw::Meta const * const pMeta( m_pImpl->GetMeta() );
if (pMeta)
{
SwTxtNode const * const pTxtNode( pMeta->GetTxtNode() );
@@ -1160,42 +1327,27 @@ uno::Reference<frame::XModel> SwXMeta::GetModel()
return 0;
}
-// SwModify
-void SwXMeta::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew )
-{
- m_pImpl->m_pTextPortions.reset(); // throw away cache (SwTxtNode changed)
-
- ClientModify(this, pOld, pNew);
-
- if (!GetRegisteredIn()) // removed => dispose
- {
- m_pImpl->m_ListenerContainer.Disposing();
- m_pImpl->m_bIsDisposed = true;
- m_pImpl->m_Text.Invalidate();
- }
-}
-
/******************************************************************
* SwXMetaField
******************************************************************/
-inline const ::sw::MetaField * SwXMetaField::GetMetaField() const
+inline const ::sw::MetaField * SwXMeta::Impl::GetMetaField() const
{
return static_cast< const ::sw::MetaField * >(GetRegisteredIn());
}
-SwXMetaField::SwXMetaField(SwDoc *const pDoc,
+SwXMetaField::SwXMetaField(SwDoc *const pDoc, ::sw::Meta *const pMeta,
uno::Reference<text::XText> const& xParentText,
- TextRangeList_t * const pPortions, SwTxtMeta * const pHint)
- : SwXMetaFieldBaseClass(pDoc, xParentText, pPortions, pHint)
+ TextRangeList_t const*const pPortions)
+ : SwXMetaField_Base(pDoc, pMeta, xParentText, pPortions)
{
- ASSERT(!pHint || RES_TXTATR_METAFIELD == pHint->Which(),
+ ASSERT(pMeta && dynamic_cast< ::sw::MetaField* >(pMeta),
"SwXMetaField created for wrong hint!");
}
SwXMetaField::SwXMetaField(SwDoc *const pDoc)
- : SwXMetaFieldBaseClass(pDoc)
+ : SwXMetaField_Base(pDoc)
{
}
@@ -1210,23 +1362,28 @@ SwXMetaField::getImplementationName() throw (uno::RuntimeException)
return C2U("SwXMetaField");
}
+static char const*const g_ServicesMetaField[] =
+{
+ "com.sun.star.text.TextContent",
+ "com.sun.star.text.TextField",
+ "com.sun.star.text.textfield.MetadataField",
+};
+static const size_t g_nServicesMetaField(
+ sizeof(g_ServicesMetaField)/sizeof(g_ServicesMetaField[0]));
+
sal_Bool SAL_CALL
SwXMetaField::supportsService(const ::rtl::OUString& rServiceName)
throw (uno::RuntimeException)
{
- return rServiceName.equalsAscii("com.sun.star.text.TextContent")
- || rServiceName.equalsAscii("com.sun.star.text.TextField")
- || rServiceName.equalsAscii("com.sun.star.text.textfield.MetadataField");
+ return ::sw::SupportsServiceImpl(
+ g_nServicesMetaField, g_ServicesMetaField, rServiceName);
}
uno::Sequence< ::rtl::OUString > SAL_CALL
SwXMetaField::getSupportedServiceNames() throw (uno::RuntimeException)
{
- uno::Sequence< ::rtl::OUString > aRet(3);
- aRet[0] = C2U("com.sun.star.text.TextContent");
- aRet[1] = C2U("com.sun.star.text.TextField");
- aRet[2] = C2U("com.sun.star.text.textfield.MetadataField");
- return aRet;
+ return ::sw::GetSupportedServiceNamesImpl(
+ g_nServicesMetaField, g_ServicesMetaField);
}
// XComponent
@@ -1288,7 +1445,7 @@ throw (beans::UnknownPropertyException, beans::PropertyVetoException,
vos::OGuard g(Application::GetSolarMutex());
::sw::MetaField * const pMeta(
- const_cast< ::sw::MetaField * >(GetMetaField()) );
+ const_cast< ::sw::MetaField * >(m_pImpl->GetMetaField()) );
if (!pMeta)
throw lang::DisposedException();
@@ -1321,7 +1478,7 @@ throw (beans::UnknownPropertyException, lang::WrappedTargetException,
{
vos::OGuard g(Application::GetSolarMutex());
- ::sw::MetaField const * const pMeta( GetMetaField() );
+ ::sw::MetaField const * const pMeta( m_pImpl->GetMetaField() );
if (!pMeta)
throw lang::DisposedException();