InlineBox* RootInlineBox::closestLeafChildForXPos(int x) { InlineBox* firstLeaf = firstLeafChildAfterBox(); InlineBox* lastLeaf = lastLeafChildBeforeBox(); if (firstLeaf == lastLeaf) return firstLeaf; // Avoid returning a list marker when possible. if (x <= firstLeaf->m_x && !firstLeaf->object()->isListMarker()) // The x coordinate is less or equal to left edge of the firstLeaf. // Return it. return firstLeaf; if (x >= lastLeaf->m_x + lastLeaf->m_width && !lastLeaf->object()->isListMarker()) // The x coordinate is greater or equal to right edge of the lastLeaf. // Return it. return lastLeaf; for (InlineBox* leaf = firstLeaf; leaf && leaf != lastLeaf; leaf = leaf->nextLeafChild()) { if (!leaf->object()->isListMarker()) { int leafX = leaf->m_x; if (x < leafX + leaf->m_width) // The x coordinate is less than the right edge of the box. // Return it. return leaf; } } return lastLeaf; }
InlineBox* RootInlineBox::closestLeafChildForXPos(int x, bool onlyEditableLeaves) { InlineBox* firstLeaf = firstLeafChildAfterBox(); InlineBox* lastLeaf = lastLeafChildBeforeBox(); if (firstLeaf == lastLeaf && (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) return firstLeaf; // Avoid returning a list marker when possible. if (x <= firstLeaf->m_x && !firstLeaf->object()->isListMarker() && (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) // The x coordinate is less or equal to left edge of the firstLeaf. // Return it. return firstLeaf; if (x >= lastLeaf->m_x + lastLeaf->m_width && !lastLeaf->object()->isListMarker() && (!onlyEditableLeaves || isEditableLeaf(lastLeaf))) // The x coordinate is greater or equal to right edge of the lastLeaf. // Return it. return lastLeaf; InlineBox* closestLeaf = 0; for (InlineBox* leaf = firstLeaf; leaf; leaf = leaf->nextLeafChild()) { if (!leaf->object()->isListMarker() && (!onlyEditableLeaves || isEditableLeaf(leaf))) { closestLeaf = leaf; if (x < leaf->m_x + leaf->m_width) // The x coordinate is less than the right edge of the box. // Return it. return leaf; } } return closestLeaf ? closestLeaf : lastLeaf; }