tdf#119840 don't load redlines in lcl_FindParagraphClassificationField

we don't need them here.

Shaves 10% off load time

Change-Id: I38050c131af24bf0cc7cadb71d0d4d9fa7a5a9f7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137290
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin
2022-07-21 14:07:57 +02:00
parent 49e559625d
commit 4d42b6fa4e
5 changed files with 47 additions and 20 deletions
+3
View File
@@ -45,6 +45,7 @@ class SwStartNode;
class SwTextNode;
class SwTableBox;
class SwXText;
class SwXTextPortionEnumeration;
typedef ::cppu::ImplInheritanceHelper
< ::sfx2::MetadatableMixin
@@ -206,6 +207,8 @@ public:
virtual OUString SAL_CALL getString() override;
virtual void SAL_CALL setString(const OUString& rString) override;
/// tries to return less data, but may return more than just text fields
rtl::Reference<SwXTextPortionEnumeration> createTextFieldsEnumeration();
};
+12 -10
View File
@@ -96,6 +96,7 @@
#include <fmtmeta.hxx>
#include <unotxdoc.hxx>
#include <unotextbodyhf.hxx>
#include <unoport.hxx>
#include <tools/diagnose_ex.h>
#include <IDocumentRedlineAccess.hxx>
@@ -542,17 +543,16 @@ bool lcl_IsParagraphClassificationField(const uno::Reference<frame::XModel>& xMo
}
uno::Reference<text::XTextField> lcl_FindParagraphClassificationField(const uno::Reference<frame::XModel>& xModel,
const uno::Reference<text::XTextContent>& xParagraph,
const rtl::Reference<SwXParagraph>& xParagraph,
std::u16string_view sKey = u"")
{
uno::Reference<text::XTextField> xTextField;
uno::Reference<container::XEnumerationAccess> xTextPortionEnumerationAccess(xParagraph, uno::UNO_QUERY);
if (!xTextPortionEnumerationAccess.is())
if (!xParagraph.is())
return xTextField;
// Enumerate text portions to find metadata fields. This is expensive, best to enumerate fields only.
uno::Reference<container::XEnumeration> xTextPortions = xTextPortionEnumerationAccess->createEnumeration();
rtl::Reference<SwXTextPortionEnumeration> xTextPortions = xParagraph->createTextFieldsEnumeration();
while (xTextPortions->hasMoreElements())
{
uno::Reference<beans::XPropertySet> xTextPortion(xTextPortions->nextElement(), uno::UNO_QUERY);
@@ -1159,7 +1159,7 @@ void SwEditShell::SetClassification(const OUString& rName, SfxClassificationPoli
// on a performance-sensitive path.
static void lcl_ApplyParagraphClassification(SwDoc* pDoc,
const uno::Reference<frame::XModel>& xModel,
const uno::Reference<text::XTextContent>& xParent,
const rtl::Reference<SwXParagraph>& xParent,
const css::uno::Reference<css::rdf::XResource>& xNodeSubject,
std::vector<svx::ClassificationResult> aResults)
{
@@ -1932,11 +1932,12 @@ void SwEditShell::RestoreMetadataFieldsAndValidateParagraphSignatures()
while (xParagraphs->hasMoreElements())
{
uno::Reference<text::XTextContent> xParagraph(xParagraphs->nextElement(), uno::UNO_QUERY);
uno::Reference<text::XTextContent> xParaOrTable(xParagraphs->nextElement(), uno::UNO_QUERY);
rtl::Reference<SwXParagraph> xParagraph(dynamic_cast<SwXParagraph*>(xParaOrTable.get()));
try
{
const css::uno::Reference<css::rdf::XResource> xSubject(xParagraph, uno::UNO_QUERY);
const css::uno::Reference<css::rdf::XResource> xSubject(xParagraph);
const std::map<OUString, OUString> aStatements = SwRDFHelper::getStatements(xModel, aGraphNames, xSubject);
const auto it = aStatements.find(ParagraphClassificationFieldNamesRDFName);
@@ -1991,7 +1992,7 @@ void SwEditShell::RestoreMetadataFieldsAndValidateParagraphSignatures()
// Get Signatures
std::map<OUString, SignatureDescr> aSignatures;
for (const auto& pair : lcl_getRDFStatements(xModel, xParagraph))
for (const auto& pair : lcl_getRDFStatements(xModel, uno::Reference<css::text::XTextContent>(xParagraph)))
{
const OUString& sName = pair.first;
if (sName.startsWith(ParagraphSignatureRDFNamespace))
@@ -2080,7 +2081,7 @@ bool SwEditShell::RemoveParagraphMetadataFieldAtCursor()
}
static OUString lcl_GetParagraphClassification(SfxClassificationHelper & rHelper, sfx::ClassificationKeyCreator const & rKeyCreator,
const uno::Reference<frame::XModel>& xModel, const uno::Reference<text::XTextContent>& xParagraph)
const uno::Reference<frame::XModel>& xModel, const rtl::Reference<SwXParagraph>& xParagraph)
{
uno::Reference<text::XTextField> xTextField;
xTextField = lcl_FindParagraphClassificationField(xModel, xParagraph, rKeyCreator.makeCategoryIdentifierKey());
@@ -2121,7 +2122,8 @@ static OUString lcl_GetHighestClassificationParagraphClass(SwPaM* pCursor)
rtl::Reference<SwXParagraphEnumeration> xParagraphs = xBodyText->createParagraphEnumeration();
while (xParagraphs->hasMoreElements())
{
uno::Reference<text::XTextContent> xParagraph(xParagraphs->nextElement(), uno::UNO_QUERY);
uno::Reference<text::XTextContent> xParaOrTable(xParagraphs->nextElement(), uno::UNO_QUERY);
rtl::Reference<SwXParagraph> xParagraph(dynamic_cast<SwXParagraph*>(xParaOrTable.get()));
const OUString sCurrentClass = lcl_GetParagraphClassification(aHelper, aKeyCreator, xModel, xParagraph);
sHighestClass = aHelper.GetHigherClass(sHighestClass, sCurrentClass);
}
+2 -1
View File
@@ -257,9 +257,10 @@ class SwXTextPortionEnumeration final
virtual ~SwXTextPortionEnumeration() override;
public:
/// @param bOnlyTextFields tries to return less data, but may return more than just text fields
SwXTextPortionEnumeration(SwPaM& rParaCursor,
css::uno::Reference< css::text::XText > const & xParent,
const sal_Int32 nStart, const sal_Int32 nEnd );
const sal_Int32 nStart, const sal_Int32 nEnd, bool bOnlyTextFields = false );
SwXTextPortionEnumeration(SwPaM& rParaCursor,
TextRangeList_t && rPortions );
+14
View File
@@ -1265,6 +1265,20 @@ SwXParagraph::createEnumeration()
return xRef;
}
/// tries to return less data, but may return more than just text fields
rtl::Reference< SwXTextPortionEnumeration >
SwXParagraph::createTextFieldsEnumeration()
{
SolarMutexGuard aGuard;
SwTextNode & rTextNode(m_pImpl->GetTextNodeOrThrow());
SwPosition aPos( rTextNode );
SwPaM aPam ( aPos );
return new SwXTextPortionEnumeration(aPam, m_pImpl->m_xParentText,
m_pImpl->m_nSelectionStartPos, m_pImpl->m_nSelectionEndPos, /*bOnlyTextFields*/true);
}
uno::Type SAL_CALL SwXParagraph::getElementType()
{
return cppu::UnoType<text::XTextRange>::get();
+16 -9
View File
@@ -78,7 +78,7 @@ static void lcl_CreatePortions(
uno::Reference< text::XText > const& i_xParentText,
SwUnoCursor* pUnoCursor,
FrameClientSortList_t & i_rFrames,
const sal_Int32 i_nStartPos, const sal_Int32 i_nEndPos );
const sal_Int32 i_nStartPos, const sal_Int32 i_nEndPos, bool bOnlyTextFields );
namespace
{
@@ -312,7 +312,8 @@ SwXTextPortionEnumeration::SwXTextPortionEnumeration(
SwPaM& rParaCursor,
uno::Reference< XText > const & xParentText,
const sal_Int32 nStart,
const sal_Int32 nEnd )
const sal_Int32 nEnd,
bool bOnlyTextFields)
{
m_pUnoCursor = rParaCursor.GetDoc().CreateUnoCursor(*rParaCursor.GetPoint());
@@ -323,7 +324,7 @@ SwXTextPortionEnumeration::SwXTextPortionEnumeration(
// find all frames, graphics and OLEs that are bound AT character in para
FrameClientSortList_t frames;
::CollectFrameAtNode(m_pUnoCursor->GetPoint()->nNode, frames, true);
lcl_CreatePortions(m_Portions, xParentText, &*m_pUnoCursor, frames, nStart, nEnd);
lcl_CreatePortions(m_Portions, xParentText, &*m_pUnoCursor, frames, nStart, nEnd, bOnlyTextFields);
}
SwXTextPortionEnumeration::SwXTextPortionEnumeration(
@@ -1341,7 +1342,8 @@ static void lcl_CreatePortions(
SwUnoCursor * const pUnoCursor,
FrameClientSortList_t & i_rFrames,
const sal_Int32 i_nStartPos,
const sal_Int32 i_nEndPos )
const sal_Int32 i_nEndPos,
bool bOnlyTextFields )
{
if (!pUnoCursor)
return;
@@ -1361,19 +1363,24 @@ static void lcl_CreatePortions(
SwDoc& rDoc = pUnoCursor->GetDoc();
std::deque<sal_Int32> FieldMarks;
lcl_FillFieldMarkArray(FieldMarks, *pUnoCursor, i_nStartPos);
if (!bOnlyTextFields)
lcl_FillFieldMarkArray(FieldMarks, *pUnoCursor, i_nStartPos);
SwXBookmarkPortion_ImplList Bookmarks;
lcl_FillBookmarkArray(rDoc, *pUnoCursor, Bookmarks);
if (!bOnlyTextFields)
lcl_FillBookmarkArray(rDoc, *pUnoCursor, Bookmarks);
SwXRedlinePortion_ImplList Redlines;
lcl_FillRedlineArray(rDoc, *pUnoCursor, Redlines);
if (!bOnlyTextFields)
lcl_FillRedlineArray(rDoc, *pUnoCursor, Redlines);
SwSoftPageBreakList SoftPageBreaks;
lcl_FillSoftPageBreakArray(*pUnoCursor, SoftPageBreaks);
if (!bOnlyTextFields)
lcl_FillSoftPageBreakArray(*pUnoCursor, SoftPageBreaks);
SwAnnotationStartPortion_ImplList AnnotationStarts;
lcl_FillAnnotationStartArray( rDoc, *pUnoCursor, AnnotationStarts );
if (!bOnlyTextFields)
lcl_FillAnnotationStartArray( rDoc, *pUnoCursor, AnnotationStarts );
PortionStack_t PortionStack;
PortionStack.push( PortionList_t(&i_rPortions, nullptr) );