OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserv
ed. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. |
| 5 * All rights reserved. |
5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 6 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) |
6 * Copyright (C) 2010 Daniel Bates (dbates@intudata.com) | 7 * Copyright (C) 2010 Daniel Bates (dbates@intudata.com) |
7 * | 8 * |
8 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 11 * License as published by the Free Software Foundation; either |
11 * version 2 of the License, or (at your option) any later version. | 12 * version 2 of the License, or (at your option) any later version. |
12 * | 13 * |
13 * This library is distributed in the hope that it will be useful, | 14 * This library is distributed in the hope that it will be useful, |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 LayoutListMarker* LayoutListMarker::createAnonymous(LayoutListItem* item) { | 59 LayoutListMarker* LayoutListMarker::createAnonymous(LayoutListItem* item) { |
59 Document& document = item->document(); | 60 Document& document = item->document(); |
60 LayoutListMarker* layoutObject = new LayoutListMarker(item); | 61 LayoutListMarker* layoutObject = new LayoutListMarker(item); |
61 layoutObject->setDocumentForAnonymous(&document); | 62 layoutObject->setDocumentForAnonymous(&document); |
62 return layoutObject; | 63 return layoutObject; |
63 } | 64 } |
64 | 65 |
65 LayoutSize LayoutListMarker::imageBulletSize() const { | 66 LayoutSize LayoutListMarker::imageBulletSize() const { |
66 ASSERT(isImage()); | 67 ASSERT(isImage()); |
67 | 68 |
68 // FIXME: This is a somewhat arbitrary default width. Generated images for mar
kers really won't | 69 // FIXME: This is a somewhat arbitrary default width. Generated images for |
69 // become particularly useful until we support the CSS3 marker pseudoclass to
allow control over | 70 // markers really won't become particularly useful until we support the CSS3 |
70 // the width and height of the marker box. | 71 // marker pseudoclass to allow control over the width and height of the |
| 72 // marker box. |
71 LayoutUnit bulletWidth = style()->getFontMetrics().ascent() / LayoutUnit(2); | 73 LayoutUnit bulletWidth = style()->getFontMetrics().ascent() / LayoutUnit(2); |
72 return m_image->imageSize(*this, style()->effectiveZoom(), | 74 return m_image->imageSize(*this, style()->effectiveZoom(), |
73 LayoutSize(bulletWidth, bulletWidth)); | 75 LayoutSize(bulletWidth, bulletWidth)); |
74 } | 76 } |
75 | 77 |
76 void LayoutListMarker::styleWillChange(StyleDifference diff, | 78 void LayoutListMarker::styleWillChange(StyleDifference diff, |
77 const ComputedStyle& newStyle) { | 79 const ComputedStyle& newStyle) { |
78 if (style() && | 80 if (style() && |
79 (newStyle.listStylePosition() != style()->listStylePosition() || | 81 (newStyle.listStylePosition() != style()->listStylePosition() || |
80 newStyle.listStyleType() != style()->listStyleType())) | 82 newStyle.listStyleType() != style()->listStyleType())) |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 Length endMargin = style()->marginEnd(); | 152 Length endMargin = style()->marginEnd(); |
151 if (startMargin.isFixed()) | 153 if (startMargin.isFixed()) |
152 setMarginStart(LayoutUnit(startMargin.value())); | 154 setMarginStart(LayoutUnit(startMargin.value())); |
153 if (endMargin.isFixed()) | 155 if (endMargin.isFixed()) |
154 setMarginEnd(LayoutUnit(endMargin.value())); | 156 setMarginEnd(LayoutUnit(endMargin.value())); |
155 | 157 |
156 clearNeedsLayout(); | 158 clearNeedsLayout(); |
157 } | 159 } |
158 | 160 |
159 void LayoutListMarker::imageChanged(WrappedImagePtr o, const IntRect*) { | 161 void LayoutListMarker::imageChanged(WrappedImagePtr o, const IntRect*) { |
160 // A list marker can't have a background or border image, so no need to call t
he base class method. | 162 // A list marker can't have a background or border image, so no need to call |
| 163 // the base class method. |
161 if (!m_image || o != m_image->data()) | 164 if (!m_image || o != m_image->data()) |
162 return; | 165 return; |
163 | 166 |
164 LayoutSize imageSize = isImage() ? imageBulletSize() : LayoutSize(); | 167 LayoutSize imageSize = isImage() ? imageBulletSize() : LayoutSize(); |
165 if (size() != imageSize || m_image->errorOccurred()) | 168 if (size() != imageSize || m_image->errorOccurred()) |
166 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation( | 169 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation( |
167 LayoutInvalidationReason::ImageChanged); | 170 LayoutInvalidationReason::ImageChanged); |
168 else | 171 else |
169 setShouldDoFullPaintInvalidation(); | 172 setShouldDoFullPaintInvalidation(); |
170 } | 173 } |
171 | 174 |
172 void LayoutListMarker::updateMarginsAndContent() { | 175 void LayoutListMarker::updateMarginsAndContent() { |
173 updateContent(); | 176 updateContent(); |
174 updateMargins(); | 177 updateMargins(); |
175 } | 178 } |
176 | 179 |
177 void LayoutListMarker::updateContent() { | 180 void LayoutListMarker::updateContent() { |
178 // FIXME: This if-statement is just a performance optimization, but it's messy
to use the preferredLogicalWidths dirty bit for this. | 181 // FIXME: This if-statement is just a performance optimization, but it's messy |
| 182 // to use the preferredLogicalWidths dirty bit for this. |
179 // It's unclear if this is a premature optimization. | 183 // It's unclear if this is a premature optimization. |
180 if (!preferredLogicalWidthsDirty()) | 184 if (!preferredLogicalWidthsDirty()) |
181 return; | 185 return; |
182 | 186 |
183 m_text = ""; | 187 m_text = ""; |
184 | 188 |
185 if (isImage()) | 189 if (isImage()) |
186 return; | 190 return; |
187 | 191 |
188 switch (getListStyleCategory()) { | 192 switch (getListStyleCategory()) { |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 if (!style()->isHorizontalWritingMode()) { | 443 if (!style()->isHorizontalWritingMode()) { |
440 relativeRect = relativeRect.transposedRect(); | 444 relativeRect = relativeRect.transposedRect(); |
441 relativeRect.setX( | 445 relativeRect.setX( |
442 (size().width() - relativeRect.x() - relativeRect.width()).toInt()); | 446 (size().width() - relativeRect.x() - relativeRect.width()).toInt()); |
443 } | 447 } |
444 | 448 |
445 return relativeRect; | 449 return relativeRect; |
446 } | 450 } |
447 | 451 |
448 void LayoutListMarker::setSelectionState(SelectionState state) { | 452 void LayoutListMarker::setSelectionState(SelectionState state) { |
449 // The selection state for our containing block hierarchy is updated by the ba
se class call. | 453 // The selection state for our containing block hierarchy is updated by the |
| 454 // base class call. |
450 LayoutBox::setSelectionState(state); | 455 LayoutBox::setSelectionState(state); |
451 | 456 |
452 if (inlineBoxWrapper() && canUpdateSelectionOnRootLineBoxes()) | 457 if (inlineBoxWrapper() && canUpdateSelectionOnRootLineBoxes()) |
453 inlineBoxWrapper()->root().setHasSelectedChildren(state != SelectionNone); | 458 inlineBoxWrapper()->root().setHasSelectedChildren(state != SelectionNone); |
454 } | 459 } |
455 | 460 |
456 void LayoutListMarker::listItemStyleDidChange() { | 461 void LayoutListMarker::listItemStyleDidChange() { |
457 RefPtr<ComputedStyle> newStyle = ComputedStyle::create(); | 462 RefPtr<ComputedStyle> newStyle = ComputedStyle::create(); |
458 // The marker always inherits from the list item, regardless of where it might
end | 463 // The marker always inherits from the list item, regardless of where it might |
459 // up (e.g., in some deeply nested line box). See CSS3 spec. | 464 // end up (e.g., in some deeply nested line box). See CSS3 spec. |
460 newStyle->inheritFrom(m_listItem->styleRef()); | 465 newStyle->inheritFrom(m_listItem->styleRef()); |
461 if (style()) { | 466 if (style()) { |
462 // Reuse the current margins. Otherwise resetting the margins to initial val
ues | 467 // Reuse the current margins. Otherwise resetting the margins to initial |
463 // would trigger unnecessary layout. | 468 // values would trigger unnecessary layout. |
464 newStyle->setMarginStart(style()->marginStart()); | 469 newStyle->setMarginStart(style()->marginStart()); |
465 newStyle->setMarginEnd(style()->marginRight()); | 470 newStyle->setMarginEnd(style()->marginRight()); |
466 } | 471 } |
467 setStyle(newStyle.release()); | 472 setStyle(newStyle.release()); |
468 } | 473 } |
469 | 474 |
470 } // namespace blink | 475 } // namespace blink |
OLD | NEW |