summaryrefslogtreecommitdiff
path: root/svx/source/styles
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2021-11-30 08:44:02 +0100
committerMiklos Vajna <vmiklos@collabora.com>2021-11-30 09:30:34 +0100
commit48f0c5f73f99c919ec24deadc96c3cf5483c9314 (patch)
treec0e926babec1b9623d0671a84a938ba6b1138820 /svx/source/styles
parent5bba732060a947541f07fc9c87df8ac7a1f8c4f7 (diff)
svx: update objects of pages of a master page when the theme changes
Only text color as a start, and without effects. Change-Id: I52b1c110870605134c414bcc94b50871cd49975b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126082 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'svx/source/styles')
-rw-r--r--svx/source/styles/ColorSets.cxx59
1 files changed, 59 insertions, 0 deletions
diff --git a/svx/source/styles/ColorSets.cxx b/svx/source/styles/ColorSets.cxx
index 773e7c414ef3..a5f8c6e7c548 100644
--- a/svx/source/styles/ColorSets.cxx
+++ b/svx/source/styles/ColorSets.cxx
@@ -16,14 +16,55 @@
#include <com/sun/star/beans/PropertyValues.hpp>
#include <com/sun/star/util/Color.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XEnumeration.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
#include <comphelper/propertyvalue.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <comphelper/sequence.hxx>
#include <sal/log.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svditer.hxx>
+#include <editeng/unoprnms.hxx>
using namespace com::sun::star;
+namespace
+{
+void UpdateSdrObject(svx::Theme* pTheme, SdrObject* pObject)
+{
+ svx::ColorSet* pColorSet = pTheme->GetColorSet();
+ if (!pColorSet)
+ {
+ return;
+ }
+
+ uno::Reference<text::XTextRange> xShape(pObject->getUnoShape(), uno::UNO_QUERY);
+ uno::Reference<container::XEnumerationAccess> xText(xShape->getText(), uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParagraphs = xText->createEnumeration();
+ while (xParagraphs->hasMoreElements())
+ {
+ uno::Reference<container::XEnumerationAccess> xParagraph(xParagraphs->nextElement(), uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xPortions = xParagraph->createEnumeration();
+ while (xPortions->hasMoreElements())
+ {
+ uno::Reference<beans::XPropertySet> xPortion(xPortions->nextElement(), uno::UNO_QUERY);
+ sal_Int16 nCharColorTheme = -1;
+ xPortion->getPropertyValue(UNO_NAME_EDIT_CHAR_COLOR_THEME) >>= nCharColorTheme;
+ if (nCharColorTheme < 0 || nCharColorTheme > 11)
+ {
+ continue;
+ }
+
+ Color aColor = pColorSet->getColor(nCharColorTheme);
+ xPortion->setPropertyValue(UNO_NAME_EDIT_CHAR_COLOR, uno::makeAny(static_cast<sal_Int32>(aColor)));
+ }
+ }
+}
+}
+
namespace svx
{
@@ -229,6 +270,24 @@ std::unique_ptr<Theme> Theme::FromAny(const css::uno::Any& rVal)
return pTheme;
}
+void Theme::UpdateSdrPage(SdrPage* pPage)
+{
+ for (size_t nObject = 0; nObject < pPage->GetObjCount(); ++nObject)
+ {
+ SdrObject* pObject = pPage->GetObj(nObject);
+ UpdateSdrObject(this, pObject);
+ SdrObjList* pList = pObject->GetSubList();
+ if (pList)
+ {
+ SdrObjListIter aIter(pList, SdrIterMode::DeepWithGroups);
+ while (aIter.IsMore())
+ {
+ UpdateSdrObject(this, aIter.Next());
+ }
+ }
+ }
+}
+
} // end of namespace svx
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */