X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/31eefb998d894e3b566e13714fa53186101829a1..f9007c324c9b4f6288156dcf0b865090ee0c0c38:/src/html/htmlwin.cpp diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 1af6efb59d..c025b66edb 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -33,6 +33,7 @@ #include "wx/html/htmlproc.h" #include "wx/list.h" #include "wx/clipbrd.h" +#include "wx/dataobj.h" #include "wx/timer.h" #include "wx/dcmemory.h" @@ -173,6 +174,7 @@ void wxHtmlWindow::Init() m_makingSelection = false; #if wxUSE_CLIPBOARD m_timerAutoScroll = NULL; + m_lastDoubleClick = 0; #endif m_backBuffer = NULL; } @@ -859,20 +861,30 @@ void wxHtmlWindow::OnMouseMove(wxMouseEvent& event) void wxHtmlWindow::OnMouseDown(wxMouseEvent& event) { +#if wxUSE_CLIPBOARD if ( event.LeftDown() && IsSelectionEnabled() ) { - m_makingSelection = true; - - if ( m_selection ) + const long TRIPLECLICK_LEN = 200; // 0.2 sec after doubleclick + if ( wxGetLocalTimeMillis() - m_lastDoubleClick <= TRIPLECLICK_LEN ) { - wxDELETE(m_selection); - Refresh(); + SelectLine(CalcUnscrolledPosition(event.GetPosition())); } - m_tmpSelFromPos = CalcUnscrolledPosition(event.GetPosition()); - m_tmpSelFromCell = NULL; + else + { + m_makingSelection = true; + + if ( m_selection ) + { + wxDELETE(m_selection); + Refresh(); + } + m_tmpSelFromPos = CalcUnscrolledPosition(event.GetPosition()); + m_tmpSelFromCell = NULL; - CaptureMouse(); + CaptureMouse(); + } } +#endif } void wxHtmlWindow::OnMouseUp(wxMouseEvent& event) @@ -1144,20 +1156,78 @@ void wxHtmlWindow::OnDoubleClick(wxMouseEvent& event) // select word under cursor: if ( IsSelectionEnabled() ) { - wxPoint pos = CalcUnscrolledPosition(event.GetPosition()); - wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y); - if ( cell ) - { - delete m_selection; - m_selection = new wxHtmlSelection(); - m_selection->Set(cell, cell); - RefreshRect(wxRect(CalcScrolledPosition(cell->GetAbsPos()), - wxSize(cell->GetWidth(), cell->GetHeight()))); - } + 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); + if ( cell ) + { + delete m_selection; + m_selection = new wxHtmlSelection(); + m_selection->Set(cell, cell); + RefreshRect(wxRect(CalcScrolledPosition(cell->GetAbsPos()), + 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 + 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