1 /*
2 * This file is part of the select element renderer in WebCore.
3 *
4 * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 *
21 */
22
23 #ifndef RenderMenuList_h
24 #define RenderMenuList_h
25
26 #include "PopupMenuClient.h"
27 #include "RenderFlexibleBox.h"
28
29 #if PLATFORM(MAC)
30 #define POPUP_MENU_PULLS_DOWN 0
31 #else
32 #define POPUP_MENU_PULLS_DOWN 1
33 #endif
34
35 namespace WebCore {
36
37 class PopupMenu;
38 class RenderText;
39
40 class RenderMenuList : public RenderFlexibleBox, private PopupMenuClient {
41 public:
42 RenderMenuList(Element*);
43 virtual ~RenderMenuList();
44
45 public:
popupIsVisible()46 bool popupIsVisible() const { return m_popupIsVisible; }
47 void showPopup();
48 void hidePopup();
49
setOptionsChanged(bool changed)50 void setOptionsChanged(bool changed) { m_optionsChanged = changed; }
51
52 void didSetSelectedIndex();
53
54 String text() const;
55
56 private:
isMenuList()57 virtual bool isMenuList() const { return true; }
58
59 virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0);
60 virtual void removeChild(RenderObject*);
createsAnonymousWrapper()61 virtual bool createsAnonymousWrapper() const { return true; }
canHaveChildren()62 virtual bool canHaveChildren() const { return false; }
63
64 virtual void updateFromElement();
65
hasControlClip()66 virtual bool hasControlClip() const { return true; }
67 virtual IntRect controlClipRect(int tx, int ty) const;
68
renderName()69 virtual const char* renderName() const { return "RenderMenuList"; }
70
71 virtual void calcPrefWidths();
72
73 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
74
75 // PopupMenuClient methods
76 virtual String itemText(unsigned listIndex) const;
77 virtual String itemToolTip(unsigned listIndex) const;
78 virtual bool itemIsEnabled(unsigned listIndex) const;
79 virtual PopupMenuStyle itemStyle(unsigned listIndex) const;
80 virtual PopupMenuStyle menuStyle() const;
81 virtual int clientInsetLeft() const;
82 virtual int clientInsetRight() const;
83 virtual int clientPaddingLeft() const;
84 virtual int clientPaddingRight() const;
85 virtual int listSize() const;
86 virtual int selectedIndex() const;
87 virtual void popupDidHide();
88 virtual bool itemIsSeparator(unsigned listIndex) const;
89 virtual bool itemIsLabel(unsigned listIndex) const;
90 virtual bool itemIsSelected(unsigned listIndex) const;
91 virtual void setTextFromItem(unsigned listIndex);
valueShouldChangeOnHotTrack()92 virtual bool valueShouldChangeOnHotTrack() const { return true; }
shouldPopOver()93 virtual bool shouldPopOver() const { return !POPUP_MENU_PULLS_DOWN; }
94 virtual void valueChanged(unsigned listIndex, bool fireOnChange = true);
95 virtual FontSelector* fontSelector() const;
96 virtual HostWindow* hostWindow() const;
97 virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarClient*, ScrollbarOrientation, ScrollbarControlSize);
98
hasLineIfEmpty()99 virtual bool hasLineIfEmpty() const { return true; }
100
101 Color itemBackgroundColor(unsigned listIndex) const;
102
103 void createInnerBlock();
104 void adjustInnerStyle();
105 void setText(const String&);
106 void setTextFromOption(int optionIndex);
107 void updateOptionsWidth();
108
109 RenderText* m_buttonText;
110 RenderBlock* m_innerBlock;
111
112 bool m_optionsChanged;
113 int m_optionsWidth;
114
115 int m_lastSelectedIndex;
116
117 RefPtr<PopupMenu> m_popup;
118 bool m_popupIsVisible;
119 };
120
toRenderMenuList(RenderObject * object)121 inline RenderMenuList* toRenderMenuList(RenderObject* object)
122 {
123 ASSERT(!object || object->isMenuList());
124 return static_cast<RenderMenuList*>(object);
125 }
126
127 // This will catch anyone doing an unnecessary cast.
128 void toRenderMenuList(const RenderMenuList*);
129
130 }
131
132 #endif
133