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
if (m_windowStyle & wxTE_MULTILINE)
{
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 );
gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
+ // Note: the insertion point is now at 'len' (past our insertion).
void wxTextCtrl::OnDropFiles( wxDropFilesEvent &WXUNUSED(event) )
{
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" );
}
wxFAIL_MSG( "wxTextCtrl::OnDropFiles not implemented" );
}
if( (unsigned long)pos > text.Len() )
return FALSE;
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++ )
const char* stop = text.c_str() + pos;
for ( const char *p = text.c_str(); p < stop; p++ )
if (*p == '\n')
{
(*y)++;
if (*p == '\n')
{
(*y)++;
{
if ( pos <= GTK_ENTRY(m_text)->text_length )
{
{
if ( pos <= GTK_ENTRY(m_text)->text_length )
{
if (!(m_windowStyle & wxTE_MULTILINE)) return 0;
long pos=0;
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
void wxTextCtrl::SetInsertionPoint( long pos )
{
void wxTextCtrl::SetInsertionPoint( long pos )
{
wxCHECK_RET( m_text != NULL, "invalid text ctrl" );
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 );
}
else
gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos );
}
else
pos = GTK_ENTRY(m_text)->text_length;
else
pos = GTK_ENTRY(m_text)->text_length;
}
void wxTextCtrl::Remove( long from, long to )
}
void wxTextCtrl::Remove( long from, long to )
if (m_windowStyle & wxTE_MULTILINE)
{
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 );
gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
+ // Note: the insertion point is now at 'len' (past our insertion).
void wxTextCtrl::OnDropFiles( wxDropFilesEvent &WXUNUSED(event) )
{
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" );
}
wxFAIL_MSG( "wxTextCtrl::OnDropFiles not implemented" );
}
if( (unsigned long)pos > text.Len() )
return FALSE;
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++ )
const char* stop = text.c_str() + pos;
for ( const char *p = text.c_str(); p < stop; p++ )
if (*p == '\n')
{
(*y)++;
if (*p == '\n')
{
(*y)++;
{
if ( pos <= GTK_ENTRY(m_text)->text_length )
{
{
if ( pos <= GTK_ENTRY(m_text)->text_length )
{
if (!(m_windowStyle & wxTE_MULTILINE)) return 0;
long pos=0;
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
void wxTextCtrl::SetInsertionPoint( long pos )
{
void wxTextCtrl::SetInsertionPoint( long pos )
{
wxCHECK_RET( m_text != NULL, "invalid text ctrl" );
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 );
}
else
gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos );
}
else
pos = GTK_ENTRY(m_text)->text_length;
else
pos = GTK_ENTRY(m_text)->text_length;
}
void wxTextCtrl::Remove( long from, long to )
}
void wxTextCtrl::Remove( long from, long to )