Support Chinese/Japanese text input 62/286762/8
authorInHong Han <inhong1.han@samsung.com>
Thu, 12 Jan 2023 09:27:19 +0000 (18:27 +0900)
committerInHong Han <inhong1.han@samsung.com>
Fri, 27 Jan 2023 09:37:11 +0000 (18:37 +0900)
Change-Id: Id3966ce754c22d5301435f210d0f2da9d0d55c0d

14 files changed:
ISEDefaultNUI/CandidateView.cs [new file with mode: 0644]
ISEDefaultNUI/Common/ResourceManager.cs
ISEDefaultNUI/ISEDefaultNUI.cs
ISEDefaultNUI/Interop/Interop.SclNui.cs
ISEDefaultNUI/SCLNUI.cs
ISEDefaultNUI/res/image/soft_candidate/B09_key_btn_01.png [new file with mode: 0755]
ISEDefaultNUI/res/image/soft_candidate/B09_key_btn_press.png [new file with mode: 0755]
ISEDefaultNUI/res/image/soft_candidate/B09_predictive_horizon_line.png [new file with mode: 0755]
ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_down.png [new file with mode: 0755]
ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_down_press.png [new file with mode: 0755]
ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_up.png [new file with mode: 0755]
ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_up_press.png [new file with mode: 0755]
ISEDefaultNUI/res/image/soft_candidate/B09_predictive_vertical_line.png [new file with mode: 0755]
ISEDefaultNUI/res/image/soft_candidate/textinput_qwerty_candidate_bg.#.png [new file with mode: 0644]

