Files
Common-VS2019/SacsMobileMaui/Maui/Panels/SamPanel_ItemListHeader.cs
T

287 lines
12 KiB
C#

using Sarand.Net.Mobile.Maui.Controls;
using Sarand.Net.Mobile.Maui.Layouts;
using Sarand.Net.Mobile.Maui.Utils;
using Sarand.Net.Mobile.Maui.Views;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Mobile.Maui.Panels
{
//=======================================================================
public class SamPanel_ItemListHeader : SamPanel
{
//-------------------------------------------------------------------
// Definitions.
public class Config
{
public Thickness? Margin { get; set; } = new Thickness(0, 0, 0, 8);
public String Caption { get; set; } = "";
public double HeaderBorderWidth { get; set; } = 4.0;
public float HeaderBorderRadius { get; set; } = 8.0f;
public Color HeaderBorderColor { get; set; } = Color.FromArgb("#808080");
public Color HeaderBackgroundColor { get; set; } = Color.FromArgb("#F0F0F0");
// Labels.
// Styling.
public double CaptionLabelFontSizeRatio { get; set; } = 1.0;
public double PagingLabelFontSizeRatio { get; set; } = 1.0;
public Thickness? LabelMargin { get; set; } = null;
// Paging controls.
public static int PagingButtonWidthMin { get; } = 40;
public static int PagingButtonWidthMax { get; } = 64;
public static int PagingButtonWidthDefault { get; } = PagingButtonWidthMin;
public int PagingButtonWidth { get; set; } = PagingButtonWidthDefault;
public static int PagingButtonHeightMin { get; } = 40;
public static int PagingButtonHeightMax { get; } = 64;
public static int PagingButtonHeightDefault { get; } = PagingButtonHeightMin;
public int PagingButtonHeight { get; set; } = PagingButtonHeightDefault;
// Filters.
public List<SacsFilterPropertyType> FilterPropertyTypes { get; } = new List<SacsFilterPropertyType>();
public ushort FiltersToDisplay { get; set; } = 2;
}
//-------------------------------------------------------------------
// Data members.
private Config config;
// Layout.
private SamFrame frame = new SamFrame();
private SamStackLayout mainLayout = new SamStackLayout() { Orientation = StackOrientation.Vertical };
// Header.
private SamWrapLayout headerLayout = new SamWrapLayout() { SpacingX = 8.0 };
private SamContentView captionLabelView = new SamContentView();
private SamLabel labelCaption = new SamLabel() { Text = "" };
private double initialLabelFontSize = 0;
// Paging.
private class PagingData : DbQuery.Paging
{
public int TotalItems { get; set; }
public int TotalPages { get { return PageLength > 0 ? (int)Math.Ceiling((double)TotalItems / PageLength) : 0; } }
public override bool Paged { get { return base.Paged && TotalItems > 0; } }
}
private readonly PagingData paging = new PagingData();
private SamStackLayout pagingStack = new SamStackLayout() { Orientation = StackOrientation.Horizontal };
private SamLabel labelPaging = new SamLabel() { Text = "[Paging]" };
private SamImageButton buttonPagingFirst = new SamImageButton() { WidthRequest = 32, HeightRequest = 32, Aspect = Aspect.AspectFit, Padding = new Thickness(2, 4), BackgroundColor = Colors.Transparent };
private SamImageButton buttonPagingPrev = new SamImageButton() { WidthRequest = 32, HeightRequest = 32, Aspect = Aspect.AspectFit, Padding = new Thickness(2, 4), BackgroundColor = Colors.Transparent };
private SamImageButton buttonPagingNext = new SamImageButton() { WidthRequest = 32, HeightRequest = 32, Aspect = Aspect.AspectFit, Padding = new Thickness(2, 4), BackgroundColor = Colors.Transparent };
private SamImageButton buttonPagingLast = new SamImageButton() { WidthRequest = 32, HeightRequest = 32, Aspect = Aspect.AspectFit, Padding = new Thickness(2, 4), BackgroundColor = Colors.Transparent };
//-------------------------------------------------------------------
// Construction.
public SamPanel_ItemListHeader(Config config)
{
this.config = config;
initialLabelFontSize = labelCaption.FontSize;
InitialiseComponents();
}
//-------------------------------------------------------------------
// Properties.
// Filter.
public SamPanel_ItemFilter? PanelFilter { get; private set; }
// Paging.
public uint PageNo { get { return paging.PageNo; } }
public ushort PageLength { get { return paging.PageLength; } }
public int TotalItems { get { return paging.TotalItems; } }
//-------------------------------------------------------------------
// I n i t i a l i s e
//-------------------------------------------------------------------
private void InitialiseComponents()
{
// Frame - to allow rounded corners.
Content = frame;
frame.Content = mainLayout;
// Header.
mainLayout.Spacing = 0;
mainLayout.HorizontalOptions = LayoutOptions.StartAndExpand;
mainLayout.BackgroundColor = Colors.Transparent;
//headerLayout.BackgroundColor = Color.LightYellow;
mainLayout.Children.Add(headerLayout);
// Header - Caption.
captionLabelView.VerticalOptions = LayoutOptions.Center;
labelCaption.FontAttributes = FontAttributes.Bold;
labelCaption.HorizontalOptions = LayoutOptions.StartAndExpand;
labelCaption.VerticalOptions = LayoutOptions.CenterAndExpand;
labelCaption.LineBreakMode = LineBreakMode.NoWrap;
labelCaption.PropertyChanging += LabelCaption_PropertyChanging;
// Label is embedded in view to ensure correct sizing.
captionLabelView.Content = labelCaption;
headerLayout.Children.Add(captionLabelView);
// Header - Paging.
pagingStack.HorizontalOptions = LayoutOptions.EndAndExpand;
pagingStack.VerticalOptions = LayoutOptions.CenterAndExpand;
headerLayout.Children.Add(pagingStack);
labelPaging.VerticalOptions = LayoutOptions.CenterAndExpand;
pagingStack.Children.Add(labelPaging);
pagingStack.Children.Add(buttonPagingFirst);
pagingStack.Children.Add(buttonPagingPrev);
pagingStack.Children.Add(buttonPagingNext);
pagingStack.Children.Add(buttonPagingLast);
// Paging actions.
buttonPagingFirst.Clicked += ButtonPagingFirst_Clicked;
buttonPagingPrev.Clicked += ButtonPagingPrev_Clicked;
buttonPagingNext.Clicked += ButtonPagingNext_Clicked;
buttonPagingLast.Clicked += ButtonPagingLast_Clicked;
// Complete panel configuration.
ConfigurePanel();
}
private void LabelCaption_PropertyChanging(object? sender, PropertyChangingEventArgs e)
{
if (e.PropertyName.EqualsCI("Height"))
{
}
}
//-------------------------------------------------------------------
// C o n f i g u r e P a n e l
//-------------------------------------------------------------------
private void ConfigurePanel()
{
if (config.Margin != null)
frame.Margin = (Thickness)config.Margin;
// Header.
labelCaption.Text = StringUtil.EmptyOnNull(config.Caption);
frame.Padding = new Thickness(config.HeaderBorderWidth);
frame.CornerRadius = config.HeaderBorderRadius;
frame.BorderColor = config.HeaderBorderColor;
frame.BackgroundColor = config.HeaderBackgroundColor;
// Labels.
labelCaption.FontSize = initialLabelFontSize * config.CaptionLabelFontSizeRatio;
labelPaging.FontSize = initialLabelFontSize * config.PagingLabelFontSizeRatio;
if (config.LabelMargin != null)
{
labelCaption.Margin = (Thickness)config.LabelMargin;
labelPaging.Margin = (Thickness)config.LabelMargin;
}
// Paging controls.
buttonPagingFirst.Source = SamImageUtil.GetImageFromByteArray(SacsResourceHelper.GetResourceImage(SacsResourceHelper.ImageResource.Arrow_Left_Double_Black_24_png));
buttonPagingFirst.WidthRequest = Math.Max(Config.PagingButtonWidthMin, Math.Min(Config.PagingButtonWidthMax, config.PagingButtonWidth));
buttonPagingFirst.HeightRequest = Math.Max(Config.PagingButtonHeightMin, Math.Min(Config.PagingButtonHeightMax, config.PagingButtonHeight));
buttonPagingPrev.Source = SamImageUtil.GetImageFromByteArray(SacsResourceHelper.GetResourceImage(SacsResourceHelper.ImageResource.Arrow_Left_Black_24_png));
buttonPagingPrev.WidthRequest = Math.Max(Config.PagingButtonWidthMin, Math.Min(Config.PagingButtonWidthMax, config.PagingButtonWidth));
buttonPagingPrev.HeightRequest = Math.Max(Config.PagingButtonHeightMin, Math.Min(Config.PagingButtonHeightMax, config.PagingButtonHeight));
buttonPagingNext.Source = SamImageUtil.GetImageFromByteArray(SacsResourceHelper.GetResourceImage(SacsResourceHelper.ImageResource.Arrow_Right_Black_24_png));
buttonPagingNext.WidthRequest = Math.Max(Config.PagingButtonWidthMin, Math.Min(Config.PagingButtonWidthMax, config.PagingButtonWidth));
buttonPagingNext.HeightRequest = Math.Max(Config.PagingButtonHeightMin, Math.Min(Config.PagingButtonHeightMax, config.PagingButtonHeight));
buttonPagingLast.Source = SamImageUtil.GetImageFromByteArray(SacsResourceHelper.GetResourceImage(SacsResourceHelper.ImageResource.Arrow_Right_Double_Black_24_png));
buttonPagingLast.WidthRequest = Math.Max(Config.PagingButtonWidthMin, Math.Min(Config.PagingButtonWidthMax, config.PagingButtonWidth));
buttonPagingLast.HeightRequest = Math.Max(Config.PagingButtonHeightMin, Math.Min(Config.PagingButtonHeightMax, config.PagingButtonHeight));
RefreshPaging();
// Property type filters.
SamPanel_ItemFilter.Config propertyFilterConfig = new SamPanel_ItemFilter.Config();
propertyFilterConfig.FilterPropertyTypes.AddRange(config.FilterPropertyTypes);
propertyFilterConfig.FiltersToDisplay = config.FiltersToDisplay;
if (PanelFilter == null)
{
PanelFilter = new SamPanel_ItemFilter(propertyFilterConfig);
mainLayout.Children.Add(PanelFilter);
}
else
{
PanelFilter.SetConfig(propertyFilterConfig);
}
}
//-------------------------------------------------------------------
// P a g i n g
//-------------------------------------------------------------------
public void SetPaging(uint pageNo, ushort pageLength, int totalItems)
{
paging.PageNo = pageNo;
paging.PageLength = pageLength;
paging.TotalItems = totalItems;
RefreshPaging();
}
private void RefreshPaging()
{
String pagingText = "";
Boolean paged = (paging.Paged && paging.TotalPages > 1);
if (paging.TotalItems > 0)
{
if (paged)
pagingText = "Page " + paging.PageNo + " of " + paging.TotalPages;
else
pagingText = paging.TotalItems + " items";
}
labelPaging.Text = pagingText;
// Control visibility.
labelPaging.IsVisible = !StringUtil.IsEmpty(labelPaging.Text);
buttonPagingFirst.IsVisible = paged;
buttonPagingPrev.IsVisible = paged;
buttonPagingNext.IsVisible = paged;
buttonPagingLast.IsVisible = paged;
// Button activity.
buttonPagingFirst.IsEnabled = paging.PageNo > 1;
buttonPagingPrev.IsEnabled = paging.PageNo > 1;
buttonPagingNext.IsEnabled = paging.PageNo < paging.TotalPages;
buttonPagingLast.IsEnabled = paging.PageNo < paging.TotalPages;
}
//-------------------------------------------------------------------
// Paging events.
public enum PagingActionType
{
Unknown,
First,
Next,
Prev,
Last
}
public class PagingActionEventArgs : EventArgs
{
public PagingActionType PagingActionType { get; set; } = PagingActionType.Unknown;
}
public event EventHandler<PagingActionEventArgs>? PagingAction;
private void FirePagingActionEvent(PagingActionType pagingActionType)
{
PagingActionEventArgs filterChangedEventArgs = new PagingActionEventArgs()
{
PagingActionType = pagingActionType,
};
if (PagingAction != null) PagingAction.Invoke(this, filterChangedEventArgs);
}
//-------------------------------------------------------------------
// Paging actions.
private void ButtonPagingFirst_Clicked(object? sender, EventArgs e)
{
FirePagingActionEvent(PagingActionType.First);
}
private void ButtonPagingPrev_Clicked(object? sender, EventArgs e)
{
FirePagingActionEvent(PagingActionType.Prev);
}
private void ButtonPagingNext_Clicked(object? sender, EventArgs e)
{
FirePagingActionEvent(PagingActionType.Next);
}
private void ButtonPagingLast_Clicked(object? sender, EventArgs e)
{
FirePagingActionEvent(PagingActionType.Last);
}
//-------------------------------------------------------------------
// P a n e l E v e n t s
//-------------------------------------------------------------------
//-------------------------------------------------------------------
}
//=======================================================================
}