Files
C4IT-F4SD-Client/FasdDesktopUi/Pages/DetailsPage/UserControls/CustomizableSection/DetailsPageStateContainer.xaml.cs
2025-11-11 11:03:42 +01:00

435 lines
17 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using FasdDesktopUi.Basics.Enums;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Basics.UserControls.AdaptableIcon;
using static C4IT.Logging.cLogManager;
using F4SD_AdaptableIcon.Enums;
using MaterialIcons;
using FasdDesktopUi.Basics.Helper;
namespace FasdDesktopUi.Pages.DetailsPage.UserControls
{
public partial class DetailsPageStateContainer : UserControl
{
private readonly List<(FrameworkElement ValueControl, FrameworkElement EditControl)> EditableControls = new List<(FrameworkElement ValueControl, FrameworkElement EditControl)>();
#region Properties
public cContainerData ContainerData
{
get { return (cContainerData)GetValue(ContainerDataProperty); }
set { SetValue(ContainerDataProperty, value); }
}
public static readonly DependencyProperty ContainerDataProperty =
DependencyProperty.Register("ContainerData", typeof(cContainerData), typeof(DetailsPageStateContainer), new PropertyMetadata(null, new PropertyChangedCallback(ContainerDataChanged)));
private static void ContainerDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is DetailsPageStateContainer _me))
return;
_me.EditableControls.Clear();
_me.DrawContainerContent();
}
#endregion
public DetailsPageStateContainer()
{
InitializeComponent();
}
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
SetStyles();
}
private void DrawContainerContent()
{
try
{
if (ContainerData.IsMaximizable)
FullSizeButton.Visibility = Visibility.Visible;
else
FullSizeButton.Visibility = Visibility.Collapsed;
if(ContainerData.IsAddable)
AddButton.Visibility = Visibility.Visible;
else
AddButton.Visibility = Visibility.Collapsed;
foreach (var containerElement in ContainerData)
{
cUiElementHelper.DrawCustomizableContainerComponent(containerElement, this, out var createdElement, EditableControls.Add);
MainStackPanel.Children.Add(createdElement);
}
}
catch (Exception E)
{
LogException(E);
}
}
private string GetHtmlString(string maximizeValue, double fontSize = 14.0)
{
var output = maximizeValue;
try
{
var backgroundColor = (SolidColorBrush)TryFindResource("BackgroundColor.DetailsPage.Widget.Title");
var backgroundColorString = string.Empty;
if (backgroundColor != null)
backgroundColorString = $"rgb({backgroundColor.Color.R}, {backgroundColor.Color.G}, {backgroundColor.Color.B} )";
var foreGroundColor = (SolidColorBrush)TryFindResource("FontColor.DetailsPage.Widget");
var foreGroundColorString = string.Empty;
if (foreGroundColor != null)
foreGroundColorString = $"rgb({foreGroundColor.Color.R}, {foreGroundColor.Color.G}, {foreGroundColor.Color.B} )";
string htmlPrefix = $"<html><head><meta charset=\"UTF-8\"></head><body style=\"background-color: {backgroundColorString}; color: {foreGroundColorString}; font-size: {fontSize}px; font-family: Calibri, sans-serif; overflow: auto\"><div>";
string htmlSuffix = "</div></body></html>";
output = htmlPrefix + maximizeValue + htmlSuffix;
}
catch (Exception E)
{
LogException(E);
}
return output;
}
private void DrawMaximizedControl(IContainerData containerDataEntry, FrameworkElement parentElement)
{
try
{
const double enlargementFactor = 1.5;
FrameworkElement createdControl = null;
switch (containerDataEntry)
{
case cContainerValue containerValueData:
{
if (string.IsNullOrEmpty(containerValueData?.MaximizeValue))
{
createdControl = new TextBlock()
{
Text = containerValueData.DisplayValue,
TextWrapping = TextWrapping.Wrap,
FontSize = containerValueData.FontSize * enlargementFactor,
FontWeight = containerValueData.FontWeight,
Margin = new Thickness(0, 0, 5, 0),
Style = textBlockStyle
};
if (!string.IsNullOrEmpty(containerValueData.Description))
createdControl.ToolTip = containerValueData.Description;
}
else
{
var webBrowser = new WebBrowser() { ClipToBounds = true };
webBrowser.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Hidden);
string htmlControlString = GetHtmlString(containerValueData.MaximizeValue, containerValueData.FontSize * enlargementFactor);
webBrowser.NavigateToString(htmlControlString);
createdControl = new Border() { Child = webBrowser };
if (createdControl is Border createdBorder)
createdBorder.SetResourceReference(BackgroundProperty, "BackgroundColor.DetailsPage.Widget.Title");
}
break;
}
case cContainerIcon containerIconData:
{
enumInternIcons? internIcon = null;
enumInternGif? internGif = null;
MaterialIconType? materialIcon = null;
if (Enum.TryParse<enumInternIcons>(containerIconData.IconName, out var tempInternIcon))
internIcon = tempInternIcon;
if (Enum.TryParse<enumInternGif>(containerIconData.IconName, out var tempInternGif))
internGif = tempInternGif;
if (Enum.TryParse<MaterialIconType>(containerIconData.IconName, out var tempMaterialIcon))
materialIcon = tempMaterialIcon;
createdControl = new AdaptableIcon()
{
SelectedInternIcon = internIcon,
SelectedInternGif = internGif,
SelectedMaterialIcon = materialIcon,
ToolTip = containerIconData.ToolTipText,
BorderPadding = new Thickness(0),
IconHeight = 14 * enlargementFactor,
IconWidth = 14 * enlargementFactor,
Margin = new Thickness(0, 0, 5, 0)
};
string iconResourceName = "Color.Menu.Icon";
switch (containerIconData.HighlightColor)
{
case enumHighlightColor.blue:
iconResourceName = "Color.Blue";
break;
case enumHighlightColor.green:
iconResourceName = "Color.Green";
break;
case enumHighlightColor.orange:
iconResourceName = "Color.Orange";
break;
case enumHighlightColor.red:
iconResourceName = "Color.Red";
break;
}
if (createdControl is AdaptableIcon createdAdaptable)
createdAdaptable.SetResourceReference(AdaptableIcon.PrimaryIconColorProperty, iconResourceName);
break;
}
case cContainerPrimaryContent primaryContentData:
{
if (parentElement is Grid parentGrid)
parentGrid.RowDefinitions.Last().Height = new GridLength(1, GridUnitType.Star);
createdControl = new Border()
{
Padding = new Thickness(10),
Margin = new Thickness(0, 5, 0, 5),
CornerRadius = new CornerRadius(7.5)
};
if (createdControl is Border createdBorder)
createdBorder.SetResourceReference(BackgroundProperty, "BackgroundColor.DetailsPage.Widget.Title");
DrawMaximizedControl(primaryContentData.Value, createdControl);
break;
}
case cContainerStackPanel stackPanelData:
{
createdControl = new StackPanel() { Orientation = stackPanelData.Orientation };
foreach (var stackPanelElement in stackPanelData.StackPanelData)
{
DrawMaximizedControl(stackPanelElement, createdControl);
}
break;
}
}
if (createdControl is null)
return;
if (parentElement is Panel parentPanel)
{
if (parentPanel is Grid parentGrid)
Grid.SetRow(createdControl, parentGrid.RowDefinitions.Count - 1);
parentPanel.Children.Add(createdControl);
}
else if (parentElement is Decorator parentDecorator)
{
parentDecorator.Child = createdControl;
}
}
catch (Exception E)
{
LogException(E);
}
}
private Decorator GetMaximizedContainer()
{
Decorator output = null;
try
{
output = new Border()
{
CornerRadius = new CornerRadius(10),
Padding = new Thickness(22)
};
output.SetResourceReference(BackgroundProperty, "BackgroundColor.DetailsPage.Widget.Value");
Grid grid = new Grid();
output.Child = grid;
AdaptableIcon closeIcon = new AdaptableIcon()
{
HorizontalAlignment = HorizontalAlignment.Right,
SelectedInternIcon = enumInternIcons.window_close,
IconHeight = 35,
IconWidth = 35,
Margin = new Thickness(0, -10, 0, 0)
};
Panel.SetZIndex(closeIcon, 1);
closeIcon.SetResourceReference(StyleProperty, "SettingsPage.Close.Icon");
closeIcon.MouseLeftButtonUp += CloseIcon_MouseLeftButtonUp;
closeIcon.TouchDown += CloseIcon_TouchDown;
grid.Children.Add(closeIcon);
foreach (var containerDataEntry in ContainerData)
{
try
{
grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
DrawMaximizedControl(containerDataEntry, grid);
}
catch (Exception E)
{
LogException(E);
}
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
}
return output;
}
#region FullSizeButton Click
private void FullSizeButton_Click()
{
try
{
var maximizedContainer = GetMaximizedContainer();
if (maximizedContainer != null)
RaiseEvent(new ContainerEventArgs(MaximizeContainerEvent, this, maximizedContainer));
}
catch (Exception E)
{
LogException(E);
}
}
private void FullSizeButton_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
FullSizeButton_Click();
}
private void FullSizeButton_TouchDown(object sender, TouchEventArgs e)
{
FullSizeButton_Click();
}
#endregion
#region Styles
Style textBlockStyle;
private void SetStyles()
{
textBlockStyle = (Style)FindResource("DetailsPage.Widget.Title");
}
public void SetEditMode(bool isActive)
{
try
{
foreach (var editablePair in EditableControls)
{
editablePair.ValueControl.Visibility = isActive ? Visibility.Collapsed : Visibility.Visible;
editablePair.EditControl.Visibility = isActive ? Visibility.Visible : Visibility.Collapsed;
}
}
catch (Exception E)
{
LogException(E);
}
}
#endregion
#region Events
#region Full Size Events
public class ContainerEventArgs : RoutedEventArgs
{
public Decorator MaximizedControl { get; private set; }
public ContainerEventArgs(RoutedEvent routedEvent, object source, Decorator maximizedControl) : base(routedEvent, source)
{
MaximizedControl = maximizedControl;
}
}
public delegate void ContainerEventHandlerDelegate(object sender, ContainerEventArgs args);
public static readonly RoutedEvent MaximizeContainerEvent = EventManager.RegisterRoutedEvent("MaximizeContainer", RoutingStrategy.Bubble, typeof(ContainerEventHandlerDelegate), typeof(DetailsPageStateContainer));
public event RoutedEventHandler MaximizeContainer
{
add { AddHandler(MaximizeContainerEvent, value); }
remove { RemoveHandler(MaximizeContainerEvent, value); }
}
#endregion
#region Close Full Size Events
public static readonly RoutedEvent CloseMaximizedContainerEvent = EventManager.RegisterRoutedEvent("CloseMaximizedContainer", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(DetailsPageStateContainer));
public event RoutedEventHandler CloseMaximizedContainer
{
add { AddHandler(CloseMaximizedContainerEvent, value); }
remove { RemoveHandler(CloseMaximizedContainerEvent, value); }
}
private void CloseIcon_Click()
{
try
{
RaiseEvent(new RoutedEventArgs(CloseMaximizedContainerEvent));
}
catch (Exception E)
{
LogException(E);
}
}
private void CloseIcon_TouchDown(object sender, TouchEventArgs e)
{
CloseIcon_Click();
}
private void CloseIcon_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
CloseIcon_Click();
}
#endregion
#endregion
}
}