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