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:
Václav Slavík
2003-06-05 20:30:56 +00:00
parent 13bf5a8231
commit 0994d9683e
2 changed files with 99 additions and 18 deletions

View File

@@ -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

View File

@@ -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