diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-09-30 14:42:10 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-10-02 10:37:09 +0200 |
commit | e1ac2a940389f52e28264a623a6620a7a0d94d57 (patch) | |
tree | e8cf96b31091482bc628cf501ecbba4cf1096c05 /include | |
parent | 1709a9b9a2433032b5acf262ef506272c33d5e63 (diff) |
tdf#134566 gtk IM support for custom widgets
Change-Id: I5c731161768d09d021db5c353de816e173159096
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103764
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/editeng/editview.hxx | 3 | ||||
-rw-r--r-- | include/svx/svdedxv.hxx | 1 | ||||
-rw-r--r-- | include/svx/weldeditview.hxx | 9 | ||||
-rw-r--r-- | include/vcl/customweld.hxx | 7 | ||||
-rw-r--r-- | include/vcl/layout.hxx | 7 | ||||
-rw-r--r-- | include/vcl/weld.hxx | 27 |
6 files changed, 54 insertions, 0 deletions
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<css::datatransfer::dnd::XDropTarget> 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<TransferDataContainer>& 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<VclDrawingArea&, void> m_aStyleUpdatedHdl; Link<const CommandEvent&, bool> m_aCommandHdl; Link<tools::Rectangle&, OUString> m_aQueryTooltipHdl; + Link<OUString&, int> m_aGetSurroundingHdl; Link<VclDrawingArea*, bool> 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<OUString&, int>& rLink) + { + m_aGetSurroundingHdl = rLink; + } void SetStartDragHdl(const Link<VclDrawingArea*, bool>& 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<tools::Rectangle&, OUString> m_aQueryTooltipHdl; // if handler returns true, drag is disallowed Link<DrawingArea&, bool> m_aDragBeginHdl; + // return position of cursor, fill OUString& with surrounding text + Link<OUString&, int> m_aGetSurroundingHdl; + // attempt to delete the range, return true if successful + Link<const Selection&, bool> 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<draw_args, void>& rLink) { m_aDrawHdl = rLink; } void connect_style_updated(const Link<Widget&, void>& rLink) { m_aStyleUpdatedHdl = rLink; } @@ -2057,6 +2073,14 @@ public: m_aQueryTooltipHdl = rLink; } void connect_drag_begin(const Link<DrawingArea&, bool>& rLink) { m_aDragBeginHdl = rLink; } + void connect_im_context_get_surrounding(const Link<OUString&, int>& rLink) + { + m_aGetSurroundingHdl = rLink; + } + void connect_im_context_delete_surrounding(const Link<const Selection&, bool>& 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; |