/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "PresenterTheme.hxx" #include "PresenterBitmapContainer.hxx" #include "PresenterCanvasHelper.hxx" #include "PresenterComponent.hxx" #include "PresenterConfigurationAccess.hxx" #include "PresenterHelper.hxx" #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::std; using ::rtl::OUString; #define A2S(s) (::rtl::OUString(s)) namespace sdext { namespace presenter { namespace { class BorderSize { public: const static sal_Int32 mnInvalidValue = -10000; BorderSize (void) : mnLeft(mnInvalidValue), mnTop(mnInvalidValue), mnRight(mnInvalidValue), mnBottom(mnInvalidValue) {} sal_Int32 mnLeft; sal_Int32 mnTop; sal_Int32 mnRight; sal_Int32 mnBottom; vector ToVector (void) { vector aSequence (4); aSequence[0] = mnLeft == mnInvalidValue ? 0 : mnLeft; aSequence[1] = mnTop == mnInvalidValue ? 0 : mnTop; aSequence[2] = mnRight == mnInvalidValue ? 0 : mnRight; aSequence[3] = mnBottom == mnInvalidValue ? 0 : mnBottom; return aSequence; }; void Merge (const BorderSize& rBorderSize) { if (mnLeft == mnInvalidValue) mnLeft = rBorderSize.mnLeft; if (mnTop == mnInvalidValue) mnTop = rBorderSize.mnTop; if (mnRight == mnInvalidValue) mnRight = rBorderSize.mnRight; if (mnBottom == mnInvalidValue) mnBottom = rBorderSize.mnBottom; } }; /** Reading a theme from the configurations is done in various classes. The ReadContext gives access to frequently used objects and functions to make the configuration handling easier. */ class ReadContext { public: Reference mxComponentContext; Reference mxCanvas; Reference mxPresenterHelper; OUString msBasePath; ReadContext ( const Reference& rxContext, const Reference& rxCanvas); ~ReadContext (void); /** Read data describing a font from the node that can be reached from the given root via the given path. @param rsFontPath May be empty. */ static PresenterTheme::SharedFontDescriptor ReadFont ( const css::uno::Reference& rxTheme, const ::rtl::OUString& rsFontPath, const PresenterTheme::SharedFontDescriptor& rpDefault); static PresenterTheme::SharedFontDescriptor ReadFont ( const Reference& rxFontProperties, const PresenterTheme::SharedFontDescriptor& rpDefault); ::boost::shared_ptr ReadTheme ( PresenterConfigurationAccess& rConfiguration, const OUString& rsThemeName); BorderSize ReadBorderSize (const Reference& rxNode); void SetBitmapSourceExtension (const OUString& rsExtensionName); private: Any GetByName ( const Reference& rxNode, const OUString& rsName) const; }; /** A PaneStyle describes how a pane is rendered. */ class PaneStyle { public: PaneStyle (void); ~PaneStyle (void); const SharedBitmapDescriptor GetBitmap (const OUString& sBitmapName) const; OUString msStyleName; ::boost::shared_ptr mpParentStyle; PresenterTheme::SharedFontDescriptor mpFont; BorderSize maInnerBorderSize; BorderSize maOuterBorderSize; ::boost::shared_ptr mpBitmaps; PresenterTheme::SharedFontDescriptor GetFont (void) const; private: void UpdateBorderSize (BorderSize& rBorderSize, bool bInner); }; typedef ::boost::shared_ptr SharedPaneStyle; class PaneStyleContainer : vector { public: void Read ( ReadContext& rReadContext, const Reference& rThemeRoot); SharedPaneStyle GetPaneStyle (const OUString& rsStyleName) const; private: void ProcessPaneStyle ( ReadContext& rReadContext, const ::rtl::OUString& rsKey, const ::std::vector& rValues); }; /** A ViewStyle describes how a view is displayed. */ class ViewStyle { public: ViewStyle (void); ~ViewStyle (void); const SharedBitmapDescriptor GetBitmap (const OUString& sBitmapName) const; PresenterTheme::SharedFontDescriptor GetFont (void) const; OUString msStyleName; ::boost::shared_ptr mpParentStyle; PresenterTheme::SharedFontDescriptor mpFont; ::boost::shared_ptr mpBitmaps; SharedBitmapDescriptor mpBackground; }; typedef ::boost::shared_ptr SharedViewStyle; class ViewStyleContainer : vector { public: void Read ( ReadContext& rReadContext, const Reference& rThemeRoot); SharedViewStyle GetViewStyle (const OUString& rsStyleName) const; private: void ProcessViewStyle( ReadContext& rReadContext, const Reference& rxProperties); }; class ViewDescriptor { }; typedef ::boost::shared_ptr SharedViewDescriptor; typedef ::std::vector ViewDescriptorContainer; class StyleAssociationContainer { public: void Read ( ReadContext& rReadContext, const Reference& rThemeRoot); OUString GetStyleName (const OUString& rsResourceName) const; private: typedef map StyleAssociations; StyleAssociations maStyleAssociations; void ProcessStyleAssociation( ReadContext& rReadContext, const ::rtl::OUString& rsKey, const ::std::vector& rValues); }; } // end of anonymous namespace class PresenterTheme::Theme { public: Theme ( const OUString& rsName, const Reference& rThemeRoot, const OUString& rsNodeName); ~Theme (void); void Read ( PresenterConfigurationAccess& rConfiguration, ReadContext& rReadContext); OUString msThemeName; OUString msConfigurationNodeName; ::boost::shared_ptr mpParentTheme; SharedBitmapDescriptor mpBackground; PaneStyleContainer maPaneStyles; ViewStyleContainer maViewStyles; ViewDescriptorContainer maViewDescriptors; StyleAssociationContainer maStyleAssociations; Reference mxThemeRoot; ::boost::shared_ptr mpIconContainer; typedef map FontContainer; FontContainer maFontContainer; SharedPaneStyle GetPaneStyle (const OUString& rsStyleName) const; SharedViewStyle GetViewStyle (const OUString& rsStyleName) const; private: void ProcessFont( ReadContext& rReadContext, const OUString& rsKey, const Reference& rxProperties); }; //===== PresenterTheme ======================================================== PresenterTheme::PresenterTheme ( const css::uno::Reference& rxContext, const rtl::OUString& rsThemeName, const css::uno::Reference& rxCanvas) : mxContext(rxContext), msThemeName(rsThemeName), mpTheme(), mpBitmapContainer(), mxCanvas(rxCanvas) { mpTheme = ReadTheme(); } PresenterTheme::~PresenterTheme (void) { } ::boost::shared_ptr PresenterTheme::ReadTheme (void) { ReadContext aReadContext(mxContext, mxCanvas); PresenterConfigurationAccess aConfiguration ( mxContext, OUString("/org.openoffice.Office.extension.PresenterScreen/"), PresenterConfigurationAccess::READ_ONLY); return aReadContext.ReadTheme(aConfiguration, msThemeName); } bool PresenterTheme::HasCanvas (void) const { return mxCanvas.is(); } void PresenterTheme::ProvideCanvas (const Reference& rxCanvas) { if ( ! mxCanvas.is() && rxCanvas.is()) { mxCanvas = rxCanvas; ReadTheme(); } } OUString PresenterTheme::GetStyleName (const ::rtl::OUString& rsResourceURL) const { OUString sStyleName; ::boost::shared_ptr pTheme (mpTheme); while (sStyleName.isEmpty() && pTheme.get()!=NULL) { sStyleName = pTheme->maStyleAssociations.GetStyleName(rsResourceURL); pTheme = pTheme->mpParentTheme; } return sStyleName; } ::std::vector PresenterTheme::GetBorderSize ( const ::rtl::OUString& rsStyleName, const bool bOuter) const { OSL_ASSERT(mpTheme.get() != NULL); SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName)); if (pPaneStyle.get() != NULL) if (bOuter) return pPaneStyle->maOuterBorderSize.ToVector(); else return pPaneStyle->maInnerBorderSize.ToVector(); else { return ::std::vector(4,0); } } PresenterTheme::SharedFontDescriptor PresenterTheme::ReadFont ( const Reference& rxNode, const OUString& rsFontPath, const PresenterTheme::SharedFontDescriptor& rpDefault) { return ReadContext::ReadFont(rxNode, rsFontPath, rpDefault); } bool PresenterTheme::ConvertToColor ( const Any& rColorSequence, sal_uInt32& rColor) { Sequence aByteSequence; if (rColorSequence >>= aByteSequence) { const sal_Int32 nByteCount (aByteSequence.getLength()); const sal_uInt8* pArray = reinterpret_cast(aByteSequence.getConstArray()); rColor = 0; for (sal_Int32 nIndex=0; nIndex PresenterTheme::GetNodeForViewStyle ( const ::rtl::OUString& rsStyleName) const { if (mpTheme.get() == NULL) return ::boost::shared_ptr(); // Open configuration for writing. ::boost::shared_ptr pConfiguration ( new PresenterConfigurationAccess( mxContext, OUString("/org.openoffice.Office.extension.PresenterScreen/"), PresenterConfigurationAccess::READ_WRITE)); // Get configuration node for the view style container of the current // theme. if (pConfiguration->GoToChild( A2S("Presenter/Themes/") + mpTheme->msConfigurationNodeName + A2S("/ViewStyles"))) { pConfiguration->GoToChild( ::boost::bind(&PresenterConfigurationAccess::IsStringPropertyEqual, rsStyleName, A2S("StyleName"), _2)); } return pConfiguration; } SharedBitmapDescriptor PresenterTheme::GetBitmap ( const OUString& rsStyleName, const OUString& rsBitmapName) const { if (mpTheme.get() != NULL) { if (rsStyleName.isEmpty()) { if (rsBitmapName == A2S("Background")) { ::boost::shared_ptr pTheme (mpTheme); while (pTheme.get()!=NULL && pTheme->mpBackground.get()==NULL) pTheme = pTheme->mpParentTheme; if (pTheme.get() != NULL) return pTheme->mpBackground; else return SharedBitmapDescriptor(); } } else { SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName)); if (pPaneStyle.get() != NULL) { SharedBitmapDescriptor pBitmap (pPaneStyle->GetBitmap(rsBitmapName)); if (pBitmap.get() != NULL) return pBitmap; } SharedViewStyle pViewStyle (mpTheme->GetViewStyle(rsStyleName)); if (pViewStyle.get() != NULL) { SharedBitmapDescriptor pBitmap (pViewStyle->GetBitmap(rsBitmapName)); if (pBitmap.get() != NULL) return pBitmap; } } } return SharedBitmapDescriptor(); } SharedBitmapDescriptor PresenterTheme::GetBitmap ( const OUString& rsBitmapName) const { if (mpTheme.get() != NULL) { if (rsBitmapName == A2S("Background")) { ::boost::shared_ptr pTheme (mpTheme); while (pTheme.get()!=NULL && pTheme->mpBackground.get()==NULL) pTheme = pTheme->mpParentTheme; if (pTheme.get() != NULL) return pTheme->mpBackground; else return SharedBitmapDescriptor(); } else { if (mpTheme->mpIconContainer.get() != NULL) return mpTheme->mpIconContainer->GetBitmap(rsBitmapName); } } return SharedBitmapDescriptor(); } ::boost::shared_ptr PresenterTheme::GetBitmapContainer (void) const { if (mpTheme.get() != NULL) return mpTheme->mpIconContainer; else return ::boost::shared_ptr(); } PresenterTheme::SharedFontDescriptor PresenterTheme::GetFont ( const OUString& rsStyleName) const { if (mpTheme.get() != NULL) { SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName)); if (pPaneStyle.get() != NULL) return pPaneStyle->GetFont(); SharedViewStyle pViewStyle (mpTheme->GetViewStyle(rsStyleName)); if (pViewStyle.get() != NULL) return pViewStyle->GetFont(); ::boost::shared_ptr pTheme (mpTheme); while (pTheme.get() != NULL) { Theme::FontContainer::const_iterator iFont (pTheme->maFontContainer.find(rsStyleName)); if (iFont != pTheme->maFontContainer.end()) return iFont->second; pTheme = pTheme->mpParentTheme; } } return SharedFontDescriptor(); } //===== FontDescriptor ======================================================== PresenterTheme::FontDescriptor::FontDescriptor ( const ::boost::shared_ptr& rpDescriptor) : msFamilyName(), msStyleName(), mnSize(12), mnColor(0x00000000), msAnchor(OUString("Left")), mnXOffset(0), mnYOffset(0) { if (rpDescriptor.get() != NULL) { msFamilyName = rpDescriptor->msFamilyName; msStyleName = rpDescriptor->msStyleName; mnSize = rpDescriptor->mnSize; mnColor = rpDescriptor->mnColor; msAnchor = rpDescriptor->msAnchor; mnXOffset = rpDescriptor->mnXOffset; mnYOffset = rpDescriptor->mnYOffset; } } bool PresenterTheme::FontDescriptor::PrepareFont ( const Reference& rxCanvas) { if (mxFont.is()) return true; if ( ! rxCanvas.is()) return false; const double nCellSize (GetCellSizeForDesignSize(rxCanvas, mnSize)); mxFont = CreateFont(rxCanvas, nCellSize); return mxFont.is(); } Reference PresenterTheme::FontDescriptor::CreateFont ( const Reference& rxCanvas, const double nCellSize) const { rendering::FontRequest aFontRequest; aFontRequest.FontDescription.FamilyName = msFamilyName; if (msFamilyName.isEmpty()) aFontRequest.FontDescription.FamilyName = A2S("Tahoma"); aFontRequest.FontDescription.StyleName = msStyleName; aFontRequest.CellSize = nCellSize; // Make an attempt at translating the style name(s)into a corresponding // font description. if (msStyleName == A2S("Bold")) aFontRequest.FontDescription.FontDescription.Weight = rendering::PanoseWeight::HEAVY; return rxCanvas->createFont( aFontRequest, Sequence(), geometry::Matrix2D(1,0,0,1)); } double PresenterTheme::FontDescriptor::GetCellSizeForDesignSize ( const Reference& rxCanvas, const double nDesignSize) const { // Use the given design size as initial value in calculating the cell // size. double nCellSize (nDesignSize); if ( ! rxCanvas.is()) { // We need the canvas to do the conversion. Return the design size, // it is the our best guess in this circumstance. return nDesignSize; } Reference xFont (CreateFont(rxCanvas, nCellSize)); if ( ! xFont.is()) return nDesignSize; geometry::RealRectangle2D aBox (PresenterCanvasHelper::GetTextBoundingBox (xFont, A2S("X"))); const double nAscent (-aBox.Y1); const double nDescent (aBox.Y2); const double nScale = (nAscent+nDescent) / nAscent; return nDesignSize * nScale; } //===== Theme ================================================================= PresenterTheme::Theme::Theme ( const OUString& rsName, const Reference& rxThemeRoot, const OUString& rsNodeName) : msThemeName(rsName), msConfigurationNodeName(rsNodeName), mpParentTheme(), maPaneStyles(), maViewStyles(), maStyleAssociations(), mxThemeRoot(rxThemeRoot), mpIconContainer() { } PresenterTheme::Theme::~Theme (void) { } void PresenterTheme::Theme::Read ( PresenterConfigurationAccess& rConfiguration, ReadContext& rReadContext) { PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, A2S("ThemeName")) >>= msThemeName; // Parent theme name. OUString sParentThemeName; if ((PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, A2S("ParentTheme")) >>= sParentThemeName) && !sParentThemeName.isEmpty()) { mpParentTheme = rReadContext.ReadTheme(rConfiguration, sParentThemeName); } // Read the extension that contains the bitmaps referenced in this // theme. OUString sBitmapSourceExtension; if ((PresenterConfigurationAccess::GetConfigurationNode( mxThemeRoot, A2S("BitmapSourceExtension")) >>= sBitmapSourceExtension) && !sBitmapSourceExtension.isEmpty()) { rReadContext.SetBitmapSourceExtension(sBitmapSourceExtension); } else { rReadContext.SetBitmapSourceExtension(PresenterComponent::gsExtensionIdentifier); } // Background. mpBackground = PresenterBitmapContainer::LoadBitmap( mxThemeRoot, A2S("Background"), rReadContext.mxPresenterHelper, rReadContext.msBasePath, rReadContext.mxCanvas, SharedBitmapDescriptor()); // Style associations. maStyleAssociations.Read(rReadContext, mxThemeRoot); // Pane styles. maPaneStyles.Read(rReadContext, mxThemeRoot); // View styles. maViewStyles.Read(rReadContext, mxThemeRoot); // Read bitmaps. mpIconContainer.reset( new PresenterBitmapContainer( Reference( PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, A2S("Bitmaps")), UNO_QUERY), mpParentTheme.get()!=NULL ? mpParentTheme->mpIconContainer : ::boost::shared_ptr(), rReadContext.mxComponentContext, rReadContext.mxCanvas, rReadContext.msBasePath)); // Read fonts. Reference xFontNode( PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, A2S("Fonts")), UNO_QUERY); PresenterConfigurationAccess::ForAll( xFontNode, ::boost::bind(&PresenterTheme::Theme::ProcessFont, this, ::boost::ref(rReadContext), _1, _2)); } SharedPaneStyle PresenterTheme::Theme::GetPaneStyle (const OUString& rsStyleName) const { SharedPaneStyle pPaneStyle (maPaneStyles.GetPaneStyle(rsStyleName)); if (pPaneStyle.get() != NULL) return pPaneStyle; else if (mpParentTheme.get() != NULL) return mpParentTheme->GetPaneStyle(rsStyleName); else return SharedPaneStyle(); } SharedViewStyle PresenterTheme::Theme::GetViewStyle (const OUString& rsStyleName) const { SharedViewStyle pViewStyle (maViewStyles.GetViewStyle(rsStyleName)); if (pViewStyle.get() != NULL) return pViewStyle; else if (mpParentTheme.get() != NULL) return mpParentTheme->GetViewStyle(rsStyleName); else return SharedViewStyle(); } void PresenterTheme::Theme::ProcessFont( ReadContext& rReadContext, const OUString& rsKey, const Reference& rxProperties) { (void)rReadContext; maFontContainer[rsKey] = ReadContext::ReadFont(rxProperties, SharedFontDescriptor()); } namespace { //===== ReadContext =========================================================== ReadContext::ReadContext ( const css::uno::Reference& rxContext, const Reference& rxCanvas) : mxComponentContext(rxContext), mxCanvas(rxCanvas), mxPresenterHelper(), msBasePath() { Reference xFactory (rxContext->getServiceManager()); if (xFactory.is()) { mxPresenterHelper = Reference( xFactory->createInstanceWithContext( OUString("com.sun.star.comp.Draw.PresenterHelper"), rxContext), UNO_QUERY_THROW); } // Get base path to bitmaps. SetBitmapSourceExtension(PresenterComponent::gsExtensionIdentifier); } ReadContext::~ReadContext (void) { } PresenterTheme::SharedFontDescriptor ReadContext::ReadFont ( const Reference& rxNode, const OUString& rsFontPath, const PresenterTheme::SharedFontDescriptor& rpDefault) { if ( ! rxNode.is()) return PresenterTheme::SharedFontDescriptor(); try { Reference xFont ( PresenterConfigurationAccess::GetConfigurationNode( rxNode, rsFontPath), UNO_QUERY_THROW); Reference xProperties (xFont, UNO_QUERY_THROW); return ReadFont(xProperties, rpDefault); } catch (Exception&) { OSL_ASSERT(false); } return PresenterTheme::SharedFontDescriptor(); } PresenterTheme::SharedFontDescriptor ReadContext::ReadFont ( const Reference& rxProperties, const PresenterTheme::SharedFontDescriptor& rpDefault) { ::boost::shared_ptr pDescriptor ( new PresenterTheme::FontDescriptor(rpDefault)); PresenterConfigurationAccess::GetProperty(rxProperties, A2S("FamilyName")) >>= pDescriptor->msFamilyName; PresenterConfigurationAccess::GetProperty(rxProperties, A2S("Style")) >>= pDescriptor->msStyleName; PresenterConfigurationAccess::GetProperty(rxProperties, A2S("Size")) >>= pDescriptor->mnSize; PresenterTheme::ConvertToColor( PresenterConfigurationAccess::GetProperty(rxProperties, A2S("Color")), pDescriptor->mnColor); PresenterConfigurationAccess::GetProperty(rxProperties, A2S("Anchor")) >>= pDescriptor->msAnchor; PresenterConfigurationAccess::GetProperty(rxProperties, A2S("XOffset")) >>= pDescriptor->mnXOffset; PresenterConfigurationAccess::GetProperty(rxProperties, A2S("YOffset")) >>= pDescriptor->mnYOffset; return pDescriptor; } Any ReadContext::GetByName ( const Reference& rxNode, const OUString& rsName) const { OSL_ASSERT(rxNode.is()); if (rxNode->hasByName(rsName)) return rxNode->getByName(rsName); else return Any(); } ::boost::shared_ptr ReadContext::ReadTheme ( PresenterConfigurationAccess& rConfiguration, const OUString& rsThemeName) { ::boost::shared_ptr pTheme; OUString sCurrentThemeName (rsThemeName); if (sCurrentThemeName.isEmpty()) { // No theme name given. Look up the CurrentTheme property. rConfiguration.GetConfigurationNode(A2S("Presenter/CurrentTheme")) >>= sCurrentThemeName; if (sCurrentThemeName.isEmpty()) { // Still no name. Use "DefaultTheme". sCurrentThemeName = A2S("DefaultTheme"); } } Reference xThemes ( rConfiguration.GetConfigurationNode(A2S("Presenter/Themes")), UNO_QUERY); if (xThemes.is()) { // Iterate over all themes and search the one with the given name. Sequence aKeys (xThemes->getElementNames()); for (sal_Int32 nItemIndex=0; nItemIndex < aKeys.getLength(); ++nItemIndex) { const OUString& rsKey (aKeys[nItemIndex]); Reference xTheme ( xThemes->getByName(rsKey), UNO_QUERY); if (xTheme.is()) { OUString sThemeName; PresenterConfigurationAccess::GetConfigurationNode(xTheme, A2S("ThemeName")) >>= sThemeName; if (sThemeName == sCurrentThemeName) { pTheme.reset(new PresenterTheme::Theme(sThemeName,xTheme,rsKey)); break; } } } } if (pTheme.get() != NULL) { pTheme->Read(rConfiguration, *this); } return pTheme; } BorderSize ReadContext::ReadBorderSize (const Reference& rxNode) { BorderSize aBorderSize; if (rxNode.is()) { GetByName(rxNode, A2S("Left")) >>= aBorderSize.mnLeft; GetByName(rxNode, A2S("Top")) >>= aBorderSize.mnTop; GetByName(rxNode, A2S("Right")) >>= aBorderSize.mnRight; GetByName(rxNode, A2S("Bottom")) >>= aBorderSize.mnBottom; } return aBorderSize; } void ReadContext::SetBitmapSourceExtension (const OUString& rsExtensionIdentifier) { // Get base path to bitmaps. msBasePath = PresenterComponent::GetBasePath(mxComponentContext, rsExtensionIdentifier); } //===== PaneStyleContainer ==================================================== void PaneStyleContainer::Read ( ReadContext& rReadContext, const Reference& rxThemeRoot) { Reference xPaneStyleList ( PresenterConfigurationAccess::GetConfigurationNode( rxThemeRoot, A2S("PaneStyles")), UNO_QUERY); if (xPaneStyleList.is()) { ::std::vector aProperties; aProperties.reserve(6); aProperties.push_back(A2S("StyleName")); aProperties.push_back(A2S("ParentStyle")); aProperties.push_back(A2S("TitleFont")); aProperties.push_back(A2S("InnerBorderSize")); aProperties.push_back(A2S("OuterBorderSize")); aProperties.push_back(A2S("BorderBitmapList")); PresenterConfigurationAccess::ForAll( xPaneStyleList, aProperties, ::boost::bind(&PaneStyleContainer::ProcessPaneStyle, this, ::boost::ref(rReadContext), _1, _2)); } } void PaneStyleContainer::ProcessPaneStyle( ReadContext& rReadContext, const OUString& rsKey, const ::std::vector& rValues) { (void)rsKey; if (rValues.size() != 6) return; ::boost::shared_ptr pStyle (new PaneStyle()); rValues[0] >>= pStyle->msStyleName; OUString sParentStyleName; if (rValues[1] >>= sParentStyleName) { // Find parent style. PaneStyleContainer::const_iterator iStyle; for (iStyle=begin(); iStyle!=end(); ++iStyle) if ((*iStyle)->msStyleName.equals(sParentStyleName)) { pStyle->mpParentStyle = *iStyle; break; } } Reference xFontNode (rValues[2], UNO_QUERY); pStyle->mpFont = rReadContext.ReadFont( xFontNode, A2S(""), PresenterTheme::SharedFontDescriptor()); Reference xInnerBorderSizeNode (rValues[3], UNO_QUERY); pStyle->maInnerBorderSize = rReadContext.ReadBorderSize(xInnerBorderSizeNode); Reference xOuterBorderSizeNode (rValues[4], UNO_QUERY); pStyle->maOuterBorderSize = rReadContext.ReadBorderSize(xOuterBorderSizeNode); if (pStyle->mpParentStyle.get() != NULL) { pStyle->maInnerBorderSize.Merge(pStyle->mpParentStyle->maInnerBorderSize); pStyle->maOuterBorderSize.Merge(pStyle->mpParentStyle->maOuterBorderSize); } if (rReadContext.mxCanvas.is()) { Reference xBitmapsNode (rValues[5], UNO_QUERY); pStyle->mpBitmaps.reset(new PresenterBitmapContainer( xBitmapsNode, pStyle->mpParentStyle.get()!=NULL ? pStyle->mpParentStyle->mpBitmaps : ::boost::shared_ptr(), rReadContext.mxComponentContext, rReadContext.mxCanvas, rReadContext.msBasePath, rReadContext.mxPresenterHelper)); } push_back(pStyle); } SharedPaneStyle PaneStyleContainer::GetPaneStyle (const OUString& rsStyleName) const { const_iterator iEnd (end()); for (const_iterator iStyle=begin(); iStyle!=iEnd; ++iStyle) if ((*iStyle)->msStyleName == rsStyleName) return *iStyle; return SharedPaneStyle(); } //===== PaneStyle ============================================================= PaneStyle::PaneStyle (void) : msStyleName(), mpParentStyle(), mpFont(), maInnerBorderSize(), maOuterBorderSize(), mpBitmaps() { } PaneStyle::~PaneStyle (void) { } void PaneStyle::UpdateBorderSize (BorderSize& rBorderSize, bool bInner) { if (mpParentStyle.get() != NULL) mpParentStyle->UpdateBorderSize(rBorderSize, bInner); BorderSize& rThisBorderSize (bInner ? maInnerBorderSize : maOuterBorderSize); if (rThisBorderSize.mnLeft >= 0) rBorderSize.mnLeft = rThisBorderSize.mnLeft; if (rThisBorderSize.mnTop >= 0) rBorderSize.mnTop = rThisBorderSize.mnTop; if (rThisBorderSize.mnRight >= 0) rBorderSize.mnRight = rThisBorderSize.mnRight; if (rThisBorderSize.mnBottom >= 0) rBorderSize.mnBottom = rThisBorderSize.mnBottom; } const SharedBitmapDescriptor PaneStyle::GetBitmap (const OUString& rsBitmapName) const { if (mpBitmaps.get() != NULL) { const SharedBitmapDescriptor pBitmap = mpBitmaps->GetBitmap(rsBitmapName); if (pBitmap.get() != NULL) return pBitmap; } if (mpParentStyle.get() != NULL) return mpParentStyle->GetBitmap(rsBitmapName); else return SharedBitmapDescriptor(); } PresenterTheme::SharedFontDescriptor PaneStyle::GetFont (void) const { if (mpFont.get() != NULL) return mpFont; else if (mpParentStyle.get() != NULL) return mpParentStyle->GetFont(); else return PresenterTheme::SharedFontDescriptor(); } //===== ViewStyleContainer ==================================================== void ViewStyleContainer::Read ( ReadContext& rReadContext, const Reference& rxThemeRoot) { (void)rReadContext; Reference xViewStyleList ( PresenterConfigurationAccess::GetConfigurationNode( rxThemeRoot, A2S("ViewStyles")), UNO_QUERY); if (xViewStyleList.is()) { PresenterConfigurationAccess::ForAll( xViewStyleList, ::boost::bind(&ViewStyleContainer::ProcessViewStyle, this, ::boost::ref(rReadContext), _2)); } } void ViewStyleContainer::ProcessViewStyle( ReadContext& rReadContext, const Reference& rxProperties) { ::boost::shared_ptr pStyle (new ViewStyle()); PresenterConfigurationAccess::GetProperty(rxProperties, A2S("StyleName")) >>= pStyle->msStyleName; OUString sParentStyleName; if (PresenterConfigurationAccess::GetProperty(rxProperties, A2S("ParentStyle")) >>= sParentStyleName) { // Find parent style. ViewStyleContainer::const_iterator iStyle; for (iStyle=begin(); iStyle!=end(); ++iStyle) if ((*iStyle)->msStyleName.equals(sParentStyleName)) { pStyle->mpParentStyle = *iStyle; pStyle->mpFont = (*iStyle)->mpFont; pStyle->mpBackground = (*iStyle)->mpBackground; break; } } const OUString sPathToFont; // empty string Reference xFontNode ( PresenterConfigurationAccess::GetProperty(rxProperties, A2S("Font")), UNO_QUERY); PresenterTheme::SharedFontDescriptor pFont ( rReadContext.ReadFont(xFontNode, sPathToFont, PresenterTheme::SharedFontDescriptor())); if (pFont.get() != NULL) pStyle->mpFont = pFont; Reference xBackgroundNode ( PresenterConfigurationAccess::GetProperty(rxProperties, A2S("Background")), UNO_QUERY); SharedBitmapDescriptor pBackground (PresenterBitmapContainer::LoadBitmap( xBackgroundNode, OUString(), rReadContext.mxPresenterHelper, rReadContext.msBasePath, rReadContext.mxCanvas, SharedBitmapDescriptor())); if (pBackground.get() != NULL && pBackground->GetNormalBitmap().is()) pStyle->mpBackground = pBackground; push_back(pStyle); } SharedViewStyle ViewStyleContainer::GetViewStyle (const OUString& rsStyleName) const { const_iterator iEnd (end()); for (const_iterator iStyle=begin(); iStyle!=iEnd; ++iStyle) if ((*iStyle)->msStyleName == rsStyleName) return *iStyle; return SharedViewStyle(); } //===== ViewStyle ============================================================= ViewStyle::ViewStyle (void) : msStyleName(), mpParentStyle(), mpFont(), mpBackground() { } ViewStyle::~ViewStyle (void) { } const SharedBitmapDescriptor ViewStyle::GetBitmap (const OUString& rsBitmapName) const { if (rsBitmapName == A2S("Background")) return mpBackground; else return SharedBitmapDescriptor(); } PresenterTheme::SharedFontDescriptor ViewStyle::GetFont (void) const { if (mpFont.get() != NULL) return mpFont; else if (mpParentStyle.get() != NULL) return mpParentStyle->GetFont(); else return PresenterTheme::SharedFontDescriptor(); } //===== StyleAssociationContainer ============================================= void StyleAssociationContainer::Read ( ReadContext& rReadContext, const Reference& rxThemeRoot) { Reference xStyleAssociationList ( PresenterConfigurationAccess::GetConfigurationNode( rxThemeRoot, A2S("StyleAssociations")), UNO_QUERY); if (xStyleAssociationList.is()) { ::std::vector aProperties (2); aProperties[0] = A2S("ResourceURL"); aProperties[1] = A2S("StyleName"); PresenterConfigurationAccess::ForAll( xStyleAssociationList, aProperties, ::boost::bind(&StyleAssociationContainer::ProcessStyleAssociation, this, ::boost::ref(rReadContext), _1, _2)); } } OUString StyleAssociationContainer::GetStyleName (const OUString& rsResourceName) const { StyleAssociations::const_iterator iAssociation (maStyleAssociations.find(rsResourceName)); if (iAssociation != maStyleAssociations.end()) return iAssociation->second; else return OUString(); } void StyleAssociationContainer::ProcessStyleAssociation( ReadContext& rReadContext, const OUString& rsKey, const ::std::vector& rValues) { (void)rReadContext; (void)rsKey; if (rValues.size() != 2) return; OUString sResourceURL; OUString sStyleName; if ((rValues[0] >>= sResourceURL) && (rValues[1] >>= sStyleName)) { maStyleAssociations[sResourceURL] = sStyleName; } } } // end of anonymous namespace } } // end of namespace ::sdext::presenter /* vim:set shiftwidth=4 softtabstop=4 expandtab: */