1 /*
2 * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 *
20 */
21
22 #ifndef RenderTextControlSingleLine_h
23 #define RenderTextControlSingleLine_h
24
25 #include "PopupMenuClient.h"
26 #include "RenderTextControl.h"
27 #include "Timer.h"
28
29 namespace WebCore {
30
31 class InputElement;
32 class SearchFieldCancelButtonElement;
33 class SearchFieldResultsButtonElement;
34 class SearchPopupMenu;
35 class TextControlInnerElement;
36
37 class RenderTextControlSingleLine : public RenderTextControl, private PopupMenuClient {
38 public:
39 RenderTextControlSingleLine(Node*);
40 virtual ~RenderTextControlSingleLine();
41
placeholderIsVisible()42 bool placeholderIsVisible() const { return m_placeholderVisible; }
43 bool placeholderShouldBeVisible() const;
44 void updatePlaceholderVisibility();
45
46 void addSearchResult();
47 void stopSearchEventTimer();
48
popupIsVisible()49 bool popupIsVisible() const { return m_searchPopupIsVisible; }
50 void showPopup();
51 virtual void hidePopup(); // PopupMenuClient method
52
53 void forwardEvent(Event*);
54
55 void capsLockStateMayHaveChanged();
56
57 private:
hasControlClip()58 virtual bool hasControlClip() const { return m_cancelButton; }
isTextField()59 virtual bool isTextField() const { return true; }
60
61 virtual void subtreeHasChanged();
62 virtual void paint(PaintInfo&, int tx, int ty);
63 virtual void layout();
64
65 virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);
66
67 virtual void autoscroll();
68
69 // Subclassed to forward to our inner div.
70 virtual int scrollLeft() const;
71 virtual int scrollTop() const;
72 virtual int scrollWidth() const;
73 virtual int scrollHeight() const;
74 virtual void setScrollLeft(int);
75 virtual void setScrollTop(int);
76 virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1.0f);
77
78 int textBlockWidth() const;
79 virtual int preferredContentWidth(float charWidth) const;
80 virtual void adjustControlHeightBasedOnLineHeight(int lineHeight);
81
82 void createSubtreeIfNeeded();
83 virtual void updateFromElement();
84 virtual void cacheSelection(int start, int end);
85 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
86
87 virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const;
88 PassRefPtr<RenderStyle> createInnerBlockStyle(const RenderStyle* startStyle) const;
89 PassRefPtr<RenderStyle> createResultsButtonStyle(const RenderStyle* startStyle) const;
90 PassRefPtr<RenderStyle> createCancelButtonStyle(const RenderStyle* startStyle) const;
91
92 void updateCancelButtonVisibility() const;
93 EVisibility visibilityForCancelButton() const;
94 const AtomicString& autosaveName() const;
95
96 void startSearchEventTimer();
97 void searchEventTimerFired(Timer<RenderTextControlSingleLine>*);
98
99 // PopupMenuClient methods
100 virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
101 virtual String itemText(unsigned listIndex) const;
itemToolTip(unsigned)102 virtual String itemToolTip(unsigned) const { return String(); }
103 virtual bool itemIsEnabled(unsigned listIndex) const;
104 virtual PopupMenuStyle itemStyle(unsigned listIndex) const;
105 virtual PopupMenuStyle menuStyle() const;
106 virtual int clientInsetLeft() const;
107 virtual int clientInsetRight() const;
108 virtual int clientPaddingLeft() const;
109 virtual int clientPaddingRight() const;
110 virtual int listSize() const;
111 virtual int selectedIndex() const;
112 virtual bool itemIsSeparator(unsigned listIndex) const;
113 virtual bool itemIsLabel(unsigned listIndex) const;
114 virtual bool itemIsSelected(unsigned listIndex) const;
shouldPopOver()115 virtual bool shouldPopOver() const { return false; }
valueShouldChangeOnHotTrack()116 virtual bool valueShouldChangeOnHotTrack() const { return false; }
117 virtual void setTextFromItem(unsigned listIndex);
118 virtual FontSelector* fontSelector() const;
119 virtual HostWindow* hostWindow() const;
120 virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarClient*, ScrollbarOrientation, ScrollbarControlSize);
121
122 InputElement* inputElement() const;
123
124 bool m_placeholderVisible;
125 bool m_searchPopupIsVisible;
126 bool m_shouldDrawCapsLockIndicator;
127
128 RefPtr<TextControlInnerElement> m_innerBlock;
129 RefPtr<SearchFieldResultsButtonElement> m_resultsButton;
130 RefPtr<SearchFieldCancelButtonElement> m_cancelButton;
131
132 Timer<RenderTextControlSingleLine> m_searchEventTimer;
133 RefPtr<SearchPopupMenu> m_searchPopup;
134 Vector<String> m_recentSearches;
135 };
136
toRenderTextControlSingleLine(RenderObject * object)137 inline RenderTextControlSingleLine* toRenderTextControlSingleLine(RenderObject* object)
138 {
139 ASSERT(!object || object->isTextField());
140 return static_cast<RenderTextControlSingleLine*>(object);
141 }
142
143 // This will catch anyone doing an unnecessary cast.
144 void toRenderTextControlSingleLine(const RenderTextControlSingleLine*);
145
146 }
147
148 #endif
149