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 FilterPropertyTypes { get; } = new List(); 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? 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 //------------------------------------------------------------------- //------------------------------------------------------------------- } //======================================================================= }