include/sfx2/classificationhelper.hxx | 5 +- include/svx/ClassificationDialog.hxx | 2 include/svx/ClassificationField.hxx | 14 ++++-- sd/source/ui/view/drviews2.cxx | 10 ++-- sfx2/source/view/classificationhelper.cxx | 21 ++++++++- svx/source/dialog/ClassificationDialog.cxx | 20 +++++---- sw/source/core/edit/edfcol.cxx | 62 +++++++++++++++++++---------- 7 files changed, 91 insertions(+), 43 deletions(-)
New commits: commit 2ecd194d091fd33c2554bfff960985b2bd5e654e Author: Ashod Nakashian <ashodnakash...@yahoo.com> Date: Mon Oct 30 06:05:09 2017 -0400 TSCP: use the BAC identifier as the RDF key DOCX RDF -> SmartTag logic expects urn:bails namespace to dump the RDF, and it also needs to have the rdf file in tscp/bails.rdf, hence the move. Change-Id: I9ae496c97abe97d3596de46ffccd5f7c80e37d34 Reviewed-on: https://gerrit.libreoffice.org/44116 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/include/sfx2/classificationhelper.hxx b/include/sfx2/classificationhelper.hxx index a389ec7e4ac0..11782247ca23 100644 --- a/include/sfx2/classificationhelper.hxx +++ b/include/sfx2/classificationhelper.hxx @@ -63,6 +63,8 @@ public: const OUString& GetBACName(SfxClassificationPolicyType eType); /// Return all possible valid category names, based on the policy. std::vector<OUString> GetBACNames(); + /// Return all possible valid category identifiers, based on the policy. + std::vector<OUString> GetBACIdentifiers(); /// Get the currently selected category abbreviation for eType. Returns full name if no abbreviation defined. const OUString& GetAbbreviatedBACName(const OUString& sFullName); /// Return all possible valid abbreviated category names, based on the policy. @@ -148,7 +150,8 @@ public: bool isCategoryKey(OUString const & aKey) const { - return aKey.startsWith(makeCategoryKey()); + return aKey.startsWith(makeCategoryKey()) || + aKey.startsWith(getPolicyKey() + "BusinessAuthorizationCategory:Identifier"); } OUString makeMarkingKey() const diff --git a/include/svx/ClassificationDialog.hxx b/include/svx/ClassificationDialog.hxx index ddea7af12592..85a70eb95f95 100644 --- a/include/svx/ClassificationDialog.hxx +++ b/include/svx/ClassificationDialog.hxx @@ -55,7 +55,7 @@ private: DECL_LINK(SelectRecentlyUsedHdl, ListBox&, void); DECL_LINK(SelectIPPartHdl, ListBox&, void); - void insertField(ClassificationType eType, OUString const & rString, OUString const & rFullString); + void insertField(ClassificationType eType, OUString const & rString, OUString const & rFullString, OUString const & rIdentifier = OUString()); std::vector<std::vector<ClassificationResult>> m_aRecentlyUsedValuesCollection; std::vector<ClassificationResult> m_aInitialValues; diff --git a/include/svx/ClassificationField.hxx b/include/svx/ClassificationField.hxx index b57f29cbafbe..4d4588c68177 100644 --- a/include/svx/ClassificationField.hxx +++ b/include/svx/ClassificationField.hxx @@ -32,17 +32,19 @@ public: ClassificationType meType; OUString msDescription; OUString msFullClassName; + OUString msIdentifier; - ClassificationField(ClassificationType eType, OUString const & sDescription, OUString const & sFullClassName) + ClassificationField(ClassificationType eType, OUString const & sDescription, OUString const & sFullClassName, OUString const & sIdentifier = "") : SvxFieldData() , meType(eType) , msDescription(sDescription) , msFullClassName(sFullClassName) + , msIdentifier(sIdentifier) {} ClassificationField* Clone() const override { - return new ClassificationField(meType, msDescription, msFullClassName); + return new ClassificationField(meType, msDescription, msFullClassName, msIdentifier); } bool operator==(const SvxFieldData& rOther) const override @@ -53,15 +55,17 @@ public: const ClassificationField& rOtherField = static_cast<const ClassificationField&>(rOther); return (meType == rOtherField.meType && msDescription == rOtherField.msDescription && - msFullClassName == rOtherField.msFullClassName); + msFullClassName == rOtherField.msFullClassName && + msIdentifier == rOtherField.msIdentifier); } }; struct SVX_DLLPUBLIC ClassificationResult { ClassificationType meType; - OUString msString; - OUString msAbbreviatedString; + OUString msString; //< Display text or 'Name' field (from example.xml). + OUString msAbbreviatedString; //< Abbreviated name, displayed instead of msString. + OUString msIdentifier; //< The identifier of this entry (from example.xml). }; } // end svx namespace diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx index fa89000bddca..992e6608f961 100644 --- a/sd/source/ui/view/drviews2.cxx +++ b/sd/source/ui/view/drviews2.cxx @@ -308,7 +308,7 @@ private: // Get Weight of current paragraph OUString sWeightProperty = getWeightString(rEditText.GetParaAttribs(nCurrentParagraph)); // Insert new paragraph into collection - m_aResults.push_back({ svx::ClassificationType::PARAGRAPH, sWeightProperty, sBlank }); + m_aResults.push_back({ svx::ClassificationType::PARAGRAPH, sWeightProperty, sBlank, sBlank }); } const SvxFieldItem* pFieldItem = findField(rSection); @@ -321,22 +321,22 @@ private: if (aKeyCreator.isMarkingTextKey(aKey)) { OUString aValue = lcl_getProperty(xPropertyContainer, aKey); - m_aResults.push_back({ svx::ClassificationType::TEXT, aValue, sBlank }); + m_aResults.push_back({ svx::ClassificationType::TEXT, aValue, sBlank, sBlank }); } else if (aKeyCreator.isCategoryKey(aKey)) { OUString aValue = lcl_getProperty(xPropertyContainer, aKey); - m_aResults.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank }); + m_aResults.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank, sBlank }); } else if (aKeyCreator.isMarkingKey(aKey)) { OUString aValue = lcl_getProperty(xPropertyContainer, aKey); - m_aResults.push_back({ svx::ClassificationType::MARKING, aValue, sBlank }); + m_aResults.push_back({ svx::ClassificationType::MARKING, aValue, sBlank, sBlank }); } else if (aKeyCreator.isIntellectualPropertyPartKey(aKey)) { OUString aValue = lcl_getProperty(xPropertyContainer, aKey); - m_aResults.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank }); + m_aResults.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank, sBlank }); } } } diff --git a/sfx2/source/view/classificationhelper.cxx b/sfx2/source/view/classificationhelper.cxx index 5e38e3885bb1..e5748a61c3ab 100644 --- a/sfx2/source/view/classificationhelper.cxx +++ b/sfx2/source/view/classificationhelper.cxx @@ -92,7 +92,8 @@ class SfxClassificationCategory public: /// PROP_BACNAME() is stored separately for easier lookup. OUString m_aName; - OUString m_aAbbreviatedName; + OUString m_aAbbreviatedName; //< An abbreviation to display instead of m_aName. + OUString m_aIdentifier; //< The Identifier of this entry. size_t m_nConfidentiality; //< 0 is the lowest (least-sensitive). std::map<OUString, OUString> m_aLabels; }; @@ -173,7 +174,6 @@ void SAL_CALL SfxClassificationParser::startElement(const OUString& rName, const else if (rName == "baf:BusinessAuthorizationCategory") { const OUString aName = xAttribs->getValueByName("Name"); - const OUString aAbbreviatedName = xAttribs->getValueByName("loextAbbreviatedName"); if (!m_pCategory && !aName.isEmpty()) { OUString aIdentifier = xAttribs->getValueByName("Identifier"); @@ -181,9 +181,13 @@ void SAL_CALL SfxClassificationParser::startElement(const OUString& rName, const // Create a new category and initialize it with the data that's true for all categories. m_aCategories.emplace_back(SfxClassificationCategory()); SfxClassificationCategory& rCategory = m_aCategories.back(); + rCategory.m_aName = aName; // Set the abbreviated name, if any, otherwise fallback on the full name. + const OUString aAbbreviatedName = xAttribs->getValueByName("loextAbbreviatedName"); rCategory.m_aAbbreviatedName = !aAbbreviatedName.isEmpty() ? aAbbreviatedName : aName; + rCategory.m_aIdentifier = aIdentifier; + rCategory.m_aLabels["PolicyAuthority:Name"] = m_aPolicyAuthorityName; rCategory.m_aLabels["Policy:Name"] = m_aPolicyName; rCategory.m_aLabels["BusinessAuthorization:Identifier"] = m_aProgramID; @@ -789,6 +793,19 @@ std::vector<OUString> SfxClassificationHelper::GetBACNames() return aRet; } +std::vector<OUString> SfxClassificationHelper::GetBACIdentifiers() +{ + if (m_pImpl->m_aCategories.empty()) + m_pImpl->parsePolicy(); + + std::vector<OUString> aRet; + std::transform(m_pImpl->m_aCategories.begin(), m_pImpl->m_aCategories.end(), std::back_inserter(aRet), [](const SfxClassificationCategory& rCategory) + { + return rCategory.m_aIdentifier; + }); + return aRet; +} + std::vector<OUString> SfxClassificationHelper::GetAbbreviatedBACNames() { if (m_pImpl->m_aCategories.empty()) diff --git a/svx/source/dialog/ClassificationDialog.cxx b/svx/source/dialog/ClassificationDialog.cxx index ef7ef7010ada..57c29847d3b1 100644 --- a/svx/source/dialog/ClassificationDialog.cxx +++ b/svx/source/dialog/ClassificationDialog.cxx @@ -246,9 +246,9 @@ short ClassificationDialog::Execute() return nResult; } -void ClassificationDialog::insertField(ClassificationType eType, OUString const & rString, OUString const & rFullString) +void ClassificationDialog::insertField(ClassificationType eType, OUString const & rString, OUString const & rFullString, OUString const & rIdentifier) { - ClassificationField aField(eType, rString, rFullString); + ClassificationField aField(eType, rString, rFullString, rIdentifier); m_pEditWindow->InsertField(SvxFieldItem(aField, EE_FEATURE_FIELD)); } @@ -387,20 +387,20 @@ void ClassificationDialog::readIn(std::vector<ClassificationResult> const & rInp { m_pClassificationListBox->SelectEntry(rClassificationResult.msString); m_pInternationalClassificationListBox->SelectEntryPos(m_pClassificationListBox->GetSelectedEntryPos()); - insertField(rClassificationResult.meType, msAbbreviatedString, rClassificationResult.msString); + insertField(rClassificationResult.meType, msAbbreviatedString, rClassificationResult.msString, rClassificationResult.msIdentifier); } break; case svx::ClassificationType::MARKING: { m_pMarkingListBox->SelectEntry(rClassificationResult.msString); - insertField(rClassificationResult.meType, msAbbreviatedString, rClassificationResult.msString); + insertField(rClassificationResult.meType, msAbbreviatedString, rClassificationResult.msString, rClassificationResult.msIdentifier); } break; case svx::ClassificationType::INTELLECTUAL_PROPERTY_PART: { - insertField(rClassificationResult.meType, msAbbreviatedString, rClassificationResult.msString); + insertField(rClassificationResult.meType, msAbbreviatedString, rClassificationResult.msString, rClassificationResult.msIdentifier); } break; @@ -456,7 +456,7 @@ std::vector<ClassificationResult> ClassificationDialog::getResult() sWeightProperty = "BOLD"; // Insert into collection OUString sBlank; - aClassificationResults.push_back({ ClassificationType::PARAGRAPH, sWeightProperty, sBlank }); + aClassificationResults.push_back({ ClassificationType::PARAGRAPH, sWeightProperty, sBlank, sBlank }); } const SvxFieldItem* pFieldItem = findField(rSection); @@ -469,11 +469,12 @@ std::vector<ClassificationResult> ClassificationDialog::getResult() if (pClassificationField) { - aClassificationResults.push_back({ pClassificationField->meType, pClassificationField->msFullClassName, sDisplayString }); + aClassificationResults.push_back({ pClassificationField->meType, pClassificationField->msFullClassName, + sDisplayString, pClassificationField->msIdentifier }); } else { - aClassificationResults.push_back({ ClassificationType::TEXT, sDisplayString, sDisplayString }); + aClassificationResults.push_back({ ClassificationType::TEXT, sDisplayString, sDisplayString, OUString() }); } } } @@ -505,7 +506,8 @@ IMPL_LINK(ClassificationDialog, SelectClassificationHdl, ListBox&, rBox, void) const OUString aFullString = maHelper.GetBACNames()[nSelected]; const OUString aAbbreviatedString = maHelper.GetAbbreviatedBACNames()[nSelected]; - insertField(ClassificationType::CATEGORY, aAbbreviatedString, aFullString); + const OUString aIdentifierString = maHelper.GetBACIdentifiers()[nSelected]; + insertField(ClassificationType::CATEGORY, aAbbreviatedString, aFullString, aIdentifierString); m_pInternationalClassificationListBox->SelectEntryPos(nSelected); m_pClassificationListBox->SelectEntryPos(nSelected); diff --git a/sw/source/core/edit/edfcol.cxx b/sw/source/core/edit/edfcol.cxx index fdc88456f822..0120eee919c1 100644 --- a/sw/source/core/edit/edfcol.cxx +++ b/sw/source/core/edit/edfcol.cxx @@ -93,7 +93,7 @@ namespace { -static const OUString MetaFilename("bails.rdf"); +static const OUString MetaFilename("tscp/bails.rdf"); static const OUString MetaNS("urn:bails"); static const OUString ParagraphSignatureRDFName = "loext:paragraph:signature"; static const OUString ParagraphSignatureDateRDFName = "loext:paragraph:signature:date"; @@ -244,6 +244,22 @@ OString lcl_getParagraphBodyText(const uno::Reference<text::XTextContent>& xText } /// Returns RDF (key, value) pair associated with the field, if any. +std::pair<OUString, OUString> lcl_getFieldRDFByPrefix(const uno::Reference<frame::XModel>& xModel, + const uno::Reference<css::text::XTextField>& xField, + const OUString& rsPrefix) +{ + const css::uno::Reference<css::rdf::XResource> xSubject(xField, uno::UNO_QUERY); + std::map<OUString, OUString> aStatements = SwRDFHelper::getStatements(xModel, MetaNS, xSubject); + for (const auto& pair : aStatements) + { + if (pair.first.startsWith(rsPrefix)) + return pair; + } + + return std::make_pair(OUString(), OUString()); +} + +/// Returns RDF (key, value) pair associated with the field, if any. std::pair<OUString, OUString> lcl_getFieldRDF(const uno::Reference<frame::XModel>& xModel, const uno::Reference<css::text::XTextField>& xField, const OUString& rRDFName) @@ -434,7 +450,7 @@ uno::Reference<text::XTextField> lcl_InsertParagraphClassification(const uno::Re /// Updates the paragraph classification field text if changed and returns true only iff updated. bool lcl_UpdateParagraphClassificationField(SwDoc* pDoc, const uno::Reference<frame::XModel>& xModel, - const uno::Reference<css::text::XTextField>& xField, + const uno::Reference<css::text::XTextContent>& xTextNode, const OUString& sKey, const OUString& sValue, const OUString& sDisplayText) @@ -446,9 +462,13 @@ bool lcl_UpdateParagraphClassificationField(SwDoc* pDoc, pDoc->GetIDocumentUndoRedo().DoUndo(isUndoEnabled); }); - const css::uno::Reference<css::rdf::XResource> xSubject(xField, uno::UNO_QUERY); - SwRDFHelper::addStatement(xModel, MetaNS, MetaFilename, xSubject, ParagraphClassificationNameRDFName, sKey); - SwRDFHelper::addStatement(xModel, MetaNS, MetaFilename, xSubject, ParagraphClassificationValueRDFName, sValue); + uno::Reference<text::XTextField> xField = lcl_InsertParagraphClassification(xModel, xTextNode); + css::uno::Reference<css::rdf::XResource> xFieldSubject(xField, uno::UNO_QUERY); + SwRDFHelper::addStatement(xModel, MetaNS, MetaFilename, xFieldSubject, sKey, sValue); + css::uno::Reference<css::rdf::XResource> xNodeSubject(xTextNode, uno::UNO_QUERY); + SwRDFHelper::addStatement(xModel, MetaNS, MetaFilename, xNodeSubject, sKey, sValue); + SwRDFHelper::addStatement(xModel, MetaNS, MetaFilename, xFieldSubject, ParagraphClassificationNameRDFName, sKey); + SwRDFHelper::addStatement(xModel, MetaNS, MetaFilename, xFieldSubject, ParagraphClassificationValueRDFName, sValue); uno::Reference<css::text::XTextRange> xText(xField, uno::UNO_QUERY); const OUString curDisplayText = xText->getString(); @@ -811,7 +831,7 @@ std::vector<svx::ClassificationResult> SwEditShell::CollectAdvancedClassificatio OUString sWeight = (aAny.get<float>() >= awt::FontWeight::BOLD) ? OUString("BOLD") : OUString("NORMAL"); - aResult.push_back({ svx::ClassificationType::PARAGRAPH, sWeight, sBlank }); + aResult.push_back({ svx::ClassificationType::PARAGRAPH, sWeight, sBlank, sBlank }); // Process portions while (xTextPortions->hasMoreElements()) @@ -835,25 +855,25 @@ std::vector<svx::ClassificationResult> SwEditShell::CollectAdvancedClassificatio { const OUString aValue = lcl_getProperty(xPropertyContainer, aName); if (!aValue.isEmpty()) - aResult.push_back({ svx::ClassificationType::TEXT, aValue, sBlank }); + aResult.push_back({ svx::ClassificationType::TEXT, aValue, sBlank, sBlank }); } else if (aCreator.isCategoryKey(aName)) { const OUString aValue = lcl_getProperty(xPropertyContainer, aName); if (!aValue.isEmpty()) - aResult.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank }); + aResult.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank, sBlank }); } else if (aCreator.isMarkingKey(aName)) { const OUString aValue = lcl_getProperty(xPropertyContainer, aName); if (!aValue.isEmpty()) - aResult.push_back({ svx::ClassificationType::MARKING, aValue, sBlank }); + aResult.push_back({ svx::ClassificationType::MARKING, aValue, sBlank, sBlank }); } else if (aCreator.isIntellectualPropertyPartKey(aName)) { const OUString aValue = lcl_getProperty(xPropertyContainer, aName); if (!aValue.isEmpty()) - aResult.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank }); + aResult.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank, sBlank }); } } } @@ -1022,11 +1042,10 @@ void SwEditShell::ApplyParagraphClassification(std::vector<svx::ClassificationRe break; } - uno::Reference<text::XTextField> xTextField = lcl_InsertParagraphClassification(xModel, xParent); OUString sDisplayText = (isFirst ? ("(" + rResult.msAbbreviatedString) : rResult.msAbbreviatedString); if (isLast) sDisplayText += ")"; - lcl_UpdateParagraphClassificationField(GetDoc(), xModel, xTextField, sKey, rResult.msString, sDisplayText); + lcl_UpdateParagraphClassificationField(GetDoc(), xModel, xParent, sKey, rResult.msString, sDisplayText); } } @@ -1068,28 +1087,28 @@ std::vector<svx::ClassificationResult> SwEditShell::CollectParagraphClassificati continue; uno::Reference<text::XTextField> xTextField(xField, uno::UNO_QUERY); - const std::pair<OUString, OUString> rdfNamePair = lcl_getFieldRDF(xModel, xTextField, ParagraphClassificationNameRDFName); - const std::pair<OUString, OUString> rdfValuePair = lcl_getFieldRDF(xModel, xTextField, ParagraphClassificationValueRDFName); + const OUString sPolicy = SfxClassificationHelper::policyTypeToString(SfxClassificationHelper::getPolicyType()); + const std::pair<OUString, OUString> rdfNamePair = lcl_getFieldRDFByPrefix(xModel, xTextField, sPolicy); uno::Reference<text::XTextRange> xTextRange(xField, uno::UNO_QUERY); - const OUString aName = rdfNamePair.second; - const OUString aValue = rdfValuePair.second; + const OUString aName = rdfNamePair.first; + const OUString aValue = rdfNamePair.second; const OUString sBlank(""); if (aKeyCreator.isMarkingTextKey(aName)) { - aResult.push_back({ svx::ClassificationType::TEXT, aValue, sBlank }); + aResult.push_back({ svx::ClassificationType::TEXT, aValue, sBlank, sBlank }); } else if (aKeyCreator.isCategoryKey(aName)) { - aResult.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank }); + aResult.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank, sBlank }); } else if (aKeyCreator.isMarkingKey(aName)) { - aResult.push_back({ svx::ClassificationType::MARKING, aValue, sBlank }); + aResult.push_back({ svx::ClassificationType::MARKING, aValue, sBlank, sBlank }); } else if (aKeyCreator.isIntellectualPropertyPartKey(aName)) { - aResult.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, xTextRange->getString(), sBlank }); + aResult.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, xTextRange->getString(), sBlank, sBlank }); } } @@ -1673,6 +1692,9 @@ OUString lcl_GetParagraphClassification(const uno::Reference<frame::XModel>& xMo { const OUString sPolicy = SfxClassificationHelper::policyTypeToString(SfxClassificationHelper::getPolicyType()); uno::Reference<text::XTextField> xTextField = lcl_FindParagraphClassificationField(xModel, xParagraph, sPolicy + "BusinessAuthorizationCategory:Name"); + if (!xTextField.is()) + xTextField = lcl_FindParagraphClassificationField(xModel, xParagraph, sPolicy + "BusinessAuthorizationCategory:Identifier"); + if (xTextField.is()) { const std::pair<OUString, OUString> rdfValuePair = lcl_getFieldRDF(xModel, xTextField, ParagraphClassificationValueRDFName); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits