[Libreoffice-commits] core.git: Branch 'feature/wasm' - 311 commits - android/default-document basctl/inc basctl/source basctl/uiconfig basic/source bin/list-dispatch-commands.py bin/run bin/ui-rules-enforcer.py chart2/inc chart2/IwyuFilter_chart2.yaml chart2/qa chart2/source chart2/uiconfig codemaker/source comphelper/source config_host/config_box2d.h.in config_host/config_global.h.in config_host.mk.in configure.ac connectivity/Library_firebird_sdbc.mk connectivity/source cppuhelper/source cui/inc cui/source cui/uiconfig dbaccess/source dbaccess/uiconfig desktop/qa desktop/scripts desktop/source desktop/uiconfig download.lst drawinglayer/source editeng/source extensions/Library_WinUserInfoBe.mk extensions/source extensions/uiconfig external/box2d external/curl external/mdds filter/qa filter/source filter/uiconfig helpcompiler/source helpcontent2 i18nlangtag/source i18npool/inc i18npool/Library_localedata_others.mk i18npool/source i18nutil/source idl/inc idl/IwyuFilter_idl.yaml idl/source include /comphelper include/editeng include/framework include/i18nlangtag include/sfx2 include/svtools include/svx include/toolkit include/vcl instsetoo_native/CustomTarget_install.mk io/source javaunohelper/source jurt/source jvmfwk/inc jvmfwk/plugins jvmfwk/source l10ntools/inc l10ntools/IwyuFilter_l10ntools.yaml l10ntools/source libreofficekit/qa lingucomponent/IwyuFilter_lingucomponent.yaml lingucomponent/source linguistic/IwyuFilter_linguistic.yaml linguistic/source lotuswordpro/inc lotuswordpro/source Makefile.in offapi/com offapi/UnoApi_offapi.mk officecfg/registry oovbaapi/ooo oox/CppunitTest_oox_drawingml.mk osx/soffice.xcodeproj readlicense_oo/license reportdesign/source RepositoryExternal.mk Repository.mk sal/cppunittester sal/Library_cppunitmain.mk sal/Module_sal.mk sc/CppunitTest_sc_macros_test.mk sc/inc sc/qa sc/source sc/uiconfig sc/UIConfig_scalc.mk sd/CppunitTest_sd_export_tests-ooxml3.mk sd/inc sd/Library_sd.mk sd/qa sd/source sd/uiconfig setup_native/scripts sfx2/inc sfx2 /Library_sfx.mk sfx2/source sfx2/uiconfig solenv/bin solenv/clang-format solenv/gbuild starmath/CppunitTest_starmath_qa_cppunit.mk starmath/inc starmath/source static/CustomTarget_emscripten_fs_image.mk static/emscripten static/README.wasm.md svl/source svtools/inc svtools/source svtools/uiconfig svx/inc svx/sdi svx/source svx/uiconfig sw/inc sw/qa sw/sdi sw/source sw/uiconfig sysui/desktop toolkit/inc toolkit/source tools/source translations ucbhelper/source ucb/README.md vcl/Executable_minvcl.mk vcl/Executable_mtfdemo.mk vcl/Executable_svdemo.mk vcl/Executable_vcldemo.mk vcl/headless vcl/inc vcl/jsdialog vcl/osx vcl/qa vcl/qt5 vcl/quartz vcl/README.vars.md vcl/skia vcl/source vcl/unx vcl/workben writerfilter/qa writerfilter/source xmlsecurity/inc xmlsecurity/source

Fri, 28 Jan 2022 05:44:33 -0800

Rebased ref, commits from common ancestor:
commit d9b2f82b09d89ea918e6d1555d860426fd153c71
Author:     Jan-Marek Glogowski <glo...@fbihome.de>
AuthorDate: Fri Jan 28 14:40:51 2022 +0100
Commit:     Jan-Marek Glogowski <glo...@fbihome.de>
CommitDate: Fri Jan 28 14:42:23 2022 +0100

    WASM set correct path to unorc
    
    Change-Id: Ided621af284e62961eb47957d74b31871a30a2bf

