Fix InputMethodContext to work well in multi-window env
[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 <dali/public-api/actors/actor.h>
23 #include <dali/public-api/common/vector-wrapper.h>
24 #include <dali/public-api/object/base-object.h>
25 #include <dali/integration-api/events/key-event-integ.h>
26
27 // INTERNAL INCLUDES
28 #include <dali/devel-api/adaptor-framework/input-method-context.h>
29
30 #include <memory>
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 public:  // Signals
272
273   /**
274    * @copydoc Dali::InputMethodContext::ActivatedSignal()
275    */
276   ActivatedSignalType& ActivatedSignal() { return mActivatedSignal; }
277
278   /**
279    * @copydoc Dali::InputMethodContext::EventReceivedSignal()
280    */
281   KeyboardEventSignalType& EventReceivedSignal() { return mEventSignal; }
282
283   /**
284    * @copydoc Dali::InputMethodContext::StatusChangedSignal()
285    */
286   StatusSignalType& StatusChangedSignal() { return mKeyboardStatusSignal; }
287
288   /**
289    * @copydoc Dali::InputMethodContext::ResizedSignal()
290    */
291   KeyboardResizedSignalType& ResizedSignal()  { return mKeyboardResizeSignal; }
292
293   /**
294    * @copydoc Dali::InputMethodContext::LanguageChangedSignal()
295    */
296   LanguageChangedSignalType& LanguageChangedSignal() { return mKeyboardLanguageChangedSignal; }
297
298   /**
299    * @copydoc Dali::InputMethodContext::KeyboardTypeChangedSignal()
300    */
301   KeyboardTypeSignalType& KeyboardTypeChangedSignal() { return mKeyboardTypeChangedSignal; }
302
303   /**
304    * @copydoc Dali::InputMethodContext::ContentReceivedSignal()
305    */
306   ContentReceivedSignalType& ContentReceivedSignal() { return mContentReceivedSignal; }
307
308 public:
309
310   /**
311    * Constructor
312    */
313   InputMethodContext() = default;
314
315   /**
316    * Destructor
317    */
318   ~InputMethodContext() override = default;
319
320 private:
321
322   InputMethodContext( const InputMethodContext& ) = delete;
323   InputMethodContext& operator=( InputMethodContext& )  = delete;
324
325 protected:
326
327   ActivatedSignalType        mActivatedSignal;
328   KeyboardEventSignalType    mEventSignal;
329   StatusSignalType           mKeyboardStatusSignal;
330   KeyboardResizedSignalType  mKeyboardResizeSignal;
331   LanguageChangedSignalType  mKeyboardLanguageChangedSignal;
332   KeyboardTypeSignalType     mKeyboardTypeChangedSignal;
333   ContentReceivedSignalType  mContentReceivedSignal;
334
335 public:
336
337   inline static Internal::Adaptor::InputMethodContext& GetImplementation(Dali::InputMethodContext& inputMethodContext)
338   {
339     DALI_ASSERT_ALWAYS( inputMethodContext && "InputMethodContext handle is empty" );
340
341     BaseObject& handle = inputMethodContext.GetBaseObject();
342
343     return static_cast<Internal::Adaptor::InputMethodContext&>(handle);
344   }
345
346   inline static const Internal::Adaptor::InputMethodContext& GetImplementation(const Dali::InputMethodContext& inputMethodContext)
347   {
348     DALI_ASSERT_ALWAYS( inputMethodContext && "InputMethodContext handle is empty" );
349
350     const BaseObject& handle = inputMethodContext.GetBaseObject();
351
352     return static_cast<const Internal::Adaptor::InputMethodContext&>(handle);
353   }
354
355 };
356
357
358 } // namespace Adaptor
359
360 } // namespace Internal
361
362 } // namespace Dali
363
364 #endif // DALI_INTERNAL_INPUT_COMMON_INPUT_METHOD_CONTEXT_IMPL_H