summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-09-30 14:42:10 +0100
committerCaolán McNamara <caolanm@redhat.com>2020-10-02 10:37:09 +0200
commite1ac2a940389f52e28264a623a6620a7a0d94d57 (patch)
treee8cf96b31091482bc628cf501ecbba4cf1096c05 /include
parentCID#1467666 Unchecked return value (CHECKED_RETURN) (diff)
downloadcore-e1ac2a940389f52e28264a623a6620a7a0d94d57.tar.gz
core-e1ac2a940389f52e28264a623a6620a7a0d94d57.zip
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.hxx3
-rw-r--r--include/svx/svdedxv.hxx1
-rw-r--r--include/svx/weldeditview.hxx9
-rw-r--r--include/vcl/customweld.hxx7
-rw-r--r--include/vcl/layout.hxx7
-rw-r--r--include/vcl/weld.hxx27
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;