diff --git a/ISEDefaultNUI/CandidateView.cs b/ISEDefaultNUI/CandidateView.cs
new file mode 100644 (file)
index 0000000..37c0975
--- /dev/null
@@ -0,0 +1,304 @@
+using System;\r
+using System.Collections.Generic;\r
+using Tizen;\r
+using Tizen.Applications;\r
+using Tizen.NUI;\r
+using Tizen.NUI.BaseComponents;\r
+using Tizen.NUI.Components;\r
+using static Interop.SclNuiCSharp;\r
+\r
+namespace ISEDefaultNUI\r
+{\r
+    public class CandidateView\r
+    {\r
+        private static CandidateView instance;\r
+        private Timer timer;\r
+        private View parentView;\r
+        private ScrollableBase candidateView;\r
+        private bool visible;\r
+        private bool candidateExpanded;\r
+        private List<string> candidateStrings;\r
+        private List<TextLabel> labelList;\r
+        private List<ImageView> popupLineList;\r
+        private Button moreButton;\r
+        private Size imeSize;\r
+        private string selectedCandidate;\r
+        private int index = 0;\r
+        private int pointSize = 15;\r
+        private int itemWidth = 120;\r
+        private int viewHeight = 84;\r
+        private int moreButtonWidth = 89;\r
+        private int moreButtonHeight = 64;\r
+        private ushort margin = 5;\r
+        private static string ImageURL = Application.Current.DirectoryInfo.Resource + "image/soft_candidate/";\r
+\r
+        private CandidateView()\r
+        {\r
+            timer = new Timer(ResourceManager.CandidateHideTimerInterval);\r
+            timer.Tick += TimerTick;\r
+\r
+            candidateView = new ScrollableBase()\r
+            {\r
+                WidthSpecification = LayoutParamPolicies.MatchParent,\r
+                HeightSpecification = LayoutParamPolicies.MatchParent,\r
+                BackgroundColor = Color.Black,\r
+                Padding = new Extents(margin, margin, margin, margin),\r
+            };\r
+\r
+            candidateStrings = new List<string>();\r
+            labelList = new List<TextLabel>();\r
+            popupLineList = new List<ImageView>();\r
+            visible = false;\r
+            candidateExpanded = false;\r
+        }\r
+\r
+        public static CandidateView Instance\r
+        {\r
+            get\r
+            {\r
+                if (instance == null)\r
+                    instance = new CandidateView();\r
+\r
+                return instance;\r
+            }\r
+        }\r
+\r
+        public List<string> CandidateStrings\r
+        {\r
+            get => candidateStrings;\r
+            set\r
+            {\r
+                if (value == null)\r
+                    throw new ArgumentException("Invalid parameter");\r
+\r
+                candidateStrings = value;\r
+            }\r
+        }\r
+\r
+        public bool IsVisible\r
+        {\r
+            get => visible;\r
+        }\r
+\r
+        public int ViewHeight\r
+        {\r
+            get => viewHeight;\r
+        }\r
+\r
+        private bool TimerTick(object source, Timer.TickEventArgs e)\r
+        {\r
+            Log.Info("NUIIME", "Hide candidate view");\r
+            parentView.Remove(candidateView);\r
+            visible = false;\r
+            candidateExpanded = false;\r
+            return false;\r
+        }\r
+\r
+        private bool NeedEngineLoader()\r
+        {\r
+            bool loadInIme = false;\r
+            string currentLanguage = LanguageManager.Instance.GetCurrentLanguage();\r
+            if (currentLanguage != null)\r
+            {\r
+                LanguageInfo languageInfo = LanguageManager.Instance.GetLanguageInfo(currentLanguage);\r
+                if (languageInfo != null)\r
+                    loadInIme = languageInfo.LoadInIME;\r
+            }\r
+\r
+            return !loadInIme;\r
+        }\r
+\r
+        private bool OnTouchEvent(object source, View.TouchEventArgs e)\r
+        {\r
+            TextLabel candidate = source as TextLabel;\r
+            if (e.Touch.GetState(0) == PointStateType.Down)\r
+            {\r
+                selectedCandidate = candidate.Text;\r
+            }\r
+            else if (e.Touch.GetState(0) == PointStateType.Up)\r
+            {\r
+                if (candidate.Text.Equals(selectedCandidate))\r
+                {\r
+                    string candidateString = candidate.Text;\r
+                    uint idx = (uint)candidateStrings.IndexOf(candidateString);\r
+\r
+                    if (NeedEngineLoader())\r
+                    {\r
+                        SclDbusSelectCandidate(idx);\r
+                    }\r
+                    else\r
+                    {\r
+                        SclSelectCandidate(idx);\r
+                    }\r
+                }\r
+                selectedCandidate = null;\r
+            }\r
+\r
+            return true;\r
+        }\r
+\r
+        private void CreateCandidateText(string text)\r
+        {\r
+            PropertyMap candidateStyle = new PropertyMap();\r
+            candidateStyle.Add("weight", new PropertyValue("semibold"));\r
+            candidateStyle.Add("slant", new PropertyValue("dejavu"));\r
+\r
+            TextLabel candidate = new TextLabel()\r
+            {\r
+                Margin = new Extents(0, margin, margin, margin),\r
+                Text = text,\r
+                PointSize = pointSize,\r
+                FontStyle = candidateStyle,\r
+                TextColor = Color.White,\r
+                HorizontalAlignment = HorizontalAlignment.Center,\r
+                VerticalAlignment = VerticalAlignment.Center,\r
+                Size = new Size(itemWidth, viewHeight - (margin * 3)),\r
+                BackgroundColor = Color.Black,\r
+            };\r
+\r
+            candidate.TouchEvent += OnTouchEvent;\r
+            candidateView.Add(candidate);\r
+            labelList.Add(candidate);\r
+        }\r
+\r
+        private void moreButtonClicked(object sender, ClickedEventArgs e)\r
+        {\r
+            if (candidateExpanded)\r
+            {\r
+                candidateView.Size = new Size(imeSize.Width, viewHeight);\r
+                candidateExpanded = false;\r
+            }\r
+            else\r
+            {\r
+                candidateView.Size = new Size(imeSize.Width, imeSize.Height + viewHeight);\r
+                candidateExpanded = true;\r
+\r
+                for (int i = index + 1; i < candidateStrings.Count; i++)\r
+                {\r
+                    CreateCandidateText(candidateStrings[i]);\r
+                }\r
+            }\r
+        }\r
+\r
+        private void CreateMoreButton()\r
+        {\r
+            ButtonStyle Style = new ButtonStyle\r
+            {\r
+                IsSelectable = true,\r
+                Size = new Size(moreButtonWidth, moreButtonHeight),\r
+                BackgroundColor = new Color(0.37f, 0.38f, 0.4f, 1.0f),\r
+                Icon = new ImageViewStyle\r
+                {\r
+                    Size = new Size(moreButtonWidth / 2, moreButtonHeight / 2),\r
+                    ResourceUrl = new Selector<string>\r
+                    {\r
+                        Normal = ImageURL + "B09_predictive_icon_arrow_down.png",\r
+                        Selected = ImageURL + "B09_predictive_icon_arrow_up.png",\r
+                    },\r
+                },\r
+            };\r
+\r
+            moreButton = new Button(Style)\r
+            {\r
+                Margin = new Extents((ushort)(margin * 3), 0, (ushort)((viewHeight - moreButtonHeight) / 4), (ushort)((viewHeight - moreButtonHeight) / 4)),\r
+                Position = new Position(imeSize.Width - moreButtonWidth - ((viewHeight - moreButtonHeight) / 4), 0),\r
+                CellHorizontalAlignment = HorizontalAlignmentType.Right,\r
+                CellVerticalAlignment = VerticalAlignmentType.Center,\r
+            };\r
+\r
+            moreButton.Clicked += moreButtonClicked;\r
+            candidateView.Add(moreButton);\r
+        }\r
+\r
+        private void ResetCandidateView()\r
+        {\r
+            if (labelList.Count > 0)\r
+            {\r
+                labelList.ForEach(label =>\r
+                {\r
+                    label.Unparent();\r
+                    label.Dispose();\r
+                });\r
+            }\r
+\r
+            if (popupLineList.Count > 0)\r
+            {\r
+                popupLineList.ForEach(line =>\r
+                {\r
+                    line.Unparent();\r
+                    line.Dispose();\r
+                });\r
+            }\r
+\r
+            labelList.Clear();\r
+            popupLineList.Clear();\r
+\r
+            if (candidateExpanded)\r
+            {\r
+                candidateView.Size = new Size(imeSize.Width, viewHeight);\r
+                candidateExpanded = false;\r
+            }\r
+\r
+            if (moreButton != null)\r
+            {\r
+                moreButton.Unparent();\r
+                moreButton.Dispose();\r
+            }\r
+        }\r
+\r
+        public void UpdateCandidateList()\r
+        {\r
+            if (imeSize == null)\r
+                return;\r
+\r
+            ResetCandidateView();\r
+            index = 0;\r
+            int columnCount = (int)(imeSize.Width / (itemWidth + margin));\r
+            GridLayout gridLayout = new GridLayout()\r
+            {\r
+                Columns = columnCount,\r
+            };\r
+            candidateView.Layout = gridLayout;\r
+\r
+            for (int i = 0; i < candidateStrings.Count; i++)\r
+            {\r
+                CreateCandidateText(candidateStrings[i]);\r
+\r
+                if (i == columnCount - 2)\r
+                {\r
+                    index = i;\r
+                    CreateMoreButton();\r
+                    break;\r
+                }\r
+            }\r
+        }\r
+\r
+        public void Show(View parent)\r
+        {\r
+            if (!visible)\r
+            {\r
+                Log.Info("NUIIME", "Show candidate view");\r
+                parentView = parent;\r
+                parent.Add(candidateView);\r
+                visible = true;\r
+            }\r
+        }\r
+\r
+        public void Hide()\r
+        {\r
+            if (timer.IsRunning())\r
+            {\r
+                timer.Stop();\r
+            }\r
+\r
+            timer.Start();\r
+        }\r
+\r
+        public void SetPosition(Size imeSize)\r
+        {\r
+            this.imeSize = imeSize;\r
+            candidateView.Size = new Size(imeSize.Width, viewHeight);\r
+            candidateView.Position = new Position(0, 0);\r
+        }\r
+    }\r
+}\r
index d0001ca0b22fb6f00d59fdae541250ad6e8db858..ecfec06dce477e208f56e5b5f9c40a3a0863b22b 100644 (file)
@@ -20,6 +20,7 @@
         public const int MVKDone = 0xff0d;
         public const int LayoutNumberOnlyVariationMax = 4;
         public const uint MagnifierShowDuration = 300;
