OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 return result; | 272 return result; |
273 | 273 |
274 // We have to compute the expansion for annotations over the previous li
ne to see how much we should move. | 274 // We have to compute the expansion for annotations over the previous li
ne to see how much we should move. |
275 LayoutUnit lowestAllowedPosition = std::max(prevRootBox()->lineBottom(),
lineTop()) - result; | 275 LayoutUnit lowestAllowedPosition = std::max(prevRootBox()->lineBottom(),
lineTop()) - result; |
276 result = prevRootBox()->computeOverAnnotationAdjustment(lowestAllowedPos
ition); | 276 result = prevRootBox()->computeOverAnnotationAdjustment(lowestAllowedPos
ition); |
277 } | 277 } |
278 | 278 |
279 return result; | 279 return result; |
280 } | 280 } |
281 | 281 |
282 GapRects RootInlineBox::lineSelectionGap(const LayoutBlock* rootBlock, const Lay
outPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, Layo
utUnit selTop, LayoutUnit selHeight, const PaintInfo* paintInfo) const | |
283 { | |
284 SelectionState lineState = selectionState(); | |
285 | |
286 bool leftGap, rightGap; | |
287 block().getSelectionGapInfo(lineState, leftGap, rightGap); | |
288 | |
289 GapRects result; | |
290 | |
291 InlineBox* firstBox = firstSelectedBox(); | |
292 InlineBox* lastBox = lastSelectedBox(); | |
293 if (leftGap) { | |
294 result.uniteLeft(block().logicalLeftSelectionGap(rootBlock, rootBlockPhy
sicalPosition, offsetFromRootBlock, | |
295 firstBox->parent()->lineLayoutItem(), firstBox->logicalLeft(), selTo
p, selHeight, paintInfo)); | |
296 } | |
297 if (rightGap) { | |
298 result.uniteRight(block().logicalRightSelectionGap(rootBlock, rootBlockP
hysicalPosition, offsetFromRootBlock, | |
299 lastBox->parent()->lineLayoutItem(), lastBox->logicalRight(), selTop
, selHeight, paintInfo)); | |
300 } | |
301 | |
302 // When dealing with bidi text, a non-contiguous selection region is possibl
e. | |
303 // e.g. The logical text aaaAAAbbb (capitals denote RTL text and non-capital
s LTR) is laid out | |
304 // visually as 3 text runs |aaa|bbb|AAA| if we select 4 characters from the
start of the text the | |
305 // selection will look like (underline denotes selection): | |
306 // |aaa|bbb|AAA| | |
307 // ___ _ | |
308 // We can see that the |bbb| run is not part of the selection while the runs
around it are. | |
309 if (firstBox && firstBox != lastBox) { | |
310 // Now fill in any gaps on the line that occurred between two selected e
lements. | |
311 LayoutUnit lastLogicalLeft = firstBox->logicalRight(); | |
312 bool isPreviousBoxSelected = firstBox->selectionState() != SelectionNone
; | |
313 for (InlineBox* box = firstBox->nextLeafChild(); box; box = box->nextLea
fChild()) { | |
314 if (box->selectionState() != SelectionNone) { | |
315 LayoutRect logicalRect(lastLogicalLeft, selTop, box->logicalLeft
() - lastLogicalLeft, selHeight); | |
316 logicalRect.move(lineLayoutItem().isHorizontalWritingMode() ? of
fsetFromRootBlock : LayoutSize(offsetFromRootBlock.height(), offsetFromRootBlock
.width())); | |
317 LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBl
ockPhysicalPosition, logicalRect); | |
318 if (isPreviousBoxSelected && gapRect.width() > 0 && gapRect.heig
ht() > 0) { | |
319 if (paintInfo && box->parent()->lineLayoutItem().style()->vi
sibility() == VISIBLE) | |
320 paintInfo->context.fillRect(FloatRect(gapRect), box->par
ent()->lineLayoutItem().selectionBackgroundColor()); | |
321 // VisibleSelection may be non-contiguous, see comment above
. | |
322 result.uniteCenter(gapRect); | |
323 } | |
324 lastLogicalLeft = box->logicalRight(); | |
325 } | |
326 if (box == lastBox) | |
327 break; | |
328 isPreviousBoxSelected = box->selectionState() != SelectionNone; | |
329 } | |
330 } | |
331 | |
332 return result; | |
333 } | |
334 | |
335 SelectionState RootInlineBox::selectionState() const | 282 SelectionState RootInlineBox::selectionState() const |
336 { | 283 { |
337 // Walk over all of the selected boxes. | 284 // Walk over all of the selected boxes. |
338 SelectionState state = SelectionNone; | 285 SelectionState state = SelectionNone; |
339 for (InlineBox* box = firstLeafChild(); box; box = box->nextLeafChild()) { | 286 for (InlineBox* box = firstLeafChild(); box; box = box->nextLeafChild()) { |
340 SelectionState boxState = box->selectionState(); | 287 SelectionState boxState = box->selectionState(); |
341 if ((boxState == SelectionStart && state == SelectionEnd) | 288 if ((boxState == SelectionStart && state == SelectionEnd) |
342 || (boxState == SelectionEnd && state == SelectionStart)) { | 289 || (boxState == SelectionEnd && state == SelectionStart)) { |
343 state = SelectionBoth; | 290 state = SelectionBoth; |
344 } else if (state == SelectionNone || ((boxState == SelectionStart || box
State == SelectionEnd) && (state == SelectionNone || state == SelectionInside)))
{ | 291 } else if (state == SelectionNone || ((boxState == SelectionStart || box
State == SelectionEnd) && (state == SelectionNone || state == SelectionInside)))
{ |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 endBox = nullptr; | 700 endBox = nullptr; |
754 return nullptr; | 701 return nullptr; |
755 } | 702 } |
756 | 703 |
757 const char* RootInlineBox::boxName() const | 704 const char* RootInlineBox::boxName() const |
758 { | 705 { |
759 return "RootInlineBox"; | 706 return "RootInlineBox"; |
760 } | 707 } |
761 | 708 |
762 } // namespace blink | 709 } // namespace blink |
OLD | NEW |