1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
4db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is free software; you can redistribute it and/or
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modify it under the terms of the GNU Library General Public
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * License as published by the Free Software Foundation; either
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * version 2 of the License, or (at your option) any later version.
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is distributed in the hope that it will be useful,
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Library General Public License for more details.
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * You should have received a copy of the GNU Library General Public License
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Boston, MA 02110-1301, USA.
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef RenderTextControlSingleLine_h
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define RenderTextControlSingleLine_h
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PopupMenuClient.h"
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RenderTextControl.h"
28db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "SearchPopupMenu.h"
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Timer.h"
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass InputElement;
3406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass InputFieldSpeechButtonElement;
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass SearchFieldCancelButtonElement;
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass SearchFieldResultsButtonElement;
3721939df44de1705786c545cd1bf519d47250322dBen Murdochclass SpinButtonElement;
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass TextControlInnerElement;
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass RenderTextControlSingleLine : public RenderTextControl, private PopupMenuClient {
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectpublic:
42231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RenderTextControlSingleLine(Node*, bool);
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual ~RenderTextControlSingleLine();
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool placeholderIsVisible() const { return m_placeholderVisible; }
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool placeholderShouldBeVisible() const;
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void addSearchResult();
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void stopSearchEventTimer();
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool popupIsVisible() const { return m_searchPopupIsVisible; }
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void showPopup();
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    void hidePopup();
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void forwardEvent(Event*);
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void capsLockStateMayHaveChanged();
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5921939df44de1705786c545cd1bf519d47250322dBen Murdoch    // Decoration width outside of the text field.
6021939df44de1705786c545cd1bf519d47250322dBen Murdoch    int decorationWidthRight() const;
6121939df44de1705786c545cd1bf519d47250322dBen Murdoch
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate:
6321939df44de1705786c545cd1bf519d47250322dBen Murdoch    int preferredDecorationWidthRight() const;
6406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    virtual bool hasControlClip() const;
6521939df44de1705786c545cd1bf519d47250322dBen Murdoch    virtual IntRect controlClipRect(int tx, int ty) const;
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual bool isTextField() const { return true; }
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void subtreeHasChanged();
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void paint(PaintInfo&, int tx, int ty);
7021939df44de1705786c545cd1bf519d47250322dBen Murdoch    virtual void paintBoxDecorations(PaintInfo&, int tx, int ty);
7121939df44de1705786c545cd1bf519d47250322dBen Murdoch    virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void layout();
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void autoscroll();
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Subclassed to forward to our inner div.
798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual int scrollLeft() const;
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual int scrollTop() const;
818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual int scrollWidth() const;
828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual int scrollHeight() const;
838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void setScrollLeft(int);
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void setScrollTop(int);
855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1, Node** stopNode = 0);
86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool logicalScroll(ScrollLogicalDirection, ScrollGranularity, float multiplier = 1, Node** stopNode = 0);
878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int textBlockWidth() const;
89692e5dbf12901edacf14812a6fae25462920af42Steve Block    virtual float getAvgCharWidth(AtomicString family);
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual int preferredContentWidth(float charWidth) const;
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void adjustControlHeightBasedOnLineHeight(int lineHeight);
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void createSubtreeIfNeeded();
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void updateFromElement();
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void cacheSelection(int start, int end);
968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    virtual RenderStyle* textBaseStyle() const;
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const;
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    PassRefPtr<RenderStyle> createInnerBlockStyle(const RenderStyle* startStyle) const;
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    PassRefPtr<RenderStyle> createResultsButtonStyle(const RenderStyle* startStyle) const;
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    PassRefPtr<RenderStyle> createCancelButtonStyle(const RenderStyle* startStyle) const;
103967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    PassRefPtr<RenderStyle> createInnerSpinButtonStyle() const;
10421939df44de1705786c545cd1bf519d47250322dBen Murdoch    PassRefPtr<RenderStyle> createOuterSpinButtonStyle() const;
10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH)
106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    PassRefPtr<RenderStyle> createSpeechButtonStyle() const;
10706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void updateCancelButtonVisibility() const;
1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    EVisibility visibilityForCancelButton() const;
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    const AtomicString& autosaveName() const;
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void startSearchEventTimer();
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void searchEventTimerFired(Timer<RenderTextControlSingleLine>*);
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // PopupMenuClient methods
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
118545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    virtual void selectionChanged(unsigned, bool) {}
119545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    virtual void selectionCleared() {}
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual String itemText(unsigned listIndex) const;
121967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    virtual String itemLabel(unsigned listIndex) const;
1220617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    virtual String itemIcon(unsigned listIndex) const;
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual String itemToolTip(unsigned) const { return String(); }
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual String itemAccessibilityText(unsigned) const { return String(); }
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool itemIsEnabled(unsigned listIndex) const;
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual PopupMenuStyle itemStyle(unsigned listIndex) const;
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual PopupMenuStyle menuStyle() const;
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual int clientInsetLeft() const;
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual int clientInsetRight() const;
130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual int clientPaddingLeft() const;
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual int clientPaddingRight() const;
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual int listSize() const;
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual int selectedIndex() const;
134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    virtual void popupDidHide();
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool itemIsSeparator(unsigned listIndex) const;
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool itemIsLabel(unsigned listIndex) const;
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool itemIsSelected(unsigned listIndex) const;
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool shouldPopOver() const { return false; }
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool valueShouldChangeOnHotTrack() const { return false; }
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void setTextFromItem(unsigned listIndex);
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual FontSelector* fontSelector() const;
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual HostWindow* hostWindow() const;
143ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    virtual PassRefPtr<Scrollbar> createScrollbar(ScrollableArea*, ScrollbarOrientation, ScrollbarControlSize);
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    InputElement* inputElement() const;
146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual int textBlockInsetLeft() const;
1486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual int textBlockInsetRight() const;
149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual int textBlockInsetTop() const;
1506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_searchPopupIsVisible;
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_shouldDrawCapsLockIndicator;
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RefPtr<TextControlInnerElement> m_innerBlock;
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RefPtr<SearchFieldResultsButtonElement> m_resultsButton;
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RefPtr<SearchFieldCancelButtonElement> m_cancelButton;
157967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    RefPtr<TextControlInnerElement> m_innerSpinButton;
15821939df44de1705786c545cd1bf519d47250322dBen Murdoch    RefPtr<TextControlInnerElement> m_outerSpinButton;
15906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH)
16006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    RefPtr<InputFieldSpeechButtonElement> m_speechButton;
16106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Timer<RenderTextControlSingleLine> m_searchEventTimer;
164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RefPtr<SearchPopupMenu> m_searchPopup;
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Vector<String> m_recentSearches;
166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project};
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochinline RenderTextControlSingleLine* toRenderTextControlSingleLine(RenderObject* object)
1696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!object || object->isTextField());
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<RenderTextControlSingleLine*>(object);
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This will catch anyone doing an unnecessary cast.
1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid toRenderTextControlSingleLine(const RenderTextControlSingleLine*);
1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// ----------------------------
17881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
17981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass RenderTextControlInnerBlock : public RenderBlock {
18081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochpublic:
18181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RenderTextControlInnerBlock(Node* node, bool isMultiLine) : RenderBlock(node), m_multiLine(isMultiLine) { }
18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
18381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprivate:
18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual bool hasLineIfEmpty() const { return true; }
18581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual VisiblePosition positionForPoint(const IntPoint&);
18681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
18781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool m_multiLine;
18881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
193