2008-08-08 Maxime Britto <britto@apple.com>
[WebKit-https.git] / WebCore / rendering / RenderTextControl.h
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.s
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20
21 #ifndef RenderTextControl_h
22 #define RenderTextControl_h
23
24 #include "PopupMenuClient.h"
25 #include "RenderBlock.h"
26 #include "Timer.h"
27
28 namespace WebCore {
29
30 class FontSelector;
31 class HTMLTextFieldInnerElement;
32 class HTMLTextFieldInnerTextElement;
33 class HTMLSearchFieldCancelButtonElement;
34 class HTMLSearchFieldResultsButtonElement;
35 class SearchPopupMenu;
36 class Selection;
37
38 class RenderTextControl : public RenderBlock, private PopupMenuClient {
39 public:
40     RenderTextControl(Node*, bool multiLine);
41     virtual ~RenderTextControl();
42
43     virtual const char* renderName() const { return "RenderTextControl"; }
44
45     virtual bool hasControlClip() const { return m_cancelButton; }
46     virtual IntRect controlClipRect(int tx, int ty) const;
47     virtual void calcHeight();
48     virtual void calcPrefWidths();
49     virtual void removeLeftoverAnonymousBlock(RenderBlock*) { }
50     virtual void setStyle(RenderStyle*);
51     virtual void updateFromElement();
52     virtual bool canHaveChildren() const { return false; }
53     virtual int baselinePosition(bool firstLine, bool isRootLineBox) const;
54     virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);
55     virtual void layout();
56     virtual bool avoidsFloats() const { return true; }
57     virtual void paint(PaintInfo&, int tx, int ty);
58     
59     virtual bool isEdited() const { return m_dirty; }
60     virtual void setEdited(bool isEdited) { m_dirty = isEdited; }
61     virtual bool isTextField() const { return !m_multiLine; }
62     virtual bool isTextArea() const { return m_multiLine; }
63     
64     bool isUserEdited() const { return m_userEdited; }
65     void setUserEdited(bool isUserEdited);
66
67     int selectionStart();
68     int selectionEnd();
69     void setSelectionStart(int);
70     void setSelectionEnd(int);
71     void select();
72     void setSelectionRange(int start, int end);
73     Selection selection(int start, int end) const;
74
75     void subtreeHasChanged();
76     String text();
77     String textWithHardLineBreaks();
78     void forwardEvent(Event*);
79     void selectionChanged(bool userTriggered);
80
81     virtual bool canBeProgramaticallyScrolled(bool) const { return true; }
82     virtual void autoscroll();
83
84     // Subclassed to forward to our inner div.
85     virtual int scrollLeft() const;
86     virtual int scrollTop() const;
87     virtual int scrollWidth() const;
88     virtual int scrollHeight() const;
89     virtual void setScrollLeft(int);
90     virtual void setScrollTop(int);
91     virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1.0f);
92     virtual bool isScrollable() const;
93
94     VisiblePosition visiblePositionForIndex(int index);
95     int indexForVisiblePosition(const VisiblePosition&);
96
97     void addSearchResult();
98
99     bool popupIsVisible() const { return m_searchPopupIsVisible; }
100     void showPopup();
101     void hidePopup();
102
103     void stopSearchEventTimer();
104     
105     bool placeholderIsVisible() const { return m_placeholderVisible; }
106
107     virtual void capsLockStateMayHaveChanged();
108
109 private:
110     // PopupMenuClient methods
111     virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
112     virtual String itemText(unsigned listIndex) const;
113     virtual bool itemIsEnabled(unsigned listIndex) const;
114     virtual Color itemBackgroundColor(unsigned listIndex) const;
115     virtual RenderStyle* itemStyle(unsigned listIndex) const;
116     virtual RenderStyle* clientStyle() const;
117     virtual Document* clientDocument() const;
118     virtual int clientInsetLeft() const;
119     virtual int clientInsetRight() const;
120     virtual int clientPaddingLeft() const;
121     virtual int clientPaddingRight() const;
122     virtual int listSize() const;
123     virtual int selectedIndex() const;
124     virtual bool itemIsSeparator(unsigned listIndex) const;
125     virtual bool itemIsLabel(unsigned listIndex) const;
126     virtual bool itemIsSelected(unsigned listIndex) const;
127     virtual void setTextFromItem(unsigned listIndex);
128     virtual bool shouldPopOver() const { return false; }
129     virtual bool valueShouldChangeOnHotTrack() const { return false; }
130     virtual FontSelector* fontSelector() const;
131
132     RenderStyle* createInnerBlockStyle(RenderStyle* startStyle);
133     RenderStyle* createInnerTextStyle(RenderStyle* startStyle);
134     RenderStyle* createCancelButtonStyle(RenderStyle* startStyle);
135     RenderStyle* createResultsButtonStyle(RenderStyle* startStyle);
136
137     void updatePlaceholder();
138     void createSubtreeIfNeeded();
139     void updateCancelButtonVisibility(RenderStyle*);
140     const AtomicString& autosaveName() const;
141     void startSearchEventTimer();
142     void searchEventTimerFired(Timer<RenderTextControl>*);
143     String finishText(Vector<UChar>&) const;
144
145     friend class TextIterator;
146     HTMLElement* innerTextElement() const;
147
148     RefPtr<HTMLTextFieldInnerElement> m_innerBlock;
149     RefPtr<HTMLTextFieldInnerTextElement> m_innerText;
150     RefPtr<HTMLSearchFieldResultsButtonElement> m_resultsButton;
151     RefPtr<HTMLSearchFieldCancelButtonElement> m_cancelButton;
152
153     bool m_dirty;
154     bool m_multiLine;
155     bool m_placeholderVisible;
156     bool m_userEdited;
157     bool m_shouldDrawCapsLockIndicator;
158     
159     RefPtr<SearchPopupMenu> m_searchPopup;
160     bool m_searchPopupIsVisible;
161     mutable Vector<String> m_recentSearches;
162
163     Timer<RenderTextControl> m_searchEventTimer;
164 };
165
166 } // namespace WebCore
167
168 #endif // RenderTextControl_h