A TempleOS distro for heretics
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.
 
 
 
 

729 lines
16 KiB

#help_index "DolDoc/Output;StdOut/DolDoc"
public U0 DocPutKey(CDoc *doc,I64 ch=0,I64 sc=0)
{//$LK,"PutKey",A="MN:PutKey"$(ch,sc) at doc insert pt, cur_entry.
I64 i,x,y;
CDoc *m;
CDocEntry *doc_ce;
U8 *st,*st2;
Bool unlock;
if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
return;
if (doc->user_put_key && (*doc->user_put_key)(doc,doc->user_put_data,ch,sc))
return;
unlock=DocLock(doc);
if (!Bt(doldoc.clean_scan_codes,sc.u8[0]))
doc->flags|=DOCF_UNDO_DIRTY;
DocCaptureUndo(doc);
if (Bt(char_bmp_printable,ch) && !(sc&(SCF_CTRL|SCF_ALT))) {
if (sc&SCF_KEY_DESC) {
st=Char2KeyName(ch,FALSE);
KeyDescSet("Char /'%s'",st);
Free(st);
} else
EdCharIns(ch,sc,doc);
} else {
doc_ce=doc->cur_entry;
x=doc->x; y=doc->y;
if (sc&SCF_ALT)
switch (ch) {
case CH_BACKSPACE: //<CTRL-H>
if (!(sc&(SCF_SHIFT|SCF_CTRL))) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Undo");
else
DocUndoRestore(doc);
}
break;
}
else
switch (ch) {
case 0:
switch (sc.u8[0]) {
case SC_CURSOR_DOWN:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Cursor Down, Sel");
else
KeyDescSet("Edit/Cursor Down");
} else
EdLineDown(doc,sc);
break;
} else
sc&=~SCF_CTRL;
//Fall Through to SC_END
case SC_END:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/GoTo Doc End, Sel");
else
KeyDescSet("Edit/GoTo Doc End");
} else {
while (doc_ce!=doc) {
BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);
doc_ce=doc->cur_entry=doc_ce->next;
}
doc->cur_col=doc_ce->min_col;
DocFormBwd(doc);
}
}
break;
case SC_CURSOR_UP:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Cursor Up, Sel");
else
KeyDescSet("Edit/Cursor Up");
} else
EdLineUp(doc,sc);
break;
} else
sc&=~SCF_CTRL;
//Fall Through to SC_HOME
case SC_HOME:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/GoTo Top of Doc, Sel");
else
KeyDescSet("Edit/GoTo Top of Doc");
} else {
if (doc_ce==doc) doc_ce=doc_ce->last;
while (doc_ce!=doc) {
BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);
doc_ce=doc->cur_entry=doc_ce->last;
}
doc_ce=doc->cur_entry=doc->head.next;
doc->cur_col=doc_ce->min_col;
DocFormFwd(doc);
}
}
break;
case SC_PAGE_DOWN:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Page Down, Sel");
else
KeyDescSet("Edit/Page Down");
} else {
i=doc_ce->y+doc->win_task->win_height-1;
if (doc_ce->type_u8==DOCT_HEX_ED)
i+=doc->cur_col/3/doc_ce->hex_ed_width;
while (doc_ce!=doc &&
(doc_ce->type_u8!=DOCT_HEX_ED && doc_ce->y<i ||
doc_ce->type_u8==DOCT_HEX_ED &&
doc_ce->y+doc->cur_col/3/doc_ce->hex_ed_width<i)) {
EdLineDown(doc,sc);
//paranoid check for stuck on same node
if (doc->cur_entry==doc_ce && doc_ce->type_u8!=DOCT_HEX_ED)
break;
doc_ce=doc->cur_entry;
}
}
}
break;
case SC_PAGE_UP:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Page Up, Sel");
else
KeyDescSet("Edit/Page Up");
}else {
i=doc_ce->y-(doc->win_task->win_height-1);
if (doc_ce->type_u8==DOCT_HEX_ED)
i+=doc->cur_col/3/doc_ce->hex_ed_width;
while (doc_ce->last!=doc &&
(doc_ce->type_u8!=DOCT_HEX_ED && doc_ce->y>i ||
doc_ce->type_u8==DOCT_HEX_ED &&
doc_ce->y+doc->cur_col/3/doc_ce->hex_ed_width>i) &&
doc_ce->y!=doc->head.next->y) {
EdLineUp(doc,sc);
//paranoid check for stuck on same node
if (doc->cur_entry==doc_ce && doc_ce->type_u8!=DOCT_HEX_ED)
break;
doc_ce=doc->cur_entry;
}
}
}
break;
case SC_CURSOR_LEFT:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_CTRL)
KeyDescSet("Edit/GoTo Start of Line");
else {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Cursor Left, Sel");
else
KeyDescSet("Edit/Cursor Left");
}
} else
EdCursorLeft(doc,sc);
break;
case SC_CURSOR_RIGHT:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_CTRL)
KeyDescSet("Edit/GoTo End of Line");
else {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Cursor Right, Sel");
else
KeyDescSet("Edit/Cursor Right");
}
} else
EdCursorRight(doc,sc);
break;
case SC_DELETE:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Cut To Clip");
else
KeyDescSet("Char /Delete");
} else {
if (sc&SCF_SHIFT)
ClipCut(doc);
else
EdCharDel(doc);
}
}
break;
case SC_INS:
if (sc&(SCF_SHIFT|SCF_CTRL)!=(SCF_SHIFT|SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Paste Clip");
else if (sc&SCF_CTRL)
KeyDescSet("Edit/Copy to Clip");
else
KeyDescSet("Edit/Toggle Overstrike");
} else {
if (sc&SCF_SHIFT)
ClipPaste(doc);
else if (sc&SCF_CTRL)
ClipCopy(doc);
else
doc->flags^=DOCF_OVERSTRIKE;
}
}
break;
case SC_F1...SC_F10:
if (sc&SCF_CTRL) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /Src Code of Sym");
else
KeyDescSet("Edit/Autocomplete Sym");
} else {
DocUnlock(doc);
if (AutoComplete(ON)) {
if (sc&SCF_SHIFT)
ACMan(sc.u8[0]-SC_F1+1,Fs);
else
ACFillIn(sc.u8[0]-SC_F1+1);
}
DocLock(doc);
}
} else {
switch (sc.u8[0]) {
case SC_F1:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /About");
else
KeyDescSet("Cmd /Help");
} else {
if (sc&SCF_SHIFT)
Ed("::/Doc/AboutTempleOS.DD.Z");
else
Ed("::/Doc/HelpIndex.DD.Z");
}
break;
case SC_F2:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Play Macro");
else
KeyDescSet("Edit/Macro");
} else {
DocUnlock(doc);
if (sc&SCF_SHIFT) {
if (TaskValidate(sys_macro_task))
PostMsgWait(sys_macro_task,
MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0);
SysMacroStripKey(&sys_macro_head,ch,sc);
PlaySysMacro;
} else
EdMacroUtil;
DocLock(doc);
}
break;
case SC_F3:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Find Last");
else
KeyDescSet("Edit/Find Next");
}else {
doc->find_replace->scan_fwd=!(sc&SCF_SHIFT);
EdFindNext(doc);
}
break;
case SC_F4:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /Insert Directory Name");
else
KeyDescSet("Cmd /Insert FileName");
} else {
DocUnlock(doc);
if (sc&SCF_SHIFT)
st=PopUpPickDir;
else
st=PopUpPickFile;
DocLock(doc);
if (st) {
DocPrintPartial(doc,"%s",st);
Free(st);
}
}
break;
case SC_F5:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /Adam Include");
else
KeyDescSet("Cmd /Run (Execute)");
} else {
if (st2=DocEntryLink(doc,doc_ce)) {
st=DocLinkFile(st2);
Free(st2);
} else {
DocWrite(doc);
st=StrNew(doc->filename.name);
}
if (st2=DirFile(st,"Run","HC.Z")) {
if (FileFind(st2)) {
Free(st);
st=st2;
} else
Free(st2);
}
if (st) {
if (sc&SCF_SHIFT)
AdamFile(st);
else
PopUpFile(st);
Free(st);
}
}
break;
case SC_F6:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /God Doodle");
else
KeyDescSet("Cmd /God Song");
} else {
//$LK,"::/Adam/God/HSNotes.DD"$
if (sc&SCF_SHIFT) {
DocUnlock(doc);
GodDoodle;
DocLock(doc);
} else
GodSong;
}
break;
case SC_F7:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /God Passage");
else
KeyDescSet("Cmd /God Word");
} else {
//$LK,"::/Adam/God/HSNotes.DD"$
FifoU8Flush(god.fifo);
GodBitsIns(GOD_GOOD_BITS,KbdMsEvtTime>>GOD_BAD_BITS);
if (sc&SCF_SHIFT)
GodBiblePassage;
else
GodWord;
}
break;
}
}
break;
}
break;
case CH_CTRLA:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Save As");
else if (DocWrite(doc,TRUE)&&(st=FileNameAbs(doc->filename.name))) {
DirContextDel(doc->filename.dirc);
doc->filename.dirc=DirContextNew(st);
Free(st);
}
}
break;
case CH_CTRLB:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Toggle Border");
else
WinBorder(Bt(&doc->win_task->display_flags,
DISPLAYf_NO_BORDER),doc->win_task);
}
break;
case CH_CTRLC:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Copy to Clip");
else
ClipCopy(doc);
}
break;
case CH_CTRLD:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /File Manager");
else {
DocUnlock(doc);
FileMgr;
DocLock(doc);
}
}
break;
case CH_CTRLF:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Search Files");
else
FindWiz;
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Find & Replace");
else
EdFindReplace(doc);
}
break;
case CH_CTRLG:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/GoTo Line Num");
else
EdGoToLine(doc);
}
break;
case CH_BACKSPACE: //<CTRL-H>
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Char /Back Space");
else {
DocCaptureUndo(doc);
doc_ce=doc->cur_entry;
if (doc->cur_col<=doc_ce->min_col) {
doc_ce=doc->cur_entry=doc_ce->last;
if (doc_ce!=doc && doc_ce->type_u8==DOCT_SOFT_NEW_LINE)
doc_ce=doc->cur_entry=doc_ce->last;
if (doc_ce==doc || doc_ce->type_u8==DOCT_PMT) {
doc_ce=doc->cur_entry=doc_ce->next;
doc->cur_col=doc_ce->min_col;
} else {
doc->cur_col=doc_ce->max_col;
if (doc->cur_col>doc_ce->min_col)
doc->cur_col--;
EdCharDel(doc);
}
} else {
doc->cur_col--;
EdCharDel(doc);
}
}
}
break;
case CH_CTRLI:
if (sc.u8[0]!=SC_TAB) {
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Unindent 2");
else
DocPrint(doc,"$$ID,-2$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Indent 2");
else
DocPrint(doc,"$$ID,2$$");
}
}
break;
case '\n':
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Char /Return");
else
KeyDescSet("Char /Page Break");
} else
EdCharIns(ch,sc,doc);
break;
case CH_CTRLK:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Blinking Text Off");
else
DocPrint(doc,"$$BK,0$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Blinking Text On");
else
DocPrint(doc,"$$BK,1$$");
}
break;
case CH_CTRLL:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Code Tools");
else {
DocUnlock(doc);
EdCodeTools(doc);
DocLock(doc);
}
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Insert Text Widgets Wizard");
else {
DocUnlock(doc);
EdInsWidgetWiz;
DocLock(doc);
}
}
break;
case CH_CTRLM:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Personal Notes");
else
Ed("~/PersonalNotes.DD.Z");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Personal Menu");
else {
m=DocRead("~/PersonalMenu.DD.Z");
DocMenu(m);
DocDel(m);
}
}
break;
case CH_CTRLO:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Collapse");
else
DocCollapse(TRUE,doc);
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Uncolapse");
else
DocCollapse(FALSE,doc);
}
break;
case CH_CTRLP:
if (doc->flags & (DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Toggle Super or Sub script");
else {
DocPrint(doc,"$$SY,0$$");
doc->flags&=~(DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE);
}
} else if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Toggle Subscript");
else {
DocPrint(doc,"$$SY,3$$");
doc->flags|=DOCF_SUBSCRIPT_MODE;
}
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Toggle Superscript");
else {
DocPrint(doc,"$$SY,-3$$");
doc->flags|=DOCF_SUPERSCRIPT_MODE;
}
}
break;
case CH_CTRLQ:
break;
case CH_CTRLR:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Sprite Graphic Resource");
else
if (!(doc->flags&DOCF_FORM) &&
!(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_TABS))) {
DocUnlock(doc);
if (doc_ce->type_u8==DOCT_SPRITE)
EdSpriteEd(doc);
else
EdSpriteIns(doc);
DocLock(doc);
}
}
break;
case CH_CTRLS:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Toggle AutoSave");
else
LBtc(&doc->flags,DOCf_AUTO_SAVE);
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Save");
else
DocWrite(doc);
}
break;
case CH_CTRLT:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Single Entry Toggle Plain Text");
else if (!(doc->flags&DOCF_FORM))
DocEntryToggle(doc);
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Toggle Plain Text Display");
else if (!(doc->flags&DOCF_FORM))
DocFlagsToggle(doc,DOCF_PLAIN_TEXT);
}
break;
case CH_CTRLU:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Underline Off");
else
DocPrint(doc,"$$UL,0$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Underline On");
else
DocPrint(doc,"$$UL,1$$");
}
break;
case CH_CTRLV:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Paste Clip");
else
ClipPaste(doc);
}
break;
case CH_CTRLW:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Word Wrap Off");
else
DocPrint(doc,"$$WW,0$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Word Wrap On");
else
DocPrint(doc,"$$WW,1$$");
}
break;
case CH_CTRLX:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Cut To Clip");
else
ClipCut(doc);
}
break;
case CH_CTRLY:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Delete Line");
else
EdLineDel(doc);
}
break;
case CH_CTRLZ:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Inverted Text Off");
else
DocPrint(doc,"$$IV,0$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Inverted Text On");
else
DocPrint(doc,"$$IV,1$$");
}
break;
case '0'...'9':
if (sc&SCF_CTRL) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /Word Definition");
else
KeyDescSet("Edit/Autocomplete Word");
} else {
if (AutoComplete(ON)) {
DocUnlock(doc);
if (sc&SCF_SHIFT)
ACDDef(ch-'0',Fs);
else
ACDFillin(ch-'0');
DocLock(doc);
}
}
}
break;
case '[':
if (sc&SCF_CTRL) {
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/GoTo matching brace");
else
EdFindPaired(doc,'}','{',FALSE);
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/GoTo matching bracket");
else
EdFindPaired(doc,']','[',FALSE);
}
}
break;
case ']':
if (sc&SCF_CTRL) {
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/GoTo matching brace");
else
EdFindPaired(doc,'{','}',TRUE);
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/GoTo matching bracket");
else
EdFindPaired(doc,'[',']',TRUE);
}
}
break;
}
}
if (unlock)
DocUnlock(doc);
if (!(doc->flags&DOCF_DONT_SWAP_OUT))
Yield;
}
Bool KDDocPutKey(I64 ch,I64 scan_code)
{
CDoc *doc;
if (doc=DocPut)
DocPutKey(doc,ch,scan_code);
return FALSE;
}