| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple 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 1229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 RefPtr<Range> start = TextIterator::rangeFromLocationAndLength(document(
)->documentElement(), destinationIndex + startIndex, 0, true); | 1240 RefPtr<Range> start = TextIterator::rangeFromLocationAndLength(document(
)->documentElement(), destinationIndex + startIndex, 0, true); |
| 1241 RefPtr<Range> end = TextIterator::rangeFromLocationAndLength(document()-
>documentElement(), destinationIndex + endIndex, 0, true); | 1241 RefPtr<Range> end = TextIterator::rangeFromLocationAndLength(document()-
>documentElement(), destinationIndex + endIndex, 0, true); |
| 1242 if (start && end) | 1242 if (start && end) |
| 1243 setEndingSelection(VisibleSelection(start->startPosition(), end->sta
rtPosition(), DOWNSTREAM, originalIsDirectional)); | 1243 setEndingSelection(VisibleSelection(start->startPosition(), end->sta
rtPosition(), DOWNSTREAM, originalIsDirectional)); |
| 1244 } | 1244 } |
| 1245 } | 1245 } |
| 1246 | 1246 |
| 1247 // FIXME: Send an appropriate shouldDeleteRange call. | 1247 // FIXME: Send an appropriate shouldDeleteRange call. |
| 1248 bool CompositeEditCommand::breakOutOfEmptyListItem() | 1248 bool CompositeEditCommand::breakOutOfEmptyListItem() |
| 1249 { | 1249 { |
| 1250 Node* emptyListItem = enclosingEmptyListItem(endingSelection().visibleStart(
)); | 1250 RefPtr<Node> emptyListItem = enclosingEmptyListItem(endingSelection().visibl
eStart()); |
| 1251 if (!emptyListItem) | 1251 if (!emptyListItem) |
| 1252 return false; | 1252 return false; |
| 1253 | 1253 |
| 1254 RefPtr<EditingStyle> style = EditingStyle::create(endingSelection().start())
; | 1254 RefPtr<EditingStyle> style = EditingStyle::create(endingSelection().start())
; |
| 1255 style->mergeTypingStyle(document()); | 1255 style->mergeTypingStyle(document()); |
| 1256 | 1256 |
| 1257 ContainerNode* listNode = emptyListItem->parentNode(); | 1257 RefPtr<ContainerNode> listNode = emptyListItem->parentNode(); |
| 1258 // FIXME: Can't we do something better when the immediate parent wasn't a li
st node? | 1258 // FIXME: Can't we do something better when the immediate parent wasn't a li
st node? |
| 1259 if (!listNode | 1259 if (!listNode |
| 1260 || (!listNode->hasTagName(ulTag) && !listNode->hasTagName(olTag)) | 1260 || (!listNode->hasTagName(ulTag) && !listNode->hasTagName(olTag)) |
| 1261 || !listNode->rendererIsEditable() | 1261 || !listNode->rendererIsEditable() |
| 1262 || listNode == emptyListItem->rootEditableElement()) | 1262 || listNode == emptyListItem->rootEditableElement()) |
| 1263 return false; | 1263 return false; |
| 1264 | 1264 |
| 1265 RefPtr<Element> newBlock = 0; | 1265 RefPtr<Element> newBlock = 0; |
| 1266 if (ContainerNode* blockEnclosingList = listNode->parentNode()) { | 1266 if (ContainerNode* blockEnclosingList = listNode->parentNode()) { |
| 1267 if (blockEnclosingList->hasTagName(liTag)) { // listNode is inside anoth
er list item | 1267 if (blockEnclosingList->hasTagName(liTag)) { // listNode is inside anoth
er list item |
| 1268 if (visiblePositionAfterNode(blockEnclosingList) == visiblePositionA
fterNode(listNode)) { | 1268 if (visiblePositionAfterNode(blockEnclosingList) == visiblePositionA
fterNode(listNode.get())) { |
| 1269 // If listNode appears at the end of the outer list item, then m
ove listNode outside of this list item | 1269 // If listNode appears at the end of the outer list item, then m
ove listNode outside of this list item |
| 1270 // e.g. <ul><li>hello <ul><li><br></li></ul> </li></ul> should b
ecome <ul><li>hello</li> <ul><li><br></li></ul> </ul> after this section | 1270 // e.g. <ul><li>hello <ul><li><br></li></ul> </li></ul> should b
ecome <ul><li>hello</li> <ul><li><br></li></ul> </ul> after this section |
| 1271 // If listNode does NOT appear at the end, then we should consid
er it as a regular paragraph. | 1271 // If listNode does NOT appear at the end, then we should consid
er it as a regular paragraph. |
| 1272 // e.g. <ul><li> <ul><li><br></li></ul> hello</li></ul> should b
ecome <ul><li> <div><br></div> hello</li></ul> at the end | 1272 // e.g. <ul><li> <ul><li><br></li></ul> hello</li></ul> should b
ecome <ul><li> <div><br></div> hello</li></ul> at the end |
| 1273 splitElement(static_cast<Element*>(blockEnclosingList), listNode
); | 1273 splitElement(static_cast<Element*>(blockEnclosingList), listNode
); |
| 1274 removeNodePreservingChildren(listNode->parentNode()); | 1274 removeNodePreservingChildren(listNode->parentNode()); |
| 1275 newBlock = createListItemElement(document()); | 1275 newBlock = createListItemElement(document()); |
| 1276 } | 1276 } |
| 1277 // If listNode does NOT appear at the end of the outer list item, th
en behave as if in a regular paragraph. | 1277 // If listNode does NOT appear at the end of the outer list item, th
en behave as if in a regular paragraph. |
| 1278 } else if (blockEnclosingList->hasTagName(olTag) || blockEnclosingList->
hasTagName(ulTag)) | 1278 } else if (blockEnclosingList->hasTagName(olTag) || blockEnclosingList->
hasTagName(ulTag)) |
| 1279 newBlock = createListItemElement(document()); | 1279 newBlock = createListItemElement(document()); |
| 1280 } | 1280 } |
| 1281 if (!newBlock) | 1281 if (!newBlock) |
| 1282 newBlock = createDefaultParagraphElement(document()); | 1282 newBlock = createDefaultParagraphElement(document()); |
| 1283 | 1283 |
| 1284 Node* previousListNode = emptyListItem->isElementNode() ? toElement(emptyLis
tItem)->previousElementSibling(): emptyListItem->previousSibling(); | 1284 RefPtr<Node> previousListNode = emptyListItem->isElementNode() ? toElement(e
mptyListItem.get())->previousElementSibling(): emptyListItem->previousSibling(); |
| 1285 Node* nextListNode = emptyListItem->isElementNode() ? toElement(emptyListIte
m)->nextElementSibling(): emptyListItem->nextSibling(); | 1285 RefPtr<Node> nextListNode = emptyListItem->isElementNode() ? toElement(empty
ListItem.get())->nextElementSibling(): emptyListItem->nextSibling(); |
| 1286 if (isListItem(nextListNode) || isListElement(nextListNode)) { | 1286 if (isListItem(nextListNode.get()) || isListElement(nextListNode.get())) { |
| 1287 // If emptyListItem follows another list item or nested list, split the
list node. | 1287 // If emptyListItem follows another list item or nested list, split the
list node. |
| 1288 if (isListItem(previousListNode) || isListElement(previousListNode)) | 1288 if (isListItem(previousListNode.get()) || isListElement(previousListNode
.get())) |
| 1289 splitElement(static_cast<Element*>(listNode), emptyListItem); | 1289 splitElement(static_cast<Element*>(listNode.get()), emptyListItem); |
| 1290 | 1290 |
| 1291 // If emptyListItem is followed by other list item or nested list, then
insert newBlock before the list node. | 1291 // If emptyListItem is followed by other list item or nested list, then
insert newBlock before the list node. |
| 1292 // Because we have splitted the element, emptyListItem is the first elem
ent in the list node. | 1292 // Because we have splitted the element, emptyListItem is the first elem
ent in the list node. |
| 1293 // i.e. insert newBlock before ul or ol whose first element is emptyList
Item | 1293 // i.e. insert newBlock before ul or ol whose first element is emptyList
Item |
| 1294 insertNodeBefore(newBlock, listNode); | 1294 insertNodeBefore(newBlock, listNode); |
| 1295 removeNode(emptyListItem); | 1295 removeNode(emptyListItem); |
| 1296 } else { | 1296 } else { |
| 1297 // When emptyListItem does not follow any list item or nested list, inse
rt newBlock after the enclosing list node. | 1297 // When emptyListItem does not follow any list item or nested list, inse
rt newBlock after the enclosing list node. |
| 1298 // Remove the enclosing node if emptyListItem is the only child; otherwi
se just remove emptyListItem. | 1298 // Remove the enclosing node if emptyListItem is the only child; otherwi
se just remove emptyListItem. |
| 1299 insertNodeAfter(newBlock, listNode); | 1299 insertNodeAfter(newBlock, listNode); |
| 1300 removeNode(isListItem(previousListNode) || isListElement(previousListNod
e) ? emptyListItem : listNode); | 1300 removeNode(isListItem(previousListNode.get()) || isListElement(previousL
istNode.get()) ? emptyListItem.get() : listNode.get()); |
| 1301 } | 1301 } |
| 1302 | 1302 |
| 1303 appendBlockPlaceholder(newBlock); | 1303 appendBlockPlaceholder(newBlock); |
| 1304 setEndingSelection(VisibleSelection(firstPositionInNode(newBlock.get()), DOW
NSTREAM, endingSelection().isDirectional())); | 1304 setEndingSelection(VisibleSelection(firstPositionInNode(newBlock.get()), DOW
NSTREAM, endingSelection().isDirectional())); |
| 1305 | 1305 |
| 1306 style->prepareToApplyAt(endingSelection().start()); | 1306 style->prepareToApplyAt(endingSelection().start()); |
| 1307 if (!style->isEmpty()) | 1307 if (!style->isEmpty()) |
| 1308 applyStyle(style.get()); | 1308 applyStyle(style.get()); |
| 1309 | 1309 |
| 1310 return true; | 1310 return true; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1451 return node.release(); | 1451 return node.release(); |
| 1452 } | 1452 } |
| 1453 | 1453 |
| 1454 PassRefPtr<Element> createBlockPlaceholderElement(Document* document) | 1454 PassRefPtr<Element> createBlockPlaceholderElement(Document* document) |
| 1455 { | 1455 { |
| 1456 RefPtr<Element> breakNode = document->createElement(brTag, false); | 1456 RefPtr<Element> breakNode = document->createElement(brTag, false); |
| 1457 return breakNode.release(); | 1457 return breakNode.release(); |
| 1458 } | 1458 } |
| 1459 | 1459 |
| 1460 } // namespace WebCore | 1460 } // namespace WebCore |
| OLD | NEW |