diff options
author | Dominique Louis <dominique@WIN-KPIF3KAALP6.redmond.corp.microsoft.com> | 2018-11-11 21:35:45 +0300 |
---|---|---|
committer | Dominique Louis <dominique@WIN-KPIF3KAALP6.redmond.corp.microsoft.com> | 2018-11-11 21:35:45 +0300 |
commit | 48c9c947c11b21a8693e39975bc90d2159443cd3 (patch) | |
tree | 5a3ba2acc0159ae715095b33628f20ba40372b02 | |
parent | a21015d882bc6150e2a506ea1d82d22cdae8ee80 (diff) |
[Mac] Refactor to use Custom NSComboBox as it has built in Complete.dominique-Autocompletion2
3 files changed, 65 insertions, 22 deletions
diff --git a/Xamarin.PropertyEditing.Mac/Controls/Custom/AutocompleteComboBox.cs b/Xamarin.PropertyEditing.Mac/Controls/Custom/AutocompleteComboBox.cs new file mode 100644 index 0000000..6daca51 --- /dev/null +++ b/Xamarin.PropertyEditing.Mac/Controls/Custom/AutocompleteComboBox.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using AppKit; +using Foundation; +using Xamarin.PropertyEditing.ViewModels; + +namespace Xamarin.PropertyEditing.Mac.Controls +{ + internal class AutocompleteComboBox<T> : NSComboBox + { + protected PropertyViewModel<T> viewModel; + + public AutocompleteComboBox (PropertyViewModel<T> viewModel) + { + if (viewModel == null) + throw new ArgumentNullException (nameof (viewModel)); + + // This triggers autocomplete on items + Completes = true; + + // Maximum number of items in the drop-down before scrolling kicks in. + VisibleItems = 8; + + this.viewModel = viewModel; + + // It should be null, but belts and braces + if (this.viewModel.AutocompleteItems != null) { + PopulateComboBoxItems (); + } + } + + private void PopulateComboBoxItems () + { + RemoveAll (); + + foreach (var item in this.viewModel.AutocompleteItems) { + Add (new NSString (item)); + } + } + } +} diff --git a/Xamarin.PropertyEditing.Mac/Controls/CustomExpressionView.cs b/Xamarin.PropertyEditing.Mac/Controls/CustomExpressionView.cs index 3c6942b..960eb03 100644 --- a/Xamarin.PropertyEditing.Mac/Controls/CustomExpressionView.cs +++ b/Xamarin.PropertyEditing.Mac/Controls/CustomExpressionView.cs @@ -4,42 +4,43 @@ using AppKit; using CoreGraphics; using Foundation; using ObjCRuntime; +using Xamarin.PropertyEditing.Mac.Controls; using Xamarin.PropertyEditing.ViewModels; namespace Xamarin.PropertyEditing.Mac { - internal class CustomExpressionView : BasePopOverViewModelControl + internal class CustomExpressionView<T> : BasePopOverViewModelControl { - Type vmType; - const string CustomExpressionPropertyString = "CustomExpression"; - PropertyInfo customExpressionPropertyInfo; - - public CustomExpressionView (PropertyViewModel viewModel) : base (viewModel, Properties.Resources.CustomExpression, "custom-expression-32") + public CustomExpressionView (PropertyViewModel<T> viewModel) : base (viewModel, Properties.Resources.CustomExpression, "custom-expression-32") { Frame = new CGRect (CGPoint.Empty, new CGSize (250, 80)); - var customExpressionField = new NSTextField { - StringValue = string.Empty, - TranslatesAutoresizingMaskIntoConstraints = false, - }; + NSControl editorControl; + + viewModel.PreviewCustomExpression = string.Empty; + if (viewModel.AutocompleteItems != null && viewModel.AutocompleteItems.Count > 0) { + editorControl = new AutocompleteComboBox<T> (viewModel) { + TranslatesAutoresizingMaskIntoConstraints = false, + }; + } else { + editorControl = new NSTextField { + TranslatesAutoresizingMaskIntoConstraints = false, + }; + } - vmType = viewModel.GetType (); - customExpressionPropertyInfo = vmType.GetProperty (CustomExpressionPropertyString); - var value = customExpressionPropertyInfo.GetValue (viewModel); - if (value != null) - customExpressionField.StringValue = (string)value; + editorControl.StringValue = viewModel.CustomExpression ?? string.Empty; - customExpressionField.Activated += (sender, e) => { - customExpressionPropertyInfo.SetValue (viewModel, customExpressionField.StringValue); + editorControl.Activated += (sender, e) => { + viewModel.CustomExpression = editorControl.StringValue; }; - AddSubview (customExpressionField); + AddSubview (editorControl); this.DoConstraints (new[] { - customExpressionField.ConstraintTo (this, (s, c) => s.Top == c.Top + 37), - customExpressionField.ConstraintTo (this, (s, c) => s.Left == c.Left + 38), - customExpressionField.ConstraintTo (this, (s, c) => s.Width == c.Width - 57), - customExpressionField.ConstraintTo (this, (s, c) => s.Height == 24), + editorControl.ConstraintTo (this, (s, c) => s.Top == c.Top + 37), + editorControl.ConstraintTo (this, (s, c) => s.Left == c.Left + 38), + editorControl.ConstraintTo (this, (s, c) => s.Width == c.Width - 57), + editorControl.ConstraintTo (this, (s, c) => s.Height == 24), }); } } diff --git a/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj b/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj index 7775f3e..894e92f 100644 --- a/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj +++ b/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj @@ -136,6 +136,7 @@ <Compile Include="Controls\RequestResource\RequestResourcePreviewPanel.cs" />
<Compile Include="Controls\PanelHeaderEditorControl.cs" />
<Compile Include="Controls\ThicknessEditorControl.cs" />
+ <Compile Include="Controls\Custom\AutocompleteComboBox.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Controls\" />
|