// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+#if wxUSE_TEXTCTRL
+
#include "wx/textctrl.h"
#ifndef WX_PRECOMP
case wxTEXT_ALIGNMENT_CENTER:
align = GTK_JUSTIFY_CENTER;
break;
- // gtk+ doesn't support justify as of gtk+-2.7.4
+// gtk+ doesn't support justify before gtk+-2.11.0 with pango-1.17 being available
+// (but if new enough pango isn't available it's a mere gtk warning)
+#if GTK_CHECK_VERSION(2,11,0)
+ case wxTEXT_ALIGNMENT_JUSTIFIED:
+ if (!gtk_check_version(2,11,0))
+ align = GTK_JUSTIFY_FILL;
+ else
+ align = GTK_JUSTIFY_LEFT;
+ break;
+#endif
}
g_snprintf(buf, sizeof(buf), "WXALIGNMENT %d", align);
gint *position,
wxTextCtrl *win)
{
- if (g_isIdle)
- wxapp_install_idle_handler();
-
// we should only be called if we have a max len limit at all
GtkEntry *entry = GTK_ENTRY (editable);
gtk_text_iter_backward_find_char( &end, pred_nonpunct_or_slash, NULL, &start );
gtk_text_iter_forward_char(&end);
- gchar* text = gtk_text_iter_get_text( &start, &end );
+ wxGtkString text(gtk_text_iter_get_text( &start, &end ));
size_t len = strlen(text), prefix_len;
size_t n;
if (!win->m_hasVMT) return;
- if (g_isIdle)
- wxapp_install_idle_handler();
-
if ( win->MarkDirtyOnChange() )
win->MarkDirty();
const wxValidator& validator,
const wxString &name )
{
- m_needParent = true;
-
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
{
gtk_widget_show(m_text);
}
+ // We want to be notified about text changes.
+ if (multi_line)
+ {
+ g_signal_connect (m_buffer, "changed",
+ G_CALLBACK (gtk_text_changed_callback), this);
+ }
+ else
+ {
+ g_signal_connect (m_text, "changed",
+ G_CALLBACK (gtk_text_changed_callback), this);
+ }
+
if (!value.empty())
{
SetValue( value );
if ( style & (wxTE_RIGHT | wxTE_CENTRE) )
GTKSetJustification();
- // We want to be notified about text changes.
if (multi_line)
{
- g_signal_connect (m_buffer, "changed",
- G_CALLBACK (gtk_text_changed_callback), this);
-
- // .. and handle URLs on multi-line controls with wxTE_AUTO_URL style
+ // Handle URLs on multi-line controls with wxTE_AUTO_URL style
if (style & wxTE_AUTO_URL)
{
GtkTextIter start, end;
au_check_range(&start, &end);
}
}
- else
- {
- g_signal_connect (m_text, "changed",
- G_CALLBACK (gtk_text_changed_callback), this);
- }
-
+
g_signal_connect (m_text, "copy-clipboard",
G_CALLBACK (gtk_copy_clipboard_callback), this);
g_signal_connect (m_text, "cut-clipboard",
gtk_text_buffer_get_end_iter( m_buffer, &end );
wxGtkString text(gtk_text_buffer_get_text(m_buffer, &start, &end, true));
- const wxWxCharBuffer buf = wxGTK_CONV_BACK(text);
- if ( buf )
- tmp = buf;
+ return wxGTK_CONV_BACK(text);
}
else
{
const gchar *text = gtk_entry_get_text( GTK_ENTRY(m_text) );
- const wxWxCharBuffer buf = wxGTK_CONV_BACK( text );
- if ( buf )
- tmp = buf;
+ return wxGTK_CONV_BACK(text);
}
return tmp;
{
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
- // the control won't be modified any more as we programmatically replace
- // all the existing text, so reset the flag and don't set it again (and do
- // it now, before the text event handler is ran so that IsModified() called
- // from there returns the expected value)
m_modified = false;
- DontMarkDirtyOnNextChange();
wxFontEncoding enc = m_defaultStyle.HasFont()
? m_defaultStyle.GetFont().GetEncoding()
return;
}
- // if the control is not empty, two "changed" signals are emitted,
- // otherwise only one and we need to ignore either both or one of them
- int ignore = flags & SetValue_SendEvent ? 0 : 1;
- if ( !IsEmpty() )
- ignore++;
-
- if ( ignore )
- IgnoreNextTextUpdate(ignore);
-
+ void* blockWidget = IsMultiLine() ? (void*)m_buffer : (void*)m_text;
+ g_signal_handlers_block_by_func(blockWidget,
+ (gpointer)gtk_text_changed_callback, this);
if ( IsMultiLine() )
{
gtk_text_buffer_set_text( m_buffer, buffer, strlen(buffer) );
-
+
if ( !m_defaultStyle.IsDefault() )
{
GtkTextIter start, end;
&start, &end);
}
}
- else // single line
+ else
{
gtk_entry_set_text( GTK_ENTRY(m_text), buffer );
}
-
- // if, for whatever reason, the callback wasn't called the expected number
- // of times, still reset the flags to the default values
- m_dontMarkDirty = false;
- m_countUpdatesToIgnore = 0;
-
-
- // GRG, Jun/2000: Changed this after a lot of discussion in
- // the lists. wxWidgets 2.2 will have a set of flags to
- // customize this behaviour.
+ g_signal_handlers_unblock_by_func(blockWidget,
+ (gpointer)gtk_text_changed_callback, this);
+
+ // This was added after discussion on the list
SetInsertionPoint(0);
}
{
GtkTextIter line;
gtk_text_buffer_get_iter_at_line(m_buffer,&line,lineNo);
+
GtkTextIter end = line;
- gtk_text_iter_forward_to_line_end(&end);
+ // avoid skipping to the next line end if this one is empty
+ if ( !gtk_text_iter_ends_line(&line) )
+ gtk_text_iter_forward_to_line_end(&end);
+
wxGtkString text(gtk_text_buffer_get_text(m_buffer, &line, &end, true));
result = wxGTK_CONV_BACK(text);
}
return false;
}
- if ( IsMultiLine() )
- {
- SetEditable( enable );
- }
- else
- {
- gtk_widget_set_sensitive( m_text, enable );
- }
+ gtk_widget_set_sensitive( m_text, enable );
return true;
}
{
return GetDefaultAttributesFromGTKWidget(gtk_entry_new, true);
}
+
+#endif // wxUSE_TEXTCTRL