36726400d087ea54f4bc13fc35428e7891d959d4
[WebKit-https.git] / Source / WebKit / blackberry / WebKitSupport / InputHandler.h
1 /*
2  * Copyright (C) 2009, 2010, 2011, 2012 Research In Motion Limited. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser 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  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #ifndef InputHandler_h
20 #define InputHandler_h
21
22 #include <BlackBerryPlatformInputEvents.h>
23
24 #include <imf/events.h>
25 #include <imf/input_data.h>
26 #include <map>
27 #include <wtf/RefPtr.h>
28
29 namespace WTF {
30 class String;
31 }
32
33 namespace WebCore {
34 class AttributeTextStyle;
35 class Element;
36 class Frame;
37 class HTMLInputElement;
38 class HTMLSelectElement;
39 class IntRect;
40 class Node;
41 class SpellChecker;
42 class TextCheckingRequest;
43 }
44
45 namespace BlackBerry {
46
47 namespace Platform {
48 class IntPoint;
49 class KeyboardEvent;
50 }
51
52 namespace WebKit {
53
54 class WebPagePrivate;
55
56 class InputHandler {
57 public:
58     InputHandler(WebPagePrivate*);
59     ~InputHandler();
60
61     enum FocusElementType { TextEdit, TextPopup /* Date/Time & Color */, SelectPopup, Plugin };
62     enum CaretScrollType { CenterAlways, CenterIfNeeded, EdgeIfNeeded };
63
64     bool isInputModeEnabled() const;
65     void setInputModeEnabled(bool active = true);
66
67     void focusedNodeChanged();
68     void nodeTextChanged(const WebCore::Node*);
69     void selectionChanged();
70     void frameUnloaded(const WebCore::Frame*);
71
72     bool handleKeyboardInput(const BlackBerry::Platform::KeyboardEvent&, bool changeIsPartOfComposition = false);
73
74     bool deleteSelection();
75     void insertText(const WTF::String&);
76     void clearField();
77
78     void cut();
79     void copy();
80     void paste();
81     void selectAll();
82
83     void cancelSelection();
84
85     void setInputValue(const WTF::String&);
86
87     void setDelayKeyboardVisibilityChange(bool value);
88     void processPendingKeyboardVisibilityChange();
89
90     void notifyClientOfKeyboardVisibilityChange(bool visible);
91
92     bool isInputMode() const { return isActiveTextEdit(); }
93     bool isMultilineInputMode() const { return isActiveTextEdit() && elementType(m_currentFocusElement.get()) == BlackBerry::Platform::InputTypeTextArea; }
94
95     void ensureFocusElementVisible(bool centerFieldInDisplay = true);
96     void handleInputLocaleChanged(bool isRTL);
97
98     // PopupMenu methods.
99     bool willOpenPopupForNode(WebCore::Node*);
100     bool didNodeOpenPopup(WebCore::Node*);
101     bool openLineInputPopup(WebCore::HTMLInputElement*);
102     bool openSelectPopup(WebCore::HTMLSelectElement*);
103     void setPopupListIndex(int);
104     void setPopupListIndexes(int size, const bool* selecteds);
105
106     bool processingChange() const { return m_processingChange; }
107     void setProcessingChange(bool processingChange) { m_processingChange = processingChange; }
108
109     WTF::String elementText();
110
111     WebCore::IntRect boundingBoxForInputField();
112
113     // IMF driven calls.
114     bool setBatchEditingActive(bool);
115     bool setSelection(int start, int end, bool changeIsPartOfComposition = false);
116     int caretPosition() const;
117     bool deleteTextRelativeToCursor(int leftOffset, int rightOffset);
118
119     spannable_string_t* selectedText(int32_t flags);
120     spannable_string_t* textBeforeCursor(int32_t length, int32_t flags);
121     spannable_string_t* textAfterCursor(int32_t length, int32_t flags);
122     extracted_text_t* extractedTextRequest(extracted_text_request_t*, int32_t flags);
123
124     int32_t setComposingRegion(int32_t start, int32_t end);
125     int32_t finishComposition();
126     int32_t setComposingText(spannable_string_t*, int32_t relativeCursorPosition);
127     int32_t commitText(spannable_string_t*, int32_t relativeCursorPosition);
128
129     void requestCheckingOfString(WTF::PassRefPtr<WebCore::TextCheckingRequest>);
130     void spellCheckingRequestProcessed(int32_t transactionId, spannable_string_t*);
131     void spellCheckingRequestCancelled(int32_t id, bool isSequenceId = false);
132
133     bool shouldRequestSpellCheckingOptionsForPoint(Platform::IntPoint&, const WebCore::Element*, imf_sp_text_t&);
134     void requestSpellingCheckingOptions(imf_sp_text_t&);
135
136 private:
137     enum PendingKeyboardStateChange { NoChange, Visible, NotVisible };
138
139     void setElementFocused(WebCore::Element*);
140     void setPluginFocused(WebCore::Element*);
141     void setElementUnfocused(bool refocusOccuring = false);
142
143     void ensureFocusTextElementVisible(CaretScrollType = CenterAlways);
144     void ensureFocusPluginElementVisible();
145
146     void clearCurrentFocusElement();
147
148     bool selectionAtStartOfElement();
149     bool selectionAtEndOfElement();
150
151     WebCore::IntRect rectForCaret(int index);
152
153     bool isActiveTextEdit() const { return m_currentFocusElement && m_currentFocusElementType == TextEdit; }
154     bool isActiveTextPopup() const { return m_currentFocusElement && m_currentFocusElementType == TextPopup; }
155     bool isActiveSelectPopup() const { return m_currentFocusElement && m_currentFocusElementType == SelectPopup; }
156     bool isActivePlugin() const { return m_currentFocusElement && m_currentFocusElementType == Plugin; }
157
158     bool openDatePopup(WebCore::HTMLInputElement*, BlackBerry::Platform::BlackBerryInputType);
159     bool openColorPopup(WebCore::HTMLInputElement*);
160
161     bool executeTextEditCommand(const WTF::String&);
162
163     BlackBerry::Platform::BlackBerryInputType elementType(WebCore::Element*) const;
164
165     int selectionStart() const;
166     int selectionEnd() const;
167     int selectionPosition(bool start) const;
168     bool selectionActive() const { return selectionStart() != selectionEnd(); }
169
170     bool compositionActive() const { return compositionLength(); }
171     unsigned compositionLength() const { return m_composingTextEnd - m_composingTextStart; }
172
173     spannable_string_t* spannableTextInRange(int start, int end, int32_t flags);
174
175     void addAttributedTextMarker(int start, int end, const WebCore::AttributeTextStyle&);
176     void removeAttributedTextMarker();
177
178     bool deleteText(int start, int end);
179     bool setTextAttributes(int insertionPoint, spannable_string_t*);
180     bool setText(spannable_string_t*);
181     bool setSpannableTextAndRelativeCursor(spannable_string_t*, int relativeCursorPosition, bool markTextAsComposing);
182     bool removeComposedText();
183     bool setRelativeCursorPosition(int insertionPoint, int relativeCursorPosition);
184     bool setCursorPosition(int location);
185
186     span_t* firstSpanInString(spannable_string_t*, SpannableStringAttribute);
187     bool isTrailingSingleCharacter(span_t*, unsigned, unsigned);
188
189     void learnText();
190     void sendLearnTextDetails(const WTF::String&);
191     int32_t convertTransactionIdToSequenceId(int32_t transactionId);
192     WebCore::SpellChecker* getSpellChecker();
193
194     WebPagePrivate* m_webPage;
195
196     RefPtr<WebCore::Element> m_currentFocusElement;
197     bool m_inputModeEnabled;
198
199     bool m_processingChange;
200     bool m_changingFocus;
201
202     FocusElementType m_currentFocusElementType;
203     int m_currentFocusElementTextEditMask;
204
205     int m_composingTextStart;
206     int m_composingTextEnd;
207
208     PendingKeyboardStateChange m_pendingKeyboardVisibilityChange;
209     bool m_delayKeyboardVisibilityChange;
210
211     std::map<int32_t, int32_t> m_sequenceMap;
212 };
213
214 }
215 }
216
217 #endif // InputHandler_h