Reviewed by Darin.
authorharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 12 Feb 2005 01:03:34 +0000 (01:03 +0000)
committerharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 12 Feb 2005 01:03:34 +0000 (01:03 +0000)
        <rdar://problem/3978980> Double Clicking on a line in Mail selected the entire body

        * khtml/editing/visible_units.cpp:
        (khtml::startOfWord):
        (khtml::endOfWord):
        Pay attention to being at the end of a paragraph.

        (khtml::previousLinePosition):
        (khtml::nextLinePosition):
        (khtml::endOfParagraph):
        Use DOWNSTREAM per recent affinity changes.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8586 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/visible_units.cpp

index 2cb268ef174b66c12ddb16191ccb2a0c5cbb744c..1f987826723b93655d9fa07b966fbf48df032fc8 100644 (file)
@@ -1,3 +1,19 @@
+2005-02-11  David Harrison  <harrison@apple.com>
+
+        Reviewed by Darin.
+
+        <rdar://problem/3978980> Double Clicking on a line in Mail selected the entire body
+
+        * khtml/editing/visible_units.cpp:
+        (khtml::startOfWord):
+        (khtml::endOfWord):
+        Pay attention to being at the end of a paragraph.
+        
+        (khtml::previousLinePosition):
+        (khtml::nextLinePosition):
+        (khtml::endOfParagraph):
+        Use DOWNSTREAM per recent affinity changes.
+
 2005-02-11  Richard Williamson   <rjw@apple.com>
 
        Fixed <rdar://problem/3985118> DOM objects not being marshaled on JS->native calls
index 3280491bffec3f77377d942cbc0556ccbf2212d9..284b84a27ad5d468242038a05ecb876628ba7047 100644 (file)
@@ -200,6 +200,10 @@ VisiblePosition startOfWord(const VisiblePosition &c, EWordSide side)
 {
     VisiblePosition p = c;
     if (side == RightWordIfOnBoundary) {
+        // at paragraph end, the startofWord is the current position
+        if (isEndOfParagraph(c))
+            return c;
+        
         p = c.next();
         if (p.isNull())
             return c;
@@ -221,7 +225,14 @@ VisiblePosition endOfWord(const VisiblePosition &c, EWordSide side)
         p = c.previous();
         if (p.isNull())
             return c;
+    } else {
+        // at paragraph end, the endOfWord is the start of next paragraph
+        if (isEndOfParagraph(c)) {
+            p = c.next();
+            return p.isNotNull() ? p : c;
+        }
     }
+    
     return nextBoundary(p, endWordBoundary);
 }
 
@@ -380,7 +391,7 @@ VisiblePosition previousLinePosition(const VisiblePosition &c, EAffinity affinit
                     break;
                 }
 
-                return VisiblePosition(pos, UPSTREAM);
+                return VisiblePosition(pos, DOWNSTREAM);
             }
             n = n->previousEditable();
         }
@@ -398,7 +409,7 @@ VisiblePosition previousLinePosition(const VisiblePosition &c, EAffinity affinit
     // Could not find a previous line. This means we must already be on the first line.
     // Move to the start of the content in this block, which effectively moves us
     // to the start of the line we're on.
-    return VisiblePosition(node->rootEditableElement(), 0, UPSTREAM);
+    return VisiblePosition(node->rootEditableElement(), 0, DOWNSTREAM);
 }
 
 VisiblePosition nextLinePosition(const VisiblePosition &c, EAffinity affinity, int x)
@@ -443,7 +454,7 @@ VisiblePosition nextLinePosition(const VisiblePosition &c, EAffinity affinity, i
                     break;
                 }
 
-                return VisiblePosition(pos, UPSTREAM);
+                return VisiblePosition(pos, DOWNSTREAM);
             }
             n = n->nextEditable();
         }
@@ -579,17 +590,17 @@ VisiblePosition endOfParagraph(const VisiblePosition &c, EIncludeLineBreak inclu
             continue;
         if (r->isBR()) {
             if (includeLineBreak)
-                return VisiblePosition(n, 1, UPSTREAM);
+                return VisiblePosition(n, 1, DOWNSTREAM);
             break;
         }
         if (r->isBlockFlow()) {
             if (includeLineBreak)
-                return VisiblePosition(n, 0, UPSTREAM);
+                return VisiblePosition(n, 0, DOWNSTREAM);
             break;
         }
         if (r->isText()) {
             if (includeLineBreak && !n->isAncestor(startBlock))
-                return VisiblePosition(n, 0, UPSTREAM);
+                return VisiblePosition(n, 0, DOWNSTREAM);
             long length = static_cast<RenderText *>(r)->length();
             if (style->whiteSpace() == PRE) {
                 QChar *text = static_cast<RenderText *>(r)->text();
@@ -598,7 +609,7 @@ VisiblePosition endOfParagraph(const VisiblePosition &c, EIncludeLineBreak inclu
                     o = offset;
                 for (long i = o; i < length; ++i)
                     if (text[i] == '\n')
-                        return VisiblePosition(n, i + includeLineBreak, UPSTREAM);
+                        return VisiblePosition(n, i + includeLineBreak, DOWNSTREAM);
             }
             node = n;
             offset = length;
@@ -610,7 +621,7 @@ VisiblePosition endOfParagraph(const VisiblePosition &c, EIncludeLineBreak inclu
         }
     }
 
-    return VisiblePosition(node, offset, UPSTREAM);
+    return VisiblePosition(node, offset, DOWNSTREAM);
 }
 
 bool inSameParagraph(const VisiblePosition &a, const VisiblePosition &b)