From 0994d9683eb1c49793605e54f5d54e0454ec3a90 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Thu, 5 Jun 2003 20:30:56 +0000 Subject: [PATCH] added line selection git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20951 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/html/htmlwin.h | 12 +++++ src/html/htmlwin.cpp | 105 +++++++++++++++++++++++++++++++------- 2 files changed, 99 insertions(+), 18 deletions(-) diff --git a/include/wx/html/htmlwin.h b/include/wx/html/htmlwin.h index c94b2fa520..ff0a7d51a3 100644 --- a/include/wx/html/htmlwin.h +++ b/include/wx/html/htmlwin.h @@ -245,6 +245,12 @@ protected: // Copies selection to clipboard: 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(); #endif @@ -284,6 +290,12 @@ protected: bool m_makingSelection; #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; #endif diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 1b67f52cf5..509dc190c8 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -176,6 +176,7 @@ void wxHtmlWindow::Init() m_timerAutoScroll = NULL; #endif m_backBuffer = NULL; + m_lastDoubleClick = 0; } bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id, @@ -860,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) @@ -1145,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 -- 2.47.2