| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights |
| 3 * reserved. | 3 * reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 // selection. This only matters for cases where base and extend point to | 93 // selection. This only matters for cases where base and extend point to |
| 94 // different positions than start and end (e.g. after a double-click to | 94 // different positions than start and end (e.g. after a double-click to |
| 95 // select a word). | 95 // select a word). |
| 96 if (m_selection.isBaseFirst()) | 96 if (m_selection.isBaseFirst()) |
| 97 baseIsStart = true; | 97 baseIsStart = true; |
| 98 else | 98 else |
| 99 baseIsStart = false; | 99 baseIsStart = false; |
| 100 } else { | 100 } else { |
| 101 switch (direction) { | 101 switch (direction) { |
| 102 case DirectionRight: | 102 case DirectionRight: |
| 103 if (directionOfSelection() == LTR) | 103 if (directionOfSelection() == TextDirection::Ltr) |
| 104 baseIsStart = true; | 104 baseIsStart = true; |
| 105 else | 105 else |
| 106 baseIsStart = false; | 106 baseIsStart = false; |
| 107 break; | 107 break; |
| 108 case DirectionForward: | 108 case DirectionForward: |
| 109 baseIsStart = true; | 109 baseIsStart = true; |
| 110 break; | 110 break; |
| 111 case DirectionLeft: | 111 case DirectionLeft: |
| 112 if (directionOfSelection() == LTR) | 112 if (directionOfSelection() == TextDirection::Ltr) |
| 113 baseIsStart = false; | 113 baseIsStart = false; |
| 114 else | 114 else |
| 115 baseIsStart = true; | 115 baseIsStart = true; |
| 116 break; | 116 break; |
| 117 case DirectionBackward: | 117 case DirectionBackward: |
| 118 baseIsStart = false; | 118 baseIsStart = false; |
| 119 break; | 119 break; |
| 120 } | 120 } |
| 121 } | 121 } |
| 122 if (baseIsStart) { | 122 if (baseIsStart) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 createVisiblePosition(m_selection.extent(), m_selection.affinity()); | 195 createVisiblePosition(m_selection.extent(), m_selection.affinity()); |
| 196 | 196 |
| 197 // The difference between modifyExtendingRight and modifyExtendingForward is: | 197 // The difference between modifyExtendingRight and modifyExtendingForward is: |
| 198 // modifyExtendingForward always extends forward logically. | 198 // modifyExtendingForward always extends forward logically. |
| 199 // modifyExtendingRight behaves the same as modifyExtendingForward except for | 199 // modifyExtendingRight behaves the same as modifyExtendingForward except for |
| 200 // extending character or word, it extends forward logically if the enclosing | 200 // extending character or word, it extends forward logically if the enclosing |
| 201 // block is LTR direction, but it extends backward logically if the enclosing | 201 // block is LTR direction, but it extends backward logically if the enclosing |
| 202 // block is RTL direction. | 202 // block is RTL direction. |
| 203 switch (granularity) { | 203 switch (granularity) { |
| 204 case CharacterGranularity: | 204 case CharacterGranularity: |
| 205 if (directionOfEnclosingBlock() == LTR) | 205 if (directionOfEnclosingBlock() == TextDirection::Ltr) |
| 206 pos = nextPositionOf(pos, CanSkipOverEditingBoundary); | 206 pos = nextPositionOf(pos, CanSkipOverEditingBoundary); |
| 207 else | 207 else |
| 208 pos = previousPositionOf(pos, CanSkipOverEditingBoundary); | 208 pos = previousPositionOf(pos, CanSkipOverEditingBoundary); |
| 209 break; | 209 break; |
| 210 case WordGranularity: | 210 case WordGranularity: |
| 211 if (directionOfEnclosingBlock() == LTR) | 211 if (directionOfEnclosingBlock() == TextDirection::Ltr) |
| 212 pos = nextWordPositionForPlatform(pos); | 212 pos = nextWordPositionForPlatform(pos); |
| 213 else | 213 else |
| 214 pos = previousWordPosition(pos); | 214 pos = previousWordPosition(pos); |
| 215 break; | 215 break; |
| 216 case LineBoundary: | 216 case LineBoundary: |
| 217 if (directionOfEnclosingBlock() == LTR) | 217 if (directionOfEnclosingBlock() == TextDirection::Ltr) |
| 218 pos = modifyExtendingForward(granularity); | 218 pos = modifyExtendingForward(granularity); |
| 219 else | 219 else |
| 220 pos = modifyExtendingBackward(granularity); | 220 pos = modifyExtendingBackward(granularity); |
| 221 break; | 221 break; |
| 222 case SentenceGranularity: | 222 case SentenceGranularity: |
| 223 case LineGranularity: | 223 case LineGranularity: |
| 224 case ParagraphGranularity: | 224 case ParagraphGranularity: |
| 225 case SentenceBoundary: | 225 case SentenceBoundary: |
| 226 case ParagraphBoundary: | 226 case ParagraphBoundary: |
| 227 case DocumentBoundary: | 227 case DocumentBoundary: |
| 228 // FIXME: implement all of the above? | 228 // FIXME: implement all of the above? |
| 229 pos = modifyExtendingForward(granularity); | 229 pos = modifyExtendingForward(granularity); |
| 230 break; | 230 break; |
| 231 } | 231 } |
| 232 adjustPositionForUserSelectAll(pos, directionOfEnclosingBlock() == LTR); | 232 adjustPositionForUserSelectAll( |
| 233 pos, directionOfEnclosingBlock() == TextDirection::Ltr); |
| 233 return pos; | 234 return pos; |
| 234 } | 235 } |
| 235 | 236 |
| 236 VisiblePosition SelectionModifier::modifyExtendingForward( | 237 VisiblePosition SelectionModifier::modifyExtendingForward( |
| 237 TextGranularity granularity) { | 238 TextGranularity granularity) { |
| 238 VisiblePosition pos = | 239 VisiblePosition pos = |
| 239 createVisiblePosition(m_selection.extent(), m_selection.affinity()); | 240 createVisiblePosition(m_selection.extent(), m_selection.affinity()); |
| 240 switch (granularity) { | 241 switch (granularity) { |
| 241 case CharacterGranularity: | 242 case CharacterGranularity: |
| 242 pos = nextPositionOf(pos, CanSkipOverEditingBoundary); | 243 pos = nextPositionOf(pos, CanSkipOverEditingBoundary); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 265 pos = endOfParagraph(endForPlatform()); | 266 pos = endOfParagraph(endForPlatform()); |
| 266 break; | 267 break; |
| 267 case DocumentBoundary: | 268 case DocumentBoundary: |
| 268 pos = endForPlatform(); | 269 pos = endForPlatform(); |
| 269 if (isEditablePosition(pos.deepEquivalent())) | 270 if (isEditablePosition(pos.deepEquivalent())) |
| 270 pos = endOfEditableContent(pos); | 271 pos = endOfEditableContent(pos); |
| 271 else | 272 else |
| 272 pos = endOfDocument(pos); | 273 pos = endOfDocument(pos); |
| 273 break; | 274 break; |
| 274 } | 275 } |
| 275 adjustPositionForUserSelectAll(pos, directionOfEnclosingBlock() == LTR); | 276 adjustPositionForUserSelectAll( |
| 277 pos, directionOfEnclosingBlock() == TextDirection::Ltr); |
| 276 return pos; | 278 return pos; |
| 277 } | 279 } |
| 278 | 280 |
| 279 VisiblePosition SelectionModifier::modifyMovingRight( | 281 VisiblePosition SelectionModifier::modifyMovingRight( |
| 280 TextGranularity granularity) { | 282 TextGranularity granularity) { |
| 281 VisiblePosition pos; | 283 VisiblePosition pos; |
| 282 switch (granularity) { | 284 switch (granularity) { |
| 283 case CharacterGranularity: | 285 case CharacterGranularity: |
| 284 if (m_selection.isRange()) { | 286 if (m_selection.isRange()) { |
| 285 if (directionOfSelection() == LTR) | 287 if (directionOfSelection() == TextDirection::Ltr) |
| 286 pos = | 288 pos = |
| 287 createVisiblePosition(m_selection.end(), m_selection.affinity()); | 289 createVisiblePosition(m_selection.end(), m_selection.affinity()); |
| 288 else | 290 else |
| 289 pos = createVisiblePosition(m_selection.start(), | 291 pos = createVisiblePosition(m_selection.start(), |
| 290 m_selection.affinity()); | 292 m_selection.affinity()); |
| 291 } else { | 293 } else { |
| 292 pos = rightPositionOf(createVisiblePosition(m_selection.extent(), | 294 pos = rightPositionOf(createVisiblePosition(m_selection.extent(), |
| 293 m_selection.affinity())); | 295 m_selection.affinity())); |
| 294 } | 296 } |
| 295 break; | 297 break; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 createVisiblePosition(m_selection.extent(), m_selection.affinity()); | 383 createVisiblePosition(m_selection.extent(), m_selection.affinity()); |
| 382 | 384 |
| 383 // The difference between modifyExtendingLeft and modifyExtendingBackward is: | 385 // The difference between modifyExtendingLeft and modifyExtendingBackward is: |
| 384 // modifyExtendingBackward always extends backward logically. | 386 // modifyExtendingBackward always extends backward logically. |
| 385 // modifyExtendingLeft behaves the same as modifyExtendingBackward except for | 387 // modifyExtendingLeft behaves the same as modifyExtendingBackward except for |
| 386 // extending character or word, it extends backward logically if the enclosing | 388 // extending character or word, it extends backward logically if the enclosing |
| 387 // block is LTR direction, but it extends forward logically if the enclosing | 389 // block is LTR direction, but it extends forward logically if the enclosing |
| 388 // block is RTL direction. | 390 // block is RTL direction. |
| 389 switch (granularity) { | 391 switch (granularity) { |
| 390 case CharacterGranularity: | 392 case CharacterGranularity: |
| 391 if (directionOfEnclosingBlock() == LTR) | 393 if (directionOfEnclosingBlock() == TextDirection::Ltr) |
| 392 pos = previousPositionOf(pos, CanSkipOverEditingBoundary); | 394 pos = previousPositionOf(pos, CanSkipOverEditingBoundary); |
| 393 else | 395 else |
| 394 pos = nextPositionOf(pos, CanSkipOverEditingBoundary); | 396 pos = nextPositionOf(pos, CanSkipOverEditingBoundary); |
| 395 break; | 397 break; |
| 396 case WordGranularity: | 398 case WordGranularity: |
| 397 if (directionOfEnclosingBlock() == LTR) | 399 if (directionOfEnclosingBlock() == TextDirection::Ltr) |
| 398 pos = previousWordPosition(pos); | 400 pos = previousWordPosition(pos); |
| 399 else | 401 else |
| 400 pos = nextWordPositionForPlatform(pos); | 402 pos = nextWordPositionForPlatform(pos); |
| 401 break; | 403 break; |
| 402 case LineBoundary: | 404 case LineBoundary: |
| 403 if (directionOfEnclosingBlock() == LTR) | 405 if (directionOfEnclosingBlock() == TextDirection::Ltr) |
| 404 pos = modifyExtendingBackward(granularity); | 406 pos = modifyExtendingBackward(granularity); |
| 405 else | 407 else |
| 406 pos = modifyExtendingForward(granularity); | 408 pos = modifyExtendingForward(granularity); |
| 407 break; | 409 break; |
| 408 case SentenceGranularity: | 410 case SentenceGranularity: |
| 409 case LineGranularity: | 411 case LineGranularity: |
| 410 case ParagraphGranularity: | 412 case ParagraphGranularity: |
| 411 case SentenceBoundary: | 413 case SentenceBoundary: |
| 412 case ParagraphBoundary: | 414 case ParagraphBoundary: |
| 413 case DocumentBoundary: | 415 case DocumentBoundary: |
| 414 pos = modifyExtendingBackward(granularity); | 416 pos = modifyExtendingBackward(granularity); |
| 415 break; | 417 break; |
| 416 } | 418 } |
| 417 adjustPositionForUserSelectAll(pos, !(directionOfEnclosingBlock() == LTR)); | 419 adjustPositionForUserSelectAll( |
| 420 pos, !(directionOfEnclosingBlock() == TextDirection::Ltr)); |
| 418 return pos; | 421 return pos; |
| 419 } | 422 } |
| 420 | 423 |
| 421 VisiblePosition SelectionModifier::modifyExtendingBackward( | 424 VisiblePosition SelectionModifier::modifyExtendingBackward( |
| 422 TextGranularity granularity) { | 425 TextGranularity granularity) { |
| 423 VisiblePosition pos = | 426 VisiblePosition pos = |
| 424 createVisiblePosition(m_selection.extent(), m_selection.affinity()); | 427 createVisiblePosition(m_selection.extent(), m_selection.affinity()); |
| 425 | 428 |
| 426 // Extending a selection backward by word or character from just after a table | 429 // Extending a selection backward by word or character from just after a table |
| 427 // selects the table. This "makes sense" from the user perspective, esp. when | 430 // selects the table. This "makes sense" from the user perspective, esp. when |
| (...skipping 27 matching lines...) Expand all Loading... |
| 455 pos = startOfParagraph(startForPlatform()); | 458 pos = startOfParagraph(startForPlatform()); |
| 456 break; | 459 break; |
| 457 case DocumentBoundary: | 460 case DocumentBoundary: |
| 458 pos = startForPlatform(); | 461 pos = startForPlatform(); |
| 459 if (isEditablePosition(pos.deepEquivalent())) | 462 if (isEditablePosition(pos.deepEquivalent())) |
| 460 pos = startOfEditableContent(pos); | 463 pos = startOfEditableContent(pos); |
| 461 else | 464 else |
| 462 pos = startOfDocument(pos); | 465 pos = startOfDocument(pos); |
| 463 break; | 466 break; |
| 464 } | 467 } |
| 465 adjustPositionForUserSelectAll(pos, !(directionOfEnclosingBlock() == LTR)); | 468 adjustPositionForUserSelectAll( |
| 469 pos, !(directionOfEnclosingBlock() == TextDirection::Ltr)); |
| 466 return pos; | 470 return pos; |
| 467 } | 471 } |
| 468 | 472 |
| 469 VisiblePosition SelectionModifier::modifyMovingLeft( | 473 VisiblePosition SelectionModifier::modifyMovingLeft( |
| 470 TextGranularity granularity) { | 474 TextGranularity granularity) { |
| 471 VisiblePosition pos; | 475 VisiblePosition pos; |
| 472 switch (granularity) { | 476 switch (granularity) { |
| 473 case CharacterGranularity: | 477 case CharacterGranularity: |
| 474 if (m_selection.isRange()) { | 478 if (m_selection.isRange()) { |
| 475 if (directionOfSelection() == LTR) | 479 if (directionOfSelection() == TextDirection::Ltr) |
| 476 pos = createVisiblePosition(m_selection.start(), | 480 pos = createVisiblePosition(m_selection.start(), |
| 477 m_selection.affinity()); | 481 m_selection.affinity()); |
| 478 else | 482 else |
| 479 pos = | 483 pos = |
| 480 createVisiblePosition(m_selection.end(), m_selection.affinity()); | 484 createVisiblePosition(m_selection.end(), m_selection.affinity()); |
| 481 } else { | 485 } else { |
| 482 pos = leftPositionOf(createVisiblePosition(m_selection.extent(), | 486 pos = leftPositionOf(createVisiblePosition(m_selection.extent(), |
| 483 m_selection.affinity())); | 487 m_selection.affinity())); |
| 484 } | 488 } |
| 485 break; | 489 break; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 if (!frame() || | 678 if (!frame() || |
| 675 !frame() | 679 !frame() |
| 676 ->editor() | 680 ->editor() |
| 677 .behavior() | 681 .behavior() |
| 678 .shouldAlwaysGrowSelectionWhenExtendingToBoundary() || | 682 .shouldAlwaysGrowSelectionWhenExtendingToBoundary() || |
| 679 m_selection.isCaret() || !isBoundary(granularity)) { | 683 m_selection.isCaret() || !isBoundary(granularity)) { |
| 680 m_selection.setExtent(position); | 684 m_selection.setExtent(position); |
| 681 } else { | 685 } else { |
| 682 TextDirection textDirection = directionOfEnclosingBlock(); | 686 TextDirection textDirection = directionOfEnclosingBlock(); |
| 683 if (direction == DirectionForward || | 687 if (direction == DirectionForward || |
| 684 (textDirection == LTR && direction == DirectionRight) || | 688 (textDirection == TextDirection::Ltr && |
| 685 (textDirection == RTL && direction == DirectionLeft)) | 689 direction == DirectionRight) || |
| 690 (textDirection == TextDirection::Rtl && direction == DirectionLeft)) |
| 686 setSelectionEnd(&m_selection, position); | 691 setSelectionEnd(&m_selection, position); |
| 687 else | 692 else |
| 688 setSelectionStart(&m_selection, position); | 693 setSelectionStart(&m_selection, position); |
| 689 } | 694 } |
| 690 break; | 695 break; |
| 691 } | 696 } |
| 692 | 697 |
| 693 if (granularity == LineGranularity || granularity == ParagraphGranularity) | 698 if (granularity == LineGranularity || granularity == ParagraphGranularity) |
| 694 m_xPosForVerticalArrowNavigation = x; | 699 m_xPosForVerticalArrowNavigation = x; |
| 695 | 700 |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 | 867 |
| 863 return x; | 868 return x; |
| 864 } | 869 } |
| 865 | 870 |
| 866 DEFINE_TRACE(SelectionModifier) { | 871 DEFINE_TRACE(SelectionModifier) { |
| 867 visitor->trace(m_frame); | 872 visitor->trace(m_frame); |
| 868 visitor->trace(m_selection); | 873 visitor->trace(m_selection); |
| 869 } | 874 } |
| 870 | 875 |
| 871 } // namespace blink | 876 } // namespace blink |
| OLD | NEW |