Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
5.4 KiB

  1. //// TEXTEDIT.C
  2. //
  3. //
  4. #include "precomp.hxx"
  5. #include "global.h"
  6. BOOL EditKeyDown(WCHAR wc) {
  7. switch(wc) {
  8. case VK_LEFT:
  9. if (g_iCurChar) {
  10. g_iCurChar--;
  11. if ( g_iCurChar
  12. && g_wcBuf[g_iCurChar] == 0x000A
  13. && g_wcBuf[g_iCurChar-1] == 0x000D) {
  14. g_iCurChar--;
  15. }
  16. // If shift is down, extend selection, else clear it
  17. if (GetKeyState(VK_SHIFT) >= 0) {
  18. g_iFrom = g_iCurChar;
  19. }
  20. g_iTo = g_iCurChar;
  21. InvalidateText();
  22. g_fUpdateCaret = TRUE;
  23. }
  24. break;
  25. case VK_RIGHT:
  26. if (g_iCurChar < g_iTextLen) {
  27. if ( g_iCurChar < g_iTextLen-1
  28. && g_wcBuf[g_iCurChar] == 0x000D
  29. && g_wcBuf[g_iCurChar+1] == 0x000A) {
  30. g_iCurChar+= 2;
  31. } else {
  32. g_iCurChar++;
  33. }
  34. // If shift is down, extend selection, else clear it
  35. if (GetKeyState(VK_SHIFT) >= 0) {
  36. g_iFrom = g_iCurChar;
  37. }
  38. g_iTo = g_iCurChar;
  39. InvalidateText();
  40. g_fUpdateCaret = TRUE;
  41. }
  42. break;
  43. case VK_HOME:
  44. // Implemented as - go to start of text
  45. g_iCurChar = 0;
  46. g_iFrom = 0;
  47. g_iTo = 0;
  48. InvalidateText();
  49. g_fUpdateCaret = TRUE;
  50. break;
  51. case VK_END:
  52. // Implemented as - go to end of text
  53. g_iCurChar = g_iTextLen;
  54. g_iFrom = g_iTextLen;
  55. g_iTo = g_iTextLen;
  56. InvalidateText();
  57. g_fUpdateCaret = TRUE;
  58. break;
  59. case VK_INSERT:
  60. if (g_RangeCount < MAX_RANGE_COUNT)
  61. {
  62. g_Ranges[g_RangeCount].First = g_iFrom;
  63. g_Ranges[g_RangeCount].Length = g_iTo - g_iFrom;
  64. g_RangeCount++;
  65. }
  66. InvalidateText();
  67. break;
  68. case VK_DELETE:
  69. if (GetKeyState(VK_LSHIFT) & 0x8000)
  70. {
  71. g_RangeCount = 0;
  72. }
  73. else
  74. {
  75. if (g_iFrom != g_iTo) {
  76. // Delete selection
  77. if (g_iFrom < g_iTo) {
  78. TextDelete(g_iFrom, g_iTo-g_iFrom);
  79. g_iTo = g_iFrom;
  80. g_iCurChar = g_iFrom;
  81. } else {
  82. TextDelete(g_iTo, g_iFrom-g_iTo);
  83. g_iTo = g_iTo;
  84. g_iCurChar = g_iTo;
  85. }
  86. } else {
  87. // Delete character
  88. if (g_iCurChar < g_iTextLen) {
  89. if ( g_iCurChar < g_iTextLen-1
  90. && g_wcBuf[g_iCurChar] == 0x000D
  91. && g_wcBuf[g_iCurChar+1] == 0x000A) {
  92. TextDelete(g_iCurChar, 2);
  93. } else {
  94. TextDelete(g_iCurChar, 1);
  95. }
  96. }
  97. }
  98. }
  99. InvalidateText();
  100. g_fUpdateCaret = TRUE;
  101. break;
  102. }
  103. return TRUE;
  104. }
  105. BOOL EditChar(WCHAR wc) {
  106. switch(wc) {
  107. case VK_RETURN:
  108. if (!TextInsert(g_iCurChar, L"\r\n", 2))
  109. return FALSE;
  110. InvalidateText();
  111. g_iCurChar+=2;
  112. break;
  113. case VK_BACK:
  114. if (g_iCurChar) {
  115. g_iCurChar--;
  116. if ( g_iCurChar
  117. && g_wcBuf[g_iCurChar] == 0x000A
  118. && g_wcBuf[g_iCurChar-1] == 0x000D) {
  119. g_iCurChar--;
  120. TextDelete(g_iCurChar, 2);
  121. } else {
  122. TextDelete(g_iCurChar, 1);
  123. }
  124. InvalidateText();
  125. g_fUpdateCaret = TRUE;
  126. }
  127. break;
  128. case 1: // Ctrl/A - select all
  129. g_iFrom = 0;
  130. g_iTo = g_iTextLen;
  131. InvalidateText();
  132. break;
  133. default:
  134. /*
  135. if(!((wc >= 0x0900 && wc < 0x0d80)
  136. || wc == 0x200c
  137. || wc == 0x200d)){
  138. TranslateCharToUnicode(&wc);
  139. }
  140. */
  141. if (!TextInsert(g_iCurChar, &wc, 1)) {
  142. return FALSE;
  143. }
  144. // If there was a range marked previously, now delete that range
  145. if (g_iFrom < g_iTo) {
  146. TextDelete(g_iFrom, g_iTo-g_iFrom);
  147. g_iTo = g_iFrom;
  148. g_iCurChar = g_iFrom+1;
  149. } else if (g_iTo < g_iFrom) {
  150. TextDelete(g_iTo, g_iFrom-g_iTo);
  151. g_iFrom = g_iTo;
  152. g_iCurChar = g_iTo+1;
  153. } else {
  154. // No prior selected text
  155. g_iCurChar++;
  156. }
  157. InvalidateText();
  158. g_fUpdateCaret = TRUE;
  159. break;
  160. }
  161. return TRUE;
  162. }