24#include <com/sun/star/drawing/XPresenterHelper.hpp>
25#include <com/sun/star/rendering/PanoseWeight.hpp>
26#include <osl/diagnose.h>
53 std::vector<sal_Int32> ToVector()
64 void Merge (
const BorderSize& rBorderSize)
67 mnLeft = rBorderSize.mnLeft;
69 mnTop = rBorderSize.mnTop;
89 const Reference<XComponentContext>& rxContext,
90 const Reference<rendering::XCanvas>& rxCanvas);
98 const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxTheme,
101 const Reference<beans::XPropertySet>& rxFontProperties,
104 std::shared_ptr<PresenterTheme::Theme> ReadTheme (
105 PresenterConfigurationAccess& rConfiguration,
106 const OUString& rsThemeName);
108 static BorderSize ReadBorderSize (
const Reference<container::XNameAccess>& rxNode);
111 static Any GetByName (
112 const Reference<container::XNameAccess>& rxNode,
113 const OUString& rsName);
135typedef std::shared_ptr<PaneStyle> SharedPaneStyle;
137class PaneStyleContainer
144 const ReadContext& rReadContext,
145 const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
147 SharedPaneStyle GetPaneStyle (
const OUString& rsStyleName)
const;
150 void ProcessPaneStyle (
151 ReadContext
const & rReadContext,
152 const ::std::vector<css::uno::Any>& rValues);
172typedef std::shared_ptr<ViewStyle> SharedViewStyle;
174class ViewStyleContainer
177 ::std::vector<SharedViewStyle>
mStyles;
181 const ReadContext& rReadContext,
182 const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
184 SharedViewStyle GetViewStyle (
const OUString& rsStyleName)
const;
187 void ProcessViewStyle(
188 ReadContext
const & rReadContext,
189 const Reference<beans::XPropertySet>& rxProperties);
192class StyleAssociationContainer
196 const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
198 OUString GetStyleName (
const OUString& rsResourceName)
const;
201 typedef std::map<OUString, OUString> StyleAssociations;
204 void ProcessStyleAssociation(
205 const ::std::vector<css::uno::Any>& rValues);
214 const Reference<container::XHierarchicalNameAccess>& rThemeRoot,
219 ReadContext& rReadContext);
232 SharedPaneStyle
GetPaneStyle (
const OUString& rsStyleName)
const;
233 SharedViewStyle
GetViewStyle (
const OUString& rsStyleName)
const;
237 const OUString& rsKey,
238 const Reference<beans::XPropertySet>& rxProperties);
244 css::uno::Reference<css::uno::XComponentContext> xContext,
245 css::uno::Reference<css::rendering::XCanvas> xCanvas)
262 "/org.openoffice.Office.PresenterScreen/",
265 return aReadContext.ReadTheme(aConfiguration, OUString());
275 if ( !
mxCanvas.is() && rxCanvas.is())
285 std::shared_ptr<Theme> pTheme (
mpTheme);
286 while (sStyleName.isEmpty() && pTheme !=
nullptr)
288 sStyleName = pTheme->maStyleAssociations.GetStyleName(rsResourceURL);
289 pTheme = pTheme->mpParentTheme;
295 const OUString& rsStyleName,
296 const bool bOuter)
const
298 OSL_ASSERT(
mpTheme !=
nullptr);
300 SharedPaneStyle pPaneStyle (
mpTheme->GetPaneStyle(rsStyleName));
303 return pPaneStyle->maOuterBorderSize.ToVector();
305 return pPaneStyle->maInnerBorderSize.ToVector();
308 return ::std::vector<sal_Int32>(4,0);
313 const Reference<container::XHierarchicalNameAccess>& rxNode,
316 return ReadContext::ReadFont(rxNode, rpDefault);
320 const Any& rColorSequence,
323 Sequence<sal_Int8> aByteSequence;
324 if (rColorSequence >>= aByteSequence)
326 rColor = std::accumulate(std::cbegin(aByteSequence), std::cend(aByteSequence), sal_uInt32(0),
327 [](
const sal_uInt32 nRes,
const sal_uInt8 nByte) {
return (nRes << 8) | nByte; });
335 const OUString& rsStyleName)
const
338 return std::shared_ptr<PresenterConfigurationAccess>();
341 auto pConfiguration = std::make_shared<PresenterConfigurationAccess>(
343 "/org.openoffice.Office.PresenterScreen/",
348 if (pConfiguration->GoToChild( OUString(
349 "Presenter/Themes/" +
mpTheme->msConfigurationNodeName +
"/ViewStyles")))
351 pConfiguration->GoToChild(
352 [&rsStyleName] (OUString
const&, uno::Reference<beans::XPropertySet>
const& xProps)
355 rsStyleName,
"StyleName", xProps);
358 return pConfiguration;
362 const OUString& rsStyleName,
363 const OUString& rsBitmapName)
const
367 if (rsStyleName.isEmpty())
369 if (rsBitmapName ==
"Background")
371 std::shared_ptr<Theme> pTheme (
mpTheme);
372 while (pTheme !=
nullptr && !pTheme->mpBackground)
373 pTheme = pTheme->mpParentTheme;
374 if (pTheme !=
nullptr)
375 return pTheme->mpBackground;
382 SharedPaneStyle pPaneStyle (
mpTheme->GetPaneStyle(rsStyleName));
390 SharedViewStyle pViewStyle (
mpTheme->GetViewStyle(rsStyleName));
404 const OUString& rsBitmapName)
const
408 if (rsBitmapName ==
"Background")
410 std::shared_ptr<Theme> pTheme (
mpTheme);
411 while (pTheme !=
nullptr && !pTheme->mpBackground)
412 pTheme = pTheme->mpParentTheme;
413 if (pTheme !=
nullptr)
414 return pTheme->mpBackground;
420 if (
mpTheme->mpIconContainer !=
nullptr)
421 return mpTheme->mpIconContainer->GetBitmap(rsBitmapName);
431 return mpTheme->mpIconContainer;
433 return std::shared_ptr<PresenterBitmapContainer>();
437 const OUString& rsStyleName)
const
441 SharedPaneStyle pPaneStyle (
mpTheme->GetPaneStyle(rsStyleName));
443 return pPaneStyle->GetFont();
445 SharedViewStyle pViewStyle (
mpTheme->GetViewStyle(rsStyleName));
447 return pViewStyle->GetFont();
449 std::shared_ptr<Theme> pTheme (
mpTheme);
450 while (pTheme !=
nullptr)
452 Theme::FontContainer::const_iterator iFont (pTheme->maFontContainer.find(rsStyleName));
453 if (iFont != pTheme->maFontContainer.end())
454 return iFont->second;
456 pTheme = pTheme->mpParentTheme;
466 const std::shared_ptr<FontDescriptor>& rpDescriptor)
469 msAnchor(OUString(
"Left")),
473 if (rpDescriptor !=
nullptr)
477 mnSize = rpDescriptor->mnSize;
478 mnColor = rpDescriptor->mnColor;
486 const Reference<rendering::XCanvas>& rxCanvas)
491 if ( ! rxCanvas.is())
494 const double nCellSize (GetCellSizeForDesignSize(rxCanvas,
mnSize));
501 const Reference<rendering::XCanvas>& rxCanvas,
502 const double nCellSize)
const
504 rendering::FontRequest aFontRequest;
505 aFontRequest.FontDescription.FamilyName = msFamilyName;
506 if (msFamilyName.isEmpty())
507 aFontRequest.FontDescription.FamilyName =
"Tahoma";
508 aFontRequest.FontDescription.StyleName =
msStyleName;
509 aFontRequest.CellSize = nCellSize;
514 aFontRequest.FontDescription.FontDescription.Weight = rendering::PanoseWeight::HEAVY;
516 return rxCanvas->createFont(
518 Sequence<beans::PropertyValue>(),
519 geometry::Matrix2D(1,0,0,1));
523 const Reference<rendering::XCanvas>& rxCanvas,
524 const double nDesignSize)
const
528 double nCellSize (nDesignSize);
530 if ( ! rxCanvas.is())
537 Reference<rendering::XCanvasFont> xFont (
CreateFont(rxCanvas, nCellSize));
543 const double nAscent (-aBox.Y1);
547 const double nDescent (aBox.Y2);
548 const double nScale = (nAscent+nDescent) / nAscent;
549 return nDesignSize * nScale;
555 const Reference<container::XHierarchicalNameAccess>& rxThemeRoot,
557 : msConfigurationNodeName(
std::move(sNodeName)),
561 mxThemeRoot(rxThemeRoot)
567 ReadContext& rReadContext)
570 OUString sParentThemeName;
572 >>= sParentThemeName)
573 && !sParentThemeName.isEmpty())
575 mpParentTheme = rReadContext.ReadTheme(rConfiguration, sParentThemeName);
582 rReadContext.mxPresenterHelper,
583 rReadContext.mxCanvas,
590 maPaneStyles.Read(rReadContext, mxThemeRoot);
593 maViewStyles.Read(rReadContext, mxThemeRoot);
596 mpIconContainer = std::make_shared<PresenterBitmapContainer>(
597 Reference<container::XNameAccess>(
599 mpParentTheme !=
nullptr ? mpParentTheme->mpIconContainer
600 : std::shared_ptr<PresenterBitmapContainer>(),
601 rReadContext.mxComponentContext, rReadContext.mxCanvas);
604 Reference<container::XNameAccess> xFontNode(
609 [
this] (OUString
const& rKey, uno::Reference<beans::XPropertySet>
const& xProps)
611 return this->ProcessFont(rKey, xProps);
617 SharedPaneStyle pPaneStyle (maPaneStyles.GetPaneStyle(rsStyleName));
620 else if (mpParentTheme !=
nullptr)
621 return mpParentTheme->GetPaneStyle(rsStyleName);
623 return SharedPaneStyle();
628 SharedViewStyle pViewStyle (maViewStyles.GetViewStyle(rsStyleName));
631 else if (mpParentTheme !=
nullptr)
632 return mpParentTheme->GetViewStyle(rsStyleName);
634 return SharedViewStyle();
638 const OUString& rsKey,
639 const Reference<beans::XPropertySet>& rxProperties)
648ReadContext::ReadContext (
649 const css::uno::Reference<css::uno::XComponentContext>& rxContext,
650 const Reference<rendering::XCanvas>& rxCanvas)
654 Reference<lang::XMultiComponentFactory>
xFactory (rxContext->getServiceManager());
658 xFactory->createInstanceWithContext(
659 "com.sun.star.comp.Draw.PresenterHelper",
666 const Reference<container::XHierarchicalNameAccess>& rxNode,
674 Reference<container::XHierarchicalNameAccess> xFont (
680 Reference<beans::XPropertySet> xProperties (xFont, UNO_QUERY_THROW);
681 return ReadFont(xProperties, rpDefault);
692 const Reference<beans::XPropertySet>& rxProperties,
695 auto pDescriptor = std::make_shared<PresenterTheme::FontDescriptor>(rpDefault);
702 pDescriptor->mnColor);
710Any ReadContext::GetByName (
711 const Reference<container::XNameAccess>& rxNode,
712 const OUString& rsName)
714 OSL_ASSERT(rxNode.is());
715 if (rxNode->hasByName(rsName))
716 return rxNode->getByName(rsName);
721std::shared_ptr<PresenterTheme::Theme> ReadContext::ReadTheme (
722 PresenterConfigurationAccess& rConfiguration,
723 const OUString& rsThemeName)
725 std::shared_ptr<PresenterTheme::Theme> pTheme;
727 OUString sCurrentThemeName (rsThemeName);
728 if (sCurrentThemeName.isEmpty())
731 rConfiguration.GetConfigurationNode(
"Presenter/CurrentTheme") >>= sCurrentThemeName;
732 if (sCurrentThemeName.isEmpty())
735 sCurrentThemeName =
"DefaultTheme";
739 Reference<container::XNameAccess> xThemes (
740 rConfiguration.GetConfigurationNode(
"Presenter/Themes"),
745 const Sequence<OUString> aKeys (xThemes->getElementNames());
746 for (
const OUString& rsKey : aKeys)
748 Reference<container::XHierarchicalNameAccess> xTheme (
749 xThemes->getByName(rsKey), UNO_QUERY);
755 if (sThemeName == sCurrentThemeName)
757 pTheme = std::make_shared<PresenterTheme::Theme>(xTheme,rsKey);
764 if (pTheme !=
nullptr)
766 pTheme->Read(rConfiguration, *
this);
772BorderSize ReadContext::ReadBorderSize (
const Reference<container::XNameAccess>& rxNode)
774 BorderSize aBorderSize;
778 GetByName(rxNode,
"Left") >>= aBorderSize.mnLeft;
779 GetByName(rxNode,
"Top") >>= aBorderSize.mnTop;
780 GetByName(rxNode,
"Right") >>= aBorderSize.mnRight;
781 GetByName(rxNode,
"Bottom") >>= aBorderSize.mnBottom;
789void PaneStyleContainer::Read (
790 const ReadContext& rReadContext,
791 const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
793 Reference<container::XNameAccess> xPaneStyleList (
798 if (!xPaneStyleList.is())
812 [
this, &rReadContext] (std::vector<uno::Any>
const& rValues)
814 return this->ProcessPaneStyle(rReadContext, rValues);
818void PaneStyleContainer::ProcessPaneStyle(
819 ReadContext
const & rReadContext,
820 const ::std::vector<Any>& rValues)
822 if (rValues.size() != 6)
825 auto pStyle = std::make_shared<PaneStyle>();
827 rValues[0] >>= pStyle->msStyleName;
829 OUString sParentStyleName;
830 if (rValues[1] >>= sParentStyleName)
834 [&sParentStyleName](
const SharedPaneStyle& rxStyle) { return rxStyle->msStyleName == sParentStyleName; });
836 pStyle->mpParentStyle = *iStyle;
839 Reference<container::XHierarchicalNameAccess> xFontNode (rValues[2], UNO_QUERY);
840 pStyle->mpFont = ReadContext::ReadFont(
843 Reference<container::XNameAccess> xInnerBorderSizeNode (rValues[3], UNO_QUERY);
844 pStyle->maInnerBorderSize = ReadContext::ReadBorderSize(xInnerBorderSizeNode);
845 Reference<container::XNameAccess> xOuterBorderSizeNode (rValues[4], UNO_QUERY);
846 pStyle->maOuterBorderSize = ReadContext::ReadBorderSize(xOuterBorderSizeNode);
848 if (pStyle->mpParentStyle !=
nullptr)
850 pStyle->maInnerBorderSize.Merge(pStyle->mpParentStyle->maInnerBorderSize);
851 pStyle->maOuterBorderSize.Merge(pStyle->mpParentStyle->maOuterBorderSize);
854 if (rReadContext.mxCanvas.is())
856 Reference<container::XNameAccess> xBitmapsNode (rValues[5], UNO_QUERY);
857 pStyle->mpBitmaps = std::make_shared<PresenterBitmapContainer>(
859 pStyle->mpParentStyle !=
nullptr ? pStyle->mpParentStyle->mpBitmaps
860 : std::shared_ptr<PresenterBitmapContainer>(),
861 rReadContext.mxComponentContext, rReadContext.mxCanvas,
862 rReadContext.mxPresenterHelper);
868SharedPaneStyle PaneStyleContainer::GetPaneStyle (
const OUString& rsStyleName)
const
871 [&rsStyleName](
const SharedPaneStyle& rxStyle) { return rxStyle->msStyleName == rsStyleName; });
874 return SharedPaneStyle();
879PaneStyle::PaneStyle()
910void ViewStyleContainer::Read (
911 const ReadContext& rReadContext,
912 const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
914 Reference<container::XNameAccess> xViewStyleList (
919 if (xViewStyleList.is())
923 [
this, &rReadContext] (OUString
const&, uno::Reference<beans::XPropertySet>
const& xProps)
925 return this->ProcessViewStyle(rReadContext, xProps);
930void ViewStyleContainer::ProcessViewStyle(
931 ReadContext
const & rReadContext,
932 const Reference<beans::XPropertySet>& rxProperties)
934 auto pStyle = std::make_shared<ViewStyle>();
937 >>= pStyle->msStyleName;
939 OUString sParentStyleName;
941 >>= sParentStyleName)
945 [&sParentStyleName](
const SharedViewStyle& rxStyle) { return rxStyle->msStyleName == sParentStyleName; });
948 pStyle->mpParentStyle = *iStyle;
949 pStyle->mpFont = (*iStyle)->mpFont;
950 pStyle->mpBackground = (*iStyle)->mpBackground;
954 Reference<container::XHierarchicalNameAccess> xFontNode (
959 pStyle->mpFont = pFont;
961 Reference<container::XHierarchicalNameAccess> xBackgroundNode (
967 rReadContext.mxPresenterHelper,
968 rReadContext.mxCanvas,
970 if (pBackground && pBackground->GetNormalBitmap().is())
971 pStyle->mpBackground = pBackground;
976SharedViewStyle ViewStyleContainer::GetViewStyle (
const OUString& rsStyleName)
const
979 [&rsStyleName](
const SharedViewStyle& rxStyle) { return rxStyle->msStyleName == rsStyleName; });
982 return SharedViewStyle();
987ViewStyle::ViewStyle()
993 if (rsBitmapName == u
"Background")
1011void StyleAssociationContainer::Read (
1012 const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
1014 Reference<container::XNameAccess> xStyleAssociationList (
1017 "StyleAssociations"),
1019 if (!xStyleAssociationList.is())
1022 ::std::vector<OUString>
aProperties {
"ResourceURL",
"StyleName" };
1024 xStyleAssociationList,
1026 [
this] (std::vector<uno::Any>
const& rValues)
1028 return this->ProcessStyleAssociation(rValues);
1032OUString StyleAssociationContainer::GetStyleName (
const OUString& rsResourceName)
const
1034 StyleAssociations::const_iterator iAssociation (
maStyleAssociations.find(rsResourceName));
1036 return iAssociation->second;
1041void StyleAssociationContainer::ProcessStyleAssociation(
1042 const ::std::vector<Any>& rValues)
1044 if (rValues.size() != 2)
1047 OUString sResourceURL;
1048 OUString sStyleName;
1049 if ((rValues[0] >>= sResourceURL)
1050 && (rValues[1] >>= sStyleName))
Reference< XComponentContext > mxComponentContext
std::shared_ptr< PaneStyle > mpParentStyle
::std::vector< SharedPaneStyle > mStyles
StyleAssociations maStyleAssociations
PresenterTheme::SharedFontDescriptor mpFont
Reference< rendering::XCanvas > mxCanvas
static const sal_Int32 mnInvalidValue
SharedBitmapDescriptor mpBackground
BorderSize maInnerBorderSize
Reference< drawing::XPresenterHelper > mxPresenterHelper
BorderSize maOuterBorderSize
std::shared_ptr< PresenterBitmapContainer > mpBitmaps
PropertiesInfo aProperties
static std::shared_ptr< BitmapDescriptor > LoadBitmap(const css::uno::Reference< css::container::XHierarchicalNameAccess > &rxNode, const OUString &rsPathToBitmapNode, const css::uno::Reference< css::drawing::XPresenterHelper > &rxPresenterHelper, const css::uno::Reference< css::rendering::XCanvas > &rxCanvas, const std::shared_ptr< BitmapDescriptor > &rpDefaultBitmap)
static css::geometry::RealRectangle2D GetTextBoundingBox(const css::uno::Reference< css::rendering::XCanvasFont > &rxFont, const OUString &rsText, const sal_Int8=css::rendering::TextDirection::WEAK_LEFT_TO_RIGHT)
This class gives access to the configuration.
css::uno::Any GetConfigurationNode(const OUString &rsPathToNode)
Return a configuration node below the root of the called object.
static css::uno::Any GetProperty(const css::uno::Reference< css::beans::XPropertySet > &rxProperties, const OUString &rsKey)
This method wraps a call to getPropertyValue() and returns an empty Any instead of throwing an except...
static void ForAll(const css::uno::Reference< css::container::XNameAccess > &rxContainer, const ::std::vector< OUString > &rArguments, const ItemProcessor &rProcessor)
Execute a functor for all elements of the given container.
static bool IsStringPropertyEqual(std::u16string_view rsValue, const OUString &rsPropertyName, const css::uno::Reference< css::beans::XPropertySet > &rxNode)
css::uno::Reference< css::rendering::XCanvasFont > CreateFont(const css::uno::Reference< css::rendering::XCanvas > &rxCanvas, const double nCellSize) const
double GetCellSizeForDesignSize(const css::uno::Reference< css::rendering::XCanvas > &rxCanvas, const double nDesignSize) const
FontDescriptor(const std::shared_ptr< FontDescriptor > &rpDescriptor)
bool PrepareFont(const css::uno::Reference< css::rendering::XCanvas > &rxCanvas)
std::shared_ptr< Theme > mpParentTheme
SharedPaneStyle GetPaneStyle(const OUString &rsStyleName) const
void ProcessFont(const OUString &rsKey, const Reference< beans::XPropertySet > &rxProperties)
StyleAssociationContainer maStyleAssociations
PaneStyleContainer maPaneStyles
SharedBitmapDescriptor mpBackground
OUString msConfigurationNodeName
SharedViewStyle GetViewStyle(const OUString &rsStyleName) const
std::map< OUString, SharedFontDescriptor > FontContainer
std::shared_ptr< PresenterBitmapContainer > mpIconContainer
Reference< container::XHierarchicalNameAccess > mxThemeRoot
Theme(const Reference< container::XHierarchicalNameAccess > &rThemeRoot, OUString sNodeName)
ViewStyleContainer maViewStyles
void Read(PresenterConfigurationAccess &rConfiguration, ReadContext &rReadContext)
FontContainer maFontContainer
void ProvideCanvas(const css::uno::Reference< css::rendering::XCanvas > &rxCanvas)
SharedBitmapDescriptor GetBitmap(const OUString &rsStyleName, const OUString &rsBitmapName) const
std::shared_ptr< FontDescriptor > SharedFontDescriptor
css::uno::Reference< css::rendering::XCanvas > mxCanvas
css::uno::Reference< css::uno::XComponentContext > mxContext
PresenterTheme(css::uno::Reference< css::uno::XComponentContext > xContext, css::uno::Reference< css::rendering::XCanvas > xCanvas)
static SharedFontDescriptor ReadFont(const css::uno::Reference< css::container::XHierarchicalNameAccess > &rxNode, const SharedFontDescriptor &rDefaultFount)
::std::vector< sal_Int32 > GetBorderSize(const OUString &rsStyleName, const bool bOuter) const
std::shared_ptr< Theme > mpTheme
std::shared_ptr< Theme > ReadTheme()
static bool ConvertToColor(const css::uno::Any &rColorSequence, sal_uInt32 &rColor)
SharedFontDescriptor GetFont(const OUString &rsStyleName) const
OUString GetStyleName(const OUString &rsResourceURL) const
std::shared_ptr< PresenterConfigurationAccess > GetNodeForViewStyle(const OUString &rsStyleName) const
std::shared_ptr< PresenterBitmapContainer > GetBitmapContainer() const
void CreateFont(SvxFont &rFont, const SfxItemSet &rSet, bool bSearchInParent=true, SvtScriptType nScriptType=SvtScriptType::NONE)
Reference< XSingleServiceFactory > xFactory
VCL_DLLPUBLIC SvStream & ReadFont(SvStream &rIStm, vcl::Font &)
std::shared_ptr< PresenterBitmapContainer::BitmapDescriptor > SharedBitmapDescriptor
vcl::Font GetFont(vcl::Font const &rFont, DrawModeFlags nDrawMode, StyleSettings const &rStyleSettings)
uno::Reference< rendering::XCanvasFont > mxFont