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>
This commit is contained in:
Miklos Vajna 2016-06-10 16:42:00 +02:00
parent 30104ff4c7
commit 89bbd0ecbf
8 changed files with 62 additions and 7 deletions

View File

@ -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;

View File

@ -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,6 +1016,9 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
aRect.setWidth(0);
OString sRect = aRect.toString();
if (comphelper::LibreOfficeKit::isViewCallback())
libreOfficeKitViewCallback(LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR, sRect.getStr());
else
libreOfficeKitCallback(LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR, sRect.getStr());
}

View File

@ -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();

View File

@ -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();

View File

@ -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;

View File

@ -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 );

View File

@ -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;
};

View File

@ -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,6 +461,9 @@ OutlinerView* SdrObjEditView::ImpMakeOutlinerView(vcl::Window* pWin, bool /*bNoP
}
pOutlView->SetControlWord(nStat);
pOutlView->SetBackgroundColor( aBackground );
if (comphelper::LibreOfficeKit::isViewCallback())
pOutlView->registerLibreOfficeKitViewCallback(SfxViewShell::Current());
else
pOutlView->registerLibreOfficeKitCallback(GetModel());
if (pText!=nullptr)
{