[Libreoffice-commits] core.git: include/svx sd/source svx/source

Miklos Vajna vmiklos at collabora.co.uk
Wed Jul 27 10:08:18 UTC 2016


 include/svx/svdedxv.hxx       |    4 ++++
 sd/source/ui/inc/View.hxx     |    1 +
 sd/source/ui/view/sdview.cxx  |   10 ++++++++++
 svx/source/svdraw/svdedxv.cxx |   14 +++++++++++++-
 4 files changed, 28 insertions(+), 1 deletion(-)

New commits:
commit c0f1c0da77cf9f148b3f29aaf0965dfb43b8a32c
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Jul 27 10:03:28 2016 +0200

    svx lok: avoid SfxViewShell::Current() during constructing a new view shell
    
    Currently when a text edit is started, then in the LOK case if there is
    an other view that shows the same page, then both draw views will have
    an outliner view showing the text edit. This means that in case a view
    shell is created after starting the text edit, that won't have an
    outliner view for the text edit.
    
    Before fixing this, calls to SfxViewShell::Current() has to be avoided
    when we're in the process of setting up a new LOK view. In case of
    Impress, this is a double initialization, and by the time
    SdrObjEditView::ImpMakeOutlinerView() is called, we're already in the
    process of setting up the second SfxViewShell (as part of
    SdXImpressDocument::initializeForTiledRendering()), but
    SfxViewShell::Current() still points to the old view shell.  Which means
    that the outliner view would refer to a view shell that's deleted soon,
    and we crash as soon as it tries to invoke a LOK callback.
    
    Fix this by adding a virtual member function to SdrObjEditView, and
    override it in sd, so in case applications want to provide a more
    precise way of giving the view shell owning a draw view, then they can.
    
    Change-Id: Ie0005f73237d4ff9cf576bf16fa5b46280f13759
    Reviewed-on: https://gerrit.libreoffice.org/27561
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/include/svx/svdedxv.hxx b/include/svx/svdedxv.hxx
index 4aac4ff..70ffe3b 100644
--- a/include/svx/svdedxv.hxx
+++ b/include/svx/svdedxv.hxx
@@ -35,6 +35,7 @@ class ImpSdrEditPara;
 struct PasteOrDropInfos;
 class SdrUndoManager;
 class TextChainCursorManager;
+class SfxViewShell;
 
 namespace com { namespace sun { namespace star { namespace uno {
     class Any;
@@ -155,6 +156,9 @@ public:
     virtual void BckAction() override;
     virtual void TakeActionRect(Rectangle& rRect) const override;
 
+    /// Get access to the view shell owning this draw view, if any.
+    virtual SfxViewShell* GetSfxViewShell() const;
+
     virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
     virtual void ModelHasChanged() override;
 
diff --git a/sd/source/ui/inc/View.hxx b/sd/source/ui/inc/View.hxx
index c1b97b3..c1f52ac 100644
--- a/sd/source/ui/inc/View.hxx
+++ b/sd/source/ui/inc/View.hxx
@@ -122,6 +122,7 @@ public:
     inline DrawDocShell* GetDocSh() const { return mpDocSh; }
     inline SdDrawDocument& GetDoc() const;
     inline ViewShell* GetViewShell() const { return mpViewSh; }
+    SfxViewShell* GetSfxViewShell() const override;
 
     virtual bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = nullptr, vcl::Window* pWin = nullptr, bool bIsNewObj = false,
         SdrOutliner* pGivenOutliner = nullptr, OutlinerView* pGivenOutlinerView = nullptr,
diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx
index 5e097dd..ddaf809 100644
--- a/sd/source/ui/view/sdview.cxx
+++ b/sd/source/ui/view/sdview.cxx
@@ -651,6 +651,16 @@ void OutlinerMasterViewFilter::End()
     }
 }
 
+SfxViewShell* View::GetSfxViewShell() const
+{
+    SfxViewShell* pRet = nullptr;
+
+    if (mpViewSh)
+        pRet = &mpViewSh->GetViewShellBase();
+
+    return pRet;
+}
+
 bool View::SdrBeginTextEdit(
     SdrObject* pObj, SdrPageView* pPV, vcl::Window* pWin,
     bool bIsNewObj,
diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx
index 9a458806..cd6e083 100644
--- a/svx/source/svdraw/svdedxv.cxx
+++ b/svx/source/svdraw/svdedxv.cxx
@@ -142,6 +142,11 @@ void SdrObjEditView::TakeActionRect(Rectangle& rRect) const
     }
 }
 
+SfxViewShell* SdrObjEditView::GetSfxViewShell() const
+{
+    return nullptr;
+}
+
 void SdrObjEditView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
 {
     SdrGlueEditView::Notify(rBC,rHint);
@@ -461,7 +466,14 @@ OutlinerView* SdrObjEditView::ImpMakeOutlinerView(vcl::Window* pWin, bool /*bNoP
     }
     pOutlView->SetControlWord(nStat);
     pOutlView->SetBackgroundColor( aBackground );
-    pOutlView->registerLibreOfficeKitViewCallback(SfxViewShell::Current());
+
+    // In case we're in the process of constructing a new view shell,
+    // SfxViewShell::Current() may still point to the old one. So if possible,
+    // depend on the application owning this draw view to provide the view
+    // shell.
+    SfxViewShell* pSfxViewShell = GetSfxViewShell();
+    pOutlView->registerLibreOfficeKitViewCallback(pSfxViewShell ? pSfxViewShell : SfxViewShell::Current());
+
     if (pText!=nullptr)
     {
         pOutlView->SetAnchorMode((EVAnchorMode)(pText->GetOutlinerViewAnchorMode()));


More information about the Libreoffice-commits mailing list