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 = $"
"; string htmlSuffix = "
"; 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(containerIconData.IconName, out var tempInternIcon)) internIcon = tempInternIcon; if (Enum.TryParse(containerIconData.IconName, out var tempInternGif)) internGif = tempInternGif; if (Enum.TryParse(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 } }