else
{
if ((flags & wxHTML_FIND_NEAREST_AFTER) &&
- (y < 0 || (y == 0 && x <= 0)))
+ (y < 0 || (y < 0+m_Height && x < 0+m_Width)))
return wxConstCast(this, wxHtmlCell);
else if ((flags & wxHTML_FIND_NEAREST_BEFORE) &&
- (y > m_Height-1 || (y == m_Height-1 && x >= m_Width)))
+ (y >= 0+m_Height || (y >= 0 && x >= 0)))
return wxConstCast(this, wxHtmlCell);
else
return NULL;
unsigned i = 0;
pos1 = 0;
+ // adjust for cases when the start/end position is completely
+ // outside the cell:
+ if ( pt1.y < 0 )
+ pt1.x = 0;
+ if ( pt2.y >= m_Height )
+ pt2.x = m_Width;
+
// before selection:
while ( pt1.x > 0 && i < len )
{
else if ( flags & wxHTML_FIND_NEAREST_AFTER )
{
wxHtmlCell *c;
- int y2;
for ( const wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext() )
{
- y2 = cell->GetPosY() + cell->GetHeight() - 1;
- if (y2 < y || (y2 == y && cell->GetPosX()+cell->GetWidth()-1 < x))
+ if ( cell->IsFormattingCell() )
+ continue;
+ int cellY = cell->GetPosY();
+ if (!( y < cellY || (y < cellY + cell->GetHeight() &&
+ x < cell->GetPosX() + cell->GetWidth()) ))
continue;
- c = cell->FindCellByPos(x - cell->GetPosX(), y - cell->GetPosY(),
- flags);
+
+ c = cell->FindCellByPos(x - cell->GetPosX(), y - cellY, flags);
if (c) return c;
}
}
wxHtmlCell *c2, *c = NULL;
for ( const wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext() )
{
- if (cell->GetPosY() > y ||
- (cell->GetPosY() == y && cell->GetPosX() > x))
+ if ( cell->IsFormattingCell() )
+ continue;
+ int cellY = cell->GetPosY();
+ if (!( cellY + cell->GetHeight() <= y ||
+ (y >= cellY && x >= cell->GetPosX()) ))
break;
- c2 = cell->FindCellByPos(x - cell->GetPosX(), y - cell->GetPosY(),
- flags);
+ c2 = cell->FindCellByPos(x - cell->GetPosX(), y - cellY, flags);
if (c2)
c = c2;
}
y * wxHTML_SCROLL_STEP + rect.GetTop(),
y * wxHTML_SCROLL_STEP + rect.GetBottom(),
rinfo);
+
+//#define DEBUG_HTML_SELECTION
+#ifdef DEBUG_HTML_SELECTION
+ {
+ int xc, yc, x, y;
+ wxGetMousePosition(&xc, &yc);
+ ScreenToClient(&xc, &yc);
+ CalcUnscrolledPosition(xc, yc, &x, &y);
+ wxHtmlCell *at = m_Cell->FindCellByPos(x, y);
+ wxHtmlCell *before =
+ m_Cell->FindCellByPos(x, y, wxHTML_FIND_NEAREST_BEFORE);
+ wxHtmlCell *after =
+ m_Cell->FindCellByPos(x, y, wxHTML_FIND_NEAREST_AFTER);
+
+ dcm.SetBrush(*wxTRANSPARENT_BRUSH);
+ dcm.SetPen(*wxBLACK_PEN);
+ if (at)
+ dcm.DrawRectangle(at->GetAbsPos(),
+ wxSize(at->GetWidth(),at->GetHeight()));
+ dcm.SetPen(*wxGREEN_PEN);
+ if (before)
+ dcm.DrawRectangle(before->GetAbsPos().x+1, before->GetAbsPos().y+1,
+ before->GetWidth()-2,before->GetHeight()-2);
+ dcm.SetPen(*wxRED_PEN);
+ if (after)
+ dcm.DrawRectangle(after->GetAbsPos().x+2, after->GetAbsPos().y+2,
+ after->GetWidth()-4,after->GetHeight()-4);
+ }
+#endif
dcm.SetDeviceOrigin(0,0);
dc.Blit(0, rect.GetTop(),
{
if (m_tmpMouseMoved && (m_Cell != NULL))
{
+#ifdef DEBUG_HTML_SELECTION
+ Refresh();
+#endif
int xc, yc, x, y;
wxGetMousePosition(&xc, &yc);
ScreenToClient(&xc, &yc);
// handle selection update:
if ( m_makingSelection )
{
- bool goingDown = m_tmpSelFromPos.y < y ||
- m_tmpSelFromPos.y == y && m_tmpSelFromPos.x < x;
-
if ( !m_tmpSelFromCell )
m_tmpSelFromCell = m_Cell->FindCellByPos(
m_tmpSelFromPos.x,m_tmpSelFromPos.y);
+
+ // NB: a trick - we adjust selFromPos to be upper left or bottom
+ // right corner of the first cell of the selection depending
+ // on whether the mouse is moving to the right or to the left.
+ // This gives us more "natural" behaviour when selecting
+ // a line (specifically, first cell of the next line is not
+ // included if you drag selection from left to right over
+ // entire line):
+ wxPoint dirFromPos;
+ if ( !m_tmpSelFromCell )
+ {
+ dirFromPos = m_tmpSelFromPos;
+ }
+ else
+ {
+ dirFromPos = m_tmpSelFromCell->GetAbsPos();
+ if ( x < m_tmpSelFromPos.x )
+ {
+ dirFromPos.x += m_tmpSelFromCell->GetWidth();
+ dirFromPos.y += m_tmpSelFromCell->GetHeight();
+ }
+ }
+ bool goingDown = dirFromPos.y < y ||
+ (dirFromPos.y == y && dirFromPos.x < x);
+
+ // determine selection span:
if ( /*still*/ !m_tmpSelFromCell )
{
if (goingDown)
if (goingDown)
{
selcell = m_Cell->FindCellByPos(x, y,
- wxHTML_FIND_NEAREST_AFTER);
+ wxHTML_FIND_NEAREST_BEFORE);
if (!selcell)
selcell = m_Cell->GetLastTerminal();
}
else
{
selcell = m_Cell->FindCellByPos(x, y,
- wxHTML_FIND_NEAREST_BEFORE);
+ wxHTML_FIND_NEAREST_AFTER);
if (!selcell)
selcell = m_Cell->GetFirstTerminal();
}