inital
This commit is contained in:
@@ -0,0 +1,441 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
|
||||
using FasdDesktopUi.Pages.DetailsPage.Models;
|
||||
|
||||
using C4IT.Logging;
|
||||
using static C4IT.Logging.cLogManager;
|
||||
using FasdDesktopUi.Basics.Models;
|
||||
using FasdDesktopUi.Basics;
|
||||
|
||||
namespace FasdDesktopUi.Pages.DetailsPage.UserControls
|
||||
{
|
||||
public partial class DetailsPageWidgetCollection : UserControl
|
||||
{
|
||||
#region Properties
|
||||
|
||||
private bool isNewCase = true;
|
||||
|
||||
#region WidgetGeometryList DependencyProperty
|
||||
|
||||
private static bool DidGeometryDataChanged(DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
bool didGeometryChange = false;
|
||||
|
||||
try
|
||||
{
|
||||
if (e.NewValue != null && e.OldValue != null)
|
||||
{
|
||||
var oldValueEnumerator = (e.OldValue as List<DetailsPageWidgetGeometryModel>).GetEnumerator();
|
||||
var newValues = e.NewValue as List<DetailsPageWidgetGeometryModel>;
|
||||
|
||||
foreach (var value in newValues)
|
||||
{
|
||||
if (oldValueEnumerator.MoveNext())
|
||||
{
|
||||
didGeometryChange = value.WidgetTitleCount != oldValueEnumerator.Current.WidgetTitleCount || didGeometryChange;
|
||||
didGeometryChange = value.WidgetDetailCount != oldValueEnumerator.Current.WidgetDetailCount || didGeometryChange;
|
||||
}
|
||||
else
|
||||
{
|
||||
didGeometryChange = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
didGeometryChange = true;
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
|
||||
return didGeometryChange;
|
||||
}
|
||||
|
||||
private static void GeometryChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
if (DidGeometryDataChanged(e) is false)
|
||||
return;
|
||||
|
||||
var _me = d as DetailsPageWidgetCollection;
|
||||
_me.InitializeCollectionGeometry();
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty WidgetGeometryListProperty =
|
||||
DependencyProperty.Register("WidgetGeometryList", typeof(List<DetailsPageWidgetGeometryModel>), typeof(DetailsPageWidgetCollection), new PropertyMetadata(new List<DetailsPageWidgetGeometryModel>(), new PropertyChangedCallback(GeometryChangedCallback)));
|
||||
|
||||
public List<DetailsPageWidgetGeometryModel> WidgetGeometryList
|
||||
{
|
||||
get { return (List<DetailsPageWidgetGeometryModel>)GetValue(WidgetGeometryListProperty); }
|
||||
set { SetValue(WidgetGeometryListProperty, value); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region WidgetDataList DependencyProperty
|
||||
|
||||
static void RefreshDataCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
if (d is DetailsPageWidgetCollection _me)
|
||||
{
|
||||
_me.UpdateWidgetBar();
|
||||
_me.RefreshData();
|
||||
}
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty WidgetDataListProperty =
|
||||
DependencyProperty.Register("WidgetDataList", typeof(List<List<cWidgetValueModel>>), typeof(DetailsPageWidgetCollection), new PropertyMetadata(new List<List<cWidgetValueModel>>(), new PropertyChangedCallback(RefreshDataCallback)));
|
||||
|
||||
public List<List<cWidgetValueModel>> WidgetDataList
|
||||
{
|
||||
get { return (List<List<cWidgetValueModel>>)GetValue(WidgetDataListProperty); }
|
||||
set { SetValue(WidgetDataListProperty, value); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
public DetailsPageWidgetCollection()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnInitialized(EventArgs e)
|
||||
{
|
||||
base.OnInitialized(e);
|
||||
cSupportCaseDataProvider.CaseChanged += (sender, args) => isNewCase = true;
|
||||
}
|
||||
|
||||
|
||||
#region SetUp Controls
|
||||
|
||||
#region Control Lists
|
||||
|
||||
private readonly List<DetailsPageWidget> WidgetControls = new List<DetailsPageWidget>();
|
||||
|
||||
#endregion
|
||||
|
||||
#region SetUpFunctions
|
||||
|
||||
private void InitializeCollectionGeometry()
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
try
|
||||
{
|
||||
if (DesignerProperties.GetIsInDesignMode(this) || WidgetGeometryList == null)
|
||||
return;
|
||||
|
||||
WidgetControls.Clear();
|
||||
WidgetSectionStackPanel.Children.RemoveRange(0, WidgetSectionStackPanel.Children.Count - 1);
|
||||
|
||||
for (int i = 0; i < WidgetGeometryList.Count; i++)
|
||||
{
|
||||
Border widgetBorder = new Border() { Background = Brushes.Transparent, AllowDrop = true, Padding = new Thickness(0, 0, 25, 0), Tag = "WidgetDataBorder" };
|
||||
|
||||
DetailsPageWidget widgetToCreate = new DetailsPageWidget() { WidgetGeometry = WidgetGeometryList[i] };
|
||||
|
||||
widgetBorder.Child = widgetToCreate;
|
||||
WidgetSectionStackPanel.Children.Add(widgetBorder);
|
||||
WidgetControls.Add(widgetToCreate);
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region Update Controls Function
|
||||
|
||||
private void UpdateWidgetBar()
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
try
|
||||
{
|
||||
if (WidgetDataList == null)
|
||||
return;
|
||||
|
||||
if (WidgetDataList.Count > WidgetControls.Count)
|
||||
{
|
||||
int missingWidgetData = WidgetDataList.Count - WidgetControls.Count;
|
||||
LogEntry($"WidgetCollection - {missingWidgetData} widgets were missing and had to be added."); //todo: remove
|
||||
|
||||
for (int i = 0; i < missingWidgetData; i++)
|
||||
{
|
||||
Border widgetBorder = new Border() { Background = Brushes.Transparent, AllowDrop = true, Padding = new Thickness(0, 0, 25, 0), Tag = "WidgetDataBorder" };
|
||||
|
||||
DetailsPageWidget widgetToCreate = new DetailsPageWidget();
|
||||
|
||||
widgetBorder.Child = widgetToCreate;
|
||||
WidgetSectionStackPanel.Children.Add(widgetBorder);
|
||||
WidgetControls.Add(widgetToCreate);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Refresh Data
|
||||
|
||||
private void RefreshData()
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
try
|
||||
{
|
||||
if (WidgetDataList == null)
|
||||
return;
|
||||
|
||||
var WidgetDataEnumerator = WidgetDataList.GetEnumerator();
|
||||
|
||||
foreach (var widgetControl in WidgetControls)
|
||||
{
|
||||
if (WidgetDataEnumerator.MoveNext())
|
||||
{
|
||||
var widgetData = WidgetDataEnumerator.Current;
|
||||
|
||||
widgetControl.WidgetHeight = GetWidgetHeight();
|
||||
widgetControl.Visibility = widgetData?.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
|
||||
widgetControl.WidgetData = widgetData;
|
||||
}
|
||||
else
|
||||
{
|
||||
widgetControl.WidgetData = null;
|
||||
widgetControl.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Update Data
|
||||
|
||||
public void UpdateWidgetData(List<List<cWidgetValueModel>> widgetData)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (WidgetDataList is null || WidgetDataList.Count == 0)
|
||||
return;
|
||||
|
||||
var widgetDataEnumerator = WidgetDataList.GetEnumerator();
|
||||
|
||||
for (int i = 0; i < widgetData.Count; i++)
|
||||
{
|
||||
var widgetCategory = widgetData[i];
|
||||
|
||||
widgetDataEnumerator.MoveNext();
|
||||
|
||||
var currentHistoryData = widgetDataEnumerator.Current;
|
||||
|
||||
var didWidgetCategoryChange = isNewCase || DidWidgetCategoryChange(currentHistoryData, widgetCategory);
|
||||
LogEntry($"WidgetCollection - WidgetData for Widget {i} did {(didWidgetCategoryChange ? "" : "NOT")} change."); //todo: remove
|
||||
|
||||
if (didWidgetCategoryChange && WidgetControls[i] != null)
|
||||
WidgetControls[i].WidgetData = widgetCategory;
|
||||
}
|
||||
|
||||
WidgetDataList = widgetData;
|
||||
isNewCase = false;
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
}
|
||||
|
||||
private bool DidWidgetCategoryChange(List<cWidgetValueModel> oldValue, List<cWidgetValueModel> newValue)
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
try
|
||||
{
|
||||
if (oldValue is null || newValue is null)
|
||||
return true;
|
||||
|
||||
if (oldValue.Count != newValue.Count)
|
||||
return true;
|
||||
|
||||
var newValueRowEnumeator = newValue.GetEnumerator();
|
||||
|
||||
foreach (var oldValueRow in oldValue)
|
||||
{
|
||||
if (!newValueRowEnumeator.MoveNext())
|
||||
continue;
|
||||
|
||||
var currentNewValueRow = newValueRowEnumeator.Current;
|
||||
|
||||
if (oldValueRow?.Value != currentNewValueRow?.Value)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Style Definitions
|
||||
|
||||
private Style widgetTitleStyle;
|
||||
|
||||
private void SetStyles()
|
||||
{
|
||||
widgetTitleStyle = (Style)FindResource("DetailsPage.Widget.Title");
|
||||
}
|
||||
|
||||
private static Size MeasureStringSize(string stringToMeasure, Control controlOfText)
|
||||
{
|
||||
var formattedText = new FormattedText(
|
||||
stringToMeasure,
|
||||
CultureInfo.CurrentCulture,
|
||||
FlowDirection.LeftToRight,
|
||||
new Typeface(controlOfText.FontFamily, controlOfText.FontStyle, controlOfText.FontWeight, controlOfText.FontStretch),
|
||||
controlOfText.FontSize,
|
||||
Brushes.Black,
|
||||
new NumberSubstitution(),
|
||||
1);
|
||||
|
||||
return new Size(formattedText.Width, formattedText.Height);
|
||||
}
|
||||
|
||||
private double GetWidgetHeight()
|
||||
{
|
||||
double widgetHeight = 150;
|
||||
|
||||
foreach (var widgetData in WidgetDataList)
|
||||
{
|
||||
double tempWidgetHeight = 0;
|
||||
foreach (var widget in widgetData)
|
||||
{
|
||||
if (widget.Title == null)
|
||||
continue;
|
||||
|
||||
tempWidgetHeight += MeasureStringSize(widget.Title, new Control { Style = widgetTitleStyle }).Height + 14; // 14 = FunctionMarkerBorderHeight - FontSize
|
||||
}
|
||||
|
||||
tempWidgetHeight += 4;
|
||||
|
||||
if (tempWidgetHeight > widgetHeight)
|
||||
widgetHeight = tempWidgetHeight;
|
||||
}
|
||||
|
||||
return widgetHeight;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Event Methods
|
||||
|
||||
private void DetailsPageWidgetCollection_Initialized(object sender, EventArgs e)
|
||||
{
|
||||
SetStyles();
|
||||
}
|
||||
|
||||
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
|
||||
{
|
||||
if (!(sender is ScrollViewer scrollViewer))
|
||||
return;
|
||||
|
||||
var destination = scrollViewer.HorizontalOffset - e.Delta;
|
||||
scrollViewer.ScrollToHorizontalOffset(destination);
|
||||
}
|
||||
|
||||
private void ScrollViewer_PreviewKeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
#region Click Events
|
||||
|
||||
private void WidgetSectionStackPanel_Click(object originalSource)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!(originalSource is TextBlock clickedTextBlock))
|
||||
return;
|
||||
|
||||
System.Windows.Forms.Clipboard.SetText(clickedTextBlock.Text);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
private void WidgetSectionStackPanel_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
WidgetSectionStackPanel_Click(e.OriginalSource);
|
||||
}
|
||||
|
||||
private void WidgetSectionStackPanel_TouchDown(object sender, TouchEventArgs e)
|
||||
{
|
||||
WidgetSectionStackPanel_Click(e.OriginalSource);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
public void SetEditMode(bool isActive)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (var child in WidgetSectionStackPanel.Children)
|
||||
{
|
||||
if (!(child is Border widgetBorder && widgetBorder.Child is DetailsPageWidget widget))
|
||||
continue;
|
||||
|
||||
widget.SetEditMode(isActive);
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user