+        public const uint CandidateHideTimerInterval = 100;
 
         /* FIXME : If an API is provided to get the screen size, use the API */
         public const int screenWidth = 1920;
index e53ccd2ebb9ee8621148a2e3c65249bde9fda312..cd7dd405e3e52c8bb3ff5458f19826f15d361054 100644 (file)
@@ -632,6 +632,10 @@ namespace ISEDefaultNUI
             if (keyboardState.CheckContextTemporary(keyboardState.Context) && !keyboardState.CheckContextTemporary(e.ContextId))
                 keyboardState.Context = e.ContextId;
             keyboardState.FocusedContext = e.ContextId;
+
+            if (CandidateView.Instance.IsVisible)
+                CandidateView.Instance.Hide();
+
             SclDbus.FocusIn();
         }
 
index 97c50e6b03026c77a75e532d0e43cdbecf16f525..063ffe3e099e0a19960de8ba4203a34d58d6ba70 100644 (file)
@@ -19,6 +19,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.Linq;\r
 using System.Runtime.InteropServices;
 using Tizen;
 using Tizen.Internals;
@@ -105,6 +106,12 @@ internal static partial class Interop
             Done           /* We're done with this event, do not call any other default SCL event handlers */
         }
 
+        internal enum SclNuiCandidateEvent\r
+        {\r
+            Start = 0,\r
+            End\r
+        }
+
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         //internal delegate void DrawTextCallback(IntPtr str, int x, int y, int w, int h, int fontsize, IntPtr userData);
         //internal delegate void DrawTextCallback(SclFontInfo fontinfo, SclColor color, IntPtr str, int x, int y, int w, int h, int label_alignment, int padding_x, int padding_y, int inner_width, int inner_height, IntPtr userData);
