Merge "Fix build errors with GCC4.8." into tizen
[platform/core/uifw/dali-adaptor.git] / adaptors / common / virtual-keyboard-impl.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "virtual-keyboard-impl.h"
20
21 // EXTERNAL INCLUDES
22 #include <algorithm>
23
24 #include <dali/public-api/common/vector-wrapper.h>
25 #include <adaptor.h>
26 #include <dali/integration-api/debug.h>
27
28 // INTERNAL INCLUDES
29 #include <locale-utils.h>
30 #include <imf-manager-impl.h>
31
32
33 namespace Dali
34 {
35
36 namespace Internal
37 {
38
39 namespace Adaptor
40 {
41
42 namespace VirtualKeyboard
43 {
44
45 namespace
46 {
47 #if defined(DEBUG_ENABLED)
48 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Verbose, false, "LOG_VIRTUAL_KEYBOARD");
49 #endif
50
51 //forward declarations
52 void InputPanelGeometryChangedCallback ( void *data, Ecore_IMF_Context *context, int value );
53 void InputPanelLanguageChangeCallback( void* data, Ecore_IMF_Context* context, int value );
54
55 // Signals
56 Dali::VirtualKeyboard::StatusSignalV2 gKeyboardStatusSignalV2;
57 Dali::VirtualKeyboard::VoidSignalV2   gKeyboardResizeSignalV2;
58 Dali::VirtualKeyboard::VoidSignalV2   gKeyboardLanguageChangedSignalV2;
59
60 Dali::VirtualKeyboard::ReturnKeyType gReturnKeyType = Dali::VirtualKeyboard::DEFAULT;  // the currently used return key type.
61
62 void InputPanelStateChangeCallback( void* data, Ecore_IMF_Context* context, int value )
63 {
64   switch (value)
65   {
66     case ECORE_IMF_INPUT_PANEL_STATE_SHOW:
67     {
68       DALI_LOG_INFO( gLogFilter, Debug::General, "VKB ECORE_IMF_INPUT_PANEL_STATE_SHOW\n" );
69
70       gKeyboardStatusSignalV2.Emit( true );
71
72       break;
73     }
74
75     case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
76     {
77       DALI_LOG_INFO( gLogFilter, Debug::General, "VKB ECORE_IMF_INPUT_PANEL_STATE_HIDE\n" );
78
79       gKeyboardStatusSignalV2.Emit( false );
80
81       break;
82     }
83
84     case ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW:
85     default:
86     {
87       // Do nothing
88       break;
89     }
90   }
91 }
92
93 void InputPanelLanguageChangeCallback( void* data, Ecore_IMF_Context* context, int value )
94 {
95   DALI_LOG_INFO( gLogFilter, Debug::General, "VKB InputPanelLanguageChangeCallback" );
96
97   // Emit the signal that the language has changed
98   gKeyboardLanguageChangedSignalV2.Emit();
99 }
100
101 void InputPanelGeometryChangedCallback ( void *data, Ecore_IMF_Context *context, int value )
102 {
103   DALI_LOG_INFO( gLogFilter, Debug::General, "VKB InputPanelGeometryChangedCallback\n" );
104
105   // Emit signal that the keyboard is resized
106   gKeyboardResizeSignalV2.Emit();
107 }
108
109 } // unnamed namespace
110
111 void ConnectCallbacks( Ecore_IMF_Context *imfContext )
112 {
113   if( imfContext )
114   {
115     DALI_LOG_INFO( gLogFilter, Debug::General, "VKB ConnectPanelCallbacks\n" );
116
117     ecore_imf_context_input_panel_event_callback_add( imfContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT,    InputPanelStateChangeCallback,     NULL );
118     ecore_imf_context_input_panel_event_callback_add( imfContext, ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT, InputPanelLanguageChangeCallback,  NULL );
119     ecore_imf_context_input_panel_event_callback_add( imfContext, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, InputPanelGeometryChangedCallback, NULL );
120   }
121 }
122
123 void DisconnectCallbacks( Ecore_IMF_Context *imfContext )
124 {
125   if( imfContext )
126   {
127     DALI_LOG_INFO( gLogFilter, Debug::General, "VKB DisconnectPanelCallbacks\n" );
128
129     ecore_imf_context_input_panel_event_callback_del( imfContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT,    InputPanelStateChangeCallback     );
130     ecore_imf_context_input_panel_event_callback_del( imfContext, ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT, InputPanelLanguageChangeCallback  );
131     ecore_imf_context_input_panel_event_callback_del( imfContext, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, InputPanelGeometryChangedCallback );
132   }
133 }
134
135 void Show()
136 {
137   if( Dali::Adaptor::IsAvailable() )
138   {
139     Dali::ImfManager imfManager = ImfManager::Get();
140     Ecore_IMF_Context* imfContext = reinterpret_cast<Ecore_IMF_Context*>( imfManager.GetContext() );
141
142     if( imfContext )
143     {
144       ecore_imf_context_input_panel_show( imfContext );
145     }
146   }
147 }
148
149 void Hide()
150 {
151   if( Dali::Adaptor::IsAvailable() )
152   {
153     Dali::ImfManager imfManager = ImfManager::Get();
154     Ecore_IMF_Context* imfContext = reinterpret_cast<Ecore_IMF_Context*>( imfManager.GetContext() );
155
156     if( imfContext )
157     {
158       ecore_imf_context_input_panel_hide( imfContext );
159     }
160   }
161 }
162
163 bool IsVisible()
164 {
165   if( Dali::Adaptor::IsAvailable() )
166   {
167     DALI_LOG_INFO( gLogFilter, Debug::General, "IsVisible\n" );
168
169     Dali::ImfManager imfManager = ImfManager::Get();
170     Ecore_IMF_Context* imfContext = reinterpret_cast<Ecore_IMF_Context*>( imfManager.GetContext() );
171
172     if ( imfContext )
173     {
174       if (ecore_imf_context_input_panel_state_get(imfContext) == ECORE_IMF_INPUT_PANEL_STATE_SHOW ||
175           ecore_imf_context_input_panel_state_get(imfContext) == ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW)
176       {
177         return true;
178       }
179     }
180   }
181
182   return false;
183 }
184
185 void SetReturnKeyType( Dali::VirtualKeyboard::ReturnKeyType type )
186 {
187   if ( Dali::Adaptor::IsAvailable() )
188   {
189     Dali::ImfManager imfManager = ImfManager::Get();
190     Ecore_IMF_Context* imfContext = reinterpret_cast<Ecore_IMF_Context*>( imfManager.GetContext() );
191
192     if( imfContext )
193     {
194       DALI_LOG_INFO( gLogFilter, Debug::General, "VKB Retrun key type is changed[%d]\n", type );
195
196       gReturnKeyType = type;
197       ecore_imf_context_input_panel_return_key_type_set( imfContext, static_cast<Ecore_IMF_Input_Panel_Return_Key_Type>( type ) );
198     }
199   }
200 }
201
202 Dali::VirtualKeyboard::ReturnKeyType GetReturnKeyType()
203 {
204   return gReturnKeyType;
205 }
206
207 void EnablePrediction(const bool enable)
208 {
209   if ( Dali::Adaptor::IsAvailable() )
210   {
211     Dali::ImfManager imfManager = ImfManager::Get();
212     Ecore_IMF_Context* imfContext = reinterpret_cast<Ecore_IMF_Context*>( imfManager.GetContext() );
213
214     if ( imfContext )
215     {
216       ecore_imf_context_prediction_allow_set( imfContext, (enable)? EINA_TRUE : EINA_FALSE);
217     }
218   }
219 }
220
221 bool IsPredictionEnabled()
222 {
223   if ( Dali::Adaptor::IsAvailable() )
224   {
225     Dali::ImfManager imfManager = ImfManager::Get();
226     Ecore_IMF_Context* imfContext = reinterpret_cast<Ecore_IMF_Context*>( imfManager.GetContext() );
227
228     if ( imfContext )
229     {
230       // predictive text is enabled.
231       if ( ecore_imf_context_input_panel_enabled_get( imfContext ) == EINA_TRUE )
232       {
233         return true;
234       }
235     }
236   }
237
238   return false;
239 }
240
241 Rect<int> GetSizeAndPosition()
242 {
243   int xPos, yPos, width, height;
244
245   width = height = xPos = yPos = 0;
246   if ( Dali::Adaptor::IsAvailable() )
247   {
248     Dali::ImfManager imfManager = ImfManager::Get();
249     Ecore_IMF_Context* imfContext = reinterpret_cast<Ecore_IMF_Context*>( imfManager.GetContext() );
250
251     if( imfContext )
252     {
253       ecore_imf_context_input_panel_geometry_get(imfContext, &xPos, &yPos, &width, &height);
254     }
255     else
256     {
257       DALI_LOG_WARNING("VKB Unable to get IMF Context so GetSize unavailable\n");
258       // return 0 as real size unknown.
259     }
260   }
261
262   return Rect<int>(xPos,yPos,width,height);
263 }
264
265 Dali::VirtualKeyboard::StatusSignalV2& StatusChangedSignal()
266 {
267   return gKeyboardStatusSignalV2;
268 }
269
270 Dali::VirtualKeyboard::VoidSignalV2& ResizedSignal()
271 {
272   return gKeyboardResizeSignalV2;
273 }
274
275 Dali::VirtualKeyboard::VoidSignalV2& LanguageChangedSignal()
276 {
277   return gKeyboardLanguageChangedSignalV2;
278 }
279
280 Dali::VirtualKeyboard::TextDirection GetTextDirection()
281 {
282   Dali::VirtualKeyboard::TextDirection direction ( Dali::VirtualKeyboard::LeftToRight );
283
284   if ( Dali::Adaptor::IsAvailable() )
285   {
286     Dali::ImfManager imfManager = ImfManager::Get();
287
288     if ( imfManager )
289     {
290       Ecore_IMF_Context* imfContext = reinterpret_cast<Ecore_IMF_Context*>( imfManager.GetContext() );
291
292       if ( imfContext )
293       {
294         char* locale( NULL );
295         ecore_imf_context_input_panel_language_locale_get( imfContext, &locale );
296
297         if ( locale )
298         {
299           direction = Locale::GetTextDirection( std::string( locale ) );
300           free( locale );
301         }
302       }
303     }
304   }
305   return direction;
306 }
307
308 } // namespace VirtualKeyboard
309
310 } // namespace Adaptor
311
312 } // namespace Internal
313
314 } // namespace Dali