summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderTextControl.h
blob: 74fdd26e09806bedc06c84d74616da4cb251b0dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/*
 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.s
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 */

#ifndef RenderTextControl_h
#define RenderTextControl_h

#include "PopupMenuClient.h"
#include "RenderBlock.h"
#include "Timer.h"

namespace WebCore {

class FontSelector;
class SearchFieldCancelButtonElement;
class SearchFieldResultsButtonElement;
class SearchPopupMenu;
class Selection;
class TextControlInnerElement;
class TextControlInnerTextElement;

class RenderTextControl : public RenderBlock, private PopupMenuClient {
public:
    RenderTextControl(Node*, bool multiLine);
    virtual ~RenderTextControl();

    virtual const char* renderName() const { return "RenderTextControl"; }

    virtual bool hasControlClip() const { return m_cancelButton; }
    virtual IntRect controlClipRect(int tx, int ty) const;
    virtual void calcHeight();
    virtual void calcPrefWidths();
    virtual void removeLeftoverAnonymousBlock(RenderBlock*) { }
    virtual void updateFromElement();
    virtual bool canHaveChildren() const { return false; }
    virtual int baselinePosition(bool firstLine, bool isRootLineBox) const;
    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);
    virtual void layout();
    virtual bool avoidsFloats() const { return true; }
    virtual void paint(PaintInfo&, int tx, int ty);
    
    virtual bool isEdited() const { return m_dirty; }
    virtual void setEdited(bool isEdited) { m_dirty = isEdited; }
    virtual bool isTextField() const { return !m_multiLine; }
    virtual bool isTextArea() const { return m_multiLine; }
    
    bool isUserEdited() const { return m_userEdited; }
    void setUserEdited(bool isUserEdited);

    int selectionStart();
    int selectionEnd();
    void setSelectionStart(int);
    void setSelectionEnd(int);
    void select();
    void setSelectionRange(int start, int end);
    Selection selection(int start, int end) const;

    void subtreeHasChanged();
    String text();
    String textWithHardLineBreaks();
    void forwardEvent(Event*);
    void selectionChanged(bool userTriggered);

    virtual bool canBeProgramaticallyScrolled(bool) const { return true; }
    virtual void autoscroll();

    // Subclassed to forward to our inner div.
    virtual int scrollLeft() const;
    virtual int scrollTop() const;
    virtual int scrollWidth() const;
    virtual int scrollHeight() const;
    virtual void setScrollLeft(int);
    virtual void setScrollTop(int);
    virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1.0f);
    virtual bool isScrollable() const;

    VisiblePosition visiblePositionForIndex(int index);
    int indexForVisiblePosition(const VisiblePosition&);

    void addSearchResult();

    bool popupIsVisible() const { return m_searchPopupIsVisible; }
    void showPopup();
    void hidePopup();

    void stopSearchEventTimer();
    
    bool placeholderIsVisible() const { return m_placeholderVisible; }
    void updatePlaceholderVisibility();

    virtual void capsLockStateMayHaveChanged();

protected:
    virtual void styleDidChange(RenderStyle::Diff, const RenderStyle* oldStyle);

private:
    // PopupMenuClient methods
    virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
    virtual String itemText(unsigned listIndex) const;
    virtual bool itemIsEnabled(unsigned listIndex) const;
    virtual PopupMenuStyle itemStyle(unsigned listIndex) const;
    virtual PopupMenuStyle menuStyle() const;
    virtual int clientInsetLeft() const;
    virtual int clientInsetRight() const;
    virtual int clientPaddingLeft() const;
    virtual int clientPaddingRight() const;
    virtual int listSize() const;
    virtual int selectedIndex() const;
    virtual bool itemIsSeparator(unsigned listIndex) const;
    virtual bool itemIsLabel(unsigned listIndex) const;
    virtual bool itemIsSelected(unsigned listIndex) const;
    virtual void setTextFromItem(unsigned listIndex);
    virtual bool shouldPopOver() const { return false; }
    virtual bool valueShouldChangeOnHotTrack() const { return false; }
    virtual FontSelector* fontSelector() const;
    virtual HostWindow* hostWindow() const;
    virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarClient*, ScrollbarOrientation, ScrollbarControlSize);

    PassRefPtr<RenderStyle> createInnerBlockStyle(const RenderStyle* startStyle);
    PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle);
    PassRefPtr<RenderStyle> createCancelButtonStyle(const RenderStyle* startStyle);
    PassRefPtr<RenderStyle> createResultsButtonStyle(const RenderStyle* startStyle);

    void createSubtreeIfNeeded();
    void updateCancelButtonVisibility(RenderStyle*);
    const AtomicString& autosaveName() const;
    void startSearchEventTimer();
    void searchEventTimerFired(Timer<RenderTextControl>*);
    String finishText(Vector<UChar>&) const;

    friend class TextIterator;
    HTMLElement* innerTextElement() const;

    RefPtr<TextControlInnerElement> m_innerBlock;
    RefPtr<TextControlInnerTextElement> m_innerText;
    RefPtr<SearchFieldResultsButtonElement> m_resultsButton;
    RefPtr<SearchFieldCancelButtonElement> m_cancelButton;

    bool m_dirty;
    bool m_multiLine;
    bool m_placeholderVisible;
    bool m_userEdited;
    bool m_shouldDrawCapsLockIndicator;
    
    RefPtr<SearchPopupMenu> m_searchPopup;
    bool m_searchPopupIsVisible;
    mutable Vector<String> m_recentSearches;

    Timer<RenderTextControl> m_searchEventTimer;
};

} // namespace WebCore

#endif // RenderTextControl_h