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 3cdfcd4e2f350273ab1861abf6d6b7177fd0f215
Author:     Gökay Şatır <[email protected]>
AuthorDate: Mon Feb 20 11:17:55 2023 +0300
Commit:     Miklos Vajna <[email protected]>
CommitDate: Thu Mar 16 07:15:49 2023 +0000

    Preload the accelerator configurations when libreofficekit is active.
    
    Signed-off-by: Gökay Şatır <[email protected]>
    Change-Id: I6fbc2e87b1e338b84c69b96768df0339f1a0abd0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147311
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Miklos Vajna <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148679
    Tested-by: Miklos Vajna <[email protected]>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 07bb6be18fa0..480fc9952e6a 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -213,6 +213,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;
@@ -7180,6 +7184,47 @@ static void lo_status_indicator_callback(void *data, 
comphelper::LibreOfficeKit:
     }
 }
 
+/// 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()
 {
@@ -7243,6 +7288,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 d07e80071bd7..184f899880f7 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
 {
@@ -51,6 +52,8 @@ namespace com::sun::star::ui { struct 
ContextChangeEventObject; };
 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 2954f6006b69..bc33ad942382 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -24,7 +24,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