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:
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) );
|
||||
|
||||
Reference in New Issue
Block a user