[Libreoffice-commits] core.git: sfx2/source
Miklos Vajna
vmiklos at collabora.co.uk
Wed May 18 15:49:02 UTC 2016
sfx2/source/view/classificationhelper.cxx | 146 ++++++++++++++++++++----------
1 file changed, 99 insertions(+), 47 deletions(-)
New commits:
commit bbd6e694a8675fd915dbfbd6b7113eb461739fcb
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Wed May 18 12:34:00 2016 +0200
sfx2 classification: allow storing one category for each policy type
The ClassificationApply UNO command already had two parameters, a Name
and Type, but the underlying SfxClassificationHelper::Impl could still
only store a single SfxClassificationCategory.
Change it into a map, so it can store multiple categories, one per each
policy type.
Change-Id: Ic98d939c18092aa3764af2e57828cdbbc2645844
Reviewed-on: https://gerrit.libreoffice.org/25087
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
diff --git a/sfx2/source/view/classificationhelper.cxx b/sfx2/source/view/classificationhelper.cxx
index c8d2715..101933f 100644
--- a/sfx2/source/view/classificationhelper.cxx
+++ b/sfx2/source/view/classificationhelper.cxx
@@ -349,7 +349,8 @@ void SAL_CALL SfxClassificationParser::setDocumentLocator(const uno::Reference<x
class SfxClassificationHelper::Impl
{
public:
- SfxClassificationCategory m_aCategory;
+ /// Selected categories, one category for each policy type.
+ std::map<SfxClassificationPolicyType, SfxClassificationCategory> m_aCategory;
/// Possible categories of a policy to choose from.
std::vector<SfxClassificationCategory> m_aCategories;
const uno::Reference<document::XDocumentProperties>& m_xDocumentProperties;
@@ -359,7 +360,7 @@ public:
/// Synchronize m_aLabels back to the document properties.
void pushToDocumentProperties();
/// Set the classification start date to the system time.
- void setStartValidity();
+ void setStartValidity(SfxClassificationPolicyType eType);
};
SfxClassificationHelper::Impl::Impl(const uno::Reference<document::XDocumentProperties>& xDocumentProperties)
@@ -400,10 +401,15 @@ bool lcl_containsProperty(const uno::Sequence<beans::Property>& rProperties, con
}) != rProperties.end();
}
-void SfxClassificationHelper::Impl::setStartValidity()
+void SfxClassificationHelper::Impl::setStartValidity(SfxClassificationPolicyType eType)
{
- std::map<OUString, OUString>::iterator it = m_aCategory.m_aLabels.find(PROP_STARTVALIDITY());
- if (it != m_aCategory.m_aLabels.end())
+ auto itCategory = m_aCategory.find(eType);
+ if (itCategory == m_aCategory.end())
+ return;
+
+ SfxClassificationCategory& rCategory = itCategory->second;
+ std::map<OUString, OUString>::iterator it = rCategory.m_aLabels.find(policyTypeToString(eType) + PROP_STARTVALIDITY());
+ if (it != rCategory.m_aLabels.end())
{
if (it->second == PROP_NONE())
{
@@ -420,20 +426,25 @@ void SfxClassificationHelper::Impl::pushToDocumentProperties()
uno::Reference<beans::XPropertyContainer> xPropertyContainer = m_xDocumentProperties->getUserDefinedProperties();
uno::Reference<beans::XPropertySet> xPropertySet(xPropertyContainer, uno::UNO_QUERY);
uno::Sequence<beans::Property> aProperties = xPropertySet->getPropertySetInfo()->getProperties();
- std::map<OUString, OUString> aLabels = m_aCategory.m_aLabels;
- aLabels[PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_BACNAME()] = m_aCategory.m_aName;
- for (const auto& rLabel : aLabels)
+ for (auto& rPair : m_aCategory)
{
- try
- {
- if (lcl_containsProperty(aProperties, rLabel.first))
- xPropertySet->setPropertyValue(rLabel.first, uno::makeAny(rLabel.second));
- else
- xPropertyContainer->addProperty(rLabel.first, beans::PropertyAttribute::REMOVABLE, uno::makeAny(rLabel.second));
- }
- catch (const uno::Exception& rException)
+ SfxClassificationPolicyType eType = rPair.first;
+ SfxClassificationCategory& rCategory = rPair.second;
+ std::map<OUString, OUString> aLabels = rCategory.m_aLabels;
+ aLabels[policyTypeToString(eType) + PROP_BACNAME()] = rCategory.m_aName;
+ for (const auto& rLabel : aLabels)
{
- SAL_WARN("sfx.view", "pushDocumentProperties() failed for property " << rLabel.first << ": " << rException.Message);
+ try
+ {
+ if (lcl_containsProperty(aProperties, rLabel.first))
+ xPropertySet->setPropertyValue(rLabel.first, uno::makeAny(rLabel.second));
+ else
+ xPropertyContainer->addProperty(rLabel.first, beans::PropertyAttribute::REMOVABLE, uno::makeAny(rLabel.second));
+ }
+ catch (const uno::Exception& rException)
+ {
+ SAL_WARN("sfx.view", "pushDocumentProperties() failed for property " << rLabel.first << ": " << rException.Message);
+ }
}
}
}
@@ -531,10 +542,16 @@ SfxClassificationHelper::SfxClassificationHelper(const uno::Reference<document::
OUString aValue;
if (aAny >>= aValue)
{
- if (rProperty.Name == (PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_BACNAME()))
- m_pImpl->m_aCategory.m_aName = aValue;
+ SfxClassificationPolicyType eType = stringToPolicyType(rProperty.Name);
+ OUString aPrefix = policyTypeToString(eType);
+ if (!rProperty.Name.startsWith(aPrefix))
+ // It's a prefix we did not recognize, ignore.
+ continue;
+
+ if (rProperty.Name == (aPrefix + PROP_BACNAME()))
+ m_pImpl->m_aCategory[eType].m_aName = aValue;
else
- m_pImpl->m_aCategory.m_aLabels[rProperty.Name] = aValue;
+ m_pImpl->m_aCategory[eType].m_aLabels[rProperty.Name] = aValue;
}
}
}
@@ -545,17 +562,22 @@ SfxClassificationHelper::~SfxClassificationHelper()
const OUString& SfxClassificationHelper::GetBACName()
{
- return m_pImpl->m_aCategory.m_aName;
+ return m_pImpl->m_aCategory[SfxClassificationPolicyType::IntellectualProperty].m_aName;
}
bool SfxClassificationHelper::HasImpactLevel()
{
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTSCALE());
- if (it == m_pImpl->m_aCategory.m_aLabels.end())
+ auto itCategory = m_pImpl->m_aCategory.find(SfxClassificationPolicyType::IntellectualProperty);
+ if (itCategory == m_pImpl->m_aCategory.end())
return false;
- it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTLEVEL());
- if (it == m_pImpl->m_aCategory.m_aLabels.end())
+ SfxClassificationCategory& rCategory = itCategory->second;
+ std::map<OUString, OUString>::iterator it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTSCALE());
+ if (it == rCategory.m_aLabels.end())
+ return false;
+
+ it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTLEVEL());
+ if (it == rCategory.m_aLabels.end())
return false;
return true;
@@ -563,8 +585,13 @@ bool SfxClassificationHelper::HasImpactLevel()
bool SfxClassificationHelper::HasDocumentHeader()
{
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_DOCHEADER());
- if (it == m_pImpl->m_aCategory.m_aLabels.end() || it->second.isEmpty())
+ auto itCategory = m_pImpl->m_aCategory.find(SfxClassificationPolicyType::IntellectualProperty);
+ if (itCategory == m_pImpl->m_aCategory.end())
+ return false;
+
+ SfxClassificationCategory& rCategory = itCategory->second;
+ std::map<OUString, OUString>::iterator it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_DOCHEADER());
+ if (it == rCategory.m_aLabels.end() || it->second.isEmpty())
return false;
return true;
@@ -572,8 +599,13 @@ bool SfxClassificationHelper::HasDocumentHeader()
bool SfxClassificationHelper::HasDocumentFooter()
{
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_DOCFOOTER());
- if (it == m_pImpl->m_aCategory.m_aLabels.end() || it->second.isEmpty())
+ auto itCategory = m_pImpl->m_aCategory.find(SfxClassificationPolicyType::IntellectualProperty);
+ if (itCategory == m_pImpl->m_aCategory.end())
+ return false;
+
+ SfxClassificationCategory& rCategory = itCategory->second;
+ std::map<OUString, OUString>::iterator it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_DOCFOOTER());
+ if (it == rCategory.m_aLabels.end() || it->second.isEmpty())
return false;
return true;
@@ -583,13 +615,18 @@ basegfx::BColor SfxClassificationHelper::GetImpactLevelColor()
{
basegfx::BColor aRet;
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTSCALE());
- if (it == m_pImpl->m_aCategory.m_aLabels.end())
+ auto itCategory = m_pImpl->m_aCategory.find(SfxClassificationPolicyType::IntellectualProperty);
+ if (itCategory == m_pImpl->m_aCategory.end())
+ return aRet;
+
+ SfxClassificationCategory& rCategory = itCategory->second;
+ std::map<OUString, OUString>::iterator it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTSCALE());
+ if (it == rCategory.m_aLabels.end())
return aRet;
OUString aScale = it->second;
- it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTLEVEL());
- if (it == m_pImpl->m_aCategory.m_aLabels.end())
+ it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTLEVEL());
+ if (it == rCategory.m_aLabels.end())
return aRet;
OUString aLevel = it->second;
@@ -633,13 +670,18 @@ sal_Int32 SfxClassificationHelper::GetImpactLevel()
{
sal_Int32 nRet = -1;
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTSCALE());
- if (it == m_pImpl->m_aCategory.m_aLabels.end())
+ auto itCategory = m_pImpl->m_aCategory.find(SfxClassificationPolicyType::IntellectualProperty);
+ if (itCategory == m_pImpl->m_aCategory.end())
+ return nRet;
+
+ SfxClassificationCategory& rCategory = itCategory->second;
+ std::map<OUString, OUString>::iterator it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTSCALE());
+ if (it == rCategory.m_aLabels.end())
return nRet;
OUString aScale = it->second;
- it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTLEVEL());
- if (it == m_pImpl->m_aCategory.m_aLabels.end())
+ it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTLEVEL());
+ if (it == rCategory.m_aLabels.end())
return nRet;
OUString aLevel = it->second;
@@ -670,8 +712,13 @@ sal_Int32 SfxClassificationHelper::GetImpactLevel()
OUString SfxClassificationHelper::GetImpactScale()
{
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTSCALE());
- if (it != m_pImpl->m_aCategory.m_aLabels.end())
+ auto itCategory = m_pImpl->m_aCategory.find(SfxClassificationPolicyType::IntellectualProperty);
+ if (itCategory == m_pImpl->m_aCategory.end())
+ return OUString();
+
+ SfxClassificationCategory& rCategory = itCategory->second;
+ std::map<OUString, OUString>::iterator it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_IMPACTSCALE());
+ if (it != rCategory.m_aLabels.end())
return it->second;
return OUString();
@@ -679,8 +726,13 @@ OUString SfxClassificationHelper::GetImpactScale()
OUString SfxClassificationHelper::GetDocumentWatermark()
{
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_DOCWATERMARK());
- if (it != m_pImpl->m_aCategory.m_aLabels.end())
+ auto itCategory = m_pImpl->m_aCategory.find(SfxClassificationPolicyType::IntellectualProperty);
+ if (itCategory == m_pImpl->m_aCategory.end())
+ return OUString();
+
+ SfxClassificationCategory& rCategory = itCategory->second;
+ std::map<OUString, OUString>::iterator it = rCategory.m_aLabels.find(PROP_PREFIX_INTELLECTUALPROPERTY() + PROP_DOCWATERMARK());
+ if (it != rCategory.m_aLabels.end())
return it->second;
return OUString();
@@ -714,13 +766,13 @@ void SfxClassificationHelper::SetBACName(const OUString& rName, SfxClassificatio
return;
}
- m_pImpl->m_aCategory.m_aName = it->m_aName;
- m_pImpl->m_aCategory.m_aLabels.clear();
+ m_pImpl->m_aCategory[eType].m_aName = it->m_aName;
+ m_pImpl->m_aCategory[eType].m_aLabels.clear();
const OUString& rPrefix = policyTypeToString(eType);
for (const auto& rLabel : it->m_aLabels)
- m_pImpl->m_aCategory.m_aLabels[rPrefix + rLabel.first] = rLabel.second;
+ m_pImpl->m_aCategory[eType].m_aLabels[rPrefix + rLabel.first] = rLabel.second;
- m_pImpl->setStartValidity();
+ m_pImpl->setStartValidity(eType);
m_pImpl->pushToDocumentProperties();
SfxViewFrame* pViewFrame = SfxViewFrame::Current();
if (!pViewFrame)
@@ -747,9 +799,9 @@ void SfxClassificationHelper::UpdateInfobar(SfxViewFrame& rViewFrame)
SfxClassificationPolicyType SfxClassificationHelper::stringToPolicyType(const OUString& rType)
{
- if (rType == PROP_PREFIX_EXPORTCONTROL())
+ if (rType.startsWith(PROP_PREFIX_EXPORTCONTROL()))
return SfxClassificationPolicyType::ExportControl;
- else if (rType == PROP_PREFIX_NATIONALSECURITY())
+ else if (rType.startsWith(PROP_PREFIX_NATIONALSECURITY()))
return SfxClassificationPolicyType::NationalSecurity;
else
return SfxClassificationPolicyType::IntellectualProperty;
More information about the Libreoffice-commits
mailing list