added line selection
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20951 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -245,6 +245,12 @@ protected:
|
|||||||
|
|
||||||
// Copies selection to clipboard:
|
// Copies selection to clipboard:
|
||||||
void CopySelection(ClipboardType t = Secondary);
|
void CopySelection(ClipboardType t = Secondary);
|
||||||
|
|
||||||
|
// Helper functions to select parts of page:
|
||||||
|
void SelectWord(const wxPoint& pos);
|
||||||
|
void SelectLine(const wxPoint& pos);
|
||||||
|
|
||||||
|
// Automatic scrolling during selection:
|
||||||
void StopAutoScrolling();
|
void StopAutoScrolling();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -284,6 +290,12 @@ protected:
|
|||||||
bool m_makingSelection;
|
bool m_makingSelection;
|
||||||
|
|
||||||
#if wxUSE_CLIPBOARD
|
#if wxUSE_CLIPBOARD
|
||||||
|
// time of the last doubleclick event, used to detect tripleclicks
|
||||||
|
// (tripleclicks are used to select whole line):
|
||||||
|
wxLongLong m_lastDoubleClick;
|
||||||
|
|
||||||
|
// helper class to automatically scroll the window if the user is selecting
|
||||||
|
// text and the mouse leaves wxHtmlWindow:
|
||||||
wxHtmlWinAutoScrollTimer *m_timerAutoScroll;
|
wxHtmlWinAutoScrollTimer *m_timerAutoScroll;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -176,6 +176,7 @@ void wxHtmlWindow::Init()
|
|||||||
m_timerAutoScroll = NULL;
|
m_timerAutoScroll = NULL;
|
||||||
#endif
|
#endif
|
||||||
m_backBuffer = NULL;
|
m_backBuffer = NULL;
|
||||||
|
m_lastDoubleClick = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id,
|
bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id,
|
||||||
@@ -860,7 +861,15 @@ void wxHtmlWindow::OnMouseMove(wxMouseEvent& event)
|
|||||||
|
|
||||||
void wxHtmlWindow::OnMouseDown(wxMouseEvent& event)
|
void wxHtmlWindow::OnMouseDown(wxMouseEvent& event)
|
||||||
{
|
{
|
||||||
|
#if wxUSE_CLIPBOARD
|
||||||
if ( event.LeftDown() && IsSelectionEnabled() )
|
if ( event.LeftDown() && IsSelectionEnabled() )
|
||||||
|
{
|
||||||
|
const long TRIPLECLICK_LEN = 200; // 0.2 sec after doubleclick
|
||||||
|
if ( wxGetLocalTimeMillis() - m_lastDoubleClick <= TRIPLECLICK_LEN )
|
||||||
|
{
|
||||||
|
SelectLine(CalcUnscrolledPosition(event.GetPosition()));
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
m_makingSelection = true;
|
m_makingSelection = true;
|
||||||
|
|
||||||
@@ -875,6 +884,8 @@ void wxHtmlWindow::OnMouseDown(wxMouseEvent& event)
|
|||||||
CaptureMouse();
|
CaptureMouse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void wxHtmlWindow::OnMouseUp(wxMouseEvent& event)
|
void wxHtmlWindow::OnMouseUp(wxMouseEvent& event)
|
||||||
{
|
{
|
||||||
@@ -1145,7 +1156,15 @@ void wxHtmlWindow::OnDoubleClick(wxMouseEvent& event)
|
|||||||
// select word under cursor:
|
// select word under cursor:
|
||||||
if ( IsSelectionEnabled() )
|
if ( IsSelectionEnabled() )
|
||||||
{
|
{
|
||||||
wxPoint pos = CalcUnscrolledPosition(event.GetPosition());
|
SelectWord(CalcUnscrolledPosition(event.GetPosition()));
|
||||||
|
m_lastDoubleClick = wxGetLocalTimeMillis();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxHtmlWindow::SelectWord(const wxPoint& pos)
|
||||||
|
{
|
||||||
wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y);
|
wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y);
|
||||||
if ( cell )
|
if ( cell )
|
||||||
{
|
{
|
||||||
@@ -1156,8 +1175,58 @@ void wxHtmlWindow::OnDoubleClick(wxMouseEvent& event)
|
|||||||
wxSize(cell->GetWidth(), cell->GetHeight())));
|
wxSize(cell->GetWidth(), cell->GetHeight())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxHtmlWindow::SelectLine(const wxPoint& pos)
|
||||||
|
{
|
||||||
|
wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y);
|
||||||
|
if ( cell )
|
||||||
|
{
|
||||||
|
// We use following heuristic to find a "line": let the line be all
|
||||||
|
// cells in same container as the cell under mouse cursor that are
|
||||||
|
// neither completely above nor completely bellow the clicked cell
|
||||||
|
// (i.e. are likely to be words positioned on same line of text).
|
||||||
|
|
||||||
|
int y1 = cell->GetAbsPos().y;
|
||||||
|
int y2 = y1 + cell->GetHeight();
|
||||||
|
int y;
|
||||||
|
const wxHtmlCell *c;
|
||||||
|
const wxHtmlCell *before = NULL;
|
||||||
|
const wxHtmlCell *after = NULL;
|
||||||
|
|
||||||
|
// find last cell of line:
|
||||||
|
for ( c = cell->GetNext(); c; c = c->GetNext())
|
||||||
|
{
|
||||||
|
y = c->GetAbsPos().y;
|
||||||
|
if ( y + c->GetHeight() > y1 && y < y2 )
|
||||||
|
after = c;
|
||||||
else
|
else
|
||||||
event.Skip();
|
break;
|
||||||
|
}
|
||||||
|
if ( !after )
|
||||||
|
after = cell;
|
||||||
|
|
||||||
|
// find first cell of line:
|
||||||
|
for ( c = cell->GetParent()->GetFirstChild();
|
||||||
|
c && c != cell; c = c->GetNext())
|
||||||
|
{
|
||||||
|
y = c->GetAbsPos().y;
|
||||||
|
if ( y + c->GetHeight() > y1 && y < y2 )
|
||||||
|
{
|
||||||
|
if ( ! before )
|
||||||
|
before = c;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
before = NULL;
|
||||||
|
}
|
||||||
|
if ( !before )
|
||||||
|
before = cell;
|
||||||
|
|
||||||
|
delete m_selection;
|
||||||
|
m_selection = new wxHtmlSelection();
|
||||||
|
m_selection->Set(before, after);
|
||||||
|
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user