X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/968602f8909896da801e9460bfbbde9a33fd5f18..e7300ec6d9ebbd1cfa2fcf12c0ce6e5aee85a152:/src/x11/textctrl.cpp diff --git a/src/x11/textctrl.cpp b/src/x11/textctrl.cpp index 6fd8e22899..d7ee081007 100644 --- a/src/x11/textctrl.cpp +++ b/src/x11/textctrl.cpp @@ -249,6 +249,8 @@ bool wxTextCtrl::Create( wxWindow *parent, // We create an input handler since it might be useful CreateInputHandler(wxINP_HANDLER_TEXTCTRL); + MyAdjustScrollbars(); + return TRUE; } @@ -271,14 +273,10 @@ wxString wxTextCtrl::GetValue() const void wxTextCtrl::SetValue(const wxString& value) { - m_modified = TRUE; + m_modified = FALSE; + + wxString oldValue = GetValue(); - if ((GetWindowStyle() & wxTE_MULTILINE) == 0) - { - if (value == GetValue()) - return; - } - m_cursorX = 0; m_cursorY = 0; ClearSelection(); @@ -328,6 +326,13 @@ void wxTextCtrl::SetValue(const wxString& value) } } } + + // Don't need to refresh if the value hasn't changed + if ((GetWindowStyle() & wxTE_MULTILINE) == 0) + { + if (value == oldValue) + return; + } MyAdjustScrollbars(); @@ -367,6 +372,17 @@ bool wxTextCtrl::IsEditable() const void wxTextCtrl::GetSelection(long* from, long* to) const { + if (m_selStartX == -1 || m_selStartY == -1 || + m_selEndX == -1 || m_selEndY == -1) + { + *from = GetInsertionPoint(); + *to = GetInsertionPoint(); + } + else + { + *from = XYToPosition(m_selStartX, m_selStartY); + *to = XYToPosition(m_selEndX, m_selEndY); + } } void wxTextCtrl::Clear() @@ -747,14 +763,15 @@ long wxTextCtrl::XYToPosition(long x, long y) const { if (i < (size_t)y) { - ret += m_lines[i].m_text.Len(); + // Add one for the end-of-line character + ret += m_lines[i].m_text.Len() + 1; continue; } - if ((size_t)x < m_lines[i].m_text.Len()) + if ((size_t)x < (m_lines[i].m_text.Len()+1)) return (ret + x); else - return (ret + m_lines[i].m_text.Len()); + return (ret + m_lines[i].m_text.Len() + 1); } return ret; @@ -775,19 +792,25 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const for (size_t i = 0; i < m_lines.GetCount(); i++) { - pos -= m_lines[i].m_text.Len(); - if (pos <= 0) + //pos -= m_lines[i].m_text.Len(); + //if (pos <= 0) + + // Add one for the end-of-line character. (In Windows, + // there are _two_ positions for each end of line.) + if (pos <= ((int)m_lines[i].m_text.Len())) { - xx = -pos; + xx = pos; if (x) *x = xx; if (y) *y = yy; return TRUE; } + pos -= (m_lines[i].m_text.Len() + 1); yy++; } // Last pos - xx = m_lines[ m_lines.GetCount()-1 ].m_text.Len(); + //xx = m_lines[ m_lines.GetCount()-1 ].m_text.Len(); + xx = pos; if (x) *x = xx; if (y) *y = yy; @@ -961,10 +984,18 @@ void wxTextCtrl::Undo() void wxTextCtrl::SetInsertionPoint(long pos) { + ClearSelection(); + long x, y; + PositionToXY(pos, & x, & y); + m_cursorX = x; + m_cursorY = y; + // TODO: scroll to this position if necessary + Refresh(); } void wxTextCtrl::SetInsertionPointEnd() { + SetInsertionPoint(GetLastPosition()); } long wxTextCtrl::GetInsertionPoint() const @@ -975,7 +1006,9 @@ long wxTextCtrl::GetInsertionPoint() const long wxTextCtrl::GetLastPosition() const { size_t lineCount = m_lines.GetCount() - 1; - return XYToPosition( m_lines[lineCount].m_text.Len()-1, lineCount ); + // It's the length of the line, not the length - 1, + // because there's a position after the last character. + return XYToPosition( m_lines[lineCount].m_text.Len(), lineCount ); } void wxTextCtrl::SetSelection(long from, long to) @@ -2222,7 +2255,7 @@ void wxTextCtrl::MoveCursor( int new_x, int new_y, bool shift, bool centre ) // if (IsSingleLine() || (m_lang == wxSOURCE_LANG_NONE)) { - if (new_x > m_lines[new_y].m_text.Len()) + if (new_x > (int) (m_lines[new_y].m_text.Len())) new_x = m_lines[new_y].m_text.Len(); } @@ -2234,6 +2267,7 @@ void wxTextCtrl::MoveCursor( int new_x, int new_y, bool shift, bool centre ) if (shift) { int x,y,w,h; + bool erase_background = TRUE; if (!has_selection) { @@ -2298,11 +2332,17 @@ void wxTextCtrl::MoveCursor( int new_x, int new_y, bool shift, bool centre ) { y = m_selEndY*m_lineHeight; h = (new_y-m_selEndY+1) * m_lineHeight; + + erase_background = ((m_selEndY < m_selStartY) || + ((m_selEndY == m_selStartY) && (m_selEndX < m_selStartX))); } else { y = new_y*m_lineHeight; h = (-new_y+m_selEndY+1) * m_lineHeight; + + erase_background = ((m_selEndY > m_selStartY) || + ((m_selEndY == m_selStartY) && (m_selEndX > m_selStartX))); } no_cursor_refresh = TRUE; m_cursorX = new_x; @@ -2315,7 +2355,7 @@ void wxTextCtrl::MoveCursor( int new_x, int new_y, bool shift, bool centre ) CalcScrolledPosition( x, y, &x, &y ); wxRect rect( x+2, y+2, w, h ); - Refresh( TRUE, &rect ); + Refresh( erase_background, &rect ); } else { @@ -2420,7 +2460,7 @@ void wxTextCtrl::MyAdjustScrollbars() int height = 0; GetClientSize( NULL, &height ); height -= 4; - if (height >= m_lines.GetCount() *m_lineHeight) + if (height >= (int)m_lines.GetCount() *m_lineHeight) y_range = 0; int view_x = 0;