// 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,
GtkTextIter end;
gtk_text_buffer_get_end_iter( text_buffer, &end );
gchar *text = gtk_text_buffer_get_text( text_buffer, &start, &end, TRUE );
-
+
#if wxUSE_UNICODE
wxWCharBuffer buffer( wxConvUTF8.cMB2WX( text ) );
#else
wxCharBuffer buffer( wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( text ) ) );
#endif
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
-
+
// TODO: Call whatever is needed to delete the selection.
wxGtkTextInsert( m_text, text_buffer, m_defaultStyle, buffer );
{
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
- gint from, to;
-#ifdef __WXGTK20__
- GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (m_text));
- GtkTextIter ifrom, ito;
- if (!gtk_text_buffer_get_selection_bounds(buffer, &ifrom, &ito))
-#else
- if ( !(GTK_EDITABLE(m_text)->has_selection) )
-#endif
- {
- from =
- to = GetInsertionPoint();
- }
- else // got selection
- {
+ gint from = -1;
+ gint to = -1;
+ bool haveSelection = FALSE;
+
#ifdef __WXGTK20__
- from = gtk_text_iter_get_offset(&ifrom);
- to = gtk_text_iter_get_offset(&ito);
-#else
- from = (long) GTK_EDITABLE(m_text)->selection_start_pos;
- to = (long) GTK_EDITABLE(m_text)->selection_end_pos;
+ if (m_windowStyle & wxTE_MULTILINE)
+ {
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (m_text));
+ GtkTextIter ifrom, ito;
+ if ( gtk_text_buffer_get_selection_bounds(buffer, &ifrom, &ito) )
+ {
+ haveSelection = TRUE;
+ from = gtk_text_iter_get_offset(&ifrom);
+ to = gtk_text_iter_get_offset(&ito);
+ }
+ }
+ else // not multi-line
+ {
+ if ( gtk_editable_get_selection_bounds( GTK_EDITABLE(m_text),
+ &from, &to) )
+ {
+ haveSelection = TRUE;
+ }
+ }
+#else // not GTK2
+ if ( (GTK_EDITABLE(m_text)->has_selection) )
+ {
+ haveSelection = TRUE;
+ from = (long) GTK_EDITABLE(m_text)->selection_start_pos;
+ to = (long) GTK_EDITABLE(m_text)->selection_end_pos;
+ }
#endif
- if ( from > to )
- {
- // exchange them to be compatible with wxMSW
- gint tmp = from;
- from = to;
- to = tmp;
- }
- }
+ if (! haveSelection )
+ from = to = GetInsertionPoint();
+
+ if ( from > to )
+ {
+ // exchange them to be compatible with wxMSW
+ gint tmp = from;
+ from = to;
+ to = tmp;
+ }
if ( fromOut )
*fromOut = from;
*toOut = to;
}
+
bool wxTextCtrl::IsEditable() const
{
wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );
#else
// VERY dirty way to do that - removes the required text and re-adds it
// with styling (FIXME)
-
+
gint l = gtk_text_get_length( GTK_TEXT(m_text) );
wxCHECK_MSG( start >= 0 && end <= l, FALSE,
}
}
- UpdateWindowUI();
+ if (wxUpdateUIEvent::CanUpdate(this))
+ UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
}
wxSize wxTextCtrl::DoGetBestSize() const