diff --git a/cppuhelper/source/paths.cxx b/cppuhelper/source/paths.cxx
index 217e2119ad2c..b769fad73389 100644
--- a/cppuhelper/source/paths.cxx
+++ b/cppuhelper/source/paths.cxx
@@ -54,7 +54,7 @@ OUString get_this_libpath() {
 }
 
 OUString cppu::getUnoIniUri() {
-#if defined ANDROID || defined EMSCRIPTEN
+#if defined ANDROID
     // Wouldn't it be lovely to avoid this ugly hard-coding.
     // The problem is that the 'create_bootstrap_macro_expander_factory()'
     // required for bootstrapping services, calls cppu::get_unorc directly
commit 360941e143ef64c9b0c63ed75363b943007bca94
Author:     Jan-Marek Glogowski <glo...@fbihome.de>
AuthorDate: Sun Jan 9 14:49:28 2022 +0100
Commit:     Jan-Marek Glogowski <glo...@fbihome.de>
CommitDate: Fri Jan 28 13:15:22 2022 +0100

    Add a larger Writer example document
    
    Change-Id: I4bc9a82c7f99563af8da62f889b51d1b583df760

diff --git a/android/default-document/example_larger.odt 
b/android/default-document/example_larger.odt
new file mode 100644
index 000000000000..1b3a1dfb877a
Binary files /dev/null and b/android/default-document/example_larger.odt differ
diff --git a/static/CustomTarget_emscripten_fs_image.mk 
b/static/CustomTarget_emscripten_fs_image.mk
index 8166802858e5..8c347de38d5a 100644
--- a/static/CustomTarget_emscripten_fs_image.mk
+++ b/static/CustomTarget_emscripten_fs_image.mk
@@ -1131,6 +1131,7 @@ gb_emscripten_fs_image_files := \
     $(INSTROOT)/$(LIBO_SHARE_RESOURCE_FOLDER)/common/fonts/opens___.ttf \
     $(INSTROOT)/$(LIBO_URE_ETC_FOLDER)/$(call gb_Helper_get_rcfile,uno) \
     $(INSTROOT)/$(LIBO_URE_MISC_FOLDER)/services.rdb \
+    $(SRCDIR)/android/default-document/example_larger.odt \
     $(SRCDIR)/android/default-document/example.odt \
 
 ifneq ($(ENABLE_WASM_STRIP_CHART),TRUE)
diff --git a/static/emscripten/soffice_args.js 
b/static/emscripten/soffice_args.js
index 7ecf7e8988e8..fa5e9dd4164d 100644
--- a/static/emscripten/soffice_args.js
+++ b/static/emscripten/soffice_args.js
@@ -2,5 +2,5 @@ Module['arguments'] = [
     '--norestore',
     '--nologo',
     '--writer',
-    '/android/default-document/example.odt'
+    '/android/default-document/example_larger.odt'
 ];
commit 5c5f64d9a5b6e28fcc88acfd5edcd6d9cda153c1
Author:     Jan-Marek Glogowski <glo...@fbihome.de>
AuthorDate: Wed Nov 17 01:57:33 2021 +0100
Commit:     Jan-Marek Glogowski <glo...@fbihome.de>
CommitDate: Fri Jan 28 13:15:18 2022 +0100

    WIP: async popup menus
    
    A first patch to get some feedback. Asnyc LO popup menus are still
    buggy, as I'm not sure where to call the PopupMenu::Finish for
    them.
    
    Also the XDialogClosedListener is currently just for convenience
    and might want some separate notifier.
    
    Fun fact, that ImplExecute / ImplPopup is called for submenu, but
    then doesn't execute. And generally the naming of some variables
    is IMHO wrong; I might also prefix Menu members with "m_" for
    easier readability.
    
    Change-Id: Id8b413aa6b4699201e58db0113649c6b224d33b6

diff --git a/include/sfx2/dispatch.hxx b/include/sfx2/dispatch.hxx
index 7b5e3611546e..55c851689579 100644
--- a/include/sfx2/dispatch.hxx
+++ b/include/sfx2/dispatch.hxx
@@ -20,6 +20,7 @@
 #define INCLUDED_SFX2_DISPATCH_HXX
 
 #include <memory>
+#include <functional>
 #include <sal/config.h>
 #include <sfx2/dllapi.h>
 #include <sfx2/toolbarids.hxx>
@@ -42,6 +43,7 @@ struct SfxDispatcher_Impl;
 
 namespace com::sun::star::awt { class XPopupMenu; }
 namespace vcl { class Window; }
+namespace com::sun::star::ui::dialogs { struct DialogClosedEvent; }
 
 enum class SfxDispatcherPopFlags
 {
@@ -136,8 +138,14 @@ public:
     SfxViewFrame*       GetFrame() const;
     SfxModule*          GetModule() const;
 
-    void                ExecutePopup( const OUString &rResName, vcl::Window 
*pWin = nullptr, const Point *pPos = nullptr );
-    static void         ExecutePopup( vcl::Window *pWin = nullptr, const Point 
*pPosPixel = nullptr );
+    /**
+     * @param rCloseFunc
+     *     If this is !nullptr, the popup will be just shown / run async and 
rCloseFunc will be called on close.
+     */
+    void ExecutePopup(const OUString &rResName, vcl::Window *pWin = nullptr, 
const Point *pPos = nullptr,
+                      const std::function<void(sal_Int16)>& rCloseFunc = 
nullptr);
+    static void ExecutePopup(vcl::Window *pWin = nullptr, const Point 
*pPosPixel = nullptr,
+                             const std::function<void(sal_Int16)>& rCloseFunc 
= nullptr);
 
     bool                IsAppDispatcher() const;
     bool                IsFlushed() const;
diff --git a/include/toolkit/awt/vclxmenu.hxx b/include/toolkit/awt/vclxmenu.hxx
index 096c370bce82..ffa89e9a8511 100644
--- a/include/toolkit/awt/vclxmenu.hxx
+++ b/include/toolkit/awt/vclxmenu.hxx
@@ -25,10 +25,11 @@
 #include <toolkit/helper/listenermultiplexer.hxx>
 
 #include <com/sun/star/awt/XMenuBar.hpp>
-#include <com/sun/star/awt/XPopupMenu.hpp>
+#include <com/sun/star/awt/XPopupMenuAsync.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/lang/XTypeProvider.hpp>
 #include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <com/sun/star/ui/dialogs/XDialogClosedListener.hpp>
 
 #include <comphelper/servicehelper.hxx>
 #include <cppuhelper/weak.hxx>
@@ -39,6 +40,7 @@
 
 #include <vector>
 
+struct DialogClosedEvent;
 class Menu;
 class MenuBar;
 class PopupMenu;
@@ -51,10 +53,11 @@ typedef ::std::vector<
 typedef void (*MenuUserDataReleaseFunction)(void*);
 
 class TOOLKIT_DLLPUBLIC VCLXMenu :  public css::awt::XMenuBar,
-                                    public css::awt::XPopupMenu,
+                                    public css::awt::XPopupMenuAsync,
                                     public css::lang::XServiceInfo,
                                     public css::lang::XTypeProvider,
                                     public css::lang::XUnoTunnel,
+                                    public 
css::ui::dialogs::XDialogClosedListener,
                                     public ::cppu::OWeakObject
 {
 private:
@@ -76,7 +79,6 @@ public:
     VCLXMenu( Menu* pMenu );
     virtual ~VCLXMenu() override;
 
-
     Menu*    GetMenu() const { return mpMenu; }
     bool IsPopupMenu() const;
     void setUserValue(sal_uInt16 nItemId, void* nUserValue, 
MenuUserDataReleaseFunction aFunc);
@@ -137,10 +139,20 @@ public:
     virtual void SAL_CALL setItemImage( ::sal_Int16 nItemId, const 
css::uno::Reference< css::graphic::XGraphic >& xGraphic, sal_Bool bScale ) 
override;
     virtual css::uno::Reference< css::graphic::XGraphic > SAL_CALL 
getItemImage( ::sal_Int16 nItemId ) override;
 
+    // css::awt::XPopupMenuAsync
+    virtual sal_Bool SAL_CALL popup(const css::uno::Reference< 
css::awt::XWindowPeer >& Parent, const css::awt::Rectangle& Position,
+                                    ::sal_Int16 Direction, const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& xListener) 
override;
+
     // css::lang::XServiceInfo
     virtual OUString SAL_CALL getImplementationName(  ) override;
     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) 
override;
     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames(  
) override;
+
+    // css::ui::dialogs::XDialogClosedListener
+    virtual void SAL_CALL dialogClosed(const 
css::ui::dialogs::DialogClosedEvent& aEvent) override;
+
+    // XEventListener (base of XDialogClosedListener)
+    virtual void SAL_CALL disposing(css::lang::EventObject const & Source) 
override;
 };
 
 class UNLESS_MERGELIBS(TOOLKIT_DLLPUBLIC) VCLXMenuBar final : public VCLXMenu
diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx
index 87108359dab1..89a9d2a058c8 100644
--- a/include/vcl/menu.hxx
+++ b/include/vcl/menu.hxx
@@ -44,6 +44,7 @@ class Menu;
 class MenuItemList;
 class Image;
 class PopupMenu;
+struct PopupMenuFinishState;
 class KeyEvent;
 class MenuFloatingWindow;
 class SalMenu;
@@ -54,6 +55,7 @@ enum class FloatWinPopupFlags;
 enum class VclEventId;
 
 namespace com::sun::star::awt { class XPopupMenu; }
+namespace com::sun::star::ui::dialogs { class XDialogClosedListener; }
 namespace com::sun::star::accessibility { class XAccessible;  }
 
 namespace vcl
@@ -492,11 +494,16 @@ class VCL_DLLPUBLIC PopupMenu final : public Menu
     friend struct MenuItemData;
 
 private:
+    struct PopupMenuFinishState* m_pState;
+
     SAL_DLLPRIVATE MenuFloatingWindow * ImplGetFloatingWindow() const;
     SAL_DLLPRIVATE bool PrepareRun(const VclPtr<vcl::Window>& pParentWin, 
tools::Rectangle& rRect, FloatWinPopupFlags& nPopupModeFlags, Menu* pSFrom, 
bool& bRealExecute, VclPtr<MenuFloatingWindow>&);
-    SAL_DLLPRIVATE bool Run(const VclPtr<MenuFloatingWindow>&, bool 
bRealExecute, bool bPreSelectFirst, FloatWinPopupFlags nPopupModeFlags, Menu* 
pSFrom, const tools::Rectangle& rRect);
+    SAL_DLLPRIVATE bool Run(const VclPtr<MenuFloatingWindow>&, bool 
bRealExecute, bool bPreSelectFirst, FloatWinPopupFlags nPopupModeFlags, Menu* 
pSFrom, const tools::Rectangle& rRect,
+                            const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* xListener);
     SAL_DLLPRIVATE void FinishRun(const VclPtr<MenuFloatingWindow>&, const 
VclPtr<vcl::Window>& pParentWin, bool bRealExecute, bool bIsNativeMenu);
     SAL_DLLPRIVATE sal_uInt16 ImplExecute(const VclPtr<vcl::Window>& 
pParentWin, const tools::Rectangle& rRect, FloatWinPopupFlags nPopupModeFlags, 
Menu* pSFrom, bool bPreSelectFirst);
+    SAL_DLLPRIVATE bool ImplPopup(const VclPtr<vcl::Window>& pParentWin, const 
tools::Rectangle& rRect, FloatWinPopupFlags nPopupModeFlags, Menu* pSFrom, bool 
bPreSelectFirst,
+                                  const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>&);
     SAL_DLLPRIVATE void ImplFlushPendingSelect();
     SAL_DLLPRIVATE tools::Long ImplCalcHeight( sal_uInt16 nEntries ) const;
     SAL_DLLPRIVATE sal_uInt16 ImplCalcVisEntries( tools::Long nMaxHeight, 
sal_uInt16 nStartEntry, sal_uInt16* pLastVisible = nullptr ) const;
@@ -519,6 +526,12 @@ public:
     sal_uInt16 Execute( vcl::Window* pWindow, const Point& rPopupPos );
     sal_uInt16 Execute( vcl::Window* pWindow, const tools::Rectangle& rRect, 
PopupMenuFlags nFlags = PopupMenuFlags::NONE );
 
+    bool Popup(vcl::Window* pParentWin, const Point& rPopupPos,
+               const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>&);
+    bool Popup(vcl::Window* pParentWin, const tools::Rectangle& rRect,
+               const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>&, PopupMenuFlags = 
PopupMenuFlags::NONE);
+    void Finish();
+
     // for the TestTool
     void EndExecute();
     virtual void SelectItem(sal_uInt16 nId) override;
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 3998e2af0541..17208d4e507c 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -1858,6 +1858,7 @@ $(eval $(call 
gb_UnoApi_add_idlfiles,offapi,com/sun/star/awt,\
        XPatternField \
        XPointer \
        XPopupMenu \
+       XPopupMenuAsync \
        XPrinter \
        XPrinterPropertySet \
        XPrinterServer \
diff --git a/offapi/com/sun/star/awt/XPopupMenuAsync.idl 
b/offapi/com/sun/star/awt/XPopupMenuAsync.idl
new file mode 100644
index 000000000000..d3f7b317f086
--- /dev/null
+++ b/offapi/com/sun/star/awt/XPopupMenuAsync.idl
@@ -0,0 +1,51 @@
+/* -*- 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/.
+ *
+ */
+#ifndef __com_sun_star_awt_XPopupMenuAsync_idl__
+#define __com_sun_star_awt_XPopupMenuAsync_idl__
+
+#include <com/sun/star/awt/XPopupMenu.idl>
+#include <com/sun/star/ui/dialogs/XDialogClosedListener.idl>
+
+module com {  module sun {  module star {  module awt {
+
+/** shows a pop-up menu without blocking.
+ */
+interface XPopupMenuAsync: XPopupMenu
+{
+    /** just shows the popup menu without blocking and calls the
+        XDialogClosedListener when closed,
+
+        @param Parent
+            the parent window.
+
+        @param Position
+            a Rectangle representing the coordinates system
+            where the popup menu should be executed.
+
+        @param Direction
+            the direction in which a popup menu will grow, as specified
+            by one of the PopupMenuDirection constants.
+
+        @param xListener
+            notified, if the popup is closed.
+
+        @return
+            returns true, if the popup has started to run async.
+            May fail, if the native backend doesn't implement async popups.
+    */
+    boolean popup([in] XWindowPeer Parent, [in] Rectangle Position, [in] short 
Direction,
+                  [in] ::com::sun::star::ui::dialogs::XDialogClosedListener 
xListener);
+};
+
+}; }; }; };
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews4.cxx b/sd/source/ui/view/drviews4.cxx
index b07279844265..548504af7746 100644
--- a/sd/source/ui/view/drviews4.cxx
+++ b/sd/source/ui/view/drviews4.cxx
@@ -800,7 +800,7 @@ void DrawViewShell::Command(const CommandEvent& rCEvt, 
::sd::Window* pWin)
             bool bShouldDisableEditHyperlink = ShouldDisableEditHyperlink();
 
             if(rCEvt.IsMouseEvent())
-                GetViewFrame()->GetDispatcher()->ExecutePopup( aPopupId );
+                GetViewFrame()->GetDispatcher()->ExecutePopup(aPopupId, 
nullptr, nullptr, [](sal_Int16){});
             else
             {
                 //don't open contextmenu at mouse position if not opened via 
mouse
diff --git a/sfx2/source/control/dispatch.cxx b/sfx2/source/control/dispatch.cxx
index 71f01cd76968..1e3e98faac44 100644
--- a/sfx2/source/control/dispatch.cxx
+++ b/sfx2/source/control/dispatch.cxx
@@ -60,6 +60,7 @@
 #include <svl/eitem.hxx>
 #include <svl/itemiter.hxx>
 #include <svl/itempool.hxx>
+#include <svtools/dialogclosedlistener.hxx>
 #include <toolkit/awt/vclxmenu.hxx>
 #include <toolkit/helper/vclunohelper.hxx>
 #include <tools/debug.hxx>
@@ -137,8 +138,12 @@ struct SfxDispatcher_Impl
     SfxDisableFlags      nDisableFlags;
     bool                 bFlushed;
     std::deque< std::deque<SfxToDo_Impl> > aToDoCopyStack;
+
+    static css::uno::Reference<css::frame::XPopupMenuController>* 
m_pActivePopupController;
 };
 
+css::uno::Reference<css::frame::XPopupMenuController>* 
SfxDispatcher_Impl::m_pActivePopupController = nullptr;
+
 /** This method checks if the stack of the SfxDispatchers is flushed, or if
     push- or pop- commands are pending.
 */
@@ -1685,7 +1690,52 @@ bool SfxDispatcher::FillState_(const SfxSlotServer& 
rSvr, SfxItemSet& rState,
     return false;
 }
 
-void SfxDispatcher::ExecutePopup( vcl::Window *pWin, const Point *pPos )
+namespace {
+
+static void 
lcl_FinishPopupDispatch(css::uno::Reference<css::frame::XPopupMenuController> 
xPopupController)
+{
+    css::uno::Reference<css::lang::XComponent> xComponent(xPopupController, 
css::uno::UNO_QUERY);
+    if (xComponent.is())
+        xComponent->dispose();
+    SfxDispatcher_Impl::m_pActivePopupController = nullptr;
+}
+
+struct SfxDispatcherPopupFinish final
+{
+    css::uno::Reference<css::frame::XPopupMenuController> m_xPopupController;
+    std::function<void(sal_Int16)> m_aCloseFunc;
+    rtl::Reference<::svt::DialogClosedListener> m_xDialogListener;
+    css::uno::Reference<css::awt::XPopupMenu> m_xPopupMenu;
+
+    DECL_LINK(PopupClosedHdl, css::ui::dialogs::DialogClosedEvent*, void);
+
+    
SfxDispatcherPopupFinish(css::uno::Reference<css::frame::XPopupMenuController> 
xPopupController,
+                             const std::function<void(sal_Int16)>& rCloseFunc,
+                             css::uno::Reference<css::awt::XPopupMenu> 
xPopupMenu)
+        : m_xPopupController(xPopupController)
+        , m_aCloseFunc(rCloseFunc)
+        , m_xDialogListener(new ::svt::DialogClosedListener())
+        , m_xPopupMenu(xPopupMenu)
+    {
+        m_xDialogListener->SetDialogClosedLink(LINK(this, 
SfxDispatcherPopupFinish, PopupClosedHdl));
+    }
+};
+
+IMPL_LINK(SfxDispatcherPopupFinish, PopupClosedHdl, 
css::ui::dialogs::DialogClosedEvent*, pEvt, void)
+{
+    assert(m_xPopupController.is());
+    if (!comphelper::LibreOfficeKit::isActive())
+        assert(SfxDispatcher_Impl::m_pActivePopupController == 
&m_xPopupController);
+    if (m_aCloseFunc)
+        m_aCloseFunc(pEvt ? pEvt->DialogResult : 0);
+    lcl_FinishPopupDispatch(m_xPopupController);
+    delete this;
+}
+
+} // anon namespace
+
+void SfxDispatcher::ExecutePopup(vcl::Window *pWin, const Point *pPos,
+    const std::function<void(sal_Int16)>& rCloseFunc)
 {
     SfxDispatcher &rDisp = *SfxGetpApp()->GetDispatcher_Impl();
     sal_uInt16 nShLevel = 0;
@@ -1699,7 +1749,7 @@ void SfxDispatcher::ExecutePopup( vcl::Window *pWin, 
const Point *pPos )
         const OUString& rResName = pSh->GetInterface()->GetPopupMenuName();
         if ( !rResName.isEmpty() )
         {
-            rDisp.ExecutePopup( rResName, pWin, pPos );
+            rDisp.ExecutePopup(rResName, pWin, pPos, rCloseFunc);
             return;
         }
     }
@@ -1808,7 +1858,8 @@ boost::property_tree::ptree 
SfxDispatcher::fillPopupMenu(css::uno::Reference<css
     return ::fillPopupMenu(pVCLMenu);
 }
 
-void SfxDispatcher::ExecutePopup( const OUString& rResName, vcl::Window* pWin, 
const Point* pPos )
+void SfxDispatcher::ExecutePopup( const OUString& rResName, vcl::Window* pWin, 
const Point* pPos,
+    const std::function<void(sal_Int16)>& rCloseFunc)
 {
     css::uno::Sequence< css::uno::Any > aArgs{
         css::uno::Any(comphelper::makePropertyValue( "Value", rResName )),
@@ -1817,16 +1868,29 @@ void SfxDispatcher::ExecutePopup( const OUString& 
rResName, vcl::Window* pWin, c
     };
 
     css::uno::Reference< css::uno::XComponentContext > xContext = 
comphelper::getProcessComponentContext();
-    css::uno::Reference< css::frame::XPopupMenuController > xPopupController(
-        xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
-        "com.sun.star.comp.framework.ResourceMenuController", aArgs, xContext 
), css::uno::UNO_QUERY );
+
+    if (!comphelper::LibreOfficeKit::isActive())
+        assert(!xImp->m_pActivePopupController);
+    if (!comphelper::LibreOfficeKit::isActive() && 
xImp->m_pActivePopupController)
+        return;
+
+    css::uno::Reference<css::frame::XPopupMenuController> xPopupController =
+        css::uno::Reference<css::frame::XPopupMenuController>(
+            
xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+            "com.sun.star.comp.framework.ResourceMenuController", aArgs, 
xContext), css::uno::UNO_QUERY);
+    if (!xPopupController.is())
+        return;
+    SfxDispatcher_Impl::m_pActivePopupController = &xPopupController;
 
     css::uno::Reference< css::awt::XPopupMenu > xPopupMenu( 
xContext->getServiceManager()->createInstanceWithContext(
         "com.sun.star.awt.PopupMenu", xContext ), css::uno::UNO_QUERY );
-
-    if ( !xPopupController.is() || !xPopupMenu.is() )
+    if (!xPopupMenu.is())
+    {
+        lcl_FinishPopupDispatch(xPopupController);
         return;
+    }
 
+    struct SfxDispatcherPopupFinish* pFin = nullptr;
     vcl::Window* pWindow = pWin ? pWin : 
xImp->pFrame->GetFrame().GetWorkWindow_Impl()->GetWindow();
     Point aPos = pPos ? *pPos : pWindow->GetPointerPosPixel();
 
@@ -1852,14 +1916,22 @@ void SfxDispatcher::ExecutePopup( const OUString& 
rResName, vcl::Window* pWin, c
         OUString aMenuURL = "private:resource/popupmenu/" + rResName;
         if (GetFrame()->GetViewShell()->TryContextMenuInterception(xPopupMenu, 
aMenuURL, aEvent))
         {
+            const sal_Int16 nFlags = 
css::awt::PopupMenuDirection::EXECUTE_DOWN;
+            const css::awt::Rectangle aRect(aPos.X(), aPos.Y(), 1, 1);
             css::uno::Reference<css::awt::XWindowPeer> 
xParent(aEvent.SourceWindow, css::uno::UNO_QUERY);
-            xPopupMenu->execute(xParent, css::awt::Rectangle(aPos.X(), 
aPos.Y(), 1, 1), css::awt::PopupMenuDirection::EXECUTE_DOWN);
+            css::uno::Reference<css::awt::XPopupMenuAsync> 
xAsyncPopup(xPopupMenu, css::uno::UNO_QUERY);
+            pFin = new SfxDispatcherPopupFinish(xPopupController, rCloseFunc, 
xPopupMenu);
+            if (!rCloseFunc || !xAsyncPopup.is() || 
!xAsyncPopup->popup(xParent, aRect, nFlags, pFin->m_xDialogListener))
+            {
+                delete pFin;
+                pFin = nullptr;
+                xPopupMenu->execute(xParent, aRect, nFlags);
+            }
         }
     }
 
-    css::uno::Reference< css::lang::XComponent > xComponent( xPopupController, 
css::uno::UNO_QUERY );
-    if ( xComponent.is() )
-        xComponent->dispose();
+    if (!pFin)
+        lcl_FinishPopupDispatch(xPopupController);
 }
 
 /** With this method the SfxDispatcher can be locked and released. A locked
diff --git a/sw/source/uibase/docvw/edtwin.cxx 
b/sw/source/uibase/docvw/edtwin.cxx
index 859c35664fea..f6bf6da313e3 100644
--- a/sw/source/uibase/docvw/edtwin.cxx
+++ b/sw/source/uibase/docvw/edtwin.cxx
@@ -5427,7 +5427,7 @@ void SwEditWin::Command( const CommandEvent& rCEvt )
                         }
                     }
                     else if ( !m_rView.ExecSpellPopup( aDocPos ) )
-                        SfxDispatcher::ExecutePopup(this, &aPixPos);
+                        SfxDispatcher::ExecutePopup(this, &aPixPos, 
[](sal_Int16){});
                 }
                 else if (m_pApplyTempl->nUndo < 
rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount())
                 {
diff --git a/toolkit/inc/helper/unowrapper.hxx 
b/toolkit/inc/helper/unowrapper.hxx
index 03a9b525cc18..fdc65988bb62 100644
--- a/toolkit/inc/helper/unowrapper.hxx
+++ b/toolkit/inc/helper/unowrapper.hxx
@@ -56,7 +56,7 @@ public:
     virtual VclPtr<vcl::Window> GetWindow(const 
css::uno::Reference<css::awt::XWindow>& rxWindow) override;
 
     // Menu
-    virtual css::uno::Reference<css::awt::XPopupMenu> CreateMenuInterface( 
PopupMenu* pPopupMenu ) override;
+    virtual css::uno::Reference<css::awt::XPopupMenu> 
CreateMenuInterface(PopupMenu* pPopupMenu) override;
 
     void                WindowDestroyed( vcl::Window* pWindow ) override;
 
diff --git a/toolkit/source/awt/vclxmenu.cxx b/toolkit/source/awt/vclxmenu.cxx
index cbeb1ef7f810..a13ced69163a 100644
--- a/toolkit/source/awt/vclxmenu.cxx
+++ b/toolkit/source/awt/vclxmenu.cxx
@@ -37,6 +37,7 @@
 #include <vcl/window.hxx>
 
 #include <com/sun/star/awt/KeyModifier.hpp>
+#include <com/sun/star/ui/dialogs/DialogClosedEvent.hpp>
 
 VCLXMenu::VCLXMenu()
     : maMenuListeners( *this )
@@ -492,6 +493,33 @@ sal_Int16 VCLXMenu::execute(
                 static_cast<PopupMenuFlags>(nFlags) | 
PopupMenuFlags::NoMouseUpClose );
 }
 
+sal_Bool VCLXMenu::popup(
+    const css::uno::Reference< css::awt::XWindowPeer >& rxWindowPeer,
+    const css::awt::Rectangle& rPos, sal_Int16 nFlags,
+    const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& 
xListener)
+{
+    SolarMutexGuard aSolarGuard;
+    std::unique_lock aGuard( maMutex );
+
+    if (!mpMenu || !IsPopupMenu())
+        return false;
+
+    return 
static_cast<PopupMenu*>(mpMenu.get())->Popup(VCLUnoHelper::GetWindow(rxWindowPeer),
+                                   VCLRectangle(rPos), xListener.is() ? 
xListener : this,
+                                   static_cast<PopupMenuFlags>(nFlags) | 
PopupMenuFlags::NoMouseUpClose);
+}
+
+void SAL_CALL VCLXMenu::dialogClosed(const 
css::ui::dialogs::DialogClosedEvent&)
+{
+    SolarMutexGuard aSolarGuard;
+    std::unique_lock aGuard( maMutex );
+
+    assert(mpMenu && IsPopupMenu());
+    if (mpMenu && IsPopupMenu())
+        static_cast<PopupMenu*>(mpMenu.get())->Finish();
+}
+
+void SAL_CALL VCLXMenu::disposing(css::lang::EventObject const&) {}
 
 void SAL_CALL VCLXMenu::setCommand(
     sal_Int16 nItemId,
diff --git a/toolkit/source/helper/unowrapper.cxx 
b/toolkit/source/helper/unowrapper.cxx
index 5d5ce94a9b8f..b73ad471f0d1 100644
--- a/toolkit/source/helper/unowrapper.cxx
+++ b/toolkit/source/helper/unowrapper.cxx
@@ -191,7 +191,7 @@ void UnoWrapper::SetWindowInterface( vcl::Window* pWindow, 
const css::uno::Refer
     }
 }
 
-css::uno::Reference<css::awt::XPopupMenu> UnoWrapper::CreateMenuInterface( 
PopupMenu* pPopupMenu )
+css::uno::Reference<css::awt::XPopupMenu> 
UnoWrapper::CreateMenuInterface(PopupMenu* pPopupMenu)
 {
     return new VCLXPopupMenu(pPopupMenu);
 }
diff --git a/vcl/inc/osx/salmenu.h b/vcl/inc/osx/salmenu.h
index 597180cc1ac3..dae1a1035cae 100644
--- a/vcl/inc/osx/salmenu.h
+++ b/vcl/inc/osx/salmenu.h
@@ -67,7 +67,9 @@ public:
     virtual void SetItemImage( unsigned nPos, SalMenuItem* pSalMenuItem, const 
Image& rImage) override;
     virtual void SetAccelerator( unsigned nPos, SalMenuItem* pSalMenuItem, 
const vcl::KeyCode& rKeyCode, const OUString& rKeyName ) override;
     virtual void GetSystemMenuData( SystemMenuData* pData ) override;
-    virtual bool ShowNativePopupMenu(FloatingWindow * pWin, const 
tools::Rectangle& rRect, FloatWinPopupFlags nFlags) override;
+    virtual bool ShowNativePopupMenu(
+        FloatingWindow*, const tools::Rectangle&, FloatWinPopupFlags,
+        const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* = 
nullptr) override;
     virtual bool AddMenuBarButton( const SalMenuButtonItem& ) override;
     virtual void RemoveMenuBarButton( sal_uInt16 nId ) override;
     virtual tools::Rectangle GetMenuBarButtonRectPixel( sal_uInt16 i_nItemId, 
SalFrame* i_pReferenceFrame ) override;
diff --git a/vcl/inc/qt5/QtMenu.hxx b/vcl/inc/qt5/QtMenu.hxx
index 55275ae6e099..738c98e336a3 100644
--- a/vcl/inc/qt5/QtMenu.hxx
+++ b/vcl/inc/qt5/QtMenu.hxx
@@ -38,7 +38,7 @@ class QtFrame;
 class QtMenu : public QObject, public SalMenu
 {
     Q_OBJECT
-private:
+
     std::vector<QtMenuItem*> maItems;
     VclPtr<Menu> mpVCLMenu;
     QtMenu* mpParentSalMenu;
@@ -52,6 +52,9 @@ private:
     QPushButton* mpCloseButton;
     QMetaObject::Connection maCloseButtonConnection;
 
+    css::uno::Reference<css::ui::dialogs::XDialogClosedListener> m_xListener;
+    FloatingWindow* m_pWin;
+
     void DoFullMenuUpdate(Menu* pMenuBar);
     static void NativeItemText(OUString& rItemText);
 
@@ -72,8 +75,9 @@ public:
     virtual void SetFrame(const SalFrame* pFrame) override;
     const QtFrame* GetFrame() const;
     virtual void ShowMenuBar(bool bVisible) override;
-    virtual bool ShowNativePopupMenu(FloatingWindow* pWin, const 
tools::Rectangle& rRect,
-                                     FloatWinPopupFlags nFlags) override;
+    virtual bool ShowNativePopupMenu(
+        FloatingWindow*, const tools::Rectangle&, FloatWinPopupFlags,
+        const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* = 
nullptr) override;
     QtMenu* GetTopLevel();
     virtual void SetItemBits(unsigned nPos, MenuItemBits nBits) override;
     virtual void CheckItem(unsigned nPos, bool bCheck) override;
diff --git a/vcl/inc/salmenu.hxx b/vcl/inc/salmenu.hxx
index c696503549e6..60840a020460 100644
--- a/vcl/inc/salmenu.hxx
+++ b/vcl/inc/salmenu.hxx
@@ -22,6 +22,7 @@
 
 #include <vcl/menu.hxx>
 #include <vcl/image.hxx>
+#include <com/sun/star/ui/dialogs/XDialogClosedListener.hpp>
 
 struct SystemMenuData;
 class FloatingWindow;
@@ -75,7 +76,17 @@ public:
     virtual void SetItemImage( unsigned nPos, SalMenuItem* pSalMenuItem, const 
Image& rImage ) = 0;
     virtual void SetAccelerator( unsigned nPos, SalMenuItem* pSalMenuItem, 
const vcl::KeyCode& rKeyCode, const OUString& rKeyName ) = 0;
     virtual void GetSystemMenuData( SystemMenuData* pData ) = 0;
-    virtual bool ShowNativePopupMenu(FloatingWindow * pWin, const 
tools::Rectangle& rRect, FloatWinPopupFlags nFlags);
+    /**
+     * @param pListener
+     *     if !nullptr, the menu is supposed to be only shown and it'll run 
async.
+     *     Mainly means, when the menu is hidden, it must call the listener's
+     *     dialogClosed. The listener will destroy the SalMenu!
+     *
+     * @return
+     *     true, if the feature is implemented and was successful.
+     */
+    virtual bool ShowNativePopupMenu(FloatingWindow * pWin, const 
tools::Rectangle& rRect, FloatWinPopupFlags nFlags,
+                                     const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* pListener = 
nullptr);
     virtual void ShowCloseButton(bool bShow);
     virtual bool AddMenuBarButton( const SalMenuButtonItem& ); // return false 
if not implemented or failure
     virtual void RemoveMenuBarButton( sal_uInt16 nId );
diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx
index 85c0f5d3d893..5d5a487df8f1 100644
--- a/vcl/inc/unx/gtk/gtksalmenu.hxx
+++ b/vcl/inc/unx/gtk/gtksalmenu.hxx
@@ -132,7 +132,8 @@ public:
 #endif
     void ReturnFocus();
 
-    virtual bool ShowNativePopupMenu(FloatingWindow * pWin, const 
tools::Rectangle& rRect, FloatWinPopupFlags nFlags) override;
+    virtual bool ShowNativePopupMenu(FloatingWindow * pWin, const 
tools::Rectangle& rRect, FloatWinPopupFlags nFlags,
+                                     const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* = nullptr) 
override;
     virtual void ShowCloseButton(bool bShow) override;
     virtual bool AddMenuBarButton( const SalMenuButtonItem& rNewItem ) 
override;
     virtual void RemoveMenuBarButton( sal_uInt16 nId ) override;
diff --git a/vcl/osx/salmenu.cxx b/vcl/osx/salmenu.cxx
index 3164ba873bae..0a91ab88cc36 100644
--- a/vcl/osx/salmenu.cxx
+++ b/vcl/osx/salmenu.cxx
@@ -281,8 +281,13 @@ AquaSalMenu::~AquaSalMenu()
     }
 }
 
