/Src/VimWpf/Implementation/CharDisplay/ControlCharUtil.cs

https://github.com/jhamm/VsVim
C# | 132 lines | 114 code | 16 blank | 2 comment | 7 complexity | 96436d0cd788bc21295d52a28974eaf2 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.Composition;
  4. using System.Linq;
  5. using System.Text;
  6. namespace Vim.UI.Wpf.Implementation.CharDisplay
  7. {
  8. [Export(typeof(IControlCharUtil))]
  9. internal sealed class ControlCharUtil : IControlCharUtil
  10. {
  11. private bool _displayControlChars = true;
  12. private EventHandler _displayControlCharsChanged;
  13. private bool DisplayControlChars
  14. {
  15. get { return _displayControlChars; }
  16. set
  17. {
  18. if (value != _displayControlChars)
  19. {
  20. _displayControlChars = value;
  21. RaiseDisplayControlCharsChanged();
  22. }
  23. }
  24. }
  25. internal static bool IsDisplayControlChar(char c)
  26. {
  27. var i = (int)c;
  28. return IsRelevant(i);
  29. }
  30. internal static bool IsRelevant(int i)
  31. {
  32. return i <= 31;
  33. }
  34. internal static bool TryGetDisplayText(char c, out string text)
  35. {
  36. var i = (int)c;
  37. if (!IsRelevant(i))
  38. {
  39. text = null;
  40. return false;
  41. }
  42. // There is an intentional gap here from 9 - 13 inclusive. These represent characters like tab, newline,
  43. // etc ... which shouldn't be special cased in display by VsVim
  44. if (i >= 9 && i <= 13)
  45. {
  46. text = null;
  47. return false;
  48. }
  49. return TryGetDisplayText(i, out text);
  50. }
  51. internal static bool TryGetDisplayText(int i, out string text)
  52. {
  53. text = null;
  54. switch (i)
  55. {
  56. case 0: text = "^@"; break;
  57. case 1: text = "^A"; break;
  58. case 2: text = "^B"; break;
  59. case 3: text = "^C"; break;
  60. case 4: text = "^D"; break;
  61. case 5: text = "^E"; break;
  62. case 6: text = "^F"; break;
  63. case 7: text = "^G"; break;
  64. case 8: text = "^H"; break;
  65. case 9: text = "^I"; break;
  66. case 10: text = "^J"; break;
  67. case 11: text = "^K"; break;
  68. case 12: text = "^L"; break;
  69. case 13: text = "^M"; break;
  70. case 14: text = "^N"; break;
  71. case 15: text = "^O"; break;
  72. case 16: text = "^P"; break;
  73. case 17: text = "^Q"; break;
  74. case 18: text = "^R"; break;
  75. case 19: text = "^S"; break;
  76. case 20: text = "^T"; break;
  77. case 21: text = "^U"; break;
  78. case 22: text = "^V"; break;
  79. case 23: text = "^W"; break;
  80. case 24: text = "^X"; break;
  81. case 25: text = "^Y"; break;
  82. case 26: text = "^Z"; break;
  83. case 27: text = "^["; break;
  84. case 28: text = "^\\"; break;
  85. case 29: text = "^]"; break;
  86. case 30: text = "^^"; break;
  87. case 31: text = "^_"; break;
  88. }
  89. return text != null;
  90. }
  91. private void RaiseDisplayControlCharsChanged()
  92. {
  93. _displayControlCharsChanged?.Invoke(this, EventArgs.Empty);
  94. }
  95. #region IControlCharUtil
  96. bool IControlCharUtil.DisplayControlChars
  97. {
  98. get { return DisplayControlChars; }
  99. set { DisplayControlChars = value; }
  100. }
  101. event EventHandler IControlCharUtil.DisplayControlCharsChanged
  102. {
  103. add { _displayControlCharsChanged += value; }
  104. remove { _displayControlCharsChanged -= value; }
  105. }
  106. bool IControlCharUtil.IsDisplayControlChar(char c)
  107. {
  108. return IsDisplayControlChar(c);
  109. }
  110. bool IControlCharUtil.TryGetDisplayText(char c, out string text)
  111. {
  112. return TryGetDisplayText(c, out text);
  113. }
  114. #endregion
  115. }
  116. }