// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "textctrl.h"
#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
#include "wx/textctrl.h"
#include "wx/utils.h"
#include "wx/intl.h"
? attr.GetBackgroundColour().GetColor()
: NULL;
- GtkTextIter start, end;
- GtkTextMark *mark;
- // iterators are invalidated by any mutation that affects 'indexable' buffer contents,
- // so we save current position in a mark
- // we need a mark of left gravity, so we cannot use
- // mark = gtk_text_buffer_get_insert (text_buffer)
-
- gtk_text_buffer_get_iter_at_mark( text_buffer, &start,
- gtk_text_buffer_get_insert (text_buffer) );
- mark = gtk_text_buffer_create_mark( text_buffer, NULL, &start, TRUE/*left gravity*/ );
-
- gtk_text_buffer_insert_at_cursor( text_buffer, buffer, strlen(buffer) );
-
- gtk_text_buffer_get_iter_at_mark( text_buffer, &end,
- gtk_text_buffer_get_insert (text_buffer) );
- gtk_text_buffer_get_iter_at_mark( text_buffer, &start, mark );
-
GtkTextTag *tag;
tag = gtk_text_buffer_create_tag( text_buffer, NULL, "font-desc", font_description,
"foreground-gdk", colFg,
"background-gdk", colBg, NULL );
- gtk_text_buffer_apply_tag( text_buffer, tag, &start, &end );
+
+ GtkTextIter iter;
+ gtk_text_buffer_get_iter_at_mark( text_buffer, &iter,
+ gtk_text_buffer_get_insert (text_buffer) );
+
+ gtk_text_buffer_insert_with_tags( text_buffer, &iter, buffer, strlen(buffer), tag, NULL );
}
#else
static void wxGtkTextInsert(GtkWidget *text,
gtk_container_add( GTK_CONTAINER(m_widget), m_text );
// Global settings which can be overridden by tags, I guess.
- if (HasFlag( wxHSCROLL ))
+ if (HasFlag( wxHSCROLL ) || HasFlag( wxTE_DONTWRAP ))
gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( m_text ), GTK_WRAP_NONE );
else
gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( m_text ), GTK_WRAP_WORD );
if (!HasFlag(wxNO_BORDER))
gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW(m_widget), GTK_SHADOW_IN );
+
+ GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
#else
// create our control ...
m_text = gtk_text_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
m_focusWidget = m_text;
- PostCreation();
-
- SetFont( parent->GetFont() );
-
- wxSize size_best( DoGetBestSize() );
- wxSize new_size( size );
- if (new_size.x == -1)
- new_size.x = size_best.x;
- if (new_size.y == -1)
- new_size.y = size_best.y;
- if ((new_size.x != size.x) || (new_size.y != size.y))
- SetSize( new_size.x, new_size.y );
+ PostCreation(size);
if (multi_line)
gtk_widget_show(m_text);
#ifdef __WXGTK20__
else
gtk_text_view_set_editable( GTK_TEXT_VIEW( m_text), FALSE);
- }
#else
}
else
{
if (multi_line)
gtk_text_set_editable( GTK_TEXT(m_text), 1 );
- }
#endif
+ }
+#ifdef __WXGTK20__
+ if (multi_line)
+ {
+ if (style & wxTE_RIGHT)
+ gtk_text_view_set_justification( GTK_TEXT_VIEW(m_text), GTK_JUSTIFY_RIGHT );
+ else if (style & wxTE_CENTRE)
+ gtk_text_view_set_justification( GTK_TEXT_VIEW(m_text), GTK_JUSTIFY_CENTER );
+ // Left justify (alignment) is the default and we don't need to apply GTK_JUSTIFY_LEFT
+ }
+ // gtk_entry_set_alignment was introduced in gtk+-2.3.5
+#if GTK_CHECK_VERSION(2, 3, 5)
+ else
+ {
+ if (style & wxTE_RIGHT)
+ gtk_entry_set_alignment( GTK_ENTRY(m_text), 1.0 );
+ else if (style & wxTE_CENTRE)
+ gtk_entry_set_alignment( GTK_ENTRY(m_text), 0.5 );
+ }
+#endif // gtk+-2.3.5
+#endif // __WXGTK20__
+
// We want to be notified about text changes.
#ifdef __WXGTK20__
if (multi_line)
}
else
#endif
+
{
- gtk_signal_connect( GTK_OBJECT(m_text), "changed",
- GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
+ gtk_signal_connect( GTK_OBJECT(m_text), "changed",
+ GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
}
- // we don't set a valid background colour, because the window
- // manager should use a default one
- m_backgroundColour = wxColour();
-
- wxColour colFg = parent->GetForegroundColour();
- SetForegroundColour( colFg );
-
m_cursor = wxCursor( wxCURSOR_IBEAM );
- wxTextAttr attrDef( colFg, m_backgroundColour, parent->GetFont() );
+ wxTextAttr attrDef(GetForegroundColour(), GetBackgroundColour(), GetFont());
SetDefaultStyle( attrDef );
- Show( TRUE );
-
return TRUE;
}
+
void wxTextCtrl::CalculateScrollbar()
{
#ifndef __WXGTK20__
}
// GRG, Jun/2000: Changed this after a lot of discussion in
- // the lists. wxWindows 2.2 will have a set of flags to
+ // the lists. wxWidgets 2.2 will have a set of flags to
// customize this behaviour.
SetInsertionPoint(0);
// TODO: Call whatever is needed to delete the selection.
wxGtkTextInsert( m_text, text_buffer, m_defaultStyle, buffer );
- // Scroll to cursor.
- GtkTextIter iter;
- gtk_text_buffer_get_iter_at_mark( text_buffer, &iter, gtk_text_buffer_get_insert( text_buffer ) );
- gtk_text_view_scroll_to_iter( GTK_TEXT_VIEW(m_text), &iter, 0.0, FALSE, 0.0, 1.0 );
+ GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment( GTK_SCROLLED_WINDOW(m_widget) );
+ // Scroll to cursor, but only if scrollbar thumb is at the very bottom
+ if ( adj->value == adj->upper - adj->page_size )
+ {
+ gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW(m_text),
+ gtk_text_buffer_get_insert( text_buffer ), 0.0, FALSE, 0.0, 1.0 );
+ }
#else // GTK 1.x
// After cursor movements, gtk_text_get_point() is wrong by one.
gtk_text_set_point( GTK_TEXT(m_text), GET_EDITABLE_POS(m_text) );
gtk_editable_delete_selection( GTK_EDITABLE(m_text) );
wxGtkTextInsert(m_text, m_defaultStyle, text.c_str(), text.Len());
+ // we called wxGtkTextInsert with correct font, no need to do anything
+ // in UpdateFontIfNeeded() any longer
+ if ( !text.empty() )
+ {
+ m_updateFont = FALSE;
+ }
+
// Bring editable's cursor back uptodate.
SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) ));
#endif // GTK 1.x/2.0
return buf;
}
else
-#endif
{
return wxEmptyString;
}
+#else
+ GtkTextBuffer *text_buffer;
+ text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(m_text));
+ GtkTextIter line;
+ gtk_text_buffer_get_iter_at_line(text_buffer,&line,lineNo);
+ GtkTextIter end;
+ gtk_text_buffer_get_end_iter(text_buffer,&end );
+ gchar *text = gtk_text_buffer_get_text(text_buffer,&line,&end,TRUE);
+ wxString result(wxGTK_CONV_BACK(text));
+ g_free(text);
+ return result.BeforeFirst(wxT('\n'));
+#endif
}
else
{
}
}
+void wxTextCtrl::MarkDirty()
+{
+ m_modified = TRUE;
+}
+
void wxTextCtrl::DiscardEdits()
{
m_modified = FALSE;
void wxTextCtrl::ShowPosition( long pos )
{
-#ifndef __WXGTK20__
if (m_windowStyle & wxTE_MULTILINE)
{
+#ifdef __WXGTK20__
+ GtkTextBuffer *buf = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
+ GtkTextIter iter;
+ gtk_text_buffer_get_start_iter( buf, &iter );
+ gtk_text_iter_set_offset( &iter, pos );
+ GtkTextMark *mark = gtk_text_buffer_create_mark( buf, NULL, &iter, TRUE );
+ gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW(m_text), mark, 0.0, FALSE, 0.0, 0.0 );
+#else // GTK 1.x
GtkAdjustment *vp = GTK_TEXT(m_text)->vadj;
float totalLines = (float) GetNumberOfLines();
long posX;
float posLine = (float) posY;
float p = (posLine/totalLines)*(vp->upper - vp->lower) + vp->lower;
gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p);
+#endif // GTK 1.x/2.x
}
-#endif
}
long wxTextCtrl::GetInsertionPoint() const
}
}
-void wxTextCtrl::ApplyWidgetStyle()
+void wxTextCtrl::DoApplyWidgetStyle(GtkRcStyle *style)
{
- if (m_windowStyle & wxTE_MULTILINE)
- {
- // how ?
- }
- else
- {
- SetWidgetStyle();
- gtk_widget_set_style( m_text, m_widgetStyle );
- }
+ gtk_widget_modify_style(m_text, style);
}
void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
#endif
}
+
+// static
+wxVisualAttributes
+wxTextCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
+{
+ return GetDefaultAttributesFromGTKWidget(gtk_entry_new, true);
+}