summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2015-10-26 17:55:14 +0100
committerStephan Bergmann <sbergman@redhat.com>2015-10-26 17:55:14 +0100
commit6948c546fdc00dddec7d58e03150dcc87921d6b2 (patch)
treecb0afa155279289cb8853f02bfbca97415f6aad4 /vcl/source
parentf5174c89cd037d35b975590083cf91b36633808d (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.cxx2
-rw-r--r--vcl/source/app/svmain.cxx4
-rw-r--r--vcl/source/control/fixed.cxx6
-rw-r--r--vcl/source/gdi/bitmapex.cxx6
-rw-r--r--vcl/source/gdi/image.cxx6
-rw-r--r--vcl/source/gdi/imagerepository.cxx8
-rw-r--r--vcl/source/gdi/impimagetree.cxx71
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();
}