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