-bool AquaSalMenu::ShowNativePopupMenu(FloatingWindow * pWin, const 
tools::Rectangle& rRect, FloatWinPopupFlags nFlags)
+bool AquaSalMenu::ShowNativePopupMenu(
+    FloatingWindow* pWin, const tools::Rectangle& rRect, FloatWinPopupFlags 
nFlags,
+    const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* 
pListener)
 {
+    if (pListener)
+        return false;
+
     // set offsets for positioning
     const float offset = 9.0;
 
diff --git a/vcl/qt5/QtMenu.cxx b/vcl/qt5/QtMenu.cxx
index d9279fb9389a..b2d050291084 100644
--- a/vcl/qt5/QtMenu.cxx
+++ b/vcl/qt5/QtMenu.cxx
@@ -93,6 +93,16 @@ void QtMenu::InsertMenuItem(QtMenuItem* pSalMenuItem, 
unsigned nPos)
             // no QMenu set, instantiate own one
             mpOwnedQMenu.reset(new QMenu);
             mpQMenu = mpOwnedQMenu.get();
+
+            connect(mpQMenu, &QMenu::aboutToHide, this, [this] {
+                if (m_pWin && m_xListener.is())
+                {
+                    QMenu* pMenu = mpOwnedQMenu.release();
+                    css::ui::dialogs::DialogClosedEvent 
aEvent(m_pWin->GetComponentInterface(), 0);
+                    m_xListener->dialogClosed(aEvent);
+                    pMenu->deleteLater();
+                }
+            });
         }
 
         if (pSalMenuItem->mpSubMenu)
@@ -672,15 +682,27 @@ void QtMenu::ShowCloseButton(bool bShow)
         pButton->hide();
 }
 
-bool QtMenu::ShowNativePopupMenu(FloatingWindow*, const tools::Rectangle&,
-                                 FloatWinPopupFlags nFlags)
+bool QtMenu::ShowNativePopupMenu(
+    FloatingWindow* pWin, const tools::Rectangle&, FloatWinPopupFlags nFlags,
+    const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* 
pListener)
 {
     assert(mpQMenu);
     DoFullMenuUpdate(mpVCLMenu);
     mpQMenu->setTearOffEnabled(bool(nFlags & 
FloatWinPopupFlags::AllowTearOff));
 
     const QPoint aPos = QCursor::pos();
-    mpQMenu->exec(aPos);
+    if (pListener)
+    {
+        m_xListener = *pListener;
+        m_pWin = pWin;
+        mpQMenu->popup(aPos);
+    }
+    else
+    {
+        m_xListener = nullptr;
+        m_pWin = nullptr;
+        mpQMenu->exec(aPos);
+    }
 
     return true;
 }
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 61789796f473..40d7edb1cd73 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -191,7 +191,9 @@ SalObject::~SalObject() {}
 
 SalMenu::~SalMenu() {}
 
-bool SalMenu::ShowNativePopupMenu(FloatingWindow*, const tools::Rectangle&, 
FloatWinPopupFlags)
+bool SalMenu::ShowNativePopupMenu(
+    FloatingWindow*, const tools::Rectangle&, FloatWinPopupFlags,
+    const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>*)
 {
     return false;
 }
diff --git a/vcl/source/control/managedmenubutton.cxx 
b/vcl/source/control/managedmenubutton.cxx
index 880730721ce2..f671cdd9c695 100644
--- a/vcl/source/control/managedmenubutton.cxx
+++ b/vcl/source/control/managedmenubutton.cxx
@@ -13,6 +13,7 @@
 #include <managedmenubutton.hxx>
 #include <vcl/menu.hxx>
 
+#include <com/sun/star/awt/XPopupMenuAsync.hpp>
 #include <com/sun/star/frame/ModuleManager.hpp>
 #include <com/sun/star/frame/theDesktop.hpp>
 #include <com/sun/star/frame/thePopupMenuControllerFactory.hpp>
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index 2fd136429061..f7055dbf92f4 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -2657,6 +2657,7 @@ MenuFloatingWindow * PopupMenu::ImplGetFloatingWindow() 
const {
 }
 
 PopupMenu::PopupMenu()
+    : m_pState(nullptr)
 {
     mpSalMenu = ImplGetSVData()->mpDefInst->CreateMenu(false, this);
 }
@@ -2669,6 +2670,7 @@ PopupMenu::PopupMenu( const PopupMenu& rMenu )
 
 PopupMenu::~PopupMenu()
 {
+    assert(!m_pState);
     disposeOnce();
 }
 
@@ -2766,6 +2768,36 @@ sal_uInt16 PopupMenu::Execute( vcl::Window* pExecWindow, 
const tools::Rectangle&
     return ImplExecute( pExecWindow, rRect, lcl_TranslateFlags(nFlags), 
nullptr, false );
 }
 
