| Index: Source/web/PopupListBox.cpp
|
| diff --git a/Source/web/PopupListBox.cpp b/Source/web/PopupListBox.cpp
|
| index 1c47a0004a84928f7d8c8d2ee5540a41c4783861..67c99142d31d6b23504121b08646580dc9b96ac3 100644
|
| --- a/Source/web/PopupListBox.cpp
|
| +++ b/Source/web/PopupListBox.cpp
|
| @@ -47,11 +47,11 @@
|
| #include "platform/fonts/FontSelector.h"
|
| #include "platform/geometry/IntRect.h"
|
| #include "platform/graphics/GraphicsContext.h"
|
| -#include "platform/scroll/FramelessScrollViewClient.h"
|
| #include "platform/scroll/ScrollbarTheme.h"
|
| #include "platform/text/StringTruncator.h"
|
| #include "platform/text/TextRun.h"
|
| #include "web/PopupContainer.h"
|
| +#include "web/PopupContainerClient.h"
|
| #include "web/PopupMenuChromium.h"
|
| #include "wtf/ASCIICType.h"
|
| #include "wtf/CurrentTime.h"
|
| @@ -66,7 +66,7 @@ static const int maxVisibleRows = 20;
|
| static const int minEndOfLinePadding = 2;
|
| static const TimeStamp typeAheadTimeoutMs = 1000;
|
|
|
| -PopupListBox::PopupListBox(PopupMenuClient* client, bool deviceSupportsTouch)
|
| +PopupListBox::PopupListBox(PopupMenuClient* client, bool deviceSupportsTouch, PopupContainer* container)
|
| : m_deviceSupportsTouch(deviceSupportsTouch)
|
| , m_originalIndex(0)
|
| , m_selectedIndex(0)
|
| @@ -78,10 +78,19 @@ PopupListBox::PopupListBox(PopupMenuClient* client, bool deviceSupportsTouch)
|
| , m_repeatingChar(0)
|
| , m_lastCharTime(0)
|
| , m_maxWindowWidth(std::numeric_limits<int>::max())
|
| + , m_container(container)
|
| {
|
| setScrollbarModes(ScrollbarAlwaysOff, ScrollbarAlwaysOff);
|
| }
|
|
|
| +PopupListBox::~PopupListBox()
|
| +{
|
| + clear();
|
| +
|
| + setHasHorizontalScrollbar(false);
|
| + setHasVerticalScrollbar(false);
|
| +}
|
| +
|
| bool PopupListBox::handleMouseDownEvent(const PlatformMouseEvent& event)
|
| {
|
| Scrollbar* scrollbar = scrollbarAtPoint(event.position());
|
| @@ -467,7 +476,7 @@ void PopupListBox::paintRow(GraphicsContext* gc, const IntRect& rect, int rowInd
|
| gc->drawBidiText(itemFont, textRunPaintInfo, IntPoint(textX, textY));
|
| }
|
|
|
| -Font PopupListBox::getRowFont(int rowIndex)
|
| +Font PopupListBox::getRowFont(int rowIndex) const
|
| {
|
| Font itemFont = m_popupClient->itemStyle(rowIndex).font();
|
| if (m_popupClient->itemIsLabel(rowIndex)) {
|
| @@ -568,7 +577,7 @@ void PopupListBox::setOriginalIndex(int index)
|
| m_originalIndex = m_selectedIndex = index;
|
| }
|
|
|
| -int PopupListBox::getRowHeight(int index)
|
| +int PopupListBox::getRowHeight(int index) const
|
| {
|
| int minimumHeight = m_deviceSupportsTouch ? optionRowHeightForTouch : minRowHeight;
|
|
|
| @@ -596,8 +605,7 @@ void PopupListBox::invalidateRow(int index)
|
| if (index < 0)
|
| return;
|
|
|
| - // Invalidate in the window contents, as FramelessScrollView::invalidateRect
|
| - // paints in the window coordinates.
|
| + // Invalidate in the window contents, as invalidateRect paints in the window coordinates.
|
| IntRect clipRect = contentsToWindow(getRowBounds(index));
|
| if (shouldPlaceVerticalScrollbarOnLeft() && verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar())
|
| clipRect.move(verticalScrollbar()->width(), 0);
|
| @@ -683,10 +691,9 @@ void PopupListBox::adjustSelectedIndex(int delta)
|
| void PopupListBox::hidePopup()
|
| {
|
| if (parent()) {
|
| - PopupContainer* container = static_cast<PopupContainer*>(parent());
|
| - if (container->client())
|
| - container->client()->popupClosed(container);
|
| - container->notifyPopupHidden();
|
| + if (m_container->client())
|
| + m_container->client()->popupClosed(m_container);
|
| + m_container->notifyPopupHidden();
|
| }
|
|
|
| if (m_popupClient)
|
| @@ -834,4 +841,42 @@ int PopupListBox::popupContentHeight() const
|
| return height();
|
| }
|
|
|
| +void PopupListBox::invalidateRect(const IntRect& rect)
|
| +{
|
| + if (HostWindow* h = hostWindow())
|
| + h->invalidateContentsAndRootView(rect);
|
| +}
|
| +
|
| +IntRect PopupListBox::windowClipRect(IncludeScrollbarsInRect scrollbarInclusion) const
|
| +{
|
| + IntRect clipRect = visibleContentRect(scrollbarInclusion);
|
| + if (shouldPlaceVerticalScrollbarOnLeft() && verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar())
|
| + clipRect.move(verticalScrollbar()->width(), 0);
|
| + return contentsToWindow(clipRect);
|
| +}
|
| +
|
| +void PopupListBox::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rect)
|
| +{
|
| + // Add in our offset within the ScrollView.
|
| + IntRect dirtyRect = rect;
|
| + dirtyRect.move(scrollbar->x(), scrollbar->y());
|
| + invalidateRect(dirtyRect);
|
| +}
|
| +
|
| +bool PopupListBox::isActive() const
|
| +{
|
| + // FIXME
|
| + return true;
|
| +}
|
| +
|
| +bool PopupListBox::scrollbarsCanBeActive() const
|
| +{
|
| + return isActive();
|
| +}
|
| +
|
| +IntRect PopupListBox::scrollableAreaBoundingBox() const
|
| +{
|
| + return windowClipRect(IncludeScrollbars);
|
| +}
|
| +
|
| } // namespace blink
|
|
|