[WTF] Import std::optional reference implementation as WTF::Optional
[WebKit-https.git] / Source / WebCore / rendering / RenderMenuList.h
1 /*
2  * This file is part of the select element renderer in WebCore.
3  *
4  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5  * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2015 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #pragma once
25
26 #include "LayoutRect.h"
27 #include "PopupMenu.h"
28 #include "PopupMenuClient.h"
29 #include "RenderFlexibleBox.h"
30
31 #if PLATFORM(COCOA)
32 #define POPUP_MENU_PULLS_DOWN 0
33 #else
34 #define POPUP_MENU_PULLS_DOWN 1
35 #endif
36
37 namespace WebCore {
38
39 class HTMLSelectElement;
40 class RenderText;
41
42 class RenderMenuList final : public RenderFlexibleBox, private PopupMenuClient {
43
44 public:
45     RenderMenuList(HTMLSelectElement&, RenderStyle&&);
46     virtual ~RenderMenuList();
47
48     HTMLSelectElement& selectElement() const;
49
50 #if !PLATFORM(IOS)
51     bool popupIsVisible() const { return m_popupIsVisible; }
52 #endif
53     void showPopup();
54     void hidePopup();
55
56     void setOptionsChanged(bool changed) { m_needsOptionsWidthUpdate = changed; }
57
58     void didSetSelectedIndex(int listIndex);
59
60     String text() const;
61
62 private:
63     void element() const = delete;
64
65     bool isMenuList() const override { return true; }
66
67     void addChild(RenderObject* newChild, RenderObject* beforeChild = 0) override;
68     void removeChild(RenderObject&) override;
69     bool createsAnonymousWrapper() const override { return true; }
70
71     void updateFromElement() override;
72
73     LayoutRect controlClipRect(const LayoutPoint&) const override;
74     bool hasControlClip() const override { return true; }
75     bool canHaveGeneratedChildren() const override { return false; }
76
77     const char* renderName() const override { return "RenderMenuList"; }
78
79     void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override;
80     void computePreferredLogicalWidths() override;
81
82     void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override;
83
84     bool requiresForcedStyleRecalcPropagation() const override { return true; }
85
86     // PopupMenuClient methods
87     void valueChanged(unsigned listIndex, bool fireOnChange = true) override;
88     void selectionChanged(unsigned, bool) override { }
89     void selectionCleared() override { }
90     String itemText(unsigned listIndex) const override;
91     String itemLabel(unsigned listIndex) const override;
92     String itemIcon(unsigned listIndex) const override;
93     String itemToolTip(unsigned listIndex) const override;
94     String itemAccessibilityText(unsigned listIndex) const override;
95     bool itemIsEnabled(unsigned listIndex) const override;
96     PopupMenuStyle itemStyle(unsigned listIndex) const override;
97     PopupMenuStyle menuStyle() const override;
98     int clientInsetLeft() const override;
99     int clientInsetRight() const override;
100     LayoutUnit clientPaddingLeft() const override;
101     LayoutUnit clientPaddingRight() const override;
102     int listSize() const override;
103     int selectedIndex() const override;
104     void popupDidHide() override;
105     bool itemIsSeparator(unsigned listIndex) const override;
106     bool itemIsLabel(unsigned listIndex) const override;
107     bool itemIsSelected(unsigned listIndex) const override;
108     bool shouldPopOver() const override { return !POPUP_MENU_PULLS_DOWN; }
109     bool valueShouldChangeOnHotTrack() const override { return true; }
110     void setTextFromItem(unsigned listIndex) override;
111     void listBoxSelectItem(int listIndex, bool allowMultiplySelections, bool shift, bool fireOnChangeNow = true) override;
112     bool multiple() const override;
113     FontSelector* fontSelector() const override;
114     HostWindow* hostWindow() const override;
115     Ref<Scrollbar> createScrollbar(ScrollableArea&, ScrollbarOrientation, ScrollbarControlSize) override;
116
117     bool hasLineIfEmpty() const override { return true; }
118
119     // Flexbox defines baselines differently than regular blocks.
120     // For backwards compatibility, menulists need to do the regular block behavior.
121     int baselinePosition(FontBaseline baseline, bool firstLine, LineDirectionMode direction, LinePositionMode position) const override
122     {
123         return RenderBlock::baselinePosition(baseline, firstLine, direction, position);
124     }
125     std::optional<int> firstLineBaseline() const override { return RenderBlock::firstLineBaseline(); }
126     std::optional<int> inlineBlockBaseline(LineDirectionMode direction) const override { return RenderBlock::inlineBlockBaseline(direction); }
127
128     void getItemBackgroundColor(unsigned listIndex, Color&, bool& itemHasCustomBackgroundColor) const;
129
130     void createInnerBlock();
131     void adjustInnerStyle();
132     void setText(const String&);
133     void setTextFromOption(int optionIndex);
134     void updateOptionsWidth();
135
136     void didUpdateActiveOption(int optionIndex);
137
138     bool isFlexibleBoxImpl() const override { return true; }
139
140     RenderText* m_buttonText;
141     RenderBlock* m_innerBlock;
142
143     bool m_needsOptionsWidthUpdate;
144     int m_optionsWidth;
145
146     int m_lastActiveIndex;
147
148     std::unique_ptr<RenderStyle> m_optionStyle;
149
150 #if !PLATFORM(IOS)
151     RefPtr<PopupMenu> m_popup;
152     bool m_popupIsVisible;
153 #endif
154 };
155
156 } // namespace WebCore
157
158 SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderMenuList, isMenuList())