Fixed: <rdar://problem/3951196> REGRESSION (Mail): too many levels of reply quotes...
authorcblu <cblu@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 19 Feb 2005 21:36:03 +0000 (21:36 +0000)
committercblu <cblu@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 19 Feb 2005 21:36:03 +0000 (21:36 +0000)
        Reviewed by kocienda.

        * khtml/editing/htmlediting.cpp:
        (khtml::InsertParagraphSeparatorInQuotedContentCommand::doApply):
- If we find a new start node, update topBlockquote so we don't use too many block quotes for the contents following the new line.
- Build up the list of ancestors after we've determined the actual topBlockquote.
- Don't insert an extra new line if there is a new start node.

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

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

index c0a63fbee6c9da7ab48807f919749896dfee9e94..db0a988b297afdaa82b783cbe032fd31710a322b 100644 (file)
@@ -1,3 +1,15 @@
+2005-02-18  Chris Blumenberg  <cblu@apple.com>
+       
+       Fixed: <rdar://problem/3951196> REGRESSION (Mail): too many levels of reply quotes after certain steps
+
+        Reviewed by kocienda.
+
+        * khtml/editing/htmlediting.cpp:
+        (khtml::InsertParagraphSeparatorInQuotedContentCommand::doApply):
+       - If we find a new start node, update topBlockquote so we don't use too many block quotes for the contents following the new line.
+       - Build up the list of ancestors after we've determined the actual topBlockquote.
+       - Don't insert an extra new line if there is a new start node.
+
 2005-02-19  Chris Blumenberg  <cblu@apple.com>
 
        Fixed: <rdar://problem/3978461> smart paste is broken
index 9e13a98c28b0c94213200e288afc62ed03b7cbba..47490cb58da9310959bca900acd28950ca353ae3 100644 (file)
@@ -3279,19 +3279,15 @@ void InsertParagraphSeparatorInQuotedContentCommand::doApply()
     }
     if (!topBlockquote || !topBlockquote->parentNode())
         return;
-
-    // Build up list of ancestors in between the start node and the top blockquote.
-    if (startNode != topBlockquote) {
-        for (NodeImpl *n = startNode->parentNode(); n && n != topBlockquote; n = n->parentNode())
-            ancestors.prepend(n);
-    }
-
+    
     // Insert a break after the top blockquote.
     m_breakNode = createBreakElement(document());
     m_breakNode->ref();
     insertNodeAfter(m_breakNode, topBlockquote);
-
+    
     if (!isLastVisiblePositionInNode(VisiblePosition(pos, affinity), topBlockquote)) {
+        
+        NodeImpl *newStartNode = 0;
         // Split at pos if in the middle of a text node.
         if (startNode->isTextNode()) {
             TextImpl *textNode = static_cast<TextImpl *>(startNode);
@@ -3301,15 +3297,32 @@ void InsertParagraphSeparatorInQuotedContentCommand::doApply()
                 pos = Position(startNode, 0);
             }
             else if (atEnd) {
-                startNode = startNode->traverseNextNode();
-                ASSERT(startNode);
+                newStartNode = startNode->traverseNextNode();
+                ASSERT(newStartNode);
             }
         }
         else if (pos.offset() > 0) {
-            startNode = startNode->traverseNextNode();
-            ASSERT(startNode);
+            newStartNode = startNode->traverseNextNode();
+            ASSERT(newStartNode);
         }
-
+        
+        // If a new start node was determined, find a new top block quote.
+        if (newStartNode) {
+            startNode = newStartNode;
+            for (NodeImpl *n = startNode->parentNode(); n; n = n->parentNode()) {
+                if (isMailBlockquote(n))
+                    topBlockquote = n;
+            }
+            if (!topBlockquote || !topBlockquote->parentNode())
+                return;
+        }
+        
+        // Build up list of ancestors in between the start node and the top blockquote.
+        if (startNode != topBlockquote) {
+            for (NodeImpl *n = startNode->parentNode(); n && n != topBlockquote; n = n->parentNode())
+                ancestors.prepend(n);
+        }                    
+        
         // Insert a clone of the top blockquote after the break.
         NodeImpl *clonedBlockquote = topBlockquote->cloneNode(false);
         clonedBlockquote->ref();
@@ -3325,7 +3338,7 @@ void InsertParagraphSeparatorInQuotedContentCommand::doApply()
             appendNode(child, parent);
             parent = child;
         }
-
+        
         // Move the start node and the siblings of the start node.
         bool startIsBR = false;
         if (startNode != topBlockquote) {
@@ -3343,15 +3356,16 @@ void InsertParagraphSeparatorInQuotedContentCommand::doApply()
         
         // Move everything after the start node.
         NodeImpl *leftParent = ancestors.last();
-
-        if (!startIsBR) {
+        
+        // Insert an extra new line when the start is at the beginning of a line.
+        if (!newStartNode && !startIsBR) {
             if (!leftParent)
                 leftParent = topBlockquote;
             ElementImpl *b = createBreakElement(document());
             b->ref();
             clonedNodes.append(b);
             appendNode(b, leftParent);
-        }
+        }        
         
         leftParent = ancestors.last();
         while (leftParent && leftParent != topBlockquote) {