diff options
Diffstat (limited to 'Xamarin.Forms.Platform.MacOS/Cells/EntryCellRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.MacOS/Cells/EntryCellRenderer.cs | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.MacOS/Cells/EntryCellRenderer.cs b/Xamarin.Forms.Platform.MacOS/Cells/EntryCellRenderer.cs new file mode 100644 index 00000000..43789dcc --- /dev/null +++ b/Xamarin.Forms.Platform.MacOS/Cells/EntryCellRenderer.cs @@ -0,0 +1,144 @@ +using System; +using System.ComponentModel; +using AppKit; +using CoreGraphics; +using Foundation; + +namespace Xamarin.Forms.Platform.MacOS +{ + public class EntryCellRenderer : CellRenderer + { + static readonly Color s_defaultTextColor = Color.Black; + + public override NSView GetCell(Cell item, NSView reusableView, NSTableView tv) + { + NSTextField nsEntry = null; + var tvc = reusableView as CellNSView; + if (tvc == null) + tvc = new CellNSView(NSTableViewCellStyle.Value2); + else + { + tvc.Cell.PropertyChanged -= OnCellPropertyChanged; + + nsEntry = tvc.AccessoryView.Subviews[0] as NSTextField; + if (nsEntry != null) + { + nsEntry.RemoveFromSuperview(); + nsEntry.Changed -= OnTextFieldTextChanged; + } + } + + SetRealCell(item, tvc); + + if (nsEntry == null) + tvc.AccessoryView.AddSubview(nsEntry = new NSTextField()); + + var entryCell = (EntryCell)item; + + tvc.Cell = item; + tvc.Cell.PropertyChanged += OnCellPropertyChanged; + nsEntry.Changed += OnTextFieldTextChanged; + + WireUpForceUpdateSizeRequested(item, tvc, tv); + + UpdateBackground(tvc, entryCell); + UpdateLabel(tvc, entryCell); + UpdateText(tvc, entryCell); + UpdatePlaceholder(tvc, entryCell); + UpdateLabelColor(tvc, entryCell); + UpdateHorizontalTextAlignment(tvc, entryCell); + UpdateIsEnabled(tvc, entryCell); + + return tvc; + } + + internal override void UpdateBackgroundChild(Cell cell, NSColor backgroundColor) + { + var realCell = (CellNSView)GetRealCell(cell); + + var nsTextField = realCell.AccessoryView.Subviews[0] as NSTextField; + if (nsTextField != null) + nsTextField.BackgroundColor = backgroundColor; + + base.UpdateBackgroundChild(cell, backgroundColor); + } + + static void OnCellPropertyChanged(object sender, PropertyChangedEventArgs e) + { + var entryCell = (EntryCell)sender; + var realCell = (CellNSView)GetRealCell(entryCell); + + if (e.PropertyName == EntryCell.LabelProperty.PropertyName) + UpdateLabel(realCell, entryCell); + else if (e.PropertyName == EntryCell.TextProperty.PropertyName) + UpdateText(realCell, entryCell); + else if (e.PropertyName == EntryCell.PlaceholderProperty.PropertyName) + UpdatePlaceholder(realCell, entryCell); + else if (e.PropertyName == EntryCell.LabelColorProperty.PropertyName) + UpdateLabelColor(realCell, entryCell); + else if (e.PropertyName == EntryCell.HorizontalTextAlignmentProperty.PropertyName) + UpdateHorizontalTextAlignment(realCell, entryCell); + else if (e.PropertyName == Cell.IsEnabledProperty.PropertyName) + UpdateIsEnabled(realCell, entryCell); + } + + static void OnTextFieldTextChanged(object sender, EventArgs eventArgs) + { + var notification = (NSNotification)sender; + var view = (NSView)notification.Object; + var field = (NSTextField)view; + + CellNSView realCell = null; + while (view.Superview != null && realCell == null) + { + view = view.Superview; + realCell = view as CellNSView; + } + + if (realCell != null) + ((EntryCell)realCell.Cell).Text = field.StringValue; + } + + static void UpdateHorizontalTextAlignment(CellNSView cell, EntryCell entryCell) + { + var nsTextField = cell.AccessoryView.Subviews[0] as NSTextField; + if (nsTextField != null) + nsTextField.Alignment = entryCell.HorizontalTextAlignment.ToNativeTextAlignment(); + } + + static void UpdateIsEnabled(CellNSView cell, EntryCell entryCell) + { + cell.TextLabel.Enabled = entryCell.IsEnabled; + var nsTextField = cell.AccessoryView.Subviews[0] as NSTextField; + if (nsTextField != null) + nsTextField.Enabled = entryCell.IsEnabled; + } + + static void UpdateLabel(CellNSView cell, EntryCell entryCell) + { + cell.TextLabel.StringValue = entryCell.Label ?? ""; + } + + static void UpdateLabelColor(CellNSView cell, EntryCell entryCell) + { + cell.TextLabel.TextColor = entryCell.LabelColor.ToNSColor(s_defaultTextColor); + } + + static void UpdatePlaceholder(CellNSView cell, EntryCell entryCell) + { + var nsTextField = cell.AccessoryView.Subviews[0] as NSTextField; + if (nsTextField != null) + nsTextField.PlaceholderString = entryCell.Placeholder ?? ""; + } + + static void UpdateText(CellNSView cell, EntryCell entryCell) + { + var nsTextField = cell.AccessoryView.Subviews[0] as NSTextField; + if (nsTextField != null && nsTextField.StringValue == entryCell.Text) + return; + + if (nsTextField != null) + nsTextField.StringValue = entryCell.Text ?? ""; + } + } +}
\ No newline at end of file |