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 { /// /// NumericCombo.xaml에 대한 상호 작용 논리 /// public partial class NumericCombo : UserControl { #region [ Members ] /// /// Text Backgroung Brush /// public static readonly DependencyProperty BackgroungBrushProperty = DependencyProperty.Register(nameof(BackgroungBrush), typeof(string), typeof(NumericCombo), new PropertyMetadata("White", new PropertyChangedCallback(OnBackgroungBrushPropertyChanged))); /// /// Text Foregroung Brush /// public static readonly DependencyProperty ForegroungBrushProperty = DependencyProperty.Register(nameof(ForegroungBrush), typeof(string), typeof(NumericCombo), new PropertyMetadata("Black", new PropertyChangedCallback(OnForegroungBrushPropertyChanged))); /// /// Selected Text BackgroundBrush /// public static readonly DependencyProperty SelectBackgroundBrushProperty = DependencyProperty.Register(nameof(SelectBackgroundBrush), typeof(string), typeof(NumericCombo), new PropertyMetadata("DarkGray")); /// /// Selected Text ForegroundBrush /// public static readonly DependencyProperty SelectForegroundBrushProperty = DependencyProperty.Register(nameof(SelectForegroundBrush), typeof(string), typeof(NumericCombo), new PropertyMetadata("Black")); /// /// Left Button AnimationButton Data /// public static readonly DependencyProperty LeftButtonDataProperty = DependencyProperty.Register(nameof(LeftButtonData), typeof(M_AnimationButton), typeof(NumericCombo), new PropertyMetadata(null, new PropertyChangedCallback(OnLeftButtonDataPropertyChanged))); /// /// Right Button AnimationButton Data /// public static readonly DependencyProperty RightButtonDataProperty = DependencyProperty.Register(nameof(RightButtonData), typeof(M_AnimationButton), typeof(NumericCombo), new PropertyMetadata(null, new PropertyChangedCallback(OnRightButtonDataPropertyChanged))); /// /// Min Value /// public static readonly DependencyProperty MinValueProperty = DependencyProperty.Register(nameof(MinValue), typeof(int), typeof(NumericCombo), new PropertyMetadata(1, new PropertyChangedCallback(OnMinValuePropertyChanged))); /// /// Max Value /// public static readonly DependencyProperty MaxValueProperty = DependencyProperty.Register(nameof(MaxValue), typeof(int), typeof(NumericCombo), new PropertyMetadata(4, new PropertyChangedCallback(OnMaxValuePropertyPropertyChanged))); /// /// Selected Value /// public static readonly DependencyProperty SelectedValueProperty = DependencyProperty.Register(nameof(SelectedValue), typeof(int), typeof(NumericCombo), new PropertyMetadata(-1, new PropertyChangedCallback(OnSelectedValuePropertyChanged))); /// /// Value Step /// public static readonly DependencyProperty ValueStepProperty = DependencyProperty.Register(nameof(ValueStep), typeof(int), typeof(NumericCombo), new PropertyMetadata(1, new PropertyChangedCallback(OnValueStepPropertyChanged))); /// /// Value List /// public static readonly DependencyProperty ValueListProperty = DependencyProperty.Register(nameof(ValueList), typeof(List), typeof(NumericCombo), new PropertyMetadata(null, new PropertyChangedCallback(OnValueListPropertyChanged))); /// /// Drop Down Show Flag /// public static readonly DependencyProperty IsDropDownProperty = DependencyProperty.Register(nameof(IsDropDown), typeof(bool), typeof(NumericCombo), new PropertyMetadata(false)); /// /// Show DropDown Item Count /// public static readonly DependencyProperty DropDownCountProperty = DependencyProperty.Register(nameof(DropDownCount), typeof(int), typeof(NumericCombo), new PropertyMetadata(0, new PropertyChangedCallback(OnDropDownCountPropertyChanged))); /// /// Text FontSize /// public static readonly DependencyProperty TextFontSizeProperty = DependencyProperty.Register(nameof(TextFontSize), typeof(double), typeof(NumericCombo), new PropertyMetadata(0d, new PropertyChangedCallback(OnTextFontSizePropertyChanged))); /// /// Text Width /// public static readonly DependencyProperty TextWidthProperty = DependencyProperty.Register(nameof(TextWidth), typeof(double), typeof(NumericCombo), new PropertyMetadata(20d, new PropertyChangedCallback(OnTextWidthPropertyChanged))); /// /// Scroll Offset /// public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.Register(nameof(VerticalOffset), typeof(double), typeof(NumericCombo), new PropertyMetadata(0d, new PropertyChangedCallback(OnVerticalOffsetPropertyChanged))); /// /// Text Area Width /// public double TextWidth { get { return (double)GetValue(TextWidthProperty); } set { SetValue(TextWidthProperty, value); } } /// /// Text Area FontSize /// public double TextFontSize { get { return (double)GetValue(TextFontSizeProperty); } set { SetValue(TextFontSizeProperty, value); } } /// /// Scroll Offset /// public double VerticalOffset { get { return (double)GetValue(VerticalOffsetProperty); } set { SetValue(VerticalOffsetProperty, value); } } /// /// Show DropDown Item Count /// public int DropDownCount { get { return (int)GetValue(DropDownCountProperty); } set { SetValue(DropDownCountProperty, value); } } /// /// Drop Down Show Flag /// public bool IsDropDown { get { return (bool)GetValue(IsDropDownProperty); } set { SetValue(IsDropDownProperty, value); } } /// /// Value List /// public List ValueList { get { return (List)GetValue(ValueListProperty); } set { SetValue(ValueListProperty, value); } } /// /// Right Button AnimationButton Data /// public M_AnimationButton RightButtonData { get { return (M_AnimationButton)GetValue(RightButtonDataProperty); } set { SetValue(RightButtonDataProperty, value); } } /// /// Left Button AnimationButton Data /// public M_AnimationButton LeftButtonData { get { return (M_AnimationButton)GetValue(LeftButtonDataProperty); } set { SetValue(LeftButtonDataProperty, value); } } /// /// Min Value /// public int MinValue { get { return (int)GetValue(MinValueProperty); } set { SetValue(MinValueProperty, value); } } /// /// Max Value /// public int MaxValue { get { return (int)GetValue(MaxValueProperty); } set { SetValue(MaxValueProperty, value); } } /// /// Selected Value /// public int SelectedValue { get { return (int)GetValue(SelectedValueProperty); } set { SetValue(SelectedValueProperty, value); RaiseSelectChangeEvent(value); } } /// /// Value Step /// public int ValueStep { get { return (int)GetValue(ValueStepProperty); } set { SetValue(ValueStepProperty, value); } } /// /// Text ForegroungBrush /// public string ForegroungBrush { get { return (string)GetValue(ForegroungBrushProperty); } set { SetValue(ForegroungBrushProperty, value); } } /// /// Text BackgroungBrush /// public string BackgroungBrush { get { return (string)GetValue(BackgroungBrushProperty); } set { SetValue(BackgroungBrushProperty, value); } } /// /// Selected Text ForegroundBrush /// public string SelectForegroundBrush { get { return (string)GetValue(SelectForegroundBrushProperty); } set { SetValue(SelectForegroundBrushProperty, value); } } /// /// Selected Text BackgroundBrush /// 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' ] /// /// MouseClicked Event /// public static readonly RoutedEvent SelectChangeEvent = EventManager.RegisterRoutedEvent(nameof(SelectChange), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NumericCombo)); /// /// MouseClicked Routed Event Handler /// public event RoutedEventHandler SelectChange { add { AddHandler(SelectChangeEvent, value); } remove { RemoveHandler(SelectChangeEvent, value); } } #endregion RoutedEvent 'MouseClicked' #endregion Members #region [ Ctor ] /// /// Ctor /// 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 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 } }