Kaydet (Commit) 15f431e5 authored tarafından Michael Stahl's avatar Michael Stahl

fdo#65478, i#105557: thread safety of SwXTextField

- implement SwClient on Impl class
- add a WeakReference to SwFmtFld create the SwXTextField from,
  instead of racy iteration of SwModify clients

Change-Id: Ia71b4fcbfceaa367a516a8353a4b66123d72305a
üst e61770f9
......@@ -16,10 +16,15 @@
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef _FMTFLD_HXX
#define _FMTFLD_HXX
#ifndef SW_FMTFLD_HXX
#define SW_FMTFLD_HXX
#include <list>
#include <com/sun/star/text/XTextField.hpp>
#include <cppuhelper/weakref.hxx>
#include <svl/poolitem.hxx>
#include <svl/brdcst.hxx>
#include <svl/smplhint.hxx>
......@@ -38,6 +43,9 @@ class SW_DLLPUBLIC SwFmtFld : public SfxPoolItem, public SwClient, public SfxBro
friend class SwTxtFld;
friend void _InitCore();
::com::sun::star::uno::WeakReference<
::com::sun::star::text::XTextField> m_wXTextField;
SwField *pField;
SwTxtFld* pTxtAttr;
......@@ -86,6 +94,13 @@ public:
void RegisterToFieldType( SwFieldType& );
sal_Bool IsFldInDoc() const;
sal_Bool IsProtect() const;
SW_DLLPRIVATE ::com::sun::star::uno::WeakReference<
::com::sun::star::text::XTextField> const& GetXTextField() const
{ return m_wXTextField; }
SW_DLLPRIVATE void SetXTextField(::com::sun::star::uno::Reference<
::com::sun::star::text::XTextField> const& xTextField)
{ m_wXTextField = xTextField; }
};
class SW_DLLPUBLIC SwFmtFldHint : public SfxHint
......
This diff is collapsed.
......@@ -525,9 +525,10 @@ bool getCrsrPropertyValue(const SfxItemPropertySimpleEntry& rEntry
{
if( pAny )
{
SwXTextField* pField = SwXTextField::CreateSwXTextField(*rPam.GetDoc(),
pTxtAttr->GetFld());
*pAny <<= uno::Reference< XTextField >( pField );
uno::Reference<text::XTextField> const xField(
SwXTextField::CreateXTextField(*rPam.GetDoc(),
pTxtAttr->GetFld()));
*pAny <<= xField;
}
}
else
......
......@@ -358,7 +358,7 @@ lcl_ExportFieldMark(
Reference<XTextField> xField;
const SwFmtFld* pField = SwPostItField::GetByName(pDoc, pFieldmark->GetName());
if (pField)
xField = SwXTextField::CreateSwXTextField(*pDoc, *pField);
xField = SwXTextField::CreateXTextField(*pDoc, *pField);
pPortion->SetTextField(xField);
}
}
......@@ -723,8 +723,8 @@ lcl_ExportHints(
SwXTextPortion* pPortion;
xRef = pPortion = new SwXTextPortion(
pUnoCrsr, xParent, PORTION_FIELD);
Reference<XTextField> xField =
SwXTextField::CreateSwXTextField(*pDoc, pAttr->GetFld());
Reference<XTextField> const xField =
SwXTextField::CreateXTextField(*pDoc, pAttr->GetFld());
pPortion->SetTextField(xField);
// If this is a postit field and it has a fieldmark
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment