Modified to draw the keyboard layout properly 46/262146/1
authorInHong Han <inhong1.han@samsung.com>
Fri, 30 Jul 2021 06:59:43 +0000 (15:59 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Tue, 3 Aug 2021 05:37:35 +0000 (14:37 +0900)
Change-Id: Ia4812446e37afc6ed9b17140fa7f4591bef8a5f3

ISEDefaultNUI/Common/Common.cs
ISEDefaultNUI/Common/IseConfig.cs
ISEDefaultNUI/Common/KeyboardState.cs
ISEDefaultNUI/Common/LanguageManager.cs
ISEDefaultNUI/Common/ResourceManager.cs
ISEDefaultNUI/ISEDefaultNUI.cs
ISEDefaultNUI/SCLNUI.cs
packaging/org.tizen.ISEDefaultNUI-1.0.0.tpk

index 667c630161c1e158c06621848d42736e4672f824..c29931d456c4e164131053465da22d406bed84d7 100644 (file)
@@ -4,6 +4,48 @@ using Tizen.Uix.InputMethod;
 
 namespace ISEDefaultNUI
 {
+    public class DefaultValue
+    {
+        public string InputMode;
+        public string SublayoutName;
+        public bool ForceLatin;
+        public DefaultValue(string mode, string name, bool latin)
+        {
+            InputMode = mode;
+            SublayoutName = name;
+            ForceLatin = latin;
+        }
+    }
+
+    public class IMEDefaultValue
+    {
+        public List<DefaultValue> Values;
+        public IMEDefaultValue()
+        {
+            Values = new List<DefaultValue>();
+            Values.Add(new DefaultValue("", "DEFAULT", false));
+            Values.Add(new DefaultValue("SYM_QTY_1", "DEFAULT", false));
+            Values.Add(new DefaultValue("", "EMAIL", true));
+            Values.Add(new DefaultValue("", "URL", true));
+            Values.Add(new DefaultValue("PHONE_3X4", "DEFAULT", false));
+            Values.Add(new DefaultValue("NUMONLY_3X4_DEC", "DEFAULT", false));
+            Values.Add(new DefaultValue("MONTH_3X4", "DEFAULT", false));
+            Values.Add(new DefaultValue("NUMONLY_3X4", "DEFAULT", false));
+            Values.Add(new DefaultValue("", "DEFAULT", false));
+            Values.Add(new DefaultValue("SYM_QTY_1", "DEFAULT", false));
+            Values.Add(new DefaultValue("", "DEFAULT", true));
+            Values.Add(new DefaultValue("", "DEFAULT", true));
+            Values.Add(new DefaultValue("DATETIME_3X4", "DEFAULT", false));
+            Values.Add(new DefaultValue("EMOTICON_LAYOUT", "DEFAULT", false));
+            Values.Add(new DefaultValue("STT_3X4", "DEFAULT", false));
+            Values.Add(new DefaultValue("STICKER_LAYOUT", "DEFAULT", false));
+            Values.Add(new DefaultValue("NUMONLY_3X4_SIG", "DEFAULT", false));
+            Values.Add(new DefaultValue("NUMONLY_3X4_DEC", "DEFAULT", false));
+            Values.Add(new DefaultValue("NUMONLY_3X4_SIGDEC", "DEFAULT", false));
+            Values.Add(new DefaultValue("PASSWD_3X4", "DEFAULT", false));
+        }
+    }
+
     public class Common
     {
         public static void SendString(string text)
index 3c41cb5ca8b9a94228f2ade8580d165b83216f42..088bba509b1311789ac12f6829d7212a41353425 100644 (file)
@@ -50,7 +50,7 @@ namespace ISEDefaultNUI
             selectedLanguage = "English";
             enabledLanguages = new List<string>();
             enabledLanguages.Add("English");
-            enabledLanguages.Add("Korean");
+            //enabledLanguages.Add("Korean");
         }
 
         public static IseConfig Instance
@@ -343,7 +343,7 @@ namespace ISEDefaultNUI
             selectedLanguage = "English";
             enabledLanguages.Clear();
             enabledLanguages.Add("English");
-            enabledLanguages.Add("Korean");
+            //enabledLanguages.Add("Korean");
             predictionOn = false;
             autoCapitalise = true;
             autoPunctuate = false;
index bd6ffc3db432323da5a8a6ada049f73ef0b573f0..86da563af286b1f676759b1a205a50a23b2137da 100644 (file)
@@ -34,6 +34,13 @@ namespace ISEDefaultNUI
         Max
     };
 
+    public enum KeyboardLayoutNormalVariation
+    {
+        Normal = 0,
+        FileName,
+        PersonName,
+    }
+
     public enum ShiftState
     {
         Off = 0,
index 5a7a84947cdcab50a6fec9c02e76fd147ba41573..be768a27d48d7de3200a46d4a8e047ca74ce751b 100644 (file)
@@ -178,14 +178,35 @@ namespace ISEDefaultNUI
                 return languageInfos[index - 1];
         }
 
-        public void SelectLanguage(LanguageInfo language)
+        public bool SelectLanguage(LanguageInfo language)
         {
-            currentLanguage = languageInfoList.FindIndex(x => x.Name == language.Name);
+            int index = -1;
+            index = languageInfoList.FindIndex(x => x.Name == language.Name);
+            if (index == -1)
+                return false;
+            else
+                return true;
         }
 
         public string GetUuid(string name)
         {
             return uuidInfoList.Find(x => x.Name == name).Uuid;
         }
+
+        public bool ResetLanguage(string name)
+        {
+            int index = languageInfoList.FindIndex(x => x.Name == name);
+
+            if (index < 0 || index >= languageInfoList.Count || index != currentLanguage)
+                return false;
+
+            LanguageInfo languageInfo = languageInfoList[index];
+            if (!languageInfo.Enabled && !languageInfo.EnabledTemporarily)
+                return false;
+
+            //Reset Language (flush imengine)
+
+            return true;
+        }
     }
 }
index f38b495ad6d31fe2e6880e261b0e87404c82e499..fb76538784771ba2984ebfb1d89cc8759ed52321 100644 (file)
@@ -24,6 +24,7 @@ namespace ISEDefaultNUI
         public const int MVKShiftDisable = 0x9fe8;
         public const int MVKSpace = 0x020;
         public const int MVKDone = 0xff0d;
+        public const int LayoutNumberOnlyVariationMax = 4;
         public const uint MagnifierShowDuration = 300;
 
         public const string IseConfigKeypadMode = "/ise-default/keypad_mode";
@@ -42,5 +43,6 @@ namespace ISEDefaultNUI
         public const string IseConfigSymbolTutorialEnable = "/ise-default/symbol_tutorial_enable";
         public const string IseConfigDataClear = "/ise-default/clear_data_on";
         public const string IseSettingAppId = "org.tizen.ise-default-setting";
+        public const string DefaultKeyboardUuid = "org.tizen.ise-engine-default";
     }
 }
index 5f452bafb6a486e90884fa8a44d039770840d62b..4d6d09e5bbf3cf43c66c84643fd5e007ab85d13d 100644 (file)
@@ -101,6 +101,7 @@ namespace ISEDefaultNUI
 
         private static void Create()
         {
+            SclNui = new SCLNUI(navigator);
             Task.Run(() => DbusInitialize());
 
             Window.Instance.AddAvailableOrientation(Window.WindowOrientation.Portrait);
@@ -155,6 +156,7 @@ namespace ISEDefaultNUI
 
         private static void Show(InputMethodEditor.ContextId a, Tizen.Uix.InputMethod.InputMethodContext b)
         {
+            int inputContext = a.Equals(0) ? 0 : KeyboardState.Instance.FocusedContext;
             bool returnKeyState = b.ReturnKeyState;
             bool predictionAllow = b.PredictionMode;
             bool passwordMode = b.PasswordMode;
@@ -193,17 +195,8 @@ namespace ISEDefaultNUI
                     break;
             }
             UpdateCursorPosition(b.CursorPosition);
-            SetIMESize();
 
-            SclNui = new SCLNUI(navigator);
-            LanguageInfo currentLanguage = LanguageManager.Instance.GetLanguageInfo(IseConfig.Instance.SelectedLanguage);
-            SclNui.SetInputMode(currentLanguage.SelectedInputMode);
-            SclNui.SetCurrentSublayout("DEFAULT");
-            SclNui.SetStringSubstitution("_LANGUAGE_", currentLanguage.DisplayName);
-            SclNui.EnableMagnifier(IseConfig.Instance.PreviewOn);
-            SclNuiShow();
-            KeyboardState.Instance.VisibleState = true;
-            SclNuiDisableInputEvent(false);
+            IMEShow(inputContext);
             SclNuiSetUpdatePending(false);
             navigator.Push(SclNui);
         }
@@ -229,9 +222,166 @@ namespace ISEDefaultNUI
             KeyboardState.Instance.ResetMultitapState(true);
         }
 
+        private static void IMEShow(int ic)
+        {
+            switch (KeyboardState.Instance.Layout)
+            {
+                case KeyboardLayout.PhoneNumber:
+                case KeyboardLayout.IP:
+                case KeyboardLayout.Month:
+                case KeyboardLayout.NumberOnly:
+                    /* FIXME : This comment should be removed when using IMEngine
+                     * InputMethodEditor.SetIMEngine(ResourceManager.DefaultKeyboardUuid);
+                    */
+                    break;
+                default:
+                    break;
+            }
+
+            IMEDefaultValue defaultValue = new IMEDefaultValue();
+            LanguageManager languageManager = LanguageManager.Instance;
+            IseConfig iseConfig = IseConfig.Instance;
+            KeyboardState keyboardState = KeyboardState.Instance;
+            string currentLanguage = languageManager.GetCurrentLanguage();
+            IseConfig.Instance.ReadIseConfig();
+            LanguageInfo languageinfo = languageManager.GetLanguageInfo(iseConfig.SelectedLanguage);
+
+            IntPtr inputModePtr;
+            SclNuiGetInputMode(out inputModePtr);
+            string inputMode = Marshal.PtrToStringAnsi(inputModePtr);
+            bool resetInputMode = false;
+
+            SclNui.SetInputMode(languageinfo.SelectedInputMode);
+            SclNui.SetCurrentSublayout("DEFAULT");
+            SclNui.SetStringSubstitution("_LANGUAGE_", languageinfo.DisplayName);
+            SclNui.EnableMagnifier(IseConfig.Instance.PreviewOn);
+
+            KeyboardState.Instance.VisibleState = true;
+
+            if (keyboardState.NeedReset || !iseConfig.SelectedLanguage.Equals(currentLanguage))
+                resetInputMode = true;
+            keyboardState.NeedReset = false;
+
+            bool forcePrimaryLatin = false;
+            if (!languageinfo.IsLatinLanguage)
+            {
+                if (!keyboardState.DisableForceLatin)
+                {
+                    if(defaultValue.Values[(int)keyboardState.Layout].ForceLatin)
+                    {
+                        forcePrimaryLatin = true;
+                    }
+                    else
+                    {
+                        if (keyboardState.PreferLatin)
+                            forcePrimaryLatin = true;
+                    }
+                }
+            }
+
+            if(forcePrimaryLatin)
+            {
+                bool selected = false;
+                for (int loop = 0; !selected && loop < languageManager.GetLanguagesNum(); loop++)
+                {
+                    languageinfo = languageManager.GetLanguageInfo(loop);
+                    if (languageinfo != null)
+                    {
+                        if (languageinfo.Enabled && languageinfo.IsLatinLanguage)
+                        {
+                            selected = languageManager.SelectLanguage(languageinfo);
+                            if (selected)
+                                forcePrimaryLatin = false;
+                        }
+                    }
+                }
+            }
+
+            if (resetInputMode)
+            {
+                ResetContext();
+
+                if (!keyboardState.CapsMode)
+                    SclNuiSetShiftState((uint)ShiftState.Off);
+
+                if (keyboardState.Layout < KeyboardLayout.Max)
+                {
+                    uint layoutIndex = (uint)keyboardState.Layout;
+                    if (keyboardState.Layout == KeyboardLayout.NumberOnly && keyboardState.LayoutVariation > 0 &&
+                        keyboardState.LayoutVariation < ResourceManager.LayoutNumberOnlyVariationMax)
+                    {
+                        layoutIndex = (uint)KeyboardLayout.NumberOnlySig + keyboardState.LayoutVariation - 1;
+                    }
+                    else if (keyboardState.Layout == KeyboardLayout.Password && keyboardState.LayoutVariation > 0)
+                    {
+                        layoutIndex = (uint)KeyboardLayout.Password_3X4;
+                    }
+
+                    bool fileNameLayout = false;
+                    if (keyboardState.Layout == KeyboardLayout.Normal && keyboardState.LayoutVariation == (uint)KeyboardLayoutNormalVariation.FileName)
+                        fileNameLayout = true;
+                    else
+                        fileNameLayout = false;
+
+                    SclNuiEnableButton("exclamation", !fileNameLayout);
+                    SclNuiEnableButton("question", !fileNameLayout);
+                    SclNuiEnableButton("divide", !fileNameLayout);
+                    SclNuiEnableButton("multiply", !fileNameLayout);
+                    SclNuiEnableButton("colon", !fileNameLayout);
+                    SclNuiEnableButton("quotation", !fileNameLayout);
+                    SclNuiEnableButton("CM_KEY", true);
+
+                    Log.Info("NUIIME", "new layout index : " + layoutIndex.ToString());
+
+                    if(defaultValue.Values[(int)layoutIndex].InputMode.Length > 0)
+                    {
+                        SclNuiSetInputMode(defaultValue.Values[(int)layoutIndex].InputMode);
+                    }
+
+                    SclNuiSetCurrentSublayout(defaultValue.Values[(int)layoutIndex].SublayoutName);
+                }
+            }
+
+            LanguageInfo languageInfo = LanguageManager.Instance.GetLanguageInfo(currentLanguage);
+            if (languageInfo != null)
+            {
+                if (languageInfo.AcceptsCapsMode)
+                {
+                    if (keyboardState.Layout != KeyboardLayout.Normal)
+                    {
+                        SclNuiSetAutocapitalShiftState(true);
+                        SclNuiSetShiftState((uint)ShiftState.Off);
+                    }
+                    else
+                    {
+                        Common.SendKeyEvent((KeyCode)ResourceManager.MVKShiftEnable);
+                        if (keyboardState.CapsMode)
+                            SclNuiSetAutocapitalShiftState(false);
+                    }
+                }
+                else
+                {
+                    SclNuiSetAutocapitalShiftState(true);
+                    Common.SendKeyEvent((KeyCode)ResourceManager.MVKShiftDisable);
+                    SclNuiSetShiftState((uint)ShiftState.Off);
+                }
+            }
+            else
+            {
+                SclNuiSetAutocapitalShiftState(true);
+            }
+
+            UpdateSpaceKey();
+            SclNuiShow();
+            SclNuiDisableInputEvent(false);
+            SetIMESize();
+        }
+
         private static void ResetContext()
         {
             KeyboardState.Instance.ResetMultitapState(true);
+            KeyboardState.Instance.DisableForceLatin = false;
+            LanguageManager.Instance.ResetLanguage(IseConfig.Instance.SelectedLanguage);
         }
 
         private static void SetLayout(KeyboardLayout layout, UInt32 layoutVariation)
@@ -388,16 +538,33 @@ namespace ISEDefaultNUI
         private static void ReturnKeyStateSetEvent(object sender, ReturnKeyStateSetEventArgs e)
         {
             Log.Info("NUIIME", "state : " + e.State.ToString());
+            SetReturnKeyDisable(e.State);
         }
 
         private static void ReturnKeySetEvent(object sender, ReturnKeySetEventArgs e)
         {
             Log.Info("NUIIME", "type : " + e.Type.ToString());
+            SetReturnKeyType(e.Type);
+
+            if (KeyboardState.Instance.VisibleState)
+                IMEShow(KeyboardState.Instance.FocusedContext);
         }
 
         private static void LayoutSetEvent(object sender, LayoutSetEventArgs e)
         {
             Log.Info("NUIIME", "layout : " + e.Layout.ToString());
+            KeyboardLayout newLayout = (KeyboardLayout)e.Layout;
+            KeyboardState keyboardState = KeyboardState.Instance;
+
+            if (newLayout < KeyboardLayout.Max)
+            {
+                if (keyboardState.Layout != newLayout)
+                    keyboardState.NeedReset = true;
+                keyboardState.Layout = newLayout;
+            }
+            
+            if (keyboardState.VisibleState)
+                IMEShow(KeyboardState.Instance.FocusedContext);
         }
 
         private static void DataSetEvent(object sender, SetDataEventArgs e)
@@ -423,6 +590,7 @@ namespace ISEDefaultNUI
         private static void SurroundingTextUpdatedEvent(object sender, SurroundingTextUpdatedEventArgs e)
         {
             Log.Info("NUIIME", "context id : " + e.ContextId.ToString() + ", text : " + e.Text + ", cursor position : " + e.CursorPosition.ToString());
+            InputMethodEditor.DeleteSurroundingText(-(e.CursorPosition), e.Text.Length);
         }
 
         private static void AccessibilityStateChangedEvent(object sender, AccessibilityStateChangedEventArgs e)
@@ -472,6 +640,27 @@ namespace ISEDefaultNUI
             Window.Instance.SetPositionSizeWithOrientation(landscapeRectangle, Window.WindowOrientation.LandscapeInverse);
         }
 
