ProductChargeEditor.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using Comal.Classes;
  2. using InABox.DynamicGrid;
  3. using Syncfusion.Windows.Shared;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. using System.Windows.Media;
  12. using Syncfusion.Windows.Tools.Controls;
  13. namespace PRS.Shared
  14. {
  15. public class ProductPriceEditorControl : DynamicEnclosedEditorControl<ProductCharge, ProductChargeEditor>
  16. {
  17. private DockPanel _dockpanel;
  18. private ComboBox _chargeable;
  19. private ComboBox _pricetype;
  20. private Border _priceborder;
  21. private Label _fixedpricelabel;
  22. private DoubleTextBox _pricevalue;
  23. private Label _markuplabel;
  24. private ProductCharge _productCharge = new();
  25. public override void Configure()
  26. {
  27. }
  28. private readonly Dictionary<ProductPriceType, Tuple<String, String>> _pricetypelabel =
  29. new Dictionary<ProductPriceType, Tuple<String, String>>()
  30. {
  31. { ProductPriceType.FixedPrice, new Tuple<String, String>("$", "") },
  32. { ProductPriceType.CostPlus, new Tuple<String, String>("", "%") },
  33. };
  34. protected override FrameworkElement CreateEditor()
  35. {
  36. _chargeable = new ComboBox()
  37. {
  38. ItemsSource = new String[] { "Unchargeable", "Chargeable" },
  39. VerticalContentAlignment = VerticalAlignment.Center,
  40. HorizontalContentAlignment = HorizontalAlignment.Center,
  41. SelectedIndex = _productCharge.Chargeable ? 1 : 0,
  42. Width = 150.0F
  43. };
  44. _chargeable.SelectionChanged += _chargeable_Changed;
  45. _pricetype = new ComboBox
  46. {
  47. ItemsSource = Enum.GetValues<ProductPriceType>(),
  48. VerticalContentAlignment = VerticalAlignment.Center,
  49. HorizontalContentAlignment = HorizontalAlignment.Center,
  50. SelectedValue = _productCharge.PriceType,
  51. Margin = new Thickness(5,0,0,0),
  52. Width = 100.0F,
  53. Visibility = _productCharge.Chargeable ? Visibility.Visible : Visibility.Collapsed
  54. };
  55. _pricetype.SelectionChanged += _pricetype_SelectionChanged;
  56. _fixedpricelabel = new Label()
  57. {
  58. Content = _pricetypelabel[_productCharge.PriceType].Item1,
  59. Margin = new Thickness(5,0,0,0),
  60. Padding = new Thickness(0),
  61. HorizontalContentAlignment = HorizontalAlignment.Center,
  62. VerticalContentAlignment = VerticalAlignment.Center
  63. };
  64. _pricevalue = new DoubleTextBox
  65. {
  66. Padding = new Thickness(0),
  67. Margin= new Thickness(0),
  68. VerticalContentAlignment = VerticalAlignment.Center,
  69. HorizontalContentAlignment = HorizontalAlignment.Center,
  70. VerticalAlignment = VerticalAlignment.Stretch,
  71. BorderThickness = new Thickness(0.0F),
  72. };
  73. _pricevalue.ValueChanged += _pricevalue_Changed;
  74. _markuplabel = new Label()
  75. {
  76. Content = _pricetypelabel[_productCharge.PriceType].Item2,
  77. Margin= new Thickness(0,0,5,0),
  78. Padding = new Thickness(0),
  79. HorizontalContentAlignment = HorizontalAlignment.Center,
  80. VerticalContentAlignment = VerticalAlignment.Center
  81. };
  82. Grid grid = new Grid()
  83. {
  84. ColumnDefinitions =
  85. {
  86. new ColumnDefinition() { Width = new GridLength(20.0F, GridUnitType.Pixel) },
  87. new ColumnDefinition() { Width = new GridLength(60.0F, GridUnitType.Pixel) },
  88. new ColumnDefinition() { Width = new GridLength(20.0F, GridUnitType.Pixel) },
  89. }
  90. };
  91. _fixedpricelabel.SetValue(Grid.ColumnProperty, 0);
  92. grid.Children.Add(_fixedpricelabel);
  93. _pricevalue.SetValue(Grid.ColumnProperty, 1);
  94. grid.Children.Add(_pricevalue);
  95. _markuplabel.SetValue(Grid.ColumnProperty, 2);
  96. grid.Children.Add(_markuplabel);
  97. _priceborder = new Border()
  98. {
  99. BorderBrush = new SolidColorBrush(Colors.Gray),
  100. BorderThickness = new Thickness(0.75),
  101. Margin = new Thickness(5,0,0,0),
  102. Padding = new Thickness(0),
  103. Visibility = _productCharge.Chargeable ? Visibility.Visible : Visibility.Collapsed,
  104. Child = grid
  105. };
  106. _dockpanel = new DockPanel() { LastChildFill = false };
  107. _chargeable.SetValue(DockPanel.DockProperty, Dock.Left);
  108. _dockpanel.Children.Add(_chargeable);
  109. _pricetype.SetValue(DockPanel.DockProperty, Dock.Left);
  110. _dockpanel.Children.Add(_pricetype);
  111. _priceborder.SetValue(DockPanel.DockProperty, Dock.Left);
  112. _dockpanel.Children.Add(_priceborder);
  113. return _dockpanel;
  114. }
  115. protected override void SetChildValue(string property, object? value)
  116. {
  117. if (property == nameof(_productCharge.Chargeable) && value is bool b)
  118. {
  119. _productCharge.Chargeable = b;
  120. _chargeable.SelectedIndex = b ? 1 : 0;
  121. }
  122. else if (property == nameof(_productCharge.Markup) && value is double markup)
  123. {
  124. _productCharge.Markup = markup;
  125. if (_productCharge.PriceType == ProductPriceType.CostPlus)
  126. {
  127. _pricevalue.Value = markup;
  128. }
  129. }
  130. else if (property == nameof(_productCharge.Price) && value is double price)
  131. {
  132. _productCharge.Price = price;
  133. if(_productCharge.PriceType == ProductPriceType.FixedPrice)
  134. {
  135. _pricevalue.Value = price;
  136. }
  137. }
  138. else if (property == nameof(_productCharge.PriceType) && value is ProductPriceType priceType)
  139. {
  140. _productCharge.PriceType = priceType;
  141. _pricetype.SelectedValue = priceType;
  142. }
  143. }
  144. protected override object? GetChildValue(string property)
  145. {
  146. if (property == nameof(_productCharge.Chargeable)) return _productCharge.Chargeable;
  147. if (property == nameof(_productCharge.Markup)) return _productCharge.Markup;
  148. if (property == nameof(_productCharge.Price)) return _productCharge.Price;
  149. if (property == nameof(_productCharge.PriceType)) return _productCharge.PriceType;
  150. return null;
  151. }
  152. protected override IEnumerable<KeyValuePair<string, object?>> GetChildValues()
  153. {
  154. yield return new(nameof(_productCharge.Chargeable), _productCharge.Chargeable);
  155. yield return new(nameof(_productCharge.Markup), _productCharge.Markup);
  156. yield return new(nameof(_productCharge.Price), _productCharge.Price);
  157. yield return new(nameof(_productCharge.PriceType), _productCharge.PriceType);
  158. }
  159. private void _chargeable_Changed(object sender, SelectionChangedEventArgs e)
  160. {
  161. _productCharge.Chargeable = _chargeable.SelectedIndex == 1;
  162. _pricetype.Visibility = _productCharge.Chargeable ? Visibility.Visible : Visibility.Collapsed;
  163. _priceborder.Visibility = _productCharge.Chargeable ? Visibility.Visible : Visibility.Collapsed;
  164. }
  165. private void _pricetype_SelectionChanged(object sender, SelectionChangedEventArgs e)
  166. {
  167. if(_pricetype.SelectedValue is ProductPriceType priceType)
  168. {
  169. _productCharge.PriceType = priceType;
  170. _pricevalue.Value = priceType switch
  171. {
  172. ProductPriceType.CostPlus => _productCharge.Markup,
  173. _ => _productCharge.Price,
  174. };
  175. _fixedpricelabel.Content = _pricetypelabel[priceType].Item1;
  176. _markuplabel.Content = _pricetypelabel[priceType].Item2;
  177. }
  178. CheckChanged();
  179. }
  180. private void _pricevalue_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
  181. {
  182. var price = _pricevalue.Value ?? 0.0;
  183. switch (_productCharge.PriceType)
  184. {
  185. case ProductPriceType.FixedPrice:
  186. _productCharge.Price = price;
  187. break;
  188. case ProductPriceType.CostPlus:
  189. _productCharge.Markup = price;
  190. break;
  191. }
  192. CheckChanged();
  193. }
  194. public override int DesiredHeight()
  195. {
  196. return 25;
  197. }
  198. public override int DesiredWidth()
  199. {
  200. return int.MaxValue;
  201. }
  202. public override void SetColor(System.Windows.Media.Color color)
  203. {
  204. var brush = new SolidColorBrush(color);
  205. // _chargeable.Background = brush;
  206. // _pricetype.Background = brush;
  207. _pricevalue.Background = brush;
  208. _fixedpricelabel.Background = brush;
  209. _markuplabel.Background = brush;
  210. _priceborder.Background = brush;
  211. }
  212. public override void SetFocus()
  213. {
  214. _pricevalue.Focus();
  215. }
  216. }
  217. }