@@ -138,6 +145,18 @@ internal static partial class Interop
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         internal delegate void ProcessKeyEventWithImengineCallback(UInt32 code, UInt32 mask, UInt32 layout, UInt32 devClass, UInt32 devSubclass, string devName, UInt32 serial, IntPtr user_data);
 
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void CandidateShowCallback(IntPtr user_data);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void CandidateHideCallback(IntPtr user_data);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void LookupTableChangedCallback(SclNuiCandidateEvent eventType, IntPtr user_data);
+
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void CandidateForeachCallback(IntPtr candidate, IntPtr user_data);
+
         [DllImport(Libraries.SclNui, EntryPoint = "scl_nui_init")]
         internal static extern int SclNuiInit(string entry_filepath);
 
@@ -341,5 +360,23 @@ internal static partial class Interop
 
         [DllImport(Libraries.SclNui, EntryPoint = "scl_set_process_key_event_with_imengine_cb")]
         internal static extern int SclSetProcessKeyEventWithImengineCb(ProcessKeyEventWithImengineCallback callbackFunction, IntPtr userData);
+
+        [DllImport(Libraries.SclNui, EntryPoint = "scl_set_candidate_show_cb")]
+        internal static extern int SclSetCandidateShowCb(CandidateShowCallback callbackFunction, IntPtr userData);
+
+        [DllImport(Libraries.SclNui, EntryPoint = "scl_set_candidate_hide_cb")]
+        internal static extern int SclSetCandidateHideCb(CandidateHideCallback callbackFunction, IntPtr userData);
+
+        [DllImport(Libraries.SclNui, EntryPoint = "scl_set_lookup_table_changed_cb")]
+        internal static extern int SclSetLookupTableChangedCb(LookupTableChangedCallback callbackFunction, IntPtr userData);
+
+        [DllImport(Libraries.SclNui, EntryPoint = "scl_set_candidate_string_foreach_cb")]
+        internal static extern int SclSetCandidateStringForeachCb(CandidateForeachCallback callbackFunction, IntPtr userData);
+
+        [DllImport(Libraries.SclNui, EntryPoint = "scl_nui_set_custom_starting_coordinates")]
+        internal static extern int SclNuiSetCustomStartingCoordinates(int x, int y);
+
+        [DllImport(Libraries.SclNui, EntryPoint = "scl_select_candidate")]
+        internal static extern int SclSelectCandidate(UInt32 index);
     }
 }
