[Libreoffice-commits] core.git: sw/inc sw/source
Ashod Nakashian
ashodnakashian at yahoo.com
Sun Nov 5 11:16:22 UTC 2017
sw/inc/UndoParagraphSignature.hxx | 2
sw/inc/editsh.hxx | 7 +-
sw/source/core/edit/edfcol.cxx | 129 ++++++++++++++++++++++++--------------
sw/source/core/edit/edws.cxx | 5 +
sw/source/core/txtnode/ndtxt.cxx | 2
sw/source/uibase/app/docsh.cxx | 2
6 files changed, 95 insertions(+), 52 deletions(-)
New commits:
commit 30c10ae1b38342ced95889b33d95fe39c7cf6679
Author: Ashod Nakashian <ashodnakashian at yahoo.com>
Date: Tue Oct 31 21:52:49 2017 -0400
TSCP: refactor signature validation and simplify
Change-Id: I20e2f2825c9bd19d76ab450ffa70aca72fbb8b9a
Reviewed-on: https://gerrit.libreoffice.org/44146
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/sw/inc/UndoParagraphSignature.hxx b/sw/inc/UndoParagraphSignature.hxx
index 763a25d1ba6e..39b6dbf5d770 100644
--- a/sw/inc/UndoParagraphSignature.hxx
+++ b/sw/inc/UndoParagraphSignature.hxx
@@ -42,7 +42,7 @@ private:
const bool m_bRemove;
public:
- SwUndoParagraphSigning(const SwPosition& rPos,
+ SwUndoParagraphSigning(SwDoc* pDoc,
const uno::Reference<text::XTextField>& xField,
const uno::Reference<text::XTextContent>& xParent,
const bool bRemove);
diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx
index 285c4413c597..4461d9b0a04a 100644
--- a/sw/inc/editsh.hxx
+++ b/sw/inc/editsh.hxx
@@ -377,8 +377,11 @@ public:
/// Sign the paragraph at the cursor.
void SignParagraph();
- /// Validate paragraph signatures, if any, at the cursor.
- void ValidateParagraphSignatures(bool updateDontRemove);
+ /// Validate current paragraph signatures, if any, at the cursor start.
+ void ValidateCurrentParagraphSignatures(bool updateDontRemove);
+
+ /// Validate all paragraph signatures.
+ void ValidateAllParagraphSignatures(bool updateDontRemove);
/// Ensure that the classification of the doc is never lower than
/// the paragraph with the highest classification.
diff --git a/sw/source/core/edit/edfcol.cxx b/sw/source/core/edit/edfcol.cxx
index 30abe8ff5801..0e2fc36051bc 100644
--- a/sw/source/core/edit/edfcol.cxx
+++ b/sw/source/core/edit/edfcol.cxx
@@ -481,6 +481,60 @@ bool lcl_UpdateParagraphClassificationField(SwDoc* pDoc,
return false;
}
+void lcl_ValidateParagraphSignatures(SwDoc* pDoc, const uno::Reference<text::XTextContent>& xParagraph, const bool updateDontRemove)
+{
+ SwDocShell* pDocShell = pDoc->GetDocShell();
+ if (!pDocShell)
+ return;
+
+ uno::Reference<frame::XModel> xModel = pDocShell->GetBaseModel();
+ uno::Reference<container::XEnumerationAccess> xTextPortionEnumerationAccess(xParagraph, uno::UNO_QUERY);
+ if (!xTextPortionEnumerationAccess.is())
+ return;
+
+ uno::Reference<container::XEnumeration> xTextPortions = xTextPortionEnumerationAccess->createEnumeration();
+ if (!xTextPortions.is())
+ return;
+
+ // Get the text (without fields).
+ const OString utf8Text = lcl_getParagraphBodyText(xParagraph);
+ if (utf8Text.isEmpty())
+ return;
+
+ while (xTextPortions->hasMoreElements())
+ {
+ uno::Reference<beans::XPropertySet> xTextPortion(xTextPortions->nextElement(), uno::UNO_QUERY);
+ OUString aTextPortionType;
+ xTextPortion->getPropertyValue(UNO_NAME_TEXT_PORTION_TYPE) >>= aTextPortionType;
+ if (aTextPortionType != UNO_NAME_TEXT_FIELD)
+ continue;
+
+ uno::Reference<lang::XServiceInfo> xTextField;
+ xTextPortion->getPropertyValue(UNO_NAME_TEXT_FIELD) >>= xTextField;
+ if (!xTextField->supportsService(MetadataFieldServiceName))
+ continue;
+
+ uno::Reference<text::XTextField> xField(xTextField, uno::UNO_QUERY);
+ if (!lcl_IsParagraphSignatureField(xModel, xField))
+ {
+ continue;
+ }
+
+ if (updateDontRemove)
+ {
+ lcl_UpdateParagraphSignatureField(pDoc, xModel, xField, utf8Text);
+ }
+ else if (!lcl_MakeParagraphSignatureFieldText(xModel, xField, utf8Text).first)
+ {
+ pDoc->GetIDocumentUndoRedo().StartUndo(SwUndoId::PARA_SIGN_ADD, nullptr);
+ SwUndoParagraphSigning* pUndo = new SwUndoParagraphSigning(pDoc, xField, xParagraph, false);
+ pDoc->GetIDocumentUndoRedo().AppendUndo(pUndo);
+ lcl_RemoveParagraphMetadataField(xField);
+ pDoc->GetIDocumentUndoRedo().EndUndo(SwUndoId::PARA_SIGN_ADD, nullptr);
+ }
+ }
+}
+
} // anonymous namespace
SwTextFormatColl& SwEditShell::GetDfltTextFormatColl() const
@@ -1417,12 +1471,12 @@ void SwEditShell::SetWatermark(const SfxWatermarkItem& rWatermark)
}
}
-SwUndoParagraphSigning::SwUndoParagraphSigning(const SwPosition& rPos,
+SwUndoParagraphSigning::SwUndoParagraphSigning(SwDoc* pDoc,
const uno::Reference<text::XTextField>& xField,
const uno::Reference<text::XTextContent>& xParent,
const bool bRemove)
- : SwUndo(SwUndoId::PARA_SIGN_ADD, rPos.GetDoc()),
- m_pDoc(rPos.GetDoc()),
+ : SwUndo(SwUndoId::PARA_SIGN_ADD, pDoc),
+ m_pDoc(pDoc),
m_xField(xField),
m_xParent(xParent),
m_bRemove(bRemove)
@@ -1564,13 +1618,13 @@ void SwEditShell::SignParagraph()
lcl_UpdateParagraphSignatureField(GetDoc(), xModel, xField, utf8Text);
- SwUndoParagraphSigning* pUndo = new SwUndoParagraphSigning(SwPosition(*pNode), xField, xParent, true);
+ SwUndoParagraphSigning* pUndo = new SwUndoParagraphSigning(GetDoc(), xField, xParent, true);
GetDoc()->GetIDocumentUndoRedo().AppendUndo(pUndo);
GetDoc()->GetIDocumentUndoRedo().EndUndo(SwUndoId::PARA_SIGN_ADD, nullptr);
}
-void SwEditShell::ValidateParagraphSignatures(bool updateDontRemove)
+void SwEditShell::ValidateCurrentParagraphSignatures(bool updateDontRemove)
{
SwDocShell* pDocShell = GetDoc()->GetDocShell();
if (!pDocShell || !IsParagraphSignatureValidationEnabled())
@@ -1582,14 +1636,20 @@ void SwEditShell::ValidateParagraphSignatures(bool updateDontRemove)
if (!pNode)
return;
- // 2. For each signature field, update it.
- const uno::Reference<text::XTextContent> xParent = SwXParagraph::CreateXParagraph(*pNode->GetDoc(), pNode);
- uno::Reference<container::XEnumerationAccess> xTextPortionEnumerationAccess(xParent, uno::UNO_QUERY);
- if (!xTextPortionEnumerationAccess.is())
- return;
+ // Prevent recursive validation since this is triggered on node updates, which we do below.
+ const bool bOldValidationFlag = SetParagraphSignatureValidation(false);
+ comphelper::ScopeGuard const g([this, bOldValidationFlag] () {
+ SetParagraphSignatureValidation(bOldValidationFlag);
+ });
- uno::Reference<frame::XModel> xModel = pDocShell->GetBaseModel();
- uno::Reference<container::XEnumeration> xTextPortions = xTextPortionEnumerationAccess->createEnumeration();
+ lcl_ValidateParagraphSignatures(GetDoc(), SwXParagraph::CreateXParagraph(*pNode->GetDoc(), pNode), updateDontRemove);
+}
+
+void SwEditShell::ValidateAllParagraphSignatures(bool updateDontRemove)
+{
+ SwDocShell* pDocShell = GetDoc()->GetDocShell();
+ if (!pDocShell || !IsParagraphSignatureValidationEnabled())
+ return;
// Prevent recursive validation since this is triggered on node updates, which we do below.
const bool bOldValidationFlag = SetParagraphSignatureValidation(false);
@@ -1597,42 +1657,19 @@ void SwEditShell::ValidateParagraphSignatures(bool updateDontRemove)
SetParagraphSignatureValidation(bOldValidationFlag);
});
- // 2. Get the text (without fields).
- const OString utf8Text = lcl_getParagraphBodyText(xParent);
- if (utf8Text.isEmpty())
+ uno::Reference<frame::XModel> xModel = pDocShell->GetBaseModel();
+ const uno::Reference<text::XTextDocument> xDoc(xModel, uno::UNO_QUERY);
+ uno::Reference<text::XText> xParent = xDoc->getText();
+ uno::Reference<container::XEnumerationAccess> xParagraphEnumerationAccess(xParent, uno::UNO_QUERY);
+ if (!xParagraphEnumerationAccess.is())
return;
-
- while (xTextPortions->hasMoreElements())
+ uno::Reference<container::XEnumeration> xParagraphs = xParagraphEnumerationAccess->createEnumeration();
+ if (!xParagraphs.is())
+ return;
+ while (xParagraphs->hasMoreElements())
{
- uno::Reference<beans::XPropertySet> xTextPortion(xTextPortions->nextElement(), uno::UNO_QUERY);
- OUString aTextPortionType;
- xTextPortion->getPropertyValue(UNO_NAME_TEXT_PORTION_TYPE) >>= aTextPortionType;
- if (aTextPortionType != UNO_NAME_TEXT_FIELD)
- continue;
-
- uno::Reference<lang::XServiceInfo> xTextField;
- xTextPortion->getPropertyValue(UNO_NAME_TEXT_FIELD) >>= xTextField;
- if (!xTextField->supportsService(MetadataFieldServiceName))
- continue;
-
- uno::Reference<text::XTextField> xField(xTextField, uno::UNO_QUERY);
- if (!lcl_IsParagraphSignatureField(xModel, xField))
- {
- continue;
- }
-
- if (updateDontRemove)
- {
- lcl_UpdateParagraphSignatureField(GetDoc(), xModel, xField, utf8Text);
- }
- else if (!lcl_MakeParagraphSignatureFieldText(xModel, xField, utf8Text).first)
- {
- GetDoc()->GetIDocumentUndoRedo().StartUndo(SwUndoId::PARA_SIGN_ADD, nullptr);
- SwUndoParagraphSigning* pUndo = new SwUndoParagraphSigning(SwPosition(*pNode), xField, xParent, false);
- GetDoc()->GetIDocumentUndoRedo().AppendUndo(pUndo);
- lcl_RemoveParagraphMetadataField(xField);
- GetDoc()->GetIDocumentUndoRedo().EndUndo(SwUndoId::PARA_SIGN_ADD, nullptr);
- }
+ uno::Reference<text::XTextContent> xParagraph(xParagraphs->nextElement(), uno::UNO_QUERY);
+ lcl_ValidateParagraphSignatures(GetDoc(), xParagraph, updateDontRemove);
}
}
diff --git a/sw/source/core/edit/edws.cxx b/sw/source/core/edit/edws.cxx
index c19d373a8bfb..01dc694ab450 100644
--- a/sw/source/core/edit/edws.cxx
+++ b/sw/source/core/edit/edws.cxx
@@ -53,7 +53,10 @@ SwEditShell::SwEditShell( SwDoc& rDoc, vcl::Window *pWindow, const SwViewOption
// Update the paragraph signatures.
// Since this ctor is called only on creating/loading the doc, we validate once only.
- ValidateParagraphSignatures(true);
+ //FIXME: This is taking too long for the scheduler's taste.
+ // Need to do a quick check to see if a paragraph is signed or not,
+ // but for that need paragraph RDF, which is in a later patch.
+ // ValidateAllParagraphSignatures(true);
}
SwEditShell::~SwEditShell() // USED
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 666f8a05e1ca..2fc443a2d4ba 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -1214,7 +1214,7 @@ void SwTextNode::Update(
// Update the paragraph signatures.
if (SwEditShell* pEditShell = GetDoc()->GetEditShell())
{
- pEditShell->ValidateParagraphSignatures(true);
+ pEditShell->ValidateCurrentParagraphSignatures(true);
}
// Inform LOK clients about change in position of redlines (if any)
diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx
index d5543c5af7cc..40d52c938b4f 100644
--- a/sw/source/uibase/app/docsh.cxx
+++ b/sw/source/uibase/app/docsh.cxx
@@ -473,7 +473,7 @@ bool SwDocShell::SaveAs( SfxMedium& rMedium )
m_pWrtShell->EndAllTableBoxEdit();
// Remove invalid signatures.
- m_pWrtShell->ValidateParagraphSignatures(false);
+ m_pWrtShell->ValidateAllParagraphSignatures(false);
m_pWrtShell->ClassifyDocPerHighestParagraphClass();
}
More information about the Libreoffice-commits
mailing list