172 lines
5.5 KiB
C#
172 lines
5.5 KiB
C#
using Sarand.Net.Standard.Base.Core;
|
|
using Sarand.Net.Standard.Base.Bus;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using Xamarin.Forms;
|
|
using Sarand.Net.Standard.Base.Utils;
|
|
|
|
namespace Sarand.Net.Standard.Mobile.Forms.Controls
|
|
{
|
|
//=======================================================================
|
|
public class SaxPicker : Picker
|
|
{
|
|
//-------------------------------------------------------------------
|
|
// Definitions.
|
|
public class SlmPickerItem
|
|
{
|
|
public SysId Id { get; set; } = new SysId();
|
|
public String Code { get; set; } = "";
|
|
public String Caption { get; set; } = "";
|
|
public Object Object { get; set; }
|
|
public override string ToString ()
|
|
{
|
|
return Caption;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Data members.
|
|
private readonly List<SlmPickerItem> pickerItems = new List<SlmPickerItem>();
|
|
|
|
//-------------------------------------------------------------------
|
|
// Construction.
|
|
public SaxPicker ()
|
|
{
|
|
DefaultFontSize = FontSize;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Properties.
|
|
public double DefaultFontSize { get; }
|
|
public bool BeingPopulated { get; protected set; } = false;
|
|
|
|
//-------------------------------------------------------------------
|
|
// P o p u l a t e I t e m s
|
|
//-------------------------------------------------------------------
|
|
/// <summary>
|
|
/// Does the list contain an item with the same Id.
|
|
/// <para>NB Invalid Id values are matched.</para>
|
|
/// </summary>
|
|
public bool ContainsItemId (SysId id)
|
|
{
|
|
return pickerItems.Exists(item => SysId.ToInt(item.Id) == SysId.ToInt(id));
|
|
}
|
|
/// <summary>
|
|
/// Does the list contain an item with the same code.
|
|
/// <para>NB Codes are case-insensitive.</para>
|
|
/// </summary>
|
|
public bool ContainsItemCode (String code)
|
|
{
|
|
return pickerItems.Exists(item => item.Code.EqualsCI(code));
|
|
}
|
|
//-------------------------------------------------------------------
|
|
/// <summary>Remove all items from the picker.</summary>
|
|
public void ClearItems ()
|
|
{
|
|
Items.Clear();
|
|
ItemsSource = null;
|
|
pickerItems.Clear();
|
|
}
|
|
/// <summary>Replace existing picker item list.</summary>
|
|
public void SetItems (List<SlmPickerItem> pickerItems)
|
|
{
|
|
ClearItems();
|
|
this.pickerItems.AddRange(pickerItems);
|
|
RefreshPickerItems();
|
|
}
|
|
//-------------------------------------------------------------------
|
|
/// <summary>
|
|
/// Add an item identified by a SysId value.
|
|
/// <para>NB Fails if an item already exists with the same id.</para>
|
|
/// </summary>
|
|
public bool AddItem (SysId id, String caption)
|
|
{
|
|
if (ContainsItemId(id)) return false;
|
|
pickerItems.Add(new SlmPickerItem() { Id = id, Caption = caption });
|
|
RefreshPickerItems();
|
|
return ContainsItemId(id);
|
|
}
|
|
/// <summary>
|
|
/// Add an item identified by a code value.
|
|
/// <para>NB Fails if an item already exists with the same case-insensitive code.</para>
|
|
/// </summary>
|
|
public bool AddItem (String code, String caption)
|
|
{
|
|
if (ContainsItemCode(code)) return false;
|
|
pickerItems.Add(new SlmPickerItem() { Code = code, Caption = caption });
|
|
RefreshPickerItems();
|
|
return ContainsItemCode(code);
|
|
}
|
|
//-------------------------------------------------------------------
|
|
private void RefreshPickerItems ()
|
|
{
|
|
//SetBinding(Picker.ItemsSourceProperty, BindableProperty.Create());
|
|
//ItemDisplayBinding = new Binding("Caption");
|
|
// Picker items doesn't automatically keep up to date with teh ItemsSource list.
|
|
// So clear it and reset to force the refresh.
|
|
ItemsSource = null;
|
|
ItemsSource = pickerItems;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// I t e m S e l e c t i o n
|
|
//-------------------------------------------------------------------
|
|
public SlmPickerItem SelectedPickerItem
|
|
{
|
|
get
|
|
{
|
|
object selectedItem = SelectedItem;
|
|
if (selectedItem == null || !(selectedItem is SlmPickerItem)) return null;
|
|
return (selectedItem as SlmPickerItem);
|
|
}
|
|
set
|
|
{
|
|
if (SelectedPickerItem == value) return;
|
|
if (ItemsSource == null || !ItemsSource.Contains(value)) return;
|
|
base.SelectedItem = value;
|
|
}
|
|
}
|
|
public SysId SelectedItemId
|
|
{
|
|
get
|
|
{
|
|
SlmPickerItem selectedPickerItem = SelectedPickerItem;
|
|
return selectedPickerItem != null ? selectedPickerItem.Id : new SysId();
|
|
}
|
|
set
|
|
{
|
|
SelectedPickerItem = pickerItems.Find(item => item.Id.Equals(value));
|
|
}
|
|
}
|
|
public String SelectedItemCode
|
|
{
|
|
get
|
|
{
|
|
SlmPickerItem selectedPickerItem = SelectedPickerItem;
|
|
return selectedPickerItem != null ? selectedPickerItem.Code : "";
|
|
}
|
|
set
|
|
{
|
|
SelectedPickerItem = pickerItems.Find(item => item.Code.EqualsCI(value));
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// C o n t r o l E v e n t s
|
|
//-------------------------------------------------------------------
|
|
// Picker population completed.
|
|
public class PopulatedEventArgs : EventArgs { }
|
|
public delegate void PopulatedEventHandler (object sender, PopulatedEventArgs e);
|
|
/// <summary>Picker population completed event handler.</summary>
|
|
public event PopulatedEventHandler Populated;
|
|
protected void InvokePopulatedEvent ()
|
|
{
|
|
if (Populated != null) Populated.Invoke(this, new PopulatedEventArgs() { });
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|