d029a6ab455eef2c20bbad3a98044f24cff5c3db
[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 "FloatPoint.h"
23 #include "TextChecking.h"
24
25 #include <BlackBerryPlatformInputEvents.h>
26 #include <BlackBerryPlatformMisc.h>
27 #include <BlackBerryPlatformSettings.h>
28
29 #include <imf/events.h>
30 #include <imf/input_data.h>
31 #include <map>
32 #include <pthread.h>
33 #include <wtf/RefPtr.h>
34
35 namespace WTF {
36 class String;
37 }
38
39 namespace WebCore {
40 class AttributeTextStyle;
41 class Element;
42 class Frame;
43 class HTMLInputElement;
44 class HTMLSelectElement;
45 class IntRect;
46 class Node;
47 class Range;
48 class SpellChecker;
49 class SpellCheckRequest;
50 class TextCheckingRequest;
51 class VisiblePosition;
52 class VisibleSelection;
53 class SuggestionBoxHandler;
54 }
55
56 namespace BlackBerry {
57
58 namespace Platform {
59 class IntPoint;
60 class KeyboardEvent;
61 }
62
63 namespace WebKit {
64
65 class SpellingHandler;
66 class WebPagePrivate;
67
68 class InputHandler {
69 public:
70     InputHandler(WebPagePrivate*);
71     ~InputHandler();
72
73     enum FocusElementType { TextEdit, TextPopup /* Date/Time & Color */, SelectPopup, Plugin };
74     enum CaretScrollType { CenterAlways = BlackBerry::Platform::Settings::ScrollAdjustmentCenterAlways,
75                            CenterIfNeeded = BlackBerry::Platform::Settings::ScrollAdjustmentCenterIfNeeded,
76                            EdgeIfNeeded = BlackBerry::Platform::Settings::ScrollAdjustmentEdgeIfNeeded };
77
78     bool isInputModeEnabled() const;
79     void setInputModeEnabled(bool active = true);
80
81     void focusedNodeChanged();
82     void nodeTextChanged(const WebCore::Node*);
83     void selectionChanged();
84     void frameUnloaded(const WebCore::Frame*);
85
86     bool handleKeyboardInput(const BlackBerry::Platform::KeyboardEvent&, bool changeIsPartOfComposition = false);
87
88     bool deleteSelection();
89     void insertText(const WTF::String&);
90     void clearField();
91
92     void cut();
93     void copy();
94     void paste();
95     void selectAll();
96
97     void cancelSelection();
98
99     void setInputValue(const WTF::String&);
100
101     void focusNextField();
102     void focusPreviousField();
103     void submitForm();
104
105     void setDelayKeyboardVisibilityChange(bool value);
106     void processPendingKeyboardVisibilityChange();
107
108     void notifyClientOfKeyboardVisibilityChange(bool visible, bool triggeredByFocusChange = false);
109
110     bool isInputMode() const { return isActiveTextEdit(); }
111     bool isMultilineInputMode() const { return isActiveTextEdit() && elementType(m_currentFocusElement.get()) == BlackBerry::Platform::InputTypeTextArea; }
112     PassRefPtr<WebCore::Element> currentFocusElement() const { return m_currentFocusElement; }
113
114     void ensureFocusElementVisible(bool centerFieldInDisplay = true);
115
116     // PopupMenu methods.
117     bool willOpenPopupForNode(WebCore::Node*);
118     bool didNodeOpenPopup(WebCore::Node*);
119     bool openLineInputPopup(WebCore::HTMLInputElement*);
120     bool openSelectPopup(WebCore::HTMLSelectElement*);
121     void setPopupListIndex(int);
122     void setPopupListIndexes(int size, const bool* selecteds);
123
124     bool processingChange() const { return m_processingChange; }
125     void setProcessingChange(bool);
126
127     WTF::String elementText();
128
129     WebCore::IntRect boundingBoxForInputField();
130
131     bool isCaretAtEndOfText();
132
133     // IMF driven calls.
134     bool setBatchEditingActive(bool);
135     bool setSelection(int start, int end, bool changeIsPartOfComposition = false);
136     int caretPosition() const;
137     bool deleteTextRelativeToCursor(int leftOffset, int rightOffset);
138
139     spannable_string_t* selectedText(int32_t flags);
140     spannable_string_t* textBeforeCursor(int32_t length, int32_t flags);
141     spannable_string_t* textAfterCursor(int32_t length, int32_t flags);
142     extracted_text_t* extractedTextRequest(extracted_text_request_t*, int32_t flags);
143
144     int32_t setComposingRegion(int32_t start, int32_t end);
145     int32_t finishComposition();
146     int32_t setComposingText(spannable_string_t*, int32_t relativeCursorPosition);
147     int32_t commitText(spannable_string_t*, int32_t relativeCursorPosition);
148
149     void requestCheckingOfString(PassRefPtr<WebCore::TextCheckingRequest>);
150     void spellCheckingRequestProcessed(int32_t transactionId, spannable_string_t*);
151     void spellCheckingRequestCancelled(int32_t transactionId);
152     void stopPendingSpellCheckRequests();
153
154     bool shouldRequestSpellCheckingOptionsForPoint(const Platform::IntPoint& documentContentPosition, const WebCore::Element*, imf_sp_text_t&);
155     void requestSpellingCheckingOptions(imf_sp_text_t&, WebCore::IntSize& screenOffset, const bool shouldMoveDialog = false);
156     void clearDidSpellCheckState() { m_didSpellCheckWord = false; }
157     void redrawSpellCheckDialogIfRequired(const bool shouldMoveDialog = true);
158
159     void callRequestCheckingFor(PassRefPtr<WebCore::SpellCheckRequest>);
160     void setSystemSpellCheckStatus(bool enabled) { m_spellCheckStatusConfirmed = true; m_globalSpellCheckStatus = enabled; }
161
162     void elementTouched(WebCore::Element*);
163     void restoreViewState();
164
165 private:
166     enum PendingKeyboardStateChange { NoChange, Visible, NotVisible };
167
168     void setElementFocused(WebCore::Element*);
169     void setPluginFocused(WebCore::Element*);
170     void setElementUnfocused(bool refocusOccuring = false);
171
172     void ensureFocusTextElementVisible(CaretScrollType = CenterAlways);
173     void ensureFocusPluginElementVisible();
174
175     void clearCurrentFocusElement();
176
177     bool selectionAtStartOfElement();
178     bool selectionAtEndOfElement();
179
180     WebCore::IntRect rectForCaret(int index);
181
182     bool isActiveTextEdit() const { return m_currentFocusElement && m_currentFocusElementType == TextEdit; }
183     bool isActiveTextPopup() const { return m_currentFocusElement && m_currentFocusElementType == TextPopup; }
184     bool isActiveSelectPopup() const { return m_currentFocusElement && m_currentFocusElementType == SelectPopup; }
185     bool isActivePlugin() const { return m_currentFocusElement && m_currentFocusElementType == Plugin; }
186
187     bool openDatePopup(WebCore::HTMLInputElement*, BlackBerry::Platform::BlackBerryInputType);
188     bool openColorPopup(WebCore::HTMLInputElement*);
189
190     bool executeTextEditCommand(const WTF::String&);
191
192     BlackBerry::Platform::BlackBerryInputType elementType(WebCore::Element*) const;
193
194     int selectionStart() const;
195     int selectionEnd() const;
196     int selectionPosition(bool start) const;
197     bool selectionActive() const { return selectionStart() != selectionEnd(); }
198
199     bool compositionActive() const { return compositionLength(); }
200     unsigned compositionLength() const { return m_composingTextEnd - m_composingTextStart; }
201
202     spannable_string_t* spannableTextInRange(int start, int end, int32_t flags);
203
204     void addAttributedTextMarker(int start, int end, const WebCore::AttributeTextStyle&);
205     void removeAttributedTextMarker();
206
207     bool deleteText(int start, int end);
208     bool setTextAttributes(int insertionPoint, spannable_string_t*);
209     bool setText(spannable_string_t*);
210     bool setSpannableTextAndRelativeCursor(spannable_string_t*, int relativeCursorPosition, bool markTextAsComposing);
211     bool removeComposedText();
212     bool setRelativeCursorPosition(int insertionPoint, int relativeCursorPosition);
213     bool setCursorPosition(int location);
214
215     span_t* firstSpanInString(spannable_string_t*, SpannableStringAttribute);
216     bool isTrailingSingleCharacter(span_t*, unsigned, unsigned);
217
218     void learnText();
219     void sendLearnTextDetails(const WTF::String&);
220     WebCore::SpellChecker* getSpellChecker();
221     bool shouldSpellCheckElement(const WebCore::Element*) const;
222     bool didSpellCheckWord() const { return m_didSpellCheckWord; }
223
224     void updateFormState();
225
226     bool shouldNotifyWebView(const Platform::KeyboardEvent&);
227
228     void showTextInputTypeSuggestionBox(bool allowEmptyPrefix = false);
229     void hideTextInputTypeSuggestionBox();
230
231     bool isNavigationKey(unsigned character) const;
232
233     WebPagePrivate* m_webPage;
234
235     RefPtr<WebCore::Element> m_currentFocusElement;
236     RefPtr<WebCore::Element> m_previousFocusableTextElement;
237     RefPtr<WebCore::Element> m_nextFocusableTextElement;
238
239     bool m_hasSubmitButton;
240     bool m_inputModeEnabled;
241
242     bool m_processingChange;
243     bool m_shouldEnsureFocusTextElementVisibleOnSelectionChanged;
244
245     FocusElementType m_currentFocusElementType;
246     int64_t m_currentFocusElementTextEditMask;
247
248     int m_composingTextStart;
249     int m_composingTextEnd;
250
251     PendingKeyboardStateChange m_pendingKeyboardVisibilityChange;
252     bool m_delayKeyboardVisibilityChange;
253
254     RefPtr<WebCore::TextCheckingRequest> m_request;
255     int32_t m_processingTransactionId;
256
257     bool m_shouldNotifyWebView;
258     unsigned m_expectedKeyUpChar;
259
260     imf_sp_text_t m_spellCheckingOptionsRequest;
261     WebCore::IntSize m_screenOffset;
262     bool m_didSpellCheckWord;
263     SpellingHandler* m_spellingHandler;
264     bool m_spellCheckStatusConfirmed;
265     bool m_globalSpellCheckStatus;
266
267     OwnPtr<WebCore::SuggestionBoxHandler> m_suggestionDropdownBoxHandler;
268
269     DISABLE_COPY(InputHandler);
270 };
271
272 }
273 }
274
275 #endif // InputHandler_h