Apply wxTextCtrl::SetDefaultStyle() to user-entered text in wxGTK

Apply the appropriate style to any text being inserted, not just the text
added by the program. This not only fixes the bug with default style not being
used for the text entered by user, but also makes the code simpler.

Closes #17523.
This commit is contained in:
Andreas Falkenhahn 2016-03-20 15:48:52 +01:00 committed by Vadim Zeitlin
parent 9d137f494a
commit e4473fa193
2 changed files with 19 additions and 35 deletions

View File

@ -91,6 +91,7 @@ All (GUI):
wxGTK:
- Make wxUIActionSimulator work with GTK+ 3 (Scott Talbert).
- Apply wxTextCtrl::SetDefaultStyle() to user-entered text (Andreas Falkenhahn).
- Implement setting link colours in wxHyperlinkCtrl for GTK+3 (Hanmac).
- Support background colour in wxDataViewCtrl attributes.
- Improve wxSpinCtrl best size calculation.

View File

@ -288,25 +288,6 @@ static void wxGtkTextApplyTagsFromAttr(GtkWidget *text,
}
}
static void wxGtkTextInsert(GtkWidget *text,
GtkTextBuffer *text_buffer,
const wxTextAttr& attr,
const wxCharBuffer& buffer)
{
gint start_offset;
GtkTextIter iter, start;
gtk_text_buffer_get_iter_at_mark( text_buffer, &iter,
gtk_text_buffer_get_insert (text_buffer) );
start_offset = gtk_text_iter_get_offset (&iter);
gtk_text_buffer_insert( text_buffer, &iter, buffer, strlen(buffer) );
gtk_text_buffer_get_iter_at_offset (text_buffer, &start, start_offset);
wxGtkTextApplyTagsFromAttr(text, text_buffer, attr, &start, &iter);
}
// Implementation of wxTE_AUTO_URL for wxGTK2 by Mart Raudsepp,
extern "C" {
@ -480,18 +461,24 @@ wx_insert_text_callback(GtkTextBuffer* buffer,
// And an "after" version used for detecting URLs in the text.
static void
au_insert_text_callback(GtkTextBuffer * WXUNUSED(buffer),
au_insert_text_callback(GtkTextBuffer *buffer,
GtkTextIter *end,
gchar *text,
gint len,
wxTextCtrl *win)
{
if (!len || !(win->GetWindowStyleFlag() & wxTE_AUTO_URL) )
return;
GtkTextIter start = *end;
gtk_text_iter_backward_chars(&start, g_utf8_strlen(text, len));
if ( !win->GetDefaultStyle().IsDefault() )
{
wxGtkTextApplyTagsFromAttr(win->GetHandle(), buffer, win->GetDefaultStyle(),
&start, end);
}
if ( !len || !(win->GetWindowStyleFlag() & wxTE_AUTO_URL) )
return;
GtkTextIter line_start = start;
GtkTextIter line_end = *end;
GtkTextIter words_start = start;
@ -799,9 +786,6 @@ bool wxTextCtrl::Create( wxWindow *parent,
"underline", PANGO_UNDERLINE_SINGLE,
NULL);
// Check for URLs after each text change
g_signal_connect_after (m_buffer, "insert_text",
G_CALLBACK (au_insert_text_callback), this);
g_signal_connect_after (m_buffer, "delete_range",
G_CALLBACK (au_delete_range_callback), this);
@ -824,6 +808,10 @@ bool wxTextCtrl::Create( wxWindow *parent,
// the IME-generated input.
g_signal_connect(m_buffer, "insert_text",
G_CALLBACK(wx_insert_text_callback), this);
// Needed for wxTE_AUTO_URL and applying custom styles
g_signal_connect_after(m_buffer, "insert_text",
G_CALLBACK(au_insert_text_callback), this);
}
else // single line
{
@ -1088,14 +1076,6 @@ void wxTextCtrl::DoSetValue( const wxString &value, int flags )
gtk_text_buffer_set_text( m_buffer, buffer, strlen(buffer) );
if ( !m_defaultStyle.IsDefault() )
{
GtkTextIter start, end;
gtk_text_buffer_get_bounds( m_buffer, &start, &end );
wxGtkTextApplyTagsFromAttr(m_widget, m_buffer, m_defaultStyle,
&start, &end);
}
if ( !(flags & SetValue_SendEvent) )
{
EnableTextChangedEvents(true);
@ -1149,7 +1129,10 @@ void wxTextCtrl::WriteText( const wxString &text )
gtk_text_buffer_delete_selection(m_buffer, false, true);
// Insert the text
wxGtkTextInsert( m_text, m_buffer, m_defaultStyle, buffer );
GtkTextIter iter;
gtk_text_buffer_get_iter_at_mark( m_buffer, &iter,
gtk_text_buffer_get_insert (m_buffer) );
gtk_text_buffer_insert( m_buffer, &iter, buffer, strlen(buffer) );
// Scroll to cursor, but only if scrollbar thumb is at the very bottom
// won't work when frozen, text view is not using m_buffer then