include/vcl/weld.hxx | 2 + vcl/source/app/salvtables.cxx | 1 vcl/unx/gtk3/gtk3gtkinst.cxx | 68 ++++++++++++++++++++++++++++-------------- 3 files changed, 49 insertions(+), 22 deletions(-)
New commits: commit c02601b467c0878a24ce917853aa9e0781fedf2a Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Jul 6 12:14:17 2020 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Jul 6 20:29:02 2020 +0200 add set_max_length to TextView Change-Id: Iade284a1548c7d74fa2391dd0a9b113e654a71d7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98207 Tested-by: Caolán McNamara <caol...@redhat.com> Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 8c9788a2f589..73b1abc48efb 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -2016,6 +2016,8 @@ public: virtual void set_editable(bool bEditable) = 0; virtual bool get_editable() const = 0; virtual void set_monospace(bool bMonospace) = 0; + // The maximum length of the entry. Use 0 for no maximum + virtual void set_max_length(int nChars) = 0; int get_height_rows(int nRows) const { //can improve this if needed diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index dcc4b53b9887..1ba191364a6a 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -5464,6 +5464,7 @@ public: virtual void set_editable(bool bEditable) override { m_xTextView->SetReadOnly(!bEditable); } virtual bool get_editable() const override { return !m_xTextView->IsReadOnly(); } + virtual void set_max_length(int nChars) override { m_xTextView->SetMaxTextLen(nChars); } virtual void set_monospace(bool bMonospace) override { diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 9fc0809f0a3e..bd7d718c1945 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -12378,7 +12378,9 @@ private: GtkTextView* m_pTextView; GtkTextBuffer* m_pTextBuffer; GtkAdjustment* m_pVAdjustment; - gulong m_nChangedSignalId; + int m_nMaxTextLength; + gulong m_nChangedSignalId; // we don't disable/enable this one, its to implement max-length + gulong m_nInsertTextSignalId; gulong m_nCursorPosSignalId; gulong m_nVAdjustChangedSignalId; @@ -12389,6 +12391,28 @@ private: pThis->signal_changed(); } + static void signalInserText(GtkTextBuffer *pBuffer, GtkTextIter *pLocation, gchar* /*pText*/, gint /*nLen*/, gpointer widget) + { + GtkInstanceTextView* pThis = static_cast<GtkInstanceTextView*>(widget); + pThis->insert_text(pBuffer, pLocation); + } + + void insert_text(GtkTextBuffer *pBuffer, GtkTextIter *pLocation) + { + if (m_nMaxTextLength) + { + gint nCount = gtk_text_buffer_get_char_count(pBuffer); + if (nCount > m_nMaxTextLength) + { + GtkTextIter nStart, nEnd; + gtk_text_buffer_get_iter_at_offset(m_pTextBuffer, &nStart, m_nMaxTextLength); + gtk_text_buffer_get_end_iter(m_pTextBuffer, &nEnd); + gtk_text_buffer_delete(m_pTextBuffer, &nStart, &nEnd); + gtk_text_iter_assign(pLocation, &nStart); + } + } + } + static void signalCursorPosition(GtkTextView*, GParamSpec*, gpointer widget) { GtkInstanceTextView* pThis = static_cast<GtkInstanceTextView*>(widget); @@ -12408,7 +12432,9 @@ public: , m_pTextView(pTextView) , m_pTextBuffer(gtk_text_view_get_buffer(pTextView)) , m_pVAdjustment(gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(pTextView))) + , m_nMaxTextLength(0) , m_nChangedSignalId(g_signal_connect(m_pTextBuffer, "changed", G_CALLBACK(signalChanged), this)) + , m_nInsertTextSignalId(g_signal_connect_after(m_pTextBuffer, "insert-text", G_CALLBACK(signalInserText), this)) , m_nCursorPosSignalId(g_signal_connect(m_pTextBuffer, "notify::cursor-position", G_CALLBACK(signalCursorPosition), this)) , m_nVAdjustChangedSignalId(g_signal_connect(m_pVAdjustment, "value-changed", G_CALLBACK(signalVAdjustValueChanged), this)) { @@ -12429,18 +12455,16 @@ public: virtual void set_text(const OUString& rText) override { disable_notify_events(); - GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView); OString sText(OUStringToOString(rText, RTL_TEXTENCODING_UTF8)); - gtk_text_buffer_set_text(pBuffer, sText.getStr(), sText.getLength()); + gtk_text_buffer_set_text(m_pTextBuffer, sText.getStr(), sText.getLength()); enable_notify_events(); } virtual OUString get_text() const override { - GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView); GtkTextIter start, end; - gtk_text_buffer_get_bounds(pBuffer, &start, &end); - char* pStr = gtk_text_buffer_get_text(pBuffer, &start, &end, true); + gtk_text_buffer_get_bounds(m_pTextBuffer, &start, &end); + char* pStr = gtk_text_buffer_get_text(m_pTextBuffer, &start, &end, true); OUString sRet(pStr, pStr ? strlen(pStr) : 0, RTL_TEXTENCODING_UTF8); g_free(pStr); return sRet; @@ -12449,18 +12473,16 @@ public: virtual void replace_selection(const OUString& rText) override { disable_notify_events(); - GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView); - gtk_text_buffer_delete_selection(pBuffer, false, gtk_text_view_get_editable(m_pTextView)); + gtk_text_buffer_delete_selection(m_pTextBuffer, false, gtk_text_view_get_editable(m_pTextView)); OString sText(OUStringToOString(rText, RTL_TEXTENCODING_UTF8)); - gtk_text_buffer_insert_at_cursor(pBuffer, sText.getStr(), sText.getLength()); + gtk_text_buffer_insert_at_cursor(m_pTextBuffer, sText.getStr(), sText.getLength()); enable_notify_events(); } virtual bool get_selection_bounds(int& rStartPos, int& rEndPos) override { - GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView); GtkTextIter start, end; - gtk_text_buffer_get_selection_bounds(pBuffer, &start, &end); + gtk_text_buffer_get_selection_bounds(m_pTextBuffer, &start, &end); rStartPos = gtk_text_iter_get_offset(&start); rEndPos = gtk_text_iter_get_offset(&end); return rStartPos != rEndPos; @@ -12469,12 +12491,11 @@ public: virtual void select_region(int nStartPos, int nEndPos) override { disable_notify_events(); - GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView); GtkTextIter start, end; - gtk_text_buffer_get_iter_at_offset(pBuffer, &start, nStartPos); - gtk_text_buffer_get_iter_at_offset(pBuffer, &end, nEndPos); - gtk_text_buffer_select_range(pBuffer, &start, &end); - GtkTextMark* mark = gtk_text_buffer_create_mark(pBuffer, "scroll", &end, true); + gtk_text_buffer_get_iter_at_offset(m_pTextBuffer, &start, nStartPos); + gtk_text_buffer_get_iter_at_offset(m_pTextBuffer, &end, nEndPos); + gtk_text_buffer_select_range(m_pTextBuffer, &start, &end); + GtkTextMark* mark = gtk_text_buffer_create_mark(m_pTextBuffer, "scroll", &end, true); gtk_text_view_scroll_mark_onscreen(m_pTextView, mark); enable_notify_events(); } @@ -12489,6 +12510,11 @@ public: return gtk_text_view_get_editable(m_pTextView); } + virtual void set_max_length(int nChars) override + { + m_nMaxTextLength = nChars; + } + virtual void set_monospace(bool bMonospace) override { gtk_text_view_set_monospace(m_pTextView, bMonospace); @@ -12514,24 +12540,21 @@ public: { GtkClipboard *pClipboard = gtk_widget_get_clipboard(GTK_WIDGET(m_pTextView), GDK_SELECTION_CLIPBOARD); - GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView); - gtk_text_buffer_cut_clipboard(pBuffer, pClipboard, get_editable()); + gtk_text_buffer_cut_clipboard(m_pTextBuffer, pClipboard, get_editable()); } virtual void copy_clipboard() override { GtkClipboard *pClipboard = gtk_widget_get_clipboard(GTK_WIDGET(m_pTextView), GDK_SELECTION_CLIPBOARD); - GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView); - gtk_text_buffer_copy_clipboard(pBuffer, pClipboard); + gtk_text_buffer_copy_clipboard(m_pTextBuffer, pClipboard); } virtual void paste_clipboard() override { GtkClipboard *pClipboard = gtk_widget_get_clipboard(GTK_WIDGET(m_pTextView), GDK_SELECTION_CLIPBOARD); - GtkTextBuffer* pBuffer = gtk_text_view_get_buffer(m_pTextView); - gtk_text_buffer_paste_clipboard(pBuffer, pClipboard, nullptr, get_editable()); + gtk_text_buffer_paste_clipboard(m_pTextBuffer, pClipboard, nullptr, get_editable()); } virtual int vadjustment_get_value() const override @@ -12580,6 +12603,7 @@ public: virtual ~GtkInstanceTextView() override { g_signal_handler_disconnect(m_pVAdjustment, m_nVAdjustChangedSignalId); + g_signal_handler_disconnect(m_pTextBuffer, m_nInsertTextSignalId); g_signal_handler_disconnect(m_pTextBuffer, m_nChangedSignalId); g_signal_handler_disconnect(m_pTextBuffer, m_nCursorPosSignalId); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits