AbstractSelectionCommand.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Quadarax.Foundation.Core.Console;
  5. using Quadarax.Foundation.Core.QConsole.Argument;
  6. using Quadarax.Foundation.Core.Value;
  7. namespace Quadarax.Foundation.Core.QConsole.Command.Base
  8. {
  9. public abstract class AbstractSelectionCommand : AbstractListCommand
  10. {
  11. #region *** Private fields ***
  12. private int _maxSelections;
  13. private int _minSelections;
  14. private IList<ISelectionEntry> _selectedItems;
  15. #endregion
  16. #region *** Properties ***
  17. protected abstract bool IsStoredToGlobal { get; }
  18. protected int MaxSelections => _maxSelections;
  19. protected int MinSelections => _minSelections;
  20. public ISelectionEntry[] SelectedItems => _selectedItems.ToArray();
  21. #endregion
  22. #region *** Constructors ***
  23. protected AbstractSelectionCommand(Engine engine,int minSelection, int maxSelection) : base(engine)
  24. {
  25. if (maxSelection==0)
  26. throw new ArgumentOutOfRangeException(nameof(maxSelection),$"Max selections value must be bigger than zero in command '{Name}'.");
  27. if (minSelection==0)
  28. throw new ArgumentOutOfRangeException(nameof(minSelection),$"Min selections value must be bigger than zero in command '{Name}'.");
  29. if (minSelection > maxSelection)
  30. throw new ArgumentOutOfRangeException(nameof(maxSelection),$"Max selections value must be bigger than Min selection value in command '{Name}'.");
  31. _maxSelections = maxSelection;
  32. _minSelections = minSelection;
  33. _selectedItems = new List<ISelectionEntry>();
  34. }
  35. #endregion
  36. #region *** Public Operations ***
  37. public void ClearSelected()
  38. {
  39. _selectedItems.Clear();
  40. WriteDebugInfo($"Command '{Name}' clears selected items.");
  41. }
  42. #endregion
  43. #region *** Protected Overrides ***
  44. protected override IEnumerable<AbstractArgument> OnSetupArguments()
  45. {
  46. var arguments = base.OnSetupArguments().ToList();
  47. arguments.AddRange(
  48. new []
  49. {
  50. new FlagArgument(Constants.Arguments.Selection.Code,
  51. Constants.Arguments.Selection.Description,
  52. Constants.Arguments.Selection.Hint, false)
  53. });
  54. return arguments;
  55. }
  56. protected override Result EndExecute(Result incommingResult)
  57. {
  58. var result = base.EndExecute(incommingResult);
  59. if (!result.IsSuccess)
  60. return result;
  61. ClearSelected();
  62. var nCnt = Items.Count();
  63. var selectionEnabled = GetArgument(Constants.Arguments.Selection.Code);
  64. if ((bool) (selectionEnabled.Value.Get() ?? false) == false)
  65. return result;
  66. using (var writer = new ConsoleWriter(ConsoleColor.White))
  67. {
  68. using (var writerCyan = new ConsoleWriter(ConsoleColor.Cyan))
  69. {
  70. writer.WriteLine($"Select ordinal values separated by '{Engine.Configuration.CharacterSelectionInputValueSeparator}'...");
  71. writer.WriteLine($"Must be selected at least {MinSelections} ordinals and maximal {MaxSelections} ordinals.");
  72. writerCyan.Write($"[1-{nCnt}]>");
  73. var ordinalString = writerCyan.ReadLine() ?? String.Empty;
  74. var ordinals = ordinalString.Split(new[] {Engine.Configuration.CharacterSelectionInputValueSeparator}, StringSplitOptions.RemoveEmptyEntries);
  75. if (!(MinSelections<=ordinals.Length && ordinals.Length <= MaxSelections))
  76. throw new Exception($"Number of ordinals must be in interval <{MinSelections};{MaxSelections}>. Current number of ordinals is {ordinals.Length}.");
  77. foreach (var ordinal in ordinals.Select(x=>int.Parse(x)))
  78. {
  79. if (ordinal<0 || ordinal > nCnt)
  80. throw new Exception($"Ordinal {ordinal} is out of scope interval <1;{nCnt}>.");
  81. _selectedItems.Add(GetItem(ordinal-1));
  82. }
  83. writer.WriteLine($"Selected {_selectedItems.Count} ordinals.");
  84. if (IsStoredToGlobal)
  85. Engine.AppendSelection(_selectedItems.ToArray());
  86. }
  87. }
  88. return result;
  89. }
  90. protected void EnableDefaultSelectionMode()
  91. {
  92. var argSelectionMode = GetArgument(Constants.Arguments.Selection.Code);
  93. argSelectionMode.DefaultValue.Set(true);
  94. argSelectionMode.SetValueAsDefault();
  95. }
  96. protected void DisableDefaultSelectionMode()
  97. {
  98. var argSelectionMode = GetArgument(Constants.Arguments.Selection.Code);
  99. argSelectionMode.DefaultValue.Set(false);
  100. argSelectionMode.SetValueAsDefault();
  101. }
  102. #endregion
  103. #region *** Private Operations ***
  104. #endregion
  105. }
  106. }