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

Miklos Vajna vmiklos at collabora.co.uk
Fri Jun 10 15:15:31 UTC 2016


 editeng/source/editeng/editview.cxx |    5 +++++
 editeng/source/editeng/impedit.cxx  |   19 ++++++++++++++++++-
 editeng/source/editeng/impedit.hxx  |    9 ++++++++-
 editeng/source/outliner/outlvw.cxx  |    5 +++++
 include/editeng/editview.hxx        |    5 ++++-
 include/editeng/outliner.hxx        |   15 ++++++++++++++-
 include/sfx2/viewsh.hxx             |    5 +++--
 svx/source/svdraw/svdedxv.cxx       |    6 +++++-
 8 files changed, 62 insertions(+), 7 deletions(-)

New commits:
commit 89bbd0ecbf18a1e9030e49443fa15d068b19f767
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Jun 10 16:42:00 2016 +0200

    editeng: implement per-view LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR
    
    Given that the per-view callback is in SfxViewShell, and editeng doesn't
    depend on sfx2, add an interface class in editeng to invert the
    dependency.
    
    With this, gtktiledviewer no longer crashes when starting editeng text
    edit with per-view callbacks.
    
    Change-Id: I783cdc646b890a6b597000f1d88428c8042417cf
    Reviewed-on: https://gerrit.libreoffice.org/26169
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx
index e9a36bf..51f3b6a 100644
--- a/editeng/source/editeng/editview.cxx
+++ b/editeng/source/editeng/editview.cxx
@@ -583,6 +583,11 @@ void EditView::registerLibreOfficeKitCallback(OutlinerSearchable *pSearchable)
     pImpEditView->registerLibreOfficeKitCallback(pSearchable);
 }
 
