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:
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user