Text input filter based on regular expressions.
Add a InputFilter struct to pass data of DALi InputFilter PropertyMap.
The InputFilter struct can be used as an argument to SetInputFilter and GetInputFilter methods.
// example
InputFilter inputFilter;
inputFilter.Accepted = new Regex(@"[\d]");
inputFilter.Rejected = new Regex("[0-3]");
field.SetInputFilter(inputFilter);
field.InputFiltered += (s, e) =>
{
if (e.Type == InputFilterType.Accept)
{
// If input is filtered by InputFilter of Accept type.
}
else if (e.Type == InputFilterType.Reject)
{
// If input is filtered by InputFilter of Reject type.
}
};
Signed-off-by: Bowon Ryu <bowon.ryu@samsung.com>
[global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_TextEditor_Property_ELLIPSIS_POSITION_get")]
public static extern int EllipsisPositionGet();
+
+ [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_TextEditor_Property_INPUT_FILTER_get")]
+ public static extern int InputFilterGet();
+
+ [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_TextEditor_InputFilteredSignal")]
+ public static extern global::System.IntPtr InputFilteredSignal(global::System.Runtime.InteropServices.HandleRef textEditorRef);
}
}
}
[global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_TextField_Property_GRAB_HANDLE_COLOR_get")]
public static extern int GrabHandleColorGet();
+
+ [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_TextField_Property_INPUT_FILTER_get")]
+ public static extern int InputFilterGet();
+
+ [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_TextField_InputFilteredSignal")]
+ public static extern global::System.IntPtr InputFilteredSignal(global::System.Runtime.InteropServices.HandleRef textFieldRef);
}
}
}
extern alias TizenSystemSettings;
using TizenSystemSettings.Tizen.System;
+using System.Text.RegularExpressions;
using System;
using System.Globalization;
using System.ComponentModel;
+using Tizen.NUI.Text;
namespace Tizen.NUI.BaseComponents
{
}
/// <summary>
+ /// Set InputFilter to TextEditor. <br />
+ /// </summary>
+ /// <param name="inputFilter">The InputFilter</param>
+ /// <remarks>
+ /// <see cref="Tizen.NUI.Text.InputFilter"/> filters input based on regular expressions. <br />
+ /// Users can set the Accepted or Rejected regular expression set, or both. <br />
+ /// If both are used, Rejected has higher priority. <br />
+ /// InputFiltered signal is emitted when the input is filtered by InputFilter <br />
+ /// See <see cref="InputFiltered"/>, <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
+ /// </remarks>
+ /// <example>
+ /// The following example demonstrates how to use the SetInputFilter method.
+ /// <code>
+ /// Tizen.NUI.Text.InputFilter inputFilter;
+ /// inputFilter.Accepted = new Regex(@"[\d]"); // accept whole digits
+ /// inputFilter.Rejected = new Regex("[0-3]"); // reject 0, 1, 2, 3
+ /// editor.SetInputFilter(inputFilter); // acceptable inputs are 4, 5, 6, 7, 8, 9
+ /// </code>
+ /// </example>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetInputFilter(InputFilter inputFilter)
+ {
+ var map = new PropertyMap();
+ var accepted = inputFilter.Accepted != null ? new PropertyValue(inputFilter.Accepted.ToString()) : new PropertyValue("");
+ var rejected = inputFilter.Rejected != null ? new PropertyValue(inputFilter.Rejected.ToString()) : new PropertyValue("");
+ map.Add(0, accepted);
+ map.Add(1, rejected);
+ SetProperty(TextEditor.Property.InputFilter, new PropertyValue(map));
+ }
+
+ /// <summary>
+ /// Get InputFilter from TextEditor. <br />
+ /// </summary>
+ /// <returns>The InputFilter</returns>
+ /// <remarks>
+ /// <see cref="Tizen.NUI.Text.InputFilter"/>
+ /// </remarks>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public InputFilter GetInputFilter()
+ {
+ var map = new PropertyMap();
+ GetProperty(TextEditor.Property.InputFilter).Get(map);
+ string accepted = "";
+ string rejected = "";
+ map.Find(0)?.Get(out accepted);
+ map.Find(1)?.Get(out rejected);
+
+ var inputFilter = new InputFilter();
+ inputFilter.Accepted = new Regex(accepted);
+ inputFilter.Rejected = new Regex(rejected);
+
+ return inputFilter;
+ }
+
+ /// <summary>
/// The Placeholder property.
/// The placeholder map contains the following keys :<br />
/// <list type="table">
internal static readonly int InputMethodSettings = Interop.TextEditor.InputMethodSettingsGet();
internal static readonly int ELLIPSIS = Interop.TextEditor.EllipsisGet();
internal static readonly int EllipsisPosition = Interop.TextEditor.EllipsisPositionGet();
+ internal static readonly int InputFilter = Interop.TextEditor.InputFilterGet();
}
internal class InputStyle
private EventHandler<AnchorClickedEventArgs> textEditorAnchorClickedEventHandler;
private AnchorClickedCallbackDelegate textEditorAnchorClickedCallbackDelegate;
+ private EventHandler<InputFilteredEventArgs> textEditorInputFilteredEventHandler;
+ private InputFilteredCallbackDelegate textEditorInputFilteredCallbackDelegate;
+
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void TextChangedCallbackDelegate(IntPtr textEditor);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void AnchorClickedCallbackDelegate(IntPtr textEditor, IntPtr href, uint hrefLength);
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ private delegate void InputFilteredCallbackDelegate(IntPtr textEditor, InputFilterType type);
+
/// <summary>
/// An event for the TextChanged signal which can be used to subscribe or unsubscribe the event handler
/// provided by the user. The TextChanged signal is emitted when the text changes.<br />
}
}
+ /// <summary>
+ /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
+ /// </summary>
+ /// <remarks>
+ /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
+ /// </remarks>
+ /// <example>
+ /// The following example demonstrates how to use the InputFiltered event.
+ /// <code>
+ /// editor.InputFiltered += (s, e) =>
+ /// {
+ /// if (e.Type == InputFilterType.Accept)
+ /// {
+ /// // If input is filtered by InputFilter of Accept type.
+ /// }
+ /// else if (e.Type == InputFilterType.Reject)
+ /// {
+ /// // If input is filtered by InputFilter of Reject type.
+ /// }
+ /// };
+ /// </code>
+ /// </example>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler<InputFilteredEventArgs> InputFiltered
+ {
+ add
+ {
+ if (textEditorInputFilteredEventHandler == null)
+ {
+ textEditorInputFilteredCallbackDelegate = (OnInputFiltered);
+ InputFilteredSignal().Connect(textEditorInputFilteredCallbackDelegate);
+ }
+ textEditorInputFilteredEventHandler += value;
+ }
+ remove
+ {
+ textEditorInputFilteredEventHandler -= value;
+ if (textEditorInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
+ {
+ InputFilteredSignal().Disconnect(textEditorInputFilteredCallbackDelegate);
+ }
+ }
+ }
+
internal TextEditorSignal TextChangedSignal()
{
TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.TextChangedSignal(SwigCPtr), false);
return ret;
}
+ internal TextEditorSignal InputFilteredSignal()
+ {
+ TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.InputFilteredSignal(SwigCPtr), false);
+ if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+ return ret;
+ }
+
private void OnTextChanged(IntPtr textEditor)
{
if (textEditorTextChangedEventHandler != null)
textEditorAnchorClickedEventHandler?.Invoke(this, e);
}
+ private void OnInputFiltered(IntPtr textEditor, InputFilterType type)
+ {
+ InputFilteredEventArgs e = new InputFilteredEventArgs();
+
+ // Populate all members of "e" (InputFilteredEventArgs) with real data
+ e.Type = type;
+ //here we send all data to user event handlers
+ textEditorInputFilteredEventHandler?.Invoke(this, e);
+ }
+
/// <summary>
/// Event arguments that passed via the TextChanged signal.
/// </summary>
/// <since_tizen> 9 </since_tizen>
public string Href { get; set; }
}
+
+ /// <summary>
+ /// InputFilteredEventArgs is a class to record input filter event arguments which will be sent to user.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class InputFilteredEventArgs : EventArgs
+ {
+ /// <summary>
+ /// The type of InputFilter that filtered the input is stored. <br />
+ /// If the input is filtered by the Accepted Regex of the InputFilter, the Accept type is stored. <br />
+ /// If the input is filtered by the Rejected Regex of the InputFilter, the Reject type is stored. <br />
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public InputFilterType Type { get; set; }
+ }
}
\ No newline at end of file
*/
extern alias TizenSystemSettings;
using TizenSystemSettings.Tizen.System;
+using System.Text.RegularExpressions;
using System;
using System.Globalization;
using System.ComponentModel;
using Tizen.NUI.Binding;
+using Tizen.NUI.Text;
namespace Tizen.NUI.BaseComponents
{
}
/// <summary>
+ /// Set InputFilter to TextField. <br />
+ /// </summary>
+ /// <param name="inputFilter">The InputFilter</param>
+ /// <remarks>
+ /// <see cref="Tizen.NUI.Text.InputFilter"/> filters input based on regular expressions. <br />
+ /// Users can set the Accepted or Rejected regular expression set, or both. <br />
+ /// If both are used, Rejected has higher priority. <br />
+ /// InputFiltered signal is emitted when the input is filtered by InputFilter <br />
+ /// See <see cref="InputFiltered"/>, <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
+ /// </remarks>
+ /// <example>
+ /// The following example demonstrates how to use the SetInputFilter method.
+ /// <code>
+ /// Tizen.NUI.Text.InputFilter inputFilter;
+ /// inputFilter.Accepted = new Regex(@"[\d]"); // accept whole digits
+ /// inputFilter.Rejected = new Regex("[0-3]"); // reject 0, 1, 2, 3
+ /// field.SetInputFilter(inputFilter); // acceptable inputs are 4, 5, 6, 7, 8, 9
+ /// </code>
+ /// </example>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetInputFilter(InputFilter inputFilter)
+ {
+ var map = new PropertyMap();
+ var accepted = inputFilter.Accepted != null ? new PropertyValue(inputFilter.Accepted.ToString()) : new PropertyValue("");
+ var rejected = inputFilter.Rejected != null ? new PropertyValue(inputFilter.Rejected.ToString()) : new PropertyValue("");
+ map.Add(0, accepted);
+ map.Add(1, rejected);
+ SetProperty(TextField.Property.InputFilter, new PropertyValue(map));
+ }
+
+ /// <summary>
+ /// Get InputFilter from TextField. <br />
+ /// </summary>
+ /// <returns>The InputFilter</returns>
+ /// <remarks>
+ /// <see cref="Tizen.NUI.Text.InputFilter"/>
+ /// </remarks>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public InputFilter GetInputFilter()
+ {
+ var map = new PropertyMap();
+ GetProperty(TextField.Property.InputFilter).Get(map);
+ string accepted = "";
+ string rejected = "";
+ map.Find(0)?.Get(out accepted);
+ map.Find(1)?.Get(out rejected);
+
+ var inputFilter = new InputFilter();
+ inputFilter.Accepted = new Regex(accepted);
+ inputFilter.Rejected = new Regex(rejected);
+
+ return inputFilter;
+ }
+
+ /// <summary>
/// The Placeholder property.
/// The placeholder map contains the following keys :<br />
/// <list type="table">
internal static readonly int FontSizeScale = Interop.TextField.FontSizeScaleGet();
internal static readonly int GrabHandleColor = Interop.TextField.GrabHandleColorGet();
internal static readonly int EllipsisPosition = Interop.TextField.EllipsisPositionGet();
+ internal static readonly int InputFilter = Interop.TextField.InputFilterGet();
}
internal class InputStyle
private MaxLengthReachedCallbackDelegate textFieldMaxLengthReachedCallbackDelegate;
private EventHandler<AnchorClickedEventArgs> textFieldAnchorClickedEventHandler;
private AnchorClickedCallbackDelegate textFieldAnchorClickedCallbackDelegate;
+ private EventHandler<InputFilteredEventArgs> textFieldInputFilteredEventHandler;
+ private InputFilteredCallbackDelegate textFieldInputFilteredCallbackDelegate;
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void TextChangedCallbackDelegate(IntPtr textField);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void AnchorClickedCallbackDelegate(IntPtr textField, IntPtr href, uint hrefLength);
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ private delegate void InputFilteredCallbackDelegate(IntPtr textField, InputFilterType type);
+
/// <summary>
/// The TextChanged event.
/// </summary>
}
}
+ /// <summary>
+ /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
+ /// </summary>
+ /// <remarks>
+ /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
+ /// </remarks>
+ /// <example>
+ /// The following example demonstrates how to use the InputFiltered event.
+ /// <code>
+ /// field.InputFiltered += (s, e) =>
+ /// {
+ /// if (e.Type == InputFilterType.Accept)
+ /// {
+ /// // If input is filtered by InputFilter of Accept type.
+ /// }
+ /// else if (e.Type == InputFilterType.Reject)
+ /// {
+ /// // If input is filtered by InputFilter of Reject type.
+ /// }
+ /// };
+ /// </code>
+ /// </example>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler<InputFilteredEventArgs> InputFiltered
+ {
+ add
+ {
+ if (textFieldInputFilteredEventHandler == null)
+ {
+ textFieldInputFilteredCallbackDelegate = (OnInputFiltered);
+ InputFilteredSignal().Connect(textFieldInputFilteredCallbackDelegate);
+ }
+ textFieldInputFilteredEventHandler += value;
+ }
+ remove
+ {
+ textFieldInputFilteredEventHandler -= value;
+ if (textFieldInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
+ {
+ InputFilteredSignal().Disconnect(textFieldInputFilteredCallbackDelegate);
+ }
+ }
+ }
+
internal TextFieldSignal TextChangedSignal()
{
TextFieldSignal ret = new TextFieldSignal(Interop.TextField.TextChangedSignal(SwigCPtr), false);
return ret;
}
+ internal TextFieldSignal InputFilteredSignal()
+ {
+ TextFieldSignal ret = new TextFieldSignal(Interop.TextField.InputFilteredSignal(SwigCPtr), false);
+ if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+ return ret;
+ }
+
private void OnTextChanged(IntPtr textField)
{
if (textFieldTextChangedEventHandler != null)
textFieldAnchorClickedEventHandler?.Invoke(this, e);
}
+ private void OnInputFiltered(IntPtr textField, InputFilterType type)
+ {
+ InputFilteredEventArgs e = new InputFilteredEventArgs();
+
+ // Populate all members of "e" (InputFilteredEventArgs) with real data
+ e.Type = type;
+ //here we send all data to user event handlers
+ textFieldInputFilteredEventHandler?.Invoke(this, e);
+ }
+
/// <summary>
/// The TextChanged event arguments.
/// </summary>
using System;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
+using System.Text.RegularExpressions;
namespace Tizen.NUI
{
[EditorBrowsable(EditorBrowsableState.Never)]
OnDemand = 1
}
+
+ /// <summary>
+ /// Enumeration for the type of InputFilter. <br />
+ /// </summary>
+ /// <remarks>
+ /// The type of InputFilter that is stored in the <see cref="Tizen.NUI.BaseComponents.InputFilteredEventArgs"/> when the input is filtered. <br />
+ /// </remarks>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public enum InputFilterType
+ {
+ /// <summary>
+ /// The type of InputFilter is Accept.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ Accept,
+
+ /// <summary>
+ /// The type of InputFilter is Reject.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ Reject
+ }
+
+ namespace Text
+ {
+ /// <summary>
+ /// A struct to pass data of InputFilter PropertyMap. <br />
+ /// </summary>
+ /// <remarks>
+ /// InputFilter filters input based on regular expressions. <br />
+ /// Users can set the Accepted or Rejected regular expression set, or both. <br />
+ /// If both are used, Rejected has higher priority. <br />
+ /// The InputFilter struct is used as an argument to SetInputFilter and GetInputFilter methods. <br />
+ /// See <see cref="Tizen.NUI.BaseComponents.TextField.SetInputFilter"/>, <see cref="Tizen.NUI.BaseComponents.TextField.GetInputFilter"/>, <see cref="Tizen.NUI.BaseComponents.TextEditor.SetInputFilter"/> and <see cref="Tizen.NUI.BaseComponents.TextEditor.GetInputFilter"/>. <br />
+ /// </remarks>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public struct InputFilter
+ {
+ /// <summary>
+ /// A regular expression in the set of characters to be accepted by the inputFilter.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public Regex Accepted { get; set; }
+
+ /// <summary>
+ /// A regular expression in the set of characters to be rejected by the inputFilter.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public Regex Rejected { get; set; }
+ }
+ }
}