sw/inc/IDocumentMarkAccess.hxx | 2 ++ sw/inc/hintids.hxx | 1 + sw/source/core/doc/docbm.cxx | 18 +++++++++++++++++- sw/source/core/inc/MarkManager.hxx | 1 + sw/source/core/text/itratr.cxx | 16 +++++++++------- sw/source/core/text/itrform2.cxx | 4 ++++ sw/source/core/text/portxt.cxx | 4 ++-- sw/source/core/txtnode/ndtxt.cxx | 1 + sw/source/core/undo/undel.cxx | 2 ++ sw/source/core/unocore/unoportenum.cxx | 6 +++--- sw/source/filter/ascii/ascatr.cxx | 1 + sw/source/filter/html/wrthtml.cxx | 2 +- sw/source/filter/ww8/writerhelper.cxx | 2 +- sw/source/filter/ww8/wrtw8nds.cxx | 6 +++--- 14 files changed, 48 insertions(+), 18 deletions(-)
New commits: commit 080eb8544ab65f757b0dc6c95328d3b9b47a5e64 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Tue Sep 24 18:06:53 2019 +0200 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Fri Oct 4 12:11:43 2019 +0200 sw: add CH_TXT_ATR_FIELDSEP ... and handle it in obvious places. Change-Id: I7e9668994be0bd246f89ecc60fd0a42c240cce0c Reviewed-on: https://gerrit.libreoffice.org/80051 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx index 6e818b03349b..dcbc5f4247ff 100644 --- a/sw/inc/hintids.hxx +++ b/sw/inc/hintids.hxx @@ -50,6 +50,7 @@ class SvxLRSpaceItem; #define CH_TXT_ATR_FORMELEMENT u'\x0006' #define CH_TXT_ATR_FIELDSTART u'\x0007' +#define CH_TXT_ATR_FIELDSEP u'\x0003' #define CH_TXT_ATR_FIELDEND u'\x0008' #define CH_TXT_ATR_SUBST_FIELDSTART ("[") #define CH_TXT_ATR_SUBST_FIELDEND ("]") diff --git a/sw/source/core/text/itratr.cxx b/sw/source/core/text/itratr.cxx index 59b7277ff849..02f44d5cc74e 100644 --- a/sw/source/core/text/itratr.cxx +++ b/sw/source/core/text/itratr.cxx @@ -707,16 +707,18 @@ static sal_Int32 GetNextAttrImpl(SwTextNode const*const pTextNode, while (p < l) { sal_Unicode aChar = pStr[p]; - if (aChar < CH_TXT_ATR_FORMELEMENT - || aChar > CH_TXT_ATR_FIELDEND) + switch (aChar) { - ++p; - } - else - { - break; + case CH_TXT_ATR_FORMELEMENT: + case CH_TXT_ATR_FIELDSTART: + case CH_TXT_ATR_FIELDSEP: + case CH_TXT_ATR_FIELDEND: + goto break_; // sigh... + default: + ++p; } } +break_: assert(p <= nNext); if (p < l) { diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx index c273d32f0009..395fcc23ce2c 100644 --- a/sw/source/core/text/itrform2.cxx +++ b/sw/source/core/text/itrform2.cxx @@ -889,11 +889,15 @@ SwTextPortion *SwTextFormatter::WhichTextPor( SwTextFormatInfo &rInf ) const { if (ch == CH_TXT_ATR_FIELDSTART) pPor = new SwFieldFormDatePortion(pBM, true); + else if (ch == CH_TXT_ATR_FIELDSEP) + pPor = new SwFieldMarkPortion(); // it's added in DateFieldmark? else if (ch == CH_TXT_ATR_FIELDEND) pPor = new SwFieldFormDatePortion(pBM, false); } else if (ch == CH_TXT_ATR_FIELDSTART) pPor = new SwFieldMarkPortion(); + else if (ch == CH_TXT_ATR_FIELDSEP) + pPor = new SwFieldMarkPortion(); else if (ch == CH_TXT_ATR_FIELDEND) pPor = new SwFieldMarkPortion(); else if (ch == CH_TXT_ATR_FORMELEMENT) diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index 062343808edd..8d321ddd9b45 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -3575,6 +3575,7 @@ bool SwTextNode::CopyExpandText(SwTextNode& rDestNd, const SwIndex* pDestIdx, sal_Unicode const cur(rDestNd.GetText()[aDestIdx.GetIndex()]); if ( (cChar == cur) // filter substituted hidden text || (CH_TXT_ATR_FIELDSTART == cur) // filter all fieldmarks + || (CH_TXT_ATR_FIELDSEP == cur) || (CH_TXT_ATR_FIELDEND == cur) || (CH_TXT_ATR_FORMELEMENT == cur)) { diff --git a/sw/source/core/undo/undel.cxx b/sw/source/core/undo/undel.cxx index a1a8ca52f841..e23382e5f0a3 100644 --- a/sw/source/core/undo/undel.cxx +++ b/sw/source/core/undo/undel.cxx @@ -641,6 +641,7 @@ static bool lcl_IsSpecialCharacter(sal_Unicode nChar) case CH_TXT_ATR_INPUTFIELDEND: case CH_TXT_ATR_FORMELEMENT: case CH_TXT_ATR_FIELDSTART: + case CH_TXT_ATR_FIELDSEP: case CH_TXT_ATR_FIELDEND: return true; @@ -681,6 +682,7 @@ static OUString lcl_DenotedPortion(const OUString& rStr, sal_Int32 nStart, sal_I case CH_TXT_ATR_INPUTFIELDEND: case CH_TXT_ATR_FORMELEMENT: case CH_TXT_ATR_FIELDSTART: + case CH_TXT_ATR_FIELDSEP: case CH_TXT_ATR_FIELDEND: break; // nothing? diff --git a/sw/source/filter/ascii/ascatr.cxx b/sw/source/filter/ascii/ascatr.cxx index 5058b45c5c00..3da9c5a2117b 100644 --- a/sw/source/filter/ascii/ascatr.cxx +++ b/sw/source/filter/ascii/ascatr.cxx @@ -348,6 +348,7 @@ static Writer& OutASC_SwTextNode( Writer& rWrt, SwContentNode& rNode ) CH_TXT_ATR_INPUTFIELDEND, CH_TXT_ATR_FORMELEMENT, CH_TXT_ATR_FIELDSTART, + CH_TXT_ATR_FIELDSEP, CH_TXT_ATR_FIELDEND, 0 }; commit 7ade17fd46c986ad2a624982c5737d7c667b8c89 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Tue Sep 24 18:07:44 2019 +0200 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Fri Oct 4 12:11:31 2019 +0200 sw: add IDocumentMarkAccess::getFieldmarkAt() ... and use it where the mark for a given CH_TXT_ATR_FIELD* is retrieved. Change-Id: Id58ac2967ab66be8a07586ef31cfe9e18a5f073d Reviewed-on: https://gerrit.libreoffice.org/80050 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx index 4d12a236a4f1..a8dacbcbd7e4 100644 --- a/sw/inc/IDocumentMarkAccess.hxx +++ b/sw/inc/IDocumentMarkAccess.hxx @@ -307,6 +307,8 @@ class IDocumentMarkAccess // Fieldmarks + /// get Fieldmark for CH_TXT_ATR_FIELDSTART/CH_TXT_ATR_FIELDEND at rPos + virtual ::sw::mark::IFieldmark* getFieldmarkAt(const SwPosition& rPos) const =0; virtual ::sw::mark::IFieldmark* getFieldmarkFor(const SwPosition& pos) const =0; virtual ::sw::mark::IFieldmark* getFieldmarkBefore(const SwPosition& pos) const =0; virtual ::sw::mark::IFieldmark* getFieldmarkAfter(const SwPosition& pos) const =0; diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 6f2a38b0be5a..1d61f2ac65e7 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -1255,6 +1255,22 @@ namespace sw { namespace mark CompareIMarkStartsAfter()); } + IFieldmark* MarkManager::getFieldmarkAt(const SwPosition& rPos) const + { + auto const pFieldmark = find_if( + m_vFieldmarks.begin(), + m_vFieldmarks.end(), + [&rPos] (::sw::mark::MarkBase const*const pMark) { + return pMark->GetMarkStart() == rPos + // end position includes the CH_TXT_ATR_FIELDEND + || (pMark->GetMarkEnd().nContent.GetIndex() == rPos.nContent.GetIndex() + 1 + && pMark->GetMarkEnd().nNode == rPos.nNode); + } ); + return (pFieldmark == m_vFieldmarks.end()) + ? nullptr + : dynamic_cast<IFieldmark*>(*pFieldmark); + } + IFieldmark* MarkManager::getFieldmarkFor(const SwPosition& rPos) const { auto const pFieldmark = find_if( @@ -1377,7 +1393,7 @@ namespace sw { namespace mark IFieldmark* MarkManager::getDropDownFor(const SwPosition& rPos) const { - IFieldmark *pMark = getFieldmarkFor(rPos); + IFieldmark *pMark = getFieldmarkAt(rPos); if (!pMark || pMark->GetFieldname() != ODF_FORMDROPDOWN) return nullptr; return pMark; diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx index 512cd4de9d6d..a97f28c21b53 100644 --- a/sw/source/core/inc/MarkManager.hxx +++ b/sw/source/core/inc/MarkManager.hxx @@ -83,6 +83,7 @@ namespace sw { virtual const_iterator_t findFirstBookmarkStartsAfter(const SwPosition& rPos) const override; // Fieldmarks + virtual ::sw::mark::IFieldmark* getFieldmarkAt(const SwPosition& rPos) const override; virtual ::sw::mark::IFieldmark* getFieldmarkFor(const SwPosition& rPos) const override; virtual ::sw::mark::IFieldmark* getFieldmarkBefore(const SwPosition& rPos) const override; virtual ::sw::mark::IFieldmark* getFieldmarkAfter(const SwPosition& rPos) const override; diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx index f9aed8c08c6c..0460cb343dd3 100644 --- a/sw/source/core/text/portxt.cxx +++ b/sw/source/core/text/portxt.cxx @@ -794,7 +794,7 @@ void SwFieldFormCheckboxPortion::Paint( const SwTextPaintInfo& rInf ) const { SwPosition const aPosition(rInf.GetTextFrame()->MapViewToModelPos(rInf.GetIdx())); - IFieldmark const*const pBM = rInf.GetTextFrame()->GetDoc().getIDocumentMarkAccess()->getFieldmarkFor( aPosition ); + IFieldmark const*const pBM = rInf.GetTextFrame()->GetDoc().getIDocumentMarkAccess()->getFieldmarkAt(aPosition); OSL_ENSURE(pBM && pBM->GetFieldname( ) == ODF_FORMCHECKBOX, "Where is my form field bookmark???"); @@ -810,7 +810,7 @@ void SwFieldFormCheckboxPortion::Paint( const SwTextPaintInfo& rInf ) const bool SwFieldFormCheckboxPortion::Format( SwTextFormatInfo & rInf ) { SwPosition const aPosition(rInf.GetTextFrame()->MapViewToModelPos(rInf.GetIdx())); - IFieldmark const*const pBM = rInf.GetTextFrame()->GetDoc().getIDocumentMarkAccess()->getFieldmarkFor( aPosition ); + IFieldmark const*const pBM = rInf.GetTextFrame()->GetDoc().getIDocumentMarkAccess()->getFieldmarkAt(aPosition); OSL_ENSURE(pBM && pBM->GetFieldname( ) == ODF_FORMCHECKBOX, "Where is my form field bookmark???"); if (pBM && pBM->GetFieldname( ) == ODF_FORMCHECKBOX) { diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx index 26a00c334746..f7ad846313d4 100644 --- a/sw/source/core/unocore/unoportenum.cxx +++ b/sw/source/core/unocore/unoportenum.cxx @@ -432,7 +432,7 @@ lcl_ExportFieldMark( if (pDoc) { pFieldmark = pDoc->getIDocumentMarkAccess()-> - getFieldmarkFor(*pUnoCursor->GetMark()); + getFieldmarkAt(*pUnoCursor->GetMark()); } SwXTextPortion* pPortion = new SwXTextPortion( pUnoCursor, i_xParentText, PORTION_FIELD_START); @@ -449,7 +449,7 @@ lcl_ExportFieldMark( if (pDoc) { pFieldmark = pDoc->getIDocumentMarkAccess()-> - getFieldmarkFor(*pUnoCursor->GetMark()); + getFieldmarkAt(*pUnoCursor->GetMark()); } SwXTextPortion* pPortion = new SwXTextPortion( pUnoCursor, i_xParentText, PORTION_FIELD_END); @@ -465,7 +465,7 @@ lcl_ExportFieldMark( ::sw::mark::IFieldmark* pFieldmark = nullptr; if (pDoc) { - pFieldmark = pDoc->getIDocumentMarkAccess()->getFieldmarkFor(*pUnoCursor->GetMark()); + pFieldmark = pDoc->getIDocumentMarkAccess()->getFieldmarkAt(*pUnoCursor->GetMark()); } SwXTextPortion* pPortion = new SwXTextPortion( pUnoCursor, i_xParentText, PORTION_FIELD_START_END); diff --git a/sw/source/filter/html/wrthtml.cxx b/sw/source/filter/html/wrthtml.cxx index 7375f911d476..f86ab2004dc2 100644 --- a/sw/source/filter/html/wrthtml.cxx +++ b/sw/source/filter/html/wrthtml.cxx @@ -1171,7 +1171,7 @@ void SwHTMLWriter::OutPointFieldmarks( const SwPosition& rPos ) if (!pMarkAccess) return; - const sw::mark::IFieldmark* pMark = pMarkAccess->getFieldmarkFor(rPos); + const sw::mark::IFieldmark* pMark = pMarkAccess->getFieldmarkAt(rPos); if (!pMark) return; diff --git a/sw/source/filter/ww8/writerhelper.cxx b/sw/source/filter/ww8/writerhelper.cxx index 520283dc5fe1..fa56ce68878e 100644 --- a/sw/source/filter/ww8/writerhelper.cxx +++ b/sw/source/filter/ww8/writerhelper.cxx @@ -718,7 +718,7 @@ namespace sw SwPosition const end(*rPos.nNode.GetNode().GetTextNode(), nIndex - 1); sw::mark::IFieldmark *const pFieldMark( - rPos.GetDoc()->getIDocumentMarkAccess()->getFieldmarkFor(end)); + rPos.GetDoc()->getIDocumentMarkAccess()->getFieldmarkAt(end)); SAL_WARN_IF(!pFieldMark, "sw.ww8", "expected a field mark"); if (pFieldMark && pFieldMark->GetMarkPos().nNode.GetIndex() == (*aResult)->m_aMkPos.m_nNode.GetIndex()+1 && pFieldMark->GetMarkPos().nContent.GetIndex() < (*aResult)->m_aMkPos.m_nContent) diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx index b722b22621d3..fd0f55dc7063 100644 --- a/sw/source/filter/ww8/wrtw8nds.cxx +++ b/sw/source/filter/ww8/wrtw8nds.cxx @@ -2314,7 +2314,7 @@ void MSWordExportBase::OutputTextNode( SwTextNode& rNode ) if ( ch == CH_TXT_ATR_FIELDSTART ) { SwPosition aPosition( rNode, SwIndex( &rNode, nCurrentPos ) ); - ::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition ); + ::sw::mark::IFieldmark const*const pFieldmark = pMarkAccess->getFieldmarkAt(aPosition); OSL_ENSURE( pFieldmark, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??" ); // Date field is exported as content control, not as a simple field @@ -2381,7 +2381,7 @@ void MSWordExportBase::OutputTextNode( SwTextNode& rNode ) else if ( ch == CH_TXT_ATR_FIELDEND ) { SwPosition aPosition( rNode, SwIndex( &rNode, nCurrentPos ) ); - ::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition ); + ::sw::mark::IFieldmark const*const pFieldmark = pMarkAccess->getFieldmarkAt(aPosition); OSL_ENSURE( pFieldmark, "Looks like this doc is broken...; where is the Fieldmark for the FIELDEND??" ); @@ -2418,7 +2418,7 @@ void MSWordExportBase::OutputTextNode( SwTextNode& rNode ) else if ( ch == CH_TXT_ATR_FORMELEMENT ) { SwPosition aPosition( rNode, SwIndex( &rNode, nCurrentPos ) ); - ::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition ); + ::sw::mark::IFieldmark const*const pFieldmark = pMarkAccess->getFieldmarkAt(aPosition); bool isDropdownOrCheckbox = pFieldmark && (pFieldmark->GetFieldname( ) == ODF_FORMDROPDOWN || pFieldmark->GetFieldname( ) == ODF_FORMCHECKBOX ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits