diff options
Diffstat (limited to 'Xamarin.Forms.Platform.MacOS/Renderers/ListViewRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.MacOS/Renderers/ListViewRenderer.cs | 342 |
1 files changed, 0 insertions, 342 deletions
diff --git a/Xamarin.Forms.Platform.MacOS/Renderers/ListViewRenderer.cs b/Xamarin.Forms.Platform.MacOS/Renderers/ListViewRenderer.cs deleted file mode 100644 index 2c80dec9..00000000 --- a/Xamarin.Forms.Platform.MacOS/Renderers/ListViewRenderer.cs +++ /dev/null @@ -1,342 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Specialized; -using System.ComponentModel; -using System.Linq; -using AppKit; -using Foundation; -using Xamarin.Forms.Internals; - -namespace Xamarin.Forms.Platform.MacOS -{ - public class ListViewRenderer : ViewRenderer<ListView, NSView> - { - bool _disposed; - NSTableView _table; - ListViewDataSource _dataSource; - IVisualElementRenderer _headerRenderer; - IVisualElementRenderer _footerRenderer; - - IListViewController Controller => Element; - - ITemplatedItemsView<Cell> TemplatedItemsView => Element; - - public const int DefaultRowHeight = 44; - - public NSTableView NativeTableView => _table; - - public override void ViewWillDraw() - { - UpdateHeader(); - base.ViewWillDraw(); - } - - protected virtual NSTableView CreateNSTableView(ListView list) - { - NSTableView table = new FormsNSTableView().AsListViewLook(); - table.Source = _dataSource = new ListViewDataSource(list, table); - return table; - } - - protected override void Dispose(bool disposing) - { - if (disposing && !_disposed) - { - _disposed = true; - - var viewsToLookAt = new Stack<NSView>(Subviews); - while (viewsToLookAt.Count > 0) - { - var view = viewsToLookAt.Pop(); - var viewCellRenderer = view as ViewCellNSView; - if (viewCellRenderer != null) - viewCellRenderer.Dispose(); - else - { - foreach (var child in view.Subviews) - viewsToLookAt.Push(child); - } - } - - if (Element != null) - { - var templatedItems = TemplatedItemsView.TemplatedItems; - templatedItems.CollectionChanged -= OnCollectionChanged; - templatedItems.GroupedCollectionChanged -= OnGroupedCollectionChanged; - } - } - - if (disposing) - { - ClearHeader(); - if (_footerRenderer != null) - { - Platform.DisposeModelAndChildrenRenderers(_footerRenderer.Element); - _footerRenderer = null; - } - } - - base.Dispose(disposing); - } - - protected override void SetBackgroundColor(Color color) - { - base.SetBackgroundColor(color); - if (_table == null) - return; - - _table.BackgroundColor = color.ToNSColor(NSColor.White); - } - - protected override void OnElementChanged(ElementChangedEventArgs<ListView> e) - { - if (e.OldElement != null) - { - var controller = (IListViewController)e.OldElement; - controller.ScrollToRequested -= OnScrollToRequested; - - var templatedItems = ((ITemplatedItemsView<Cell>)e.OldElement).TemplatedItems; - templatedItems.CollectionChanged -= OnCollectionChanged; - templatedItems.GroupedCollectionChanged -= OnGroupedCollectionChanged; - } - - if (e.NewElement != null) - { - if (Control == null) - { - var scroller = new NSScrollView - { - AutoresizingMask = NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable, - DocumentView = _table = CreateNSTableView(e.NewElement) - }; - SetNativeControl(scroller); - } - - var controller = (IListViewController)e.NewElement; - controller.ScrollToRequested += OnScrollToRequested; - - var templatedItems = ((ITemplatedItemsView<Cell>)e.NewElement).TemplatedItems; - templatedItems.CollectionChanged += OnCollectionChanged; - templatedItems.GroupedCollectionChanged += OnGroupedCollectionChanged; - - UpdateRowHeight(); - UpdateHeader(); - UpdateFooter(); - UpdatePullToRefreshEnabled(); - UpdateIsRefreshing(); - UpdateSeparatorColor(); - UpdateSeparatorVisibility(); - - var selected = e.NewElement.SelectedItem; - if (selected != null) - _dataSource.OnItemSelected(null, new SelectedItemChangedEventArgs(selected)); - } - - base.OnElementChanged(e); - } - - protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) - { - base.OnElementPropertyChanged(sender, e); - if (e.PropertyName == ListView.RowHeightProperty.PropertyName) - UpdateRowHeight(); - else if (e.PropertyName == ListView.IsGroupingEnabledProperty.PropertyName || - (e.PropertyName == ListView.HasUnevenRowsProperty.PropertyName)) - _dataSource.Update(); - else if (e.PropertyName == ListView.IsPullToRefreshEnabledProperty.PropertyName) - UpdatePullToRefreshEnabled(); - else if (e.PropertyName == ListView.IsRefreshingProperty.PropertyName) - UpdateIsRefreshing(); - else if (e.PropertyName == ListView.SeparatorColorProperty.PropertyName) - UpdateSeparatorColor(); - else if (e.PropertyName == ListView.SeparatorVisibilityProperty.PropertyName) - UpdateSeparatorVisibility(); - else if (e.PropertyName == "HeaderElement") - UpdateHeader(); - else if (e.PropertyName == "FooterElement") - UpdateFooter(); - else if (e.PropertyName == "RefreshAllowed") - UpdatePullToRefreshEnabled(); - } - - void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) - { - UpdateItems(e, 0, true); - } - - void OnGroupedCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) - { - var til = (TemplatedItemsList<ItemsView<Cell>, Cell>)sender; - - var templatedItems = TemplatedItemsView.TemplatedItems; - var groupIndex = templatedItems.IndexOf(til.HeaderContent); - UpdateItems(e, groupIndex, false); - } - - void UpdateHeader() - { - var header = Controller.HeaderElement; - var headerView = (View)header; - - if (headerView != null) - { - //Header reuse is not working for now , problem with size of something that is not inside a layout - //if (_headerRenderer != null) - //{ - // if (header != null && _headerRenderer.GetType() == Registrar.Registered.GetHandlerType(header.GetType())) - // { - // _headerRenderer.SetElement(headerView); - // _table.HeaderView = new CustomNSTableHeaderView(Bounds.Width, _headerRenderer); - // // Layout(); - // //var customNSTableHeaderView = _table.HeaderView as CustomNSTableHeaderView; - // //customNSTableHeaderView?.Update(Bounds.Width, _headerRenderer); - // //NativeView.Layout(); - // //NativeView.SetNeedsDisplayInRect(NativeView.Bounds); - // //NativeView.LayoutSubtreeIfNeeded(); - // //_table.LayoutSubtreeIfNeeded(); - // //_table.NeedsDisplay = true; - // //NativeView.NeedsDisplay = true; - // return; - // } - ClearHeader(); - //} - - _headerRenderer = Platform.CreateRenderer(headerView); - Platform.SetRenderer(headerView, _headerRenderer); - _table.HeaderView = new CustomNSTableHeaderView(Bounds.Width, _headerRenderer); - - //We need this since the NSSCrollView doesn't know of the new size of our header - //TODO: Find a better solution - (Control as NSScrollView)?.ContentView.ScrollToPoint(new CoreGraphics.CGPoint(0, -_table.HeaderView.Frame.Height)); - } - else if (_headerRenderer != null) - { - ClearHeader(); - } - } - - void ClearHeader() - { - _table.HeaderView = null; - if (_headerRenderer == null) - return; - Platform.DisposeModelAndChildrenRenderers(_headerRenderer.Element); - _headerRenderer = null; - } - - void UpdateItems(NotifyCollectionChangedEventArgs e, int section, bool resetWhenGrouped) - { - var exArgs = e as NotifyCollectionChangedEventArgsEx; - if (exArgs != null) - _dataSource.Counts[section] = exArgs.Count; - - var groupReset = resetWhenGrouped && Element.IsGroupingEnabled; - - switch (e.Action) - { - case NotifyCollectionChangedAction.Add: - if (e.NewStartingIndex == -1 || groupReset) - goto case NotifyCollectionChangedAction.Reset; - - _table.BeginUpdates(); - _table.InsertRows(NSIndexSet.FromArray(Enumerable.Range(e.NewStartingIndex, e.NewItems.Count).ToArray()), - NSTableViewAnimation.SlideUp); - _table.EndUpdates(); - - break; - - case NotifyCollectionChangedAction.Remove: - if (e.OldStartingIndex == -1 || groupReset) - goto case NotifyCollectionChangedAction.Reset; - - _table.BeginUpdates(); - _table.RemoveRows(NSIndexSet.FromArray(Enumerable.Range(e.OldStartingIndex, e.OldItems.Count).ToArray()), - NSTableViewAnimation.SlideDown); - _table.EndUpdates(); - - break; - - case NotifyCollectionChangedAction.Move: - if (e.OldStartingIndex == -1 || e.NewStartingIndex == -1 || groupReset) - goto case NotifyCollectionChangedAction.Reset; - _table.BeginUpdates(); - for (var i = 0; i < e.OldItems.Count; i++) - { - var oldi = e.OldStartingIndex; - var newi = e.NewStartingIndex; - - if (e.NewStartingIndex < e.OldStartingIndex) - { - oldi += i; - newi += i; - } - - _table.MoveRow(oldi, newi); - } - _table.EndUpdates(); - - break; - - case NotifyCollectionChangedAction.Replace: - case NotifyCollectionChangedAction.Reset: - _table.ReloadData(); - return; - } - } - - void UpdateRowHeight() - { - var rowHeight = Element.RowHeight; - if (Element.HasUnevenRows && rowHeight == -1) - { - // _table.RowHeight = NoIntrinsicMetric; - } - else - _table.RowHeight = rowHeight <= 0 ? DefaultRowHeight : rowHeight; - } - - //TODO: Implement UpdateIsRefreshing - void UpdateIsRefreshing() - { - } - - //TODO: Implement PullToRefresh - void UpdatePullToRefreshEnabled() - { - } - - //TODO: Implement SeparatorColor - void UpdateSeparatorColor() - { - } - - //TODO: Implement UpdateSeparatorVisibility - void UpdateSeparatorVisibility() - { - } - - //TODO: Implement ScrollTo - void OnScrollToRequested(object sender, ScrollToRequestedEventArgs e) - { - } - - //TODO: Implement Footer - void UpdateFooter() - { - } - - class FormsNSTableView : NSTableView - { - //NSTableView doesn't support selection notfications after the items is already selected - //so we do it ourselves by hooking mouse down event - public override void MouseDown(NSEvent theEvent) - { - var clickLocation = ConvertPointFromView(theEvent.LocationInWindow, null); - var clickedRow = GetRow(clickLocation); - - base.MouseDown(theEvent); - if (clickedRow != -1) - (Source as ListViewDataSource)?.OnRowClicked(); - } - } - } -}
\ No newline at end of file |