973 lines
22 KiB
C++
973 lines
22 KiB
C++
#help_index "DolDoc/Output"
|
|
|
|
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,sc2,ext_ascii_cnt=0;
|
|
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(chars_bitmap_getkey,ch) &&
|
|
!(sc&(SCF_CTRL|SCF_ALT))) {
|
|
if (sc&SCF_KEY_DESC) {
|
|
st=Char2KeyName(ch,FALSE);
|
|
KeyDescSet("Char/'%s'",st);
|
|
Free(st);
|
|
} else
|
|
EdInsChar(ch,sc,doc);
|
|
} else {
|
|
doc_ce=doc->cur_entry;
|
|
x=doc->x; y=doc->y;
|
|
sc2=sc.u8[0];
|
|
switch (ch) {
|
|
case CH_CTRLA:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Save As");
|
|
else
|
|
DocWrite(doc,TRUE);
|
|
break;
|
|
case CH_CTRLB:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Win/Toggle Border");
|
|
else
|
|
WinBorder(Bt(&doc->win_task->display_flags,DISPLAYf_NO_BORDER),doc->win_task);
|
|
break;
|
|
case CH_CTRLC:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Copy to Clipboard");
|
|
else
|
|
EdCopyToClipboard(doc);
|
|
break;
|
|
case CH_CTRLD:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Cmd/Jump to File Manager");
|
|
else {
|
|
DocUnlock(doc);
|
|
FileMgr;
|
|
DocLock(doc);
|
|
}
|
|
break;
|
|
case CH_CTRLF:
|
|
if (sc&SCF_SHIFT) {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Cmd/Find Wizard");
|
|
else
|
|
GrepWiz;
|
|
} else {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Find & Replace");
|
|
else
|
|
EdFindReplace(doc);
|
|
}
|
|
break;
|
|
case CH_CTRLG:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/GoTo Line Num");
|
|
else
|
|
EdGoToLine(doc);
|
|
break;
|
|
case CH_BACKSPACE: //<CTRL-H>
|
|
if (sc&SCF_ALT && !(sc&SCF_CTRL)) {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Undo");
|
|
else
|
|
DocUndoRestore(doc);
|
|
} else {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Char/Back Space");
|
|
else {
|
|
DocCaptureUndo(doc);
|
|
doc_ce=doc->cur_entry;
|
|
if (doc->cur_data_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_data_col=doc_ce->min_col;
|
|
} else {
|
|
doc->cur_data_col=doc_ce->max_col;
|
|
if (doc->cur_data_col>doc_ce->min_col)
|
|
doc->cur_data_col--;
|
|
EdDelChar(doc);
|
|
}
|
|
} else {
|
|
doc->cur_data_col--;
|
|
EdDelChar(doc);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case CH_CTRLI:
|
|
if (sc&SCF_SHIFT) {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/Indent Out");
|
|
else
|
|
DocPrint(doc,"$$ID,-2$$");
|
|
} else {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/Indent In");
|
|
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
|
|
EdInsChar(ch,sc,doc);
|
|
break;
|
|
case CH_CTRLK:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/Toggle Blinking Text");
|
|
else if (sc&SCF_SHIFT)
|
|
DocPrint(doc,"$$BK,0$$");
|
|
else
|
|
DocPrint(doc,"$$BK,1$$");
|
|
break;
|
|
case CH_CTRLL:
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Code Tools");
|
|
else
|
|
KeyDescSet("Dollar/Wizard");
|
|
} else {
|
|
if (sc&SCF_SHIFT)
|
|
EdCodeTools(doc);
|
|
else {
|
|
DocUnlock(doc);
|
|
EdInsDollarCmd;
|
|
DocLock(doc);
|
|
}
|
|
}
|
|
break;
|
|
case CH_CTRLM:
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Cmd/Jump to Notes File");
|
|
else
|
|
KeyDescSet("Cmd/Jump to Menu");
|
|
} else {
|
|
if (sc&SCF_SHIFT)
|
|
Ed("::/Home/PersonalNotes.TXT.Z");
|
|
else {
|
|
m=DocRead("::/Home/PersonalMenu.TXT.Z");
|
|
DocMenuDo(m);
|
|
DocDel(m);
|
|
}
|
|
}
|
|
break;
|
|
case CH_CTRLO:
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Collapse");
|
|
else
|
|
KeyDescSet("Edit/Uncolapse");
|
|
} else {
|
|
if (sc&SCF_SHIFT)
|
|
DocCollapse(TRUE,doc);
|
|
else
|
|
DocCollapse(FALSE,doc);
|
|
}
|
|
break;
|
|
case CH_CTRLP:
|
|
if (doc->flags & (DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE)) {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/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("Dollar/Toggle Subscript");
|
|
else {
|
|
DocPrint(doc,"$$SY,3$$");
|
|
doc->flags|=DOCF_SUBSCRIPT_MODE;
|
|
}
|
|
} else {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/Toggle Superscript");
|
|
else {
|
|
DocPrint(doc,"$$SY,-3$$");
|
|
doc->flags|=DOCF_SUPERSCRIPT_MODE;
|
|
}
|
|
}
|
|
break;
|
|
case CH_CTRLQ:
|
|
break;
|
|
case CH_CTRLR:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/Edit or Create Graphic");
|
|
else {
|
|
if (!(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS))) {
|
|
DocUnlock(doc);
|
|
if (doc_ce->type_u8==DOCT_SPRITE)
|
|
EdSpriteEd(doc,
|
|
(doc_ce->x-doc->line_start_col+doc_ce->max_col)*FONT_WIDTH,
|
|
(doc_ce->y-doc->cur_top_line_num)*FONT_HEIGHT);
|
|
else
|
|
EdSpriteIns(doc,
|
|
(doc_ce->x+doc->cur_data_col-doc->line_start_col)*FONT_WIDTH,
|
|
(doc_ce->y-doc->cur_top_line_num)*FONT_HEIGHT);
|
|
DocLock(doc);
|
|
}
|
|
}
|
|
break;
|
|
case CH_CTRLS:
|
|
if (sc&SCF_SHIFT) {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Find Misspelled");
|
|
else
|
|
ACFindMisspelled(doc);
|
|
} 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
|
|
DocEntryToggle(doc);
|
|
} else {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Toggle Plain Text Display");
|
|
else
|
|
if (!(doc->flags&DOCF_FORM) || doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS))
|
|
DocFlagsToggle(doc,DOCF_PLAIN_TEXT);
|
|
}
|
|
break;
|
|
case CH_CTRLU:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/Toggle Underline");
|
|
else if (sc&SCF_SHIFT)
|
|
DocPrint(doc,"$$UL,0$$");
|
|
else
|
|
DocPrint(doc,"$$UL,1$$");
|
|
break;
|
|
case CH_CTRLV:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Paste Clipboard");
|
|
else
|
|
EdPasteClipboard(doc);
|
|
break;
|
|
case CH_CTRLW:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/Toggle Word Wrap");
|
|
else if (sc&SCF_SHIFT)
|
|
DocPrint(doc,"$$WW,0$$");
|
|
else
|
|
DocPrint(doc,"$$WW,1$$");
|
|
break;
|
|
case CH_CTRLX:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Cut To Clipboard");
|
|
else
|
|
EdCutToClipboard(doc);
|
|
break;
|
|
case CH_CTRLY:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Delete Line");
|
|
else
|
|
EdDelLine(doc);
|
|
break;
|
|
case CH_CTRLZ:
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Dollar/Toggle Inverted Text");
|
|
else if (sc&SCF_SHIFT)
|
|
DocPrint(doc,"$$IV,0$$");
|
|
else
|
|
DocPrint(doc,"$$IV,1$$");
|
|
break;
|
|
case '0'...'9':
|
|
if (!(sc&SCF_ALT)) {
|
|
if (sc&SCF_CTRL) {
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Jump to 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);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (sc&SCF_KEY_DESC)
|
|
KeyDescSet("Edit/Enter extended-ASCII");
|
|
else {
|
|
if (++doc->ext_ascii_cnt==1)
|
|
doc->ext_ascii_val=ch-'0';
|
|
else
|
|
doc->ext_ascii_val=doc->ext_ascii_val*10+ch-'0';
|
|
if (doc->ext_ascii_cnt==3)
|
|
EdInsChar(doc->ext_ascii_val.u8[0],sc,doc);
|
|
else
|
|
ext_ascii_cnt=doc->ext_ascii_cnt;
|
|
}
|
|
}
|
|
break;
|
|
case '[':
|
|
if (!(sc&SCF_ALT) && 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_ALT) && 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;
|
|
default:
|
|
switch (sc2) {
|
|
case SC_F1...SC_F10:
|
|
if (!(sc&SCF_ALT)) {
|
|
if (sc&SCF_CTRL) {
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Jump to Src of Sym");
|
|
else
|
|
KeyDescSet("Edit/Autocomplete Sym");
|
|
} else {
|
|
DocUnlock(doc);
|
|
if (AutoComplete(ON)) {
|
|
if (sc&SCF_SHIFT)
|
|
ACMan(sc2-SC_F1+1,Fs);
|
|
else
|
|
ACFillIn(sc2-SC_F1+1);
|
|
}
|
|
DocLock(doc);
|
|
}
|
|
} else {
|
|
switch (sc2) {
|
|
case SC_F1:
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("About");
|
|
else
|
|
KeyDescSet("Help");
|
|
} else {
|
|
if (sc&SCF_SHIFT)
|
|
Ed("::/Doc/AboutTempleOS.TXT.Z");
|
|
else
|
|
Ed("::/Doc/HelpIndex.TXT.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_util_task))
|
|
SendMsg(sys_macro_util_task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0);
|
|
SysMacroStripKey(&sys_macro_root,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("Misc/Insert Directory Name");
|
|
else
|
|
KeyDescSet("Misc/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);Dbg/Go");
|
|
} 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","CPP.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("God Doodle");
|
|
else
|
|
KeyDescSet("God Song");
|
|
} else {
|
|
//$LK,"::/Adam/God/HSNotes.TXT"$
|
|
if (sc & SCF_SHIFT)
|
|
GodDoodle;
|
|
else
|
|
GodSong;
|
|
}
|
|
break;
|
|
case SC_F7:
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc & SCF_SHIFT)
|
|
KeyDescSet("God Passage");
|
|
else
|
|
KeyDescSet("God Word");
|
|
} else {
|
|
//$LK,"::/Adam/God/HSNotes.TXT"$
|
|
FifoU8Flush(god.fifo);
|
|
GodBitsIns(GOD_GOOD_BITS,KbdMouseEvtTime>>GOD_BAD_BITS);
|
|
if (sc & SCF_SHIFT)
|
|
GodPassage;
|
|
else
|
|
GodWord;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case SC_CURSOR_DOWN:
|
|
case SC_END:
|
|
if (sc2==SC_END || sc&SCF_CTRL) {
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/GoTo Doc End, Select");
|
|
else
|
|
KeyDescSet("Edit/GoTo Doc End");
|
|
} else {
|
|
while (doc_ce!=doc) {
|
|
BEqu(&doc_ce->type,DOCEt_SELECTED,sc&SCF_SHIFT);
|
|
doc_ce=doc->cur_entry=doc_ce->next;
|
|
}
|
|
doc->cur_data_col=doc_ce->min_col;
|
|
DocFormBwd(doc);
|
|
}
|
|
} else if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Cursor Down, Select");
|
|
else
|
|
KeyDescSet("Edit/Cursor Down");
|
|
} else
|
|
EdLineDown(doc,sc);
|
|
break;
|
|
case SC_CURSOR_UP:
|
|
case SC_HOME:
|
|
if (sc2==SC_HOME || sc&SCF_CTRL) {
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/GoTo Top of Doc, Select");
|
|
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_SELECTED,sc&SCF_SHIFT);
|
|
doc_ce=doc->cur_entry=doc_ce->last;
|
|
}
|
|
doc_ce=doc->cur_entry=doc->root.next;
|
|
doc->cur_data_col=doc_ce->min_col;
|
|
DocFormFwd(doc);
|
|
}
|
|
} else if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Cursor Up, Select");
|
|
else
|
|
KeyDescSet("Edit/Cursor Up");
|
|
} else
|
|
EdLineUp(doc,sc);
|
|
break;
|
|
case SC_PAGE_DOWN:
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Page Down, Select");
|
|
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_data_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_data_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_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Page Up, Select");
|
|
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_data_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_data_col/3/doc_ce->hex_ed_width>i) &&
|
|
doc_ce->y!=doc->root.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, Select");
|
|
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, Select");
|
|
else
|
|
KeyDescSet("Edit/Cursor Right");
|
|
}
|
|
} else
|
|
EdCursorRight(doc,sc);
|
|
break;
|
|
case SC_DELETE:
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Cut To Clipboard");
|
|
else
|
|
KeyDescSet("Char/Delete");
|
|
} else {
|
|
if (sc&SCF_SHIFT)
|
|
EdCutToClipboard(doc);
|
|
else
|
|
EdDelChar(doc);
|
|
}
|
|
break;
|
|
case SC_INS:
|
|
if (sc&SCF_KEY_DESC) {
|
|
if (sc&SCF_SHIFT)
|
|
KeyDescSet("Edit/Paste Clipboard");
|
|
else if (sc&SCF_CTRL)
|
|
KeyDescSet("Edit/Copy to Clipboard");
|
|
else
|
|
KeyDescSet("Edit/Toggle Overstrike");
|
|
} else {
|
|
if (sc&SCF_SHIFT)
|
|
EdPasteClipboard(doc);
|
|
else if (sc&SCF_CTRL)
|
|
EdCopyToClipboard(doc);
|
|
else
|
|
doc->flags^=DOCF_OVERSTRIKE;
|
|
}
|
|
break;
|
|
} //switch (sc2)
|
|
}
|
|
}
|
|
doc->ext_ascii_cnt=ext_ascii_cnt;
|
|
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;
|
|
}
|
|
|
|
public U0 DocPrintPartial(CDoc *doc,U8 *fmt,...)
|
|
{//Lets you print half a doc cmd, if you like.
|
|
U8 *buf,*b,*src,*dst,*ptr,*ptr2;
|
|
Bool unlock;
|
|
CDocEntry *doc_ce,*doc_ne;
|
|
I64 ch,i,j;
|
|
if (!fmt)
|
|
return;
|
|
buf=StrPrintJoin(NULL,fmt,argc,argv);
|
|
ptr=buf;
|
|
if (doc->user_put_s && (*doc->user_put_s)(doc,doc->user_put_data,buf)) {
|
|
Free(buf);
|
|
return;
|
|
}
|
|
unlock=DocLock(doc);
|
|
if (doc->cur_entry->type_u8==DOCT_DATA)
|
|
while (ch=*ptr++)
|
|
DocPutKey(doc,ch,0);
|
|
else
|
|
while (ch=*ptr) {
|
|
if (!Bt(chars_bitmap_safe_dollar,ch) ||
|
|
doc->flags & (DOCF_OVERSTRIKE | DOCF_IN_DOLLAR)) {
|
|
DocPutKey(doc,ch,0);
|
|
ptr++;
|
|
} else {
|
|
ptr2=ptr++;
|
|
while (TRUE) {
|
|
ch=*ptr++;
|
|
if (!Bt(chars_bitmap_safe_dollar,ch))
|
|
break;
|
|
}
|
|
ptr--;
|
|
*ptr=0;
|
|
doc_ce=doc->cur_entry;
|
|
j=ptr-ptr2;
|
|
if (IsEditableText(doc_ce)) {
|
|
dst=b=MAlloc(doc_ce->max_col+j+1,doc->mem_task);
|
|
src=doc_ce->tag;
|
|
i=doc->cur_data_col;
|
|
doc->cur_data_col+=j;
|
|
doc_ce->max_col+=j;
|
|
while (i-->0)
|
|
*dst++=*src++;
|
|
while (j-->0)
|
|
*dst++=*ptr2++;
|
|
while (*dst++=*src++);
|
|
Free(doc_ce->tag);
|
|
doc_ce->tag=b;
|
|
} else {
|
|
dst=MAlloc(j+1,doc->mem_task);
|
|
MemCpy(dst,ptr2,j+1);
|
|
doc_ne=DocEntryNew(doc,doc_ce,dst);
|
|
doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr<<8;
|
|
doc_ne->de_flags=doldoc.dft_de_flags[DOCT_TEXT];
|
|
QueIns(doc_ne,doc_ce->last);
|
|
doc->cur_entry=doc_ne;
|
|
doc->cur_data_col=StrLen(ptr2);
|
|
}
|
|
*ptr=ch;
|
|
DocRemSoftNewLines(doc,doc->cur_entry);
|
|
}
|
|
}
|
|
if (unlock)
|
|
DocUnlock(doc);
|
|
if (!(doc->flags&DOCF_DONT_SWAP_OUT))
|
|
Yield;
|
|
Free(buf);
|
|
}
|
|
|
|
#help_index "DolDoc"
|
|
Bool DocFileEd(I64 _type,U8 *filename,
|
|
U8 *needle_str,I64 *_num,I64 edf_dof_flags)
|
|
{
|
|
I64 type=_type,flags=0,old_border_src=Fs->border_src;
|
|
CDocEntry *doc_e;
|
|
CDoc *doc;
|
|
Bool old_silent=Bt(&Fs->display_flags,DISPLAYf_SILENT),
|
|
result=FALSE,other_found=FALSE;
|
|
U8 *st1,*st2;
|
|
try {
|
|
switch (type) {
|
|
case LK_PLAIN:
|
|
flags=DOCF_PLAIN_TEXT;
|
|
case LK_DOC:
|
|
type=LK_FILE;
|
|
break;
|
|
case LK_DOC_ANCHOR:
|
|
type=LK_FILE_ANCHOR;
|
|
break;
|
|
case LK_PLAIN_FIND:
|
|
flags=DOCF_PLAIN_TEXT;
|
|
case LK_DOC_FIND:
|
|
type=LK_FILE_FIND;
|
|
break;
|
|
case LK_PLAIN_LINE:
|
|
flags=DOCF_PLAIN_TEXT;
|
|
case LK_DOC_LINE:
|
|
type=LK_FILE_LINE;
|
|
break;
|
|
case LK_BIBLE_FIND:
|
|
flags=DOCF_PLAIN_TEXT;
|
|
break;
|
|
}
|
|
|
|
flags|=DOCF_ALLOW_UNDO;
|
|
|
|
if (LK_DOC<=_type<=LK_DOC_LINE) {
|
|
doc=Str2I64(filename);//See $LK,"SpriteEdText",A="MN:SpriteEdText"$()
|
|
result=TRUE;
|
|
} else {
|
|
|
|
st1=StrNew(filename);
|
|
st2=StrNew(filename);
|
|
StrLastRem(st1,"/",st2); //st2 is name without dir
|
|
|
|
if (!FileNameChk(st2))
|
|
doc=NULL;
|
|
else {
|
|
Silent;
|
|
if (Bt(&edf_dof_flags,EDf_BAIL)) //if bail, scan parents
|
|
result=FileFind(filename,,
|
|
FUF_JUST_FILES|FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);
|
|
else if (!(result=FileFind(filename,,
|
|
FUF_JUST_FILES)))
|
|
other_found=FileFind(filename,,
|
|
FUF_JUST_FILES|FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);
|
|
doc=DocRead(filename,flags);
|
|
doc->desc='Edit';
|
|
Silent(old_silent);
|
|
Fs->border_src=BDS_ED_FILENAME_DRV;
|
|
}
|
|
|
|
Free(st1);
|
|
Free(st2);
|
|
}
|
|
if (!doc||doc->doc_signature!=DOC_SIGNATURE_VAL)
|
|
result=FALSE;
|
|
else {
|
|
if (Bt(&edf_dof_flags,EDf_COLLAPSE))
|
|
DocCollapse(TRUE,doc);
|
|
else if (Bt(&edf_dof_flags,EDf_UNCOLLAPSE))
|
|
DocCollapse(FALSE,doc);
|
|
|
|
if (result || other_found)
|
|
switch (type) {
|
|
case LK_FILE_LINE:
|
|
result=DocLineNumGoTo(doc,*_num);
|
|
break;
|
|
case LK_FILE_ANCHOR:
|
|
result=DocAnchorFind(doc,needle_str);
|
|
break;
|
|
case LK_FILE_FIND:
|
|
result=DocFind(doc,,needle_str,*_num);
|
|
break;
|
|
case LK_BIBLE_FIND:
|
|
result=DocFind(doc,*_num,needle_str);
|
|
break;
|
|
default:
|
|
DocCenter(doc);
|
|
}
|
|
*_num=doc->cur_entry->y+1;
|
|
|
|
if (edf_dof_flags&EDF_WAS_WRITE)
|
|
result=FALSE;
|
|
if (!(edf_dof_flags&EDF_BAIL) && DocDo(doc,edf_dof_flags|DOF_DONT_HOME)) {
|
|
DocLock(doc);
|
|
doc_e=doc->cur_entry;
|
|
if (doc_e!=doc)
|
|
DocEntryRun(doc,doc_e,TRUE);
|
|
DocUnlock(doc);
|
|
if (!(LK_DOC<=_type<=LK_DOC_LINE)) {
|
|
DocWrite(doc);
|
|
if (edf_dof_flags&EDF_WAS_WRITE)
|
|
result=TRUE;
|
|
}
|
|
}
|
|
if (!(LK_DOC<=_type<=LK_DOC_LINE))
|
|
DocDel(doc);
|
|
}
|
|
} catch {
|
|
Silent(old_silent);
|
|
result=FALSE;
|
|
}
|
|
Fs->border_src=old_border_src;
|
|
return result;
|
|
}
|
|
|
|
public I64 EdLinkCvt(U8 *link_st,U8 **_filename=NULL,U8 **_needle_str=NULL,
|
|
I64 *_num=NULL,I64 edf_dof_flags=0)
|
|
{//$LK,"Editor Link",A="MN:LK_FILE"$ --> filename, needle_str and line number.
|
|
U8 *st,*ptr,*filename=NULL,*needle_str=NULL,*filename2;
|
|
I64 result,i,num=1;
|
|
CHashSrcSym *temph;
|
|
if (!link_st||!*link_st) {
|
|
if (edf_dof_flags&EDF_BAIL)
|
|
return -1;
|
|
link_st=dsk.temp_filename;
|
|
}
|
|
st=StrNew(link_st);
|
|
result=LK_FILE;
|
|
if (StrLen(st)>3 && st[2]==':') {
|
|
st[2]=0;
|
|
filename2=st+3;
|
|
switch (result=DefineMatch(st,"ST_LINK_TYPES",LMF_IGNORE_CASE)) {
|
|
case LK_MAN_PAGE:
|
|
if (temph=HashFind(filename2,Fs->hash_table,HTG_SRC_SYM))
|
|
result=EdLinkCvt(temph->src_link,&filename,&needle_str,&num,edf_dof_flags);
|
|
else
|
|
result=-1;
|
|
goto lc_done;
|
|
case LK_ADDR:
|
|
if (ptr=StrLastOcc(filename2,",")) {
|
|
*ptr=0;
|
|
i=Str2I64(ptr+1);
|
|
} else
|
|
i=DFT_ADDR_LINK_BIN_SIZE;
|
|
if (ptr=SrcEdLink(ExePrint("%s;",filename2),i)) {
|
|
result=EdLinkCvt(ptr,&filename,&needle_str,&num,edf_dof_flags);
|
|
Free(ptr);
|
|
} else
|
|
result=-1;
|
|
goto lc_done;
|
|
case LK_DEF:
|
|
if (ptr=StrLastOcc(filename2,",")) {
|
|
*ptr=0;
|
|
i=Str2I64(ptr+1);
|
|
} else
|
|
i=-1;
|
|
filename=StrNew(filename2);
|
|
num=i;
|
|
goto lc_done;
|
|
case LK_HELP_INDEX:
|
|
filename=StrNew(filename2);
|
|
goto lc_done;
|
|
case LK_BIBLE_FIND:
|
|
if (ptr=StrLastOcc(filename2,",")) {
|
|
*ptr=0;
|
|
needle_str=StrNew(ptr+1);
|
|
}
|
|
i=DefineMatch(filename2,"ST_BIBLE_BOOKS",LMF_IGNORE_CASE);
|
|
if (i<0)
|
|
result=-1;
|
|
else {
|
|
num=Str2I64(DefineSub(i,"ST_BIBLE_BOOK_LINES"));
|
|
filename2=BIBLE_FILENAME;
|
|
}
|
|
break;
|
|
case LK_FILE_LINE:
|
|
case LK_PLAIN_LINE:
|
|
case LK_DOC_LINE:
|
|
if (ptr=StrLastOcc(filename2,",")) {
|
|
*ptr=0;
|
|
num=Str2I64(ptr+1);
|
|
}
|
|
break;
|
|
case LK_FILE_ANCHOR:
|
|
case LK_DOC_ANCHOR:
|
|
if (ptr=StrLastOcc(filename2,",")) {
|
|
*ptr=0;
|
|
needle_str=StrNew(ptr+1);
|
|
}
|
|
break;
|
|
case LK_FILE_FIND:
|
|
case LK_PLAIN_FIND:
|
|
case LK_DOC_FIND:
|
|
if (ptr=StrLastOcc(filename2,",")) {
|
|
*ptr=0;
|
|
needle_str=StrNew(ptr+1);
|
|
if (ptr=StrLastOcc(needle_str,":")) {
|
|
*ptr=0;
|
|
num=Str2I64(ptr+1);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
} else
|
|
filename2=st;
|
|
if (result>=0) {
|
|
if (LK_DOC<=result<=LK_DOC_LINE)
|
|
filename=StrNew(filename2); //Holds document address as number.
|
|
else
|
|
filename=FileNameAbs(filename2,FUF_Z_OR_NOT_Z);
|
|
}
|
|
lc_done:
|
|
Free(st);
|
|
if (_filename)
|
|
*_filename=filename;
|
|
else
|
|
Free(filename);
|
|
if (_needle_str)
|
|
*_needle_str=needle_str;
|
|
else
|
|
Free(needle_str);
|
|
if (_num)
|
|
*_num=num;
|
|
return result;
|
|
}
|