summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2016-06-10 16:42:00 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-06-10 15:15:06 +0000
commit89bbd0ecbf18a1e9030e49443fa15d068b19f767 (patch)
tree44cfc6a0e633f7cf2ca20c6e1c96f3a1f91107b0
parent30104ff4c76b7f31450f525b4a6d7ebad9823aad (diff)
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@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r--editeng/source/editeng/editview.cxx5
-rw-r--r--editeng/source/editeng/impedit.cxx19
-rw-r--r--editeng/source/editeng/impedit.hxx9
-rw-r--r--editeng/source/outliner/outlvw.cxx5
-rw-r--r--include/editeng/editview.hxx5
-rw-r--r--include/editeng/outliner.hxx15
-rw-r--r--include/sfx2/viewsh.hxx5
-rw-r--r--svx/source/svdraw/svdedxv.cxx6
8 files changed, 62 insertions, 7 deletions
diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx
index e9a36bf7144a..51f3b6adf8cd 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 c3b605810c96..c95aed4d4e4b 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 15a433901933..6c1c9f4e7d6d 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 a64d85bc74e2..eec3ec9f0c76 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 163ea7c6653c..909b656594c5 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 8b71ae12805b..0220397a0df3 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 936df3814cdf..7ed08c11c11c 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 2c7bd27a0b8c..cb88a6c79a88 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()));