]> git.saurik.com Git - wxWidgets.git/commitdiff
Loads of updates/fixes. Everything is now zero-based (positions, columns,
authorHarco de Hilster <harcoh@caos.kun.nl>
Sun, 31 Jan 1999 04:15:31 +0000 (04:15 +0000)
committerHarco de Hilster <harcoh@caos.kun.nl>
Sun, 31 Jan 1999 04:15:31 +0000 (04:15 +0000)
line numbers, insertion points, the whole business). SetInsertionPoint now
works, sort of. It doesn't move the actual cursor, but WriteText will
insert at the newly set insertion point (after which the cursor is moved
anyway). This should be good enough for most uses. See further comments
in the source. BTW, WriteText now inserts text at the current point (used
to append to the end only).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1530 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk/textctrl.cpp
src/gtk1/textctrl.cpp

index c738901fb51e257a875e02e1dee396088b849abb..884e21b6009a2ad7aef0c1257aef216315fd6c4a 100644 (file)
@@ -286,8 +286,12 @@ void wxTextCtrl::WriteText( const wxString &text )
 
     if (m_windowStyle & wxTE_MULTILINE)
     {
-        gint len = gtk_text_get_length( GTK_TEXT(m_text) );
+        //gint len = gtk_text_get_length( GTK_TEXT(m_text) );
+        // Find the current insertion point 
+       gint len = GTK_EDITABLE(m_text)->current_pos;
+       // Insert text at this point
         gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
+       // Note: the insertion point is now at 'len' (past our insertion).
     }
     else
     {
@@ -426,6 +430,8 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const
 
 void wxTextCtrl::OnDropFiles( wxDropFilesEvent &WXUNUSED(event) )
 {
+  /* If you implement this, don't forget to update the documentation!
+   * (file docs/latex/wx/text.tex) */
     wxFAIL_MSG( "wxTextCtrl::OnDropFiles not implemented" );
 }
 
@@ -439,11 +445,8 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
         if( (unsigned long)pos > text.Len()  )
             return FALSE;
 
-        *x=1;   // Col 1
-        *y=1;   // Line 1
-
-        if (pos == 0)
-            return TRUE;
+        *x=0;   // First Col
+        *y=0;   // First Line
 
         const char* stop = text.c_str() + pos;
         for ( const char *p = text.c_str(); p < stop; p++ )
@@ -451,7 +454,7 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
             if (*p == '\n')
             {
                 (*y)++;
-                *x=1;
+                *x=0;
             }
             else
                 (*x)++;
@@ -461,7 +464,7 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
     {
         if ( pos <= GTK_ENTRY(m_text)->text_length )
         {
-            *y = 1;
+            *y = 0;
             *x = pos;
         }
         else
@@ -479,11 +482,9 @@ long wxTextCtrl::XYToPosition(long x, long y ) const
     if (!(m_windowStyle & wxTE_MULTILINE)) return 0;
 
     long pos=0;
-    /* This is a kludge; our XY values are 1-based, but GetLineLength()
-     * and --Text() start counting at 0. (and so say the docs) */
-    for( int i=1; i<y; i++ ) pos += GetLineLength(i-1) + 1; // one for '\n'
+    for( int i=0; i<y; i++ ) pos += GetLineLength(i) + 1; // one for '\n'
 
-    pos += x-1; // Pos start with 0
+    pos += x
     return pos;
 }
 
@@ -526,10 +527,20 @@ int wxTextCtrl::GetNumberOfLines() const
 
 void wxTextCtrl::SetInsertionPoint( long pos )
 {
+    int len;
     wxCHECK_RET( m_text != NULL, "invalid text ctrl" );
-
-    if (m_windowStyle & wxTE_MULTILINE)
-        gtk_text_set_point( GTK_TEXT(m_text), (int)pos );
+    if (m_windowStyle & wxTE_MULTILINE) {
+        //gtk_text_set_point( GTK_TEXT(m_text), (int)pos );
+        /* HH: The call commented out above doesn't do anything. Don't know
+        * why. The code below isn't perfect either; it doesn't move the
+        * actual cursor, but subsequent calls to WriteText will insert
+        * text at the set position and move the displayed cursor behind it as 
+        * well. I guess this is good enough for most uses. */
+        len = gtk_text_get_length( GTK_TEXT(m_text) );
+       if ( (pos < 0) || (pos > len) )
+         pos = len;
+       GTK_EDITABLE(m_text)->current_pos = (int)pos;
+    }
     else
         gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos );
 }
