summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2017-10-12 14:48:56 +0100
committerCaolán McNamara <caolanm@redhat.com>2017-10-13 09:30:02 +0200
commitd4e5e20a29402a305da533357fe538beb45afb96 (patch)
treeda596410ea9fc9a2d103f86efdf47fa10d5c439a
parenteed5c5ab3aac37750b19cdab7f339a22b98f9f8e (diff)
tdf#110742 add support for icon themes via extension manager
Change-Id: Ic33c086ef67cdcb634d9f03f84799c234fe3beec Reviewed-on: https://gerrit.libreoffice.org/43341 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--include/unotools/pathoptions.hxx2
-rw-r--r--include/vcl/IconThemeScanner.hxx6
-rw-r--r--officecfg/registry/data/org/openoffice/Office/Paths.xcu5
-rw-r--r--unotools/source/config/pathoptions.cxx11
-rw-r--r--vcl/source/app/IconThemeScanner.cxx56
-rw-r--r--vcl/source/app/settings.cxx13
-rw-r--r--vcl/source/image/ImplImageTree.cxx43
7 files changed, 90 insertions, 46 deletions
diff --git a/include/unotools/pathoptions.hxx b/include/unotools/pathoptions.hxx
index 37e172632298..2334e0b56852 100644
--- a/include/unotools/pathoptions.hxx
+++ b/include/unotools/pathoptions.hxx
@@ -52,6 +52,7 @@ public:
PATH_GALLERY,
PATH_GRAPHIC,
PATH_HELP,
+ PATH_ICONSET,
PATH_LINGUISTIC,
PATH_MODULE,
PATH_PALETTE,
@@ -86,6 +87,7 @@ public:
const OUString& GetHelpPath() const;
const OUString& GetLinguisticPath() const;
const OUString& GetModulePath() const;
+ const OUString& GetIconsetPath() const;
const OUString& GetPalettePath() const;
const OUString& GetPluginPath() const;
const OUString& GetStoragePath() const;
diff --git a/include/vcl/IconThemeScanner.hxx b/include/vcl/IconThemeScanner.hxx
index 028173e9de59..7bb6f46e6cda 100644
--- a/include/vcl/IconThemeScanner.hxx
+++ b/include/vcl/IconThemeScanner.hxx
@@ -14,6 +14,7 @@
#include <tools/solar.h>
#include <rtl/ustring.hxx>
+#include <vcl/IconThemeInfo.hxx>
#include <memory>
#include <vector>
@@ -27,7 +28,6 @@ class DirectoryItem;
}
namespace vcl {
-class IconThemeInfo;
/** This class scans a folder for icon themes and provides the results.
*/
@@ -67,13 +67,11 @@ private:
/** Scan a directory for icon themes.
*
* @return
- * This method will return true on success.
* There are several cases when this method will fail:
* - The directory does not exist
* - There are no files which which match the pattern images_xxx.zip
*/
- bool
- ScanDirectoryForIconThemes(const OUString &path);
+ void ScanDirectoryForIconThemes(const OUString &path);
/** Adds the provided icon theme by path.
*/
diff --git a/officecfg/registry/data/org/openoffice/Office/Paths.xcu b/officecfg/registry/data/org/openoffice/Office/Paths.xcu
index 55db320e8b15..d52e619d0445 100644
--- a/officecfg/registry/data/org/openoffice/Office/Paths.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/Paths.xcu
@@ -118,6 +118,11 @@
<value>$(userurl)/wordbook</value>
</prop>
</node>
+ <node oor:name="Iconset" oor:op="fuse" oor:mandatory="true">
+ <node oor:name="InternalPaths">
+ <node oor:name="$(insturl)/@LIBO_SHARE_FOLDER@/config" oor:op="fuse"/>
+ </node>
+ </node>
<node oor:name="Module" oor:op="fuse" oor:mandatory="true">
<node oor:name="InternalPaths">
<node oor:name="$(progpath)" oor:op="fuse"/>
diff --git a/unotools/source/config/pathoptions.cxx b/unotools/source/config/pathoptions.cxx
index 998ff53d0072..634fa2639015 100644
--- a/unotools/source/config/pathoptions.cxx
+++ b/unotools/source/config/pathoptions.cxx
@@ -111,6 +111,7 @@ class SvtPathOptions_Impl
const OUString& GetLinguisticPath() { return GetPath( SvtPathOptions::PATH_LINGUISTIC ); }
const OUString& GetModulePath() { return GetPath( SvtPathOptions::PATH_MODULE ); }
const OUString& GetPalettePath() { return GetPath( SvtPathOptions::PATH_PALETTE ); }
+ const OUString& GetIconsetPath() { return GetPath( SvtPathOptions::PATH_ICONSET); }
const OUString& GetPluginPath() { return GetPath( SvtPathOptions::PATH_PLUGIN ); }
const OUString& GetStoragePath() { return GetPath( SvtPathOptions::PATH_STORAGE ); }
const OUString& GetTempPath() { return GetPath( SvtPathOptions::PATH_TEMP ); }
@@ -182,6 +183,7 @@ static const PropertyStruct aPropNames[] =
{ "Gallery", SvtPathOptions::PATH_GALLERY },
{ "Graphic", SvtPathOptions::PATH_GRAPHIC },
{ "Help", SvtPathOptions::PATH_HELP },
+ { "Iconset", SvtPathOptions::PATH_ICONSET },
{ "Linguistic", SvtPathOptions::PATH_LINGUISTIC },
{ "Module", SvtPathOptions::PATH_MODULE },
{ "Palette", SvtPathOptions::PATH_PALETTE },
@@ -234,7 +236,8 @@ const OUString& SvtPathOptions_Impl::GetPath( SvtPathOptions::Paths ePath )
osl::FileBase::getSystemPathFromFileURL( aPathValue, aResult );
aPathValue = aResult;
}
- else if (ePath == SvtPathOptions::PATH_PALETTE)
+ else if (ePath == SvtPathOptions::PATH_PALETTE ||
+ ePath == SvtPathOptions::PATH_ICONSET)
{
auto ctx = comphelper::getProcessComponentContext();
OUStringBuffer buf;
@@ -545,6 +548,11 @@ const OUString& SvtPathOptions::GetPalettePath() const
return pImpl->GetPalettePath();
}
+const OUString& SvtPathOptions::GetIconsetPath() const
+{
+ return pImpl->GetIconsetPath();
+}
+
const OUString& SvtPathOptions::GetPluginPath() const
{
return pImpl->GetPluginPath();
@@ -767,6 +775,7 @@ bool SvtPathOptions::SearchFile( OUString& rIniFile, Paths ePath )
case PATH_LINGUISTIC: aPath = GetLinguisticPath(); break;
case PATH_MODULE: aPath = GetModulePath(); break;
case PATH_PALETTE: aPath = GetPalettePath(); break;
+ case PATH_ICONSET: aPath = GetIconsetPath(); break;
case PATH_PLUGIN: aPath = GetPluginPath(); break;
case PATH_STORAGE: aPath = GetStoragePath(); break;
case PATH_TEMP: aPath = GetTempPath(); break;
diff --git a/vcl/source/app/IconThemeScanner.cxx b/vcl/source/app/IconThemeScanner.cxx
index 4d45a915d012..d8a81218c5ec 100644
--- a/vcl/source/app/IconThemeScanner.cxx
+++ b/vcl/source/app/IconThemeScanner.cxx
@@ -13,7 +13,7 @@
#include <osl/file.hxx>
#include <rtl/bootstrap.hxx>
#include <salhelper/linkhelper.hxx>
-
+#include <unotools/pathoptions.hxx>
#include <vcl/svapp.hxx>
#include <vcl/IconThemeInfo.hxx>
@@ -57,31 +57,42 @@ OUString convert_to_absolute_path(const OUString& path)
IconThemeScanner::IconThemeScanner()
{}
-bool
-IconThemeScanner::ScanDirectoryForIconThemes(const OUString& path)
+void IconThemeScanner::ScanDirectoryForIconThemes(const OUString& paths)
{
- osl::FileStatus fileStatus(osl_FileStatus_Mask_Type);
- bool couldSetFileStatus = set_file_status(fileStatus, path);
- if (!couldSetFileStatus) {
- return false;
- }
+ mFoundIconThemes.clear();
- if (!fileStatus.isDirectory()) {
- SAL_INFO("vcl.app", "Cannot search for icon themes in '"<< path << "'. It is not a directory.");
- return false;
- }
+ std::deque<OUString> aPaths;
- std::vector<OUString> iconThemePaths = ReadIconThemesFromPath(path);
- if (iconThemePaths.empty()) {
- SAL_WARN("vcl.app", "Could not find any icon themes in the provided directory ('" <<path<<"'.");
- return false;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ aPaths.push_front(paths.getToken(0, ';', nIndex));
}
- mFoundIconThemes.clear();
- for (std::vector<OUString>::iterator aI = iconThemePaths.begin(); aI != iconThemePaths.end(); ++aI)
+ while (nIndex >= 0);
+
+ for (const auto& path : aPaths)
{
- AddIconThemeByPath(*aI);
+ osl::FileStatus fileStatus(osl_FileStatus_Mask_Type);
+ bool couldSetFileStatus = set_file_status(fileStatus, path);
+ if (!couldSetFileStatus) {
+ continue;
+ }
+
+ if (!fileStatus.isDirectory()) {
+ SAL_INFO("vcl.app", "Cannot search for icon themes in '"<< path << "'. It is not a directory.");
+ continue;
+ }
+
+ std::vector<OUString> iconThemePaths = ReadIconThemesFromPath(path);
+ if (iconThemePaths.empty()) {
+ SAL_WARN("vcl.app", "Could not find any icon themes in the provided directory ('" <<path<<"'.");
+ continue;
+ }
+ for (std::vector<OUString>::iterator aI = iconThemePaths.begin(); aI != iconThemePaths.end(); ++aI)
+ {
+ AddIconThemeByPath(*aI);
+ }
}
- return true;
}
bool
@@ -165,9 +176,8 @@ IconThemeScanner::Create(const OUString &path)
/*static*/ OUString
IconThemeScanner::GetStandardIconThemePath()
{
- OUString url( "$BRAND_BASE_DIR/" LIBO_SHARE_FOLDER "/config/" );
- rtl::Bootstrap::expandMacros(url);
- return url;
+ SvtPathOptions aPathOptions;
+ return aPathOptions.GetIconsetPath();
}
IconThemeScanner::~IconThemeScanner()
diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx
index 54d03cc0ae6a..75987898f814 100644
--- a/vcl/source/app/settings.cxx
+++ b/vcl/source/app/settings.cxx
@@ -520,7 +520,6 @@ bool MouseSettings::operator ==( const MouseSettings& rSet ) const
}
ImplStyleData::ImplStyleData() :
- mIconThemeScanner(vcl::IconThemeScanner::Create(vcl::IconThemeScanner::GetStandardIconThemePath())),
mIconThemeSelector(new vcl::IconThemeSelector()),
maPersonaHeaderFooter(),
maPersonaHeaderBitmap(),
@@ -658,7 +657,8 @@ ImplStyleData::ImplStyleData( const ImplStyleData& rData ) :
meContextMenuShortcuts = rData.meContextMenuShortcuts;
mbPrimaryButtonWarpsSlider = rData.mbPrimaryButtonWarpsSlider;
mnToolbarIconSize = rData.mnToolbarIconSize;
- mIconThemeScanner.reset(new vcl::IconThemeScanner(*rData.mIconThemeScanner));
+ if (rData.mIconThemeScanner)
+ mIconThemeScanner.reset(new vcl::IconThemeScanner(*rData.mIconThemeScanner));
mIconThemeSelector.reset(new vcl::IconThemeSelector(*rData.mIconThemeSelector));
mnEdgeBlending = rData.mnEdgeBlending;
maEdgeBlendingTopLeftColor = rData.maEdgeBlendingTopLeftColor;
@@ -2971,6 +2971,9 @@ StyleSettings::GetOptions() const
std::vector<vcl::IconThemeInfo>
StyleSettings::GetInstalledIconThemes() const
{
+ if (!mxData->mIconThemeScanner) {
+ const_cast<StyleSettings*>(this)->mxData->mIconThemeScanner = vcl::IconThemeScanner::Create(vcl::IconThemeScanner::GetStandardIconThemePath());
+ }
return mxData->mIconThemeScanner->GetFoundIconThemes();
}
@@ -2978,6 +2981,9 @@ StyleSettings::GetInstalledIconThemes() const
StyleSettings::GetAutomaticallyChosenIconTheme() const
{
OUString desktopEnvironment = Application::GetDesktopEnvironment();
+ if (!mxData->mIconThemeScanner) {
+ const_cast<StyleSettings*>(this)->mxData->mIconThemeScanner = vcl::IconThemeScanner::Create(vcl::IconThemeScanner::GetStandardIconThemePath());
+ }
OUString themeName = mxData->mIconThemeSelector->SelectIconThemeForDesktopEnvironment(
mxData->mIconThemeScanner->GetFoundIconThemes(),
desktopEnvironment
@@ -3014,6 +3020,9 @@ StyleSettings::DetermineIconTheme() const
}
}
+ if (!mxData->mIconThemeScanner) {
+ const_cast<StyleSettings*>(this)->mxData->mIconThemeScanner = vcl::IconThemeScanner::Create(vcl::IconThemeScanner::GetStandardIconThemePath());
+ }
OUString r = mxData->mIconThemeSelector->SelectIconTheme(
mxData->mIconThemeScanner->GetFoundIconThemes(),
sTheme);
diff --git a/vcl/source/image/ImplImageTree.cxx b/vcl/source/image/ImplImageTree.cxx
index 8b874868a32e..64466c4d0e41 100644
--- a/vcl/source/image/ImplImageTree.cxx
+++ b/vcl/source/image/ImplImageTree.cxx
@@ -44,8 +44,8 @@
#include <vcl/pngread.hxx>
#include <vcl/settings.hxx>
#include <vcl/svapp.hxx>
-
#include <vcl/BitmapTools.hxx>
+#include <vcl/IconThemeScanner.hxx>
#include <vcl/pngwrite.hxx>
#include "BitmapProcessor.hxx"
@@ -93,13 +93,6 @@ OUString createPath(OUString const & name, sal_Int32 pos, OUString const & local
return name.copy(0, pos + 1) + locale + name.copy(pos);
}
-OUString getIconThemeFolderUrl()
-{
- OUString sUrl("$BRAND_BASE_DIR/" LIBO_SHARE_FOLDER "/config/");
- rtl::Bootstrap::expandMacros(sUrl);
- return sUrl;
-}
-
OUString getIconCacheUrl(OUString const & sStyle, OUString const & sVariant, OUString const & sName)
{
OUString sUrl("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/cache/");
@@ -401,19 +394,37 @@ void ImplImageTree::createStyle()
if (maCurrentStyle != "default")
{
- INetURLObject aUrl(getIconThemeFolderUrl());
- OSL_ASSERT(!aUrl.HasError());
+ OUString paths = vcl::IconThemeScanner::GetStandardIconThemePath();
+ std::deque<OUString> aPaths;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ aPaths.push_front(paths.getToken(0, ';', nIndex));
+ }
+ while (nIndex >= 0);
- bool ok = aUrl.Append("images_" + maCurrentStyle, INetURLObject::EncodeMechanism::All);
- OSL_ASSERT(ok);
- sThemeUrl = aUrl.GetMainURL(INetURLObject::DecodeMechanism::NONE) + ".zip";
+ for (const auto& path : aPaths)
+ {
+ INetURLObject aUrl(path);
+ OSL_ASSERT(!aUrl.HasError());
+
+ bool ok = aUrl.Append("images_" + maCurrentStyle, INetURLObject::EncodeMechanism::All);
+ OSL_ASSERT(ok);
+ sThemeUrl = aUrl.GetMainURL(INetURLObject::DecodeMechanism::NONE) + ".zip";
+ if (urlExists(sThemeUrl))
+ break;
+ sThemeUrl.clear();
+ }
+ if (sThemeUrl.isEmpty())
+ return;
}
else
+ {
sThemeUrl += "images";
-
- if (!urlExists(sThemeUrl))
- return;
+ if (!urlExists(sThemeUrl))
+ return;
+ }
maIconSets[maCurrentStyle] = IconSet(sThemeUrl);