+        private static void UpdateSpaceKey()
+        {
+            int languageNum = LanguageManager.Instance.GetLanguagesNum();
+            Log.Info("NUIIME", "language number : " + languageNum.ToString());
+
+            if (languageNum <= 1)
+            {
+                LanguageInfo languageInfo = LanguageManager.Instance.GetLanguageInfo(LanguageManager.Instance.GetCurrentLanguage());
+                if (languageInfo != null && languageInfo.Enabled)
+                {
+                    SclNuiEnableButton("SPACE_ARROW_LEFT", false);
+                    SclNuiEnableButton("SPACE_ARROW_RIGHT", false);
+                }
+            }
+            else
+            {
+                SclNuiEnableButton("SPACE_ARROW_LEFT", true);
+                SclNuiEnableButton("SPACE_ARROW_RIGHT", true);
+            }
+        }
+
         static void Main(string[] args)
         {
             InputMethodEditor.Run(Create, Terminate, Show, Hide);
index 778d7e77ac78ea535c5328c768d9a8b8e8aa0927..5964fd39f84bc3560d4b29931b38a4a2b5d283fc 100644 (file)
@@ -1,6 +1,6 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
+using System.IO;
 using System.Runtime.InteropServices;
 using Tizen;
 using Tizen.Applications;
@@ -152,7 +152,8 @@ namespace ISEDefaultNUI
                 string image_path_str = Marshal.PtrToStringAnsi(image_path);
                 WindowAttribute.WindowType windowType = (WindowAttribute.WindowType)type;
                 Log.Info("NUIIME", "image: " + image_path_str + ", x: " + dest_x + ", y: " + dest_y);
-                if (image_path_str.EndsWith("/"))
+
+                if (!File.Exists(image_path_str))
                     return;
 
                 switch (windowType)
@@ -161,7 +162,6 @@ namespace ISEDefaultNUI
                         {
                             ImageView imageView = image_list.Find(image => image.Position.X == dest_x && image.Position.Y == dest_y &&
                                                                       image.Size.Width == dest_weight && image.Size.Height == dest_height);
-
                             if (imageView == null)
                             {
                                 imageView = draw_image(image_path_str, dest_x, dest_y, dest_weight, dest_height, src_x, src_y, src_width, src_height);
@@ -282,7 +282,6 @@ namespace ISEDefaultNUI
                 {
                     keyboardState.ResetMultitapState(false);
                 }
-
                 keyboardState.PreviousModifier = (uint)keyModifier;
                 switch (keyType)
                 {
@@ -338,7 +337,46 @@ namespace ISEDefaultNUI
                     case SclNuiKeyType.None:
                         break;
                     case SclNuiKeyType.Control:
-                        break;
+                        if (commitTimer.IsRunning())
+                        {
+                            commitTimer.Stop();
+                            CommitTimerTick(null, null);
+                        }
+
+                        const string longShift = "LongShift";
+                        const string capsLock = "CapsLock";
+                        const string deleteAll = "DeleteAll";
+                        const string hidePanel = "Hide";
+                        if (keyValue.Equals(longShift))
+                        {
+                            Log.Info("NUIIME", "shift key is longpress");
+                            SclNuiSetShiftState((uint)ShiftState.On);
+                        }
+                        else if (keyValue.Equals(capsLock))
+                        {
+                            // Sends the capsLock event to IMEngine
+                        }
+                        else if (keyValue.Equals(deleteAll))
+                        {
+                            InputMethodEditor.DeleteSurroundingText((Int32.MaxValue / 2) * -1, Int32.MaxValue);
+                        }
+                        else if (keyValue.Equals(hidePanel))
+                        {
+                            ClearClickCount();
+                            SclNuiSetUpdatePending(true);
+                            SclNuiDisableInputEvent(true);
+                            SclNuiHide();
+
+                            KeyboardState.Instance.VisibleState = false;
+                            SclNuiSetShiftState((uint)ShiftState.Off);
+                            KeyboardState.Instance.ResetMultitapState(true);
+                            InputMethodEditor.RequestHide();
+                        }
+                        else if (key_event > 0)
+                        {
+                            Common.SendKeyEvent((KeyCode)key_event);
+                        }
+                            break;
                     case SclNuiKeyType.Modechange:
                         break;
                     case SclNuiKeyType.User:
@@ -550,7 +588,6 @@ namespace ISEDefaultNUI
             key_text.TextColor = new Color((float)(r / 255.0), (float)(g / 255.0), (float)(b / 255.0), (float)(a / 255.0));
             // FIXME
             key_text.PointSize = (float)(font_size * 0.25);
-
             Log.Info("NUIIME", "x(" + pos_x + "), y(" + pos_y + ")");
             key_text.Position = new Position(pos_x, pos_y);
             key_text.Size = new Size(width, height);
index b22eb5c895be5bc023eee888976f94ae88ac1ee5..3de1ecad25bdd76de3bb099560ace9835b2ba73c 100644 (file)
Binary files a/packaging/org.tizen.ISEDefaultNUI-1.0.0.tpk and b/packaging/org.tizen.ISEDefaultNUI-1.0.0.tpk differ