X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/902725eefee5a402d21d13b2630583ab28ae3931..f81dc6e93170cb73c6d614b77e26be49baa724d2:/src/gtk1/textctrl.cpp diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 52c1f01d66..a6dfa4b31d 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -7,10 +7,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "textctrl.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -18,6 +14,7 @@ #include "wx/utils.h" #include "wx/intl.h" #include "wx/log.h" +#include "wx/math.h" #include "wx/settings.h" #include "wx/panel.h" #include "wx/strconv.h" @@ -42,7 +39,6 @@ extern bool g_isIdle; // data //----------------------------------------------------------------------------- -extern bool g_blockEventsOnDrag; extern wxCursor g_globalCursor; extern wxWindowGTK *g_delayedFocus; @@ -56,12 +52,13 @@ static void wxGtkOnRemoveTag(GtkTextBuffer *buffer, GtkTextTag *tag, GtkTextIter *start, GtkTextIter *end, - gpointer user_data) + char *prefix) { gchar *name; g_object_get (tag, "name", &name, NULL); - if (!name || strncmp(name, "WX", 2)) // anonymous tag or not starting with "WX" + if (!name || strncmp(name, prefix, strlen(prefix))) + // anonymous tag or not starting with prefix - don't remove g_signal_stop_emission_by_name(buffer, "remove_tag"); g_free(name); @@ -78,7 +75,7 @@ static void wxGtkTextApplyTagsFromAttr(GtkTextBuffer *text_buffer, GtkTextTag *tag; gulong remove_handler_id = g_signal_connect( text_buffer, "remove_tag", - G_CALLBACK(wxGtkOnRemoveTag), NULL); + G_CALLBACK(wxGtkOnRemoveTag), gpointer("WX")); gtk_text_buffer_remove_all_tags(text_buffer, start, end); g_signal_handler_disconnect( text_buffer, remove_handler_id ); @@ -123,6 +120,44 @@ static void wxGtkTextApplyTagsFromAttr(GtkTextBuffer *text_buffer, "background-gdk", colBg, NULL ); gtk_text_buffer_apply_tag (text_buffer, tag, start, end); } + + if (attr.HasAlignment()) + { + GtkTextIter para_start, para_end = *end; + gtk_text_buffer_get_iter_at_line( text_buffer, + ¶_start, + gtk_text_iter_get_line(start) ); + gtk_text_iter_forward_line(¶_end); + + remove_handler_id = g_signal_connect( text_buffer, "remove_tag", + G_CALLBACK(wxGtkOnRemoveTag), + gpointer("WXALIGNMENT")); + gtk_text_buffer_remove_all_tags( text_buffer, ¶_start, ¶_end ); + g_signal_handler_disconnect( text_buffer, remove_handler_id ); + + GtkJustification align; + switch (attr.GetAlignment()) + { + default: + align = GTK_JUSTIFY_LEFT; + break; + case wxTEXT_ALIGNMENT_RIGHT: + align = GTK_JUSTIFY_RIGHT; + break; + case wxTEXT_ALIGNMENT_CENTER: + align = GTK_JUSTIFY_CENTER; + break; + // gtk+ doesn't support justify as of gtk+-2.7.4 + } + + g_snprintf(buf, sizeof(buf), "WXALIGNMENT %d", align); + tag = gtk_text_tag_table_lookup( gtk_text_buffer_get_tag_table( text_buffer ), + buf ); + if (!tag) + tag = gtk_text_buffer_create_tag( text_buffer, buf, + "justification", align, NULL ); + gtk_text_buffer_apply_tag( text_buffer, tag, ¶_start, ¶_end ); + } } } @@ -130,7 +165,7 @@ extern "C" { static void wxGtkTextInsert(GtkWidget *text, GtkTextBuffer *text_buffer, const wxTextAttr& attr, - wxCharBuffer buffer) + const wxCharBuffer& buffer) { gint start_offset; @@ -995,7 +1030,7 @@ void wxTextCtrl::WriteText( const wxString &text ) 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 ) + if ( wxIsSameDouble(adj->value, adj->upper - adj->page_size) ) { gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW(m_text), gtk_text_buffer_get_insert( m_buffer ), 0.0, FALSE, 0.0, 1.0 ); @@ -1092,12 +1127,12 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const #else GtkTextIter line; gtk_text_buffer_get_iter_at_line(m_buffer,&line,lineNo); - GtkTextIter end; - gtk_text_buffer_get_end_iter(m_buffer,&end ); + GtkTextIter end = line; + gtk_text_iter_forward_to_line_end(&end); gchar *text = gtk_text_buffer_get_text(m_buffer,&line,&end,TRUE); wxString result(wxGTK_CONV_BACK(text)); g_free(text); - return result.BeforeFirst(wxT('\n')); + return result; #endif } else @@ -1118,6 +1153,15 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const { if ( m_windowStyle & wxTE_MULTILINE ) { +#ifdef __WXGTK20__ + GtkTextIter iter; + gtk_text_buffer_get_iter_at_offset(m_buffer, &iter, pos); + if (gtk_text_iter_is_end(&iter)) + return false; + + *y = gtk_text_iter_get_line(&iter); + *x = gtk_text_iter_get_line_offset(&iter); +#else wxString text = GetValue(); // cast to prevent warning. But pos really should've been unsigned. @@ -1138,6 +1182,7 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const else (*x)++; } +#endif } else // single line control { @@ -1160,17 +1205,45 @@ long wxTextCtrl::XYToPosition(long x, long y ) const { if (!(m_windowStyle & wxTE_MULTILINE)) return 0; +#ifdef __WXGTK20__ + GtkTextIter iter; + if (y >= gtk_text_buffer_get_line_count (m_buffer)) + return -1; + + gtk_text_buffer_get_iter_at_line(m_buffer, &iter, y); + if (x >= gtk_text_iter_get_chars_in_line (&iter)) + return -1; + + return gtk_text_iter_get_offset(&iter) + x; +#else long pos=0; for( int i=0; i last_line) + return -1; + + GtkTextIter iter; + gtk_text_buffer_get_iter_at_line(m_buffer, &iter, lineNo); + // get_chars_in_line return includes paragraph delimiters, so need to subtract 1 IF it is not the last line + return gtk_text_iter_get_chars_in_line(&iter) - ((lineNo == last_line) ? 0 : 1); + } + else +#endif + { + wxString str = GetLineText (lineNo); + return (int) str.Length(); + } } int wxTextCtrl::GetNumberOfLines() const @@ -1511,7 +1584,7 @@ long wxTextCtrl::GetInsertionPoint() const else #endif { - return (long) GET_EDITABLE_POS(m_text); + return (long) GET_EDITABLE_POS(m_text); } } @@ -2082,7 +2155,7 @@ void wxTextCtrl::Freeze() gtk_widget_set_sensitive(m_widget, false); g_object_ref(m_buffer); gtk_text_view_set_buffer(GTK_TEXT_VIEW(m_text), gtk_text_buffer_new(NULL)); - } + } #else gtk_text_freeze(GTK_TEXT(m_text)); #endif