24#include <com/sun/star/drawing/XPresenterHelper.hpp>
25#include <com/sun/star/rendering/PanoseWeight.hpp>
26#include <osl/diagnose.h>
54 vector<sal_Int32> ToVector()
65 void Merge (
const BorderSize& rBorderSize)
68 mnLeft = rBorderSize.mnLeft;
70 mnTop = rBorderSize.mnTop;
90 const Reference<XComponentContext>& rxContext,
91 const Reference<rendering::XCanvas>& rxCanvas);
99 const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxTheme,
102 const Reference<beans::XPropertySet>& rxFontProperties,
105 std::shared_ptr<PresenterTheme::Theme> ReadTheme (
106 PresenterConfigurationAccess& rConfiguration,
107 const OUString& rsThemeName);
109 static BorderSize ReadBorderSize (
const Reference<container::XNameAccess>& rxNode);
112 static Any GetByName (
113 const Reference<container::XNameAccess>& rxNode,
114 const OUString& rsName);
136typedef std::shared_ptr<PaneStyle> SharedPaneStyle;
138class PaneStyleContainer
145 const ReadContext& rReadContext,
146 const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
148 SharedPaneStyle GetPaneStyle (
const OUString& rsStyleName)
const;
151 void ProcessPaneStyle (
152 ReadContext
const & rReadContext,
153 const ::std::vector<css::uno::Any>& rValues);
173typedef std::shared_ptr<ViewStyle> SharedViewStyle;
175class ViewStyleContainer
178 ::std::vector<SharedViewStyle>
mStyles;
182 const ReadContext& rReadContext,
183 const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
185 SharedViewStyle GetViewStyle (
const OUString& rsStyleName)
const;
188 void ProcessViewStyle(
189 ReadContext
const & rReadContext,
190 const Reference<beans::XPropertySet>& rxProperties);
193class StyleAssociationContainer
197 const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
199 OUString GetStyleName (
const OUString& rsResourceName)
const;
202 typedef map<OUString, OUString> StyleAssociations;
205 void ProcessStyleAssociation(
206 const ::std::vector<css::uno::Any>& rValues);
215 const Reference<container::XHierarchicalNameAccess>& rThemeRoot,
220 ReadContext& rReadContext);
233 SharedPaneStyle
GetPaneStyle (
const OUString& rsStyleName)
const;
234 SharedViewStyle
GetViewStyle (
const OUString& rsStyleName)
const;
238 const OUString& rsKey,
239 const Reference<beans::XPropertySet>& rxProperties);
245 css::uno::Reference<css::uno::XComponentContext> xContext,
246 css::uno::Reference<css::rendering::XCanvas> xCanvas)
263 "/org.openoffice.Office.PresenterScreen/",
266 return aReadContext.ReadTheme(aConfiguration, OUString());
276 if ( !
mxCanvas.is() && rxCanvas.is())
286 std::shared_ptr<Theme> pTheme (
mpTheme);
287 while (sStyleName.isEmpty() && pTheme !=
nullptr)
289 sStyleName = pTheme->maStyleAssociations.GetStyleName(rsResourceURL);
290 pTheme = pTheme->mpParentTheme;
296 const OUString& rsStyleName,
297 const bool bOuter)
const
299 OSL_ASSERT(
mpTheme !=
nullptr);
301 SharedPaneStyle pPaneStyle (
mpTheme->GetPaneStyle(rsStyleName));
304 return pPaneStyle->maOuterBorderSize.ToVector();
306 return pPaneStyle->maInnerBorderSize.ToVector();
309 return ::std::vector<sal_Int32>(4,0);
314 const Reference<container::XHierarchicalNameAccess>& rxNode,
317 return ReadContext::ReadFont(rxNode, rpDefault);
321 const Any& rColorSequence,
324 Sequence<sal_Int8> aByteSequence;
325 if (rColorSequence >>= aByteSequence)
327 rColor = std::accumulate(std::cbegin(aByteSequence), std::cend(aByteSequence), sal_uInt32(0),
328 [](
const sal_uInt32 nRes,
const sal_uInt8 nByte) {
return (nRes << 8) | nByte; });
336 const OUString& rsStyleName)
const
339 return std::shared_ptr<PresenterConfigurationAccess>();
342 auto pConfiguration = std::make_shared<PresenterConfigurationAccess>(
344 "/org.openoffice.Office.PresenterScreen/",
349 if (pConfiguration->GoToChild( OUString(
350 "Presenter/Themes/" +
mpTheme->msConfigurationNodeName +
"/ViewStyles")))
352 pConfiguration->GoToChild(
353 [&rsStyleName] (OUString
const&, uno::Reference<beans::XPropertySet>
const& xProps)
356 rsStyleName,
"StyleName", xProps);
359 return pConfiguration;
363 const OUString& rsStyleName,
364 const OUString& rsBitmapName)
const
368 if (rsStyleName.isEmpty())
370 if (rsBitmapName ==
"Background")
372 std::shared_ptr<Theme> pTheme (
mpTheme);
373 while (pTheme !=
nullptr && !pTheme->mpBackground)
374 pTheme = pTheme->mpParentTheme;
375 if (pTheme !=
nullptr)
376 return pTheme->mpBackground;
383 SharedPaneStyle pPaneStyle (
mpTheme->GetPaneStyle(rsStyleName));
391 SharedViewStyle pViewStyle (
mpTheme->GetViewStyle(rsStyleName));
405 const OUString& rsBitmapName)
const
409 if (rsBitmapName ==
"Background")
411 std::shared_ptr<Theme> pTheme (
mpTheme);
412 while (pTheme !=
nullptr && !pTheme->mpBackground)
413 pTheme = pTheme->mpParentTheme;
414 if (pTheme !=
nullptr)
415 return pTheme->mpBackground;
421 if (
mpTheme->mpIconContainer !=
nullptr)
422 return mpTheme->mpIconContainer->GetBitmap(rsBitmapName);
432 return mpTheme->mpIconContainer;
434 return std::shared_ptr<PresenterBitmapContainer>();
438 const OUString& rsStyleName)
const
442 SharedPaneStyle pPaneStyle (
mpTheme->GetPaneStyle(rsStyleName));
444 return pPaneStyle->GetFont();
446 SharedViewStyle pViewStyle (
mpTheme->GetViewStyle(rsStyleName));
448 return pViewStyle->GetFont();
450 std::shared_ptr<Theme> pTheme (
mpTheme);
451 while (pTheme !=
nullptr)
453 Theme::FontContainer::const_iterator iFont (pTheme->maFontContainer.find(rsStyleName));
454 if (iFont != pTheme->maFontContainer.end())
455 return iFont->second;
457 pTheme = pTheme->mpParentTheme;
467 const std::shared_ptr<FontDescriptor>& rpDescriptor)
470 msAnchor(OUString(
"Left")),
474 if (rpDescriptor !=
nullptr)
478 mnSize = rpDescriptor->mnSize;
479 mnColor = rpDescriptor->mnColor;
487 const Reference<rendering::XCanvas>& rxCanvas)
492 if ( ! rxCanvas.is())
495 const double nCellSize (GetCellSizeForDesignSize(rxCanvas,
mnSize));
502 const Reference<rendering::XCanvas>& rxCanvas,
503 const double nCellSize)
const
505 rendering::FontRequest aFontRequest;
506 aFontRequest.FontDescription.FamilyName = msFamilyName;
507 if (msFamilyName.isEmpty())
508 aFontRequest.FontDescription.FamilyName =
"Tahoma";
509 aFontRequest.FontDescription.StyleName =
msStyleName;
510 aFontRequest.CellSize = nCellSize;
515 aFontRequest.FontDescription.FontDescription.Weight = rendering::PanoseWeight::HEAVY;
517 return rxCanvas->createFont(
519 Sequence<beans::PropertyValue>(),
520 geometry::Matrix2D(1,0,0,1));
524 const Reference<rendering::XCanvas>& rxCanvas,
525 const double nDesignSize)
const
529 double nCellSize (nDesignSize);
531 if ( ! rxCanvas.is())
538 Reference<rendering::XCanvasFont> xFont (
CreateFont(rxCanvas, nCellSize));
544 const double nAscent (-aBox.Y1);
548 const double nDescent (aBox.Y2);
549 const double nScale = (nAscent+nDescent) / nAscent;
550 return nDesignSize * nScale;
556 const Reference<container::XHierarchicalNameAccess>& rxThemeRoot,
558 : msConfigurationNodeName(
std::move(sNodeName)),
562 mxThemeRoot(rxThemeRoot)
568 ReadContext& rReadContext)
571 OUString sParentThemeName;
573 >>= sParentThemeName)
574 && !sParentThemeName.isEmpty())
576 mpParentTheme = rReadContext.ReadTheme(rConfiguration, sParentThemeName);
583 rReadContext.mxPresenterHelper,
584 rReadContext.mxCanvas,
591 maPaneStyles.Read(rReadContext, mxThemeRoot);
594 maViewStyles.Read(rReadContext, mxThemeRoot);
597 mpIconContainer = std::make_shared<PresenterBitmapContainer>(
598 Reference<container::XNameAccess>(
600 mpParentTheme !=
nullptr ? mpParentTheme->mpIconContainer
601 : std::shared_ptr<PresenterBitmapContainer>(),
602 rReadContext.mxComponentContext, rReadContext.mxCanvas);
605 Reference<container::XNameAccess> xFontNode(
610 [
this] (OUString
const& rKey, uno::Reference<beans::XPropertySet>
const& xProps)
612 return this->ProcessFont(rKey, xProps);
618 SharedPaneStyle pPaneStyle (maPaneStyles.GetPaneStyle(rsStyleName));
621 else if (mpParentTheme !=
nullptr)
622 return mpParentTheme->GetPaneStyle(rsStyleName);
624 return SharedPaneStyle();
629 SharedViewStyle pViewStyle (maViewStyles.GetViewStyle(rsStyleName));
632 else if (mpParentTheme !=
nullptr)
633 return mpParentTheme->GetViewStyle(rsStyleName);
635 return SharedViewStyle();
639 const OUString& rsKey,
640 const Reference<beans::XPropertySet>& rxProperties)
649ReadContext::ReadContext (
650 const css::uno::Reference<css::uno::XComponentContext>& rxContext,
651 const Reference<rendering::XCanvas>& rxCanvas)
655 Reference<lang::XMultiComponentFactory>
xFactory (rxContext->getServiceManager());
659 xFactory->createInstanceWithContext(
660 "com.sun.star.comp.Draw.PresenterHelper",
667 const Reference<container::XHierarchicalNameAccess>& rxNode,
675 Reference<container::XHierarchicalNameAccess> xFont (
681 Reference<beans::XPropertySet> xProperties (xFont, UNO_QUERY_THROW);
682 return ReadFont(xProperties, rpDefault);
693 const Reference<beans::XPropertySet>& rxProperties,
696 auto pDescriptor = std::make_shared<PresenterTheme::FontDescriptor>(rpDefault);
703 pDescriptor->mnColor);
711Any ReadContext::GetByName (
712 const Reference<container::XNameAccess>& rxNode,
713 const OUString& rsName)
715 OSL_ASSERT(rxNode.is());
716 if (rxNode->hasByName(rsName))
717 return rxNode->getByName(rsName);
722std::shared_ptr<PresenterTheme::Theme> ReadContext::ReadTheme (
723 PresenterConfigurationAccess& rConfiguration,
724 const OUString& rsThemeName)
726 std::shared_ptr<PresenterTheme::Theme> pTheme;
728 OUString sCurrentThemeName (rsThemeName);
729 if (sCurrentThemeName.isEmpty())
732 rConfiguration.GetConfigurationNode(
"Presenter/CurrentTheme") >>= sCurrentThemeName;
733 if (sCurrentThemeName.isEmpty())
736 sCurrentThemeName =
"DefaultTheme";
740 Reference<container::XNameAccess> xThemes (
741 rConfiguration.GetConfigurationNode(
"Presenter/Themes"),
746 const Sequence<OUString> aKeys (xThemes->getElementNames());
747 for (
const OUString& rsKey : aKeys)
749 Reference<container::XHierarchicalNameAccess> xTheme (
750 xThemes->getByName(rsKey), UNO_QUERY);
756 if (sThemeName == sCurrentThemeName)
758 pTheme = std::make_shared<PresenterTheme::Theme>(xTheme,rsKey);
765 if (pTheme !=
nullptr)
767 pTheme->Read(rConfiguration, *
this);
773BorderSize ReadContext::ReadBorderSize (
const Reference<container::XNameAccess>& rxNode)
775 BorderSize aBorderSize;
779 GetByName(rxNode,
"Left") >>= aBorderSize.mnLeft;
780 GetByName(rxNode,
"Top") >>= aBorderSize.mnTop;
781 GetByName(rxNode,
"Right") >>= aBorderSize.mnRight;
782 GetByName(rxNode,
"Bottom") >>= aBorderSize.mnBottom;
790void PaneStyleContainer::Read (
791 const ReadContext& rReadContext,
792 const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
794 Reference<container::XNameAccess> xPaneStyleList (
799 if (!xPaneStyleList.is())
813 [
this, &rReadContext] (std::vector<uno::Any>
const& rValues)
815 return this->ProcessPaneStyle(rReadContext, rValues);
819void PaneStyleContainer::ProcessPaneStyle(
820 ReadContext
const & rReadContext,
821 const ::std::vector<Any>& rValues)
823 if (rValues.size() != 6)
826 auto pStyle = std::make_shared<PaneStyle>();
828 rValues[0] >>= pStyle->msStyleName;
830 OUString sParentStyleName;
831 if (rValues[1] >>= sParentStyleName)
835 [&sParentStyleName](
const SharedPaneStyle& rxStyle) { return rxStyle->msStyleName == sParentStyleName; });
837 pStyle->mpParentStyle = *iStyle;
840 Reference<container::XHierarchicalNameAccess> xFontNode (rValues[2], UNO_QUERY);
841 pStyle->mpFont = ReadContext::ReadFont(
844 Reference<container::XNameAccess> xInnerBorderSizeNode (rValues[3], UNO_QUERY);
845 pStyle->maInnerBorderSize = ReadContext::ReadBorderSize(xInnerBorderSizeNode);
846 Reference<container::XNameAccess> xOuterBorderSizeNode (rValues[4], UNO_QUERY);
847 pStyle->maOuterBorderSize = ReadContext::ReadBorderSize(xOuterBorderSizeNode);
849 if (pStyle->mpParentStyle !=
nullptr)
851 pStyle->maInnerBorderSize.Merge(pStyle->mpParentStyle->maInnerBorderSize);
852 pStyle->maOuterBorderSize.Merge(pStyle->mpParentStyle->maOuterBorderSize);
855 if (rReadContext.mxCanvas.is())
857 Reference<container::XNameAccess> xBitmapsNode (rValues[5], UNO_QUERY);
858 pStyle->mpBitmaps = std::make_shared<PresenterBitmapContainer>(
860 pStyle->mpParentStyle !=
nullptr ? pStyle->mpParentStyle->mpBitmaps
861 : std::shared_ptr<PresenterBitmapContainer>(),
862 rReadContext.mxComponentContext, rReadContext.mxCanvas,
863 rReadContext.mxPresenterHelper);
869SharedPaneStyle PaneStyleContainer::GetPaneStyle (
const OUString& rsStyleName)
const
872 [&rsStyleName](
const SharedPaneStyle& rxStyle) { return rxStyle->msStyleName == rsStyleName; });
875 return SharedPaneStyle();
880PaneStyle::PaneStyle()
911void ViewStyleContainer::Read (
912 const ReadContext& rReadContext,
913 const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
915 Reference<container::XNameAccess> xViewStyleList (
920 if (xViewStyleList.is())
924 [
this, &rReadContext] (OUString
const&, uno::Reference<beans::XPropertySet>
const& xProps)
926 return this->ProcessViewStyle(rReadContext, xProps);
931void ViewStyleContainer::ProcessViewStyle(
932 ReadContext
const & rReadContext,
933 const Reference<beans::XPropertySet>& rxProperties)
935 auto pStyle = std::make_shared<ViewStyle>();
938 >>= pStyle->msStyleName;
940 OUString sParentStyleName;
942 >>= sParentStyleName)
946 [&sParentStyleName](
const SharedViewStyle& rxStyle) { return rxStyle->msStyleName == sParentStyleName; });
949 pStyle->mpParentStyle = *iStyle;
950 pStyle->mpFont = (*iStyle)->mpFont;
951 pStyle->mpBackground = (*iStyle)->mpBackground;
955 Reference<container::XHierarchicalNameAccess> xFontNode (
960 pStyle->mpFont = pFont;
962 Reference<container::XHierarchicalNameAccess> xBackgroundNode (
968 rReadContext.mxPresenterHelper,
969 rReadContext.mxCanvas,
971 if (pBackground && pBackground->GetNormalBitmap().is())
972 pStyle->mpBackground = pBackground;
977SharedViewStyle ViewStyleContainer::GetViewStyle (
const OUString& rsStyleName)
const
980 [&rsStyleName](
const SharedViewStyle& rxStyle) { return rxStyle->msStyleName == rsStyleName; });
983 return SharedViewStyle();
988ViewStyle::ViewStyle()
994 if (rsBitmapName == u
"Background")
1012void StyleAssociationContainer::Read (
1013 const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
1015 Reference<container::XNameAccess> xStyleAssociationList (
1018 "StyleAssociations"),
1020 if (!xStyleAssociationList.is())
1023 ::std::vector<OUString>
aProperties {
"ResourceURL",
"StyleName" };
1025 xStyleAssociationList,
1027 [
this] (std::vector<uno::Any>
const& rValues)
1029 return this->ProcessStyleAssociation(rValues);
1033OUString StyleAssociationContainer::GetStyleName (
const OUString& rsResourceName)
const
1035 StyleAssociations::const_iterator iAssociation (
maStyleAssociations.find(rsResourceName));
1037 return iAssociation->second;
1042void StyleAssociationContainer::ProcessStyleAssociation(
1043 const ::std::vector<Any>& rValues)
1045 if (rValues.size() != 2)
1048 OUString sResourceURL;
1049 OUString sStyleName;
1050 if ((rValues[0] >>= sResourceURL)
1051 && (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::shared_ptr< PresenterBitmapContainer > mpIconContainer
map< OUString, SharedFontDescriptor > FontContainer
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