From 6948c546fdc00dddec7d58e03150dcc87921d6b2 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Mon, 26 Oct 2015 17:55:14 +0100 Subject: 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 --- include/vcl/implimagetree.hxx | 121 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 include/vcl/implimagetree.hxx (limited to 'include') diff --git a/include/vcl/implimagetree.hxx b/include/vcl/implimagetree.hxx new file mode 100644 index 000000000000..ffab4a827f7d --- /dev/null +++ b/include/vcl/implimagetree.hxx @@ -0,0 +1,121 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_INCLUDE_VCL_IMPLIMAGETREE_HXX +#define INCLUDED_INCLUDE_VCL_IMPLIMAGETREE_HXX + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace com { namespace sun { namespace star { namespace container { + class XNameAccess; +} } } } + +class ImplImageTree { +public: + VCL_DLLPUBLIC static ImplImageTree & get(); + + ImplImageTree(); + + ~ImplImageTree(); + + VCL_DLLPUBLIC OUString getImageUrl( + OUString const & name, OUString const & style, OUString const & lang); + + bool loadImage( + OUString const & name, OUString const & style, + BitmapEx & bitmap, bool localized = false, bool loadMissing = false ); + + bool loadDefaultImage( + OUString const & style, + BitmapEx& bitmap); + + /** a crude form of life cycle control (called from DeInitVCL; otherwise, + * if the ImplImageTree singleton were destroyed during exit that would + * be too late for the destructors of the bitmaps in maIconCache)*/ + void shutDown(); + + css::uno::Reference< css::container::XNameAccess > getNameAccess(); + +private: + ImplImageTree(const ImplImageTree&) = delete; + ImplImageTree& operator=(const ImplImageTree&) = delete; + + typedef std::unordered_map, OUStringHash> IconCache; + typedef std::unordered_map IconLinkHash; + + struct IconSet { + OUString maURL; + css::uno::Reference maNameAccess; + IconCache maIconCache; + IconLinkHash maLinkHash; + + IconSet() {} + IconSet(const OUString &aURL) : maURL(aURL) {} + }; + + /// Map between the theme name(s) and the content. + typedef std::unordered_map StyleIconSet; + + /// Remember all the (used) icon styles and individual icons in them. + StyleIconSet maIconSet; + + /// Style used for the current operations; switches switch several times during fallback search. + OUString maCurrentStyle; + + bool doLoadImage( + OUString const & name, OUString const & style, + BitmapEx & bitmap, bool localized); + + bool checkPathAccess(); + + void setStyle(OUString const & style ); + + void createStyle(); + + bool iconCacheLookup( OUString const & name, bool localized, BitmapEx & bitmap ); + + bool findImage(std::vector< OUString > const & paths, BitmapEx & bitmap ); + + void loadImageLinks(); + + void parseLinkFile(std::shared_ptr stream); + + /// Return name of a real .png according to links.txt. + OUString const & getRealImageName(OUString const & name); + + /** Return name of the fallback style for the provided one. + + Must not be cyclic :-) The last theme in the chain returns an empty string. + */ + static OUString fallbackStyle(const OUString &style); +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit