desktop/source/lib/init.cxx | 48 +++++++++++++++++++++++++++++++++++++++++ include/sfx2/lokhelper.hxx | 3 ++ sfx2/source/view/lokhelper.cxx | 6 ++++- 3 files changed, 56 insertions(+), 1 deletion(-)
New commits: commit 8b1e20c164e11689894ca605735541fad9aea3b1 Author: Gökay Şatır <gokaysa...@collabora.com> AuthorDate: Mon Feb 20 11:17:55 2023 +0300 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Thu Feb 23 11:52:48 2023 +0000 Preload the accelerator configurations when libreofficekit is active. Signed-off-by: Gökay Şatır <gokaysa...@collabora.com> Change-Id: I6fbc2e87b1e338b84c69b96768df0339f1a0abd0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147311 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index ab8bc71d4780..b00497df127e 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -210,6 +210,10 @@ #include <unotools/viewoptions.hxx> #include <vcl/settings.hxx> +#include <officecfg/Setup.hxx> +#include <com/sun/star/ui/XAcceleratorConfiguration.hpp> +#include <svtools/acceleratorexecute.hxx> + using namespace css; using namespace vcl; using namespace desktop; @@ -6886,6 +6890,47 @@ static void lo_status_indicator_callback(void *data, comphelper::LibreOfficeKit: void setLanguageToolConfig(); +/// Used by preloadData (LibreOfficeKit) for providing different shortcuts for different languages. +void preLoadShortCutAccelerators() +{ + std::unordered_map<OUString, css::uno::Reference<com::sun::star::ui::XAcceleratorConfiguration>>& acceleratorConfs = SfxLokHelper::getAcceleratorConfs(); + css::uno::Sequence<OUString> installedLocales(officecfg::Setup::Office::InstalledLocales::get()->getElementNames()); + OUString actualLang = officecfg::Setup::L10N::ooLocale::get(); + + for (sal_Int32 i = 0; i < installedLocales.getLength(); i++) + { + OUString language = LanguageTag(installedLocales[i]).getLocale().Language; + + if (!comphelper::LibreOfficeKit::isAllowlistedLanguage(language)) + { + // Language is listed by COOL and also installed in core. We can create the short cut accelerator. + + // Set the UI language to current one, before creating the accelerator. + std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create()); + officecfg::Setup::L10N::ooLocale::set(installedLocales[i], batch); + batch->commit(); + + // Supported module names: Writer, Calc, Draw, Impress + std::vector<OUString> supportedModuleNames = { "com.sun.star.text.TextDocument", "com.sun.star.sheet.SpreadsheetDocument", "com.sun.star.drawing.DrawingDocument", "com.sun.star.presentation.PresentationDocument" }; + // Create the accelerators. + for (std::size_t j = 0; j < supportedModuleNames.size(); j++) + { + OUString key = supportedModuleNames[j] + installedLocales[i]; + acceleratorConfs[key] = svt::AcceleratorExecute::lok_createNewAcceleratorConfiguration(::comphelper::getProcessComponentContext(), supportedModuleNames[j]); + } + } + else + { + std::cerr << "Language is installed in core but not in the list of COOL languages: " << language << "\n"; + } + } + + // Set the UI language back to default one. + std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create()); + officecfg::Setup::L10N::ooLocale::set(actualLang, batch); + batch->commit(); +} + /// Used only by LibreOfficeKit when used by Online to pre-initialize static void preloadData() { @@ -6952,6 +6997,9 @@ static void preloadData() ImageTree &images = ImageTree::get(); images.getImageUrl("forcefed.png", "style", "FO_oo"); + std::cerr << "Preload short cut accelerators\n"; + preLoadShortCutAccelerators(); + std::cerr << "Preload languages\n"; // force load language singleton diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx index 95eb0a9f9f6f..5b3debd9f7e6 100644 --- a/include/sfx2/lokhelper.hxx +++ b/include/sfx2/lokhelper.hxx @@ -23,6 +23,7 @@ #include <rtl/string.hxx> #include <optional> #include <string_view> +#include <sfx2/app.hxx> struct SFX2_DLLPUBLIC LokMouseEventData { @@ -49,6 +50,8 @@ struct SFX2_DLLPUBLIC LokMouseEventData class SFX2_DLLPUBLIC SfxLokHelper { public: + /// Gets the short cut accelerators. + static std::unordered_map<OUString, css::uno::Reference<com::sun::star::ui::XAcceleratorConfiguration>>& getAcceleratorConfs(); /// Create a new view shell from the current view frame. /// This assumes a single document is ever loaded. static int createView(); diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx index 8bf9d36d0beb..7f0ba8abf930 100644 --- a/sfx2/source/view/lokhelper.cxx +++ b/sfx2/source/view/lokhelper.cxx @@ -23,7 +23,6 @@ #include <vcl/commandevent.hxx> #include <vcl/window.hxx> #include <sal/log.hxx> -#include <sfx2/app.hxx> #include <sfx2/msg.hxx> #include <sfx2/viewsh.hxx> #include <sfx2/request.hxx> @@ -110,6 +109,11 @@ int SfxLokHelper::createView() return createView(pViewShell->GetViewFrame(), pViewShell->GetDocId()); } +std::unordered_map<OUString, css::uno::Reference<com::sun::star::ui::XAcceleratorConfiguration>>& SfxLokHelper::getAcceleratorConfs() +{ + return SfxApplication::GetOrCreate()->GetAcceleratorConfs_Impl(); +} + int SfxLokHelper::createView(int nDocId) { const SfxApplication* pApp = SfxApplication::Get();