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();

Reply via email to