OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 // We don't want to return a root node (if it happens to be a div, e.g., in
a document fragment) because there are no | 52 // We don't want to return a root node (if it happens to be a div, e.g., in
a document fragment) because there are no |
53 // siblings for us to append to. | 53 // siblings for us to append to. |
54 while (!curBlock->nextSibling() && curBlock->parentElement()->hasTagName(div
Tag) && curBlock->parentElement()->parentElement()) { | 54 while (!curBlock->nextSibling() && curBlock->parentElement()->hasTagName(div
Tag) && curBlock->parentElement()->parentElement()) { |
55 if (curBlock->parentElement()->hasAttributes()) | 55 if (curBlock->parentElement()->hasAttributes()) |
56 break; | 56 break; |
57 curBlock = curBlock->parentElement(); | 57 curBlock = curBlock->parentElement(); |
58 } | 58 } |
59 return curBlock; | 59 return curBlock; |
60 } | 60 } |
61 | 61 |
62 InsertParagraphSeparatorCommand::InsertParagraphSeparatorCommand(Document *docum
ent, bool mustUseDefaultParagraphElement, bool pasteBlockqutoeIntoUnquotedArea) | 62 InsertParagraphSeparatorCommand::InsertParagraphSeparatorCommand(Document *docum
ent, bool mustUseDefaultParagraphElement) |
63 : CompositeEditCommand(document) | 63 : CompositeEditCommand(document) |
64 , m_mustUseDefaultParagraphElement(mustUseDefaultParagraphElement) | 64 , m_mustUseDefaultParagraphElement(mustUseDefaultParagraphElement) |
65 , m_pasteBlockqutoeIntoUnquotedArea(pasteBlockqutoeIntoUnquotedArea) | |
66 { | 65 { |
67 } | 66 } |
68 | 67 |
69 bool InsertParagraphSeparatorCommand::preservesTypingStyle() const | 68 bool InsertParagraphSeparatorCommand::preservesTypingStyle() const |
70 { | 69 { |
71 return true; | 70 return true; |
72 } | 71 } |
73 | 72 |
74 void InsertParagraphSeparatorCommand::calculateStyleBeforeInsertion(const Positi
on &pos) | 73 void InsertParagraphSeparatorCommand::calculateStyleBeforeInsertion(const Positi
on &pos) |
75 { | 74 { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 if (nestNewBlock) { | 215 if (nestNewBlock) { |
217 if (isFirstInBlock && !lineBreakExistsAtVisiblePosition(visiblePos))
{ | 216 if (isFirstInBlock && !lineBreakExistsAtVisiblePosition(visiblePos))
{ |
218 // The block is empty. Create an empty block to | 217 // The block is empty. Create an empty block to |
219 // represent the paragraph that we're leaving. | 218 // represent the paragraph that we're leaving. |
220 RefPtr<Element> extraBlock = createDefaultParagraphElement(docum
ent()); | 219 RefPtr<Element> extraBlock = createDefaultParagraphElement(docum
ent()); |
221 appendNode(extraBlock, startBlock); | 220 appendNode(extraBlock, startBlock); |
222 appendBlockPlaceholder(extraBlock); | 221 appendBlockPlaceholder(extraBlock); |
223 } | 222 } |
224 appendNode(blockToInsert, startBlock); | 223 appendNode(blockToInsert, startBlock); |
225 } else { | 224 } else { |
226 // We can get here if we pasted a copied portion of a blockquote wit
h a newline at the end and are trying to paste it | |
227 // into an unquoted area. We then don't want the newline within the
blockquote or else it will also be quoted. | |
228 if (m_pasteBlockqutoeIntoUnquotedArea) { | |
229 if (Node* highestBlockquote = highestEnclosingNodeOfType(canonic
alPos, &isMailBlockquote)) | |
230 startBlock = toElement(highestBlockquote); | |
231 } | |
232 | |
233 // Most of the time we want to stay at the nesting level of the star
tBlock (e.g., when nesting within lists). However, | 225 // Most of the time we want to stay at the nesting level of the star
tBlock (e.g., when nesting within lists). However, |
234 // for div nodes, this can result in nested div tags that are hard t
o break out of. | 226 // for div nodes, this can result in nested div tags that are hard t
o break out of. |
235 Element* siblingNode = startBlock.get(); | 227 Element* siblingNode = startBlock.get(); |
236 if (blockToInsert->hasTagName(divTag)) | 228 if (blockToInsert->hasTagName(divTag)) |
237 siblingNode = highestVisuallyEquivalentDivBelowRoot(startBlock.g
et()); | 229 siblingNode = highestVisuallyEquivalentDivBelowRoot(startBlock.g
et()); |
238 insertNodeAfter(blockToInsert, siblingNode); | 230 insertNodeAfter(blockToInsert, siblingNode); |
239 } | 231 } |
240 | 232 |
241 // Recreate the same structure in the new paragraph. | 233 // Recreate the same structure in the new paragraph. |
242 | 234 |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 if (positionAfterSplit.deprecatedNode()->isTextNode()) | 383 if (positionAfterSplit.deprecatedNode()->isTextNode()) |
392 insertTextIntoNode(toText(positionAfterSplit.containerNode()), 0
, nonBreakingSpaceString()); | 384 insertTextIntoNode(toText(positionAfterSplit.containerNode()), 0
, nonBreakingSpaceString()); |
393 } | 385 } |
394 } | 386 } |
395 | 387 |
396 setEndingSelection(VisibleSelection(firstPositionInNode(blockToInsert.get())
, DOWNSTREAM, endingSelection().isDirectional())); | 388 setEndingSelection(VisibleSelection(firstPositionInNode(blockToInsert.get())
, DOWNSTREAM, endingSelection().isDirectional())); |
397 applyStyleAfterInsertion(startBlock.get()); | 389 applyStyleAfterInsertion(startBlock.get()); |
398 } | 390 } |
399 | 391 |
400 } // namespace WebCore | 392 } // namespace WebCore |
OLD | NEW |