index ae01badb07a6d4ae676500a146f1cc26785fb670..5f33fca3599281ddc6945aaf80e128fe6b86640d 100644 (file)
@@ -23,6 +23,10 @@ namespace ISEDefaultNUI
         private EventNotificationCallback _onEventNotification = null;
         private UpdateWindowPositionCallback _updateWindowPositionChangedEvent = null;
         private ProcessKeyEventWithImengineCallback _onProcessKeyEventWithImengineEvent = null;
+        private CandidateShowCallback _onCandidateShowEvent = null;
+        private CandidateHideCallback _onCandidateHideEvent = null;
+        private LookupTableChangedCallback _onLookupTableChangedEvent = null;
+        private CandidateForeachCallback _onCandidateStringForeach = null;
 
         private List<ImageView> image_list;
         private List<TextLabel> label_list;
@@ -51,6 +55,7 @@ namespace ISEDefaultNUI
         private Size2D imePortraitSize;
         private Size2D imeLandscapeSize;
 
+        private CandidateView candidateView = CandidateView.Instance;
 
         enum LabelAlignment
         {
@@ -79,6 +84,13 @@ namespace ISEDefaultNUI
             Max,
         }
 
+        enum CandidateRequest
+        {
+            None = 0,
+            Show,
+            Hide,
+        }
+
         public SCLNUI(Navigator Navigator) : base()
         {
             Layout = new AbsoluteLayout();
@@ -548,6 +560,56 @@ namespace ISEDefaultNUI
                 }
             };
             SclNuiUpdateWindowPositionCb(_updateWindowPositionChangedEvent, (IntPtr)null);
+
+            _onCandidateShowEvent = (IntPtr userData) =>
+            {
+                if (imePortraitSize == null || imeLandscapeSize == null)
+                    GetDefaultSize();
+
+                if (candidateView.IsVisible == false)
+                {
+                    if (deviceAngle == 0 || deviceAngle == 180)
+                        candidateView.SetPosition(imePortraitSize);
+                    else
+                        candidateView.SetPosition(imeLandscapeSize);
+                    candidateView.Show(this);
+                    SetImeSize(CandidateRequest.Show);
+                }
+            };
+            SclSetCandidateShowCb(_onCandidateShowEvent, (IntPtr)null);
+
+            _onCandidateHideEvent = (IntPtr userData) =>
+            {
+                if (candidateView.IsVisible)
+                {
+                    candidateView.Hide();
+                }
+                SetImeSize(CandidateRequest.Hide);
+            };
+            SclSetCandidateHideCb(_onCandidateHideEvent, (IntPtr)null);
+
+            _onLookupTableChangedEvent = (SclNuiCandidateEvent eventType, IntPtr userData) =>
+            {
+                switch (eventType)
+                {
+                    case SclNuiCandidateEvent.Start:
+                        candidateView.CandidateStrings.Clear();
+                        break;
+                    case SclNuiCandidateEvent.End:
+                        candidateView.UpdateCandidateList();
+                        break;
+                    default:
+                        break;
+                }
+            };
+            SclSetLookupTableChangedCb(_onLookupTableChangedEvent, (IntPtr)null);
+
+            _onCandidateStringForeach = (IntPtr candidate, IntPtr userData) =>
+            {
+                string candidateString = Marshal.PtrToStringAnsi(candidate);
+                candidateView.CandidateStrings.Add(candidateString);
+            };
+            SclSetCandidateStringForeachCb(_onCandidateStringForeach, (IntPtr)null);
         }
 
         private bool CommitTimerTick(object source, Timer.TickEventArgs e)
@@ -590,7 +652,6 @@ namespace ISEDefaultNUI
             Log.Info("NUIIME", "### start draw text");
 
             Log.Info("NUIIME", "font name(" + FontName + "), italic(" + is_italic + "), bold(" + is_bold + ")");
-
             Log.Info("NUIIME", "key string(" + keystr + "), x: " + pos_x + ", y: " + pos_y);
             Log.Info("NUIIME", "padding_x:" + padding_x + ", padding_y: " + padding_y + ", inner_width: " + inner_width + ", inner_height: " + inner_height);
 
@@ -765,6 +826,49 @@ namespace ISEDefaultNUI
             emoticonView = null;
         }
 
