OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. |
3 * 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 3 * 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 | 113 |
114 inline HTMLSelectElement* RenderListBox::selectElement() const | 114 inline HTMLSelectElement* RenderListBox::selectElement() const |
115 { | 115 { |
116 return toHTMLSelectElement(node()); | 116 return toHTMLSelectElement(node()); |
117 } | 117 } |
118 | 118 |
119 void RenderListBox::updateFromElement() | 119 void RenderListBox::updateFromElement() |
120 { | 120 { |
121 FontCachePurgePreventer fontCachePurgePreventer; | 121 FontCachePurgePreventer fontCachePurgePreventer; |
122 if (m_optionsChanged) { | 122 if (m_optionsChanged) { |
123 const Vector<HTMLElement*>& listItems = selectElement()->listItems(); | 123 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = se
lectElement()->listItems(); |
124 int size = static_cast<int>(listItems.size()); | 124 int size = static_cast<int>(listItems.size()); |
125 | 125 |
126 float width = 0; | 126 float width = 0; |
127 m_listItemCount = 0; | 127 m_listItemCount = 0; |
128 for (int i = 0; i < size; ++i) { | 128 for (int i = 0; i < size; ++i) { |
129 const HTMLElement& element = *listItems[i]; | 129 const HTMLElement& element = *listItems[i]; |
130 | 130 |
131 String text; | 131 String text; |
132 Font itemFont = style()->font(); | 132 Font itemFont = style()->font(); |
133 if (isHTMLOptionElement(element)) { | 133 if (isHTMLOptionElement(element)) { |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 | 366 |
367 // Focus the last selected item. | 367 // Focus the last selected item. |
368 int selectedItem = select->activeSelectionEndListIndex(); | 368 int selectedItem = select->activeSelectionEndListIndex(); |
369 if (selectedItem >= 0) { | 369 if (selectedItem >= 0) { |
370 rects.append(pixelSnappedIntRect(itemBoundingBoxRectInternal(additionalO
ffset, selectedItem))); | 370 rects.append(pixelSnappedIntRect(itemBoundingBoxRectInternal(additionalO
ffset, selectedItem))); |
371 return; | 371 return; |
372 } | 372 } |
373 | 373 |
374 // No selected items, find the first non-disabled item. | 374 // No selected items, find the first non-disabled item. |
375 int size = numItems(); | 375 int size = numItems(); |
376 const Vector<HTMLElement*>& listItems = select->listItems(); | 376 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = select
->listItems(); |
377 for (int i = 0; i < size; ++i) { | 377 for (int i = 0; i < size; ++i) { |
378 HTMLElement* element = listItems[renderListBoxIndexToListIndex(i)]; | 378 HTMLElement* element = listItems[renderListBoxIndexToListIndex(i)]; |
379 if (isHTMLOptionElement(*element) && !element->isDisabledFormControl())
{ | 379 if (isHTMLOptionElement(*element) && !element->isDisabledFormControl())
{ |
380 rects.append(pixelSnappedIntRect(itemBoundingBoxRectInternal(additio
nalOffset, i))); | 380 rects.append(pixelSnappedIntRect(itemBoundingBoxRectInternal(additio
nalOffset, i))); |
381 return; | 381 return; |
382 } | 382 } |
383 } | 383 } |
384 } | 384 } |
385 | 385 |
386 int RenderListBox::scrollbarLeft() const | 386 int RenderListBox::scrollbarLeft() const |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 offset.setWidth(optionsSpacingHorizontal); | 424 offset.setWidth(optionsSpacingHorizontal); |
425 return offset; | 425 return offset; |
426 } | 426 } |
427 | 427 |
428 void RenderListBox::paintItemForeground(PaintInfo& paintInfo, const LayoutPoint&
paintOffset, int listIndex) | 428 void RenderListBox::paintItemForeground(PaintInfo& paintInfo, const LayoutPoint&
paintOffset, int listIndex) |
429 { | 429 { |
430 FontCachePurgePreventer fontCachePurgePreventer; | 430 FontCachePurgePreventer fontCachePurgePreventer; |
431 | 431 |
432 HTMLSelectElement* select = selectElement(); | 432 HTMLSelectElement* select = selectElement(); |
433 | 433 |
434 const Vector<HTMLElement*>& listItems = select->listItems(); | 434 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = select
->listItems(); |
435 HTMLElement* element = listItems[renderListBoxIndexToListIndex(listIndex)]; | 435 HTMLElement* element = listItems[renderListBoxIndexToListIndex(listIndex)]; |
436 | 436 |
437 RenderStyle* itemStyle = element->renderStyle(); | 437 RenderStyle* itemStyle = element->renderStyle(); |
438 if (!itemStyle) | 438 if (!itemStyle) |
439 itemStyle = style(); | 439 itemStyle = style(); |
440 | 440 |
441 if (itemStyle->visibility() == HIDDEN) | 441 if (itemStyle->visibility() == HIDDEN) |
442 return; | 442 return; |
443 | 443 |
444 String itemText; | 444 String itemText; |
(...skipping 28 matching lines...) Expand all Loading... |
473 } | 473 } |
474 | 474 |
475 // Draw the item text | 475 // Draw the item text |
476 TextRunPaintInfo textRunPaintInfo(textRun); | 476 TextRunPaintInfo textRunPaintInfo(textRun); |
477 textRunPaintInfo.bounds = r; | 477 textRunPaintInfo.bounds = r; |
478 paintInfo.context->drawBidiText(itemFont, textRunPaintInfo, roundedIntPoint(
r.location())); | 478 paintInfo.context->drawBidiText(itemFont, textRunPaintInfo, roundedIntPoint(
r.location())); |
479 } | 479 } |
480 | 480 |
481 void RenderListBox::paintItemBackground(PaintInfo& paintInfo, const LayoutPoint&
paintOffset, int listIndex) | 481 void RenderListBox::paintItemBackground(PaintInfo& paintInfo, const LayoutPoint&
paintOffset, int listIndex) |
482 { | 482 { |
483 const Vector<HTMLElement*>& listItems = selectElement()->listItems(); | 483 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = select
Element()->listItems(); |
484 HTMLElement* element = listItems[renderListBoxIndexToListIndex(listIndex)]; | 484 HTMLElement* element = listItems[renderListBoxIndexToListIndex(listIndex)]; |
485 | 485 |
486 Color backColor; | 486 Color backColor; |
487 if (isHTMLOptionElement(*element) && ((toHTMLOptionElement(*element).selecte
d() && selectElement()->suggestedIndex() < 0) || listIndex == selectElement()->s
uggestedIndex())) { | 487 if (isHTMLOptionElement(*element) && ((toHTMLOptionElement(*element).selecte
d() && selectElement()->suggestedIndex() < 0) || listIndex == selectElement()->s
uggestedIndex())) { |
488 if (frame()->selection().isFocusedAndActive() && document().focusedEleme
nt() == node()) | 488 if (frame()->selection().isFocusedAndActive() && document().focusedEleme
nt() == node()) |
489 backColor = RenderTheme::theme().activeListBoxSelectionBackgroundCol
or(); | 489 backColor = RenderTheme::theme().activeListBoxSelectionBackgroundCol
or(); |
490 else | 490 else |
491 backColor = RenderTheme::theme().inactiveListBoxSelectionBackgroundC
olor(); | 491 backColor = RenderTheme::theme().inactiveListBoxSelectionBackgroundC
olor(); |
492 } else { | 492 } else { |
493 backColor = element->renderStyle() ? resolveColor(element->renderStyle()
, CSSPropertyBackgroundColor) : resolveColor(CSSPropertyBackgroundColor); | 493 backColor = element->renderStyle() ? resolveColor(element->renderStyle()
, CSSPropertyBackgroundColor) : resolveColor(CSSPropertyBackgroundColor); |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 if (index < 0 || index >= numItems() || index == m_indexOffset) | 729 if (index < 0 || index >= numItems() || index == m_indexOffset) |
730 return; | 730 return; |
731 | 731 |
732 scrollToOffsetWithoutAnimation(VerticalScrollbar, index); | 732 scrollToOffsetWithoutAnimation(VerticalScrollbar, index); |
733 } | 733 } |
734 | 734 |
735 bool RenderListBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& re
sult, const HitTestLocation& locationInContainer, const LayoutPoint& accumulated
Offset, HitTestAction hitTestAction) | 735 bool RenderListBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& re
sult, const HitTestLocation& locationInContainer, const LayoutPoint& accumulated
Offset, HitTestAction hitTestAction) |
736 { | 736 { |
737 if (!RenderBlockFlow::nodeAtPoint(request, result, locationInContainer, accu
mulatedOffset, hitTestAction)) | 737 if (!RenderBlockFlow::nodeAtPoint(request, result, locationInContainer, accu
mulatedOffset, hitTestAction)) |
738 return false; | 738 return false; |
739 const Vector<HTMLElement*>& listItems = selectElement()->listItems(); | 739 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = select
Element()->listItems(); |
740 int size = numItems(); | 740 int size = numItems(); |
741 LayoutPoint adjustedLocation = accumulatedOffset + location(); | 741 LayoutPoint adjustedLocation = accumulatedOffset + location(); |
742 | 742 |
743 for (int i = 0; i < size; ++i) { | 743 for (int i = 0; i < size; ++i) { |
744 if (itemBoundingBoxRectInternal(adjustedLocation, i).contains(locationIn
Container.point())) { | 744 if (itemBoundingBoxRectInternal(adjustedLocation, i).contains(locationIn
Container.point())) { |
745 if (Element* node = listItems[renderListBoxIndexToListIndex(i)]) { | 745 if (Element* node = listItems[renderListBoxIndexToListIndex(i)]) { |
746 result.setInnerNode(node); | 746 result.setInnerNode(node); |
747 if (!result.innerNonSharedNode()) | 747 if (!result.innerNonSharedNode()) |
748 result.setInnerNonSharedNode(node); | 748 result.setInnerNonSharedNode(node); |
749 result.setLocalPoint(locationInContainer.point() - toLayoutSize(
adjustedLocation)); | 749 result.setLocalPoint(locationInContainer.point() - toLayoutSize(
adjustedLocation)); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 if (m_vBar) | 968 if (m_vBar) |
969 m_vBar->styleChanged(); | 969 m_vBar->styleChanged(); |
970 | 970 |
971 // Force an update since we know the scrollbars have changed things. | 971 // Force an update since we know the scrollbars have changed things. |
972 if (document().hasAnnotatedRegions()) | 972 if (document().hasAnnotatedRegions()) |
973 document().setAnnotatedRegionsDirty(true); | 973 document().setAnnotatedRegionsDirty(true); |
974 } | 974 } |
975 | 975 |
976 int RenderListBox::renderListBoxIndexToListIndex(int index) const | 976 int RenderListBox::renderListBoxIndexToListIndex(int index) const |
977 { | 977 { |
978 const Vector<HTMLElement*>& listItems = selectElement()->listItems(); | 978 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = select
Element()->listItems(); |
979 const int size = static_cast<int>(listItems.size()); | 979 const int size = static_cast<int>(listItems.size()); |
980 | 980 |
981 if (size == numItems()) | 981 if (size == numItems()) |
982 return index; | 982 return index; |
983 | 983 |
984 int listBoxIndex = 0; | 984 int listBoxIndex = 0; |
985 int listIndex = 0; | 985 int listIndex = 0; |
986 for (; listIndex < size; ++listIndex) { | 986 for (; listIndex < size; ++listIndex) { |
987 const HTMLElement& element = *listItems[listIndex]; | 987 const HTMLElement& element = *listItems[listIndex]; |
988 if (isHTMLOptionElement(element) && toHTMLOptionElement(element).isDispl
ayNone()) | 988 if (isHTMLOptionElement(element) && toHTMLOptionElement(element).isDispl
ayNone()) |
989 continue; | 989 continue; |
990 if (isHTMLOptGroupElement(element) && toHTMLOptGroupElement(element).isD
isplayNone()) | 990 if (isHTMLOptGroupElement(element) && toHTMLOptGroupElement(element).isD
isplayNone()) |
991 continue; | 991 continue; |
992 if (index == listBoxIndex) | 992 if (index == listBoxIndex) |
993 break; | 993 break; |
994 ++listBoxIndex; | 994 ++listBoxIndex; |
995 } | 995 } |
996 return listIndex; | 996 return listIndex; |
997 } | 997 } |
998 | 998 |
999 int RenderListBox::listIndexToRenderListBoxIndex(int index) const | 999 int RenderListBox::listIndexToRenderListBoxIndex(int index) const |
1000 { | 1000 { |
1001 const Vector<HTMLElement*>& listItems = selectElement()->listItems(); | 1001 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = select
Element()->listItems(); |
1002 const int size = static_cast<int>(listItems.size()); | 1002 const int size = static_cast<int>(listItems.size()); |
1003 | 1003 |
1004 if (size == numItems()) | 1004 if (size == numItems()) |
1005 return index; | 1005 return index; |
1006 | 1006 |
1007 int listBoxIndex = 0; | 1007 int listBoxIndex = 0; |
1008 for (int listIndex = 0; listIndex < size; ++listIndex) { | 1008 for (int listIndex = 0; listIndex < size; ++listIndex) { |
1009 const HTMLElement& element = *listItems[listIndex]; | 1009 const HTMLElement& element = *listItems[listIndex]; |
1010 if (isHTMLOptionElement(element) && toHTMLOptionElement(element).isDispl
ayNone()) | 1010 if (isHTMLOptionElement(element) && toHTMLOptionElement(element).isDispl
ayNone()) |
1011 continue; | 1011 continue; |
(...skipping 10 matching lines...) Expand all Loading... |
1022 { | 1022 { |
1023 return itemBoundingBoxRectInternal(point, listIndexToRenderListBoxIndex(inde
x)); | 1023 return itemBoundingBoxRectInternal(point, listIndexToRenderListBoxIndex(inde
x)); |
1024 } | 1024 } |
1025 | 1025 |
1026 bool RenderListBox::scrollToRevealElementAtListIndex(int index) | 1026 bool RenderListBox::scrollToRevealElementAtListIndex(int index) |
1027 { | 1027 { |
1028 return scrollToRevealElementAtListIndexInternal(listIndexToRenderListBoxInde
x(index)); | 1028 return scrollToRevealElementAtListIndexInternal(listIndexToRenderListBoxInde
x(index)); |
1029 } | 1029 } |
1030 | 1030 |
1031 } // namespace WebCore | 1031 } // namespace WebCore |
OLD | NEW |