using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; 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; using SPC.Kiosk.Common; using SPC.Kiosk.PB.Model; namespace SPC.Kiosk.PB { /// /// DetailBasketItems.xaml에 대한 상호 작용 논리 /// public partial class DetailBasketItems : UserControl { #region [ Members ] /// /// ListItems /// public static readonly DependencyProperty ListItemsProperty = DependencyProperty.Register(nameof(ListItems), typeof(ObservableCollection), typeof(DetailBasketItems), new PropertyMetadata(null, new PropertyChangedCallback(OnListItemsPropertyChanged))); /// /// Command /// public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(nameof(Command), typeof(ICommand), typeof(DetailBasketItems), new UIPropertyMetadata(null)); /// /// Horizontal Scroll Offset /// public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.Register(nameof(HorizontalOffset), typeof(double), typeof(DetailBasketItems), new PropertyMetadata(0d, new PropertyChangedCallback(OnHorizontalOffsetPropertyChanged))); /// /// Display Language /// public static readonly DependencyProperty DisplayLanguagePropery = DependencyProperty.Register(nameof(DisplayLanguage), typeof(SupportLanguageType), typeof(DetailBasketItems), new PropertyMetadata(SupportLanguageType.ko, new PropertyChangedCallback(OnDisplayLanguageProperyChanged))); /// /// Default PageNo /// public static readonly DependencyProperty DefaultPageNoProperty = DependencyProperty.Register(nameof(DefaultPageNo), typeof(int), typeof(DetailBasketItems), new PropertyMetadata(0, new PropertyChangedCallback(OnDefaultPageNoPropertyChanged))); /// /// Page Count /// public static readonly DependencyProperty PageCountProperty = DependencyProperty.Register(nameof(PageCount), typeof(int), typeof(DetailBasketItems), new PropertyMetadata(0)); private int TargetPageNo = 0; private double mouseDownXposition = -1; private bool MoseDown = false; /// /// ListItems /// public ObservableCollection ListItems { get { return (ObservableCollection)GetValue(ListItemsProperty); } set { SetValue(ListItemsProperty, value); } } /// /// Command /// public ICommand Command { get { return (ICommand)GetValue(CommandProperty); } set { SetValue(CommandProperty, value); } } /// /// HorizontalOffset /// public double HorizontalOffset { get { return (double)GetValue(HorizontalOffsetProperty); } set { SetValue(HorizontalOffsetProperty, value); } } /// /// Display Language /// public SupportLanguageType DisplayLanguage { get { return (SupportLanguageType)GetValue(DisplayLanguagePropery); } set { SetValue(DisplayLanguagePropery, value); } } /// /// DefaultPageNo /// public int DefaultPageNo { get { return (int)GetValue(DefaultPageNoProperty); } set { SetValue(DefaultPageNoProperty, value); } } /// /// Page Count /// public int PageCount { get { return (int)GetValue(PageCountProperty); } set { SetValue(PageCountProperty, value); } } #region [ RoutedEvent 'MouseClicked' ] /// /// MouseClicked Event /// public static readonly RoutedEvent MouseClickedEvent = EventManager.RegisterRoutedEvent(nameof(MouseClicked), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(DetailBasketItems)); /// /// MouseClicked Routed Event Handler /// public event RoutedEventHandler MouseClicked { add { AddHandler(MouseClickedEvent, value); } remove { RemoveHandler(MouseClickedEvent, value); } } #endregion RoutedEvent 'MouseClicked' #endregion Members #region [ Ctor & Etc ] /// /// Ctor /// public DetailBasketItems() { InitializeComponent(); this.Unloaded += DetailBasketItems_Unloaded; } #endregion Ctor & Etc #region [ Methods ] /// /// Raise MouseClicked Event /// private void RaiseMouseClickedEvent(object _sender) { //Command Excute if (Command != null && Command.CanExecute(_sender)) { Command.Execute(_sender); } RoutedEventArgs newEventArgs = new RoutedEventArgs(DetailBasketItems.MouseClickedEvent, _sender); RaiseEvent(newEventArgs); } private void FlipItem(FrameworkElement _target) { try { var targetAnimation = new Storyboard(); var getAnimations = Animations.GetMoveAnimation(_target, OpenCloseAnimationType.GotoDown, _target.ActualHeight *-1, 0, 0.5, 1, 0.5); foreach (var aAnimation in getAnimations) targetAnimation.Children.Add(aAnimation); targetAnimation.Begin(); } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "FlipItem()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } private void ItemsButtonCreate(object _listItems) { try { this.GridEventsRemove(); this.MainStack.Children.Clear(); if (_listItems is ObservableCollection lstItems && lstItems.Count > 0) { foreach (var aItem in lstItems) { var newItemObject = new DetailBasketItem(); newItemObject.ItemData = aItem; newItemObject.DisplayLanguage = this.DisplayLanguage; newItemObject.Name = string.Format("ItemStack{0}", aItem.Index); this.ReregisterName(newItemObject.Name, newItemObject); this.MainStack.Children.Add(newItemObject); } this.UpdateLayout(); CommonFunction.ReregisterName(this.Parent as FrameworkElement, this.Name, this); this.GridEventsSet(); this.DefaultPageNo = 0; this.PageCount = lstItems.Count / 5 + (lstItems.Count % 5 > 0 ? 1 : 0); } else { this.PageCount = 0; } } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "ItemsButtonCreate()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } /// /// Events Set /// public void GridEventsSet() { try { MainGrid.PreviewMouseDown += Grid_PreviewMouseDown; MainGrid.PreviewMouseUp += MainGrid_PreviewMouseUp; foreach (var aItem in this.MainStack.Children) { if (aItem is DetailBasketItem ItemContent) { ItemContent.MouseClicked += ItemContent_MouseClicked; } } } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "GridEventsSet()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } /// /// Events Remove /// public void GridEventsRemove() { try { MainGrid.PreviewMouseDown -= Grid_PreviewMouseDown; MainGrid.PreviewMouseMove -= MainGrid_PreviewMouseUp; foreach (var aItem in this.MainStack.Children) { if (aItem is DetailBasketItem ItemContent) { ItemContent.MouseClicked -= ItemContent_MouseClicked; } } this.MainStack.Children.Clear(); } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "GridEventsRemove()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } public void ChangePageTo(int _toPageNo) { try { if (_toPageNo > -1 && _toPageNo < PageCount) { var fromOffset = 0d; var toOffset = 0d; var totalTime = 0.3; fromOffset = this.MainScroll.HorizontalOffset; toOffset = this.Width * _toPageNo; var scrollAnimation = Animations.GetScrollAnimation(this, Orientation.Horizontal, fromOffset, toOffset, totalTime); if (scrollAnimation != null) { scrollAnimation.Completed += ScrollAnimation_Completed; scrollAnimation.Begin(); } TargetPageNo = _toPageNo; } } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "ChangePageTo()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } #endregion Methods #region [ Event Handlers ] private void ScrollAnimation_Completed(object sender, EventArgs e) { var targetGrid = this.FindName(string.Format("PageGrid{0}", TargetPageNo)); if (targetGrid is Grid selectGrid) { DefaultPageNo = TargetPageNo; selectGrid.IsEnabled = true; } } private void DetailBasketItems_Unloaded(object sender, RoutedEventArgs e) { this.MainStack.Children.Clear(); this.ListItems = null; } private static void OnDisplayLanguageProperyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { try { if (e.NewValue is SupportLanguageType newValue && !e.NewValue.Equals(e.OldValue)) { var target = d as DetailBasketItems; foreach (var aItem in target.MainStack.Children) { if (aItem is DetailBasketItem ItemContent) { ItemContent.DisplayLanguage = newValue; } } } } catch (Exception ex) { CommonLog.ErrorLogWrite(d, "OnDisplayLanguageProperyChanged()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } private static void OnHorizontalOffsetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue != e.OldValue) { var target = d as DetailBasketItems; target.MainScroll.ScrollToHorizontalOffset((double)e.NewValue); } } private static void OnDefaultPageNoPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { var target = d as DetailBasketItems; target.ChangePageTo((int)e.NewValue); } } private static void OnListItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var target = d as DetailBasketItems; target.ItemsButtonCreate(e.NewValue); } private void Grid_PreviewMouseDown(object sender, MouseButtonEventArgs e) { var requstGrid = sender as Grid; mouseDownXposition = e.GetPosition(sender as Grid).X; MoseDown = true; } private void MainGrid_PreviewMouseUp(object sender, MouseEventArgs e) { if (!MoseDown) return; var requstGrid = sender as Grid; var curMouseXposition = e.GetPosition(requstGrid).X; if (!mouseDownXposition.Equals(-1) && (mouseDownXposition - curMouseXposition) > 50) { if (this.DefaultPageNo < this.PageCount - 1) this.DefaultPageNo++; } else if (!mouseDownXposition.Equals(-1) && (mouseDownXposition - curMouseXposition) < -50) { if (this.DefaultPageNo > 0) this.DefaultPageNo--; } mouseDownXposition = curMouseXposition; MoseDown = false; } private void ItemContent_MouseClicked(object sender, RoutedEventArgs e) { RaiseMouseClickedEvent(e.OriginalSource); } #endregion Event Handlers } }