]> git.saurik.com Git - wxWidgets.git/commitdiff
added line selection
authorVáclav Slavík <vslavik@fastmail.fm>
Thu, 5 Jun 2003 20:30:56 +0000 (20:30 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Thu, 5 Jun 2003 20:30:56 +0000 (20:30 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20951 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/html/htmlwin.h
src/html/htmlwin.cpp

index c94b2fa5208fdea71f547f6f961812bea18bfb1e..ff0a7d51a33526e4a1a3cf90e30c12f93c408cfc 100644 (file)
@@ -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
 
index 1b67f52cf5a0981f4369122eee874380665e192d..509dc190c8f56077bf22e76134c7e7ae20e61e09 100644 (file)
@@ -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