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

i#107771: sw: make SwXTextField a client of its format poolitem

In other words, stop registering at SwDoc's "UnoCallBack"

Change-Id: Ieb2639497fe5e8d71aa1c47952c007da76fcee84
üst b8a28f81
......@@ -36,7 +36,10 @@ class SwView;
class SwFieldType;
// ATT_FLD
class SW_DLLPUBLIC SwFmtFld : public SfxPoolItem, public SwClient, public SfxBroadcaster
class SW_DLLPUBLIC SwFmtFld
: public SfxPoolItem
, public SwModify
, public SfxBroadcaster
{
friend void _InitCore();
SwFmtFld( sal_uInt16 nWhich ); // for default-Attibute
......@@ -71,6 +74,8 @@ public:
virtual bool GetInfo( SfxPoolItem& rInfo ) const SAL_OVERRIDE;
void InvalidateField();
const SwField* GetField() const
{
return mpField;
......
......@@ -331,7 +331,6 @@ RES_MSG_BEGIN = RES_FMT_END,
RES_CONTENT_VISIBLE,
RES_FOOTNOTE_DELETED,
RES_GRAPHIC_SWAPIN,
RES_FIELD_DELETED,
RES_NAME_CHANGED,
RES_TITLE_CHANGED,
RES_DESCRIPTION_CHANGED,
......
......@@ -174,7 +174,6 @@ void SwModify::NotifyClients( const SfxPoolItem* pOldValue, const SfxPoolItem* p
break;
case RES_FOOTNOTE_DELETED:
case RES_FIELD_DELETED:
bLockClientList = false;
break;
......
......@@ -290,7 +290,8 @@ void SwNodes::ChgNode( SwNodeIndex& rDelPos, sal_uLong nSz,
else
((SwDDEFieldType*)pTyp)->IncRefCnt();
}
nDelMsg = RES_FIELD_DELETED;
static_cast<SwFmtFld&>(pAttr->GetAttr())
.InvalidateField();
}
break;
......
......@@ -169,7 +169,7 @@ private:
virtual ~SwXTextField();
SwXTextField(const SwFmtFld& rFmt, SwDoc & rDoc);
SwXTextField(SwFmtFld& rFmt, SwDoc & rDoc);
/// descriptor
SwXTextField(sal_uInt16 nServiceId, SwDoc* pDoc=0);
......
......@@ -38,13 +38,13 @@
#include <fieldhint.hxx>
#include <svl/smplhint.hxx>
TYPEINIT3( SwFmtFld, SfxPoolItem, SwClient,SfxBroadcaster)
TYPEINIT3(SwFmtFld, SfxPoolItem, SwModify, SfxBroadcaster)
TYPEINIT1(SwFmtFldHint, SfxHint);
// constructor for default item in attribute-pool
SwFmtFld::SwFmtFld( sal_uInt16 nWhich )
: SfxPoolItem( nWhich )
, SwClient()
, SwModify(0)
, SfxBroadcaster()
, mpField( NULL )
, mpTxtFld( NULL )
......@@ -53,7 +53,7 @@ SwFmtFld::SwFmtFld( sal_uInt16 nWhich )
SwFmtFld::SwFmtFld( const SwField &rFld )
: SfxPoolItem( RES_TXTATR_FIELD )
, SwClient( rFld.GetTyp() )
, SwModify( rFld.GetTyp() )
, SfxBroadcaster()
, mpField( rFld.CopyField() )
, mpTxtFld( NULL )
......@@ -77,7 +77,7 @@ SwFmtFld::SwFmtFld( const SwField &rFld )
// corrected
SwFmtFld::SwFmtFld( const SwFmtFld& rAttr )
: SfxPoolItem( RES_TXTATR_FIELD )
, SwClient()
, SwModify(0)
, SfxBroadcaster()
, mpField( NULL )
, mpTxtFld( NULL )
......@@ -183,6 +183,13 @@ SfxPoolItem* SwFmtFld::Clone( SfxItemPool* ) const
return new SwFmtFld( *this );
}
void SwFmtFld::InvalidateField()
{
SwPtrMsgPoolItem const item(RES_REMOVE_UNO_OBJECT,
&static_cast<SwModify&>(*this)); // cast to base class (void*)
NotifyClients(&item, &item);
}
void SwFmtFld::SwClientNotify( const SwModify&, const SfxHint& rHint )
{
if( !mpTxtFld )
......@@ -208,6 +215,14 @@ void SwFmtFld::SwClientNotify( const SwModify&, const SfxHint& rHint )
void SwFmtFld::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
{
if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which()))
{ // invalidate cached UNO object
SetXTextField(css::uno::Reference<css::text::XTextField>(0));
// ??? why does this Modify method not already do this?
NotifyClients(pOld, pNew);
return;
}
if( !mpTxtFld )
return;
......
......@@ -1178,7 +1178,7 @@ void SwTxtNode::DestroyAttr( SwTxtAttr* pAttr )
}
}
}
nDelMsg = RES_FIELD_DELETED;
static_cast<SwFmtFld&>(pAttr->GetAttr()).InvalidateField();
break;
case RES_TXTATR_TOXMARK:
......
......@@ -1152,9 +1152,9 @@ public:
OUString m_sTypeName;
boost::scoped_ptr<SwFieldProperties_Impl> m_pProps;
Impl(SwDoc *const pDoc, SwFmtFld const*const pFmt,
Impl(SwDoc *const pDoc, SwFmtFld *const pFmt,
sal_uInt16 const nServiceId)
: SwClient((pFmt) ? pDoc->GetUnoCallBack() : 0)
: SwClient(pFmt)
, m_EventListeners(m_Mutex)
, m_pFmtFld(pFmt)
, m_pDoc(pDoc)
......@@ -1225,9 +1225,7 @@ SwXTextField::SwXTextField(
}
}
SwXTextField::SwXTextField(
const SwFmtFld& rFmt,
SwDoc & rDoc)
SwXTextField::SwXTextField(SwFmtFld& rFmt, SwDoc & rDoc)
: m_pImpl(new Impl(&rDoc, &rFmt, USHRT_MAX))
{
}
......@@ -1251,7 +1249,7 @@ SwXTextField::CreateXTextField(SwDoc *const pDoc, SwFmtFld const* pFmt,
if (!xField.is())
{
SwXTextField *const pField( (pFmt)
? new SwXTextField(*pFmt, *pDoc)
? new SwXTextField(const_cast<SwFmtFld&>(*pFmt), *pDoc)
: new SwXTextField(nServiceId, pDoc));
xField.set(pField);
if (pFmt)
......@@ -1995,7 +1993,7 @@ throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception)
assert(m_pImpl->m_pFmtFld);
m_pImpl->m_pDoc = pDoc;
m_pImpl->m_pDoc->GetUnoCallBack()->Add(m_pImpl.get());
const_cast<SwFmtFld *>(m_pImpl->m_pFmtFld)->Add(m_pImpl.get());
m_pImpl->m_bIsDescriptor = false;
if (m_pImpl->m_FieldTypeClient.GetRegisteredIn())
{
......@@ -2649,10 +2647,6 @@ void SwXTextField::Impl::Modify(
((SwFmtChg*)pOld)->pChangedFmt->IsFmtInDTOR() )
Invalidate();
break;
case RES_FIELD_DELETED:
if ((void*)m_pFmtFld == ((SwPtrMsgPoolItem *)pOld)->pObject)
Invalidate();
break;
}
}
......
......@@ -43,6 +43,7 @@
#include <IDocumentUndoRedo.hxx>
#include <viewopt.hxx>
#include <frmfmt.hxx>
#include <fmtfld.hxx>
#include <swtable.hxx>
#include <mdiexp.hxx>
#include <view.hxx>
......@@ -178,10 +179,16 @@ class FieldDeletionModify : public SwModify
void Modify( const SfxPoolItem* pOld, const SfxPoolItem *) SAL_OVERRIDE
{
// Input fields have been deleted: better to close the dialog
if (pOld->Which() == RES_FIELD_DELETED)
// Input field has been deleted: better to close the dialog
if (pOld)
{
mpInputFieldDlg->EndDialog(RET_CANCEL);
switch (pOld->Which())
{
case RES_REMOVE_UNO_OBJECT:
case RES_OBJECTDYING:
mpInputFieldDlg->EndDialog(RET_CANCEL);
break;
}
}
}
private:
......@@ -201,14 +208,21 @@ bool SwWrtShell::StartInputFldDlg( SwField* pFld, bool bNextButton,
if(pWindowState && !pWindowState->isEmpty())
pDlg->SetWindowState(*pWindowState);
// Register for possible input field deletion while dialog is open
FieldDeletionModify aModify(pDlg.get());
GetDoc()->GetUnoCallBack()->Add(&aModify);
SwInputField *const pInputField(dynamic_cast<SwInputField*>(pFld));
if (pInputField)
{
// Register for possible input field deletion while dialog is open
pInputField->GetFmtFld()->Add(&aModify);
}
bool bRet = RET_CANCEL == pDlg->Execute();
// Dialog closed, remove modification listener
GetDoc()->GetUnoCallBack()->Remove(&aModify);
if (pInputField)
{
// Dialog closed, remove modification listener
pInputField->GetFmtFld()->Remove(&aModify);
}
if(pWindowState)
*pWindowState = pDlg->GetWindowState();
......
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