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:
parent
30104ff4c7
commit
89bbd0ecbf
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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 );
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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()));
|
||||
|
Loading…
x
Reference in New Issue
Block a user