+struct PopupMenuFinishState final
+{
+    VclPtr<PopupMenu> pSelf;
+    VclPtr<vcl::Window> pParentWin;
+    VclPtr<MenuFloatingWindow> pWin;
+    bool bRealExecute;
+    bool bIsNativeMenu;
+
+    void clean()
+    {
+        pWin = nullptr;
+        pParentWin = nullptr;
+        pSelf = nullptr;
+    }
+};
+
+bool PopupMenu::Popup(vcl::Window* pExecWindow, const Point& rPopupPos,
+                            const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& listener)
+{
+    return Popup(pExecWindow, tools::Rectangle(rPopupPos, rPopupPos), 
listener, PopupMenuFlags::ExecuteDown);
+}
+
+bool PopupMenu::Popup(vcl::Window* pExecWindow, const tools::Rectangle& rRect,
+                      const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& listener, 
PopupMenuFlags nFlags)
+{
+    assert(!m_pState);
+    ENSURE_OR_RETURN(pExecWindow, "PopupMenu::Popup: need a non-NULL window!", 
false);
+    return ImplPopup(pExecWindow, rRect, lcl_TranslateFlags(nFlags), nullptr, 
false, listener);
+}
+
 void PopupMenu::ImplFlushPendingSelect()
 {
     // is there still Select?
@@ -2917,7 +2949,7 @@ bool PopupMenu::PrepareRun(const VclPtr<vcl::Window>& 
pParentWin, tools::Rectang
     if (pStartedFrom && pStartedFrom->IsMenuBar())
         nMaxHeight -= pParentWin->GetSizePixel().Height();
     sal_Int32 nLeft, nTop, nRight, nBottom;
-    pWindow->GetBorder( nLeft, nTop, nRight, nBottom );
+    pWindow->GetBorder(nLeft, nTop, nRight, nBottom);
     nMaxHeight -= nTop+nBottom;
     if ( aSz.Height() > nMaxHeight )
     {
@@ -2933,10 +2965,11 @@ bool PopupMenu::PrepareRun(const VclPtr<vcl::Window>& 
pParentWin, tools::Rectang
 }
 
 bool PopupMenu::Run(const VclPtr<MenuFloatingWindow>& pWin, const bool 
bRealExecute, const bool bPreSelectFirst,
-                    const FloatWinPopupFlags nPopupModeFlags, Menu* pSFrom, 
const tools::Rectangle& rRect)
+                    const FloatWinPopupFlags nPopupModeFlags, Menu* pSFrom, 
const tools::Rectangle& rRect,
+                    const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* xListener)
 {
     SalMenu* pMenu = ImplGetSalMenu();
-    if (pMenu && bRealExecute && pMenu->ShowNativePopupMenu(pWin, rRect, 
nPopupModeFlags))
+    if (pMenu && bRealExecute && pMenu->ShowNativePopupMenu(pWin, rRect, 
nPopupModeFlags, xListener))
         return true;
 
     pWin->StartPopupMode(rRect, nPopupModeFlags);
@@ -2972,7 +3005,12 @@ bool PopupMenu::Run(const VclPtr<MenuFloatingWindow>& 
pWin, const bool bRealExec
     }
 
     if (bRealExecute)
-        pWin->Execute();
+    {
+        if (!xListener)
+            pWin->Execute();
+        else
+            pWin->Popup(*xListener);
+    }
 
     return false;
 }
@@ -3017,11 +3055,42 @@ sal_uInt16 PopupMenu::ImplExecute(const 
VclPtr<vcl::Window>& pParentWin, const t
     VclPtr<MenuFloatingWindow> pWin;
     if (!PrepareRun(pParentWin, aRect, nPopupModeFlags, pSFrom, bRealExecute, 
pWin))
         return 0;
-    const bool bNative = Run(pWin, bRealExecute, bPreSelectFirst, 
nPopupModeFlags, pSFrom, aRect);
+    const bool bNative = Run(pWin, bRealExecute, bPreSelectFirst, 
nPopupModeFlags, pSFrom, aRect, nullptr);
     FinishRun(pWin, pParentWin, bRealExecute, bNative);
     return nSelectedId;
 }
 
+bool PopupMenu::ImplPopup(const VclPtr<vcl::Window>& pParentWin, const 
tools::Rectangle& rRect,
+                          FloatWinPopupFlags nPopupModeFlags, Menu* pSFrom, 
bool bPreSelectFirst,
+                          const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& xListener)
+{
+    // tdf#126054 hold this until after function completes
+    VclPtr<PopupMenu> xThis(this);
+    bool bRealExecute = false;
+    tools::Rectangle aRect(rRect);
+    VclPtr<MenuFloatingWindow> pWin;
+    if (!PrepareRun(pParentWin, aRect, nPopupModeFlags, pSFrom, bRealExecute, 
pWin))
+        return false;
+    assert(!m_pState);
+    m_pState = new PopupMenuFinishState;
+    m_pState->bIsNativeMenu = Run(pWin, bRealExecute, bPreSelectFirst, 
nPopupModeFlags, pSFrom, aRect, &xListener);
+    m_pState->pWin = pWin;
+    m_pState->pParentWin = pParentWin;
+    m_pState->bRealExecute = bRealExecute;
+    m_pState->pSelf = xThis;
+    return true;
+}
+
+void PopupMenu::Finish()
+{
+    if (!m_pState)
+        return;
+    FinishRun(m_pState->pWin, m_pState->pParentWin, m_pState->bRealExecute, 
m_pState->bIsNativeMenu);
+    m_pState->clean();
+    delete m_pState;
+    m_pState = nullptr;
+}
+
 sal_uInt16 PopupMenu::ImplCalcVisEntries( tools::Long nMaxHeight, sal_uInt16 
nStartEntry, sal_uInt16* pLastVisible ) const
 {
     nMaxHeight -= 2 * ImplGetFloatingWindow()->GetScrollerHeight();
diff --git a/vcl/source/window/menufloatingwindow.cxx 
b/vcl/source/window/menufloatingwindow.cxx
index cfd6a6ae190e..075fb97f5632 100644
--- a/vcl/source/window/menufloatingwindow.cxx
+++ b/vcl/source/window/menufloatingwindow.cxx
@@ -308,8 +308,15 @@ IMPL_LINK_NOARG(MenuFloatingWindow, PopupEnd, 
FloatingWindow*, void)
             pMenu->pStartedFrom->ClosePopup(pMenu);
     }
 
-    if ( pM )
+    if (pM)
+    {
         pM->pStartedFrom = nullptr;
+        if (m_xListener.is())
+        {
+            css::ui::dialogs::DialogClosedEvent 
aEvent(GetComponentInterface(), pM->GetCurItemId());
+            m_xListener->dialogClosed(aEvent);
+        }
+    }
 }
 
 IMPL_LINK_NOARG(MenuFloatingWindow, AutoScroll, Timer *, void)
@@ -443,21 +450,31 @@ void MenuFloatingWindow::End()
         Window::EndSaveFocus(xFocusId);
     }
 
+    Finish();
+
     bInExecute = false;
 }
 
-void MenuFloatingWindow::Execute()
+void MenuFloatingWindow::Popup(const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& xListener)
 {
     ImplSVData* pSVData = ImplGetSVData();
-
     pSVData->maAppData.mpActivePopupMenu = 
static_cast<PopupMenu*>(pMenu.get());
-
+    m_xListener = xListener;
     Start();
+}
 
+void MenuFloatingWindow::Finish()
+{
+    ImplSVData* pSVData = ImplGetSVData();
+    pSVData->maAppData.mpActivePopupMenu = nullptr;
+}
+
+void MenuFloatingWindow::Execute()
+{
+    Popup();
     while (bInExecute && !Application::IsQuit())
         Application::Yield();
-
-    pSVData->maAppData.mpActivePopupMenu = nullptr;
+    Finish();
 }
 
 void MenuFloatingWindow::StopExecute()
@@ -474,6 +491,7 @@ void MenuFloatingWindow::StopExecute()
     // notify parent, needed for accessibility
     if( pMenu && pMenu->pStartedFrom )
         pMenu->pStartedFrom->ImplCallEventListeners( 
VclEventId::MenuSubmenuDeactivate, nPosInParent );
+    Finish();
 }
 
 void MenuFloatingWindow::KillActivePopup( PopupMenu* pThisOnly )
@@ -502,6 +520,7 @@ void MenuFloatingWindow::KillActivePopup( PopupMenu* 
pThisOnly )
 
         PaintImmediately();
     }
+    pPopup->Finish();
 }
 
 void MenuFloatingWindow::EndExecute()
diff --git a/vcl/source/window/menufloatingwindow.hxx 
b/vcl/source/window/menufloatingwindow.hxx
index f26fb50373ca..b6c8b54738ce 100644
--- a/vcl/source/window/menufloatingwindow.hxx
+++ b/vcl/source/window/menufloatingwindow.hxx
@@ -46,6 +46,7 @@ private:
     sal_uInt16 nScrollerHeight;
     sal_uInt16 nFirstEntry;
     sal_uInt16 nPosInParent;
+    css::uno::Reference<css::ui::dialogs::XDialogClosedListener> m_xListener;
 
     bool bInExecute : 1;
     bool bScrollMenu : 1;
@@ -67,6 +68,7 @@ private:
 
     void Start();
     void End();
+    static void Finish();
 
 protected:
     vcl::Region ImplCalcClipRegion() const;
@@ -107,6 +109,8 @@ public:
     bool IsScrollMenu() const        { return bScrollMenu; }
     sal_uInt16 GetScrollerHeight() const   { return nScrollerHeight; }
 
+    void Popup(const 
css::uno::Reference<css::ui::dialogs::XDialogClosedListener>& xListener = 
nullptr);
+
     void Execute();
     void StopExecute();
     void EndExecute();
diff --git a/vcl/unx/gtk3/gtksalmenu.cxx b/vcl/unx/gtk3/gtksalmenu.cxx
index ac71e3390d87..0ccda0b66fb8 100644
--- a/vcl/unx/gtk3/gtksalmenu.cxx
+++ b/vcl/unx/gtk3/gtksalmenu.cxx
@@ -422,9 +422,13 @@ static void MenuClosed(GtkPopover* pWidget, GMainLoop* 
pLoop)
     g_main_loop_quit(pLoop);
 }
 
-bool GtkSalMenu::ShowNativePopupMenu(FloatingWindow* pWin, const 
tools::Rectangle& rRect,
-                                     FloatWinPopupFlags nFlags)
+bool GtkSalMenu::ShowNativePopupMenu
+    (FloatingWindow* pWin, const tools::Rectangle& rRect, FloatWinPopupFlags 
nFlags,
+     const css::uno::Reference<css::ui::dialogs::XDialogClosedListener>* 
pListener)
 {
+    if (pListener)
+        return false;
+
     VclPtr<vcl::Window> xParent = pWin->ImplGetWindowImpl()->mpRealParent;
     mpFrame = static_cast<GtkSalFrame*>(xParent->ImplGetFrame());
 
commit 468d0dac38ee0b1eb164558bd1f7bebc2832b2dd
Author:     Jan-Marek Glogowski <glo...@fbihome.de>
AuthorDate: Sat Nov 20 15:06:35 2021 +0100
Commit:     Jan-Marek Glogowski <glo...@fbihome.de>
CommitDate: Fri Jan 28 13:14:22 2022 +0100

    Refactor PopupMenu::ImplExecute for async support
    
    Splits ImplExecute into PrepareRun, Run and FinishRun.
    
    Change-Id: Ifddb1e968b468c9757eeece0bb19513cc26a9c8d

diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx
index a6699a7e71d9..87108359dab1 100644
--- a/include/vcl/menu.hxx
+++ b/include/vcl/menu.hxx
@@ -493,7 +493,10 @@ class VCL_DLLPUBLIC PopupMenu final : public Menu
 
 private:
     SAL_DLLPRIVATE MenuFloatingWindow * ImplGetFloatingWindow() const;
-    SAL_DLLPRIVATE sal_uInt16 ImplExecute( const VclPtr<vcl::Window>& pW, 
const tools::Rectangle& rRect, FloatWinPopupFlags nPopupModeFlags, Menu* 
pSFrom, bool bPreSelectFirst );
+    SAL_DLLPRIVATE bool PrepareRun(const VclPtr<vcl::Window>& pParentWin, 
tools::Rectangle& rRect, FloatWinPopupFlags& nPopupModeFlags, Menu* pSFrom, 
bool& bRealExecute, VclPtr<MenuFloatingWindow>&);
+    SAL_DLLPRIVATE bool Run(const VclPtr<MenuFloatingWindow>&, bool 
bRealExecute, bool bPreSelectFirst, FloatWinPopupFlags nPopupModeFlags, Menu* 
pSFrom, const tools::Rectangle& rRect);
+    SAL_DLLPRIVATE void FinishRun(const VclPtr<MenuFloatingWindow>&, const 
VclPtr<vcl::Window>& pParentWin, bool bRealExecute, bool bIsNativeMenu);
+    SAL_DLLPRIVATE sal_uInt16 ImplExecute(const VclPtr<vcl::Window>& 
pParentWin, const tools::Rectangle& rRect, FloatWinPopupFlags nPopupModeFlags, 
Menu* pSFrom, bool bPreSelectFirst);
     SAL_DLLPRIVATE void ImplFlushPendingSelect();
     SAL_DLLPRIVATE tools::Long ImplCalcHeight( sal_uInt16 nEntries ) const;
     SAL_DLLPRIVATE sal_uInt16 ImplCalcVisEntries( tools::Long nMaxHeight, 
sal_uInt16 nStartEntry, sal_uInt16* pLastVisible = nullptr ) const;
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index 6af85523f8a1..2fd136429061 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -2742,10 +2742,8 @@ sal_uInt16 PopupMenu::Execute( vcl::Window* pExecWindow, 
const Point& rPopupPos
     return Execute( pExecWindow, tools::Rectangle( rPopupPos, rPopupPos ), 
PopupMenuFlags::ExecuteDown );
 }
 
-sal_uInt16 PopupMenu::Execute( vcl::Window* pExecWindow, const 
tools::Rectangle& rRect, PopupMenuFlags nFlags )
+static FloatWinPopupFlags lcl_TranslateFlags(PopupMenuFlags nFlags)
 {
-    ENSURE_OR_RETURN( pExecWindow, "PopupMenu::Execute: need a non-NULL 
window!", 0 );
-
     FloatWinPopupFlags nPopupModeFlags = FloatWinPopupFlags::NONE;
     if ( nFlags & PopupMenuFlags::ExecuteDown )
         nPopupModeFlags = FloatWinPopupFlags::Down;
@@ -2759,7 +2757,13 @@ sal_uInt16 PopupMenu::Execute( vcl::Window* pExecWindow, 
const tools::Rectangle&
     if (nFlags & PopupMenuFlags::NoMouseUpClose )                      // 
allow popup menus to stay open on mouse button up
         nPopupModeFlags |= FloatWinPopupFlags::NoMouseUpClose;    // useful if 
the menu was opened on mousebutton down (eg toolbox configuration)
 
-    return ImplExecute( pExecWindow, rRect, nPopupModeFlags, nullptr, false );
+    return nPopupModeFlags;
+}
+
+sal_uInt16 PopupMenu::Execute( vcl::Window* pExecWindow, const 
tools::Rectangle& rRect, PopupMenuFlags nFlags )
+{
+    ENSURE_OR_RETURN( pExecWindow, "PopupMenu::Execute: need a non-NULL 
window!", 0 );
+    return ImplExecute( pExecWindow, rRect, lcl_TranslateFlags(nFlags), 
nullptr, false );
 }
 
 void PopupMenu::ImplFlushPendingSelect()
@@ -2775,10 +2779,14 @@ void PopupMenu::ImplFlushPendingSelect()
     }
 }
 
-sal_uInt16 PopupMenu::ImplExecute( const VclPtr<vcl::Window>& pW, const 
tools::Rectangle& rRect, FloatWinPopupFlags nPopupModeFlags, Menu* pSFrom, bool 
bPreSelectFirst )
+bool PopupMenu::PrepareRun(const VclPtr<vcl::Window>& pParentWin, 
tools::Rectangle& rRect,
+                           FloatWinPopupFlags& nPopupModeFlags, Menu* pSFrom,
+                           bool& bRealExecute, VclPtr<MenuFloatingWindow>& 
pWin)
 {
-    if ( !pSFrom && ( vcl::IsInPopupMenuExecute() || !GetItemCount() ) )
-        return 0;
+    bRealExecute = false;
+    const sal_uInt16 nItemCount = GetItemCount();
+    if (!pSFrom && (vcl::IsInPopupMenuExecute() || !nItemCount))
+        return false;
 
     mpLayoutData.reset();
 
@@ -2790,7 +2798,6 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
     bCanceled = false;
 
     VclPtr<vcl::Window> xFocusId;
-    bool bRealExecute = false;
     if ( !pStartedFrom )
     {
         pSVData->mpWinData->mbNoDeactivate = true;
@@ -2806,25 +2813,24 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
     }
 
     SAL_WARN_IF( ImplGetWindow(), "vcl", "Win?!" );
-    tools::Rectangle aRect( rRect );
-    aRect.SetPos( pW->OutputToScreenPixel( aRect.TopLeft() ) );
+    rRect.SetPos(pParentWin->OutputToScreenPixel(rRect.TopLeft()));
 
+    nPopupModeFlags |= FloatWinPopupFlags::NoKeyClose | 
FloatWinPopupFlags::AllMouseButtonClose | FloatWinPopupFlags::GrabFocus;
     if (bRealExecute)
         nPopupModeFlags |= FloatWinPopupFlags::NewLevel;
-    nPopupModeFlags |= FloatWinPopupFlags::NoKeyClose | 
FloatWinPopupFlags::AllMouseButtonClose;
 
     bInCallback = true; // set it here, if Activate overridden
     Activate();
     bInCallback = false;
 
-    if ( pW->isDisposed() )
-        return 0;   // Error
+    if (pParentWin->isDisposed())
+        return false;
 
     if ( bCanceled || bKilled )
-        return 0;
+        return false;
 
-    if ( !GetItemCount() )
-        return 0;
+    if (!nItemCount)
+        return false;
 
     // The flag MenuFlags::HideDisabledEntries is inherited.
     if ( pSFrom )
@@ -2854,10 +2860,10 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
         ImplCallEventListeners(VclEventId::MenuSubmenuChanged, nPos);
     }
 
-    VclPtrInstance<MenuFloatingWindow> pWin( this, pW, WB_BORDER | 
WB_SYSTEMWINDOW );
+    pWin = VclPtrInstance<MenuFloatingWindow>(this, pParentWin, WB_BORDER | 
WB_SYSTEMWINDOW);
     if (comphelper::LibreOfficeKit::isActive() && get_id() == 
"editviewspellmenu")
     {
-        VclPtr<vcl::Window> xNotifierParent = pW->GetParentWithLOKNotifier();
+        VclPtr<vcl::Window> xNotifierParent = 
pParentWin->GetParentWithLOKNotifier();
         assert(xNotifierParent && xNotifierParent->GetLOKNotifier() && 
"editview menu without LOKNotifier");
         pWin->SetLOKNotifier(xNotifierParent->GetLOKNotifier());
     }
@@ -2876,9 +2882,9 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
         vcl::Window* pDeskW = pWindow->GetWindow( GetWindowType::RealParent );
         if( ! pDeskW )
             pDeskW = pWindow;
-        Point aDesktopTL( pDeskW->OutputToAbsoluteScreenPixel( aRect.TopLeft() 
) );
+        Point aDesktopTL(pDeskW->OutputToAbsoluteScreenPixel(rRect.TopLeft()));
         aDesktopRect = Application::GetScreenPosSizePixel(
-            Application::GetBestScreen( tools::Rectangle( aDesktopTL, 
aRect.GetSize() ) ));
+            Application::GetBestScreen(tools::Rectangle(aDesktopTL, 
rRect.GetSize())));
     }
 
     tools::Long nMaxHeight = aDesktopRect.GetHeight();
