SetUpdateFont(false);
m_text = NULL;
- m_frozenness = 0;
+ m_freezeCount = 0;
+ m_showPositionOnThaw = NULL;
m_gdkHandCursor = NULL;
m_gdkXTermCursor = NULL;
}
const wxString &name )
{
m_needParent = true;
- m_acceptsFocus = true;
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name ))
m_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
+ // create "ShowPosition" marker
+ GtkTextIter iter;
+ gtk_text_buffer_get_start_iter(m_buffer, &iter);
+ gtk_text_buffer_create_mark(m_buffer, "ShowPosition", &iter, true);
+
// create scrolled window
m_widget = gtk_scrolled_window_new( NULL, NULL );
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( m_widget ),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
+ GTK_POLICY_AUTOMATIC,
+ style & wxTE_NO_VSCROLL
+ ? GTK_POLICY_NEVER
+ : GTK_POLICY_AUTOMATIC );
// for ScrollLines/Pages
m_scrollBar[1] = (GtkRange*)((GtkScrolledWindow*)m_widget)->vscrollbar;
m_modified = false;
DontMarkDirtyOnNextChange();
- const wxCharBuffer buffer(wxGTK_CONV_ENC(value, GetTextEncoding()));
+ wxFontEncoding enc = m_defaultStyle.HasFont()
+ ? m_defaultStyle.GetFont().GetEncoding()
+ : wxFONTENCODING_SYSTEM;
+ if ( enc == wxFONTENCODING_SYSTEM )
+ enc = GetTextEncoding();
+
+ const wxCharBuffer buffer(wxGTK_CONV_ENC(value, enc));
if ( !buffer )
{
// see comment in WriteText() as to why we must warn the user about
if ( IsMultiLine() )
{
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);
+ }
}
else // single line
{
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset( m_buffer, &iter, pos );
gtk_text_buffer_place_cursor( m_buffer, &iter );
- if (!IsFrozen())
- {
- // won't work when frozen, text view is not using m_buffer then
- gtk_text_view_scroll_mark_onscreen
- (
- GTK_TEXT_VIEW(m_text),
- gtk_text_buffer_get_insert( m_buffer )
- );
- }
+ GtkTextMark* mark = gtk_text_buffer_get_insert(m_buffer);
+ if (IsFrozen())
+ // defer until Thaw, text view is not using m_buffer now
+ m_showPositionOnThaw = mark;
+ else
+ gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(m_text), mark);
}
else
{
void wxTextCtrl::SetInsertionPointEnd()
{
- wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
-
- if ( IsMultiLine() )
- {
- GtkTextIter end;
- gtk_text_buffer_get_end_iter( m_buffer, &end );
- gtk_text_buffer_place_cursor( m_buffer, &end );
- }
- else
- {
- gtk_editable_set_position( GTK_EDITABLE(m_text), -1 );
- }
+ SetInsertionPoint(-1);
}
void wxTextCtrl::SetEditable( bool editable )
}
// wxGTK-specific: called recursively by Enable,
-// to give widgets an oppprtunity to correct their colours after they
+// to give widgets an opportunity to correct their colours after they
// have been changed by Enable
-void wxTextCtrl::OnParentEnable( bool enable )
+void wxTextCtrl::OnEnabled( bool enable )
{
// If we have a custom background colour, we use this colour in both
// disabled and enabled mode, or we end up with a different colour under the
void wxTextCtrl::ShowPosition( long pos )
{
- // won't work when frozen, text view is not using m_buffer then
- if (IsMultiLine() && !IsFrozen())
+ if (IsMultiLine())
{
GtkTextIter iter;
- gtk_text_buffer_get_start_iter( m_buffer, &iter );
- gtk_text_iter_set_offset( &iter, pos );
- GtkTextMark *mark = gtk_text_buffer_create_mark( m_buffer, NULL, &iter, TRUE );
- gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW(m_text), mark, 0.0, FALSE, 0.0, 0.0 );
+ gtk_text_buffer_get_iter_at_offset(m_buffer, &iter, int(pos));
+ GtkTextMark* mark = gtk_text_buffer_get_mark(m_buffer, "ShowPosition");
+ gtk_text_buffer_move_mark(m_buffer, mark, &iter);
+ if (IsFrozen())
+ // defer until Thaw, text view is not using m_buffer now
+ m_showPositionOnThaw = mark;
+ else
+ gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(m_text), mark);
}
}
if ( HasFlag(wxTE_MULTILINE) )
{
- if (m_frozenness++ == 0)
+ if (m_freezeCount++ == 0)
{
// freeze textview updates and remove buffer
g_signal_connect (m_text, "expose_event",
{
if ( HasFlag(wxTE_MULTILINE) )
{
- wxCHECK_RET(m_frozenness != 0, _T("Thaw() without matching Freeze()"));
+ wxCHECK_RET(m_freezeCount != 0, _T("Thaw() without matching Freeze()"));
- if (--m_frozenness == 0)
+ if (--m_freezeCount == 0)
{
// Reattach buffer and thaw textview updates
gtk_text_view_set_buffer(GTK_TEXT_VIEW(m_text), m_buffer);
(gpointer) gtk_text_exposed_callback, this);
g_signal_handlers_disconnect_by_func (m_text,
(gpointer) gtk_text_exposed_callback, this);
+ if (m_showPositionOnThaw != NULL)
+ {
+ gtk_text_view_scroll_mark_onscreen(
+ GTK_TEXT_VIEW(m_text), m_showPositionOnThaw);
+ m_showPositionOnThaw = NULL;
+ }
}
}
}