From ac0d36b5237d14ec05b4b7f5d88a08bdad82a511 Mon Sep 17 00:00:00 2001 From: Harco de Hilster Date: Sun, 31 Jan 1999 04:15:31 +0000 Subject: [PATCH] Loads of updates/fixes. Everything is now zero-based (positions, columns, 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 | 43 +++++++++++++++++++++++++++---------------- src/gtk1/textctrl.cpp | 43 +++++++++++++++++++++++++++---------------- 2 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index c738901fb5..884e21b600 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -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 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 ) diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index c738901fb5..884e21b600 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -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 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 ) -- 2.45.2