spc-kiosk-pb/Kiosk/Common/SPC.Kiosk.Common/Controls/NumericCombo.xaml.cs
2019-06-16 14:12:09 +09:00

650 lines
28 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using SPC.Kiosk.Base;
namespace SPC.Kiosk.Common
{
/// <summary>
/// NumericCombo.xaml에 대한 상호 작용 논리
/// </summary>
public partial class NumericCombo : UserControl
{
#region [ Members ]
/// <summary>
/// Text Backgroung Brush
/// </summary>
public static readonly DependencyProperty BackgroungBrushProperty =
DependencyProperty.Register(nameof(BackgroungBrush), typeof(string), typeof(NumericCombo), new PropertyMetadata("White", new PropertyChangedCallback(OnBackgroungBrushPropertyChanged)));
/// <summary>
/// Text Foregroung Brush
/// </summary>
public static readonly DependencyProperty ForegroungBrushProperty =
DependencyProperty.Register(nameof(ForegroungBrush), typeof(string), typeof(NumericCombo), new PropertyMetadata("Black", new PropertyChangedCallback(OnForegroungBrushPropertyChanged)));
/// <summary>
/// Selected Text BackgroundBrush
/// </summary>
public static readonly DependencyProperty SelectBackgroundBrushProperty =
DependencyProperty.Register(nameof(SelectBackgroundBrush), typeof(string), typeof(NumericCombo), new PropertyMetadata("DarkGray"));
/// <summary>
/// Selected Text ForegroundBrush
/// </summary>
public static readonly DependencyProperty SelectForegroundBrushProperty =
DependencyProperty.Register(nameof(SelectForegroundBrush), typeof(string), typeof(NumericCombo), new PropertyMetadata("Black"));
/// <summary>
/// Left Button AnimationButton Data
/// </summary>
public static readonly DependencyProperty LeftButtonDataProperty =
DependencyProperty.Register(nameof(LeftButtonData), typeof(M_AnimationButton), typeof(NumericCombo), new PropertyMetadata(null, new PropertyChangedCallback(OnLeftButtonDataPropertyChanged)));
/// <summary>
/// Right Button AnimationButton Data
/// </summary>
public static readonly DependencyProperty RightButtonDataProperty =
DependencyProperty.Register(nameof(RightButtonData), typeof(M_AnimationButton), typeof(NumericCombo), new PropertyMetadata(null, new PropertyChangedCallback(OnRightButtonDataPropertyChanged)));
/// <summary>
/// Min Value
/// </summary>
public static readonly DependencyProperty MinValueProperty =
DependencyProperty.Register(nameof(MinValue), typeof(int), typeof(NumericCombo), new PropertyMetadata(1, new PropertyChangedCallback(OnMinValuePropertyChanged)));
/// <summary>
/// Max Value
/// </summary>
public static readonly DependencyProperty MaxValueProperty =
DependencyProperty.Register(nameof(MaxValue), typeof(int), typeof(NumericCombo), new PropertyMetadata(4, new PropertyChangedCallback(OnMaxValuePropertyPropertyChanged)));
/// <summary>
/// Selected Value
/// </summary>
public static readonly DependencyProperty SelectedValueProperty =
DependencyProperty.Register(nameof(SelectedValue), typeof(int), typeof(NumericCombo), new PropertyMetadata(-1, new PropertyChangedCallback(OnSelectedValuePropertyChanged)));
/// <summary>
/// Value Step
/// </summary>
public static readonly DependencyProperty ValueStepProperty =
DependencyProperty.Register(nameof(ValueStep), typeof(int), typeof(NumericCombo), new PropertyMetadata(1, new PropertyChangedCallback(OnValueStepPropertyChanged)));
/// <summary>
/// Value List
/// </summary>
public static readonly DependencyProperty ValueListProperty =
DependencyProperty.Register(nameof(ValueList), typeof(List<int>), typeof(NumericCombo), new PropertyMetadata(null, new PropertyChangedCallback(OnValueListPropertyChanged)));
/// <summary>
/// Drop Down Show Flag
/// </summary>
public static readonly DependencyProperty IsDropDownProperty =
DependencyProperty.Register(nameof(IsDropDown), typeof(bool), typeof(NumericCombo), new PropertyMetadata(false));
/// <summary>
/// Show DropDown Item Count
/// </summary>
public static readonly DependencyProperty DropDownCountProperty =
DependencyProperty.Register(nameof(DropDownCount), typeof(int), typeof(NumericCombo), new PropertyMetadata(0, new PropertyChangedCallback(OnDropDownCountPropertyChanged)));
/// <summary>
/// Text FontSize
/// </summary>
public static readonly DependencyProperty TextFontSizeProperty =
DependencyProperty.Register(nameof(TextFontSize), typeof(double), typeof(NumericCombo), new PropertyMetadata(0d, new PropertyChangedCallback(OnTextFontSizePropertyChanged)));
/// <summary>
/// Text Width
/// </summary>
public static readonly DependencyProperty TextWidthProperty =
DependencyProperty.Register(nameof(TextWidth), typeof(double), typeof(NumericCombo), new PropertyMetadata(20d, new PropertyChangedCallback(OnTextWidthPropertyChanged)));
/// <summary>
/// Scroll Offset
/// </summary>
public static readonly DependencyProperty VerticalOffsetProperty =
DependencyProperty.Register(nameof(VerticalOffset), typeof(double), typeof(NumericCombo), new PropertyMetadata(0d, new PropertyChangedCallback(OnVerticalOffsetPropertyChanged)));
/// <summary>
/// Text Area Width
/// </summary>
public double TextWidth
{
get { return (double)GetValue(TextWidthProperty); }
set { SetValue(TextWidthProperty, value); }
}
/// <summary>
/// Text Area FontSize
/// </summary>
public double TextFontSize
{
get { return (double)GetValue(TextFontSizeProperty); }
set { SetValue(TextFontSizeProperty, value); }
}
/// <summary>
/// Scroll Offset
/// </summary>
public double VerticalOffset
{
get { return (double)GetValue(VerticalOffsetProperty); }
set { SetValue(VerticalOffsetProperty, value); }
}
/// <summary>
/// Show DropDown Item Count
/// </summary>
public int DropDownCount
{
get { return (int)GetValue(DropDownCountProperty); }
set { SetValue(DropDownCountProperty, value); }
}
/// <summary>
/// Drop Down Show Flag
/// </summary>
public bool IsDropDown
{
get { return (bool)GetValue(IsDropDownProperty); }
set { SetValue(IsDropDownProperty, value); }
}
/// <summary>
/// Value List
/// </summary>
public List<int> ValueList
{
get { return (List<int>)GetValue(ValueListProperty); }
set { SetValue(ValueListProperty, value); }
}
/// <summary>
/// Right Button AnimationButton Data
/// </summary>
public M_AnimationButton RightButtonData
{
get { return (M_AnimationButton)GetValue(RightButtonDataProperty); }
set { SetValue(RightButtonDataProperty, value); }
}
/// <summary>
/// Left Button AnimationButton Data
/// </summary>
public M_AnimationButton LeftButtonData
{
get { return (M_AnimationButton)GetValue(LeftButtonDataProperty); }
set { SetValue(LeftButtonDataProperty, value); }
}
/// <summary>
/// Min Value
/// </summary>
public int MinValue
{
get { return (int)GetValue(MinValueProperty); }
set { SetValue(MinValueProperty, value); }
}
/// <summary>
/// Max Value
/// </summary>
public int MaxValue
{
get { return (int)GetValue(MaxValueProperty); }
set { SetValue(MaxValueProperty, value); }
}
/// <summary>
/// Selected Value
/// </summary>
public int SelectedValue
{
get { return (int)GetValue(SelectedValueProperty); }
set
{
SetValue(SelectedValueProperty, value);
RaiseSelectChangeEvent(value);
}
}
/// <summary>
/// Value Step
/// </summary>
public int ValueStep
{
get { return (int)GetValue(ValueStepProperty); }
set { SetValue(ValueStepProperty, value); }
}
/// <summary>
/// Text ForegroungBrush
/// </summary>
public string ForegroungBrush
{
get { return (string)GetValue(ForegroungBrushProperty); }
set { SetValue(ForegroungBrushProperty, value); }
}
/// <summary>
/// Text BackgroungBrush
/// </summary>
public string BackgroungBrush
{
get { return (string)GetValue(BackgroungBrushProperty); }
set { SetValue(BackgroungBrushProperty, value); }
}
/// <summary>
/// Selected Text ForegroundBrush
/// </summary>
public string SelectForegroundBrush
{
get { return (string)GetValue(SelectForegroundBrushProperty); }
set { SetValue(SelectForegroundBrushProperty, value); }
}
/// <summary>
/// Selected Text BackgroundBrush
/// </summary>
public string SelectBackgroundBrush
{
get { return (string)GetValue(SelectBackgroundBrushProperty); }
set { SetValue(SelectBackgroundBrushProperty, value); }
}
private double mouseDownYposition = -1;
private bool MoseDown = false;
private bool CurrentMoseDown = false;
#region [ RoutedEvent 'SelectChange' ]
/// <summary>
/// MouseClicked Event
/// </summary>
public static readonly RoutedEvent SelectChangeEvent = EventManager.RegisterRoutedEvent(nameof(SelectChange), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NumericCombo));
/// <summary>
/// MouseClicked Routed Event Handler
/// </summary>
public event RoutedEventHandler SelectChange
{
add { AddHandler(SelectChangeEvent, value); }
remove { RemoveHandler(SelectChangeEvent, value); }
}
#endregion RoutedEvent 'MouseClicked'
#endregion Members
#region [ Ctor ]
/// <summary>
/// Ctor
/// </summary>
public NumericCombo()
{
InitializeComponent();
this.NumericButtonCanvas.Visibility = Visibility.Collapsed;
this.NumericButtonStack.MouseDown += NumericButtonStack_MouseDown;
this.NumericButtonStack.MouseUp += NumericButtonStack_MouseUp;
this.LeftButton.MouseClicked += LeftButton_MouseClicked;
this.RightButton.MouseClicked += RightButton_MouseClicked;
this.CurrentNumberText.MouseDown += CurrentNumberText_MouseDown;
this.CurrentNumberText.MouseUp += CurrentNumberText_MouseUp;
}
#endregion Ctor
#region [ Methods ]
private void RaiseSelectChangeEvent(object _sender)
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(NumericCombo.SelectChangeEvent, _sender);
RaiseEvent(newEventArgs);
}
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
this.LeftButton.Width = sizeInfo.NewSize.Height;
this.LeftButton.Height = sizeInfo.NewSize.Height;
this.RightButton.Width = sizeInfo.NewSize.Height;
this.RightButton.Height = sizeInfo.NewSize.Height;
SetNumericData(this);
base.OnRenderSizeChanged(sizeInfo);
}
private static void SetNumericData(NumericCombo _target)
{
try
{
_target.CurrentNumberText.Width = _target.TextWidth;
_target.CurrentNumberText.Height = _target.Height;
if (_target.ValueList is List<int> valueList)
{
_target.NumericButtonStack.Children.Clear();
foreach (var i in valueList)
{
var newTextBlock = new TextBlock
{
Name = string.Format("NumberText{0}", i),
Text = i.ToString(),
Width = _target.CurrentNumberText.Width,
Height = _target.Height,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
TextAlignment = TextAlignment.Center,
FontSize = _target.TextFontSize,
FontWeight = _target.CurrentNumberText.FontWeight,
Foreground = _target.CurrentNumberText.Foreground,
};
_target.NumericButtonStack.Children.Add(newTextBlock);
_target.ReregisterName(string.Format("NumberText{0}", i), newTextBlock);
}
}
else if (_target.MaxValue > _target.MinValue && _target.MaxValue >= _target.ValueStep)
{
_target.NumericButtonStack.Children.Clear();
for (int i = _target.MinValue; i <= _target.MaxValue; i += _target.ValueStep)
{
var newTextBlock = new TextBlock
{
Name = string.Format("NumberText{0}", i),
Text = i.ToString(),
Width = _target.CurrentNumberText.Width,
Height = _target.Height,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
TextAlignment = TextAlignment.Center,
FontSize = _target.TextFontSize,
FontWeight = _target.CurrentNumberText.FontWeight,
Foreground = _target.CurrentNumberText.Foreground
};
_target.NumericButtonStack.Children.Add(newTextBlock);
_target.ReregisterName(string.Format("NumberText{0}", i), newTextBlock);
}
}
else
{
return;
}
_target.NumericButtonCanvas.Width = _target.CurrentNumberText.Width;
_target.NumericButtonCanvas.Height = _target.Height
* (_target.DropDownCount > 0 ? _target.DropDownCount
: _target.NumericButtonStack.Children.Count);
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(_target, "SetNumericData()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
}
#endregion Methods
#region [ Event Handlers ]
private static void OnTextFontSizePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != e.OldValue)
{
var target = d as NumericCombo;
target.CurrentNumberText.FontSize = (double)e.NewValue;
}
}
private static void OnTextWidthPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != e.OldValue)
{
var target = d as NumericCombo;
target.CurrentNumberText.Width = (double)e.NewValue;
}
}
private static void OnVerticalOffsetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != e.OldValue)
{
var target = d as NumericCombo;
target.NumericScroll.ScrollToVerticalOffset((double)e.NewValue);
}
}
private static void OnDropDownCountPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
target.NumericButtonCanvas.Height = target.Height
* (target.DropDownCount > 0 ? target.DropDownCount
: target.NumericButtonStack.Children.Count);
}
}
private static void OnValueListPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
SetNumericData(target);
}
}
private static void OnMinValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
SetNumericData(target);
}
}
private static void OnMaxValuePropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
SetNumericData(target);
}
}
private static void OnSelectedValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
var selectValue = (int)e.NewValue;
if (selectValue >= target.MinValue && selectValue <= target.MaxValue)
{
target.CurrentNumberText.Text = selectValue.ToString();
}
else
{
target.SelectedValue = (int)e.OldValue;
}
}
}
private static void OnValueStepPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
SetNumericData(target);
}
}
private static void OnRightButtonDataPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
var newData = e.NewValue as M_AnimationButton; ;
target.Height = newData.Height;
target.RightButton.DataParameter = newData;
if (!target.Height.Equals(double.NaN))
{
target.NumericStackGrid.Margin = new Thickness(0, target.Height, 0, 0);
SetNumericData(target);
}
}
}
private static void OnLeftButtonDataPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
var newData = e.NewValue as M_AnimationButton; ;
target.Height = newData.Height;
target.LeftButton.DataParameter = newData;
if (!target.Height.Equals(double.NaN))
{
target.NumericStackGrid.Margin = new Thickness(0, target.Height, 0, 0);
SetNumericData(target);
}
}
}
private static void OnForegroungBrushPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
ResourceManager.SetBrush(target.CurrentNumberGrid, "Background", (string)e.NewValue);
SetNumericData(target);
}
}
private static void OnBackgroungBrushPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && !e.NewValue.Equals(e.OldValue))
{
var target = d as NumericCombo;
ResourceManager.SetBrush(target.CurrentNumberGrid, "Background", (string)e.NewValue, Stretch.Fill);
ResourceManager.SetBrush(target.NumericButtonCanvas, "Background", (string)e.NewValue, Stretch.Fill);
}
}
private void CurrentNumberText_MouseDown(object sender, MouseButtonEventArgs e)
{
CurrentMoseDown = true;
}
private void CurrentNumberText_MouseUp(object sender, MouseButtonEventArgs e)
{
if (!CurrentMoseDown) return;
if (sender is TextBlock currentText)
{
if (this.NumericButtonCanvas.Visibility.Equals(Visibility.Visible))
{
this.NumericButtonCanvas.Visibility = Visibility.Collapsed;
}
else
{
if (this.IsDropDown)
{
this.NumericButtonCanvas.Visibility = Visibility.Visible;
foreach (var aNumber in this.NumericButtonStack.Children)
{
var findNumber = aNumber as TextBlock;
if (aNumber != null)
{
if (aNumber != null && findNumber.Text.Equals(this.CurrentNumberText.Text))
{
ResourceManager.SetBrush(findNumber, "Background", this.SelectBackgroundBrush);
ResourceManager.SetBrush(findNumber, "Foreground", this.SelectForegroundBrush);
}
else
{
ResourceManager.SetBrush(findNumber, "Background", this.BackgroungBrush);
ResourceManager.SetBrush(findNumber, "Foreground", this.ForegroungBrush);
}
}
}
}
}
}
CurrentMoseDown = false;
}
private void NumericButtonStack_MouseDown(object sender, MouseButtonEventArgs e)
{
if (sender is StackPanel numStack)
{
mouseDownYposition = e.GetPosition(numStack).Y;
MoseDown = true;
}
}
private void NumericButtonStack_MouseUp(object sender, MouseButtonEventArgs e)
{
if (sender is StackPanel numStack)
{
if (!MoseDown) return;
var curMouseYposition = e.GetPosition(numStack).Y;
var fromOffset = this.NumericScroll.VerticalOffset;
var toOffset = 0d;
var totalTime = 0.3;
Storyboard scrollAnimation = null;
if (!mouseDownYposition.Equals(-1) && (mouseDownYposition - curMouseYposition) > 14)
{
if (this.DropDownCount > 0 && this.NumericButtonStack.Children.Count > this.DropDownCount)
{
toOffset = fromOffset + this.CurrentNumberText.Height * DropDownCount;
scrollAnimation = Animations.GetScrollAnimation(this, Orientation.Vertical, fromOffset, toOffset, totalTime);
}
}
else if (!mouseDownYposition.Equals(-1) && (mouseDownYposition - curMouseYposition) < -14)
{
if (this.DropDownCount > 0 && this.NumericButtonStack.Children.Count > this.DropDownCount)
{
toOffset = fromOffset - this.CurrentNumberText.Height * DropDownCount;
scrollAnimation = Animations.GetScrollAnimation(this, Orientation.Vertical, fromOffset, toOffset, totalTime);
}
}
else
{
foreach (var aNumber in numStack.Children)
{
if (aNumber is TextBlock findNumber && findNumber.IsMouseOver)
{
var findIndex = this.NumericButtonStack.Children.IndexOf(findNumber);
this.SelectedValue = int.Parse(findNumber.Text);
this.NumericScroll.ScrollToVerticalOffset(findIndex * this.CurrentNumberText.Height);
this.NumericButtonCanvas.Visibility = Visibility.Collapsed;
break;
}
}
}
mouseDownYposition = curMouseYposition;
MoseDown = false;
if (scrollAnimation != null)
{
scrollAnimation.Begin();
}
}
}
private void RightButton_MouseClicked(object sender, RoutedEventArgs e)
{
if (sender is AnimationButton rightButton)
{
foreach (var aNumber in this.NumericButtonStack.Children)
{
if (aNumber is TextBlock findNumber)
{
if (findNumber.Text.Equals(this.CurrentNumberText.Text))
{
var findIndex = this.NumericButtonStack.Children.IndexOf(findNumber);
if (findIndex < this.NumericButtonStack.Children.Count - 1)
{
this.SelectedValue = int.Parse((this.NumericButtonStack.Children[findIndex + 1] as TextBlock).Text);
this.NumericScroll.ScrollToVerticalOffset((findIndex + 1) * this.CurrentNumberText.Height);
break;
}
}
}
}
}
this.NumericButtonCanvas.Visibility = Visibility.Collapsed;
}
private void LeftButton_MouseClicked(object sender, RoutedEventArgs e)
{
if (sender is AnimationButton LeftButton)
{
foreach (var aNumber in this.NumericButtonStack.Children)
{
if (aNumber is TextBlock findNumber)
{
if (findNumber.Text.Equals(this.CurrentNumberText.Text))
{
var findIndex = this.NumericButtonStack.Children.IndexOf(findNumber);
if (findIndex > 0)
{
this.SelectedValue = int.Parse((this.NumericButtonStack.Children[findIndex - 1] as TextBlock).Text);
this.NumericScroll.ScrollToVerticalOffset((findIndex -1) * this.CurrentNumberText.Height);
break;
}
}
}
}
}
this.NumericButtonCanvas.Visibility = Visibility.Collapsed;
}
#endregion Event Handlers
}
}