hschumann2/TempleOS-Source-Code
0832
1 2#help_index "DolDoc/Output;StdOut/DolDoc"3 4public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0)5{//PutKey(ch,sc) at doc insert pt, cur_entry.6 I64 i,x,y;7 CDoc *m;8 CDocEntry *doc_ce;9 U8 *st,*st2;10 Bool unlock;11 12 if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)13 return;14 if (doc->user_put_key && (*doc->user_put_key)(doc,doc->user_put_data,ch,sc))15 return;16 unlock=DocLock(doc);17 if (!Bt(doldoc.clean_scan_codes,sc.u8[0]))18 doc->flags|=DOCF_UNDO_DIRTY;19 DocCaptureUndo(doc);20 if (Bt(char_bmp_printable,ch) && !(sc&(SCF_CTRL|SCF_ALT))) {21 if (sc&SCF_KEY_DESC) {22 st=Char2KeyName(ch,FALSE);23 KeyDescSet("Char /'%s'",st);24 Free(st);25 } else26 EdCharIns(ch,sc,doc);27 } else {28 doc_ce=doc->cur_entry;29 x=doc->x; y=doc->y;30 if (sc&SCF_ALT)31 switch (ch) {32 case CH_BACKSPACE: //<CTRL-H>33 if (!(sc&(SCF_SHIFT|SCF_CTRL))) {34 if (sc&SCF_KEY_DESC)35 KeyDescSet("Edit/Undo");36 else37 DocUndoRestore(doc);38 }39 break;40 }41 else42 switch (ch) {43 case 0:44 switch (sc.u8[0]) {45 case SC_CURSOR_DOWN:46 if (!(sc&SCF_CTRL)) {47 if (sc&SCF_KEY_DESC) {48 if (sc&SCF_SHIFT)49 KeyDescSet("Edit/Cursor Down, Sel");50 else51 KeyDescSet("Edit/Cursor Down");52 } else53 EdLineDown(doc,sc);54 break;55 } else56 sc&=~SCF_CTRL;57//Fall Through to SC_END58 case SC_END:59 if (!(sc&SCF_CTRL)) {60 if (sc&SCF_KEY_DESC) {61 if (sc&SCF_SHIFT)62 KeyDescSet("Edit/GoTo Doc End, Sel");63 else64 KeyDescSet("Edit/GoTo Doc End");65 } else {66 while (doc_ce!=doc) {67 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);68 doc_ce=doc->cur_entry=doc_ce->next;69 }70 doc->cur_col=doc_ce->min_col;71 DocFormBwd(doc);72 }73 }74 break;75 case SC_CURSOR_UP:76 if (!(sc&SCF_CTRL)) {77 if (sc&SCF_KEY_DESC) {78 if (sc&SCF_SHIFT)79 KeyDescSet("Edit/Cursor Up, Sel");80 else81 KeyDescSet("Edit/Cursor Up");82 } else83 EdLineUp(doc,sc);84 break;85 } else86 sc&=~SCF_CTRL;87//Fall Through to SC_HOME88 case SC_HOME:89 if (!(sc&SCF_CTRL)) {90 if (sc&SCF_KEY_DESC) {91 if (sc&SCF_SHIFT)92 KeyDescSet("Edit/GoTo Top of Doc, Sel");93 else94 KeyDescSet("Edit/GoTo Top of Doc");95 } else {96 if (doc_ce==doc) doc_ce=doc_ce->last;97 while (doc_ce!=doc) {98 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);99 doc_ce=doc->cur_entry=doc_ce->last;100 }101 doc_ce=doc->cur_entry=doc->head.next;102 doc->cur_col=doc_ce->min_col;103 DocFormFwd(doc);104 }105 }106 break;107 case SC_PAGE_DOWN:108 if (!(sc&SCF_CTRL)) {109 if (sc&SCF_KEY_DESC) {110 if (sc&SCF_SHIFT)111 KeyDescSet("Edit/Page Down, Sel");112 else113 KeyDescSet("Edit/Page Down");114 } else {115 i=doc_ce->y+doc->win_task->win_height-1;116 if (doc_ce->type_u8==DOCT_HEX_ED)117 i+=doc->cur_col/3/doc_ce->hex_ed_width;118 while (doc_ce!=doc &&119 (doc_ce->type_u8!=DOCT_HEX_ED && doc_ce->y<i ||120 doc_ce->type_u8==DOCT_HEX_ED &&121 doc_ce->y+doc->cur_col/3/doc_ce->hex_ed_width<i)) {122 EdLineDown(doc,sc);123//paranoid check for stuck on same node124 if (doc->cur_entry==doc_ce && doc_ce->type_u8!=DOCT_HEX_ED)125 break;126 doc_ce=doc->cur_entry;127 }128 }129 }130 break;131 case SC_PAGE_UP:132 if (!(sc&SCF_CTRL)) {133 if (sc&SCF_KEY_DESC) {134 if (sc&SCF_SHIFT)135 KeyDescSet("Edit/Page Up, Sel");136 else137 KeyDescSet("Edit/Page Up");138 }else {139 i=doc_ce->y-(doc->win_task->win_height-1);140 if (doc_ce->type_u8==DOCT_HEX_ED)141 i+=doc->cur_col/3/doc_ce->hex_ed_width;142 while (doc_ce->last!=doc &&143 (doc_ce->type_u8!=DOCT_HEX_ED && doc_ce->y>i ||144 doc_ce->type_u8==DOCT_HEX_ED &&145 doc_ce->y+doc->cur_col/3/doc_ce->hex_ed_width>i) &&146 doc_ce->y!=doc->head.next->y) {147 EdLineUp(doc,sc);148//paranoid check for stuck on same node149 if (doc->cur_entry==doc_ce && doc_ce->type_u8!=DOCT_HEX_ED)150 break;151 doc_ce=doc->cur_entry;152 }153 }154 }155 break;156 case SC_CURSOR_LEFT:157 if (sc&SCF_KEY_DESC) {158 if (sc&SCF_CTRL)159 KeyDescSet("Edit/GoTo Start of Line");160 else {161 if (sc&SCF_SHIFT)162 KeyDescSet("Edit/Cursor Left, Sel");163 else164 KeyDescSet("Edit/Cursor Left");165 }166 } else167 EdCursorLeft(doc,sc);168 break;169 case SC_CURSOR_RIGHT:170 if (sc&SCF_KEY_DESC) {171 if (sc&SCF_CTRL)172 KeyDescSet("Edit/GoTo End of Line");173 else {174 if (sc&SCF_SHIFT)175 KeyDescSet("Edit/Cursor Right, Sel");176 else177 KeyDescSet("Edit/Cursor Right");178 }179 } else180 EdCursorRight(doc,sc);181 break;182 case SC_DELETE:183 if (!(sc&SCF_CTRL)) {184 if (sc&SCF_KEY_DESC) {185 if (sc&SCF_SHIFT)186 KeyDescSet("Edit/Cut To Clip");187 else188 KeyDescSet("Char /Delete");189 } else {190 if (sc&SCF_SHIFT)191 ClipCut(doc);192 else193 EdCharDel(doc);194 }195 }196 break;197 case SC_INS:198 if (sc&(SCF_SHIFT|SCF_CTRL)!=(SCF_SHIFT|SCF_CTRL)) {199 if (sc&SCF_KEY_DESC) {200 if (sc&SCF_SHIFT)201 KeyDescSet("Edit/Paste Clip");202 else if (sc&SCF_CTRL)203 KeyDescSet("Edit/Copy to Clip");204 else205 KeyDescSet("Edit/Toggle Overstrike");206 } else {207 if (sc&SCF_SHIFT)208 ClipPaste(doc);209 else if (sc&SCF_CTRL)210 ClipCopy(doc);211 else212 doc->flags^=DOCF_OVERSTRIKE;213 }214 }215 break;216 case SC_F1...SC_F10:217 if (sc&SCF_CTRL) {218 if (sc&SCF_KEY_DESC) {219 if (sc&SCF_SHIFT)220 KeyDescSet("Cmd /Src Code of Sym");221 else222 KeyDescSet("Edit/Autocomplete Sym");223 } else {224 DocUnlock(doc);225 if (AutoComplete(ON)) {226 if (sc&SCF_SHIFT)227 ACMan(sc.u8[0]-SC_F1+1,Fs);228 else229 ACFillIn(sc.u8[0]-SC_F1+1);230 }231 DocLock(doc);232 }233 } else {234 switch (sc.u8[0]) {235 case SC_F1:236 if (sc&SCF_KEY_DESC) {237 if (sc&SCF_SHIFT)238 KeyDescSet("Cmd /About");239 else240 KeyDescSet("Cmd /Help");241 } else {242 if (sc&SCF_SHIFT)243 Ed("::/Doc/AboutTempleOS.DD.Z");244 else245 Ed("::/Doc/HelpIndex.DD.Z");246 }247 break;248 case SC_F2:249 if (sc&SCF_KEY_DESC) {250 if (sc&SCF_SHIFT)251 KeyDescSet("Edit/Play Macro");252 else253 KeyDescSet("Edit/Macro");254 } else {255 DocUnlock(doc);256 if (sc&SCF_SHIFT) {257 if (TaskValidate(sys_macro_task))258 PostMsgWait(sys_macro_task,259 MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0);260 SysMacroStripKey(&sys_macro_head,ch,sc);261 PlaySysMacro;262 } else263 EdMacroUtil;264 DocLock(doc);265 }266 break;267 case SC_F3:268 if (sc&SCF_KEY_DESC) {269 if (sc&SCF_SHIFT)270 KeyDescSet("Edit/Find Last");271 else272 KeyDescSet("Edit/Find Next");273 }else {274 doc->find_replace->scan_fwd=!(sc&SCF_SHIFT);275 EdFindNext(doc);276 }277 break;278 case SC_F4:279 if (sc&SCF_KEY_DESC) {280 if (sc&SCF_SHIFT)281 KeyDescSet("Cmd /Insert Directory Name");282 else283 KeyDescSet("Cmd /Insert FileName");284 } else {285 DocUnlock(doc);286 if (sc&SCF_SHIFT)287 st=PopUpPickDir;288 else289 st=PopUpPickFile;290 DocLock(doc);291 if (st) {292 DocPrintPartial(doc,"%s",st);293 Free(st);294 }295 }296 break;297 case SC_F5:298 if (sc&SCF_KEY_DESC) {299 if (sc&SCF_SHIFT)300 KeyDescSet("Cmd /Adam Include");301 else302 KeyDescSet("Cmd /Run (Execute)");303 } else {304 if (st2=DocEntryLink(doc,doc_ce)) {305 st=DocLinkFile(st2);306 Free(st2);307 } else {308 DocWrite(doc);309 st=StrNew(doc->filename.name);310 }311 if (st2=DirFile(st,"Run","HC.Z")) {312 if (FileFind(st2)) {313 Free(st);314 st=st2;315 } else316 Free(st2);317 }318 if (st) {319 if (sc&SCF_SHIFT)320 AdamFile(st);321 else322 PopUpFile(st);323 Free(st);324 }325 }326 break;327 case SC_F6:328 if (sc&SCF_KEY_DESC) {329 if (sc&SCF_SHIFT)330 KeyDescSet("Cmd /God Doodle");331 else332 KeyDescSet("Cmd /God Song");333 } else {334//::/Adam/God/HSNotes.DD335 if (sc&SCF_SHIFT) {336 DocUnlock(doc);337 GodDoodle;338 DocLock(doc);339 } else340 GodSong;341 }342 break;343 case SC_F7:344 if (sc&SCF_KEY_DESC) {345 if (sc&SCF_SHIFT)346 KeyDescSet("Cmd /God Passage");347 else348 KeyDescSet("Cmd /God Word");349 } else {350//::/Adam/God/HSNotes.DD351 FifoU8Flush(god.fifo);352 GodBitsIns(GOD_GOOD_BITS,KbdMsEvtTime>>GOD_BAD_BITS);353 if (sc&SCF_SHIFT)354 GodBiblePassage;355 else356 GodWord;357 }358 break;359 }360 }361 break;362 }363 break;364 case CH_CTRLA:365 if (!(sc&SCF_SHIFT)) {366 if (sc&SCF_KEY_DESC)367 KeyDescSet("Edit/Save As");368 else if (DocWrite(doc,TRUE)&&(st=FileNameAbs(doc->filename.name))) {369 DirContextDel(doc->filename.dirc);370 doc->filename.dirc=DirContextNew(st);371 Free(st);372 }373 }374 break;375 case CH_CTRLB:376 if (!(sc&SCF_SHIFT)) {377 if (sc&SCF_KEY_DESC)378 KeyDescSet("Cmd /Toggle Border");379 else380 WinBorder(Bt(&doc->win_task->display_flags,381 DISPLAYf_NO_BORDER),doc->win_task);382 }383 break;384 case CH_CTRLC:385 if (!(sc&SCF_SHIFT)) {386 if (sc&SCF_KEY_DESC)387 KeyDescSet("Edit/Copy to Clip");388 else389 ClipCopy(doc);390 }391 break;392 case CH_CTRLD:393 if (!(sc&SCF_SHIFT)) {394 if (sc&SCF_KEY_DESC)395 KeyDescSet("Cmd /File Manager");396 else {397 DocUnlock(doc);398 FileMgr;399 DocLock(doc);400 }401 }402 break;403 case CH_CTRLF:404 if (sc&SCF_SHIFT) {405 if (sc&SCF_KEY_DESC)406 KeyDescSet("Cmd /Search Files");407 else408 FindWiz;409 } else {410 if (sc&SCF_KEY_DESC)411 KeyDescSet("Edit/Find & Replace");412 else413 EdFindReplace(doc);414 }415 break;416 case CH_CTRLG:417 if (!(sc&SCF_SHIFT)) {418 if (sc&SCF_KEY_DESC)419 KeyDescSet("Edit/GoTo Line Num");420 else421 EdGoToLine(doc);422 }423 break;424 case CH_BACKSPACE: //<CTRL-H>425 if (!(sc&SCF_SHIFT)) {426 if (sc&SCF_KEY_DESC)427 KeyDescSet("Char /Back Space");428 else {429 DocCaptureUndo(doc);430 doc_ce=doc->cur_entry;431 if (doc->cur_col<=doc_ce->min_col) {432 doc_ce=doc->cur_entry=doc_ce->last;433 if (doc_ce!=doc && doc_ce->type_u8==DOCT_SOFT_NEW_LINE)434 doc_ce=doc->cur_entry=doc_ce->last;435 if (doc_ce==doc || doc_ce->type_u8==DOCT_PMT) {436 doc_ce=doc->cur_entry=doc_ce->next;437 doc->cur_col=doc_ce->min_col;438 } else {439 doc->cur_col=doc_ce->max_col;440 if (doc->cur_col>doc_ce->min_col)441 doc->cur_col--;442 EdCharDel(doc);443 }444 } else {445 doc->cur_col--;446 EdCharDel(doc);447 }448 }449 }450 break;451 case CH_CTRLI:452 if (sc.u8[0]!=SC_TAB) {453 if (sc&SCF_SHIFT) {454 if (sc&SCF_KEY_DESC)455 KeyDescSet("Dol /Unindent 2");456 else457 DocPrint(doc,"$ID,-2$");458 } else {459 if (sc&SCF_KEY_DESC)460 KeyDescSet("Dol /Indent 2");461 else462 DocPrint(doc,"$ID,2$");463 }464 }465 break;466 case '\n':467 if (sc&SCF_KEY_DESC) {468 if (sc&SCF_SHIFT)469 KeyDescSet("Char /Return");470 else471 KeyDescSet("Char /Page Break");472 } else473 EdCharIns(ch,sc,doc);474 break;475 case CH_CTRLK:476 if (sc&SCF_SHIFT) {477 if (sc&SCF_KEY_DESC)478 KeyDescSet("Dol /Blinking Text Off");479 else480 DocPrint(doc,"$BK,0$");481 } else {482 if (sc&SCF_KEY_DESC)483 KeyDescSet("Dol /Blinking Text On");484 else485 DocPrint(doc,"$BK,1$");486 }487 break;488 case CH_CTRLL:489 if (sc&SCF_SHIFT) {490 if (sc&SCF_KEY_DESC)491 KeyDescSet("Cmd /Code Tools");492 else {493 DocUnlock(doc);494 EdCodeTools(doc);495 DocLock(doc);496 }497 } else {498 if (sc&SCF_KEY_DESC)499 KeyDescSet("Cmd /Insert Text Widgets Wizard");500 else {501 DocUnlock(doc);502 EdInsWidgetWiz;503 DocLock(doc);504 }505 }506 break;507 case CH_CTRLM:508 if (sc&SCF_SHIFT) {509 if (sc&SCF_KEY_DESC)510 KeyDescSet("Cmd /Personal Notes");511 else512 Ed("~/PersonalNotes.DD.Z");513 } else {514 if (sc&SCF_KEY_DESC)515 KeyDescSet("Cmd /Personal Menu");516 else {517 m=DocRead("~/PersonalMenu.DD.Z");518 DocMenu(m);519 DocDel(m);520 }521 }522 break;523 case CH_CTRLO:524 if (sc&SCF_SHIFT) {525 if (sc&SCF_KEY_DESC)526 KeyDescSet("Edit/Collapse");527 else528 DocCollapse(TRUE,doc);529 } else {530 if (sc&SCF_KEY_DESC)531 KeyDescSet("Edit/Uncolapse");532 else533 DocCollapse(FALSE,doc);534 }535 break;536 case CH_CTRLP:537 if (doc->flags & (DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE)) {538 if (sc&SCF_KEY_DESC)539 KeyDescSet("Dol /Toggle Super or Sub script");540 else {541 DocPrint(doc,"$SY,0$");542 doc->flags&=~(DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE);543 }544 } else if (sc&SCF_SHIFT) {545 if (sc&SCF_KEY_DESC)546 KeyDescSet("Dol /Toggle Subscript");547 else {548 DocPrint(doc,"$SY,3$");549 doc->flags|=DOCF_SUBSCRIPT_MODE;550 }551 } else {552 if (sc&SCF_KEY_DESC)553 KeyDescSet("Dol /Toggle Superscript");554 else {555 DocPrint(doc,"$SY,-3$");556 doc->flags|=DOCF_SUPERSCRIPT_MODE;557 }558 }559 break;560 case CH_CTRLQ:561 break;562 case CH_CTRLR:563 if (!(sc&SCF_SHIFT)) {564 if (sc&SCF_KEY_DESC)565 KeyDescSet("Cmd /Sprite Graphic Resource");566 else567 if (!(doc->flags&DOCF_FORM) &&568 !(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_TABS))) {569 DocUnlock(doc);570 if (doc_ce->type_u8==DOCT_SPRITE)571 EdSpriteEd(doc);572 else573 EdSpriteIns(doc);574 DocLock(doc);575 }576 }577 break;578 case CH_CTRLS:579 if (sc&SCF_SHIFT) {580 if (sc&SCF_KEY_DESC)581 KeyDescSet("Edit/Toggle AutoSave");582 else583 LBtc(&doc->flags,DOCf_AUTO_SAVE);584 } else {585 if (sc&SCF_KEY_DESC)586 KeyDescSet("Edit/Save");587 else588 DocWrite(doc);589 }590 break;591 case CH_CTRLT:592 if (sc&SCF_SHIFT) {593 if (sc&SCF_KEY_DESC)594 KeyDescSet("Edit/Single Entry Toggle Plain Text");595 else if (!(doc->flags&DOCF_FORM))596 DocEntryToggle(doc);597 } else {598 if (sc&SCF_KEY_DESC)599 KeyDescSet("Edit/Toggle Plain Text Display");600 else if (!(doc->flags&DOCF_FORM))601 DocFlagsToggle(doc,DOCF_PLAIN_TEXT);602 }603 break;604 case CH_CTRLU:605 if (sc&SCF_SHIFT) {606 if (sc&SCF_KEY_DESC)607 KeyDescSet("Dol /Underline Off");608 else609 DocPrint(doc,"$UL,0$");610 } else {611 if (sc&SCF_KEY_DESC)612 KeyDescSet("Dol /Underline On");613 else614 DocPrint(doc,"$UL,1$");615 }616 break;617 case CH_CTRLV:618 if (!(sc&SCF_SHIFT)) {619 if (sc&SCF_KEY_DESC)620 KeyDescSet("Edit/Paste Clip");621 else622 ClipPaste(doc);623 }624 break;625 case CH_CTRLW:626 if (sc&SCF_SHIFT) {627 if (sc&SCF_KEY_DESC)628 KeyDescSet("Dol /Word Wrap Off");629 else630 DocPrint(doc,"$WW,0$");631 } else {632 if (sc&SCF_KEY_DESC)633 KeyDescSet("Dol /Word Wrap On");634 else635 DocPrint(doc,"$WW,1$");636 }637 break;638 case CH_CTRLX:639 if (!(sc&SCF_SHIFT)) {640 if (sc&SCF_KEY_DESC)641 KeyDescSet("Edit/Cut To Clip");642 else643 ClipCut(doc);644 }645 break;646 case CH_CTRLY:647 if (!(sc&SCF_SHIFT)) {648 if (sc&SCF_KEY_DESC)649 KeyDescSet("Edit/Delete Line");650 else651 EdLineDel(doc);652 }653 break;654 case CH_CTRLZ:655 if (sc&SCF_SHIFT) {656 if (sc&SCF_KEY_DESC)657 KeyDescSet("Dol /Inverted Text Off");658 else659 DocPrint(doc,"$IV,0$");660 } else {661 if (sc&SCF_KEY_DESC)662 KeyDescSet("Dol /Inverted Text On");663 else664 DocPrint(doc,"$IV,1$");665 }666 break;667 case '0'...'9':668 if (sc&SCF_CTRL) {669 if (sc&SCF_KEY_DESC) {670 if (sc&SCF_SHIFT)671 KeyDescSet("Cmd /Word Definition");672 else673 KeyDescSet("Edit/Autocomplete Word");674 } else {675 if (AutoComplete(ON)) {676 DocUnlock(doc);677 if (sc&SCF_SHIFT)678 ACDDef(ch-'0',Fs);679 else680 ACDFillin(ch-'0');681 DocLock(doc);682 }683 }684 }685 break;686 case '[':687 if (sc&SCF_CTRL) {688 if (sc&SCF_SHIFT) {689 if (sc&SCF_KEY_DESC)690 KeyDescSet("Edit/GoTo matching brace");691 else692 EdFindPaired(doc,'}','{',FALSE);693 } else {694 if (sc&SCF_KEY_DESC)695 KeyDescSet("Edit/GoTo matching bracket");696 else697 EdFindPaired(doc,']','[',FALSE);698 }699 }700 break;701 case ']':702 if (sc&SCF_CTRL) {703 if (sc&SCF_SHIFT) {704 if (sc&SCF_KEY_DESC)705 KeyDescSet("Edit/GoTo matching brace");706 else707 EdFindPaired(doc,'{','}',TRUE);708 } else {709 if (sc&SCF_KEY_DESC)710 KeyDescSet("Edit/GoTo matching bracket");711 else712 EdFindPaired(doc,'[',']',TRUE);713 }714 }715 break;716 }717 }718 if (unlock)719 DocUnlock(doc);720 if (!(doc->flags&DOCF_DONT_SWAP_OUT))721 Yield;722}723 724Bool KDDocPutKey(I64 ch,I64 scan_code)725{726 CDoc *doc;727 if (doc=DocPut)728 DocPutKey(doc,ch,scan_code);729 return FALSE;730}731 