]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/textctrl.cpp
use wxDIB object instead of static ConvertFromBitmap() in CF_DIB case
[wxWidgets.git] / src / gtk / textctrl.cpp
index 0b1fc61efe8a28e61b6829aa6add7fc9dad1d8af..648fdab6a5533b8ae68ca1a3f9dee7a3afcf9686 100644 (file)
@@ -7,10 +7,13 @@
 // 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"
@@ -65,28 +68,16 @@ static void wxGtkTextInsert(GtkWidget *text,
                         ? 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,
@@ -319,6 +310,8 @@ bool wxTextCtrl::Create( wxWindow *parent,
 
         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 );
@@ -356,8 +349,7 @@ bool wxTextCtrl::Create( wxWindow *parent,
     m_focusWidget = m_text;
 
     PostCreation();
-
-    SetFont( parent->GetFont() );
+    InheritAttributes();
 
     wxSize size_best( DoGetBestSize() );
     wxSize new_size( size );
@@ -453,8 +445,8 @@ bool wxTextCtrl::Create( wxWindow *parent,
     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
@@ -596,10 +588,13 @@ void wxTextCtrl::WriteText( const wxString &text )
         // 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) );
@@ -610,6 +605,13 @@ void wxTextCtrl::WriteText( const wxString &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
@@ -673,10 +675,21 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const
             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
     {
@@ -911,6 +924,11 @@ void wxTextCtrl::OnParentEnable( bool enable )
     }
 }
 
+void wxTextCtrl::MarkDirty()
+{
+    m_modified = TRUE;
+}
+
 void wxTextCtrl::DiscardEdits()
 {
     m_modified = FALSE;
@@ -1014,9 +1032,16 @@ void wxTextCtrl::SetSelection( long from, long to )
 
 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;
@@ -1025,8 +1050,8 @@ void wxTextCtrl::ShowPosition( long pos )
         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