/* * Copyright (c) 2011, Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PopupListBox_h #define PopupListBox_h #include "core/dom/Element.h" #include "platform/scroll/FramelessScrollView.h" #include "platform/text/TextDirection.h" #include "wtf/text/WTFString.h" namespace WebCore { typedef unsigned long long TimeStamp; class Font; class GraphicsContext; class IntRect; class PlatformKeyboardEvent; class PlatformMouseEvent; class PlatformGestureEvent; class PlatformTouchEvent; class PlatformWheelEvent; class PopupMenuClient; struct PopupContainerSettings { // Whether the PopupMenuClient should be told to change its text when a // new item is selected by using the arrow keys. bool setTextOnIndexChange; // Whether the selection should be accepted when the popup menu is // closed (through ESC being pressed or the focus going away). // Note that when TAB is pressed, the selection is always accepted // regardless of this setting. bool acceptOnAbandon; // Whether we should move the selection to the first/last item when // the user presses down/up arrow keys and the last/first item is // selected. bool loopSelectionNavigation; // Whether we should restrict the width of the PopupListBox or not. // Autocomplete popups are restricted, combo-boxes (select tags) aren't. bool restrictWidthOfListBox; // If the device is a touch screen we increase the height of menu items // to make it easier to unambiguously touch them. bool deviceSupportsTouch; }; class PopupContent { public: virtual void layout() = 0; virtual void setMaxHeight(int) = 0; virtual void setMaxWidthAndLayout(int) = 0; virtual int popupContentHeight() const = 0; virtual ~PopupContent() { }; }; // A container for the data for each menu item (e.g. represented by in a widget in the page void setOriginalIndex(int); // Gets the index of the item that the user is currently moused over or has // selected with the keyboard. This is not the same as the original index, // since the user has not yet accepted this input. int selectedIndex() const { return m_selectedIndex; } // Moves selection down/up the given number of items, scrolling if necessary. // Positive is down. The resulting index will be clamped to the range // [0, numItems), and non-option items will be skipped. void adjustSelectedIndex(int delta); // Returns the number of items in the list. int numItems() const { return static_cast(m_items.size()); } void setBaseWidth(int width) { m_baseWidth = std::min(m_maxWindowWidth, width); } // Computes the size of widget and children. virtual void layout() OVERRIDE; // Returns whether the popup wants to process events for the passed key. bool isInterestedInEventForKey(int keyCode); // Gets the height of a row. int getRowHeight(int index); virtual void setMaxHeight(int maxHeight) OVERRIDE { m_maxHeight = maxHeight; } void setMaxWidth(int maxWidth) { m_maxWindowWidth = maxWidth; } virtual void setMaxWidthAndLayout(int) OVERRIDE; void disconnectClient() { m_popupClient = 0; } const Vector& items() const { return m_items; } virtual int popupContentHeight() const OVERRIDE; static const int defaultMaxHeight; private: friend class PopupContainer; friend class RefCounted; PopupListBox(PopupMenuClient*, const PopupContainerSettings&); virtual ~PopupListBox() { clear(); } // Hides the popup. Other classes should not call this. Use abandon instead. void hidePopup(); // Returns true if the selection can be changed to index. // Disabled items, or labels cannot be selected. bool isSelectableItem(int index); // Select an index in the list, scrolling if necessary. void selectIndex(int index); // Accepts the selected index as the value to be displayed in the Vector m_items; // The