+void EditView::registerLibreOfficeKitViewCallback(OutlinerViewCallable *pCallable)
+{
+    pImpEditView->registerLibreOfficeKitViewCallback(pCallable);
+}
+
 void EditView::SetControlWord( EVControlBits nWord )
 {
     pImpEditView->nControl = nWord;
diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx
index c3b6058..c95aed4 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -80,6 +80,7 @@ ImpEditView::ImpEditView( EditView* pView, EditEngine* pEng, vcl::Window* pWindo
     pPointer            = nullptr;
     pBackgroundColor    = nullptr;
     mpLibreOfficeKitSearchable = nullptr;
+    mpLibreOfficeKitViewCallable = nullptr;
     nScrollDiffX        = 0;
     nExtraCursorFlags   = 0;
     nCursorBidiLevel    = CURSOR_BIDILEVEL_DONTKNOW;
@@ -119,6 +120,8 @@ void ImpEditView::SetBackgroundColor( const Color& rColor )
 
 void ImpEditView::registerLibreOfficeKitCallback(OutlinerSearchable* pSearchable)
 {
+    // Per-view callbacks should always invoke ImpEditView::registerLibreOfficeKitViewCallback().
+    assert(!comphelper::LibreOfficeKit::isViewCallback());
     mpLibreOfficeKitSearchable = pSearchable;
 }
 
@@ -128,6 +131,17 @@ void ImpEditView::libreOfficeKitCallback(int nType, const char* pPayload) const
         mpLibreOfficeKitSearchable->libreOfficeKitCallback(nType, pPayload);
 }
 
+void ImpEditView::registerLibreOfficeKitViewCallback(OutlinerViewCallable* pCallable)
+{
+    mpLibreOfficeKitViewCallable = pCallable;
+}
+
+void ImpEditView::libreOfficeKitViewCallback(int nType, const char* pPayload) const
+{
+    if (mpLibreOfficeKitViewCallable)
+        mpLibreOfficeKitViewCallable->libreOfficeKitViewCallback(nType, pPayload);
+}
+
 void ImpEditView::SetEditSelection( const EditSelection& rEditSelection )
 {
     // set state before notification
@@ -1002,7 +1016,10 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
             aRect.setWidth(0);
 
             OString sRect = aRect.toString();
-            libreOfficeKitCallback(LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR, sRect.getStr());
+            if (comphelper::LibreOfficeKit::isViewCallback())
+                libreOfficeKitViewCallback(LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR, sRect.getStr());
+            else
+                libreOfficeKitCallback(LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR, sRect.getStr());
         }
 
         CursorDirection nCursorDir = CursorDirection::NONE;
diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx
index 15a4339..6c1c9f4 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -221,7 +221,10 @@ private:
     EditView*           pEditView;
     vcl::Cursor*        pCursor;
     Color*              pBackgroundColor;
+    /// Model callback.
     OutlinerSearchable* mpLibreOfficeKitSearchable;
+    /// Per-view callback.
+    OutlinerViewCallable* mpLibreOfficeKitViewCallable;
     EditEngine*         pEditEngine;
     VclPtr<vcl::Window> pOutWin;
     Pointer*            pPointer;
@@ -368,8 +371,12 @@ public:
 
     /// @see vcl::ITiledRenderable::registerCallback().
     void registerLibreOfficeKitCallback(OutlinerSearchable* pSearchable);
-    /// Invokes the registered callback, if there are any.
+    /// Invokes the registered model callback, if there are any.
     void libreOfficeKitCallback(int nType, const char* pPayload) const;
+    /// @see vcl::ITiledRenderable::registerCallback().
+    void registerLibreOfficeKitViewCallback(OutlinerViewCallable* pCallable);
+    /// Invokes the registered view callback, if there are any.
+    void libreOfficeKitViewCallback(int nType, const char* pPayload) const;
 
     bool            IsWrongSpelledWord( const EditPaM& rPaM, bool bMarkIfWrong );
     OUString        SpellIgnoreWord();
diff --git a/editeng/source/outliner/outlvw.cxx b/editeng/source/outliner/outlvw.cxx
index a64d85b..eec3ec9 100644
--- a/editeng/source/outliner/outlvw.cxx
+++ b/editeng/source/outliner/outlvw.cxx
@@ -1426,6 +1426,11 @@ void OutlinerView::registerLibreOfficeKitCallback(OutlinerSearchable* pSearchabl
     pEditView->registerLibreOfficeKitCallback(pSearchable);
 }
 
+void OutlinerView::registerLibreOfficeKitViewCallback(OutlinerViewCallable* pCallable)
+{
+    pEditView->registerLibreOfficeKitViewCallback(pCallable);
+}
+
 Color OutlinerView::GetBackgroundColor()
 {
     return pEditView->GetBackgroundColor();
diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index 163ea7c..909b656 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -36,6 +36,7 @@ class EditEngine;
 class ImpEditEngine;
 class ImpEditView;
 class OutlinerSearchable;
+class OutlinerViewCallable;
 class SvxSearchItem;
 class SvxFieldItem;
 namespace vcl { class Window; }
@@ -182,8 +183,10 @@ public:
     void            SetBackgroundColor( const Color& rColor );
     Color           GetBackgroundColor() const;
 
-    /// @see vcl::ITiledRenderable::registerCallback().
+    /// Register a LOK model callback.
     void registerLibreOfficeKitCallback(OutlinerSearchable *pSearchable);
+    /// Register a LOK view callback.
+    void registerLibreOfficeKitViewCallback(OutlinerViewCallable *pCallable);
 
     void            SetControlWord( EVControlBits nWord );
     EVControlBits   GetControlWord() const;
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index 8b71ae1..0220397 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -73,6 +73,7 @@ class SvxForbiddenCharactersTable;
 class OverflowingText;
 class NonOverflowingText;
 class OutlinerSearchable;
+class OutlinerViewCallable;
 
 namespace svl
 {
@@ -269,8 +270,10 @@ public:
     void        SetBackgroundColor( const Color& rColor );
     Color       GetBackgroundColor();
 
-    /// @see vcl::ITiledRenderable::registerCallback().
+    /// Registers a LOK model callback.
     void registerLibreOfficeKitCallback(OutlinerSearchable* pSearchable);
+    /// Registers a LOK view callback.
+    void registerLibreOfficeKitViewCallback(OutlinerViewCallable* pCallable);
 
     SfxItemSet  GetAttribs();
 
@@ -381,6 +384,16 @@ public:
     virtual void libreOfficeKitCallback(int nType, const char* pPayload) const = 0;
 };
 
+/// Interface class to not depend on SfxViewShell in editeng, meant to replace OutlinerSearchable at the end.
+class SAL_NO_VTABLE SAL_DLLPUBLIC_RTTI OutlinerViewCallable
+{
+public:
+    virtual void libreOfficeKitViewCallback(int nType, const char* pPayload) const = 0;
+
+protected:
+    ~OutlinerViewCallable() throw () {}
+};
+
 // some thesaurus functionality to avoid code duplication in different projects...
 bool EDITENG_DLLPUBLIC  GetStatusValueForThesaurusFromContext( OUString &rStatusVal, LanguageType &rLang, const EditView &rEditView );
 void EDITENG_DLLPUBLIC  ReplaceTextWithSynonym( EditView &rEditView, const OUString &rSynonmText );
diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index 936df38..7ed08c1 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -40,6 +40,7 @@
 #include <vcl/vclptr.hxx>
 #include <sfx2/tabdlg.hxx>
 #include <LibreOfficeKit/LibreOfficeKitTypes.h>
+#include <editeng/outliner.hxx>
 #include <functional>
 
 class SfxBaseController;
@@ -140,7 +141,7 @@ template<class T> bool checkSfxViewShell(const SfxViewShell* pShell)
     return dynamic_cast<const T*>(pShell) != nullptr;
 }
 
-class SFX2_DLLPUBLIC SfxViewShell: public SfxShell, public SfxListener
+class SFX2_DLLPUBLIC SfxViewShell: public SfxShell, public SfxListener, public OutlinerViewCallable
 {
 #ifdef INCLUDED_SFX2_VIEWSH_HXX
 friend class SfxViewFrame;
@@ -325,7 +326,7 @@ public:
     /// The actual per-view implementation of lok::Document::registerCallback().
     void registerLibreOfficeKitViewCallback(LibreOfficeKitCallback pCallback, void* pLibreOfficeKitData);
     /// Invokes the registered callback, if there are any.
-    void libreOfficeKitViewCallback(int nType, const char* pPayload) const;
+    void libreOfficeKitViewCallback(int nType, const char* pPayload) const override;
 };
 
 
diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx
index 2c7bd27..cb88a6c 100644
--- a/svx/source/svdraw/svdedxv.cxx
+++ b/svx/source/svdraw/svdedxv.cxx
@@ -63,6 +63,7 @@
 #include <svx/sdr/table/tablecontroller.hxx>
 #include <drawinglayer/processor2d/processor2dtools.hxx>
 #include <comphelper/lok.hxx>
+#include <sfx2/viewsh.hxx>
 
 #include <memory>
 
@@ -460,7 +461,10 @@ OutlinerView* SdrObjEditView::ImpMakeOutlinerView(vcl::Window* pWin, bool /*bNoP
     }
     pOutlView->SetControlWord(nStat);
     pOutlView->SetBackgroundColor( aBackground );
-    pOutlView->registerLibreOfficeKitCallback(GetModel());
+    if (comphelper::LibreOfficeKit::isViewCallback())
+        pOutlView->registerLibreOfficeKitViewCallback(SfxViewShell::Current());
+    else
+        pOutlView->registerLibreOfficeKitCallback(GetModel());
     if (pText!=nullptr)
     {
         pOutlView->SetAnchorMode((EVAnchorMode)(pText->GetOutlinerViewAnchorMode()));


More information about the Libreoffice-commits mailing list