2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
19 #include <dali/internal/input/windows/input-method-context-impl-win.h>
\r
21 // EXTERNAL INCLUDES
\r
22 #include <dali/public-api/events/key-event.h>
\r
23 #include <dali/public-api/adaptor-framework/key.h>
\r
24 #include <dali/public-api/object/type-registry.h>
\r
25 #include <dali/integration-api/debug.h>
\r
27 // INTERNAL INCLUDES
\r
28 #include <dali/integration-api/adaptor.h>
\r
29 #include <dali/internal/adaptor/common/adaptor-impl.h>
\r
30 #include <dali/internal/system/common/locale-utils.h>
\r
31 #include <dali/internal/system/common/singleton-service-impl.h>
\r
32 #include <dali/internal/input/common/virtual-keyboard-impl.h>
\r
33 #include <dali/internal/input/common/key-impl.h>
\r
44 InputMethodContextPtr InputMethodContextWin::New( Dali::Actor actor )
\r
46 InputMethodContextPtr manager;
\r
48 if ( actor && Adaptor::IsAvailable() )
\r
50 manager = new InputMethodContextWin( actor );
\r
56 void InputMethodContextWin::Finalize()
\r
60 InputMethodContextWin::InputMethodContextWin( Dali::Actor actor )
\r
61 : mWin32Window( 0 ),
\r
62 mIMFCursorPosition( 0 ),
\r
64 mRestoreAfterFocusLost( false ),
\r
65 mIdleCallbackConnected( false )
\r
68 actor.OnStageSignal().Connect( this, &InputMethodContextWin::OnStaged );
\r
71 InputMethodContextWin::~InputMethodContextWin()
\r
76 void InputMethodContextWin::Initialize()
\r
78 CreateContext( mWin32Window );
\r
82 void InputMethodContextWin::CreateContext( WinWindowHandle winHandle )
\r
84 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::CreateContext\n" );
\r
87 void InputMethodContextWin::DeleteContext()
\r
89 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::DeleteContext\n" );
\r
92 // Callbacks for predicitive text support.
\r
93 void InputMethodContextWin::ConnectCallbacks()
\r
97 void InputMethodContextWin::DisconnectCallbacks()
\r
101 void InputMethodContextWin::Activate()
\r
103 // Reset mIdleCallbackConnected
\r
104 mIdleCallbackConnected = false;
\r
107 void InputMethodContextWin::Deactivate()
\r
109 mIdleCallbackConnected = false;
\r
112 void InputMethodContextWin::Reset()
\r
114 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::Reset\n" );
\r
117 ImfContext* InputMethodContextWin::GetContext()
\r
119 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetContext\n" );
\r
124 bool InputMethodContextWin::RestoreAfterFocusLost() const
\r
126 return mRestoreAfterFocusLost;
\r
129 void InputMethodContextWin::SetRestoreAfterFocusLost( bool toggle )
\r
131 mRestoreAfterFocusLost = toggle;
\r
135 * Called when an InputMethodContext Pre-Edit changed event is received.
\r
136 * We are still predicting what the user is typing. The latest string is what the InputMethodContext module thinks
\r
137 * the user wants to type.
\r
139 void InputMethodContextWin::PreEditChanged( void*, ImfContext* imfContext, void* eventInfo )
\r
141 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::PreEditChanged\n" );
\r
144 void InputMethodContextWin::CommitReceived( void*, ImfContext* imfContext, void* eventInfo )
\r
146 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::CommitReceived\n" );
\r
148 if ( Dali::Adaptor::IsAvailable() )
\r
150 const std::string keyString( static_cast<char*>( eventInfo ) );
\r
152 Dali::InputMethodContext handle( this );
\r
153 Dali::InputMethodContext::EventData eventData( Dali::InputMethodContext::COMMIT, keyString, 0, 0 );
\r
154 Dali::InputMethodContext::CallbackData callbackData = mEventSignal.Emit( handle, eventData );
\r
156 if( callbackData.update )
\r
158 mIMFCursorPosition = static_cast<int>( callbackData.cursorPosition );
\r
160 NotifyCursorPosition();
\r
166 * Called when an InputMethodContext retrieve surround event is received.
\r
167 * Here the InputMethodContext module wishes to know the string we are working with and where within the string the cursor is
\r
168 * We need to signal the application to tell us this information.
\r
170 bool InputMethodContextWin::RetrieveSurrounding( void* data, ImfContext* imfContext, char** text, int* cursorPosition )
\r
172 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::RetrieveSurrounding\n" );
\r
174 Dali::InputMethodContext::EventData imfData( Dali::InputMethodContext::GET_SURROUNDING, std::string(), 0, 0 );
\r
175 Dali::InputMethodContext handle( this );
\r
176 Dali::InputMethodContext::CallbackData callbackData = mEventSignal.Emit( handle, imfData );
\r
178 if( callbackData.update )
\r
182 *text = strdup( callbackData.currentText.c_str() );
\r
185 if( cursorPosition )
\r
187 mIMFCursorPosition = static_cast<int>( callbackData.cursorPosition );
\r
188 *cursorPosition = mIMFCursorPosition;
\r
196 * Called when an InputMethodContext delete surrounding event is received.
\r
197 * Here we tell the application that it should delete a certain range.
\r
199 void InputMethodContextWin::DeleteSurrounding( void* data, ImfContext* imfContext, void* eventInfo )
\r
201 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::DeleteSurrounding\n" );
\r
204 void InputMethodContextWin::NotifyCursorPosition()
\r
206 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::NotifyCursorPosition\n" );
\r
209 void InputMethodContextWin::SetCursorPosition( unsigned int cursorPosition )
\r
211 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetCursorPosition\n" );
\r
213 mIMFCursorPosition = static_cast<int>( cursorPosition );
\r
216 unsigned int InputMethodContextWin::GetCursorPosition() const
\r
218 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetCursorPosition\n" );
\r
220 return static_cast<unsigned int>( mIMFCursorPosition );
\r
223 void InputMethodContextWin::SetSurroundingText( const std::string& text )
\r
225 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetSurroundingText\n" );
\r
227 mSurroundingText = text;
\r
230 const std::string& InputMethodContextWin::GetSurroundingText() const
\r
232 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetSurroundingText\n" );
\r
234 return mSurroundingText;
\r
237 void InputMethodContextWin::NotifyTextInputMultiLine( bool multiLine )
\r
241 Dali::InputMethodContext::TextDirection InputMethodContextWin::GetTextDirection()
\r
243 Dali::InputMethodContext::TextDirection direction ( Dali::InputMethodContext::LeftToRight );
\r
248 Rect<int> InputMethodContextWin::GetInputMethodArea()
\r
250 int xPos, yPos, width, height;
\r
252 width = height = xPos = yPos = 0;
\r
254 return Rect<int>(xPos,yPos,width,height);
\r
257 void InputMethodContextWin::ApplyOptions( const InputMethodOptions& options )
\r
259 using namespace Dali::InputMethod::Category;
\r
263 if ( mOptions.CompareAndSet(PANEL_LAYOUT, options, index) )
\r
266 if ( mOptions.CompareAndSet(BUTTON_ACTION, options, index) )
\r
269 if ( mOptions.CompareAndSet(AUTO_CAPITALIZE, options, index) )
\r
272 if ( mOptions.CompareAndSet(VARIATION, options, index) )
\r
277 void InputMethodContextWin::SetInputPanelData( const std::string& data )
\r
279 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelData\n" );
\r
282 void InputMethodContextWin::GetInputPanelData( std::string& data )
\r
284 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelData\n" );
\r
287 Dali::InputMethodContext::State InputMethodContextWin::GetInputPanelState()
\r
289 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelState\n" );
\r
290 return Dali::InputMethodContext::DEFAULT;
\r
293 void InputMethodContextWin::SetReturnKeyState( bool visible )
\r
295 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetReturnKeyState\n" );
\r
298 void InputMethodContextWin::AutoEnableInputPanel( bool enabled )
\r
300 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::AutoEnableInputPanel\n" );
\r
303 void InputMethodContextWin::ShowInputPanel()
\r
305 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::ShowInputPanel\n" );
\r
308 void InputMethodContextWin::HideInputPanel()
\r
310 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::HideInputPanel\n" );
\r
313 Dali::InputMethodContext::KeyboardType InputMethodContextWin::GetKeyboardType()
\r
315 return Dali::InputMethodContext::KeyboardType::SOFTWARE_KEYBOARD;
\r
318 std::string InputMethodContextWin::GetInputPanelLocale()
\r
320 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelLocale\n" );
\r
322 std::string locale = "";
\r
326 void InputMethodContextWin::SetContentMIMETypes( const std::string& mimeTypes )
\r
328 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetContentMIMETypes\n" );
\r
331 bool InputMethodContextWin::FilterEventKey( const Dali::KeyEvent& keyEvent )
\r
333 bool eventHandled( false );
\r
335 if ( ! KeyLookup::IsDeviceButton( keyEvent.keyPressedName.c_str() ))
\r
337 //check whether it's key down or key up event
\r
338 if ( keyEvent.state == KeyEvent::Down )
\r
340 eventHandled = ProcessEventKeyDown( keyEvent );
\r
342 else if ( keyEvent.state == KeyEvent::Up )
\r
344 eventHandled = ProcessEventKeyUp( keyEvent );
\r
348 return eventHandled;
\r
351 void InputMethodContextWin::SetInputPanelLanguage( Dali::InputMethodContext::InputPanelLanguage language )
\r
353 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::SetInputPanelLanguage\n" );
\r
356 Dali::InputMethodContext::InputPanelLanguage InputMethodContextWin::GetInputPanelLanguage() const
\r
358 DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextWin::GetInputPanelLanguage\n" );
\r
359 return Dali::InputMethodContext::InputPanelLanguage::AUTOMATIC;
\r
362 bool InputMethodContextWin::ProcessEventKeyDown( const KeyEvent& keyEvent )
\r
364 bool eventHandled( false );
\r
365 return eventHandled;
\r
368 bool InputMethodContextWin::ProcessEventKeyUp( const KeyEvent& keyEvent )
\r
370 bool eventHandled( false );
\r
371 return eventHandled;
\r
374 void InputMethodContextWin::OnStaged( Dali::Actor actor )
\r
376 WinWindowHandle winWindow( AnyCast< WinWindowHandle >( Dali::Integration::SceneHolder::Get( actor ).GetNativeHandle() ) );
\r
378 if( mWin32Window != winWindow )
\r
380 mWin32Window = winWindow;
\r