Merge branch 'devel/master' into tizen
[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) 2021 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/integration-api/events/key-event-integ.h>
23 #include <dali/public-api/actors/actor.h>
24 #include <dali/public-api/common/vector-wrapper.h>
25 #include <dali/public-api/object/base-object.h>
26 #include <functional>
27 #include <memory>
28
29 // INTERNAL INCLUDES
30 #include <dali/devel-api/adaptor-framework/input-method-context.h>
31
32 namespace Dali
33 {
34 class RenderSurface;
35
36 namespace Internal
37 {
38 namespace Adaptor
39 {
40 class InputMethodContext;
41 typedef IntrusivePtr<InputMethodContext> InputMethodContextPtr;
42 using ImfContext = void;
43
44 class InputMethodContext : public Dali::BaseObject
45 {
46 public:
47   using ActivatedSignalType       = Dali::InputMethodContext::ActivatedSignalType;
48   using KeyboardEventSignalType   = Dali::InputMethodContext::KeyboardEventSignalType;
49   using StatusSignalType          = Dali::InputMethodContext::StatusSignalType;
50   using VoidSignalType            = Dali::InputMethodContext::VoidSignalType;
51   using KeyboardTypeSignalType    = Dali::InputMethodContext::KeyboardTypeSignalType;
52   using LanguageChangedSignalType = Dali::InputMethodContext::LanguageChangedSignalType;
53   using KeyboardResizedSignalType = Dali::InputMethodContext::KeyboardResizedSignalType;
54   using ContentReceivedSignalType = Dali::InputMethodContext::ContentReceivedSignalType;
55
56 public:
57   /**
58    * Create a new input method context instance.
59    */
60   static InputMethodContextPtr New(Dali::Actor actor);
61
62   /**
63    * Initialize the object.
64    */
65   virtual void Initialize()
66   {
67   }
68
69   /**
70    * Connect Callbacks required for InputMethodContext.
71    * If you don't connect InputMethodContext callbacks, you can't get the key events.
72    * The events are PreeditChanged, Commit, DeleteSurrounding and PrivateCommand.
73    */
74   virtual void ConnectCallbacks()
75   {
76   }
77
78   /**
79    * Disconnect Callbacks attached to input method context.
80    */
81   virtual void DisconnectCallbacks()
82   {
83   }
84
85   /**
86    * @copydoc Dali::InputMethodContext::Finalize()
87    */
88   virtual void Finalize()
89   {
90   }
91
92   /**
93    * @copydoc Dali::InputMethodContext::Activate()
94    */
95   virtual void Activate()
96   {
97   }
98
99   /**
100    * @copydoc Dali::InputMethodContext::Deactivate()
101    */
102   virtual void Deactivate()
103   {
104   }
105
106   /**
107    * @copydoc Dali::InputMethodContext::Reset()
108    */
109   virtual void Reset()
110   {
111   }
112
113   /**
114    * @copydoc Dali::InputMethodContext::GetContext()
115    */
116   virtual ImfContext* GetContext()
117   {
118     return nullptr;
119   }
120
121   /**
122    * @copydoc Dali::InputMethodContext::RestoreAfterFocusLost()
123    */
124   virtual bool RestoreAfterFocusLost() const
125   {
126     return false;
127   }
128
129   /**
130    * @copydoc Dali::InputMethodContext::SetRestoreAfterFocusLost()
131    */
132   virtual void SetRestoreAfterFocusLost(bool toggle)
133   {
134   }
135
136   /**
137    * @copydoc Dali::InputMethodContext::PreEditChanged()
138    */
139   virtual void PreEditChanged(void* data, ImfContext* imfContext, void* eventInfo)
140   {
141   }
142
143   /**
144    * @copydoc Dali::InputMethodContext::CommitReceived()
145    */
146   virtual void CommitReceived(void* data, ImfContext* imfContext, void* eventInfo)
147   {
148   }
149
150   /**
151    * @copydoc Dali::InputMethodContext::RetrieveSurrounding()
152    */
153   /*Eina_Bool*/
154   virtual bool RetrieveSurrounding(void* data, ImfContext* imfContext, char** text, int* cursorPosition)
155   {
156     return false;
157   }
158
159   /**
160    * @copydoc Dali::InputMethodContext::DeleteSurrounding()
161    */
162   virtual void DeleteSurrounding(void* data, ImfContext* imfContext, void* eventInfo)
163   {
164   }
165
166   /**
167    * @copydoc Dali::InputMethodContext::SendPrivateCommand()
168    */
169   virtual void SendPrivateCommand(void* data, ImfContext* imfContext, void* eventInfo)
170   {
171   }
172
173   /**
174    * @copydoc Dali::InputMethodContext::SendCommitContent()
175    */
176   virtual void SendCommitContent(void* data, ImfContext* imfContext, void* eventInfo)
177   {
178   }
179
180   // Cursor related
181   /**
182    * @copydoc Dali::InputMethodContext::NotifyCursorPosition()
183    */
184   virtual void NotifyCursorPosition()
185   {
186   }
187
188   /**
189    * @copydoc Dali::InputMethodContext::SetCursorPosition()
190    */
191   virtual void SetCursorPosition(unsigned int cursorPosition)
192   {
193   }
194
195   /**
196    * @copydoc Dali::InputMethodContext::GetCursorPosition()
197    */
198   virtual unsigned int GetCursorPosition() const
199   {
200     return 0;
201   }
202
203   /**
204    * @copydoc Dali::InputMethodContext::SetSurroundingText()
205    */
206   virtual void SetSurroundingText(const std::string& text)
207   {
208   }
209
210   /**
211    * @copydoc Dali::InputMethodContext::GetSurroundingText()
212    */
213   virtual const std::string& GetSurroundingText() const;
214
215   /**
216   * @copydoc Dali::InputMethodContext::NotifyTextInputMultiLine()
217   */
218   virtual void NotifyTextInputMultiLine(bool multiLine)
219   {
220   }
221
222   /**
223   * @copydoc Dali::InputMethodContext::GetTextDirection()
224   */
225   virtual Dali::InputMethodContext::TextDirection GetTextDirection()
226   {
227     return Dali::InputMethodContext::TextDirection();
228   }
229
230   /**
231   * @copydoc Dali::InputMethodContext::GetInputMethodArea()
232   */
233   virtual Dali::Rect<int> GetInputMethodArea()
234   {
235     return Dali::Rect<int>();
236   }
237
238   /**
239   * @copydoc Dali::InputMethodContext::ApplyOptions()
240   */
241   virtual void ApplyOptions(const InputMethodOptions& options)
242   {
243   }
244
245   /**
246    * @copydoc Dali::InputMethodContext::SetInputPanelData()
247    */
248   virtual void SetInputPanelData(const std::string& data)
249   {
250   }
251
252   /**
253    * @copydoc Dali::InputMethodContext::GetInputPanelData()
254    */
255   virtual void GetInputPanelData(std::string& data)
256   {
257   }
258
259   /**
260    * @copydoc Dali::InputMethodContext::GetInputPanelState()
261    */
262   virtual Dali::InputMethodContext::State GetInputPanelState()
263   {
264     return Dali::InputMethodContext::State();
265   }
266
267   /**
268    * @copydoc Dali::InputMethodContext::SetReturnKeyState()
269    */
270   virtual void SetReturnKeyState(bool visible)
271   {
272   }
273
274   /**
275    * @copydoc Dali::InputMethodContext::AutoEnableInputPanel()
276    */
277   virtual void AutoEnableInputPanel(bool enabled)
278   {
279   }
280
281   /**
282    * @copydoc Dali::InputMethodContext::ShowInputPanel()
283    */
284   virtual void ShowInputPanel()
285   {
286   }
287
288   /**
289    * @copydoc Dali::InputMethodContext::HideInputPanel()
290    */
291   virtual void HideInputPanel()
292   {
293   }
294
295   /**
296    * @copydoc Dali::InputMethodContext::GetKeyboardType()
297    */
298   virtual Dali::InputMethodContext::KeyboardType GetKeyboardType()
299   {
300     return Dali::InputMethodContext::KeyboardType();
301   }
302
303   /**
304    * @copydoc Dali::InputMethodContext::GetInputPanelLocale()
305    */
306   virtual std::string GetInputPanelLocale()
307   {
308     return std::string();
309   }
310
311   /**
312    * @copydoc Dali::InputMethodContext::SetContentMIMETypes()
313    */
314   virtual void SetContentMIMETypes(const std::string& mimeTypes)
315   {
316   }
317
318   /**
319    * @copydoc Dali::InputMethodContext::FilterEventKey()
320    */
321   virtual bool FilterEventKey(const Dali::KeyEvent& keyEvent)
322   {
323     return false;
324   }
325
326   /**
327    * @copydoc Dali::InputMethodContext::AllowTextPrediction()
328    */
329   virtual void AllowTextPrediction(bool prediction)
330   {
331   }
332
333   /**
334    * @copydoc Dali::InputMethodContext::IsTextPredictionAllowed()
335    */
336   virtual bool IsTextPredictionAllowed() const
337   {
338     return false;
339   }
340
341   /**
342    * @copydoc Dali::InputMethodContext::SetInputPanelLanguage()
343    */
344   virtual void SetInputPanelLanguage(Dali::InputMethodContext::InputPanelLanguage language)
345   {
346   }
347
348   /**
349    * @copydoc Dali::InputMethodContext::GetInputPanelLanguage()
350    */
351   virtual Dali::InputMethodContext::InputPanelLanguage GetInputPanelLanguage() const
352   {
353     return Dali::InputMethodContext::InputPanelLanguage();
354   }
355
356   /**
357    * @copydoc Dali::InputMethodContext::SetInputPanelPosition()
358    */
359   virtual void SetInputPanelPosition(unsigned int x, unsigned int y)
360   {
361   }
362
363   /**
364    * @copydoc Dali::InputMethodContext::GetPreeditStyle()
365    */
366   virtual void GetPreeditStyle(Dali::InputMethodContext::PreEditAttributeDataContainer& attrs) const
367   {
368   }
369
370 public: // Signals
371   /**
372    * @copydoc Dali::InputMethodContext::ActivatedSignal()
373    */
374   ActivatedSignalType& ActivatedSignal()
375   {
376     return mActivatedSignal;
377   }
378
379   /**
380    * @copydoc Dali::InputMethodContext::EventReceivedSignal()
381    */
382   KeyboardEventSignalType& EventReceivedSignal()
383   {
384     return mEventSignal;
385   }
386
387   /**
388    * @copydoc Dali::InputMethodContext::StatusChangedSignal()
389    */
390   StatusSignalType& StatusChangedSignal()
391   {
392     return mKeyboardStatusSignal;
393   }
394
395   /**
396    * @copydoc Dali::InputMethodContext::ResizedSignal()
397    */
398   KeyboardResizedSignalType& ResizedSignal()
399   {
400     return mKeyboardResizeSignal;
401   }
402
403   /**
404    * @copydoc Dali::InputMethodContext::LanguageChangedSignal()
405    */
406   LanguageChangedSignalType& LanguageChangedSignal()
407   {
408     return mKeyboardLanguageChangedSignal;
409   }
410
411   /**
412    * @copydoc Dali::InputMethodContext::KeyboardTypeChangedSignal()
413    */
414   KeyboardTypeSignalType& KeyboardTypeChangedSignal()
415   {
416     return mKeyboardTypeChangedSignal;
417   }
418
419   /**
420    * @copydoc Dali::InputMethodContext::ContentReceivedSignal()
421    */
422   ContentReceivedSignalType& ContentReceivedSignal()
423   {
424     return mContentReceivedSignal;
425   }
426
427 public:
428   /**
429    * Constructor
430    */
431   InputMethodContext();
432
433   /**
434    * Destructor
435    */
436   ~InputMethodContext() override = default;
437
438 private:
439   InputMethodContext(const InputMethodContext&) = delete;
440   InputMethodContext& operator=(InputMethodContext&) = delete;
441
442 protected:
443   /**
444    * @brief Struct for providing Operation enumeration
445    */
446   struct Operation
447   {
448     enum Type
449     {
450       ALLOW_TEXT_PREDICTION = 0,
451       AUTO_ENABLE_INPUT_PANEL,
452       NOTIFY_TEXT_INPUT_MULTILINE,
453       SET_CONTENT_MIME_TYPES,
454       SET_INPUT_PANEL_DATA,
455       SET_INPUT_PANEL_LANGUAGE,
456       SET_INPUT_PANEL_POSITION,
457       SET_RETURN_KEY_STATE,
458       MAX_COUNT
459     };
460   };
461
462   using OperationList = std::vector<std::function<void()> >;
463
464   /**
465    * @brief Apply backup operations to the InputMethodContext
466    */
467   void ApplyBackupOperations();
468
469 protected:
470   ActivatedSignalType       mActivatedSignal;
471   KeyboardEventSignalType   mEventSignal;
472   StatusSignalType          mKeyboardStatusSignal;
473   KeyboardResizedSignalType mKeyboardResizeSignal;
474   LanguageChangedSignalType mKeyboardLanguageChangedSignal;
475   KeyboardTypeSignalType    mKeyboardTypeChangedSignal;
476   ContentReceivedSignalType mContentReceivedSignal;
477   OperationList             mBackupOperations;
478
479 public:
480   inline static Internal::Adaptor::InputMethodContext& GetImplementation(Dali::InputMethodContext& inputMethodContext)
481   {
482     DALI_ASSERT_ALWAYS(inputMethodContext && "InputMethodContext handle is empty");
483
484     BaseObject& handle = inputMethodContext.GetBaseObject();
485
486     return static_cast<Internal::Adaptor::InputMethodContext&>(handle);
487   }
488
489   inline static const Internal::Adaptor::InputMethodContext& GetImplementation(const Dali::InputMethodContext& inputMethodContext)
490   {
491     DALI_ASSERT_ALWAYS(inputMethodContext && "InputMethodContext handle is empty");
492
493     const BaseObject& handle = inputMethodContext.GetBaseObject();
494
495     return static_cast<const Internal::Adaptor::InputMethodContext&>(handle);
496   }
497 };
498
499 } // namespace Adaptor
500
501 } // namespace Internal
502
503 } // namespace Dali
504
505 #endif // DALI_INTERNAL_INPUT_COMMON_INPUT_METHOD_CONTEXT_IMPL_H