textedit.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Text editing handler
  2. typedef int (*HANDLER)(int);
  3. HANDLER handler=0;
  4. int EDH_proc=0;
  5. int tHandle(int key) {
  6. int *kp=get_keylist();
  7. /* UP/DOWN mode=0/2nd/Shift */
  8. if (key==*kp++) { if (ac_on) ScrollUp(&ac_s); else cpos=up(curpos,xcur),tab_chk_r(cpos),selpos=0; }
  9. else if (key==*kp++) { if (ac_on)ScrollDn(&ac_s);else cpos=down(curpos,xcur),tab_chk_r(cpos),selpos=0; }
  10. else if (key==*kp++) {
  11. n=NLINES; cpos=curpos; while (n--) cpos=up(cpos,xcur);
  12. tab_chk_l(cpos); selpos=0;
  13. } else if (key==*kp++) {
  14. n=NLINES; cpos=curpos; while (n--) cpos=down(cpos,xcur);
  15. tab_chk_l(cpos); selpos=0;
  16. } else if (key==*kp++) selpos=up(curpos,xcur),tab_chk_r(selpos);
  17. else if (key==*kp++) selpos=down(curpos,xcur),tab_chk_r(selpos);
  18. /* LEFT/RIGHT mode=0/2nd/Shift */
  19. else if (key==*kp++) {
  20. if (sel1) cpos=sel1, selpos=0;
  21. else if (curpos>1) {
  22. cpos=curpos;
  23. cpos--; if (tptr[cpos-1]==NEWLINE) cpos--;
  24. selpos=0; tab_chk_l(cpos);
  25. }
  26. } else if (key==*kp++) {
  27. if (sel2) cpos=sel2;
  28. else if (cpos<size) { if (tptr[cpos]==NEWLINE) cpos++; cpos++; }
  29. selpos=0; tab_chk_r(cpos);
  30. } else if (key==*kp++) {
  31. cpos=curpos; while (cpos>1 && tptr[cpos-2]!=NEWLINE) cpos--; selpos=0;
  32. } else if (key==*kp++) {
  33. cpos=curpos; while (tptr[cpos] && tptr[cpos]!=NEWLINE) cpos++; selpos=0;
  34. } else if (key==*kp++) { if (curpos>1) {
  35. selpos=curpos; selpos--; if (tptr[selpos-1]==NEWLINE) selpos--; tab_chk_l(selpos);
  36. } } else if (key==*kp++) { if (curpos<size) {
  37. selpos=curpos; if (tptr[selpos]==NEWLINE) selpos++; selpos++; tab_chk_r(selpos);
  38. } } else if ((k=0,key==*kp++) || (k++,key==*kp++)) { /* BACKSPACE / DELETE */
  39. last_act=-1;
  40. if (sel1!=sel2) sel_del();
  41. else {
  42. if (k && cpos<size) { if (tptr[cpos]==NEWLINE) cpos++; cpos++; }
  43. if (cpos>1) {
  44. int n=tptr[cpos-2]==NEWLINE?2:1;
  45. memmove(tptr+cpos-n,tptr+cpos,size+1+1-cpos);
  46. size-=n; cpos-=n;
  47. }
  48. }
  49. } else if ((k=0,key==*kp++) || (k=1,key==*kp++)) { /* CUT/COPY */
  50. if (sel1!=sel2) {
  51. CB_replaceTEXT(tptr+sel1,sel2-sel1,0);
  52. if (!k) sel_del();
  53. }
  54. } else if (key==*kp++) { /* PASTE */
  55. HANDLE hd; long len;
  56. if (CB_fetchTEXT(&hd,&len))
  57. sel_del(), insert((unsigned short)len),
  58. memcpy(tptr+(cpos-(unsigned short)len),HeapDeref(hd),(unsigned short)len); // multitask-unsafe !
  59. } else if (key==KEY_ENTER) {
  60. int n; unsigned int dpos=0;
  61. if (ac_on) ac_do();
  62. sel_del();
  63. n=whitespace(cpos,cpos);
  64. if (tptr[cpos-1]=='{') {
  65. if (whitespace(cpos+2,-1)<=n) {
  66. int i=n+2;
  67. insert(2+i), tptr[cpos-i-2]=NEWLINE;
  68. do tptr[cpos-i-1]=' '; while (i--);
  69. dpos=cpos;
  70. } else n+=2;
  71. }
  72. insert(2+n), tptr[cpos-n-2]=NEWLINE;
  73. do tptr[cpos-n-1]=' '; while (n--);
  74. if (dpos) cpos=dpos;
  75. } else if (key>=14 && key<=255) {
  76. if (!isidch(key) && ac_on) ac_do();
  77. sel_del(), insert(1), tptr[cpos-1]=key;
  78. } else if (key!=KEY_ESC && !EDH_proc && (key&0xFFF0)!=0x0150 /* arrow keys [they seem to bug] */) {
  79. int k2=0;
  80. void EVh(EVENT *ev) {
  81. if (ev->Type==CM_KEYPRESS) k2=ev->extra.Key.Code+1;
  82. else if (ev->Type==CM_STRING) {
  83. char *p=ev->extra.pasteText; int n;
  84. sel_del(), insert(n=strlen(p)), memcpy(tptr+cpos-n,p,n);
  85. }
  86. ER_throwVar(1);
  87. }
  88. EVENT e;
  89. while ((k=*kp++)) if (key==k) goto keydone;
  90. e.Type=CM_KEYPRESS;
  91. e.extra.Key.Code=key;
  92. // e.extra.Key.Mod =key&0xF000;
  93. EV_captureEvents((EVENT_HANDLER)EVh);
  94. PortRestore();
  95. TRY
  96. EV_defaultHandler(&e);
  97. ONERR
  98. EV_captureEvents(NULL);
  99. ENDTRY
  100. PortSet(Port,239,127);
  101. EDH_proc=1;
  102. return handler(k2);
  103. } else return 0;
  104. keydone:
  105. return 1;
  106. }
  107. int dHandle(int key) {
  108. } else if (k==KEY_ON && key!=k) {
  109. if (key&4096) key=KEY_ESC;
  110. Off();
  111. }
  112. } else if (key==KEY_CLEAR) {
  113. int n;
  114. if (ac_on) ac_do();
  115. sel_del(), insert(n=even(cpos)+1), tptr[cpos-n]=' ', tptr[cpos-1]=' ';
  116. } else if (key=='(' || key=='[' || key=='{') {
  117. int x=key=='('?0:(key=='['?1:2);
  118. if (ac_on) ac_do();
  119. text_enclose(((char *[]){"(","[","{"})[x],((char *[]){")","]","}"})[x]);
  120. } else if ((k=key&~(32|4096|8192|16384))=='X' || k=='Y' || k=='Z' || k=='T') {
  121. k-='X'; if (k<0) k=3; k+=k;
  122. if (key&4096) k++;
  123. text_enclose(((char *[]){"if (","if (","for (","for (","while (","while ("})[k],
  124. ((char *[]){")\n\t\n\b",") {\n\t\n\b}\n"})[k&1]);
  125. } else if ((k=(key&*kp++))>='1' && k<='9') { /* kbdprgm# - custom shortcuts */
  126. } else if (key==*kp++) { /* CATALOG */
  127. Catalog();
  128. } else if ((k=(key-KEY_F1+1))>=1 && k<=8) { /* Function key F# */
  129. /*if (k==1) TestDisp();
  130. else*/ if (k==3) FindDlg();