[dali_2.3.34] Merge branch 'devel/master'
[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) 2022 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   /**
181    * @copydoc Dali::InputMethodContext::SendSelectionSet()
182    */
183   virtual void SendSelectionSet(void* data, ImfContext* imfContext, void* eventInfo)
184   {
185   }
186
187   // Cursor related
188   /**
189    * @copydoc Dali::InputMethodContext::NotifyCursorPosition()
190    */
191   virtual void NotifyCursorPosition()
192   {
193   }
194
195   /**
196    * @copydoc Dali::InputMethodContext::SetCursorPosition()
197    */
198   virtual void SetCursorPosition(unsigned int cursorPosition)
199   {
200   }
201
202   /**
203    * @copydoc Dali::InputMethodContext::GetCursorPosition()
204    */
205   virtual unsigned int GetCursorPosition() const
206   {
207     return 0;
208   }
209
210   /**
211    * @copydoc Dali::InputMethodContext::SetSurroundingText()
212    */
213   virtual void SetSurroundingText(const std::string& text)
214   {
215   }
216
217   /**
218    * @copydoc Dali::InputMethodContext::GetSurroundingText()
219    */
220   virtual const std::string& GetSurroundingText() const;
221
222   /**
223   * @copydoc Dali::InputMethodContext::NotifyTextInputMultiLine()
224   */
225   virtual void NotifyTextInputMultiLine(bool multiLine)
226   {
227   }
228
229   /**
230   * @copydoc Dali::InputMethodContext::GetTextDirection()
231   */
232   virtual Dali::InputMethodContext::TextDirection GetTextDirection()
233   {
234     return Dali::InputMethodContext::TextDirection();
235   }
236
237   /**
238   * @copydoc Dali::InputMethodContext::GetInputMethodArea()
239   */
240   virtual Dali::Rect<int> GetInputMethodArea()
241   {
242     return Dali::Rect<int>();
243   }
244
245   /**
246   * @copydoc Dali::InputMethodContext::ApplyOptions()
247   */
248   virtual void ApplyOptions(const InputMethodOptions& options)
249   {
250   }
251
252   /**
253    * @copydoc Dali::InputMethodContext::SetInputPanelData()
254    */
255   virtual void SetInputPanelData(const std::string& data)
256   {
257   }
258
259   /**
260    * @copydoc Dali::InputMethodContext::GetInputPanelData()
261    */
262   virtual void GetInputPanelData(std::string& data)
263   {
264   }
265
266   /**
267    * @copydoc Dali::InputMethodContext::GetInputPanelState()
268    */
269   virtual Dali::InputMethodContext::State GetInputPanelState()
270   {
271     return Dali::InputMethodContext::State();
272   }
273
274   /**
275    * @copydoc Dali::InputMethodContext::SetReturnKeyState()
276    */
277   virtual void SetReturnKeyState(bool visible)
278   {
279   }
280
281   /**
282    * @copydoc Dali::InputMethodContext::AutoEnableInputPanel()
283    */
284   virtual void AutoEnableInputPanel(bool enabled)
285   {
286   }
287
288   /**
289    * @copydoc Dali::InputMethodContext::ShowInputPanel()
290    */
291   virtual void ShowInputPanel()
292   {
293   }
294
295   /**
296    * @copydoc Dali::InputMethodContext::HideInputPanel()
297    */
298   virtual void HideInputPanel()
299   {
300   }
301
302   /**
303    * @copydoc Dali::InputMethodContext::GetKeyboardType()
304    */
305   virtual Dali::InputMethodContext::KeyboardType GetKeyboardType()
306   {
307     return Dali::InputMethodContext::KeyboardType();
308   }
309
310   /**
311    * @copydoc Dali::InputMethodContext::GetInputPanelLocale()
312    */
313   virtual std::string GetInputPanelLocale()
314   {
315     return std::string();
316   }
317
318   /**
319    * @copydoc Dali::InputMethodContext::SetContentMIMETypes()
320    */
321   virtual void SetContentMIMETypes(const std::string& mimeTypes)
322   {
323   }
324
325   /**
326    * @copydoc Dali::InputMethodContext::FilterEventKey()
327    */
328   virtual bool FilterEventKey(const Dali::KeyEvent& keyEvent)
329   {
330     return false;
331   }
332
333   /**
334    * @copydoc Dali::InputMethodContext::AllowTextPrediction()
335    */
336   virtual void AllowTextPrediction(bool prediction)
337   {
338   }
339
340   /**
341    * @copydoc Dali::InputMethodContext::IsTextPredictionAllowed()
342    */
343   virtual bool IsTextPredictionAllowed() const
344   {
345     return false;
346   }
347
348   /**
349    * @copydoc Dali::InputMethodContext::SetInputPanelLanguage()
350    */
351   virtual void SetInputPanelLanguage(Dali::InputMethodContext::InputPanelLanguage language)
352   {
353   }
354
355   /**
356    * @copydoc Dali::InputMethodContext::GetInputPanelLanguage()
357    */
358   virtual Dali::InputMethodContext::InputPanelLanguage GetInputPanelLanguage() const
359   {
360     return Dali::InputMethodContext::InputPanelLanguage();
361   }
362
363   /**
364    * @copydoc Dali::InputMethodContext::SetInputPanelPosition()
365    */
366   virtual void SetInputPanelPosition(unsigned int x, unsigned int y)
367   {
368   }
369
370   /**
371    * @copydoc Dali::InputMethodContext::SetInputPanelPositionAlign()
372    */
373   virtual bool SetInputPanelPositionAlign(int x, int y, Dali::InputMethodContext::InputPanelAlign align)
374   {
375     return false;
376   }
377
378   /**
379    * @copydoc Dali::InputMethodContext::GetPreeditStyle()
380    */
381   virtual void GetPreeditStyle(Dali::InputMethodContext::PreEditAttributeDataContainer& attrs) const
382   {
383   }
384
385 public: // Signals
386   /**
387    * @copydoc Dali::InputMethodContext::ActivatedSignal()
388    */
389   ActivatedSignalType& ActivatedSignal()
390   {
391     return mActivatedSignal;
392   }
393
394   /**
395    * @copydoc Dali::InputMethodContext::EventReceivedSignal()
396    */
397   KeyboardEventSignalType& EventReceivedSignal()
398   {
399     return mEventSignal;
400   }
401
402   /**
403    * @copydoc Dali::InputMethodContext::StatusChangedSignal()
404    */
405   StatusSignalType& StatusChangedSignal()
406   {
407     return mKeyboardStatusSignal;
408   }
409
410   /**
411    * @copydoc Dali::InputMethodContext::ResizedSignal()
412    */
413   KeyboardResizedSignalType& ResizedSignal()
414   {
415     return mKeyboardResizeSignal;
416   }
417
418   /**
419    * @copydoc Dali::InputMethodContext::LanguageChangedSignal()
420    */
421   LanguageChangedSignalType& LanguageChangedSignal()
422   {
423     return mKeyboardLanguageChangedSignal;
424   }
425
426   /**
427    * @copydoc Dali::InputMethodContext::KeyboardTypeChangedSignal()
428    */
429   KeyboardTypeSignalType& KeyboardTypeChangedSignal()
430   {
431     return mKeyboardTypeChangedSignal;
432   }
433
434   /**
435    * @copydoc Dali::InputMethodContext::ContentReceivedSignal()
436    */
437   ContentReceivedSignalType& ContentReceivedSignal()
438   {
439     return mContentReceivedSignal;
440   }
441
442 public:
443   /**
444    * Constructor
445    */
446   InputMethodContext();
447
448   /**
449    * Destructor
450    */
451   ~InputMethodContext() override = default;
452
453 private:
454   InputMethodContext(const InputMethodContext&) = delete;
455   InputMethodContext& operator=(InputMethodContext&) = delete;
456
457 protected:
458   /**
459    * @brief Struct for providing Operation enumeration
460    */
461   struct Operation
462   {
463     enum Type
464     {
465       ALLOW_TEXT_PREDICTION = 0,
466       AUTO_ENABLE_INPUT_PANEL,
467       NOTIFY_TEXT_INPUT_MULTILINE,
468       SET_CONTENT_MIME_TYPES,
469       SET_INPUT_PANEL_DATA,
470       SET_INPUT_PANEL_LANGUAGE,
471       SET_INPUT_PANEL_POSITION,
472       SET_INPUT_PANEL_POSITION_ALIGN,
473       SET_RETURN_KEY_STATE,
474       MAX_COUNT
475     };
476   };
477
478   using OperationList = std::vector<std::function<void()> >;
479
480   /**
481    * @brief Apply backup operations to the InputMethodContext
482    */
483   void ApplyBackupOperations();
484
485 protected:
486   ActivatedSignalType       mActivatedSignal;
487   KeyboardEventSignalType   mEventSignal;
488   StatusSignalType          mKeyboardStatusSignal;
489   KeyboardResizedSignalType mKeyboardResizeSignal;
490   LanguageChangedSignalType mKeyboardLanguageChangedSignal;
491   KeyboardTypeSignalType    mKeyboardTypeChangedSignal;
492   ContentReceivedSignalType mContentReceivedSignal;
493   OperationList             mBackupOperations;
494
495 public:
496   inline static Internal::Adaptor::InputMethodContext& GetImplementation(Dali::InputMethodContext& inputMethodContext)
497   {
498     DALI_ASSERT_ALWAYS(inputMethodContext && "InputMethodContext handle is empty");
499
500     BaseObject& handle = inputMethodContext.GetBaseObject();
501
502     return static_cast<Internal::Adaptor::InputMethodContext&>(handle);
503   }
504
505   inline static const Internal::Adaptor::InputMethodContext& GetImplementation(const Dali::InputMethodContext& inputMethodContext)
506   {
507     DALI_ASSERT_ALWAYS(inputMethodContext && "InputMethodContext handle is empty");
508
509     const BaseObject& handle = inputMethodContext.GetBaseObject();
510
511     return static_cast<const Internal::Adaptor::InputMethodContext&>(handle);
512   }
513 };
514
515 } // namespace Adaptor
516
517 } // namespace Internal
518
519 } // namespace Dali
520
521 #endif // DALI_INTERNAL_INPUT_COMMON_INPUT_METHOD_CONTEXT_IMPL_H