using Sarand.Net.Mobile.Maui.Views;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Mobile.Maui.Panels
{
//=======================================================================
public class SamPanel_Tabbed : SamPanel
{
//-------------------------------------------------------------------
// Definitions.
private class TabPanelData
{
public TabPanelData(int tabPos, SamPanel_TabCaption tabCaptionPanel, SamPanel_Tab tabPanel)
{
TabPos = tabPos;
TabCaptionPanel = tabCaptionPanel;
TabPanel = tabPanel;
}
public int TabPos { get; }
public SamPanel_TabCaption TabCaptionPanel { get; }
public SamPanel_Tab TabPanel { get; }
}
///
/// Tab Caption panel
///
public class SamPanel_TabCaption : SamPanel
{
// Properties.
private SamPanel_Tabbed TabbedPanel { get; }
public int TabPos { get; }
public String Caption { get; }
// Data members.
private static readonly Color ActiveBackgroundColor = Colors.WhiteSmoke;
private static readonly Color ActiveBorderColor = Colors.DarkSlateBlue;
private static readonly Color InactiveBackgroundColor = Colors.LightGray;
private static readonly Color InactiveBorderColor = Colors.SlateBlue;
private Border border = new Border() { Stroke = InactiveBorderColor, StrokeThickness = 2.0 };
private TapGestureRecognizer tabCaptionTapGesture = new TapGestureRecognizer();
public SamPanel_TabCaption(SamPanel_Tabbed tabbedPanel, int tabPos, String caption)
{
TabbedPanel = tabbedPanel;
TabPos = tabPos;
Caption = caption;
Content = border;
tabCaptionTapGesture.Tapped += TabCaptionTapGesture_Tapped;
GestureRecognizers.Add(tabCaptionTapGesture);
Deactivate();
}
private void TabCaptionTapGesture_Tapped(object? sender, TappedEventArgs e)
{
TabbedPanel.TabCaptionTapped(sender, e, TabPos);
}
public void Activate()
{
BackgroundColor = ActiveBackgroundColor;
border.Stroke = ActiveBorderColor;
}
public void Deactivate()
{
BackgroundColor = InactiveBackgroundColor;
border.Stroke = InactiveBorderColor;
}
}
//-------------------------------------------------------------------
// Data members.
// Content.
private VerticalStackLayout contentStack = new VerticalStackLayout() { };
private HorizontalStackLayout panelTabCaptions = new HorizontalStackLayout() { Spacing = 8.0 };
private ScrollView scrollTabPanels = new ScrollView() { };
private VerticalStackLayout panelTabPanels = new VerticalStackLayout() { };
// Tab panels.
private int tabCount = 0;
private readonly List tabPanels = new List();
//-------------------------------------------------------------------
// Construction.
public SamPanel_Tabbed()
{
// Content.
Content = contentStack;
// Tab captions.
contentStack.Children.Add(panelTabCaptions);
// Tab panels.
contentStack.Children.Add(scrollTabPanels);
scrollTabPanels.Content = panelTabPanels;
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
// Manage tabs.
public void AddTabPanel(String caption, SamPanel_Tab tabPanel)
{
tabCount++;
// Tab caption.
if (StringUtil.IsBlank(caption))
caption = $"Tab #{tabCount}";
SamPanel_TabCaption panelTabCaption = new SamPanel_TabCaption(this, tabCount, caption);
panelTabCaptions.Children.Add(panelTabCaption);
// Tab panel.
panelTabPanels.Children.Add(tabPanel);
// Tab panel data.
TabPanelData tabPanelData = new TabPanelData(tabCount, panelTabCaption, tabPanel);
tabPanels.Add(tabPanelData);
if (tabCount == 1)
{
panelTabCaption.Activate();
}
}
public void ClearTabPanels()
{
tabCount = 0;
tabPanels.Clear();
panelTabCaptions.Children.Clear();
panelTabPanels.Children.Clear();
}
//-------------------------------------------------------------------
// Actions.
private void TabCaptionTapped(object? sender, TappedEventArgs e, int tabPos)
{
foreach (TabPanelData tabPanel in tabPanels)
{
if (tabPanel.TabPos == tabPos)
{
tabPanel.TabCaptionPanel.Activate();
tabPanel.TabPanel.IsVisible = true;
}
else
{
tabPanel.TabCaptionPanel.Deactivate();
tabPanel.TabPanel.IsVisible = false;
}
}
}
//-------------------------------------------------------------------
// C o n f i g u r e C o m p o n e n t s
//-------------------------------------------------------------------
public override void ConfigureComponents()
{
base.ConfigureComponents();
}
//-------------------------------------------------------------------
// C o n t r o l A c t i v i t y
//-------------------------------------------------------------------
public override void SetControlActivity()
{
}
public override void SetControlsReadOnly()
{
}
//-------------------------------------------------------------------
// P a n e l E v e n t s
//-------------------------------------------------------------------
protected override void OnParentSet()
{
base.OnParentSet();
}
//-------------------------------------------------------------------
protected override void OnPropertyChanging([CallerMemberName] string propertyName = "")
{
base.OnPropertyChanging(propertyName);
}
protected override void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
base.OnPropertyChanged(propertyName);
}
//-------------------------------------------------------------------
protected override void OnChildAdded(Element child)
{
base.OnChildAdded(child);
}
protected override void OnChildRemoved(Element child, int oldLogicalIndex)
{
base.OnChildRemoved(child, oldLogicalIndex);
}
//-------------------------------------------------------------------
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
}
//-------------------------------------------------------------------
}
//=======================================================================
}