From e1ac2a940389f52e28264a623a6620a7a0d94d57 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Wed, 30 Sep 2020 14:42:10 +0100 Subject: tdf#134566 gtk IM support for custom widgets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I5c731161768d09d021db5c353de816e173159096 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103764 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- include/editeng/editview.hxx | 3 +++ include/svx/svdedxv.hxx | 1 + include/svx/weldeditview.hxx | 9 +++++++++ include/vcl/customweld.hxx | 7 +++++++ include/vcl/layout.hxx | 7 +++++++ include/vcl/weld.hxx | 27 +++++++++++++++++++++++++++ 6 files changed, 54 insertions(+) (limited to 'include') diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx index cac588af3243..ccc2be551ca9 100644 --- a/include/editeng/editview.hxx +++ b/include/editeng/editview.hxx @@ -111,6 +111,9 @@ public: // Triggered to update InputEngine context information virtual void EditViewInputContext(const InputContext& rInputContext) = 0; + // Triggered to update InputEngine cursor position + virtual void EditViewCursorRect(const tools::Rectangle& rRect, int nExtTextInputWidth) = 0; + // implemented if drag and drop support is wanted virtual css::uno::Reference GetDropTarget() { diff --git a/include/svx/svdedxv.hxx b/include/svx/svdedxv.hxx index 3036836a999f..ce8bf4b1f480 100644 --- a/include/svx/svdedxv.hxx +++ b/include/svx/svdedxv.hxx @@ -69,6 +69,7 @@ class SVXCORE_DLLPUBLIC SdrObjEditView : public SdrGlueEditView, public EditView virtual void EditViewSelectionChange() override; virtual OutputDevice& EditViewOutputDevice() const override; virtual void EditViewInputContext(const InputContext& rInputContext) override; + virtual void EditViewCursorRect(const tools::Rectangle& rRect, int nExtTextInputWidth) override; // The OverlayObjects used for visualizing active TextEdit (currently // using TextEditOverlayObject, but not limited to it diff --git a/include/svx/weldeditview.hxx b/include/svx/weldeditview.hxx index 65396e342b27..d54f2c9404a7 100644 --- a/include/svx/weldeditview.hxx +++ b/include/svx/weldeditview.hxx @@ -25,6 +25,8 @@ class SVX_DLLPUBLIC WeldEditView : public weld::CustomWidgetController, public E public: WeldEditView(); virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; + virtual int GetSurroundingText(OUString& rSurrounding) override; + virtual bool DeleteSurroundingText(const Selection& rRange) override; void SetText(const OUString& rStr) { m_xEditEngine->SetText(rStr); } @@ -77,6 +79,13 @@ protected: { SetInputContext(rInputContext); } + + virtual void EditViewCursorRect(const tools::Rectangle& rRect, int nExtTextInputWidth) override + { + OutputDevice& rRefDevice = EditViewOutputDevice(); + SetCursorRect(rRefDevice.LogicToPixel(rRect), + rRefDevice.LogicToPixel(Size(nExtTextInputWidth, 0)).Width()); + } }; #endif // INCLUDED_SVX_WELDEDITVIEW_HXX diff --git a/include/vcl/customweld.hxx b/include/vcl/customweld.hxx index 0b79df8d1df1..8943110261bd 100644 --- a/include/vcl/customweld.hxx +++ b/include/vcl/customweld.hxx @@ -92,6 +92,12 @@ public: { m_pDrawingArea->set_input_context(rInputContext); } + void SetCursorRect(const tools::Rectangle& rCursorRect, int nExtTextInputWidth) + { + m_pDrawingArea->im_context_set_cursor_location(rCursorRect, nExtTextInputWidth); + } + virtual int GetSurroundingText(OUString& /*rSurrounding*/) { return -1; } + virtual bool DeleteSurroundingText(const Selection& /*rRange*/) { return false; } void SetDragDataTransferrable(rtl::Reference& rTransferrable, sal_uInt8 eDNDConstants) { @@ -140,6 +146,7 @@ private: DECL_LINK(DoCommand, const CommandEvent&, bool); DECL_LINK(DoStyleUpdated, weld::Widget&, void); DECL_LINK(DoRequestHelp, tools::Rectangle&, OUString); + DECL_LINK(DoGetSurrounding, OUString&, int); public: CustomWeld(weld::Builder& rBuilder, const OString& rDrawingId, diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx index 519d9bf8688b..f69acab4b1b1 100644 --- a/include/vcl/layout.hxx +++ b/include/vcl/layout.hxx @@ -647,6 +647,7 @@ private: Link m_aStyleUpdatedHdl; Link m_aCommandHdl; Link m_aQueryTooltipHdl; + Link m_aGetSurroundingHdl; Link m_aStartDragHdl; virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override @@ -745,6 +746,8 @@ public: if (!m_aMouseReleaseHdl.Call(rMEvt)) Control::MouseButtonUp(rMEvt); } + virtual OUString GetSurroundingText() const override; + virtual Selection GetSurroundingTextSelection() const override; void SetUITestFactory(FactoryFunction pFactoryFunction, void* pUserData) { m_pFactoryFunction = pFactoryFunction; @@ -794,6 +797,10 @@ public: { m_aQueryTooltipHdl = rLink; } + void SetGetSurroundingHdl(const Link& rLink) + { + m_aGetSurroundingHdl = rLink; + } void SetStartDragHdl(const Link& rLink) { m_aStartDragHdl = rLink; diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 9b2950cc8b43..e12ef94eb71f 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -2038,12 +2038,28 @@ protected: Link m_aQueryTooltipHdl; // if handler returns true, drag is disallowed Link m_aDragBeginHdl; + // return position of cursor, fill OUString& with surrounding text + Link m_aGetSurroundingHdl; + // attempt to delete the range, return true if successful + Link m_aDeleteSurroundingHdl; OUString signal_query_tooltip(tools::Rectangle& rHelpArea) { return m_aQueryTooltipHdl.Call(rHelpArea); } + int signal_im_context_get_surrounding(OUString& rSurroundingText) + { + if (!m_aGetSurroundingHdl.IsSet()) + return -1; + return m_aGetSurroundingHdl.Call(rSurroundingText); + } + + bool signal_im_context_delete_surrounding(const Selection& rRange) + { + return m_aDeleteSurroundingHdl.Call(rRange); + } + public: void connect_draw(const Link& rLink) { m_aDrawHdl = rLink; } void connect_style_updated(const Link& rLink) { m_aStyleUpdatedHdl = rLink; } @@ -2057,6 +2073,14 @@ public: m_aQueryTooltipHdl = rLink; } void connect_drag_begin(const Link& rLink) { m_aDragBeginHdl = rLink; } + void connect_im_context_get_surrounding(const Link& rLink) + { + m_aGetSurroundingHdl = rLink; + } + void connect_im_context_delete_surrounding(const Link& rLink) + { + m_aDeleteSurroundingHdl = rLink; + } virtual void queue_draw() = 0; virtual void queue_draw_area(int x, int y, int width, int height) = 0; virtual void queue_resize() = 0; @@ -2068,6 +2092,9 @@ public: virtual void set_cursor(PointerStyle ePointerStyle) = 0; virtual void set_input_context(const InputContext& rInputContext) = 0; + virtual void im_context_set_cursor_location(const tools::Rectangle& rCursorRect, + int nExtTextInputWidth) + = 0; // use return here just to generate matching VirtualDevices virtual OutputDevice& get_ref_device() = 0; -- cgit