OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2008, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2008, 2009 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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 } | 97 } |
98 | 98 |
99 bool isEmptyFontTag(const Element* element, ShouldStyleAttributeBeEmpty shouldSt
yleAttributeBeEmpty) | 99 bool isEmptyFontTag(const Element* element, ShouldStyleAttributeBeEmpty shouldSt
yleAttributeBeEmpty) |
100 { | 100 { |
101 if (!element || !element->hasTagName(fontTag)) | 101 if (!element || !element->hasTagName(fontTag)) |
102 return false; | 102 return false; |
103 | 103 |
104 return hasNoAttributeOrOnlyStyleAttribute(toHTMLElement(element), shouldStyl
eAttributeBeEmpty); | 104 return hasNoAttributeOrOnlyStyleAttribute(toHTMLElement(element), shouldStyl
eAttributeBeEmpty); |
105 } | 105 } |
106 | 106 |
107 static PassRefPtr<Element> createFontElement(Document* document) | 107 static PassRefPtr<Element> createFontElement(Document& document) |
108 { | 108 { |
109 RefPtr<Element> fontNode = createHTMLElement(document, fontTag); | 109 RefPtr<Element> fontNode = createHTMLElement(document, fontTag); |
110 return fontNode.release(); | 110 return fontNode.release(); |
111 } | 111 } |
112 | 112 |
113 PassRefPtr<HTMLElement> createStyleSpanElement(Document* document) | 113 PassRefPtr<HTMLElement> createStyleSpanElement(Document& document) |
114 { | 114 { |
115 RefPtr<HTMLElement> styleElement = createHTMLElement(document, spanTag); | 115 RefPtr<HTMLElement> styleElement = createHTMLElement(document, spanTag); |
116 return styleElement.release(); | 116 return styleElement.release(); |
117 } | 117 } |
118 | 118 |
119 ApplyStyleCommand::ApplyStyleCommand(Document& document, const EditingStyle* sty
le, EditAction editingAction, EPropertyLevel propertyLevel) | 119 ApplyStyleCommand::ApplyStyleCommand(Document& document, const EditingStyle* sty
le, EditAction editingAction, EPropertyLevel propertyLevel) |
120 : CompositeEditCommand(document) | 120 : CompositeEditCommand(document) |
121 , m_style(style->copy()) | 121 , m_style(style->copy()) |
122 , m_editingAction(editingAction) | 122 , m_editingAction(editingAction) |
123 , m_propertyLevel(propertyLevel) | 123 , m_propertyLevel(propertyLevel) |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 for (Node* node = startNode; node != beyondEnd; node = NodeTraversal::next(n
ode)) { | 372 for (Node* node = startNode; node != beyondEnd; node = NodeTraversal::next(n
ode)) { |
373 RefPtr<HTMLElement> element; | 373 RefPtr<HTMLElement> element; |
374 if (node->isHTMLElement()) { | 374 if (node->isHTMLElement()) { |
375 // Only work on fully selected nodes. | 375 // Only work on fully selected nodes. |
376 if (!nodeFullySelected(node, start, end)) | 376 if (!nodeFullySelected(node, start, end)) |
377 continue; | 377 continue; |
378 element = toHTMLElement(node); | 378 element = toHTMLElement(node); |
379 } else if (node->isTextNode() && node->renderer() && node->parentNode()
!= lastStyledNode) { | 379 } else if (node->isTextNode() && node->renderer() && node->parentNode()
!= lastStyledNode) { |
380 // Last styled node was not parent node of this text node, but we wi
sh to style this | 380 // Last styled node was not parent node of this text node, but we wi
sh to style this |
381 // text node. To make this possible, add a style span to surround th
is text node. | 381 // text node. To make this possible, add a style span to surround th
is text node. |
382 RefPtr<HTMLElement> span = createStyleSpanElement(&document()); | 382 RefPtr<HTMLElement> span = createStyleSpanElement(document()); |
383 surroundNodeRangeWithElement(node, node, span.get()); | 383 surroundNodeRangeWithElement(node, node, span.get()); |
384 element = span.release(); | 384 element = span.release(); |
385 } else { | 385 } else { |
386 // Only handle HTML elements and text nodes. | 386 // Only handle HTML elements and text nodes. |
387 continue; | 387 continue; |
388 } | 388 } |
389 lastStyledNode = node; | 389 lastStyledNode = node; |
390 | 390 |
391 RefPtr<MutableStylePropertySet> inlineStyle = copyStyleOrCreateEmpty(ele
ment->inlineStyle()); | 391 RefPtr<MutableStylePropertySet> inlineStyle = copyStyleOrCreateEmpty(ele
ment->inlineStyle()); |
392 float currentFontSize = computedFontSize(node); | 392 float currentFontSize = computedFontSize(node); |
(...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1397 removeNode(dummyElement); | 1397 removeNode(dummyElement); |
1398 | 1398 |
1399 applyInlineStyleChange(start, passedEnd, styleChange, addStyledElement); | 1399 applyInlineStyleChange(start, passedEnd, styleChange, addStyledElement); |
1400 } | 1400 } |
1401 | 1401 |
1402 Position ApplyStyleCommand::positionToComputeInlineStyleChange(PassRefPtr<Node>
startNode, RefPtr<Node>& dummyElement) | 1402 Position ApplyStyleCommand::positionToComputeInlineStyleChange(PassRefPtr<Node>
startNode, RefPtr<Node>& dummyElement) |
1403 { | 1403 { |
1404 // It's okay to obtain the style at the startNode because we've removed all
relevant styles from the current run. | 1404 // It's okay to obtain the style at the startNode because we've removed all
relevant styles from the current run. |
1405 Position positionForStyleComparison; | 1405 Position positionForStyleComparison; |
1406 if (!startNode->isElementNode()) { | 1406 if (!startNode->isElementNode()) { |
1407 dummyElement = createStyleSpanElement(&document()); | 1407 dummyElement = createStyleSpanElement(document()); |
1408 insertNodeAt(dummyElement, positionBeforeNode(startNode.get())); | 1408 insertNodeAt(dummyElement, positionBeforeNode(startNode.get())); |
1409 return positionBeforeNode(dummyElement.get()); | 1409 return positionBeforeNode(dummyElement.get()); |
1410 } | 1410 } |
1411 | 1411 |
1412 return firstPositionInOrBeforeNode(startNode.get()); | 1412 return firstPositionInOrBeforeNode(startNode.get()); |
1413 } | 1413 } |
1414 | 1414 |
1415 void ApplyStyleCommand::applyInlineStyleChange(PassRefPtr<Node> passedStart, Pas
sRefPtr<Node> passedEnd, StyleChange& styleChange, EAddStyledElement addStyledEl
ement) | 1415 void ApplyStyleCommand::applyInlineStyleChange(PassRefPtr<Node> passedStart, Pas
sRefPtr<Node> passedEnd, StyleChange& styleChange, EAddStyledElement addStyledEl
ement) |
1416 { | 1416 { |
1417 RefPtr<Node> startNode = passedStart; | 1417 RefPtr<Node> startNode = passedStart; |
(...skipping 19 matching lines...) Expand all Loading... |
1437 // Font tags need to go outside of CSS so that CSS font sizes override leagc
y font sizes. | 1437 // Font tags need to go outside of CSS so that CSS font sizes override leagc
y font sizes. |
1438 if (styleChange.applyFontColor() || styleChange.applyFontFace() || styleChan
ge.applyFontSize()) { | 1438 if (styleChange.applyFontColor() || styleChange.applyFontFace() || styleChan
ge.applyFontSize()) { |
1439 if (fontContainer) { | 1439 if (fontContainer) { |
1440 if (styleChange.applyFontColor()) | 1440 if (styleChange.applyFontColor()) |
1441 setNodeAttribute(fontContainer, colorAttr, styleChange.fontColor
()); | 1441 setNodeAttribute(fontContainer, colorAttr, styleChange.fontColor
()); |
1442 if (styleChange.applyFontFace()) | 1442 if (styleChange.applyFontFace()) |
1443 setNodeAttribute(fontContainer, faceAttr, styleChange.fontFace()
); | 1443 setNodeAttribute(fontContainer, faceAttr, styleChange.fontFace()
); |
1444 if (styleChange.applyFontSize()) | 1444 if (styleChange.applyFontSize()) |
1445 setNodeAttribute(fontContainer, sizeAttr, styleChange.fontSize()
); | 1445 setNodeAttribute(fontContainer, sizeAttr, styleChange.fontSize()
); |
1446 } else { | 1446 } else { |
1447 RefPtr<Element> fontElement = createFontElement(&document()); | 1447 RefPtr<Element> fontElement = createFontElement(document()); |
1448 if (styleChange.applyFontColor()) | 1448 if (styleChange.applyFontColor()) |
1449 fontElement->setAttribute(colorAttr, styleChange.fontColor()); | 1449 fontElement->setAttribute(colorAttr, styleChange.fontColor()); |
1450 if (styleChange.applyFontFace()) | 1450 if (styleChange.applyFontFace()) |
1451 fontElement->setAttribute(faceAttr, styleChange.fontFace()); | 1451 fontElement->setAttribute(faceAttr, styleChange.fontFace()); |
1452 if (styleChange.applyFontSize()) | 1452 if (styleChange.applyFontSize()) |
1453 fontElement->setAttribute(sizeAttr, styleChange.fontSize()); | 1453 fontElement->setAttribute(sizeAttr, styleChange.fontSize()); |
1454 surroundNodeRangeWithElement(startNode, endNode, fontElement.get()); | 1454 surroundNodeRangeWithElement(startNode, endNode, fontElement.get()); |
1455 } | 1455 } |
1456 } | 1456 } |
1457 | 1457 |
1458 if (styleChange.cssStyle().length()) { | 1458 if (styleChange.cssStyle().length()) { |
1459 if (styleContainer) { | 1459 if (styleContainer) { |
1460 if (const StylePropertySet* existingStyle = styleContainer->inlineSt
yle()) { | 1460 if (const StylePropertySet* existingStyle = styleContainer->inlineSt
yle()) { |
1461 String existingText = existingStyle->asText(); | 1461 String existingText = existingStyle->asText(); |
1462 StringBuilder cssText; | 1462 StringBuilder cssText; |
1463 cssText.append(existingText); | 1463 cssText.append(existingText); |
1464 if (!existingText.isEmpty()) | 1464 if (!existingText.isEmpty()) |
1465 cssText.append(' '); | 1465 cssText.append(' '); |
1466 cssText.append(styleChange.cssStyle()); | 1466 cssText.append(styleChange.cssStyle()); |
1467 setNodeAttribute(styleContainer, styleAttr, cssText.toString()); | 1467 setNodeAttribute(styleContainer, styleAttr, cssText.toString()); |
1468 } else | 1468 } else |
1469 setNodeAttribute(styleContainer, styleAttr, styleChange.cssStyle
()); | 1469 setNodeAttribute(styleContainer, styleAttr, styleChange.cssStyle
()); |
1470 } else { | 1470 } else { |
1471 RefPtr<Element> styleElement = createStyleSpanElement(&document()); | 1471 RefPtr<Element> styleElement = createStyleSpanElement(document()); |
1472 styleElement->setAttribute(styleAttr, styleChange.cssStyle()); | 1472 styleElement->setAttribute(styleAttr, styleChange.cssStyle()); |
1473 surroundNodeRangeWithElement(startNode, endNode, styleElement.releas
e()); | 1473 surroundNodeRangeWithElement(startNode, endNode, styleElement.releas
e()); |
1474 } | 1474 } |
1475 } | 1475 } |
1476 | 1476 |
1477 if (styleChange.applyBold()) | 1477 if (styleChange.applyBold()) |
1478 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(&docu
ment(), bTag)); | 1478 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(docum
ent(), bTag)); |
1479 | 1479 |
1480 if (styleChange.applyItalic()) | 1480 if (styleChange.applyItalic()) |
1481 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(&docu
ment(), iTag)); | 1481 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(docum
ent(), iTag)); |
1482 | 1482 |
1483 if (styleChange.applyUnderline()) | 1483 if (styleChange.applyUnderline()) |
1484 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(&docu
ment(), uTag)); | 1484 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(docum
ent(), uTag)); |
1485 | 1485 |
1486 if (styleChange.applyLineThrough()) | 1486 if (styleChange.applyLineThrough()) |
1487 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(&docu
ment(), strikeTag)); | 1487 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(docum
ent(), strikeTag)); |
1488 | 1488 |
1489 if (styleChange.applySubscript()) | 1489 if (styleChange.applySubscript()) |
1490 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(&docu
ment(), subTag)); | 1490 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(docum
ent(), subTag)); |
1491 else if (styleChange.applySuperscript()) | 1491 else if (styleChange.applySuperscript()) |
1492 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(&docu
ment(), supTag)); | 1492 surroundNodeRangeWithElement(startNode, endNode, createHTMLElement(docum
ent(), supTag)); |
1493 | 1493 |
1494 if (m_styledInlineElement && addStyledElement == AddStyledElement) | 1494 if (m_styledInlineElement && addStyledElement == AddStyledElement) |
1495 surroundNodeRangeWithElement(startNode, endNode, m_styledInlineElement->
cloneElementWithoutChildren()); | 1495 surroundNodeRangeWithElement(startNode, endNode, m_styledInlineElement->
cloneElementWithoutChildren()); |
1496 } | 1496 } |
1497 | 1497 |
1498 float ApplyStyleCommand::computedFontSize(Node* node) | 1498 float ApplyStyleCommand::computedFontSize(Node* node) |
1499 { | 1499 { |
1500 if (!node) | 1500 if (!node) |
1501 return 0; | 1501 return 0; |
1502 | 1502 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1541 String textToMove = nextText->data(); | 1541 String textToMove = nextText->data(); |
1542 insertTextIntoNode(childText, childText->length(), textToMove); | 1542 insertTextIntoNode(childText, childText->length(), textToMove); |
1543 removeNode(next); | 1543 removeNode(next); |
1544 // don't move child node pointer. it may want to merge with more text no
des. | 1544 // don't move child node pointer. it may want to merge with more text no
des. |
1545 } | 1545 } |
1546 | 1546 |
1547 updateStartEnd(newStart, newEnd); | 1547 updateStartEnd(newStart, newEnd); |
1548 } | 1548 } |
1549 | 1549 |
1550 } | 1550 } |
OLD | NEW |