added public methods to select parts of displayed page

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25735 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2004-02-11 12:14:40 +00:00
parent 00ee93d7e4
commit 2a536376ec

View File

@@ -185,7 +185,8 @@ bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id,
long style, const wxString& name) long style, const wxString& name)
{ {
if (!wxScrolledWindow::Create(parent, id, pos, size, if (!wxScrolledWindow::Create(parent, id, pos, size,
style | wxVSCROLL | wxHSCROLL, name)) style | wxVSCROLL | wxHSCROLL,
name))
return FALSE; return FALSE;
m_Style = style; m_Style = style;
@@ -1243,69 +1244,87 @@ void wxHtmlWindow::OnDoubleClick(wxMouseEvent& event)
void wxHtmlWindow::SelectWord(const wxPoint& pos) void wxHtmlWindow::SelectWord(const wxPoint& pos)
{ {
wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y); if ( m_Cell )
if ( cell )
{ {
delete m_selection; wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y);
m_selection = new wxHtmlSelection(); if ( cell )
m_selection->Set(cell, cell); {
RefreshRect(wxRect(CalcScrolledPosition(cell->GetAbsPos()), delete m_selection;
wxSize(cell->GetWidth(), cell->GetHeight()))); 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) void wxHtmlWindow::SelectLine(const wxPoint& pos)
{ {
wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y); if ( m_Cell )
if ( cell )
{ {
// We use following heuristic to find a "line": let the line be all wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y);
// cells in same container as the cell under mouse cursor that are if ( cell )
// 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; // We use following heuristic to find a "line": let the line be all
if ( y + c->GetHeight() > y1 && y < y2 ) // cells in same container as the cell under mouse cursor that are
after = c; // neither completely above nor completely bellow the clicked cell
else // (i.e. are likely to be words positioned on same line of text).
break;
}
if ( !after )
after = cell;
// find first cell of line: int y1 = cell->GetAbsPos().y;
for ( c = cell->GetParent()->GetFirstChild(); int y2 = y1 + cell->GetHeight();
c && c != cell; c = c->GetNext()) int y;
{ const wxHtmlCell *c;
y = c->GetAbsPos().y; const wxHtmlCell *before = NULL;
if ( y + c->GetHeight() > y1 && y < y2 ) const wxHtmlCell *after = NULL;
// find last cell of line:
for ( c = cell->GetNext(); c; c = c->GetNext())
{ {
if ( ! before ) y = c->GetAbsPos().y;
before = c; if ( y + c->GetHeight() > y1 && y < y2 )
after = c;
else
break;
} }
else if ( !after )
before = NULL; after = cell;
}
if ( !before )
before = 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();
}
}
}
void wxHtmlWindow::SelectAll()
{
if ( m_Cell )
{
delete m_selection; delete m_selection;
m_selection = new wxHtmlSelection(); m_selection = new wxHtmlSelection();
m_selection->Set(before, after); m_selection->Set(m_Cell->GetFirstTerminal(), m_Cell->GetLastTerminal());
Refresh(); Refresh();
} }
} }
#endif // wxUSE_CLIPBOARD #endif // wxUSE_CLIPBOARD