diff options
Diffstat (limited to 'Xamarin.Forms.Platform.MacOS/Renderers/TableViewRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.MacOS/Renderers/TableViewRenderer.cs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.MacOS/Renderers/TableViewRenderer.cs b/Xamarin.Forms.Platform.MacOS/Renderers/TableViewRenderer.cs new file mode 100644 index 00000000..de447dcb --- /dev/null +++ b/Xamarin.Forms.Platform.MacOS/Renderers/TableViewRenderer.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using System.ComponentModel; +using AppKit; + +namespace Xamarin.Forms.Platform.MacOS +{ + public class TableViewRenderer : ViewRenderer<TableView, NSView> + { + const int DefaultRowHeight = 44; + + internal NSTableView TableView { get; set; } + + public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint) + { + return Control.GetSizeRequest(widthConstraint, heightConstraint, DefaultRowHeight, DefaultRowHeight); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + var viewsToLookAt = new Stack<NSView>(Subviews); + while (viewsToLookAt.Count > 0) + { + var view = viewsToLookAt.Pop(); + var viewCellRenderer = view as IVisualElementRenderer; + if (viewCellRenderer != null) + { + viewCellRenderer.Dispose(); + } + else + { + foreach (var child in view.Subviews) + viewsToLookAt.Push(child); + } + } + } + + base.Dispose(disposing); + } + + protected virtual NSTableView CreateNSTableView(TableView list) + { + return new NSTableView().AsListViewLook(); + } + + protected override void OnElementChanged(ElementChangedEventArgs<TableView> e) + { + if (e.NewElement != null) + { + if (Control == null) + { + var scroller = new NSScrollView + { + AutoresizingMask = NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable, + DocumentView = TableView = CreateNSTableView(e.NewElement) + }; + + SetNativeControl(scroller); + } + + SetSource(); + UpdateRowHeight(); + UpdateBackgroundView(); + } + + base.OnElementChanged(e); + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == Xamarin.Forms.TableView.RowHeightProperty.PropertyName) + UpdateRowHeight(); + else if (e.PropertyName == Xamarin.Forms.TableView.HasUnevenRowsProperty.PropertyName) + SetSource(); + else if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName) + UpdateBackgroundView(); + } + + void SetSource() + { + var modeledView = Element; + TableView.Source = modeledView.HasUnevenRows ? new UnEvenTableViewModelRenderer(this) : new TableViewDataSource(this); + } + + void UpdateBackgroundView() + { + } + + void UpdateRowHeight() + { + var rowHeight = Element.RowHeight; + TableView.RowHeight = rowHeight <= 0 ? DefaultRowHeight : rowHeight; + } + } +}
\ No newline at end of file |