diff options
author | Vladimir Glazounov <vg@openoffice.org> | 2008-05-13 13:39:05 +0000 |
---|---|---|
committer | Vladimir Glazounov <vg@openoffice.org> | 2008-05-13 13:39:05 +0000 |
commit | fdc701b1e152dfce94f880099b8d1a04f36671d6 (patch) | |
tree | d3a51289b81fddff05a032a8461c8658c9126d78 /sdext | |
parent | INTEGRATION: CWS presenterscreen (1.2.4); FILE MERGED (diff) | |
download | core-fdc701b1e152dfce94f880099b8d1a04f36671d6.tar.gz core-fdc701b1e152dfce94f880099b8d1a04f36671d6.zip |
INTEGRATION: CWS presenterscreen (1.2.4); FILE MERGED
2008/04/30 08:36:10 af 1.2.4.5: #i88858# Added GetNodeForViewStyle() method.
2008/04/22 13:06:47 af 1.2.4.4: #i18486# Made extension identifier platform specific.
2008/04/22 08:25:39 af 1.2.4.3: RESYNC: (1.2-1.3); FILE MERGED
2008/04/16 16:59:13 af 1.2.4.2: #i18486# Fixed some Linux build problems.
2008/04/16 16:10:07 af 1.2.4.1: #i18486# Exporting FontDescriptor sub class.
Diffstat (limited to 'sdext')
-rw-r--r-- | sdext/source/presenter/PresenterTheme.cxx | 1120 |
1 files changed, 606 insertions, 514 deletions
diff --git a/sdext/source/presenter/PresenterTheme.cxx b/sdext/source/presenter/PresenterTheme.cxx index e72a321c678f..176a5fdaf7c3 100644 --- a/sdext/source/presenter/PresenterTheme.cxx +++ b/sdext/source/presenter/PresenterTheme.cxx @@ -8,7 +8,7 @@ * * $RCSfile: PresenterTheme.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * * This file is part of OpenOffice.org. * @@ -30,6 +30,8 @@ ************************************************************************/ #include "PresenterTheme.hxx" +#include "PresenterBitmapContainer.hxx" +#include "PresenterCanvasHelper.hxx" #include "PresenterComponent.hxx" #include "PresenterConfigurationAccess.hxx" #include "PresenterHelper.hxx" @@ -38,6 +40,7 @@ #include <com/sun/star/deployment/XPackageInformationProvider.hpp> #include <com/sun/star/drawing/XPresenterHelper.hpp> #include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <com/sun/star/rendering/PanoseWeight.hpp> #include <com/sun/star/rendering/XBitmap.hpp> #include <com/sun/star/util/Color.hpp> #include <boost/bind.hpp> @@ -48,9 +51,7 @@ using namespace ::com::sun::star::uno; using namespace ::std; using ::rtl::OUString; -namespace { -OUString A2S (const sal_Char* pString) { return OUString::createFromAscii(pString); } -} +#define A2S(s) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))) namespace sdext { namespace presenter { @@ -59,15 +60,41 @@ namespace { class BorderSize { public: - BorderSize (void) : mnLeft(0),mnTop(0),mnRight(0),mnBottom(0) {} + 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<sal_Int32> ToVector (void) + { + vector<sal_Int32> 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 @@ -77,70 +104,41 @@ public: class ReadContext { public: - PresenterConfigurationAccess& mrConfiguration; + Reference<XComponentContext> mxComponentContext; Reference<rendering::XCanvas> mxCanvas; - ::boost::shared_ptr<PresenterTheme::PropertyMap> mpPropertyMap; Reference<drawing::XPresenterHelper> mxPresenterHelper; OUString msBasePath; ReadContext ( - const css::uno::Reference<css::uno::XComponentContext>& rxContext, - PresenterConfigurationAccess& rConfiguration, + const Reference<XComponentContext>& rxContext, const Reference<rendering::XCanvas>& rxCanvas); ~ReadContext (void); - /** Read one bitmap from a file and store this and the other given data - into a new BitmapDescriptor object. - */ - ::boost::shared_ptr<PresenterTheme::BitmapDescriptor> ReadBitmap ( - const ::rtl::OUString& rsKey, - const ::rtl::OUString& rsFileName, - const sal_Int32 nXOffset, - const sal_Int32 nYOffset, - const util::Color nColor); - /** 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. */ - ::boost::shared_ptr<PresenterTheme::FontDescriptor> ReadFont ( + static PresenterTheme::SharedFontDescriptor ReadFont ( const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxTheme, - const ::rtl::OUString& rsFontPath); - - /** Read a single bitmap, that typically is not member of a set, and - return a new BitmapDescriptor with the data describing the bitmap. - */ - ::boost::shared_ptr<PresenterTheme::BitmapDescriptor> ReadSingleBitmap ( - const ::rtl::OUString& rsKey, - const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode, - const ::rtl::OUString& rsRelativePath); - - /** Read a set of bitmaps from the given node and return a new - BitmapContainer that contains them. - */ - ::boost::shared_ptr<PresenterTheme::BitmapContainer> ReadBorderBitmaps ( - const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode); + const ::rtl::OUString& rsFontPath, + const PresenterTheme::SharedFontDescriptor& rpDefault); + static PresenterTheme::SharedFontDescriptor ReadFont ( + const Reference<beans::XPropertySet>& rxFontProperties, + const PresenterTheme::SharedFontDescriptor& rpDefault); ::boost::shared_ptr<PresenterTheme::Theme> ReadTheme ( + PresenterConfigurationAccess& rConfiguration, const OUString& rsThemeName); BorderSize ReadBorderSize (const Reference<container::XNameAccess>& rxNode); + void SetBitmapSourceExtension (const OUString& rsExtensionName); + private: - /** Used by ReadBorderBitmaps to read a single bitmap. - @param rpContainer - The container to insert the new bitmap into. - @param rsKey - The key of the configuration node that contains the bitmap data. - @param rValues - A set of Anys that contain Strings, nodes, and other data that - describe a bitmap. - */ - void ProcessBitmap ( - const ::boost::shared_ptr<PresenterTheme::BitmapContainer>& rpContainer, - const ::rtl::OUString& rsKey, - const ::std::vector<css::uno::Any>& rValues); + Any GetByName ( + const Reference<container::XNameAccess>& rxNode, + const OUString& rsName) const; }; @@ -154,31 +152,35 @@ public: PaneStyle (void); ~PaneStyle (void); - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); + const SharedBitmapDescriptor GetBitmap (const OUString& sBitmapName) const; OUString msStyleName; ::boost::shared_ptr<PaneStyle> mpParentStyle; - ::boost::shared_ptr<PresenterTheme::FontDescriptor> mpFont; + PresenterTheme::SharedFontDescriptor mpFont; BorderSize maInnerBorderSize; BorderSize maOuterBorderSize; - ::boost::shared_ptr<PresenterTheme::BitmapContainer> mpBitmaps; + ::boost::shared_ptr<PresenterBitmapContainer> mpBitmaps; + + PresenterTheme::SharedFontDescriptor GetFont (void) const; + +private: + + void UpdateBorderSize (BorderSize& rBorderSize, bool bInner); }; +typedef ::boost::shared_ptr<PaneStyle> SharedPaneStyle; -class PaneStyleContainer : vector<boost::shared_ptr<PaneStyle> > + +class PaneStyleContainer : vector<SharedPaneStyle> { public: void Read ( ReadContext& rReadContext, const Reference<container::XHierarchicalNameAccess>& rThemeRoot); - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); + SharedPaneStyle GetPaneStyle (const OUString& rsStyleName) const; private: void ProcessPaneStyle ( @@ -198,64 +200,61 @@ public: ViewStyle (void); ~ViewStyle (void); - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); + const SharedBitmapDescriptor GetBitmap (const OUString& sBitmapName) const; + + PresenterTheme::SharedFontDescriptor GetFont (void) const; OUString msStyleName; ::boost::shared_ptr<ViewStyle> mpParentStyle; - ::boost::shared_ptr<PresenterTheme::FontDescriptor> mpFont; - ::boost::shared_ptr<PresenterTheme::BitmapDescriptor> mpBackground; + PresenterTheme::SharedFontDescriptor mpFont; + ::boost::shared_ptr<PresenterBitmapContainer> mpBitmaps; + SharedBitmapDescriptor mpBackground; }; +typedef ::boost::shared_ptr<ViewStyle> SharedViewStyle; -class ViewStyleContainer : vector<boost::shared_ptr<ViewStyle> > + +class ViewStyleContainer : vector<SharedViewStyle> { public: void Read ( ReadContext& rReadContext, const Reference<container::XHierarchicalNameAccess>& rThemeRoot); - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); + + SharedViewStyle GetViewStyle (const OUString& rsStyleName) const; private: void ProcessViewStyle( ReadContext& rReadContext, - const ::rtl::OUString& rsKey, - const ::std::vector<css::uno::Any>& rValues); + const Reference<beans::XPropertySet>& rxProperties); }; -class StyleAssociation +class ViewDescriptor { -public: - StyleAssociation ( - const OUString& rsResourceURL, - const OUString& rsStyleName); - ~StyleAssociation (void); - OUString msResourceURL; - OUString msStyleName; }; +typedef ::boost::shared_ptr<ViewDescriptor> SharedViewDescriptor; +typedef ::std::vector<SharedViewDescriptor> ViewDescriptorContainer; - -class StyleAssociationContainer : vector<StyleAssociation> +class StyleAssociationContainer { public: void Read ( ReadContext& rReadContext, const Reference<container::XHierarchicalNameAccess>& rThemeRoot); - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); + + OUString GetStyleName (const OUString& rsResourceName) const; private: + typedef map<OUString, OUString> StyleAssociations; + StyleAssociations maStyleAssociations; + void ProcessStyleAssociation( ReadContext& rReadContext, const ::rtl::OUString& rsKey, @@ -270,88 +269,35 @@ class PresenterTheme::Theme public: Theme ( const OUString& rsName, - const Reference<container::XHierarchicalNameAccess>& rThemeRoot); + const Reference<container::XHierarchicalNameAccess>& rThemeRoot, + const OUString& rsNodeName); ~Theme (void); void Read ( + PresenterConfigurationAccess& rConfiguration, ReadContext& rReadContext); - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); -private: OUString msThemeName; + OUString msConfigurationNodeName; ::boost::shared_ptr<Theme> mpParentTheme; - ::boost::shared_ptr<BitmapDescriptor> mpBackground; + SharedBitmapDescriptor mpBackground; PaneStyleContainer maPaneStyles; ViewStyleContainer maViewStyles; + ViewDescriptorContainer maViewDescriptors; StyleAssociationContainer maStyleAssociations; Reference<container::XHierarchicalNameAccess> mxThemeRoot; -}; - - - - -class PresenterTheme::BitmapDescriptor -{ -public: - explicit BitmapDescriptor (void); - void SetBitmap (const Reference<rendering::XBitmap>& rxBitmap); - - sal_Int32 mnWidth; - sal_Int32 mnHeight; - sal_Int32 mnXOffset; - sal_Int32 mnYOffset; - util::Color maReplacementColor; - uno::Reference<rendering::XBitmap> mxBitmap; - - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); -}; - - - - -class PresenterTheme::BitmapContainer - : public ::std::map<OUString,::boost::shared_ptr<BitmapDescriptor> > -{ -public: - BitmapContainer (void); - - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); -}; + ::boost::shared_ptr<PresenterBitmapContainer> mpIconContainer; + typedef map<rtl::OUString,SharedFontDescriptor> FontContainer; + FontContainer maFontContainer; + SharedPaneStyle GetPaneStyle (const OUString& rsStyleName) const; + SharedViewStyle GetViewStyle (const OUString& rsStyleName) const; - - -typedef ::boost::function<Any(const OUString&)> PropertyProviderFunction; - -class PresenterTheme::PropertyMap : public ::std::map<OUString,Any> -{ -public: - PropertyMap (void); - - void Set (const OUString& rsKey, const Any& rValue); -}; - - - - -class PresenterTheme::FontDescriptor -{ -public: - FontDescriptor (void); - ::rtl::OUString msName; - sal_Int32 mnSize; - sal_uInt32 mnColor; - ::rtl::OUString msAnchor; - - void AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap); +private: + void ProcessFont( + ReadContext& rReadContext, + const OUString& rsKey, + const Reference<beans::XPropertySet>& rxProperties); }; @@ -365,11 +311,11 @@ PresenterTheme::PresenterTheme ( const css::uno::Reference<css::rendering::XCanvas>& rxCanvas) : mxContext(rxContext), msThemeName(rsThemeName), - mpBitmapContainer(new BitmapContainer()), - mxCanvas(rxCanvas), - mpPropertyMap(new PropertyMap()) + mpTheme(), + mpBitmapContainer(), + mxCanvas(rxCanvas) { - ReadTheme(); + mpTheme = ReadTheme(); } @@ -389,21 +335,16 @@ void SAL_CALL PresenterTheme::disposing (void) -void PresenterTheme::ReadTheme (void) +::boost::shared_ptr<PresenterTheme::Theme> PresenterTheme::ReadTheme (void) { + ReadContext aReadContext(mxContext, mxCanvas); + PresenterConfigurationAccess aConfiguration ( mxContext, OUString::createFromAscii("/org.openoffice.Office.extension.PresenterScreen/"), PresenterConfigurationAccess::READ_ONLY); - // Read the theme and properties. - ReadContext aReadContext(mxContext, aConfiguration, mxCanvas); - ::boost::shared_ptr<Theme> pTheme (aReadContext.ReadTheme(msThemeName)); - if (pTheme.get() != NULL) - { - pTheme->Read(aReadContext); - pTheme->AddProperties(msThemeName, mpPropertyMap); - } + return aReadContext.ReadTheme(aConfiguration, msThemeName); } @@ -429,133 +370,227 @@ void PresenterTheme::ProvideCanvas (const Reference<rendering::XCanvas>& rxCanva -Any PresenterTheme::getPropertyValue (const OUString& rsPropertyName) +OUString PresenterTheme::GetStyleName (const ::rtl::OUString& rsResourceURL) const { - PropertyMap::const_iterator iProperty (mpPropertyMap->find(rsPropertyName)); - if (iProperty != mpPropertyMap->end()) - return iProperty->second; - else - throw beans::UnknownPropertyException(); + OUString sStyleName; + ::boost::shared_ptr<Theme> pTheme (mpTheme); + while (sStyleName.getLength()==0 && pTheme.get()!=NULL) + { + sStyleName = pTheme->maStyleAssociations.GetStyleName(rsResourceURL); + pTheme = pTheme->mpParentTheme; + } + return sStyleName; } -OUString PresenterTheme::GetPaneStyle (const ::rtl::OUString& rsResourceURL) const +::std::vector<sal_Int32> PresenterTheme::GetBorderSize ( + const ::rtl::OUString& rsStyleName, + const bool bOuter) const { - OUString sStyleName (PresenterHelper::msDefaultPaneStyle); - PropertyMap::const_iterator iProperty (mpPropertyMap->find(rsResourceURL)); - if (iProperty != mpPropertyMap->end()) - iProperty->second >>= sStyleName; - return sStyleName; + 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<sal_Int32>(4,0); + } } -OUString PresenterTheme::GetViewStyle (const ::rtl::OUString& rsResourceURL) const +PresenterTheme::SharedFontDescriptor PresenterTheme::ReadFont ( + const Reference<container::XHierarchicalNameAccess>& rxNode, + const OUString& rsFontPath, + const PresenterTheme::SharedFontDescriptor& rpDefault) { - OUString sStyleName (PresenterHelper::msDefaultViewStyle); - PropertyMap::const_iterator iProperty (mpPropertyMap->find(rsResourceURL)); - if (iProperty != mpPropertyMap->end()) - iProperty->second >>= sStyleName; - return sStyleName; + return ReadContext::ReadFont(rxNode, rsFontPath, rpDefault); } -//===== BitmapDescriptor ====================================================== - -PresenterTheme::BitmapDescriptor::BitmapDescriptor (void) - : mnWidth(0), - mnHeight(0), - mnXOffset(0), - mnYOffset(0), - maReplacementColor(0x00000000), - mxBitmap() +bool PresenterTheme::ConvertToColor ( + const Any& rColorSequence, + sal_uInt32& rColor) { + Sequence<sal_Int8> aByteSequence; + if (rColorSequence >>= aByteSequence) + { + const sal_Int32 nByteCount (aByteSequence.getLength()); + const sal_uInt8* pArray = reinterpret_cast<const sal_uInt8*>(aByteSequence.getConstArray()); + rColor = 0; + for (sal_Int32 nIndex=0; nIndex<nByteCount; ++nIndex) + { + rColor = (rColor << 8) | *pArray++; + } + return true; + } + else + return false; } -void PresenterTheme::BitmapDescriptor::SetBitmap (const Reference<rendering::XBitmap>& rxBitmap) +::boost::shared_ptr<PresenterConfigurationAccess> PresenterTheme::GetNodeForViewStyle ( + const ::rtl::OUString& rsStyleName, + const PresenterConfigurationAccess::WriteMode) const { - mxBitmap = rxBitmap; - if (mxBitmap.is()) + if (mpTheme.get() == NULL) + return ::boost::shared_ptr<PresenterConfigurationAccess>(); + + // Open configuration for writing. + ::boost::shared_ptr<PresenterConfigurationAccess> pConfiguration ( + new PresenterConfigurationAccess( + mxContext, + OUString::createFromAscii("/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"))) { - mnWidth = mxBitmap->getSize().Width; - mnHeight = mxBitmap->getSize().Height; - } - else - { - mnWidth = 0; - mnHeight = 0; + pConfiguration->GoToChild( + ::boost::bind(&PresenterConfigurationAccess::IsStringPropertyEqual, + rsStyleName, + A2S("StyleName"), + _2)); } + return pConfiguration; } -void PresenterTheme::BitmapDescriptor::AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +::rtl::OUString PresenterTheme::GetThemeName (void) const { - rpPropertyMap->Set(rsPropertyPrefix + A2S("Bitmap"), Any(mxBitmap)); - rpPropertyMap->Set(rsPropertyPrefix + A2S("Offset"), Any(awt::Point(mnXOffset,mnYOffset))); - rpPropertyMap->Set(rsPropertyPrefix + A2S("Color"), Any(maReplacementColor)); + if (mpTheme.get() != NULL) + return mpTheme->msThemeName; + else + return OUString(); } -//===== BitmapContainer ======================================================= - -PresenterTheme::BitmapContainer::BitmapContainer (void) +SharedBitmapDescriptor PresenterTheme::GetBitmap ( + const OUString& rsStyleName, + const OUString& rsBitmapName) const { + if (mpTheme.get() != NULL) + { + if (rsStyleName.getLength() == 0) + { + if (rsBitmapName == A2S("Background")) + { + ::boost::shared_ptr<Theme> 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(); } -void PresenterTheme::BitmapContainer::AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +SharedBitmapDescriptor PresenterTheme::GetBitmap ( + const OUString& rsBitmapName) const { - const_iterator iDescriptor; - for (iDescriptor=begin(); iDescriptor!=end(); ++iDescriptor) + if (mpTheme.get() != NULL) { - if (iDescriptor->second.get() == NULL) + if (rsBitmapName == A2S("Background")) { - OSL_ASSERT(false); - continue; + ::boost::shared_ptr<Theme> 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); } - iDescriptor->second->AddProperties( - rsPropertyPrefix+iDescriptor->first+A2S("_"), - rpPropertyMap); } -} + return SharedBitmapDescriptor(); +} -//===== PropertyMap =========================================================== -PresenterTheme::PropertyMap::PropertyMap (void) +::boost::shared_ptr<PresenterBitmapContainer> PresenterTheme::GetBitmapContainer (void) const { + if (mpTheme.get() != NULL) + return mpTheme->mpIconContainer; + else + return ::boost::shared_ptr<PresenterBitmapContainer>(); } -void PresenterTheme::PropertyMap::Set (const OUString& rsKey, const Any& rValue) +PresenterTheme::SharedFontDescriptor PresenterTheme::GetFont ( + const OUString& rsStyleName) const { - iterator iItem (find(rsKey)); - if (iItem == end()) - insert(value_type(rsKey,rValue)); - else - iItem->second = rValue; + 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<Theme> 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(); } @@ -564,24 +599,71 @@ void PresenterTheme::PropertyMap::Set (const OUString& rsKey, const Any& rValue) //===== FontDescriptor ======================================================== PresenterTheme::FontDescriptor::FontDescriptor (void) - : msName(OUString::createFromAscii("Albany")), + : msFamilyName(), + msStyleName(), mnSize(12), mnColor(0x00000000), - msAnchor(OUString::createFromAscii("Left")) + msAnchor(OUString::createFromAscii("Left")), + mnXOffset(0), + mnYOffset(0) { } -void PresenterTheme::FontDescriptor::AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +PresenterTheme::FontDescriptor::FontDescriptor ( + const ::boost::shared_ptr<FontDescriptor>& rpDescriptor) + : msFamilyName(), + msStyleName(), + mnSize(12), + mnColor(0x00000000), + msAnchor(OUString::createFromAscii("Left")), + mnXOffset(0), + mnYOffset(0) { - rpPropertyMap->Set(rsPropertyPrefix+A2S("Name"), Any(msName)); - rpPropertyMap->Set(rsPropertyPrefix+A2S("Size"), Any(mnSize)); - rpPropertyMap->Set(rsPropertyPrefix+A2S("Color"), Any(mnColor)); - rpPropertyMap->Set(rsPropertyPrefix+A2S("Anchor"), Any(msAnchor)); + 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<rendering::XCanvas>& rxCanvas) +{ + if (mxFont.is()) + return true; + + if ( ! rxCanvas.is()) + return false; + + rendering::FontRequest aFontRequest; + aFontRequest.FontDescription.FamilyName = msFamilyName; + if (msFamilyName.getLength() == 0) + aFontRequest.FontDescription.FamilyName = A2S("Tahoma"); + aFontRequest.FontDescription.StyleName = msStyleName; + aFontRequest.CellSize = mnSize; + + // 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; + + mxFont = rxCanvas->createFont( + aFontRequest, + Sequence<beans::PropertyValue>(), + geometry::Matrix2D(1,0,0,1)); + + return mxFont.is(); } @@ -591,13 +673,16 @@ void PresenterTheme::FontDescriptor::AddProperties ( PresenterTheme::Theme::Theme ( const OUString& rsName, - const Reference<container::XHierarchicalNameAccess>& rxThemeRoot) + const Reference<container::XHierarchicalNameAccess>& rxThemeRoot, + const OUString& rsNodeName) : msThemeName(rsName), + msConfigurationNodeName(rsNodeName), mpParentTheme(), maPaneStyles(), maViewStyles(), maStyleAssociations(), - mxThemeRoot(rxThemeRoot) + mxThemeRoot(rxThemeRoot), + mpIconContainer() { } @@ -611,7 +696,9 @@ PresenterTheme::Theme::~Theme (void) -void PresenterTheme::Theme::Read (ReadContext& rReadContext) +void PresenterTheme::Theme::Read ( + PresenterConfigurationAccess& rConfiguration, + ReadContext& rReadContext) { PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, A2S("ThemeName")) >>= msThemeName; @@ -622,12 +709,31 @@ void PresenterTheme::Theme::Read (ReadContext& rReadContext) >>= sParentThemeName) && sParentThemeName.getLength()>0) { - mpParentTheme = rReadContext.ReadTheme(sParentThemeName); + 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.getLength()>0) + { + rReadContext.SetBitmapSourceExtension(sBitmapSourceExtension); + } + else + { + rReadContext.SetBitmapSourceExtension(PresenterComponent::gsExtensionIdentifier); } // Background. - mpBackground - = rReadContext.ReadSingleBitmap(A2S("Background"), mxThemeRoot, A2S("Background")); + mpBackground = PresenterBitmapContainer::LoadBitmap( + mxThemeRoot, + A2S("Background"), + rReadContext.mxPresenterHelper, + rReadContext.msBasePath, + rReadContext.mxCanvas, + SharedBitmapDescriptor()); // Style associations. maStyleAssociations.Read(rReadContext, mxThemeRoot); @@ -638,30 +744,67 @@ void PresenterTheme::Theme::Read (ReadContext& rReadContext) // View styles. maViewStyles.Read(rReadContext, mxThemeRoot); + // Read bitmaps. + mpIconContainer.reset( + new PresenterBitmapContainer( + Reference<container::XNameAccess>( + PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, A2S("Bitmaps")), + UNO_QUERY), + mpParentTheme.get()!=NULL + ? mpParentTheme->mpIconContainer + : ::boost::shared_ptr<PresenterBitmapContainer>(), + rReadContext.mxComponentContext, + rReadContext.mxCanvas, + rReadContext.msBasePath)); + + // Read fonts. + Reference<container::XNameAccess> xFontNode( + PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, A2S("Fonts")), + UNO_QUERY); + PresenterConfigurationAccess::ForAll( + xFontNode, + ::boost::bind(&PresenterTheme::Theme::ProcessFont, + this, ::boost::ref(rReadContext), _1, _2)); } -void PresenterTheme::Theme::AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +SharedPaneStyle PresenterTheme::Theme::GetPaneStyle (const OUString& rsStyleName) const { - if (mpParentTheme.get() != NULL) - mpParentTheme->AddProperties(rsPropertyPrefix, rpPropertyMap); + SharedPaneStyle pPaneStyle (maPaneStyles.GetPaneStyle(rsStyleName)); + if (pPaneStyle.get() != NULL) + return pPaneStyle; + else if (mpParentTheme.get() != NULL) + return mpParentTheme->GetPaneStyle(rsStyleName); + else + return SharedPaneStyle(); +} - // Background. - if (mpBackground.get() != NULL) - mpBackground->AddProperties(rsPropertyPrefix+A2S("Background_"), rpPropertyMap); - // Style associations. - maStyleAssociations.AddProperties(rsPropertyPrefix, rpPropertyMap); - // Pane styles. - maPaneStyles.AddProperties(rsPropertyPrefix, rpPropertyMap); - // View styles. - maViewStyles.AddProperties(rsPropertyPrefix, rpPropertyMap); +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<beans::XPropertySet>& rxProperties) +{ + (void)rReadContext; + maFontContainer[rsKey] = ReadContext::ReadFont(rxProperties, SharedFontDescriptor()); } @@ -673,9 +816,8 @@ namespace { ReadContext::ReadContext ( const css::uno::Reference<css::uno::XComponentContext>& rxContext, - PresenterConfigurationAccess& rConfiguration, const Reference<rendering::XCanvas>& rxCanvas) - : mrConfiguration(rConfiguration), + : mxComponentContext(rxContext), mxCanvas(rxCanvas), mxPresenterHelper(), msBasePath() @@ -691,13 +833,7 @@ ReadContext::ReadContext ( } // Get base path to bitmaps. - Reference<deployment::XPackageInformationProvider> xInformationProvider ( - rxContext->getValueByName(OUString::createFromAscii( - "/singletons/com.sun.star.deployment.PackageInformationProvider")), - UNO_QUERY_THROW); - if (xInformationProvider.is()) - msBasePath = xInformationProvider->getPackageLocation(gsExtensionIdentifier); - msBasePath += OUString::createFromAscii("/"); + SetBitmapSourceExtension(PresenterComponent::gsExtensionIdentifier); } @@ -710,50 +846,13 @@ ReadContext::~ReadContext (void) -::boost::shared_ptr<PresenterTheme::BitmapDescriptor> ReadContext::ReadBitmap ( - const OUString& rsKey, - const OUString& rsFileName, - const sal_Int32 nXOffset, - const sal_Int32 nYOffset, - const util::Color nColor) -{ - (void)rsKey; - - ::boost::shared_ptr<PresenterTheme::BitmapDescriptor> pDescriptor( - new PresenterTheme::BitmapDescriptor()); - - if ( ! mxCanvas.is()) - return pDescriptor; - - if (mxPresenterHelper.is()) - { - - pDescriptor->mnXOffset = nXOffset; - pDescriptor->mnYOffset = nYOffset; - pDescriptor->maReplacementColor = nColor; - pDescriptor->mxBitmap = mxPresenterHelper->loadBitmap( - msBasePath + rsFileName, - mxCanvas); - } - else - { - OSL_ASSERT(mxPresenterHelper.is()); - } - return pDescriptor; -} - - - - -::boost::shared_ptr<PresenterTheme::FontDescriptor> ReadContext::ReadFont ( +PresenterTheme::SharedFontDescriptor ReadContext::ReadFont ( const Reference<container::XHierarchicalNameAccess>& rxNode, - const OUString& rsFontPath) + const OUString& rsFontPath, + const PresenterTheme::SharedFontDescriptor& rpDefault) { - ::boost::shared_ptr<PresenterTheme::FontDescriptor> pDescriptor ( - new PresenterTheme::FontDescriptor()); - if ( ! rxNode.is()) - return pDescriptor; + return PresenterTheme::SharedFontDescriptor(); try { @@ -763,121 +862,59 @@ ReadContext::~ReadContext (void) rsFontPath), UNO_QUERY_THROW); - PresenterConfigurationAccess::GetConfigurationNode( - xFont, - OUString::createFromAscii("FamilyName")) >>= pDescriptor->msName; - - PresenterConfigurationAccess::GetConfigurationNode( - xFont, - OUString::createFromAscii("Size")) >>= pDescriptor->mnSize; - - PresenterConfigurationAccess::GetConfigurationNode( - xFont, - OUString::createFromAscii("Color")) >>= pDescriptor->mnColor; - - PresenterConfigurationAccess::GetConfigurationNode( - xFont, - OUString::createFromAscii("Anchor")) >>= pDescriptor->msAnchor; + Reference<beans::XPropertySet> xProperties (xFont, UNO_QUERY_THROW); + return ReadFont(xProperties, rpDefault); } catch (Exception&) { OSL_ASSERT(false); } - return pDescriptor; + return PresenterTheme::SharedFontDescriptor(); } -::boost::shared_ptr<PresenterTheme::BitmapContainer> ReadContext::ReadBorderBitmaps ( - const Reference<container::XHierarchicalNameAccess>& rxNode) +PresenterTheme::SharedFontDescriptor ReadContext::ReadFont ( + const Reference<beans::XPropertySet>& rxProperties, + const PresenterTheme::SharedFontDescriptor& rpDefault) { - ::boost::shared_ptr<PresenterTheme::BitmapContainer> pContainer ( - new PresenterTheme::BitmapContainer()); - Reference<container::XNameAccess> xBitmapList (rxNode, UNO_QUERY); - ::std::vector<rtl::OUString> aProperties (4); - aProperties[0] = OUString::createFromAscii("FileName"); - aProperties[1] = OUString::createFromAscii("XOffset"); - aProperties[2] = OUString::createFromAscii("YOffset"); - aProperties[3] = OUString::createFromAscii("ReplacementColor"); - PresenterConfigurationAccess::ForAll( - xBitmapList, - aProperties, - ::boost::bind(&ReadContext::ProcessBitmap, this, pContainer, _1, _2)); - return pContainer; -} - - - - -void ReadContext::ProcessBitmap ( - const ::boost::shared_ptr<PresenterTheme::BitmapContainer>& rpContainer, - const OUString& rsKey, - const ::std::vector<Any>& rValues) -{ - if (rValues.size() != 4) - return; + ::boost::shared_ptr<PresenterTheme::FontDescriptor> 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; - OUString sFileName; - sal_Int32 nXOffset (0); - sal_Int32 nYOffset (0); - sal_uInt32 nColor (0); - rValues[0] >>= sFileName; - rValues[1] >>= nXOffset; - rValues[2] >>= nYOffset; - rValues[3] >>= nColor; - - rpContainer->insert( - PresenterTheme::BitmapContainer::value_type( - rsKey, - ReadBitmap(rsKey, sFileName, nXOffset, nYOffset, nColor))); + return pDescriptor; } -::boost::shared_ptr<PresenterTheme::BitmapDescriptor> ReadContext::ReadSingleBitmap ( - const OUString& rsKey, - const Reference<container::XHierarchicalNameAccess>& rxTheme, - const OUString& rsRelativeNodePath) +Any ReadContext::GetByName ( + const Reference<container::XNameAccess>& rxNode, + const OUString& rsName) const { - if ( ! mxCanvas.is()) - return ::boost::shared_ptr<PresenterTheme::BitmapDescriptor>(); - - Reference<container::XHierarchicalNameAccess> xBitmapNode( - PresenterConfigurationAccess::GetConfigurationNode( - rxTheme, - rsRelativeNodePath), - UNO_QUERY); - if (xBitmapNode.is()) - { - OUString sFileName; - sal_Int32 nXOffset (0); - sal_Int32 nYOffset (0); - util::Color nColor (0); - PresenterConfigurationAccess::GetConfigurationNode(xBitmapNode,A2S("FileName")) - >>= sFileName; - PresenterConfigurationAccess::GetConfigurationNode(xBitmapNode,A2S("XOffset")) - >>= nXOffset; - PresenterConfigurationAccess::GetConfigurationNode(xBitmapNode,A2S("YOffset")) - >>= nYOffset; - PresenterConfigurationAccess::GetConfigurationNode(xBitmapNode,A2S("ReplacementColor")) - >>= nColor; - return ReadBitmap( - rsKey, - sFileName, - nXOffset, - nYOffset, - nColor); - } - return ::boost::shared_ptr<PresenterTheme::BitmapDescriptor>(); + OSL_ASSERT(rxNode.is()); + if (rxNode->hasByName(rsName)) + return rxNode->getByName(rsName); + else + return Any(); } ::boost::shared_ptr<PresenterTheme::Theme> ReadContext::ReadTheme ( + PresenterConfigurationAccess& rConfiguration, const OUString& rsThemeName) { ::boost::shared_ptr<PresenterTheme::Theme> pTheme; @@ -886,7 +923,7 @@ void ReadContext::ProcessBitmap ( if (sCurrentThemeName.getLength() == 0) { // No theme name given. Look up the CurrentTheme property. - mrConfiguration.GetConfigurationNode(A2S("Presenter/CurrentTheme")) >>= sCurrentThemeName; + rConfiguration.GetConfigurationNode(A2S("Presenter/CurrentTheme")) >>= sCurrentThemeName; if (sCurrentThemeName.getLength() == 0) { // Still no name. Use "DefaultTheme". @@ -895,7 +932,7 @@ void ReadContext::ProcessBitmap ( } Reference<container::XNameAccess> xThemes ( - mrConfiguration.GetConfigurationNode(OUString::createFromAscii("Presenter/Themes")), + rConfiguration.GetConfigurationNode(A2S("Presenter/Themes")), UNO_QUERY); if (xThemes.is()) { @@ -913,13 +950,18 @@ void ReadContext::ProcessBitmap ( >>= sThemeName; if (sThemeName == sCurrentThemeName) { - pTheme.reset(new PresenterTheme::Theme(sThemeName,xTheme)); + pTheme.reset(new PresenterTheme::Theme(sThemeName,xTheme,rsKey)); break; } } } } + if (pTheme.get() != NULL) + { + pTheme->Read(rConfiguration, *this); + } + return pTheme; } @@ -932,11 +974,10 @@ BorderSize ReadContext::ReadBorderSize (const Reference<container::XNameAccess>& if (rxNode.is()) { - Any aValue; - rxNode->getByName(A2S("Left")) >>= aBorderSize.mnLeft; - rxNode->getByName(A2S("Top")) >>= aBorderSize.mnTop; - rxNode->getByName(A2S("Right")) >>= aBorderSize.mnRight; - rxNode->getByName(A2S("Bottom")) >>= aBorderSize.mnBottom; + 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; @@ -945,6 +986,15 @@ BorderSize ReadContext::ReadBorderSize (const Reference<container::XNameAccess>& +void ReadContext::SetBitmapSourceExtension (const OUString& rsExtensionIdentifier) +{ + // Get base path to bitmaps. + msBasePath = PresenterComponent::GetBasePath(mxComponentContext, rsExtensionIdentifier); +} + + + + //===== PaneStyleContainer ==================================================== void PaneStyleContainer::Read ( @@ -954,7 +1004,7 @@ void PaneStyleContainer::Read ( Reference<container::XNameAccess> xPaneStyleList ( PresenterConfigurationAccess::GetConfigurationNode( rxThemeRoot, - OUString::createFromAscii("PaneStyles")), + A2S("PaneStyles")), UNO_QUERY); if (xPaneStyleList.is()) { @@ -998,23 +1048,39 @@ void PaneStyleContainer::ProcessPaneStyle( PaneStyleContainer::const_iterator iStyle; for (iStyle=begin(); iStyle!=end(); ++iStyle) if ((*iStyle)->msStyleName.equals(sParentStyleName)) + { pStyle->mpParentStyle = *iStyle; + break; + } } Reference<container::XHierarchicalNameAccess> xFontNode (rValues[2], UNO_QUERY); - pStyle->mpFont = rReadContext.ReadFont(xFontNode, A2S("")); + pStyle->mpFont = rReadContext.ReadFont( + xFontNode, A2S(""), PresenterTheme::SharedFontDescriptor()); Reference<container::XNameAccess> xInnerBorderSizeNode (rValues[3], UNO_QUERY); pStyle->maInnerBorderSize = rReadContext.ReadBorderSize(xInnerBorderSizeNode); Reference<container::XNameAccess> 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<container::XHierarchicalNameAccess> xBitmapsNode (rValues[5], UNO_QUERY); - ::boost::shared_ptr<PresenterTheme::BitmapContainer> pBitmaps; - pBitmaps = rReadContext.ReadBorderBitmaps(xBitmapsNode); - pStyle->mpBitmaps = pBitmaps; + Reference<container::XNameAccess> xBitmapsNode (rValues[5], UNO_QUERY); + pStyle->mpBitmaps.reset(new PresenterBitmapContainer( + xBitmapsNode, + pStyle->mpParentStyle.get()!=NULL + ? pStyle->mpParentStyle->mpBitmaps + : ::boost::shared_ptr<PresenterBitmapContainer>(), + rReadContext.mxComponentContext, + rReadContext.mxCanvas, + rReadContext.msBasePath, + rReadContext.mxPresenterHelper)); } push_back(pStyle); @@ -1023,14 +1089,13 @@ void PaneStyleContainer::ProcessPaneStyle( -void PaneStyleContainer::AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +SharedPaneStyle PaneStyleContainer::GetPaneStyle (const OUString& rsStyleName) const { - for (const_iterator iStyle=begin(); iStyle!=end(); ++iStyle) - (*iStyle)->AddProperties( - rsPropertyPrefix+(*iStyle)->msStyleName+A2S("_"), - rpPropertyMap); + const_iterator iEnd (end()); + for (const_iterator iStyle=begin(); iStyle!=iEnd; ++iStyle) + if ((*iStyle)->msStyleName == rsStyleName) + return *iStyle; + return SharedPaneStyle(); } @@ -1040,10 +1105,11 @@ void PaneStyleContainer::AddProperties ( PaneStyle::PaneStyle (void) : msStyleName(), + mpParentStyle(), mpFont(), maInnerBorderSize(), maOuterBorderSize(), - mpBitmaps(new PresenterTheme::BitmapContainer()) + mpBitmaps() { } @@ -1057,32 +1123,51 @@ PaneStyle::~PaneStyle (void) -void PaneStyle::AddProperties( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +void PaneStyle::UpdateBorderSize (BorderSize& rBorderSize, bool bInner) { if (mpParentStyle.get() != NULL) - mpParentStyle->AddProperties(rsPropertyPrefix, rpPropertyMap); - if (mpFont.get() != NULL) - mpFont->AddProperties(rsPropertyPrefix+A2S("Font_"), rpPropertyMap); + 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) - mpBitmaps->AddProperties(rsPropertyPrefix+A2S("Border_"), rpPropertyMap); - - Sequence<sal_Int32> aBorderSize (4); - aBorderSize[0] = maInnerBorderSize.mnLeft; - aBorderSize[1] = maInnerBorderSize.mnTop; - aBorderSize[2] = maInnerBorderSize.mnRight; - aBorderSize[3] = maInnerBorderSize.mnBottom; - rpPropertyMap->Set( - rsPropertyPrefix+A2S("InnerBorderSize"), - Any(aBorderSize)); - aBorderSize[0] = maOuterBorderSize.mnLeft; - aBorderSize[1] = maOuterBorderSize.mnTop; - aBorderSize[2] = maOuterBorderSize.mnRight; - aBorderSize[3] = maOuterBorderSize.mnBottom; - rpPropertyMap->Set( - rsPropertyPrefix+A2S("OuterBorderSize"), - Any(aBorderSize)); + { + 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(); } @@ -1094,23 +1179,19 @@ void ViewStyleContainer::Read ( ReadContext& rReadContext, const Reference<container::XHierarchicalNameAccess>& rxThemeRoot) { + (void)rReadContext; + Reference<container::XNameAccess> xViewStyleList ( PresenterConfigurationAccess::GetConfigurationNode( rxThemeRoot, - OUString::createFromAscii("ViewStyles")), + A2S("ViewStyles")), UNO_QUERY); if (xViewStyleList.is()) { - ::std::vector<rtl::OUString> aProperties (4); - aProperties[0] = OUString::createFromAscii("StyleName"); - aProperties[1] = OUString::createFromAscii("ParentStyle"); - aProperties[2] = OUString::createFromAscii("Font"); - aProperties[3] = OUString::createFromAscii("Background"); PresenterConfigurationAccess::ForAll( xViewStyleList, - aProperties, ::boost::bind(&ViewStyleContainer::ProcessViewStyle, - this, ::boost::ref(rReadContext), _1, _2)); + this, ::boost::ref(rReadContext), _2)); } } @@ -1119,25 +1200,49 @@ void ViewStyleContainer::Read ( void ViewStyleContainer::ProcessViewStyle( ReadContext& rReadContext, - const OUString& rsKey, - const ::std::vector<Any>& rValues) + const Reference<beans::XPropertySet>& rxProperties) { - (void)rsKey; - - if (rValues.size() != 4) - return; - ::boost::shared_ptr<ViewStyle> pStyle (new ViewStyle()); - rValues[0] >>= pStyle->msStyleName; + PresenterConfigurationAccess::GetProperty(rxProperties, A2S("StyleName")) + >>= pStyle->msStyleName; - const OUString sPathToFont; // empty string - Reference<container::XHierarchicalNameAccess> xFontNode (rValues[2], UNO_QUERY); - pStyle->mpFont = rReadContext.ReadFont(xFontNode, sPathToFont); + 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; + } + } - Reference<container::XHierarchicalNameAccess> xBackgroundNode (rValues[3], UNO_QUERY); - pStyle->mpBackground = rReadContext.ReadSingleBitmap( - A2S("Background"), xBackgroundNode, A2S("")); + const OUString sPathToFont; // empty string + Reference<container::XHierarchicalNameAccess> 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<container::XHierarchicalNameAccess> 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); } @@ -1145,23 +1250,23 @@ void ViewStyleContainer::ProcessViewStyle( -void ViewStyleContainer::AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +SharedViewStyle ViewStyleContainer::GetViewStyle (const OUString& rsStyleName) const { - for (const_iterator iStyle=begin(); iStyle!=end(); ++iStyle) - (*iStyle)->AddProperties( - rsPropertyPrefix+(*iStyle)->msStyleName+A2S("_"), - rpPropertyMap); + const_iterator iEnd (end()); + for (const_iterator iStyle=begin(); iStyle!=iEnd; ++iStyle) + if ((*iStyle)->msStyleName == rsStyleName) + return *iStyle; + return SharedViewStyle(); } -//===== PaneStyle ============================================================= +//===== ViewStyle ============================================================= ViewStyle::ViewStyle (void) : msStyleName(), + mpParentStyle(), mpFont(), mpBackground() { @@ -1177,16 +1282,25 @@ ViewStyle::~ViewStyle (void) -void ViewStyle::AddProperties( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +const SharedBitmapDescriptor ViewStyle::GetBitmap (const OUString& rsBitmapName) const +{ + if (rsBitmapName == A2S("Background")) + return mpBackground; + else + return SharedBitmapDescriptor(); +} + + + + +PresenterTheme::SharedFontDescriptor ViewStyle::GetFont (void) const { - if (mpParentStyle.get() != NULL) - mpParentStyle->AddProperties(rsPropertyPrefix, rpPropertyMap); if (mpFont.get() != NULL) - mpFont->AddProperties(rsPropertyPrefix+A2S("Font_"), rpPropertyMap); - if (mpBackground.get() != NULL) - mpBackground->AddProperties(rsPropertyPrefix+A2S("Background_"), rpPropertyMap); + return mpFont; + else if (mpParentStyle.get() != NULL) + return mpParentStyle->GetFont(); + else + return PresenterTheme::SharedFontDescriptor(); } @@ -1201,13 +1315,13 @@ void StyleAssociationContainer::Read ( Reference<container::XNameAccess> xStyleAssociationList ( PresenterConfigurationAccess::GetConfigurationNode( rxThemeRoot, - OUString::createFromAscii("StyleAssociations")), + A2S("StyleAssociations")), UNO_QUERY); if (xStyleAssociationList.is()) { ::std::vector<rtl::OUString> aProperties (2); - aProperties[0] = OUString::createFromAscii("ResourceURL"); - aProperties[1] = OUString::createFromAscii("StyleName"); + aProperties[0] = A2S("ResourceURL"); + aProperties[1] = A2S("StyleName"); PresenterConfigurationAccess::ForAll( xStyleAssociationList, aProperties, @@ -1219,15 +1333,13 @@ void StyleAssociationContainer::Read ( -void StyleAssociationContainer::AddProperties ( - const OUString& rsPropertyPrefix, - const ::boost::shared_ptr<PresenterTheme::PropertyMap>& rpPropertyMap) +OUString StyleAssociationContainer::GetStyleName (const OUString& rsResourceName) const { - (void)rsPropertyPrefix; - for (const_iterator iAssociation=begin(); iAssociation!=end(); ++iAssociation) - rpPropertyMap->Set( - iAssociation->msResourceURL, - Any(iAssociation->msStyleName)); + StyleAssociations::const_iterator iAssociation (maStyleAssociations.find(rsResourceName)); + if (iAssociation != maStyleAssociations.end()) + return iAssociation->second; + else + return OUString(); } @@ -1249,33 +1361,13 @@ void StyleAssociationContainer::ProcessStyleAssociation( if ((rValues[0] >>= sResourceURL) && (rValues[1] >>= sStyleName)) { - push_back(StyleAssociation(sResourceURL, sStyleName)); + maStyleAssociations[sResourceURL] = sStyleName; } } -//===== StyleAssociation ====================================================== - -StyleAssociation::StyleAssociation ( - const OUString& rsResourceURL, - const OUString& rsStyleName) - : msResourceURL(rsResourceURL), - msStyleName(rsStyleName) -{ -} - - - - -StyleAssociation::~StyleAssociation (void) -{ -} - - - - } // end of anonymous namespace } } // end of namespace ::sdext::presenter |