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:
@@ -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;
|
||||||
|
|
||||||
|
@@ -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.
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user