|
@@ -0,0 +1,184 @@
|
|
|
+using System;
|
|
|
+using System.Collections;
|
|
|
+using System.Collections.Specialized;
|
|
|
+using InABox.Core;
|
|
|
+using Xamarin.Forms;
|
|
|
+using Xamarin.Forms.Xaml;
|
|
|
+
|
|
|
+namespace InABox.Mobile
|
|
|
+{
|
|
|
+
|
|
|
+
|
|
|
+ [XamlCompilation(XamlCompilationOptions.Compile)]
|
|
|
+ public partial class MobileListView
|
|
|
+ {
|
|
|
+
|
|
|
+ public static readonly BindableProperty PullToRefreshProperty = BindableProperty.Create(
|
|
|
+ nameof(PullToRefresh),
|
|
|
+ typeof(bool),
|
|
|
+ typeof(MobileCollectionView),
|
|
|
+ false);
|
|
|
+
|
|
|
+ public bool PullToRefresh
|
|
|
+ {
|
|
|
+ get => (bool)GetValue(PullToRefreshProperty);
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetValue(PullToRefreshProperty,value);
|
|
|
+ _refresher.IsEnabled = value;
|
|
|
+ UpdateSummaryRow();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private DataTemplate _itemTemplate;
|
|
|
+ public DataTemplate ItemTemplate
|
|
|
+ {
|
|
|
+ get => _itemTemplate;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ _itemTemplate = value;
|
|
|
+ _list.ItemTemplate = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public IEnumerable ItemsSource
|
|
|
+ {
|
|
|
+ get => _list.ItemsSource;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ if (_list.ItemsSource is INotifyCollectionChanged old)
|
|
|
+ old.CollectionChanged -= ItemsSourceChanged;
|
|
|
+ _list.ItemsSource = value;
|
|
|
+ CheckChanged();
|
|
|
+ if (value is INotifyCollectionChanged observable)
|
|
|
+ observable.CollectionChanged += ItemsSourceChanged;
|
|
|
+ UpdateSummaryRow();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static readonly BindableProperty LastUpdatedProperty = BindableProperty.Create(
|
|
|
+ nameof(LastUpdated),
|
|
|
+ typeof(DateTime),
|
|
|
+ typeof(MobileCollectionView));
|
|
|
+
|
|
|
+ public DateTime LastUpdated
|
|
|
+ {
|
|
|
+ get => (DateTime)GetValue(LastUpdatedProperty);
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetValue(LastUpdatedProperty,value);
|
|
|
+ UpdateSummaryRow();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static readonly BindableProperty ShowRecordCountProperty = BindableProperty.Create(
|
|
|
+ nameof(ShowRecordCount),
|
|
|
+ typeof(bool),
|
|
|
+ typeof(MobileCollectionView),
|
|
|
+ false);
|
|
|
+
|
|
|
+ public bool ShowRecordCount
|
|
|
+ {
|
|
|
+ get => (bool)GetValue(ShowRecordCountProperty);
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetValue(ShowRecordCountProperty,value);
|
|
|
+ UpdateSummaryRow();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static readonly BindableProperty EmptyTextProperty = BindableProperty.Create(
|
|
|
+ nameof(EmptyText),
|
|
|
+ typeof(string),
|
|
|
+ typeof(MobileCollectionView),
|
|
|
+ "No Data Available");
|
|
|
+
|
|
|
+ public string EmptyText
|
|
|
+ {
|
|
|
+ get => (string)GetValue(EmptyTextProperty);
|
|
|
+ set => SetValue(EmptyTextProperty,value);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void UpdateSummaryRow()
|
|
|
+ {
|
|
|
+ Device.BeginInvokeOnMainThread(() =>
|
|
|
+ {
|
|
|
+ _lastupdate.IsVisible = !LastUpdated.IsEmpty();
|
|
|
+ _lastupdate.Text = $"{DateTimeToAgeConverter.FormatTime(LastUpdated)}";
|
|
|
+ _pulltorefresh.IsVisible = PullToRefresh;
|
|
|
+ int count = (ItemsSource as IList)?.Count ?? 0;
|
|
|
+ _numrecords.Text = $"{count} record{(count == 1 ? "" : "s")}";
|
|
|
+ _numrecords.IsVisible = ShowRecordCount && ItemsSource is IList;
|
|
|
+ _refreshcard.IsVisible = /*_lastupdate.IsVisible || */ _pulltorefresh.IsVisible || _numrecords.IsVisible;
|
|
|
+ //_emptylist.IsVisible = !ShowRecordCount;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private void ItemsSourceChanged(object sender, NotifyCollectionChangedEventArgs e)
|
|
|
+ {
|
|
|
+ CheckChanged();
|
|
|
+ UpdateSummaryRow();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void CheckChanged()
|
|
|
+ {
|
|
|
+ //_list.IsVisible = ItemsSource?.GetEnumerator().MoveNext() == true;
|
|
|
+ //_nodata.IsVisible = !_list.IsVisible;
|
|
|
+ }
|
|
|
+
|
|
|
+ private double _spacing;
|
|
|
+ public double Spacing
|
|
|
+ {
|
|
|
+ get => _spacing;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ _spacing = value;
|
|
|
+ //var layout = _list?.ItemsLayout as LinearItemsLayout;
|
|
|
+ //if (layout != null)
|
|
|
+ // layout.ItemSpacing = _spacing;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private bool _unevenrows;
|
|
|
+ public bool HasUnevenRows
|
|
|
+ {
|
|
|
+ get => _unevenrows;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ _unevenrows = value;
|
|
|
+ if (_list != null)
|
|
|
+ // _list.ItemSizingStrategy =
|
|
|
+ // value
|
|
|
+ // ? ItemSizingStrategy.MeasureAllItems
|
|
|
+ // : ItemSizingStrategy.MeasureFirstItem;
|
|
|
+ _list.HasUnevenRows = value;
|
|
|
+ //_list.AutoFitMode = value ? AutoFitMode.DynamicHeight : AutoFitMode.None;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public event MobileListRefreshEvent RefreshRequested;
|
|
|
+
|
|
|
+ public MobileListView()
|
|
|
+ {
|
|
|
+ InitializeComponent();
|
|
|
+ _refresher.Command = new Command(DoRefresh);
|
|
|
+ Spacing = 5;
|
|
|
+ HasUnevenRows = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void DoRefresh(object sender)
|
|
|
+ {
|
|
|
+ if (_refresher != null)
|
|
|
+ {
|
|
|
+ //var src = _list.ItemsSource;
|
|
|
+ _list.ItemsSource = null;
|
|
|
+ _refresher.IsRefreshing = true;
|
|
|
+ RefreshRequested?.Invoke(sender, new MobileListRefreshEventArgs());
|
|
|
+ _refresher.IsRefreshing = false;
|
|
|
+ //_list.ItemsSource = src;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|