[BlackBerry] Queue spellcheck requests with char-count limitations
[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 "TextChecking.h"
23
24 #include <BlackBerryPlatformInputEvents.h>
25
26 #include <imf/events.h>
27 #include <imf/input_data.h>
28 #include <map>
29 #include <wtf/RefPtr.h>
30
31 namespace WTF {
32 class String;
33 }
34
35 namespace WebCore {
36 class AttributeTextStyle;
37 class Element;
38 class Frame;
39 class HTMLInputElement;
40 class HTMLSelectElement;
41 class IntRect;
42 class Node;
43 class Range;
44 class SpellChecker;
45 class TextCheckingRequest;
46 class VisiblePosition;
47 class VisibleSelection;
48 }
49
50 namespace BlackBerry {
51
52 namespace Platform {
53 class IntPoint;
54 class KeyboardEvent;
55 }
56
57 namespace WebKit {
58
59 class WebPagePrivate;
60
61 class InputHandler {
62 public:
63     InputHandler(WebPagePrivate*);
64     ~InputHandler();
65
66     enum FocusElementType { TextEdit, TextPopup /* Date/Time & Color */, SelectPopup, Plugin };
67     enum CaretScrollType { CenterAlways, CenterIfNeeded, EdgeIfNeeded };
68
69     bool isInputModeEnabled() const;
70     void setInputModeEnabled(bool active = true);
71
72     void focusedNodeChanged();
73     void nodeTextChanged(const WebCore::Node*);
74     void selectionChanged();
75     void frameUnloaded(const WebCore::Frame*);
76
77     bool handleKeyboardInput(const BlackBerry::Platform::KeyboardEvent&, bool changeIsPartOfComposition = false);
78
79     bool deleteSelection();
80     void insertText(const WTF::String&);
81     void clearField();
82
83     void cut();
84     void copy();
85     void paste();
86     void selectAll();
87
88     void cancelSelection();
89
90     void setInputValue(const WTF::String&);
91
92     void setDelayKeyboardVisibilityChange(bool value);
93     void processPendingKeyboardVisibilityChange();
94
95     void notifyClientOfKeyboardVisibilityChange(bool visible);
96
97     bool isInputMode() const { return isActiveTextEdit(); }
98     bool isMultilineInputMode() const { return isActiveTextEdit() && elementType(m_currentFocusElement.get()) == BlackBerry::Platform::InputTypeTextArea; }
99
100     void ensureFocusElementVisible(bool centerFieldInDisplay = true);
101     void handleInputLocaleChanged(bool isRTL);
102
103     // PopupMenu methods.
104     bool willOpenPopupForNode(WebCore::Node*);
105     bool didNodeOpenPopup(WebCore::Node*);
106     bool openLineInputPopup(WebCore::HTMLInputElement*);
107     bool openSelectPopup(WebCore::HTMLSelectElement*);
108     void setPopupListIndex(int);
109     void setPopupListIndexes(int size, const bool* selecteds);
110
111     bool processingChange() const { return m_processingChange; }
112     void setProcessingChange(bool processingChange) { m_processingChange = processingChange; }
113
114     WTF::String elementText();
115
116     WebCore::IntRect boundingBoxForInputField();
117
118     // IMF driven calls.
119     bool setBatchEditingActive(bool);
120     bool setSelection(int start, int end, bool changeIsPartOfComposition = false);
121     int caretPosition() const;
122     bool deleteTextRelativeToCursor(int leftOffset, int rightOffset);
123
124     spannable_string_t* selectedText(int32_t flags);
125     spannable_string_t* textBeforeCursor(int32_t length, int32_t flags);
126     spannable_string_t* textAfterCursor(int32_t length, int32_t flags);
127     extracted_text_t* extractedTextRequest(extracted_text_request_t*, int32_t flags);
128
129     int32_t setComposingRegion(int32_t start, int32_t end);
130     int32_t finishComposition();
131     int32_t setComposingText(spannable_string_t*, int32_t relativeCursorPosition);
132     int32_t commitText(spannable_string_t*, int32_t relativeCursorPosition);
133
134     void requestCheckingOfString(WTF::PassRefPtr<WebCore::TextCheckingRequest>);
135     void spellCheckingRequestProcessed(int32_t transactionId, spannable_string_t*);
136     void spellCheckingRequestCancelled(int32_t id, bool isSequenceId = false);
137
138     bool shouldRequestSpellCheckingOptionsForPoint(Platform::IntPoint&, const WebCore::Element*, imf_sp_text_t&);
139     void requestSpellingCheckingOptions(imf_sp_text_t&);
140
141 private:
142     enum PendingKeyboardStateChange { NoChange, Visible, NotVisible };
143
144     void setElementFocused(WebCore::Element*);
145     void setPluginFocused(WebCore::Element*);
146     void setElementUnfocused(bool refocusOccuring = false);
147
148     void ensureFocusTextElementVisible(CaretScrollType = CenterAlways);
149     void ensureFocusPluginElementVisible();
150
151     void clearCurrentFocusElement();
152
153     bool selectionAtStartOfElement();
154     bool selectionAtEndOfElement();
155
156     WebCore::IntRect rectForCaret(int index);
157
158     bool isActiveTextEdit() const { return m_currentFocusElement && m_currentFocusElementType == TextEdit; }
159     bool isActiveTextPopup() const { return m_currentFocusElement && m_currentFocusElementType == TextPopup; }
160     bool isActiveSelectPopup() const { return m_currentFocusElement && m_currentFocusElementType == SelectPopup; }
161     bool isActivePlugin() const { return m_currentFocusElement && m_currentFocusElementType == Plugin; }
162
163     bool openDatePopup(WebCore::HTMLInputElement*, BlackBerry::Platform::BlackBerryInputType);
164     bool openColorPopup(WebCore::HTMLInputElement*);
165
166     bool executeTextEditCommand(const WTF::String&);
167
168     BlackBerry::Platform::BlackBerryInputType elementType(WebCore::Element*) const;
169
170     int selectionStart() const;
171     int selectionEnd() const;
172     int selectionPosition(bool start) const;
173     bool selectionActive() const { return selectionStart() != selectionEnd(); }
174
175     bool compositionActive() const { return compositionLength(); }
176     unsigned compositionLength() const { return m_composingTextEnd - m_composingTextStart; }
177
178     spannable_string_t* spannableTextInRange(int start, int end, int32_t flags);
179
180     void addAttributedTextMarker(int start, int end, const WebCore::AttributeTextStyle&);
181     void removeAttributedTextMarker();
182
183     bool deleteText(int start, int end);
184     bool setTextAttributes(int insertionPoint, spannable_string_t*);
185     bool setText(spannable_string_t*);
186     bool setSpannableTextAndRelativeCursor(spannable_string_t*, int relativeCursorPosition, bool markTextAsComposing);
187     bool removeComposedText();
188     bool setRelativeCursorPosition(int insertionPoint, int relativeCursorPosition);
189     bool setCursorPosition(int location);
190
191     span_t* firstSpanInString(spannable_string_t*, SpannableStringAttribute);
192     bool isTrailingSingleCharacter(span_t*, unsigned, unsigned);
193
194     void learnText();
195     void sendLearnTextDetails(const WTF::String&);
196     int32_t convertTransactionIdToSequenceId(int32_t transactionId);
197     void spellCheckBlock(WebCore::VisibleSelection&, WebCore::TextCheckingProcessType);
198     PassRefPtr<WebCore::Range> getRangeForSpellCheckWithFineGranularity(WebCore::VisiblePosition startPosition, WebCore::VisiblePosition endPosition);
199     void cancelAllSpellCheckingRequests();
200     WebCore::SpellChecker* getSpellChecker();
201
202     WebPagePrivate* m_webPage;
203
204     RefPtr<WebCore::Element> m_currentFocusElement;
205     bool m_inputModeEnabled;
206
207     bool m_processingChange;
208     bool m_changingFocus;
209
210     FocusElementType m_currentFocusElementType;
211     int m_currentFocusElementTextEditMask;
212
213     int m_composingTextStart;
214     int m_composingTextEnd;
215
216     PendingKeyboardStateChange m_pendingKeyboardVisibilityChange;
217     bool m_delayKeyboardVisibilityChange;
218
219     std::map<int32_t, int32_t> m_sequenceMap;
220 };
221
222 }
223 }
224
225 #endif // InputHandler_h