[Libreoffice-commits] core.git: include/svx sd/source svx/source sw/source
Tomaž Vajngerl
tomaz.vajngerl at collabora.co.uk
Tue Oct 31 08:54:13 UTC 2017
include/svx/ClassificationField.hxx | 4
sd/source/ui/view/drviews2.cxx | 55 +++++-
svx/source/dialog/ClassificationDialog.cxx | 48 +++++
svx/source/dialog/ClassificationEditView.cxx | 24 +-
sw/source/core/edit/edfcol.cxx | 221 +++++++++++++++++----------
5 files changed, 255 insertions(+), 97 deletions(-)
New commits:
commit 73f57984110a3c5bb19168dd0789c0c3c809b24e
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Fri Oct 27 16:03:52 2017 +0900
TSCP: proper collecting and applying of paragraph and text weight
Change-Id: I22edc4adb87706a176c3afa3500963c4a5b46ee7
Reviewed-on: https://gerrit.libreoffice.org/44015
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
diff --git a/include/svx/ClassificationField.hxx b/include/svx/ClassificationField.hxx
index 559ed66511d8..b57f29cbafbe 100644
--- a/include/svx/ClassificationField.hxx
+++ b/include/svx/ClassificationField.hxx
@@ -22,7 +22,8 @@ enum class ClassificationType
CATEGORY,
MARKING,
TEXT,
- INTELLECTUAL_PROPERTY_PART
+ INTELLECTUAL_PROPERTY_PART,
+ PARAGRAPH,
};
class SVX_DLLPUBLIC ClassificationField : public SvxFieldData
@@ -61,7 +62,6 @@ struct SVX_DLLPUBLIC ClassificationResult
ClassificationType meType;
OUString msString;
OUString msAbbreviatedString;
- sal_Int32 mnParagraph;
};
} // end svx namespace
diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx
index 49706a9cdd0d..e96a69db7c60 100644
--- a/sd/source/ui/view/drviews2.cxx
+++ b/sd/source/ui/view/drviews2.cxx
@@ -299,7 +299,6 @@ public:
const sal_uInt16 nCount = m_rDrawViewShell.GetDoc()->GetMasterSdPageCount(PageKind::Standard);
- sal_Int32 nParagraph = 1;
bool bFound = false;
for (sal_uInt16 nPageIndex = 0; nPageIndex < nCount; ++nPageIndex)
@@ -323,8 +322,34 @@ public:
bFound = true;
m_pRectObject = pRectObject;
const OUString sBlank("");
+ sal_Int32 nCurrentParagraph = -1;
+
for (editeng::Section const & rSection : aSections)
{
+ // Insert new paragraph if needed
+ while (nCurrentParagraph < rSection.mnParagraph)
+ {
+ nCurrentParagraph++;
+
+ // Get Weight of current paragraph
+ FontWeight eFontWeight = WEIGHT_NORMAL;
+ SfxItemSet aItemSet(rEditText.GetParaAttribs(nCurrentParagraph));
+ if (const SfxPoolItem* pItem = aItemSet.GetItem(EE_CHAR_WEIGHT, false))
+ {
+ const SvxWeightItem* pWeightItem = dynamic_cast<const SvxWeightItem*>(pItem);
+ if (pWeightItem && pWeightItem->GetWeight() == WEIGHT_BOLD)
+ eFontWeight = WEIGHT_BOLD;
+ }
+
+ // Font weight to string
+ OUString sWeightProperty = "NORMAL";
+ if (eFontWeight == WEIGHT_BOLD)
+ sWeightProperty = "BOLD";
+
+ // Insert into collection
+ m_aResults.push_back({ svx::ClassificationType::PARAGRAPH, sWeightProperty, sBlank });
+ }
+
const SvxFieldItem* pFieldItem = findField(rSection);
const editeng::CustomPropertyField* pCustomPropertyField = pFieldItem ? dynamic_cast<const editeng::CustomPropertyField*>(pFieldItem->GetField()) : nullptr;
if (pCustomPropertyField)
@@ -333,22 +358,22 @@ public:
if (aKey.startsWith(sPolicy + "Marking:Text:"))
{
OUString aValue = lcl_getProperty(xPropertyContainer, aKey);
- m_aResults.push_back({ svx::ClassificationType::TEXT, aValue, sBlank, nParagraph });
+ m_aResults.push_back({ svx::ClassificationType::TEXT, aValue, sBlank });
}
else if (aKey.startsWith(sPolicy + "BusinessAuthorizationCategory:Name"))
{
OUString aValue = lcl_getProperty(xPropertyContainer, aKey);
- m_aResults.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank, nParagraph });
+ m_aResults.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank });
}
else if (aKey.startsWith(sPolicy + "Extension:Marking"))
{
OUString aValue = lcl_getProperty(xPropertyContainer, aKey);
- m_aResults.push_back({ svx::ClassificationType::MARKING, aValue, sBlank, nParagraph });
+ m_aResults.push_back({ svx::ClassificationType::MARKING, aValue, sBlank });
}
else if (aKey.startsWith(sPolicy + "Extension:IntellectualPropertyPart"))
{
OUString aValue = lcl_getProperty(xPropertyContainer, aKey);
- m_aResults.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank, nParagraph });
+ m_aResults.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank });
}
}
}
@@ -415,9 +440,11 @@ public:
pOutliner = pView->GetTextEditOutliner();
}
+ sal_Int32 nParagraph = -1;
for (svx::ClassificationResult const & rResult : rResults)
{
- ESelection aPosition(EE_PARA_MAX_COUNT, EE_TEXTPOS_MAX_COUNT, EE_PARA_MAX_COUNT, EE_TEXTPOS_MAX_COUNT);
+
+ ESelection aPosition(nParagraph, EE_TEXTPOS_MAX_COUNT, nParagraph, EE_TEXTPOS_MAX_COUNT);
switch(rResult.meType)
{
@@ -453,6 +480,22 @@ public:
}
break;
+ case svx::ClassificationType::PARAGRAPH:
+ {
+ nParagraph++;
+ pOutliner->Insert("");
+
+ SfxItemSet aItemSet(m_rDrawViewShell.GetDoc()->GetPool(), svl::Items<EE_ITEMS_START, EE_ITEMS_END>{});
+
+ if (rResult.msString == "BOLD")
+ aItemSet.Put(SvxWeightItem(WEIGHT_BOLD, EE_CHAR_WEIGHT));
+ else
+ aItemSet.Put(SvxWeightItem(WEIGHT_NORMAL, EE_CHAR_WEIGHT));
+
+ pOutliner->SetParaAttribs(nParagraph, aItemSet);
+ }
+ break;
+
default:
break;
}
diff --git a/svx/source/dialog/ClassificationDialog.cxx b/svx/source/dialog/ClassificationDialog.cxx
index d9b2ec868235..f99d4f97bd0c 100644
--- a/svx/source/dialog/ClassificationDialog.cxx
+++ b/svx/source/dialog/ClassificationDialog.cxx
@@ -13,6 +13,7 @@
#include <editeng/eeitem.hxx>
#include <editeng/section.hxx>
#include <editeng/editobj.hxx>
+#include <editeng/wghtitem.hxx>
#include <svl/itemset.hxx>
namespace svx {
@@ -21,7 +22,7 @@ namespace {
const SvxFieldItem* findField(editeng::Section const & rSection)
{
- for (SfxPoolItem const * pPool: rSection.maAttributes)
+ for (SfxPoolItem const * pPool : rSection.maAttributes)
{
if (pPool->Which() == EE_FEATURE_FIELD)
return static_cast<const SvxFieldItem*>(pPool);
@@ -110,6 +111,7 @@ void ClassificationDialog::insertField(ClassificationType eType, OUString const
void ClassificationDialog::setupValues(std::vector<ClassificationResult> const & rInput)
{
+ sal_Int32 nParagraph = -1;
for (ClassificationResult const & rClassificationResult : rInput)
{
OUString msAbbreviatedString = rClassificationResult.msAbbreviatedString;
@@ -145,6 +147,21 @@ void ClassificationDialog::setupValues(std::vector<ClassificationResult> const &
}
break;
+ case svx::ClassificationType::PARAGRAPH:
+ {
+ nParagraph++;
+
+ if (nParagraph != 0)
+ m_pEditWindow->pEdView->InsertParaBreak();
+
+ // Set paragraph font weight
+ FontWeight eWeight = (rClassificationResult.msString == "BOLD") ? WEIGHT_BOLD : WEIGHT_NORMAL;
+ std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(m_pEditWindow->pEdEngine->GetParaAttribs(nParagraph)));
+ pSet->Put(SvxWeightItem(eWeight, EE_CHAR_WEIGHT));
+ m_pEditWindow->pEdEngine->SetParaAttribs(nParagraph, *pSet);
+ }
+ break;
+
default:
break;
}
@@ -157,11 +174,34 @@ std::vector<ClassificationResult> ClassificationDialog::getResult()
std::unique_ptr<EditTextObject> pEditText(m_pEditWindow->pEdEngine->CreateTextObject());
+ sal_Int32 nCurrentParagraph = -1;
+
std::vector<editeng::Section> aSections;
pEditText->GetAllSections(aSections);
-
for (editeng::Section const & rSection : aSections)
{
+ while (nCurrentParagraph < rSection.mnParagraph)
+ {
+ nCurrentParagraph++;
+
+ // Get Weight of current paragraph
+ FontWeight eFontWeight = WEIGHT_NORMAL;
+ SfxItemSet aItemSet(m_pEditWindow->pEdEngine->GetParaAttribs(nCurrentParagraph));
+ if (const SfxPoolItem* pItem = aItemSet.GetItem(EE_CHAR_WEIGHT, false))
+ {
+ const SvxWeightItem* pWeightItem = dynamic_cast<const SvxWeightItem*>(pItem);
+ if (pWeightItem && pWeightItem->GetWeight() == WEIGHT_BOLD)
+ eFontWeight = WEIGHT_BOLD;
+ }
+ // Font weight to string
+ OUString sWeightProperty = "NORMAL";
+ if (eFontWeight == WEIGHT_BOLD)
+ sWeightProperty = "BOLD";
+ // Insert into collection
+ OUString sBlank;
+ aClassificationResults.push_back({ ClassificationType::PARAGRAPH, sWeightProperty, sBlank });
+ }
+
const SvxFieldItem* pFieldItem = findField(rSection);
ESelection aSelection(rSection.mnParagraph, rSection.mnStart, rSection.mnParagraph, rSection.mnEnd);
@@ -172,11 +212,11 @@ std::vector<ClassificationResult> ClassificationDialog::getResult()
if (pClassificationField)
{
- aClassificationResults.push_back({ pClassificationField->meType, pClassificationField->msFullClassName, sDisplayString, rSection.mnParagraph });
+ aClassificationResults.push_back({ pClassificationField->meType, pClassificationField->msFullClassName, sDisplayString });
}
else
{
- aClassificationResults.push_back({ ClassificationType::TEXT, sDisplayString, sDisplayString, rSection.mnParagraph });
+ aClassificationResults.push_back({ ClassificationType::TEXT, sDisplayString, sDisplayString });
}
}
}
diff --git a/svx/source/dialog/ClassificationEditView.cxx b/svx/source/dialog/ClassificationEditView.cxx
index 1c602a2f2343..a992dc0aedf2 100644
--- a/svx/source/dialog/ClassificationEditView.cxx
+++ b/svx/source/dialog/ClassificationEditView.cxx
@@ -91,18 +91,24 @@ void ClassificationEditView::InsertField(const SvxFieldItem& rFieldItem)
void ClassificationEditView::InvertSelectionWeight()
{
- std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(pEdEngine->GetAttribs(pEdView->GetSelection())));
- FontWeight eFontWeight = WEIGHT_BOLD;
- if (const SfxPoolItem* pItem = pSet->GetItem(EE_CHAR_WEIGHT, true))
+ ESelection aSelection = pEdView->GetSelection();
+
+ for (sal_Int32 nParagraph = aSelection.nStartPara; nParagraph <= aSelection.nEndPara; ++nParagraph)
{
- const SvxWeightItem* pWeightItem = dynamic_cast<const SvxWeightItem*>(pItem);
- if (pWeightItem && pWeightItem->GetWeight() == WEIGHT_BOLD)
- eFontWeight = WEIGHT_NORMAL;
+ FontWeight eFontWeight = WEIGHT_BOLD;
+
+ std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(pEdEngine->GetParaAttribs(nParagraph)));
+ if (const SfxPoolItem* pItem = pSet->GetItem(EE_CHAR_WEIGHT, false))
+ {
+ const SvxWeightItem* pWeightItem = dynamic_cast<const SvxWeightItem*>(pItem);
+ if (pWeightItem && pWeightItem->GetWeight() == WEIGHT_BOLD)
+ eFontWeight = WEIGHT_NORMAL;
+ }
+ SvxWeightItem aWeight(eFontWeight, EE_CHAR_WEIGHT);
+ pSet->Put(aWeight);
+ pEdEngine->SetParaAttribs(nParagraph, *pSet);
}
- SvxWeightItem aWeight(eFontWeight, EE_CHAR_WEIGHT);
- pSet->Put(aWeight);
- pEdEngine->QuickSetAttribs(*pSet, pEdView->GetSelection());
pEdView->Invalidate();
}
diff --git a/sw/source/core/edit/edfcol.cxx b/sw/source/core/edit/edfcol.cxx
index 21b9461c0f15..457fb80a01b8 100644
--- a/sw/source/core/edit/edfcol.cxx
+++ b/sw/source/core/edit/edfcol.cxx
@@ -36,6 +36,9 @@
#include <com/sun/star/text/XTextDocument.hpp>
#include <com/sun/star/text/XTextField.hpp>
#include <com/sun/star/text/XTextRange.hpp>
+#include <com/sun/star/text/XParagraphAppend.hpp>
+#include <com/sun/star/text/XParagraphCursor.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
#include <com/sun/star/xml/crypto/SEInitializer.hpp>
#include <com/sun/star/rdf/XMetadatable.hpp>
#include <com/sun/star/security/DocumentDigitalSignatures.hpp>
@@ -525,14 +528,76 @@ bool addOrInsertDocumentProperty(uno::Reference<beans::XPropertyContainer> const
return true;
}
-void insertFieldToDocument(uno::Reference<lang::XMultiServiceFactory> const & rxMultiServiceFactory, uno::Reference<text::XText> const & rxText, OUString const & rsKey)
+void insertFieldToDocument(uno::Reference<lang::XMultiServiceFactory> const & rxMultiServiceFactory,
+ uno::Reference<text::XText> const & rxText, uno::Reference<text::XParagraphCursor> const & rxParagraphCursor,
+ OUString const & rsKey)
{
- if (!lcl_hasField(rxText, DocInfoServiceName, rsKey))
+ uno::Reference<beans::XPropertySet> xField(rxMultiServiceFactory->createInstance(DocInfoServiceName), uno::UNO_QUERY);
+ xField->setPropertyValue(UNO_NAME_NAME, uno::makeAny(rsKey));
+ uno::Reference<text::XTextContent> xTextContent(xField, uno::UNO_QUERY);
+
+ rxText->insertTextContent(rxParagraphCursor, xTextContent, false);
+}
+
+void removeAllClassificationFields(OUString const & rPolicy, uno::Reference<text::XText> const & rxText)
+{
+ uno::Reference<container::XEnumerationAccess> xParagraphEnumerationAccess(rxText, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParagraphs = xParagraphEnumerationAccess->createEnumeration();
+ while (xParagraphs->hasMoreElements())
+ {
+ uno::Reference<container::XEnumerationAccess> xTextPortionEnumerationAccess(xParagraphs->nextElement(), uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xTextPortions = xTextPortionEnumerationAccess->createEnumeration();
+ 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(DocInfoServiceName))
+ continue;
+
+ OUString aName;
+ uno::Reference<beans::XPropertySet> xPropertySet(xTextField, uno::UNO_QUERY);
+ xPropertySet->getPropertyValue(UNO_NAME_NAME) >>= aName;
+ if (aName.startsWith(rPolicy))
+ {
+ uno::Reference<text::XTextField> xField(xTextField, uno::UNO_QUERY);
+ rxText->removeTextContent(xField);
+ }
+ }
+ }
+}
+
+sal_Int32 getNumberOfParagraphs(uno::Reference<text::XText> const & xText)
+{
+ uno::Reference<container::XEnumerationAccess> xParagraphEnumAccess(xText, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParagraphEnum = xParagraphEnumAccess->createEnumeration();
+ sal_Int32 nResult = 0;
+ while (xParagraphEnum->hasMoreElements())
{
- uno::Reference<beans::XPropertySet> xField(rxMultiServiceFactory->createInstance(DocInfoServiceName), uno::UNO_QUERY);
- xField->setPropertyValue(UNO_NAME_NAME, uno::makeAny(rsKey));
- uno::Reference<text::XTextContent> xTextContent(xField, uno::UNO_QUERY);
- rxText->insertTextContent(rxText->getEnd(), xTextContent, false);
+ xParagraphEnum->nextElement();
+ nResult++;
+ }
+ return nResult;
+}
+
+void equaliseNumberOfParagraph(std::vector<svx::ClassificationResult> const & rResults, uno::Reference<text::XText> const & xText)
+{
+ sal_Int32 nNumberOfParagraphs = 0;
+ for (svx::ClassificationResult const & rResult : rResults)
+ {
+ if (rResult.meType == svx::ClassificationType::PARAGRAPH)
+ nNumberOfParagraphs++;
+ }
+
+ while (getNumberOfParagraphs(xText) < nNumberOfParagraphs)
+ {
+ uno::Reference<text::XParagraphAppend> xParagraphAppend(xText, uno::UNO_QUERY);
+ xParagraphAppend->finishParagraph(uno::Sequence<beans::PropertyValue>());
}
}
@@ -551,8 +616,6 @@ void SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
uno::Reference<document::XDocumentProperties> xDocumentProperties = SfxObjectShell::Current()->getDocProperties();
- // First, we need to remove the old ones.
- //TODO: we should get this as a param, since we pass it to the dialog.
const OUString sPolicy = SfxClassificationHelper::policyTypeToString(SfxClassificationHelper::getPolicyType());
const std::vector<OUString> aUsedPageStyles = lcl_getUsedPageStyles(this);
for (const OUString& rPageStyleName : aUsedPageStyles)
@@ -565,6 +628,10 @@ void SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
uno::Reference<text::XText> xHeaderText;
if (bHeaderIsOn)
xPageStyle->getPropertyValue(UNO_NAME_HEADER_TEXT) >>= xHeaderText;
+ if (xHeaderText.is())
+ removeAllClassificationFields(sPolicy, xHeaderText);
+
+ equaliseNumberOfParagraph(rResults, xHeaderText);
// FOOTER
bool bFooterIsOn = false;
@@ -572,55 +639,10 @@ void SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
uno::Reference<text::XText> xFooterText;
if (bFooterIsOn)
xPageStyle->getPropertyValue(UNO_NAME_FOOTER_TEXT) >>= xFooterText;
+ if (xFooterText.is())
+ removeAllClassificationFields(sPolicy, xFooterText);
- sal_Int32 nTextNumber = 1;
- OUString sKey;
- for (svx::ClassificationResult const & rResult : CollectAdvancedClassification())
- {
- sKey = "";
- switch(rResult.meType)
- {
- case svx::ClassificationType::TEXT:
- {
- sKey = sPolicy + "Marking:Text:" + OUString::number(nTextNumber++);
- }
- break;
-
- case svx::ClassificationType::CATEGORY:
- {
- sKey = sPolicy + "BusinessAuthorizationCategory:Name";
- }
- break;
-
- case svx::ClassificationType::MARKING:
- {
- sKey = sPolicy + "Extension:Marking";
- }
- break;
-
- case svx::ClassificationType::INTELLECTUAL_PROPERTY_PART:
- {
- sKey = sPolicy + "Extension:IntellectualPropertyPart";
- }
- break;
-
- default:
- break;
- }
-
- if (!sKey.isEmpty())
- {
- uno::Reference<css::text::XTextField> xField = lcl_findClassificationField(xHeaderText, DocInfoServiceName, sKey);
- if (xField.is())
- {
- if (xHeaderText.is())
- xHeaderText->removeTextContent(xField);
-
- if (xFooterText.is())
- xFooterText->removeTextContent(xField);
- }
- }
- }
+ equaliseNumberOfParagraph(rResults, xFooterText);
}
// Clear properties
@@ -660,6 +682,11 @@ void SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
sal_Int32 nTextNumber = 1;
+ uno::Reference<text::XParagraphCursor> xHeaderParagraphCursor(xHeaderText->createTextCursor(), uno::UNO_QUERY);
+ uno::Reference<text::XParagraphCursor> xFooterParagraphCursor(xFooterText->createTextCursor(), uno::UNO_QUERY);
+
+ sal_Int32 nParagraph = -1;
+
for (svx::ClassificationResult const & rResult : rResults)
{
switch(rResult.meType)
@@ -670,16 +697,16 @@ void SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
nTextNumber++;
addOrInsertDocumentProperty(xPropertyContainer, sKey, rResult.msString);
- insertFieldToDocument(xMultiServiceFactory, xHeaderText, sKey);
- insertFieldToDocument(xMultiServiceFactory, xFooterText, sKey);
+ insertFieldToDocument(xMultiServiceFactory, xHeaderText, xHeaderParagraphCursor, sKey);
+ insertFieldToDocument(xMultiServiceFactory, xFooterText, xFooterParagraphCursor, sKey);
}
break;
case svx::ClassificationType::CATEGORY:
{
OUString sKey = sPolicy + "BusinessAuthorizationCategory:Name";
- insertFieldToDocument(xMultiServiceFactory, xHeaderText, sKey);
- insertFieldToDocument(xMultiServiceFactory, xFooterText, sKey);
+ insertFieldToDocument(xMultiServiceFactory, xHeaderText, xHeaderParagraphCursor, sKey);
+ insertFieldToDocument(xMultiServiceFactory, xFooterText, xFooterParagraphCursor, sKey);
}
break;
@@ -687,8 +714,8 @@ void SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
{
OUString sKey = sPolicy + "Extension:Marking";
addOrInsertDocumentProperty(xPropertyContainer, sKey, rResult.msString);
- insertFieldToDocument(xMultiServiceFactory, xHeaderText, sKey);
- insertFieldToDocument(xMultiServiceFactory, xFooterText, sKey);
+ insertFieldToDocument(xMultiServiceFactory, xHeaderText, xHeaderParagraphCursor, sKey);
+ insertFieldToDocument(xMultiServiceFactory, xFooterText, xFooterParagraphCursor, sKey);
}
break;
@@ -696,8 +723,36 @@ void SwEditShell::ApplyAdvancedClassification(std::vector<svx::ClassificationRes
{
OUString sKey = sPolicy + "Extension:IntellectualPropertyPart";
addOrInsertDocumentProperty(xPropertyContainer, sKey, rResult.msString);
- insertFieldToDocument(xMultiServiceFactory, xHeaderText, sKey);
- insertFieldToDocument(xMultiServiceFactory, xFooterText, sKey);
+ insertFieldToDocument(xMultiServiceFactory, xHeaderText, xHeaderParagraphCursor, sKey);
+ insertFieldToDocument(xMultiServiceFactory, xFooterText, xFooterParagraphCursor, sKey);
+ }
+ break;
+
+ case svx::ClassificationType::PARAGRAPH:
+ {
+ nParagraph++;
+
+ if (nParagraph != 0) // only jump to next paragraph, if we aren't at the first paragraph
+ {
+ xHeaderParagraphCursor->gotoNextParagraph(false);
+ xFooterParagraphCursor->gotoNextParagraph(false);
+ }
+
+ xHeaderParagraphCursor->gotoStartOfParagraph(false);
+ xFooterParagraphCursor->gotoStartOfParagraph(false);
+
+ uno::Reference<beans::XPropertySet> xHeaderPropertySet(xHeaderParagraphCursor, uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xFooterPropertySet(xFooterParagraphCursor, uno::UNO_QUERY_THROW);
+ if (rResult.msString == "BOLD")
+ {
+ xHeaderPropertySet->setPropertyValue("CharWeight", uno::makeAny(awt::FontWeight::BOLD));
+ xFooterPropertySet->setPropertyValue("CharWeight", uno::makeAny(awt::FontWeight::BOLD));
+ }
+ else
+ {
+ xHeaderPropertySet->setPropertyValue("CharWeight", uno::makeAny(awt::FontWeight::NORMAL));
+ xFooterPropertySet->setPropertyValue("CharWeight", uno::makeAny(awt::FontWeight::NORMAL));
+ }
}
break;
@@ -740,12 +795,23 @@ std::vector<svx::ClassificationResult> SwEditShell::CollectAdvancedClassificatio
uno::Reference<beans::XPropertyContainer> xPropertyContainer = xDocumentProperties->getUserDefinedProperties();
OUString sPolicy = SfxClassificationHelper::policyTypeToString(SfxClassificationHelper::getPolicyType());
- sal_Int32 nParagraph = 1;
+
+ const OUString sBlank("");
while (xParagraphs->hasMoreElements())
{
uno::Reference<container::XEnumerationAccess> xTextPortionEnumerationAccess(xParagraphs->nextElement(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xTextPortions = xTextPortionEnumerationAccess->createEnumeration();
+
+ // Check font weitght
+ uno::Reference<beans::XPropertySet> xParagraphPropertySet(xTextPortionEnumerationAccess, uno::UNO_QUERY_THROW);
+ uno::Any aAny = xParagraphPropertySet->getPropertyValue("CharWeight");
+
+ OUString sWeight = (aAny.get<float>() >= awt::FontWeight::BOLD) ? OUString("BOLD") : OUString("NORMAL");
+
+ aResult.push_back({ svx::ClassificationType::PARAGRAPH, sWeight, sBlank });
+
+ // Process portions..
while (xTextPortions->hasMoreElements())
{
uno::Reference<beans::XPropertySet> xTextPortion(xTextPortions->nextElement(), uno::UNO_QUERY);
@@ -762,33 +828,32 @@ std::vector<svx::ClassificationResult> SwEditShell::CollectAdvancedClassificatio
OUString aName;
uno::Reference<beans::XPropertySet> xPropertySet(xTextField, uno::UNO_QUERY);
xPropertySet->getPropertyValue(UNO_NAME_NAME) >>= aName;
- const OUString sBlank("");
+
if (aName.startsWith(sPolicy + "Marking:Text:"))
{
const OUString aValue = lcl_getProperty(xPropertyContainer, aName);
if (!aValue.isEmpty())
- aResult.push_back({ svx::ClassificationType::TEXT, aValue, sBlank, nParagraph });
+ aResult.push_back({ svx::ClassificationType::TEXT, aValue, sBlank });
}
else if (aName.startsWith(sPolicy + "BusinessAuthorizationCategory:Name"))
{
const OUString aValue = lcl_getProperty(xPropertyContainer, aName);
if (!aValue.isEmpty())
- aResult.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank, nParagraph });
+ aResult.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank });
}
else if (aName.startsWith(sPolicy + "Extension:Marking"))
{
const OUString aValue = lcl_getProperty(xPropertyContainer, aName);
if (!aValue.isEmpty())
- aResult.push_back({ svx::ClassificationType::MARKING, aValue, sBlank, nParagraph });
+ aResult.push_back({ svx::ClassificationType::MARKING, aValue, sBlank });
}
else if (aName.startsWith(sPolicy + "Extension:IntellectualPropertyPart"))
{
const OUString aValue = lcl_getProperty(xPropertyContainer, aName);
if (!aValue.isEmpty())
- aResult.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank, nParagraph });
+ aResult.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank });
}
}
- ++nParagraph;
}
return aResult;
@@ -917,6 +982,11 @@ void SwEditShell::ApplyParagraphClassification(std::vector<svx::ClassificationRe
for (size_t nIndex = 0; nIndex < aResults.size(); ++nIndex)
{
const svx::ClassificationResult& rResult = aResults[nIndex];
+
+ // Ignore "PARAGRAPH" types
+ if (rResult.meType == svx::ClassificationType::PARAGRAPH)
+ continue;
+
const bool isLast = nIndex == 0;
const bool isFirst = nIndex == aResults.size() - 1;
OUString sKey;
@@ -981,7 +1051,6 @@ std::vector<svx::ClassificationResult> SwEditShell::CollectParagraphClassificati
uno::Reference<container::XEnumeration> xTextPortions = xTextPortionEnumerationAccess->createEnumeration();
const OUString sPolicy = SfxClassificationHelper::policyTypeToString(SfxClassificationHelper::getPolicyType());
- const sal_Int32 nParagraph = 1;
while (xTextPortions->hasMoreElements())
{
@@ -1006,19 +1075,19 @@ std::vector<svx::ClassificationResult> SwEditShell::CollectParagraphClassificati
const OUString sBlank("");
if (aName.startsWith(sPolicy + "Marking:Text:"))
{
- aResult.push_back({ svx::ClassificationType::TEXT, aValue, sBlank, nParagraph });
+ aResult.push_back({ svx::ClassificationType::TEXT, aValue, sBlank });
}
else if (aName.startsWith(sPolicy + "BusinessAuthorizationCategory:Name"))
{
- aResult.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank, nParagraph });
+ aResult.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank });
}
else if (aName.startsWith(sPolicy + "Extension:Marking"))
{
- aResult.push_back({ svx::ClassificationType::MARKING, aValue, sBlank, nParagraph });
+ aResult.push_back({ svx::ClassificationType::MARKING, aValue, sBlank });
}
else if (aName.startsWith(sPolicy + "Extension:IntellectualPropertyPart"))
{
- aResult.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, xTextRange->getString(), sBlank, nParagraph });
+ aResult.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, xTextRange->getString(), sBlank });
}
}
More information about the Libreoffice-commits
mailing list