Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/xamarin/Xamarin.PropertyEditing.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose Medrano <jose.medrano@microsoft.com>2018-12-13 16:35:04 +0300
committerJose Medrano <jose.medrano@microsoft.com>2018-12-14 15:22:50 +0300
commit7878353a431562b81cfcde6d90f4a029fc89a50f (patch)
tree643d323fad42d2e64ed3871d31398efec0c390c4
parentcd248d8fa5306f3ab05fabc72d6e869dd616ba9a (diff)
Adds implementation to handle char typeschar-editor
-rw-r--r--Xamarin.PropertyEditing.Mac/Controls/CharEditorControl.cs70
-rw-r--r--Xamarin.PropertyEditing.Mac/Controls/Custom/CharTextField.cs78
-rw-r--r--Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs1
-rw-r--r--Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs6
-rw-r--r--Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx4
-rw-r--r--Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj2
-rw-r--r--Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs1
-rw-r--r--Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs1
8 files changed, 163 insertions, 0 deletions
diff --git a/Xamarin.PropertyEditing.Mac/Controls/CharEditorControl.cs b/Xamarin.PropertyEditing.Mac/Controls/CharEditorControl.cs
new file mode 100644
index 0000000..ed733bd
--- /dev/null
+++ b/Xamarin.PropertyEditing.Mac/Controls/CharEditorControl.cs
@@ -0,0 +1,70 @@
+using System.Collections;
+using AppKit;
+using Xamarin.PropertyEditing.Mac.Resources;
+using Xamarin.PropertyEditing.ViewModels;
+
+namespace Xamarin.PropertyEditing.Mac
+{
+ internal class CharEditorControl : PropertyEditorControl<PropertyViewModel<char>>
+ {
+ readonly CharTextField editor;
+
+ public CharEditorControl ()
+ {
+ editor = new CharTextField {
+ Font = NSFont.FromFontName (DefaultFontName, DefaultFontSize)
+ };
+
+ // update the value on keypress
+ editor.Changed += (sender, e) => {
+ if (editor.StringValue.Length > 0) {
+ ViewModel.Value = editor.StringValue[0];
+ } else {
+ ViewModel.Value = default (char);
+ }
+ };
+ AddSubview (editor);
+
+ this.AddConstraints (new[] {
+ NSLayoutConstraint.Create (editor, NSLayoutAttribute.Top, NSLayoutRelation.Equal, this, NSLayoutAttribute.Top, 1f, 1f),
+ NSLayoutConstraint.Create (editor, NSLayoutAttribute.Width, NSLayoutRelation.Equal, this, NSLayoutAttribute.Width, 1f, -34f),
+ NSLayoutConstraint.Create (editor, NSLayoutAttribute.Height, NSLayoutRelation.Equal, 1f, DefaultControlHeight - 3),
+ });
+
+ UpdateTheme ();
+ }
+
+ public override NSView FirstKeyView => editor;
+ public override NSView LastKeyView => editor;
+
+ protected override void UpdateValue ()
+ {
+ editor.StringValue = ViewModel.Value.ToString ();
+ }
+
+ protected override void HandleErrorsChanged (object sender, System.ComponentModel.DataErrorsChangedEventArgs e)
+ {
+ UpdateErrorsDisplayed (ViewModel.GetErrors (ViewModel.Property.Name));
+ }
+
+ protected override void UpdateErrorsDisplayed (IEnumerable errors)
+ {
+ if (ViewModel.HasErrors) {
+ SetErrors (errors);
+ } else {
+ SetErrors (null);
+ SetEnabled ();
+ }
+ }
+
+ protected override void SetEnabled ()
+ {
+ editor.Editable = ViewModel.Property.CanWrite;
+ }
+
+ protected override void UpdateAccessibilityValues ()
+ {
+ editor.AccessibilityTitle = string.Format (LocalizationResources.AccessibilityChar, ViewModel.Property.Name);
+ }
+ }
+}
diff --git a/Xamarin.PropertyEditing.Mac/Controls/Custom/CharTextField.cs b/Xamarin.PropertyEditing.Mac/Controls/Custom/CharTextField.cs
new file mode 100644
index 0000000..e073997
--- /dev/null
+++ b/Xamarin.PropertyEditing.Mac/Controls/Custom/CharTextField.cs
@@ -0,0 +1,78 @@
+using System;
+using AppKit;
+using Foundation;
+
+namespace Xamarin.PropertyEditing.Mac
+{
+ public class CharTextField : NSTextField
+ {
+ string cachedValueString;
+ NSText CachedCurrentEditor { get; set; }
+
+ public event EventHandler ValidatedEditingEnded;
+
+ public override CoreGraphics.CGSize IntrinsicContentSize => new CoreGraphics.CGSize (30, 20);
+
+ public CharTextField ()
+ {
+ BackgroundColor = NSColor.Clear;
+ ControlSize = NSControlSize.Small;
+ StringValue = string.Empty;
+ TranslatesAutoresizingMaskIntoConstraints = false;
+ }
+
+ public override bool ShouldBeginEditing (NSText textObject)
+ {
+ CachedCurrentEditor = textObject;
+ cachedValueString = textObject.Value;
+ CachedCurrentEditor.Delegate = new CharValidationDelegate (this);
+ return true;
+ }
+
+ public virtual void NotifyValidatedEditingEnded ()
+ {
+ ValidatedEditingEnded?.Invoke (this, EventArgs.Empty);
+ }
+
+ public virtual void ResetInvalidInput ()
+ {
+ this.StringValue = cachedValueString;
+ }
+ }
+
+ public class CharValidationDelegate : NSTextViewDelegate
+ {
+ readonly CharTextField textField;
+
+ public CharValidationDelegate (CharTextField textField)
+ {
+ this.textField = textField;
+ }
+
+ public override bool TextShouldBeginEditing (NSText textObject)
+ {
+ return textField.ShouldBeginEditing (textObject);
+ }
+
+ public override bool TextShouldEndEditing (NSText textObject)
+ {
+ var shouldEndEditing = false;
+
+ if (!char.TryParse (textObject.Value, out var result)) {
+ textField.ResetInvalidInput ();
+ AppKitFramework.NSBeep ();
+ textField.ShouldEndEditing (textObject);
+ } else {
+ shouldEndEditing = textField.ShouldEndEditing (textObject);
+ }
+
+ return shouldEndEditing;
+ }
+
+ public override void TextDidEndEditing (NSNotification notification)
+ {
+ textField.NotifyValidatedEditingEnded ();
+ textField.DidEndEditing (notification);
+ }
+ }
+}
diff --git a/Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs b/Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs
index f3f2afd..135d8bf 100644
--- a/Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs
+++ b/Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs
@@ -36,6 +36,7 @@ namespace Xamarin.PropertyEditing.Mac
}
private static readonly Dictionary<Type, Type> ViewModelTypes = new Dictionary<Type, Type> {
+ {typeof (PropertyViewModel<char>), typeof (CharEditorControl)},
{typeof (StringPropertyViewModel), typeof (StringEditorControl)},
{typeof (NumericPropertyViewModel<>), typeof (NumericEditorControl<>)},
{typeof (PropertyViewModel<bool?>), typeof (BooleanEditorControl)},
diff --git a/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs b/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs
index 1a4f713..552f444 100644
--- a/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs
+++ b/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs
@@ -83,6 +83,12 @@ namespace Xamarin.PropertyEditing.Mac.Resources {
}
}
+ internal static string AccessibilityChar {
+ get {
+ return ResourceManager.GetString("AccessibilityChar", resourceCulture);
+ }
+ }
+
internal static string AccessibilityString {
get {
return ResourceManager.GetString("AccessibilityString", resourceCulture);
diff --git a/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx b/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx
index 9f97d73..6c1acaa 100644
--- a/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx
+++ b/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx
@@ -36,6 +36,10 @@
<value>{0} Combobox Editor</value>
<comment>Editor for Combobox Value</comment>
</data>
+ <data name="AccessibilityChar" xml:space="preserve">
+ <value>{0} Char Editor</value>
+ <comment>Editor for Char Value</comment>
+ </data>
<data name="AccessibilityString" xml:space="preserve">
<value>{0} String Editor</value>
<comment>Editor for String Value</comment>
diff --git a/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj b/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj
index c2dc90d..0593dd2 100644
--- a/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj
+++ b/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj
@@ -143,6 +143,8 @@
<Compile Include="PropertyInlinePreviewSelector.cs" />
<Compile Include="Controls\EditorContainer.cs" />
<Compile Include="Controls\Layout.cs" />
+ <Compile Include="Controls\CharEditorControl.cs" />
+ <Compile Include="Controls\Custom\CharTextField.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Controls\" />
diff --git a/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs b/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs
index c724cc1..29541db 100644
--- a/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs
+++ b/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs
@@ -10,6 +10,7 @@ namespace Xamarin.PropertyEditing.Tests.MockControls
{
public MockSampleControl ()
{
+ AddProperty<char> ("Char", ReadWrite, valueSources: ValueSources.Local | ValueSources.Resource | ValueSources.Binding);
AddProperty<bool> ("Boolean", ReadWrite, valueSources: ValueSources.Local | ValueSources.Resource | ValueSources.Binding);
AddProperty<bool> ("UnsetBoolean", ReadWrite, valueSources: ValueSources.Local);
AddProperty<int> ("Integer", ReadWrite);
diff --git a/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs b/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs
index 0ee785b..e50aafb 100644
--- a/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs
+++ b/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs
@@ -597,6 +597,7 @@ namespace Xamarin.PropertyEditing.ViewModels
} = new AsyncWorkQueue();
private static readonly Dictionary<Type, Func<TargetPlatform, IPropertyInfo, IEnumerable<IObjectEditor>, PropertyVariation, PropertyViewModel>> ViewModelMap = new Dictionary<Type, Func<TargetPlatform, IPropertyInfo, IEnumerable<IObjectEditor>, PropertyVariation, PropertyViewModel>> {
+ { typeof(char), (tp,p,e,v) => new PropertyViewModel<char> (tp, p, e, v) },
{ typeof(string), (tp,p,e,v) => new StringPropertyViewModel (tp, p, e, v) },
{ typeof(bool), (tp,p,e,v) => new PropertyViewModel<bool?> (tp, p, e, v) },
{ typeof(float), (tp,p,e,v) => new NumericPropertyViewModel<float?> (tp, p, e, v) },