@@ -2893,8 +2899,8 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
         if ( pRef->GetParent() )
             pRef = pRef->GetParent();
 
-        tools::Rectangle devRect(  pRef->OutputToAbsoluteScreenPixel( 
aRect.TopLeft() ),
-                            pRef->OutputToAbsoluteScreenPixel( 
aRect.BottomRight() ) );
+        tools::Rectangle 
devRect(pRef->OutputToAbsoluteScreenPixel(rRect.TopLeft()),
+                                 
pRef->OutputToAbsoluteScreenPixel(rRect.BottomRight()));
 
         tools::Long nHeightAbove = devRect.Top() - aDesktopRect.Top();
         tools::Long nHeightBelow = aDesktopRect.Bottom() - devRect.Bottom();
@@ -2909,7 +2915,7 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
     nMaxHeight = std::max(nMaxHeight, tools::Long(768));
 
     if (pStartedFrom && pStartedFrom->IsMenuBar())
-        nMaxHeight -= pW->GetSizePixel().Height();
+        nMaxHeight -= pParentWin->GetSizePixel().Height();
     sal_Int32 nLeft, nTop, nRight, nBottom;
     pWindow->GetBorder( nLeft, nTop, nRight, nBottom );
     nMaxHeight -= nTop+nBottom;
@@ -2921,43 +2927,34 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
         aSz.setHeight( ImplCalcHeight( nEntries ) );
     }
 
-    // tdf#126054 hold this until after function completes
-    VclPtr<PopupMenu> xThis(this);
-
     pWin->SetFocusId( xFocusId );
     pWin->SetOutputSizePixel( aSz );