@@ -583,7 +594,7 @@ long wxTextCtrl::GetLastPosition() const
     else
         pos = GTK_ENTRY(m_text)->text_length;
 
-    return (long)pos-1;
+    return (long)pos;
 }
 
 void wxTextCtrl::Remove( long from, long to )
index c738901fb51e257a875e02e1dee396088b849abb..884e21b6009a2ad7aef0c1257aef216315fd6c4a 100644 (file)
@@ -286,8 +286,12 @@ void wxTextCtrl::WriteText( const wxString &text )
 
     if (m_windowStyle & wxTE_MULTILINE)
     {
-        gint len = gtk_text_get_length( GTK_TEXT(m_text) );
+        //gint len = gtk_text_get_length( GTK_TEXT(m_text) );
+        // Find the current insertion point 
+       gint len = GTK_EDITABLE(m_text)->current_pos;
+       // Insert text at this point
         gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
+       // Note: the insertion point is now at 'len' (past our insertion).
     }
     else
     {
@@ -426,6 +430,8 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const
 
 void wxTextCtrl::OnDropFiles( wxDropFilesEvent &WXUNUSED(event) )
 {
+  /* If you implement this, don't forget to update the documentation!
+   * (file docs/latex/wx/text.tex) */
     wxFAIL_MSG( "wxTextCtrl::OnDropFiles not implemented" );
 }
 
@@ -439,11 +445,8 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
         if( (unsigned long)pos > text.Len()  )
             return FALSE;
 
-        *x=1;   // Col 1
-        *y=1;   // Line 1
-
-        if (pos == 0)
-            return TRUE;
+        *x=0;   // First Col
+        *y=0;   // First Line
 
         const char* stop = text.c_str() + pos;
         for ( const char *p = text.c_str(); p < stop; p++ )
@@ -451,7 +454,7 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
             if (*p == '\n')
             {
                 (*y)++;
-                *x=1;
+                *x=0;
             }
             else
                 (*x)++;
@@ -461,7 +464,7 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
     {
         if ( pos <= GTK_ENTRY(m_text)->text_length )
         {
-            *y = 1;
+            *y = 0;
             *x = pos;
         }
         else
@@ -479,11 +482,9 @@ long wxTextCtrl::XYToPosition(long x, long y ) const
     if (!(m_windowStyle & wxTE_MULTILINE)) return 0;
 
     long pos=0;
-    /* This is a kludge; our XY values are 1-based, but GetLineLength()
-     * and --Text() start counting at 0. (and so say the docs) */
-    for( int i=1; i<y; i++ ) pos += GetLineLength(i-1) + 1; // one for '\n'
+    for( int i=0; i<y; i++ ) pos += GetLineLength(i) + 1; // one for '\n'
 
-    pos += x-1; // Pos start with 0
+    pos += x
     return pos;
 }
 
@@ -526,10 +527,20 @@ int wxTextCtrl::GetNumberOfLines() const
 
 void wxTextCtrl::SetInsertionPoint( long pos )
 {
+    int len;
     wxCHECK_RET( m_text != NULL, "invalid text ctrl" );
-
-    if (m_windowStyle & wxTE_MULTILINE)
-        gtk_text_set_point( GTK_TEXT(m_text), (int)pos );
+    if (m_windowStyle & wxTE_MULTILINE) {
+        //gtk_text_set_point( GTK_TEXT(m_text), (int)pos );
+        /* HH: The call commented out above doesn't do anything. Don't know
+        * why. The code below isn't perfect either; it doesn't move the
+        * actual cursor, but subsequent calls to WriteText will insert
+        * text at the set position and move the displayed cursor behind it as 
+        * well. I guess this is good enough for most uses. */
+        len = gtk_text_get_length( GTK_TEXT(m_text) );
+       if ( (pos < 0) || (pos > len) )
+         pos = len;
+       GTK_EDITABLE(m_text)->current_pos = (int)pos;
+    }
     else
         gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos );
 }
@@ -583,7 +594,7 @@ long wxTextCtrl::GetLastPosition() const
     else
         pos = GTK_ENTRY(m_text)->text_length;
 
-    return (long)pos-1;
+    return (long)pos;
 }
 
 void wxTextCtrl::Remove( long from, long to )