Add AllowTextPrediction/IsTextPredictionAllowed api
[platform/core/uifw/dali-adaptor.git] / dali / internal / input / common / input-method-context-impl.h
1 #ifndef DALI_INTERNAL_INPUT_COMMON_INPUT_METHOD_CONTEXT_IMPL_H
2 #define DALI_INTERNAL_INPUT_COMMON_INPUT_METHOD_CONTEXT_IMPL_H
3
4 /*
5  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/common/vector-wrapper.h>
23 #include <dali/public-api/object/base-object.h>
24 #include <dali/integration-api/events/key-event-integ.h>
25
26 // INTERNAL INCLUDES
27 #include <dali/devel-api/adaptor-framework/input-method-context.h>
28
29 #include <memory>
30
31 namespace Dali
32 {
33
34 class RenderSurface;
35
36 namespace Internal
37 {
38
39 namespace Adaptor
40 {
41 class InputMethodContext;
42 typedef IntrusivePtr< InputMethodContext > InputMethodContextPtr;
43 using ImfContext = void;
44
45 class InputMethodContext : public Dali::BaseObject
46 {
47
48 public:
49
50   using ActivatedSignalType = Dali::InputMethodContext::ActivatedSignalType;
51   using KeyboardEventSignalType = Dali::InputMethodContext::KeyboardEventSignalType;
52   using StatusSignalType = Dali::InputMethodContext::StatusSignalType;
53   using VoidSignalType = Dali::InputMethodContext::VoidSignalType;
54   using KeyboardTypeSignalType = Dali::InputMethodContext::KeyboardTypeSignalType;
55   using LanguageChangedSignalType = Dali::InputMethodContext::LanguageChangedSignalType;
56   using KeyboardResizedSignalType = Dali::InputMethodContext::KeyboardResizedSignalType;
57
58 public:
59
60   /**
61    * Create a new input method context instance.
62    */
63   static InputMethodContextPtr New();
64
65   /**
66    * Initialize the object.
67    */
68   virtual void Initialize() {}
69
70   /**
71    * Connect Callbacks required for InputMethodContext.
72    * If you don't connect InputMethodContext callbacks, you can't get the key events.
73    * The events are PreeditChanged, Commit, DeleteSurrounding and PrivateCommand.
74    */
75   virtual void ConnectCallbacks() {}
76
77   /**
78    * Disconnect Callbacks attached to input method context.
79    */
80   virtual void DisconnectCallbacks() {}
81
82   /**
83    * @copydoc Dali::InputMethodContext::Finalize()
84    */
85   virtual void Finalize() {}
86
87   /**
88    * @copydoc Dali::InputMethodContext::Activate()
89    */
90   virtual void Activate() {}
91
92   /**
93    * @copydoc Dali::InputMethodContext::Deactivate()
94    */
95   virtual void Deactivate() {}
96
97   /**
98    * @copydoc Dali::InputMethodContext::Reset()
99    */
100   virtual void Reset() {}
101
102   /**
103    * @copydoc Dali::InputMethodContext::GetContext()
104    */
105   virtual ImfContext* GetContext() { return nullptr; }
106
107   /**
108    * @copydoc Dali::InputMethodContext::RestoreAfterFocusLost()
109    */
110   virtual bool RestoreAfterFocusLost() const { return false; }
111
112   /**
113    * @copydoc Dali::InputMethodContext::SetRestoreAfterFocusLost()
114    */
115   virtual void SetRestoreAfterFocusLost( bool toggle ) {}
116
117   /**
118    * @copydoc Dali::InputMethodContext::PreEditChanged()
119    */
120   virtual void PreEditChanged( void *data, ImfContext* imfContext, void *event_info ) {}
121
122   /**
123    * @copydoc Dali::InputMethodContext::CommitReceived()
124    */
125   virtual void CommitReceived( void *data, ImfContext* imfContext, void *event_info ) {}
126
127   /**
128    * @copydoc Dali::InputMethodContext::RetrieveSurrounding()
129    */
130   /*Eina_Bool*/
131   virtual bool RetrieveSurrounding( void *data, ImfContext* imfContext, char** text, int* cursorPosition ) { return false; }
132
133   /**
134    * @copydoc Dali::InputMethodContext::DeleteSurrounding()
135    */
136   virtual void DeleteSurrounding( void *data, ImfContext* imfContext, void *event_info ) {}
137
138   /**
139    * @copydoc Dali::InputMethodContext::SendPrivateCommand()
140    */
141   virtual void SendPrivateCommand( void* data, ImfContext* imfContext, void* event_info ) {}
142
143   // Cursor related
144   /**
145    * @copydoc Dali::InputMethodContext::NotifyCursorPosition()
146    */
147   virtual void NotifyCursorPosition() {}
148
149   /**
150    * @copydoc Dali::InputMethodContext::SetCursorPosition()
151    */
152   virtual void SetCursorPosition( unsigned int cursorPosition ) {}
153
154   /**
155    * @copydoc Dali::InputMethodContext::GetCursorPosition()
156    */
157   virtual unsigned int GetCursorPosition() const { return 0; }
158
159   /**
160    * @copydoc Dali::InputMethodContext::SetSurroundingText()
161    */
162   virtual void SetSurroundingText( const std::string& text ) {}
163
164   /**
165    * @copydoc Dali::InputMethodContext::GetSurroundingText()
166    */
167   virtual const std::string& GetSurroundingText() const;
168
169   /**
170   * @copydoc Dali::InputMethodContext::NotifyTextInputMultiLine()
171   */
172   virtual void NotifyTextInputMultiLine( bool multiLine ) {}
173
174   /**
175   * @copydoc Dali::InputMethodContext::GetTextDirection()
176   */
177   virtual Dali::InputMethodContext::TextDirection GetTextDirection() { return Dali::InputMethodContext::TextDirection(); }
178
179   /**
180   * @copydoc Dali::InputMethodContext::GetInputMethodArea()
181   */
182   virtual Dali::Rect<int> GetInputMethodArea() { return Dali::Rect<int>(); }
183
184   /**
185   * @copydoc Dali::InputMethodContext::ApplyOptions()
186   */
187   virtual void ApplyOptions( const InputMethodOptions& options ) {}
188
189   /**
190    * @copydoc Dali::InputMethodContext::SetInputPanelData()
191    */
192   virtual void SetInputPanelData( const std::string& data ) {}
193
194   /**
195    * @copydoc Dali::InputMethodContext::GetInputPanelData()
196    */
197   virtual void GetInputPanelData( std::string& data ) {}
198
199   /**
200    * @copydoc Dali::InputMethodContext::GetInputPanelState()
201    */
202   virtual Dali::InputMethodContext::State GetInputPanelState() { return Dali::InputMethodContext::State(); }
203
204   /**
205    * @copydoc Dali::InputMethodContext::SetReturnKeyState()
206    */
207   virtual void SetReturnKeyState( bool visible ) {}
208
209   /**
210    * @copydoc Dali::InputMethodContext::AutoEnableInputPanel()
211    */
212   virtual void AutoEnableInputPanel( bool enabled ) {}
213
214   /**
215    * @copydoc Dali::InputMethodContext::ShowInputPanel()
216    */
217   virtual void ShowInputPanel() {}
218
219   /**
220    * @copydoc Dali::InputMethodContext::HideInputPanel()
221    */
222   virtual void HideInputPanel() {}
223
224   /**
225    * @copydoc Dali::InputMethodContext::GetKeyboardType()
226    */
227   virtual Dali::InputMethodContext::KeyboardType GetKeyboardType() { return Dali::InputMethodContext::KeyboardType(); }
228
229   /**
230    * @copydoc Dali::InputMethodContext::GetInputPanelLocale()
231    */
232   virtual std::string GetInputPanelLocale() { return std::string(); }
233
234   /**
235    * @copydoc Dali::InputMethodContext::FilterEventKey()
236    */
237   virtual bool FilterEventKey( const Dali::KeyEvent& keyEvent ) { return false; }
238
239   /**
240    * @copydoc Dali::InputMethodContext::AllowTextPrediction()
241    */
242   virtual void AllowTextPrediction( bool prediction ) {}
243
244   /**
245    * @copydoc Dali::InputMethodContext::IsTextPredictionAllowed()
246    */
247   virtual bool IsTextPredictionAllowed() const { return false; }
248 public:  // Signals
249
250   /**
251    * @copydoc Dali::InputMethodContext::ActivatedSignal()
252    */
253   ActivatedSignalType& ActivatedSignal() { return mActivatedSignal; }
254
255   /**
256    * @copydoc Dali::InputMethodContext::EventReceivedSignal()
257    */
258   KeyboardEventSignalType& EventReceivedSignal() { return mEventSignal; }
259
260   /**
261    * @copydoc Dali::InputMethodContext::StatusChangedSignal()
262    */
263   StatusSignalType& StatusChangedSignal() { return mKeyboardStatusSignal; }
264
265   /**
266    * @copydoc Dali::InputMethodContext::ResizedSignal()
267    */
268   KeyboardResizedSignalType& ResizedSignal()  { return mKeyboardResizeSignal; }
269
270   /**
271    * @copydoc Dali::InputMethodContext::LanguageChangedSignal()
272    */
273   LanguageChangedSignalType& LanguageChangedSignal() { return mKeyboardLanguageChangedSignal; }
274
275   /**
276    * @copydoc Dali::InputMethodContext::KeyboardTypeChangedSignal()
277    */
278   KeyboardTypeSignalType& KeyboardTypeChangedSignal() { return mKeyboardTypeChangedSignal; }
279
280 public:
281
282   /**
283    * Constructor
284    */
285   InputMethodContext() = default;
286
287   /**
288    * Destructor
289    */
290   ~InputMethodContext() override = default;
291
292 private:
293
294   InputMethodContext( const InputMethodContext& ) = delete;
295   InputMethodContext& operator=( InputMethodContext& )  = delete;
296
297 protected:
298
299   ActivatedSignalType        mActivatedSignal;
300   KeyboardEventSignalType    mEventSignal;
301   StatusSignalType           mKeyboardStatusSignal;
302   KeyboardResizedSignalType  mKeyboardResizeSignal;
303   LanguageChangedSignalType  mKeyboardLanguageChangedSignal;
304   KeyboardTypeSignalType     mKeyboardTypeChangedSignal;
305
306 public:
307
308   inline static Internal::Adaptor::InputMethodContext& GetImplementation(Dali::InputMethodContext& inputMethodContext)
309   {
310     DALI_ASSERT_ALWAYS( inputMethodContext && "InputMethodContext handle is empty" );
311
312     BaseObject& handle = inputMethodContext.GetBaseObject();
313
314     return static_cast<Internal::Adaptor::InputMethodContext&>(handle);
315   }
316
317   inline static const Internal::Adaptor::InputMethodContext& GetImplementation(const Dali::InputMethodContext& inputMethodContext)
318   {
319     DALI_ASSERT_ALWAYS( inputMethodContext && "InputMethodContext handle is empty" );
320
321     const BaseObject& handle = inputMethodContext.GetBaseObject();
322
323     return static_cast<const Internal::Adaptor::InputMethodContext&>(handle);
324   }
325
326 };
327
328
329 } // namespace Adaptor
330
331 } // namespace Internal
332
333 } // namespace Dali
334
335 #endif // __DALI_INTERNAL_INPUT_METHOD_CONTEXT_H