+        private void SetImeSize(CandidateRequest request)
+        {
+            if (imePortraitSize == null || imeLandscapeSize == null)\r
+                GetDefaultSize();
+
+            switch (request)
+            {
+                case CandidateRequest.None:
+                    if (candidateView.IsVisible)
+                        SclNuiSetCustomStartingCoordinates(0, candidateView.ViewHeight);
+                    else
+                        SclNuiSetCustomStartingCoordinates(0, 0);
+                    break;
+                case CandidateRequest.Show:
+                    SclNuiSetCustomStartingCoordinates(0, candidateView.ViewHeight);
+                    imePortraitSize = new Size2D(imePortraitSize.Width, imePortraitSize.Height + candidateView.ViewHeight);
+                    imeLandscapeSize = new Size2D(imeLandscapeSize.Width, imeLandscapeSize.Height + candidateView.ViewHeight);
+                    break;
+                case CandidateRequest.Hide:
+                    SclNuiSetCustomStartingCoordinates(0, 0);
+                    break;
+                default:
+                    break;
+            }
+
+            IntPtr nativeHandle = new Window.SafeNativeWindowHandle().DangerousGetHandle();
+            InputMethodEditor.SetSize(nativeHandle, imePortraitSize.Width, imePortraitSize.Height, imeLandscapeSize.Width, imeLandscapeSize.Height);
+        }\r
+\r
+        private void GetDefaultSize()\r
+        {\r
+            IntPtr inputModePtr;\r
+            GetInputMode(out inputModePtr);\r
+            string inputMode = Marshal.PtrToStringAnsi(inputModePtr);\r
+\r
+            int portraitWidth, portraitHeight, landscapeWidth, landscapeHeight;\r
+            GetInputModeSize(inputMode, (int)WindowAttribute.DisplayMode.Portrait, out portraitWidth, out portraitHeight);\r
+            GetInputModeSize(inputMode, (int)WindowAttribute.DisplayMode.Landscape, out landscapeWidth, out landscapeHeight);\r
+\r
+            imePortraitSize = new Size2D(portraitWidth, portraitHeight);\r
+            imeLandscapeSize = new Size2D(landscapeWidth, landscapeHeight);\r
+        }\r
+\r
         public int Init(string entry_filepath)
         {
             return SclNuiInit(entry_filepath);
diff --git a/ISEDefaultNUI/res/image/soft_candidate/B09_key_btn_01.png b/ISEDefaultNUI/res/image/soft_candidate/B09_key_btn_01.png
new file mode 100755 (executable)
index 0000000..70a8858
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/B09_key_btn_01.png differ
diff --git a/ISEDefaultNUI/res/image/soft_candidate/B09_key_btn_press.png b/ISEDefaultNUI/res/image/soft_candidate/B09_key_btn_press.png
new file mode 100755 (executable)
index 0000000..400e110
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/B09_key_btn_press.png differ
diff --git a/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_horizon_line.png b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_horizon_line.png
new file mode 100755 (executable)
index 0000000..530ef14
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_horizon_line.png differ
diff --git a/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_down.png b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_down.png
new file mode 100755 (executable)
index 0000000..c45721c
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_down.png differ
diff --git a/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_down_press.png b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_down_press.png
new file mode 100755 (executable)
index 0000000..976fb72
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_down_press.png differ
diff --git a/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_up.png b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_up.png
new file mode 100755 (executable)
index 0000000..ceb1a2d
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_up.png differ
diff --git a/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_up_press.png b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_up_press.png
new file mode 100755 (executable)
index 0000000..7b787fc
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_icon_arrow_up_press.png differ
diff --git a/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_vertical_line.png b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_vertical_line.png
new file mode 100755 (executable)
index 0000000..73d18ea
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/B09_predictive_vertical_line.png differ
diff --git a/ISEDefaultNUI/res/image/soft_candidate/textinput_qwerty_candidate_bg.#.png b/ISEDefaultNUI/res/image/soft_candidate/textinput_qwerty_candidate_bg.#.png
new file mode 100644 (file)
index 0000000..8eac787
Binary files /dev/null and b/ISEDefaultNUI/res/image/soft_candidate/textinput_qwerty_candidate_bg.#.png differ