diff options
Diffstat (limited to 'Xamarin.PropertyEditing.Mac/Controls/BindingEditor/BindingObjectSelectorControl.cs')
-rw-r--r-- | Xamarin.PropertyEditing.Mac/Controls/BindingEditor/BindingObjectSelectorControl.cs | 223 |
1 files changed, 45 insertions, 178 deletions
diff --git a/Xamarin.PropertyEditing.Mac/Controls/BindingEditor/BindingObjectSelectorControl.cs b/Xamarin.PropertyEditing.Mac/Controls/BindingEditor/BindingObjectSelectorControl.cs index 9022c37..8e82477 100644 --- a/Xamarin.PropertyEditing.Mac/Controls/BindingEditor/BindingObjectSelectorControl.cs +++ b/Xamarin.PropertyEditing.Mac/Controls/BindingEditor/BindingObjectSelectorControl.cs @@ -6,206 +6,73 @@ using Xamarin.PropertyEditing.ViewModels; namespace Xamarin.PropertyEditing.Mac { - internal class BindingObjectSelectorControl : NSView + internal class BindingObjectSelectorControl + : NotifyingView<CreateBindingViewModel> { - internal class ObjectOutlineView : NSOutlineView - { - private IReadOnlyList<ObjectTreeElement> viewModel; - public IReadOnlyList<ObjectTreeElement> ViewModel { - get => this.viewModel; - set { - if (this.viewModel != value) { - this.viewModel = value; - var dataSource = new ObjectOutlineViewDataSource (this.viewModel); - Delegate = new ObjectOutlineViewDelegate (dataSource); - DataSource = dataSource; - } - - if (this.viewModel != null) { - ReloadData (); - - ExpandItem (null, true); - } - } - } + private ObjectOutlineView objectOutlineView; - public ObjectOutlineView () - { - Initialize (); - } + private const string ObjectSelectorColId = "ObjectSelectorColumn"; - // Called when created from unmanaged code - public ObjectOutlineView (IntPtr handle) : base (handle) - { - Initialize (); - } + internal BindingObjectSelectorControl (CreateBindingViewModel viewModel) + { + if (viewModel == null) + throw new ArgumentNullException (nameof (viewModel)); - // Called when created directly from a XIB file - [Export ("initWithCoder:")] - public ObjectOutlineView (NSCoder coder) : base (coder) - { - Initialize (); - } + ViewModel = viewModel; - [Export ("validateProposedFirstResponder:forEvent:")] - public bool ValidateProposedFirstResponder (NSResponder responder, NSEvent forEvent) - { - return true; - } + this.objectOutlineView = new ObjectOutlineView (); + TranslatesAutoresizingMaskIntoConstraints = false; - public void Initialize () - { - AutoresizingMask = NSViewResizingMask.WidthSizable; - HeaderView = null; - TranslatesAutoresizingMaskIntoConstraints = false; - } - } + this.objectOutlineView.Activated += OnObjectOutlineViewSelected; - internal class ObjectOutlineViewDelegate : NSOutlineViewDelegate - { - private ObjectOutlineViewDataSource dataSource; + var resourceColumn = new NSTableColumn (ObjectSelectorColId); + this.objectOutlineView.AddColumn (resourceColumn); - public ObjectOutlineViewDelegate (ObjectOutlineViewDataSource dataSource) - { - this.dataSource = dataSource; - } + // Set OutlineTableColumn or the arrows showing children/expansion will not be drawn + this.objectOutlineView.OutlineTableColumn = resourceColumn; - public override nfloat GetRowHeight (NSOutlineView outlineView, NSObject item) - { - return PropertyEditorControl.DefaultControlHeight; - } + // create a table view and a scroll view + var outlineViewContainer = new NSScrollView { + TranslatesAutoresizingMaskIntoConstraints = false, + }; - public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) - { - var labelContainer = (UnfocusableTextField)outlineView.MakeView ("type", this); - if (labelContainer == null) { - labelContainer = new UnfocusableTextField { - Identifier = "type", - }; - } - var target = (item as NSObjectFacade).Target; - - switch (target) { - case KeyValuePair<string, SimpleCollectionView> kvp: - labelContainer.StringValue = kvp.Key; - break; - case TypeInfo info: - labelContainer.StringValue = info.Name; - break; - default: - labelContainer.StringValue = "Type Not Supported"; - break; - } + // add the panel to the window + outlineViewContainer.DocumentView = this.objectOutlineView; + AddSubview (outlineViewContainer); - return labelContainer; - } + AddConstraints (new[] { + NSLayoutConstraint.Create (outlineViewContainer, NSLayoutAttribute.Top, NSLayoutRelation.Equal, this, NSLayoutAttribute.Top, 1f, 28f), + NSLayoutConstraint.Create (outlineViewContainer, NSLayoutAttribute.Width, NSLayoutRelation.Equal, this, NSLayoutAttribute.Width, 1f, 0f), + NSLayoutConstraint.Create (outlineViewContainer, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal, this, NSLayoutAttribute.CenterX, 1, 0), + NSLayoutConstraint.Create (outlineViewContainer, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal,this, NSLayoutAttribute.Bottom, 1f, 0f), + }); - public override bool ShouldSelectItem (NSOutlineView outlineView, NSObject item) - { - var target = (item as NSObjectFacade).Target; - switch (target) { - case KeyValuePair<string, SimpleCollectionView> kvp: - return false; - case TypeInfo info: - return true; - - default: - return false; - } - } + viewModel.PropertyChanged += OnPropertyChanged; } - internal class ObjectOutlineViewDataSource : NSOutlineViewDataSource + public override void OnPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e) { - public IReadOnlyList<ObjectTreeElement> ViewModel { get; } - - internal ObjectOutlineViewDataSource (IReadOnlyList<ObjectTreeElement> viewModel) - { - if (viewModel == null) - throw new ArgumentNullException (nameof (viewModel)); - - ViewModel = viewModel; - } - - public override nint GetChildrenCount (NSOutlineView outlineView, NSObject item) - { - var childCount = 0; - if (item == null) { - childCount = this.ViewModel != null ? this.ViewModel.Count () : 0; - } else { - var target = (item as NSObjectFacade).Target; - switch (target) { - case KeyValuePair<string, SimpleCollectionView> kvp: - childCount = kvp.Value.Count; - break; - case TypeInfo info: - childCount = 0; - break; - default: - childCount = 0; - break; - } - } + if (e.PropertyName == nameof (CreateBindingViewModel.ShowObjectSelector)) { + Hidden = !ViewModel.ShowObjectSelector; - return childCount; + if (ViewModel.ShowObjectSelector && ViewModel.ObjectElementRoots != null) { + this.objectOutlineView.ItemsSource = ViewModel.ObjectElementRoots.Value; + }; } + } - public override NSObject GetChild (NSOutlineView outlineView, nint childIndex, NSObject item) - { - object element; - - if (item == null) { - element = this.ViewModel.ElementAt ((int)childIndex); - } else { - var target = (item as NSObjectFacade).Target; - switch (target) { - case KeyValuePair<string, SimpleCollectionView> kvp: - element = kvp.Value[(int)childIndex]; - break; - case TypeInfo info: - element = info; - break; - default: - return null; + private void OnObjectOutlineViewSelected (object sender, EventArgs e) + { + if (sender is ObjectOutlineView rov) { + if (rov.SelectedRow != -1) { + if (rov.ItemAtRow (rov.SelectedRow) is NSObjectFacade item) { + if (item.Target is Resource resource) { + ViewModel.SelectedResource = resource; + } } } - - return new NSObjectFacade (element); - } - - public override bool ItemExpandable (NSOutlineView outlineView, NSObject item) - { - var target = (item as NSObjectFacade).Target; - switch (target) { - case KeyValuePair<string, SimpleCollectionView> kvp: - return kvp.Value.Count > 0; - case TypeInfo info: - return false; - default: - return false; - } } } - internal ObjectOutlineView objectOutlineView; - - internal BindingObjectSelectorControl (CreateBindingViewModel viewModel) - { - if (viewModel == null) - throw new ArgumentNullException (nameof (viewModel)); - - this.objectOutlineView = new ObjectOutlineView (); - TranslatesAutoresizingMaskIntoConstraints = false; - - viewModel.PropertyChanged += (sender, e) => { - if (e.PropertyName == nameof (CreateBindingViewModel.ShowObjectSelector)) { - Hidden = !viewModel.ShowObjectSelector; - - if (viewModel.ShowObjectSelector && viewModel.ObjectElementRoots != null) { - this.objectOutlineView.ViewModel = viewModel.ObjectElementRoots.Value; - }; - } - }; - } } } |