diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2015-10-26 17:55:14 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2015-10-26 17:55:14 +0100 |
commit | 6948c546fdc00dddec7d58e03150dcc87921d6b2 (patch) | |
tree | cb0afa155279289cb8853f02bfbca97415f6aad4 /vcl/source | |
parent | f5174c89cd037d35b975590083cf91b36633808d (diff) |
tdf#75637: Resolve help images via a vnd.libreoffice.image UCP
...which uses the logic already available in VCL's ImplImageTree to locate the
image zip files and find fallbacks for incomplete themes and for localized
images.
Change-Id: Ic1c15fcacb6596a27a2b051093232902202bf472
Diffstat (limited to 'vcl/source')
-rw-r--r-- | vcl/source/app/settings.cxx | 2 | ||||
-rw-r--r-- | vcl/source/app/svmain.cxx | 4 | ||||
-rw-r--r-- | vcl/source/control/fixed.cxx | 6 | ||||
-rw-r--r-- | vcl/source/gdi/bitmapex.cxx | 6 | ||||
-rw-r--r-- | vcl/source/gdi/image.cxx | 6 | ||||
-rw-r--r-- | vcl/source/gdi/imagerepository.cxx | 8 | ||||
-rw-r--r-- | vcl/source/gdi/impimagetree.cxx | 71 |
7 files changed, 80 insertions, 23 deletions
diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx index a8fb56a9633d..2fd759794732 100644 --- a/vcl/source/app/settings.cxx +++ b/vcl/source/app/settings.cxx @@ -42,6 +42,7 @@ #include <vcl/event.hxx> #include <vcl/settings.hxx> #include <vcl/i18nhelp.hxx> +#include <vcl/implimagetree.hxx> #include <vcl/configsettings.hxx> #include <vcl/gradient.hxx> #include <vcl/outdev.hxx> @@ -56,7 +57,6 @@ using namespace ::com::sun::star; #include "svdata.hxx" -#include "impimagetree.hxx" struct ImplMouseData { diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index d2fe69a171ee..684546f430e0 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -35,6 +35,7 @@ #include "vcl/cvtgrf.hxx" #include "vcl/scheduler.hxx" #include "vcl/image.hxx" +#include "vcl/implimagetree.hxx" #include "vcl/settings.hxx" #include "vcl/unowrap.hxx" #include "vcl/configsettings.hxx" @@ -68,7 +69,6 @@ #include "salsys.hxx" #include "saltimer.hxx" #include "salimestatus.hxx" -#include "impimagetree.hxx" #include "xconnection.hxx" #include "vcl/opengl/OpenGLContext.hxx" @@ -368,7 +368,7 @@ void DeInitVCL() DBG_ASSERT( nBadTopWindows==0, aBuf.getStr() ); #endif - ImplImageTreeSingletonRef()->shutDown(); + ImplImageTree::get().shutDown(); osl_removeSignalHandler( pExceptionHandler); pExceptionHandler = NULL; diff --git a/vcl/source/control/fixed.cxx b/vcl/source/control/fixed.cxx index 990f1a6cf2d3..9502c08e97fc 100644 --- a/vcl/source/control/fixed.cxx +++ b/vcl/source/control/fixed.cxx @@ -23,12 +23,12 @@ #include "vcl/dialog.hxx" #include "vcl/event.hxx" #include "vcl/fixed.hxx" +#include "vcl/implimagetree.hxx" #include "vcl/svapp.hxx" #include "vcl/settings.hxx" #include <comphelper/string.hxx> #include "controldata.hxx" -#include "impimagetree.hxx" #include "window.h" #define FIXEDLINE_TEXT_BORDER 4 @@ -1035,12 +1035,12 @@ bool FixedImage::SetModeImage( const Image& rImage ) Image FixedImage::loadThemeImage(const OString &rFileName) { - static ImplImageTreeSingletonRef aImageTree; OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); const OUString sFileName(OStringToOUString(rFileName, RTL_TEXTENCODING_UTF8)); BitmapEx aBitmap; - bool bSuccess = aImageTree->loadImage(sFileName, sIconTheme, aBitmap, true); + bool bSuccess = ImplImageTree::get().loadImage( + sFileName, sIconTheme, aBitmap, true); SAL_WARN_IF(!bSuccess, "vcl.layout", "Unable to load " << sFileName << " from theme " << sIconTheme); return Image(aBitmap); diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx index 804e64616757..8fa1211498c5 100644 --- a/vcl/source/gdi/bitmapex.cxx +++ b/vcl/source/gdi/bitmapex.cxx @@ -24,6 +24,7 @@ #include <tools/stream.hxx> #include <tools/debug.hxx> #include <tools/rc.h> +#include <vcl/implimagetree.hxx> #include <vcl/salbtype.hxx> #include <vcl/outdev.hxx> #include <vcl/alpha.hxx> @@ -36,7 +37,6 @@ #include <vcl/settings.hxx> #include <image.h> -#include <impimagetree.hxx> #include <basegfx/matrix/b2dhommatrixtools.hxx> // BitmapEx::Create @@ -107,11 +107,9 @@ BitmapEx::BitmapEx( const ResId& rResId ) : void BitmapEx::loadFromIconTheme( const OUString& rIconName ) { - static ImplImageTreeSingletonRef aImageTree; - OUString aIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); - if( !aImageTree->loadImage( rIconName, aIconTheme, *this, true ) ) + if( !ImplImageTree::get().loadImage( rIconName, aIconTheme, *this, true ) ) { #ifdef DBG_UTIL OStringBuffer aErrorStr( diff --git a/vcl/source/gdi/image.cxx b/vcl/source/gdi/image.cxx index adfec173cfd5..f6e70cf78799 100644 --- a/vcl/source/gdi/image.cxx +++ b/vcl/source/gdi/image.cxx @@ -30,7 +30,7 @@ #include <vcl/svapp.hxx> #include <vcl/image.hxx> #include <vcl/imagerepository.hxx> -#include <impimagetree.hxx> +#include <vcl/implimagetree.hxx> #include <image.h> #if OSL_DEBUG_LEVEL > 0 @@ -370,8 +370,6 @@ void ImageList::ImplInit( sal_uInt16 nItems, const Size &rSize ) void ImageAryData::Load(const OUString &rPrefix) { - static ImplImageTreeSingletonRef aImageTree; - OUString aIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); OUString aFileName = rPrefix; @@ -379,7 +377,7 @@ void ImageAryData::Load(const OUString &rPrefix) #if OSL_DEBUG_LEVEL > 0 bool bSuccess = #endif - aImageTree->loadImage( aFileName, aIconTheme, maBitmapEx, true ); + ImplImageTree::get().loadImage(aFileName, aIconTheme, maBitmapEx, true); #if OSL_DEBUG_LEVEL > 0 if ( !bSuccess ) { diff --git a/vcl/source/gdi/imagerepository.cxx b/vcl/source/gdi/imagerepository.cxx index 66398d972328..dadc622cdcce 100644 --- a/vcl/source/gdi/imagerepository.cxx +++ b/vcl/source/gdi/imagerepository.cxx @@ -19,9 +19,9 @@ #include <vcl/bitmapex.hxx> #include <vcl/imagerepository.hxx> +#include <vcl/implimagetree.hxx> #include <vcl/settings.hxx> #include <vcl/svapp.hxx> -#include "impimagetree.hxx" namespace vcl { @@ -29,15 +29,13 @@ namespace vcl { OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); - ImplImageTreeSingletonRef aImplImageTree; - return aImplImageTree->loadImage( _rName, sIconTheme, _out_rImage, _bSearchLanguageDependent, loadMissing ); + return ImplImageTree::get().loadImage( _rName, sIconTheme, _out_rImage, _bSearchLanguageDependent, loadMissing ); } bool ImageRepository::loadDefaultImage( BitmapEx& _out_rImage) { OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); - ImplImageTreeSingletonRef aImplImageTree; - return aImplImageTree->loadDefaultImage( sIconTheme,_out_rImage); + return ImplImageTree::get().loadDefaultImage( sIconTheme,_out_rImage); } } // namespace vcl diff --git a/vcl/source/gdi/impimagetree.cxx b/vcl/source/gdi/impimagetree.cxx index 38cfefdb14fe..9bec5dcfe83f 100644 --- a/vcl/source/gdi/impimagetree.cxx +++ b/vcl/source/gdi/impimagetree.cxx @@ -34,15 +34,16 @@ #include "osl/file.hxx" #include "osl/diagnose.h" #include "rtl/bootstrap.hxx" +#include "rtl/uri.hxx" #include "tools/stream.hxx" #include "tools/urlobj.hxx" #include "vcl/bitmapex.hxx" #include <vcl/dibtools.hxx> +#include <vcl/implimagetree.hxx> #include "vcl/pngread.hxx" #include "vcl/settings.hxx" #include "vcl/svapp.hxx" -#include "impimagetree.hxx" #include <vcldemo-debug.hxx> #include <vcl/BitmapProcessor.hxx> @@ -93,6 +94,11 @@ static void loadImageFromStream(std::shared_ptr<SvStream> xStream, OUString cons } +ImplImageTree & ImplImageTree::get() { + static ImplImageTree instance; + return instance; +} + ImplImageTree::ImplImageTree() { } @@ -101,6 +107,65 @@ ImplImageTree::~ImplImageTree() { } +OUString ImplImageTree::getImageUrl( + OUString const & name, OUString const & style, OUString const & lang) +{ + OUString aStyle(style); + while (!aStyle.isEmpty()) + { + try { + setStyle(aStyle); + + std::vector< OUString > paths; + paths.push_back(getRealImageName(name)); + + if (!lang.isEmpty()) + { + sal_Int32 pos = name.lastIndexOf('/'); + if (pos != -1) + { + std::vector<OUString> aFallbacks( + LanguageTag(lang).getFallbackStrings(true)); + for (std::vector< OUString >::reverse_iterator it( aFallbacks.rbegin()); + it != aFallbacks.rend(); ++it) + { + paths.push_back( getRealImageName( createPath(name, pos, *it) ) ); + } + } + } + + try { + if (checkPathAccess()) { + const uno::Reference<container::XNameAccess> &rNameAccess = maIconSet[maCurrentStyle].maNameAccess; + + for (std::vector<OUString>::const_reverse_iterator j(paths.rbegin()); j != paths.rend(); ++j) + { + if (rNameAccess->hasByName(*j)) + { + return "vnd.sun.star.zip://" + + rtl::Uri::encode( + maIconSet[maCurrentStyle].maURL + ".zip", + rtl_UriCharClassRegName, + rtl_UriEncodeIgnoreEscapes, + RTL_TEXTENCODING_UTF8) + + "/" + *j; + // assuming *j contains no problematic chars + } + } + } + } catch (css::uno::RuntimeException &) { + throw; + } catch (const css::uno::Exception & e) { + SAL_INFO("vcl", "exception " << e.Message); + } + } + catch (css::uno::RuntimeException &) {} + + aStyle = fallbackStyle(aStyle); + } + return OUString(); +} + OUString ImplImageTree::fallbackStyle(const OUString &style) { if (style == "galaxy") @@ -361,9 +426,7 @@ css::uno::Reference<css::container::XNameAccess> ImplImageTree::getNameAccess() /// Recursively dump all names ... css::uno::Sequence<OUString> ImageTree_getAllImageNames() { - static ImplImageTreeSingletonRef aImageTree; - - css::uno::Reference<css::container::XNameAccess> xRef(aImageTree->getNameAccess()); + css::uno::Reference<css::container::XNameAccess> xRef(ImplImageTree::get().getNameAccess()); return xRef->getElementNames(); } |