-    if ( GetItemCount() )
+    return true;
+}
+
+bool PopupMenu::Run(const VclPtr<MenuFloatingWindow>& pWin, const bool 
bRealExecute, const bool bPreSelectFirst,
+                    const FloatWinPopupFlags nPopupModeFlags, Menu* pSFrom, 
const tools::Rectangle& rRect)
+{
+    SalMenu* pMenu = ImplGetSalMenu();
+    if (pMenu && bRealExecute && pMenu->ShowNativePopupMenu(pWin, rRect, 
nPopupModeFlags))
+        return true;
+
+    pWin->StartPopupMode(rRect, nPopupModeFlags);
+    if (pSFrom)
     {
-        SalMenu* pMenu = ImplGetSalMenu();
-        if( pMenu && bRealExecute && pMenu->ShowNativePopupMenu( pWin, aRect, 
nPopupModeFlags | FloatWinPopupFlags::GrabFocus ) )
-        {
-            pWin->StopExecute();
-            pWin->doShutdown();
-            pWindow.disposeAndClear();
-            ImplClosePopupToolBox(pW);
-            ImplFlushPendingSelect();
-            return nSelectedId;
-        }
+        sal_uInt16 aPos;
+        if (pSFrom->IsMenuBar())
+            aPos = static_cast<MenuBarWindow 
*>(pSFrom->pWindow.get())->GetHighlightedItem();
         else
-        {
-            pWin->StartPopupMode( aRect, nPopupModeFlags | 
FloatWinPopupFlags::GrabFocus );
-        }
-        if( pSFrom )
-        {
-            sal_uInt16 aPos;
-            if (pSFrom->IsMenuBar())
-                aPos = static_cast<MenuBarWindow 
*>(pSFrom->pWindow.get())->GetHighlightedItem();
-            else
-                aPos = static_cast<MenuFloatingWindow 
*>(pSFrom->pWindow.get())->GetHighlightedItem();
+            aPos = static_cast<MenuFloatingWindow 
*>(pSFrom->pWindow.get())->GetHighlightedItem();
 
-            pWin->SetPosInParent( aPos );  // store position to be sent in 
SUBMENUDEACTIVATE
-            pSFrom->ImplCallEventListeners( VclEventId::MenuSubmenuActivate, 
aPos );
-        }
+        pWin->SetPosInParent(aPos);  // store position to be sent in 
SUBMENUDEACTIVATE
+        pSFrom->ImplCallEventListeners(VclEventId::MenuSubmenuActivate, aPos);
     }
+
     if ( bPreSelectFirst )
     {
-        size_t nCount = pItemList->size();
-        for ( size_t n = 0; n < nCount; n++ )
+        for (size_t n = 0; n < static_cast<size_t>(GetItemCount()); n++)
         {
             MenuItemData* pData = pItemList->GetDataFromPos( n );
             if (  (  pData->bEnabled
@@ -2968,22 +2965,30 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
                && ImplIsSelectable( n )
                )
             {
-                pWin->ChangeHighlightItem( n, false );
+                pWin->ChangeHighlightItem(n, false);
                 break;
             }
         }
     }
-    if ( bRealExecute )
-    {
+
+    if (bRealExecute)
         pWin->Execute();
-        if (pWin->isDisposed())
-            return 0;
 
-        xFocusId = pWin->GetFocusId();
+    return false;
+}
+
+void PopupMenu::FinishRun(const VclPtr<MenuFloatingWindow>& pWin, const 
VclPtr<vcl::Window>& pParentWin, const bool bRealExecute, const bool 
bIsNativeMenu)
+{
+    if (!bRealExecute || pWin->isDisposed())
+        return;
+
+    if (!bIsNativeMenu)
+    {
+        VclPtr<vcl::Window> xFocusId = pWin->GetFocusId();
         assert(xFocusId == nullptr && "Focus should already be restored by 
MenuFloatingWindow::End");
         pWin->ImplEndPopupMode(FloatWinPopupEndFlags::NONE, xFocusId);
 
-        if ( nSelectedId )  // then clean up .. ( otherwise done by TH )
+        if (nSelectedId)  // then clean up .. ( otherwise done by TH )
         {
             PopupMenu* pSub = pWin->GetActivePopup();
             while ( pSub )
@@ -2992,13 +2997,29 @@ sal_uInt16 PopupMenu::ImplExecute( const 
VclPtr<vcl::Window>& pW, const tools::R
                 pSub = pSub->ImplGetFloatingWindow()->GetActivePopup();
             }
         }
-        pWin->doShutdown();
-        pWindow.disposeAndClear();
-        ImplClosePopupToolBox(pW);
-        ImplFlushPendingSelect();
     }
+    else
+        pWin->StopExecute();
 
-    return bRealExecute ? nSelectedId : 0;
+    pWin->doShutdown();
+    pWindow.disposeAndClear();
+    ImplClosePopupToolBox(pParentWin);
+    ImplFlushPendingSelect();
+}
+
+sal_uInt16 PopupMenu::ImplExecute(const VclPtr<vcl::Window>& pParentWin, const 
tools::Rectangle& rRect,
+                                  FloatWinPopupFlags nPopupModeFlags, Menu* 
pSFrom, bool bPreSelectFirst)
+{
+    // tdf#126054 hold this until after function completes
+    VclPtr<PopupMenu> xThis(this);
+    bool bRealExecute = false;
+    tools::Rectangle aRect(rRect);
+    VclPtr<MenuFloatingWindow> pWin;
+    if (!PrepareRun(pParentWin, aRect, nPopupModeFlags, pSFrom, bRealExecute, 
pWin))
+        return 0;
+    const bool bNative = Run(pWin, bRealExecute, bPreSelectFirst, 
nPopupModeFlags, pSFrom, aRect);
+    FinishRun(pWin, pParentWin, bRealExecute, bNative);
+    return nSelectedId;
 }
 
 sal_uInt16 PopupMenu::ImplCalcVisEntries( tools::Long nMaxHeight, sal_uInt16 
nStartEntry, sal_uInt16* pLastVisible ) const
commit 6453a0199278f3257dd0b9c53d2351a3076538b1
Author:     Thorsten Behrens <thorsten.behr...@allotropia.de>
AuthorDate: Sat Nov 13 23:12:58 2021 +0100
Commit:     Jan-Marek Glogowski <glo...@fbihome.de>
CommitDate: Fri Jan 28 13:14:21 2022 +0100

    WASM default to notebookbar
    
    ..and use the full, desktop variant..
    
    Change-Id: Ib00aad8cd130b4a3433209c540fe82970c45c98e

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index f9b1d3e0ea96..c8224ca02b43 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -6394,7 +6394,11 @@ static void activateNotebookbar(std::u16string_view rApp)
 
     if (aAppNode.isValid())
     {
+#ifdef EMSCRIPTEN
+        aAppNode.setNodeValue("Active", makeAny(OUString("notebookbar.ui")));
+#else
         aAppNode.setNodeValue("Active", 
makeAny(OUString("notebookbar_online.ui")));
+#endif
         aAppNode.commit();
     }
 }
@@ -6433,7 +6437,11 @@ static int lo_initialize(LibreOfficeKit* pThis, const 
char* pAppPath, const char
     static bool bPreInited = false;
     static bool bUnipoll = false;
     static bool bProfileZones = false;
+#ifdef EMSCRIPTEN
+    static bool bNotebookbar = true;
+#else
     static bool bNotebookbar = false;
+#endif
 
     { // cf. string lifetime for preinit
         std::vector<OUString> aOpts;
commit 73a1064275d3116fa800224108f6379feeee3a98
Author:     Jan-Marek Glogowski <glo...@fbihome.de>
AuthorDate: Mon Dec 6 09:24:50 2021 +0100
Commit:     Jan-Marek Glogowski <glo...@fbihome.de>
CommitDate: Fri Jan 28 13:14:21 2022 +0100

    gbuild: build static unit tests
    
    While this generally works, the setup is not very practical. The
    unit tests become all very large, if they use components. The best
    static solution I can imagine is either just somehow linking them
    on demand, or create a single huge liblibreoffice.so, so keeping
    everthing almost static.
    
    Change-Id: If00f9ac3b3f63b915e3b5dcd931d233681a58006

diff --git a/Repository.mk b/Repository.mk
index 2aa547a078cd..1758b89d82dd 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -32,7 +32,7 @@ $(eval $(call gb_Helper_register_executables,NONE, \
        cfgex \
        concat-deps \
        cpp \
-       cppunittester \
+    $(call gb_CondCppunitMainLibOrExe,,cppunittester) \
        gbuildtojson \
        $(if $(filter MSC,$(COM)), \
                gcc-wrapper \
@@ -580,6 +580,7 @@ $(eval $(call gb_Helper_register_libraries,PLAINLIBS_NONE, \
        $(if $(filter MSC,$(COM)),cli_cppuhelper) \
        $(if $(filter $(OS),ANDROID),lo-bootstrap) \
        $(if $(filter $(OS),MACOSX),OOoSpotlightImporter) \
+    $(call gb_CondCppunitMainLibOrExe,cppunitmain) \
 ))
 
 $(eval $(call gb_Helper_register_libraries_for_install,PLAINLIBS_URE,ure, \
diff --git a/sal/Library_cppunitmain.mk b/sal/Library_cppunitmain.mk
new file mode 100644
index 000000000000..07f51e0c4821
--- /dev/null
+++ b/sal/Library_cppunitmain.mk
@@ -0,0 +1,42 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+#
+# 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/.
+#
+
+$(eval $(call gb_Library_Library,cppunitmain))
+
+$(eval $(call gb_Library_set_include,cppunitmain,\
+    $$(INCLUDE) \
+    -I$(SRCDIR)/sal/inc \
+))
+
+$(eval $(call gb_Library_use_libraries,cppunitmain,\
+    sal \
+    unoexceptionprotector \
+    unobootstrapprotector \
+    vclbootstrapprotector \
+))
+
+$(eval $(call gb_Library_use_externals,cppunitmain,\
+    boost_headers \
+    cppunit \
+))
+
+$(eval $(call gb_Library_add_exception_objects,cppunitmain,\
+    sal/cppunittester/cppunittester \
+))
+
+ifeq ($(COM),MSC)
+
+$(eval $(call gb_Library_add_ldflags,cppunitmain,\
+    /STACK:10000000 \
+))
+
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/sal/Module_sal.mk b/sal/Module_sal.mk
index e0448a5085bf..6c18d6282977 100644
--- a/sal/Module_sal.mk
+++ b/sal/Module_sal.mk
@@ -10,7 +10,7 @@
 $(eval $(call gb_Module_Module,sal))
 
 $(eval $(call gb_Module_add_targets,sal,\
-       $(if $(CROSS_COMPILING),,$(if $(filter 
TRUE,$(DISABLE_DYNLOADING)),,Executable_cppunittester)) \
+    $(call 
gb_CondCppunitMainLibOrExe,Library_cppunitmain,Executable_cppunittester) \
        $(if $(filter $(OS),ANDROID), \
                Library_lo-bootstrap) \
        Library_sal \
diff --git a/sal/cppunittester/cppunittester.cxx 
b/sal/cppunittester/cppunittester.cxx
index 5b886ea2189d..e1fcf84c255f 100644
--- a/sal/cppunittester/cppunittester.cxx
+++ b/sal/cppunittester/cppunittester.cxx
@@ -230,13 +230,17 @@ class CPPUNIT_API ProtectedFixtureFunctor
 {
 private:
     const std::string &testlib;
+#ifndef DISABLE_DYNLOADING
     const std::string &args;
+#endif
     std::vector<CppUnit::Protector *> &protectors;
     CppUnit::TestResult &result;
 public:
     ProtectedFixtureFunctor(const std::string& testlib_, const std::string 
&args_, std::vector<CppUnit::Protector*> &protectors_, CppUnit::TestResult 
&result_)
         : testlib(testlib_)
+#ifndef DISABLE_DYNLOADING
         , args(args_)
+#endif
         , protectors(protectors_)
         , result(result_)
     {
diff --git a/solenv/gbuild/Conditions.mk b/solenv/gbuild/Conditions.mk
index 0a7b88969557..4cb5688997e9 100644
--- a/solenv/gbuild/Conditions.mk
+++ b/solenv/gbuild/Conditions.mk
@@ -12,6 +12,10 @@
 # just end in two (!) braces, otherwise you may need to use either the $(1)
 # or the $(2) multiple times.
 
+define gb_CondCppunitMainLibOrExe
+$(if $(or $(CROSS_COMPILING),$(DISABLE_DYNLOADING)),$(1),$(2))
+endef
+
 define gb_CondExeLockfile
 $(if $(and $(filter-out ANDROID MACOSX iOS WNT,$(OS))),$(1),$(2))
 endef
diff --git a/solenv/gbuild/CppunitTest.mk b/solenv/gbuild/CppunitTest.mk
index 7fc1cd79c12d..eeba150d0275 100644
--- a/solenv/gbuild/CppunitTest.mk
+++ b/solenv/gbuild/CppunitTest.mk
@@ -21,6 +21,7 @@
 
 gb_CppunitTest_UNITTESTFAILED ?= 
$(GBUILDDIR)/platform/unittest-failed-default.sh
 gb_CppunitTest_PYTHONDEPS ?= $(call gb_Library_get_target,pyuno_wrapper) $(if 
$(SYSTEM_PYTHON),,$(call gb_Package_get_target,python3))
+gb_CppunitTest_KNOWN :=
 
 ifneq ($(strip $(CPPUNITTRACE)),)
 ifneq ($(filter gdb,$(CPPUNITTRACE)),)
@@ -70,8 +71,13 @@ endif
 
 # defined by platform
 #  gb_CppunitTest_get_filename
+ifeq (,$(DISABLE_DYNLOADING))
 gb_CppunitTest_RUNTIMEDEPS := $(call 
gb_Executable_get_runtime_dependencies,cppunittester)
 gb_CppunitTest_CPPTESTCOMMAND := $(call 
gb_Executable_get_target_for_build,cppunittester)
+else
+gb_CppunitTest_RUNTIMEDEPS :=
+gb_CppunitTest_CPPTESTCOMMAND :=
+endif
 
 # i18npool dlopens localedata_* libraries.
 gb_CppunitTest_RUNTIMEDEPS += \
@@ -198,6 +204,11 @@ $(call gb_CppunitTest_get_target,$(1)) : HEADLESS := 
--headless
 $(call gb_CppunitTest_get_target,$(1)) : EXTRA_ENV_VARS :=
 $$(eval $$(call gb_Module_register_target,$(call 
gb_CppunitTest_get_target,$(1)),$(call gb_CppunitTest_get_clean_target,$(1))))
 $(call gb_Helper_make_userfriendly_targets,$(1),CppunitTest)
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+$$(eval $$(call gb_CppunitTest_use_libraries,$(1),cppunitmain))
+$$(eval $$(call gb_CppunitTest_add_defs,$(1),-D__EMSCRIPTEN__))
+endif
+$(if $(filter $(1),$(gb_CppunitTest_KNOWN)),,gb_CppunitTest_KNOWN += $(1))
 
 endef
 
diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk
index 32d7eed72ec0..253e01acf5fd 100644
--- a/solenv/gbuild/TargetLocations.mk
+++ b/solenv/gbuild/TargetLocations.mk
@@ -53,6 +53,7 @@ gb_CompilerTest_get_target = $(WORKDIR)/CompilerTest/$(1)
 gb_ComponentTarget_get_target = $(WORKDIR)/ComponentTarget/$(1).component
 gb_ComponentTarget_get_target_for_build = 
$(WORKDIR_FOR_BUILD)/ComponentTarget/$(1).component
 gb_Configuration_get_preparation_target = 
$(WORKDIR)/Configuration/$(1).prepared
+gb_CppunitTest_get_linktargetfile = $(call gb_LinkTarget_get_target,$(call 
gb_CppunitTest_get_linktarget,$1))
 gb_CppunitTest_get_target = $(WORKDIR)/CppunitTest/$(1).test
 gb_CustomPackage_get_target = $(WORKDIR)/CustomPackage/$(1).filelist
 gb_CustomTarget_get_repo_target = $(WORKDIR)/CustomTarget/$(2)_$(1).done
diff --git a/solenv/gbuild/extensions/post_SpeedUpTargets.mk 
b/solenv/gbuild/extensions/post_SpeedUpTargets.mk
index 3db6355ab90d..6fcbe243a01f 100644
--- a/solenv/gbuild/extensions/post_SpeedUpTargets.mk
+++ b/solenv/gbuild/extensions/post_SpeedUpTargets.mk
@@ -52,7 +52,6 @@ endif
 
 endif
 
-
 ifneq (,$(filter build,$(gb_Module_SKIPTARGETS)))
 gb_Module_add_target =
 endif
diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
index dcfa05337843..7f7363ebb85c 100644
--- a/solenv/gbuild/gbuild.mk
+++ b/solenv/gbuild/gbuild.mk
@@ -283,6 +283,7 @@ gb_TEST_ENV_VARS += 
SAL_DISABLE_SYNCHRONOUS_PRINTER_DETECTION=1
 ifeq (,$(SAL_USE_VCLPLUGIN))
 gb_TEST_ENV_VARS += SAL_USE_VCLPLUGIN=svp
 endif
+gb_TEST_ENV_VARS += STATIC_UNO_HOME=file://$$I/program
 
 # This is used to detect whether LibreOffice is being built (as opposed to 
building
 # 3rd-party code). Used for tag deprecation for API we want to
diff --git a/solenv/gbuild/platform/unxgcc.mk b/solenv/gbuild/platform/unxgcc.mk
index c70e3ce222bb..9ca593154d38 100644
--- a/solenv/gbuild/platform/unxgcc.mk
+++ b/solenv/gbuild/platform/unxgcc.mk
@@ -313,12 +313,18 @@ endef
 
 gb_CppunitTest_CPPTESTPRECOMMAND := \
     $(call 
gb_Helper_extend_ld_path,$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs)
-gb_CppunitTest_get_filename = libtest_$(1).so
+ifeq (,$(DISABLE_DYNLOADING))
+gb_CppunitTest_get_filename = libtest_$(1)$(gb_Library_PLAINEXT)
+else
+gb_CppunitTest_get_filename = test_$(1)$(gb_Executable_EXT)
+endif
 gb_CppunitTest_get_ilibfilename = $(gb_CppunitTest_get_filename)
 gb_CppunitTest_malloc_check := -ex 'set environment MALLOC_CHECK_=2; set 
environment MALLOC_PERTURB_=153'
 
 define gb_CppunitTest_CppunitTest_platform
+ifeq (,$(DISABLE_DYNLOADING))
 $(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call 
gb_Library__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,NONE))
+endif
 
 endef
 
diff --git a/solenv/gbuild/static.mk b/solenv/gbuild/static.mk
index faa9a73db516..1b7f0214900a 100644
--- a/solenv/gbuild/static.mk
+++ b/solenv/gbuild/static.mk
@@ -198,6 +198,8 @@ $(foreach lib,$(gb_Library_KNOWNLIBS), \
     $(eval $(call gb_LinkTarget__fill_all_deps,$(call 
gb_Library_get_linktarget,$(lib)))))
 $(foreach exec,$(gb_Executable_KNOWN), \
     $(eval $(call gb_LinkTarget__expand_executable,$(call 
gb_Executable_get_linktarget,$(exec)))))
+$(foreach cppunit,$(gb_CppunitTest_KNOWN), \
+    $(eval $(call gb_LinkTarget__expand_executable,$(call 
gb_CppunitTest_get_linktarget,$(cppunit)))))
 $(foreach workdir_linktargetname,$(gb_LinkTarget__ALL_TOUCHED), \
     $(eval $(call gb_LinkTarget__remove_touch,$(workdir_linktargetname))))
 
@@ -235,11 +237,14 @@ endef
 endef # gb_LinkTarget__expand_executable_template
 
 ifneq (,$(gb_DEBUG_STATIC))
+$(info $(call gb_LinkTarget__expand_executable_template,CppunitTest))
 $(info $(call gb_LinkTarget__expand_executable_template,Executable))
 endif
+$(eval $(call gb_LinkTarget__expand_executable_template,CppunitTest))
 $(eval $(call gb_LinkTarget__expand_executable_template,Executable))
 
 $(foreach exec,$(gb_Executable_KNOWN),$(eval $(call 
gb_Executable__expand_deps,$(exec))))
+$(foreach cppunit,$(gb_CppunitTest_KNOWN),$(eval $(call 
gb_CppunitTest__expand_deps,$(cppunit))))
 
 endif # gb_PARTIAL_BUILD
 endif # gb_FULLDEPS
commit 03d3445c59b14e41f2a23f0a43bd9bc0adb7f8c3
Author:     Jan-Marek Glogowski <glo...@fbihome.de>
AuthorDate: Sat Jan 8 22:53:29 2022 +0100
Commit:     Jan-Marek Glogowski <glo...@fbihome.de>
CommitDate: Fri Jan 28 13:14:21 2022 +0100

    gbuild: set unorc lookup dir via environment
    
    UNO tries hard to find the path of the executable to look at that
    place for its unorc / uno.ini. All these approaches don't work for
    static binaries, so just override the lookup with the environment
    variable STATIC_UNO_HOME.
    
    Change-Id: I0d80c91e474d9f869475ba752d708b77c99f8a56

diff --git a/Makefile.in b/Makefile.in
index 300469aa0d5e..015fa183fd66 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -7,6 +7,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 #
 
+unexport STATIC_UNO_HOME
+
 gb_Top_MODULE_CHECK_TARGETS := slowcheck unitcheck subsequentcheck perfcheck 
uicheck screenshot
 
 .PHONY : check-if-root bootstrap gbuild build build-non-l10n-only 
build-l10n-only check clean clean-build clean-host test-install distclean 
distro-pack-install docs download etags fetch get-submodules id install 
install-gdb-printers install-strip tags debugrun help showmodules translations 
packageinfo internal.clean $(gb_Top_MODULE_CHECK_TARGETS)
diff --git a/bin/run b/bin/run
index 523da3c0e178..f812c2baadbb 100755
--- a/bin/run
+++ b/bin/run
@@ -67,6 +67,8 @@ else
 
 fi
 
+test "${STATIC_UNO_HOME+set}" = set || export 
STATIC_UNO_HOME="file://${dir}/instdir/program"
+
 # echo "setting URE_BOOTSTRAP to: ${URE_BOOTSTRAP}"
 # echo "setting search path to: ${SEARCH_PATH}"
 # echo "execing: ${exedir}/$1"
diff --git a/cppuhelper/source/paths.cxx b/cppuhelper/source/paths.cxx
index d2f37bb549a7..217e2119ad2c 100644
--- a/cppuhelper/source/paths.cxx
+++ b/cppuhelper/source/paths.cxx
@@ -20,12 +20,14 @@
 #include <config_folders.h>
 
 #include <sal/config.h>
+#include <sal/log.hxx>
 
 #include <cassert>
 
 #include <com/sun/star/uno/DeploymentException.hpp>
 #include <osl/file.hxx>
 #include <osl/module.hxx>
+#include <osl/thread.h>
 #include <rtl/ustring.hxx>
 #include <sal/types.h>
 
@@ -64,7 +66,16 @@ OUString cppu::getUnoIniUri() {
 #elif defined(EMSCRIPTEN)
     OUString uri("file:///instdir/program");
 #else
-    OUString uri(get_this_libpath());
+
+    OUString uri;
+#ifdef DISABLE_DYNLOADING
+    static const char* uno_home = getenv("STATIC_UNO_HOME");
+    if (uno_home)
+        uri = OStringToOUString(uno_home, osl_getThreadTextEncoding());
+    else
+#endif
+        uri = get_this_libpath();
+
 #ifdef MACOSX
     // We keep the URE dylibs directly in "Frameworks" (that is, 
LIBO_LIB_FOLDER) and unorc in
     // "Resources/ure/etc" (LIBO_URE_ETC_FOLDER).
@@ -74,7 +85,9 @@ OUString cppu::getUnoIniUri() {
     }
 #endif
 #endif
-    return uri + "/" SAL_CONFIGFILE("uno");
+    uri += "/" SAL_CONFIGFILE("uno");
+    SAL_INFO("cppuhelper", "expected uno config: " << uri);
+    return uri;
 }
 
 bool cppu::nextDirectoryItem(osl::Directory & directory, OUString * url) {
diff --git a/desktop/scripts/soffice.sh b/desktop/scripts/soffice.sh
index 67cc0b89751f..1bfb60682648 100755
--- a/desktop/scripts/soffice.sh
+++ b/desktop/scripts/soffice.sh
@@ -176,6 +176,8 @@ else
     unset LC_ALL
 fi
 
+test "${STATIC_UNO_HOME+set}" = set || export 
STATIC_UNO_HOME="file://${sd_prog}"
+
 # run soffice.bin directly when you want to get the backtrace
 if [ -n "$GDBTRACECHECK" ] ; then
     exec $GDBTRACECHECK "$sd_prog/soffice.bin" "$@"
commit e863b90a0e5fc90c3b824e4b0012f9389b87a3ac
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Thu Jan 27 20:38:33 2022 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Fri Jan 28 09:52:08 2022 +0100

    ofz: Undefined-Shift
    
    Change-Id: Ib935359071ef9e390aa3d6c9713ed48241ad18e6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129066
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/lotuswordpro/source/filter/lwpdrawobj.cxx 
b/lotuswordpro/source/filter/lwpdrawobj.cxx
index 1ad3a5329002..ad14a778d2cb 100644
--- a/lotuswordpro/source/filter/lwpdrawobj.cxx
+++ b/lotuswordpro/source/filter/lwpdrawobj.cxx
@@ -1392,7 +1392,7 @@ void LwpDrawBitmap::Read()
             throw BadRead();
 
         N = aInfoHeader2.nPlanes * aInfoHeader2.nBitCount;
-        if (N == 24)
+        if (N >= 16)
         {
             rgbTableSize = 0;
         }
@@ -1412,7 +1412,7 @@ void LwpDrawBitmap::Read()
             throw BadRead();
 
         N = aInfoHeader2.nPlanes * aInfoHeader2.nBitCount;
-        if (N == 24)
+        if (N >= 16)
         {
             rgbTableSize = 0;
         }
commit e3efba0f8187251cef8cb29c00a7eee5930ec70f
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Thu Jan 27 20:27:19 2022 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Fri Jan 28 09:50:44 2022 +0100

    use mktemp for outdir
    
    Change-Id: I2aa04ab31c0966167dee47b1c0ea6d2228e262da
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129065
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/setup_native/scripts/langpackscript.sh 
b/setup_native/scripts/langpackscript.sh
index 4f0dd548467b..1a6bb39a3d48 100644
--- a/setup_native/scripts/langpackscript.sh
+++ b/setup_native/scripts/langpackscript.sh
@@ -108,8 +108,7 @@ esac
 
 # Unpacking
 
-outdir=/var/tmp/install_$$
-mkdir $outdir
+outdir=`mktemp -d -p /var/tmp`
 
 #diskSpace=`df -k $outdir | $tail_prog -1 | awk '{if ( $4 ~ /%/) { print $3 } 
else { print $4 } }'`
 #if [ $diskSpace -lt $diskSpaceRequired ]; then
commit 5a67220831b994c4ecb83d93333eb76bffb88015
Author:     Armin Le Grand (Allotropia) <armin.le.gr...@me.com>
AuthorDate: Wed Jan 26 18:02:27 2022 +0100
Commit:     Armin Le Grand <armin.le.gr...@me.com>
CommitDate: Fri Jan 28 09:45:35 2022 +0100

    tdf#126319 Correct area(s) on selection export
    
    For shapes like TextFrames the export of the selected
    object(s) to Bitmap needed to be adapted. It should
    not reduce to minimal geometric necessary size.
    
    While reduction seems good initially as an idea this
    may change aspect ratio and expected size of the result
    by cutting off visually empty areas, e.g. the text
    distance areas to the shape's logical bounds.
    
    This also needed to be adapted to multi-selections
    accordingly.
    
    Change-Id: I85bffe60fcfc2e8da87f69936af30f64c26deead
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129002
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <armin.le.gr...@me.com>

diff --git a/svx/source/unodraw/UnoGraphicExporter.cxx 
b/svx/source/unodraw/UnoGraphicExporter.cxx
index 823beeaaea79..6c158e936684 100644
--- a/svx/source/unodraw/UnoGraphicExporter.cxx
+++ b/svx/source/unodraw/UnoGraphicExporter.cxx
@@ -224,25 +224,29 @@ namespace {
                 const Size aHalfPixelInMtf(
                     (aOnePixelInMtf.getWidth() + 1) / 2,
                     (aOnePixelInMtf.getHeight() + 1) / 2);
-                const bool bHairlineBR(
-                    !aHairlineRect.IsEmpty() && (aRect.Right() == 
aHairlineRect.Right() || aRect.Bottom() == aHairlineRect.Bottom()));
 
-                // Move the content to (0,0), usually TopLeft ist slightly
-                // negative. For better visualization, add a half pixel, too
+                // tdf#126319 take bounds into account individually
+                const bool bHairlineRight(!aHairlineRect.IsEmpty() && 
aRect.Right() == aHairlineRect.Right());
+                const bool bHairlineBottom(!aHairlineRect.IsEmpty() && 
aRect.Bottom() == aHairlineRect.Bottom());
+                const bool bHairlineLeft(!aHairlineRect.IsEmpty() && 
aRect.Left() == aHairlineRect.Left());
+                const bool bHairlineTop(!aHairlineRect.IsEmpty() && 
aRect.Top() == aHairlineRect.Top());
+
+                // tdf#126319 Move the content dependent on Top/Left hairline
                 aMtf.Move(
-                    aHalfPixelInMtf.getWidth() - aRect.Left(),
-                    aHalfPixelInMtf.getHeight() - aRect.Top());
+                    (bHairlineLeft ? -aHalfPixelInMtf.getWidth() : 
aHalfPixelInMtf.getWidth()),
+                    (bHairlineTop ? -aHalfPixelInMtf.getHeight() : 
aHalfPixelInMtf.getHeight()));
 
                 // Do not Scale, but set the PrefSize. Some levels deeper the
                 // MetafilePrimitive will add a mapping to the decomposition
                 // (and possibly a clipping) to map the graphic content to
                 // a unit coordinate system.
-                // Size is the measured size plus one pixel if needed 
(bHairlineBR)
-                // and the moved half pixwel from above
+                // tdf#126319 Size is the previous already correct size plus 
one
+                // pixel if needed (dependent on Righ/Bottom hairline) and the
+                // already moved half pixel from above
                 aMtf.SetPrefSize(
                     Size(
-                        aRect.getWidth() + (bHairlineBR ? 
aOnePixelInMtf.getWidth() : 0) + aHalfPixelInMtf.getWidth(),
-                        aRect.getHeight() + (bHairlineBR ? 
aOnePixelInMtf.getHeight() : 0) + aHalfPixelInMtf.getHeight()));
+                        aMtf.GetPrefSize().Width() + (bHairlineRight ? 
aHalfPixelInMtf.getWidth() : 0),
+                        aMtf.GetPrefSize().Height() + (bHairlineBottom ? 
aHalfPixelInMtf.getHeight() : 0)));
             }
 
             return convertMetafileToBitmapEx(aMtf, aRange, 
nMaximumQuadraticPixels);
commit 2d603914d8162317b0ee7b77a73585c32bceb6da
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Thu Jan 27 15:55:40 2022 +0000
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Fri Jan 28 09:33:59 2022 +0100

    use mktemp for UNPACKDIR
    
    Change-Id: If87fb28193f42e60419aa30b5ba7e4af6e05bbcf
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129057
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/setup_native/scripts/install_linux.sh 
b/setup_native/scripts/install_linux.sh
index d2b10e88959a..9540a505e974 100644
--- a/setup_native/scripts/install_linux.sh
+++ b/setup_native/scripts/install_linux.sh
@@ -66,9 +66,7 @@ try_to_unpack_languagepack_file()
   echo "Unpacking shell script $FILENAME"
   TAILLINE=`head --lines=20 $FILENAME | sed --quiet 's/linenum=//p'`
 
-  UNPACKDIR=/var/tmp/install_$$
-  mkdir $UNPACKDIR
-  # UNPACKDIR=`mktemp -d`
+  UNPACKDIR=`mktemp -d -p /var/tmp`
   tail -n +$TAILLINE $FILENAME | gunzip | (cd $UNPACKDIR; tar xvf -)
 
   # Setting the new package path, in which the packages exist
commit 7517fc118a1a230ff59f6c629316a8e7e1282dff
Author:     Tor Lillqvist <t...@collabora.com>
AuthorDate: Thu Jan 27 13:07:53 2022 +0200
Commit:     Tor Lillqvist <t...@collabora.com>
CommitDate: Fri Jan 28 09:33:46 2022 +0100

    Enable pasting PDF into Impress
    
    Just like when doing Insert>Image... of a PDF file, you get a bitmap
    of the rendering of the first page of the PDF, not separately editable
    shapes or text. The pasted PDF document is included when exporting to
    .odp at least, just like for Insert>Image...
    
    I don't know how common or easy it is on Windows or various Linux
    desktops to have PDF format data on the clipboard, but at least on
    macOS, if you select a rectangle of a PDF document viewed in the
    Preview app, and do Edit>Copy, a PDF document is put on the
    pasteboard. (Preview also puts a TIFF rendering of the selection on
    the pasteboard, but for some reason that is of ridiculously low
    resolution. That is what used to get pasted into Impress previously.)
    
    Change-Id: Ic4b29deb12609dd839d8578779600156ff1ec48b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129049
    Tested-by: Jenkins
    Reviewed-by: Tor Lillqvist <t...@collabora.com>

diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx
index 5008c8d8ddd4..5b0fcc424313 100644
--- a/sd/source/ui/view/sdview3.cxx
+++ b/sd/source/ui/view/sdview3.cxx
@@ -40,7 +40,9 @@
 #include <svx/unomodel.hxx>
 #include <svx/ImageMapInfo.hxx>
 #include <unotools/streamwrap.hxx>
+#include <vcl/graph.hxx>
 #include <vcl/metaact.hxx>
+#include <vcl/pdfread.hxx>
 #include <vcl/TypeSerializer.hxx>
 #include <svx/svxids.hrc>
 #include <toolkit/helper/vclunohelper.hxx>
@@ -680,6 +682,29 @@ bool View::InsertData( const TransferableDataHelper& 
rDataHelper,
        }
     }
 
+    if(!bReturn && CHECK_FORMAT_TRANS( SotClipboardFormatId::PDF ))
+    {
+        ::tools::SvRef<SotTempStream> xStm;
+        if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::PDF, xStm ) 
)
+        {
+            Point aInsertPos(rPos);
+            Graphic aGraphic;
+            if (vcl::ImportPDF(*xStm, aGraphic))
+            {
+                std::unique_ptr<sal_uInt8[]> pGraphicContent;
+
+                const sal_Int32 nGraphicContentSize(xStm->Tell());
+                pGraphicContent.reset(new sal_uInt8[nGraphicContentSize]);
+                xStm->Seek(0);
+                xStm->ReadBytes(pGraphicContent.get(), nGraphicContentSize);
+                
aGraphic.SetGfxLink(std::make_shared<GfxLink>(std::move(pGraphicContent), 
nGraphicContentSize, GfxLinkType::NativePdf));
+
+                InsertGraphic(aGraphic, mnAction, aInsertPos, nullptr, 
nullptr);
+                bReturn = true;
+            }
+        }
+    }
+
     if(!bReturn && CHECK_FORMAT_TRANS( SotClipboardFormatId::DRAWING ))
     {
         ::tools::SvRef<SotTempStream> xStm;
commit 00e28abcd33f7a52539cb0250b1cadcaf22f8f35
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Wed Jan 26 21:04:19 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Fri Jan 28 09:04:55 2022 +0100

    use more concrete types in chart2, BaseCoordinateSystem
    
    Change-Id: Ieb815775e069dd0d2cc36a2ab97b318e3b9f7a1b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129056
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/chart2/source/controller/chartapiwrapper/GridWrapper.cxx 
b/chart2/source/controller/chartapiwrapper/GridWrapper.cxx
index 0cf33baa5848..b2474e236260 100644
--- a/chart2/source/controller/chartapiwrapper/GridWrapper.cxx
+++ b/chart2/source/controller/chartapiwrapper/GridWrapper.cxx
@@ -133,7 +133,7 @@ Reference< beans::XPropertySet > 
GridWrapper::getInnerPropertySet()
     try
     {
         rtl::Reference< ::chart::Diagram > xDiagram( 
m_spChart2ModelContact->getDiagram() );
-        uno::Reference< XCoordinateSystem > xCooSys( 
AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 /*nCooSysIndex*/ ) );
+        rtl::Reference< BaseCoordinateSystem > xCooSys( 
AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 /*nCooSysIndex*/ ) );
 
         sal_Int32 nDimensionIndex = 1;
         bool bSubGrid = false;
diff --git a/chart2/source/controller/inc/SeriesOptionsItemConverter.hxx 
b/chart2/source/controller/inc/SeriesOptionsItemConverter.hxx
index c658b08fa7dc..f9bc42dcc42d 100644
--- a/chart2/source/controller/inc/SeriesOptionsItemConverter.hxx
+++ b/chart2/source/controller/inc/SeriesOptionsItemConverter.hxx
@@ -26,6 +26,7 @@ namespace com::sun::star::chart2 { class XCoordinateSystem; }
 namespace com::sun::star::frame { class XModel; }
 namespace com::sun::star::uno { class XComponentContext; }
 namespace chart { class ChartModel; }
+namespace chart { class BaseCoordinateSystem; }
 
 namespace chart::wrapper
 {
@@ -66,7 +67,7 @@ private:
     sal_Int32 m_nStartingAngle;
 
     bool m_bClockwise;
-    css::uno::Reference< css::chart2::XCoordinateSystem > m_xCooSys;
+    rtl::Reference< ::chart::BaseCoordinateSystem > m_xCooSys;
 
     css::uno::Sequence< sal_Int32 > m_aSupportedMissingValueTreatments;
     sal_Int32 m_nMissingValueTreatment;
diff --git a/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx 
b/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx
index 878f3bc4f247..e4a1df261ff2 100644
--- a/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx
+++ b/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx
@@ -434,7 +434,7 @@ void AxisItemConverter::FillSpecialItem( sal_uInt16 
nWhichId, SfxItemSet & rOutI
 
         case SCHATTR_AXIS_ALLOW_DATEAXIS:
         {
-            Reference< chart2::XCoordinateSystem > xCooSys(
+            rtl::Reference< BaseCoordinateSystem > xCooSys(
                 AxisHelper::getCoordinateSystemOfAxis( m_xAxis, 
ChartModelHelper::findDiagram( m_xChartDoc ) ) );
             sal_Int32 nDimensionIndex=0; sal_Int32 nAxisIndex=0;
             AxisHelper::getIndicesForAxis(m_xAxis, xCooSys, nDimensionIndex, 
nAxisIndex );
@@ -716,7 +716,7 @@ bool AxisItemConverter::ApplySpecialItem( sal_uInt16 
nWhichId, const SfxItemSet
                     if( !AxisHelper::isAxisPositioningEnabled() )
                     {
                         //keep old and new settings for axis positioning in 
sync somehow
-                        Reference< chart2::XCoordinateSystem > xCooSys( 
AxisHelper::getCoordinateSystemOfAxis(
+                        rtl::Reference< BaseCoordinateSystem > xCooSys( 
AxisHelper::getCoordinateSystemOfAxis(
                             m_xAxis, ChartModelHelper::findDiagram( 
m_xChartDoc ) ) );
 
                         sal_Int32 nDimensionIndex=0;
@@ -793,7 +793,7 @@ bool AxisItemConverter::ApplySpecialItem( sal_uInt16 
nWhichId, const SfxItemSet
 
                 //keep old and new settings for axis positioning in sync 
somehow
                 {
-                    Reference< chart2::XCoordinateSystem > xCooSys( 
AxisHelper::getCoordinateSystemOfAxis(
+                    rtl::Reference< BaseCoordinateSystem > xCooSys( 
AxisHelper::getCoordinateSystemOfAxis(
                         m_xAxis, ChartModelHelper::findDiagram( m_xChartDoc ) 
) );
 
                     sal_Int32 nDimensionIndex=0;
diff --git a/chart2/source/inc/AxisHelper.hxx b/chart2/source/inc/AxisHelper.hxx
index 8cb148f393a6..4e2480a65eee 100644
--- a/chart2/source/inc/AxisHelper.hxx
+++ b/chart2/source/inc/AxisHelper.hxx
@@ -59,7 +59,7 @@ public:
 
     static sal_Int32 getExplicitNumberFormatKeyForAxis(
                   const css::uno::Reference< css::chart2::XAxis >& xAxis
-                , const css::uno::Reference< css::chart2::XCoordinateSystem >& 
xCorrespondingCoordinateSystem
+                , const rtl::Reference< ::chart::BaseCoordinateSystem >& 
xCorrespondingCoordinateSystem
                 , const rtl::Reference< ::chart::ChartModel>& xChartDoc
                 , bool bSearchForParallelAxisIfNothingIsFound );
 
@@ -74,7 +74,7 @@ public:
         createAxis(
             sal_Int32 nDimensionIndex
             , sal_Int32 nAxisIndex // 0==main or 1==secondary axis
-            , const css::uno::Reference< css::chart2::XCoordinateSystem >& 
xCooSys
+            , const rtl::Reference< ::chart::BaseCoordinateSystem >& xCooSys
             , const css::uno::Reference< css::uno::XComponentContext > & 
xContext
             , ReferenceSizeProvider * pRefSizeProvider = nullptr );
 
@@ -124,18 +124,18 @@ public:
                 , const rtl::Reference< ::chart::Diagram >& xDiagram );
     static css::uno::Reference< css::chart2::XAxis >
         getAxis( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex
-            , const css::uno::Reference< css::chart2::XCoordinateSystem >& 
xCooSys );
+            , const rtl::Reference< ::chart::BaseCoordinateSystem >& xCooSys );
 
     static css::uno::Reference< css::chart2::XAxis >
         getCrossingMainAxis( const css::uno::Reference< css::chart2::XAxis >& 
xAxis
-            , const css::uno::Reference< css::chart2::XCoordinateSystem >& 
xCooSys );
+            , const rtl::Reference< ::chart::BaseCoordinateSystem >& xCooSys );
 
     static css::uno::Reference< css::chart2::XAxis >
         getParallelAxis( const css::uno::Reference< css::chart2::XAxis >& xAxis
             , const rtl::Reference< ::chart::Diagram >& xDiagram );
 
     static css::uno::Reference< css::beans::XPropertySet >
-        getGridProperties( const css::uno::Reference< 
css::chart2::XCoordinateSystem >& xCooSys
+        getGridProperties( const rtl::Reference< ::chart::BaseCoordinateSystem 
>& xCooSys
                 , sal_Int32 nDimensionIndex
                 , sal_Int32 nAxisIndex //0: Primary axis, 1: secondary axis
                 , sal_Int32 nSubGridIndex //-1: Main Grid; 0: First SubGrid etc
@@ -147,7 +147,7 @@ public:
 
     static bool getIndicesForAxis(
               const css::uno::Reference< css::chart2::XAxis >& xAxis
-            , const css::uno::Reference< css::chart2::XCoordinateSystem >& 
xCooSys
+            , const rtl::Reference< ::chart::BaseCoordinateSystem >& xCooSys
             , sal_Int32& rOutDimensionIndex, sal_Int32& rOutAxisIndex );
 
     static bool getIndicesForAxis(
@@ -166,7 +166,7 @@ public:
                </sal_True> are returned
      */
     SAL_DLLPRIVATE static std::vector< css::uno::Reference< css::chart2::XAxis 
> >
-            getAllAxesOfCoordinateSystem( const css::uno::Reference< 
css::chart2::XCoordinateSystem >& xCooSys
+            getAllAxesOfCoordinateSystem( const rtl::Reference< 
::chart::BaseCoordinateSystem >& xCooSys
             , bool bOnlyVisible = false );
 
     static css::uno::Sequence< css::uno::Reference< css::beans::XPropertySet > 
>
@@ -189,15 +189,15 @@ public:
                         , ReferenceSizeProvider * pRefSizeProvider );
 
     static bool shouldAxisBeDisplayed( const css::uno::Reference< 
css::chart2::XAxis >& xAxis
-                                       , const css::uno::Reference< 
css::chart2::XCoordinateSystem >& xCooSys );
-    static bool isSecondaryYAxisNeeded( const css::uno::Reference<
-                    css::chart2::XCoordinateSystem >& xCooSys );
+                                       , const rtl::Reference< 
::chart::BaseCoordinateSystem >& xCooSys );
+    static bool isSecondaryYAxisNeeded( const rtl::Reference<
+                    ::chart::BaseCoordinateSystem >& xCooSys );
 
     static rtl::Reference< ::chart::ChartType >
-        getChartTypeByIndex( const css::uno::Reference< 
css::chart2::XCoordinateSystem >& xCooSys,
+        getChartTypeByIndex( const rtl::Reference< 
::chart::BaseCoordinateSystem >& xCooSys,
                              sal_Int32 nIndex );
 
-    static void setRTLAxisLayout( const css::uno::Reference< 
css::chart2::XCoordinateSystem >& xCooSys );
+    static void setRTLAxisLayout( const rtl::Reference< 
::chart::BaseCoordinateSystem >& xCooSys );
 
     static rtl::Reference< ::chart::ChartType >
         getFirstChartTypeWithSeriesAttachedToAxisIndex( const rtl::Reference< 
::chart::Diagram >& xDiagram, const sal_Int32 nAttachedAxisIndex );
diff --git a/chart2/source/tools/AxisHelper.cxx 
b/chart2/source/tools/AxisHelper.cxx
index 9d8af98c757f..7fe222f6e635 100644
--- a/chart2/source/tools/AxisHelper.cxx
+++ b/chart2/source/tools/AxisHelper.cxx
@@ -135,7 +135,7 @@ void AxisHelper::checkDateAxis( chart2::ScaleData& rScale, 
ExplicitCategoriesPro
 
 sal_Int32 AxisHelper::getExplicitNumberFormatKeyForAxis(
                   const Reference< chart2::XAxis >& xAxis
-                , const Reference< chart2::XCoordinateSystem > & 
xCorrespondingCoordinateSystem
+                , const rtl::Reference< BaseCoordinateSystem > & 
xCorrespondingCoordinateSystem
                 , const rtl::Reference<ChartModel>& xChartDoc
                 , bool bSearchForParallelAxisIfNothingIsFound )
 {
@@ -148,9 +148,6 @@ sal_Int32 AxisHelper::getExplicitNumberFormatKeyForAxis(
     if (!xProp.is())
         return 0;
 
-    auto pCorrespondingCoordinateSystem = 
dynamic_cast<BaseCoordinateSystem*>(xCorrespondingCoordinateSystem.get());
-    assert(pCorrespondingCoordinateSystem);
-
     bool bLinkToSource = true;
     xProp->getPropertyValue(CHART_UNONAME_LINK_TO_SRC_NUMFMT) >>= 
bLinkToSource;
     xProp->getPropertyValue(CHART_UNONAME_NUMFMT) >>= nNumberFormatKey;
@@ -238,7 +235,7 @@ sal_Int32 AxisHelper::getExplicitNumberFormatKeyForAxis(
                 OUString aRoleToMatch;
                 if( nDimensionIndex == 0 )
                     aRoleToMatch = "values-x";
-                const std::vector< rtl::Reference< ChartType > > & 
aChartTypes( pCorrespondingCoordinateSystem->getChartTypes2());
+                const std::vector< rtl::Reference< ChartType > > & 
aChartTypes( xCorrespondingCoordinateSystem->getChartTypes2());
                 for( rtl::Reference< ChartType > const & chartType : 
aChartTypes )
                 {
                     if( nDimensionIndex != 0 )
@@ -323,7 +320,7 @@ sal_Int32 AxisHelper::getExplicitNumberFormatKeyForAxis(
 Reference< XAxis > AxisHelper::createAxis(
           sal_Int32 nDimensionIndex
         , sal_Int32 nAxisIndex // 0==main or 1==secondary axis
-        , const Reference< XCoordinateSystem >& xCooSys
+        , const rtl::Reference< BaseCoordinateSystem >& xCooSys
         , const Reference< uno::XComponentContext > & xContext
         , ReferenceSizeProvider * pRefSizeProvider )
 {
@@ -399,7 +396,7 @@ Reference< XAxis > AxisHelper::createAxis( sal_Int32 
nDimensionIndex, bool bMain
         return nullptr;
 
     sal_Int32 nAxisIndex = bMainAxis ? MAIN_AXIS_INDEX : SECONDARY_AXIS_INDEX;
-    Reference< XCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 );
+    rtl::Reference< BaseCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 );
 
     // create axis
     return AxisHelper::createAxis(
@@ -434,7 +431,7 @@ void AxisHelper::showGrid( sal_Int32 nDimensionIndex, 
sal_Int32 nCooSysIndex, bo
     if( !xDiagram.is() )
         return;
 
-    Reference< XCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
+    rtl::Reference< BaseCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
     if(!xCooSys.is())
         return;
 
@@ -515,7 +512,7 @@ void AxisHelper::hideGrid( sal_Int32 nDimensionIndex, 
sal_Int32 nCooSysIndex, bo
     if( !xDiagram.is() )
         return;
 
-    Reference< XCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
+    rtl::Reference< BaseCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
     if(!xCooSys.is())
         return;
 
@@ -546,7 +543,7 @@ bool AxisHelper::isGridShown( sal_Int32 nDimensionIndex, 
sal_Int32 nCooSysIndex,
 {
     bool bRet = false;
 
-    Reference< XCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
+    rtl::Reference< BaseCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
     if(!xCooSys.is())
         return bRet;
 
@@ -583,7 +580,7 @@ Reference< XAxis > AxisHelper::getAxis( sal_Int32 
nDimensionIndex, bool bMainAxi
     Reference< XAxis > xRet;
     try
     {
-        Reference< XCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 );
+        rtl::Reference< BaseCoordinateSystem > xCooSys = 
AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 );
         xRet.set( AxisHelper::getAxis( nDimensionIndex, bMainAxis ? 0 : 1, 
xCooSys ) );
     }
     catch( const uno::Exception & )
@@ -593,7 +590,7 @@ Reference< XAxis > AxisHelper::getAxis( sal_Int32 
nDimensionIndex, bool bMainAxi
 }
 
 Reference< XAxis > AxisHelper::getAxis( sal_Int32 nDimensionIndex, sal_Int32 
nAxisIndex
-            , const Reference< XCoordinateSystem >& xCooSys )
+            , const rtl::Reference< BaseCoordinateSystem >& xCooSys )
 {
     Reference< XAxis > xRet;
     if(!xCooSys.is())
@@ -612,7 +609,7 @@ Reference< XAxis > AxisHelper::getAxis( sal_Int32 
nDimensionIndex, sal_Int32 nAx
 }
 
 Reference< XAxis > AxisHelper::getCrossingMainAxis( const Reference< XAxis >& 
xAxis
-            , const Reference< XCoordinateSystem >& xCooSys )
+            , const rtl::Reference< BaseCoordinateSystem >& xCooSys )
 {
     sal_Int32 nDimensionIndex = 0;
     sal_Int32 nAxisIndex = 0;
@@ -621,8 +618,7 @@ Reference< XAxis > AxisHelper::getCrossingMainAxis( const 
Reference< XAxis >& xA
     {
         nDimensionIndex=1;
         bool bSwapXY = false;
-        Reference< beans::XPropertySet > xCooSysProp( xCooSys, uno::UNO_QUERY 
);
-        if( xCooSysProp.is() && (xCooSysProp->getPropertyValue( 
"SwapXAndYAxis" ) >>= bSwapXY) && bSwapXY )
+        if( (xCooSys->getPropertyValue( "SwapXAndYAxis" ) >>= bSwapXY) && 
bSwapXY )
             nDimensionIndex=0;
     }
     else if( nDimensionIndex==1 )
@@ -697,7 +693,7 @@ bool AxisHelper::isGridVisible( const Reference< 
beans::XPropertySet >& xGridpro
 }
 
 Reference< beans::XPropertySet > AxisHelper::getGridProperties(
-            const Reference< XCoordinateSystem >& xCooSys
+            const rtl::Reference< BaseCoordinateSystem >& xCooSys
         , sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex, sal_Int32 
nSubGridIndex )
 {
     Reference< beans::XPropertySet > xRet;
@@ -731,7 +727,7 @@ sal_Int32 AxisHelper::getDimensionIndexOfAxis(
 
 bool AxisHelper::getIndicesForAxis(
               const Reference< XAxis >& xAxis
-            , const Reference< XCoordinateSystem >& xCooSys
+            , const rtl::Reference< BaseCoordinateSystem >& xCooSys
             , sal_Int32& rOutDimensionIndex, sal_Int32& rOutAxisIndex )
 {
     //returns true if indices are found
@@ -784,7 +780,7 @@ bool AxisHelper::getIndicesForAxis( const Reference< XAxis 
>& xAxis, const rtl::
 }
 
 std::vector< Reference< XAxis > > AxisHelper::getAllAxesOfCoordinateSystem(
-      const Reference< XCoordinateSystem >& xCooSys
+      const rtl::Reference< BaseCoordinateSystem >& xCooSys
     , bool bOnlyVisible /* = false */ )
 {
     std::vector< Reference< XAxis > > aAxisVector;
@@ -888,20 +884,15 @@ void AxisHelper::getAxisOrGridPossibilities( Sequence< 
sal_Bool >& rPossibilityL
             pPossibilityList[nIndex] = rPossibilityList[nIndex-3];
 }
 
-bool AxisHelper::isSecondaryYAxisNeeded( const Reference< XCoordinateSystem >& 
xCooSys )
+bool AxisHelper::isSecondaryYAxisNeeded( const rtl::Reference< 
BaseCoordinateSystem >& xCooSys )
 {
-    Reference< chart2::XChartTypeContainer > xCTCnt( xCooSys, uno::UNO_QUERY );
-    if( !xCTCnt.is() )
+    if( !xCooSys.is() )
         return false;
 
-    const Sequence< Reference< chart2::XChartType > > aChartTypes( 
xCTCnt->getChartTypes() );
-    for( Reference< chart2::XChartType > const & chartType : aChartTypes )
+    const std::vector< rtl::Reference< ChartType > > & aChartTypes( 
xCooSys->getChartTypes2() );
+    for( rtl::Reference< ChartType > const & chartType : aChartTypes )
     {
-        Reference< XDataSeriesContainer > xSeriesContainer( chartType, 
uno::UNO_QUERY );
-        if( !xSeriesContainer.is() )
-                continue;
-
-        Sequence< Reference< XDataSeries > > aSeriesList( 
xSeriesContainer->getDataSeries() );
+        Sequence< Reference< XDataSeries > > aSeriesList( 
chartType->getDataSeries() );
         for( sal_Int32 nS = aSeriesList.getLength(); nS-- ; )
         {
             Reference< beans::XPropertySet > xProp( aSeriesList[nS], 
uno::UNO_QUERY );
@@ -917,7 +908,7 @@ bool AxisHelper::isSecondaryYAxisNeeded( const Reference< 
XCoordinateSystem >& x
 }
 
 bool AxisHelper::shouldAxisBeDisplayed( const Reference< XAxis >& xAxis
-                                       , const Reference< XCoordinateSystem >& 
xCooSys )
+                                       , const rtl::Reference< 
BaseCoordinateSystem >& xCooSys )
 {
     bool bRet = false;
 
@@ -1031,15 +1022,13 @@ rtl::Reference< BaseCoordinateSystem > 
AxisHelper::getCoordinateSystemOfAxis(
     return xRet;
 }
 
-rtl::Reference< ChartType > AxisHelper::getChartTypeByIndex( const Reference< 
XCoordinateSystem >& xCooSys, sal_Int32 nIndex )
+rtl::Reference< ChartType > AxisHelper::getChartTypeByIndex( const 
rtl::Reference< BaseCoordinateSystem >& xCooSys, sal_Int32 nIndex )
 {
     rtl::Reference< ChartType > xChartType;
 

... etc. - the rest is truncated

Reply via email to