1. wxLayoutList::GetNumLines() and MoveCursorToEnd() added (and work)

2. FindObjectScreen() applies the line style - corrects "mouse click mis
   positions the cursor" bug


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2762 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-06-11 12:10:26 +00:00
parent cc7755804f
commit f7770f09be
3 changed files with 46 additions and 9 deletions

View File

@@ -644,6 +644,8 @@ wxLayoutLine::wxLayoutLine(wxLayoutLine *prev, wxLayoutList *llist)
} }
m_StyleInfo = llist->GetDefaultStyleInfo(); m_StyleInfo = llist->GetDefaultStyleInfo();
llist->IncNumLines();
} }
wxLayoutLine::~wxLayoutLine() wxLayoutLine::~wxLayoutLine()
@@ -1004,8 +1006,12 @@ wxLayoutLine::DeleteWord(CoordType xpos)
wxLayoutLine * wxLayoutLine *
wxLayoutLine::DeleteLine(bool update, wxLayoutList *llist) wxLayoutLine::DeleteLine(bool update, wxLayoutList *llist)
{ {
if(m_Next) m_Next->m_Previous = m_Previous; // maintain linked list integrity
if(m_Previous) m_Previous->m_Next = m_Next; if(m_Next)
m_Next->m_Previous = m_Previous;
if(m_Previous)
m_Previous->m_Next = m_Next;
if(update) if(update)
{ {
m_Next->MoveLines(-1); m_Next->MoveLines(-1);
@@ -1021,6 +1027,9 @@ wxLayoutLine::DeleteLine(bool update, wxLayoutList *llist)
} }
wxLayoutLine *next = m_Next; wxLayoutLine *next = m_Next;
delete this; delete this;
llist->DecNumLines();
return next; return next;
} }
@@ -1513,6 +1522,7 @@ wxLayoutList::wxLayoutList()
m_caret = NULL; m_caret = NULL;
#endif // WXLAYOUT_USE_CARET #endif // WXLAYOUT_USE_CARET
m_numLines = 0;
m_FirstLine = NULL; m_FirstLine = NULL;
InvalidateUpdateRect(); InvalidateUpdateRect();
Clear(); Clear();
@@ -1522,6 +1532,8 @@ wxLayoutList::~wxLayoutList()
{ {
InternalClear(); InternalClear();
m_FirstLine->DeleteLine(false, this); m_FirstLine->DeleteLine(false, this);
wxASSERT_MSG( m_numLines == 0, "line count calculation broken" );
} }
void void
@@ -2296,15 +2308,22 @@ wxLayoutList::FindObjectScreen(wxDC &dc, wxPoint const pos,
#endif #endif
line = line->GetNextLine(); line = line->GetNextLine();
} }
if(line == NULL)
if ( !line )
{ {
if(found) *found = false; if ( found )
*found = false;
return NULL; // not found return NULL; // not found
} }
if(cursorPos) cursorPos->y = line->GetLineNumber();
if ( cursorPos )
cursorPos->y = line->GetLineNumber();
// Now, find the object in the line: // Now, find the object in the line:
ApplyStyle(line->GetStyleInfo(), dc);
wxLOiterator i = line->FindObjectScreen(dc, pos.x, wxLOiterator i = line->FindObjectScreen(dc, pos.x,
cursorPos ? & cursorPos->x : NULL , cursorPos ? &cursorPos->x : NULL,
found); found);
return (i == NULLIT) ? NULL : *i; return (i == NULLIT) ? NULL : *i;

View File

@@ -798,14 +798,24 @@ public:
MoveCursorHorizontally(m_CursorLine->GetLength()-m_CursorPos.x); MoveCursorHorizontally(m_CursorLine->GetLength()-m_CursorPos.x);
} }
/// Move cursor to begin of line. /// Move cursor to the start of line.
void MoveCursorToBeginOfLine(void) void MoveCursorToBeginOfLine(void)
{ MoveCursorHorizontally(-m_CursorPos.x); } { MoveCursorHorizontally(-m_CursorPos.x); }
/// get the number of lines in the list
size_t GetNumLines() const { return m_numLines; }
/// Returns current cursor position. /// Returns current cursor position.
const wxPoint &GetCursorPos(wxDC &dc) const { return m_CursorPos; } const wxPoint &GetCursorPos(wxDC &dc) const { return m_CursorPos; }
const wxPoint &GetCursorPos() const { return m_CursorPos; } const wxPoint &GetCursorPos() const { return m_CursorPos; }
/// move cursor to the end of text
void MoveCursorToEnd(void)
{
MoveCursorTo(wxPoint(0, GetNumLines() - 1));
MoveCursorToEndOfLine();
}
//@} //@}
/**@name Editing functions. /**@name Editing functions.
@@ -1109,16 +1119,24 @@ public:
void Debug(void); void Debug(void);
#endif #endif
// for wxLayoutLine usage only
void IncNumLines() { m_numLines++; }
void DecNumLines() { m_numLines--; }
private: private:
/// Clear the list. /// Clear the list.
void InternalClear(void); void InternalClear(void);
/// The list of lines. /// The list of lines.
wxLayoutLine *m_FirstLine; wxLayoutLine *m_FirstLine;
/// The number of lines in the list (store instead recalculating for speed)
size_t m_numLines;
/// The update rectangle which needs to be refreshed: /// The update rectangle which needs to be refreshed:
wxRect m_UpdateRect; wxRect m_UpdateRect;
/// Is the update rectangle valid? /// Is the update rectangle valid?
bool m_UpdateRectValid; bool m_UpdateRectValid;
/**@name Cursor Management */ /**@name Cursor Management */
//@{ //@{
/// Where the text cursor (column,line) is. /// Where the text cursor (column,line) is.

View File

@@ -304,7 +304,7 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
else else
{ {
// click beyond the end of the text // click beyond the end of the text
m_llist->MoveCursorTo(m_llist->GetSize()); m_llist->MoveCursorToEnd();
} }
// clicking a mouse removes the selection // clicking a mouse removes the selection
@@ -490,7 +490,7 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
break; break;
case WXK_END: case WXK_END:
if ( ctrlDown ) if ( ctrlDown )
m_llist->MoveCursorTo(m_llist->GetSize()); m_llist->MoveCursorToEnd();
else else
m_llist->MoveCursorToEndOfLine(); m_llist->MoveCursorToEndOfLine();
break; break;