mirror of https://github.com/minexew/Shrine.git
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.
283 lines
7.1 KiB
283 lines
7.1 KiB
#help_index "AutoComplete/Dictionary" |
|
U0 ACDDictWordsAdd(U8 *st) |
|
{ |
|
I64 i; |
|
U8 *ptr; |
|
if (st && *st && (ptr=ACDWordPtAt(st))) { |
|
for (i=0;i<ACD_FILLINS_NUM;i++) { |
|
if (*ptr++!=ACD_WORD_CHAR) |
|
break; |
|
if (i) '\n'; |
|
acd.fillins[i]=ptr-1; |
|
"$$GREEN$$'%d'$$FG$$ %-23ts",i,ptr; |
|
ptr+=StrLen(ptr)+3; |
|
} |
|
acd.num_fillins=i; |
|
} |
|
} |
|
|
|
#help_index "AutoComplete" |
|
U0 ACDocRst(I64 left,I64 top) |
|
{ |
|
CDoc *doc=DocPut; |
|
DocRst(doc,TRUE); |
|
doc->flags|=DOCF_SIZE_MIN; |
|
Fs->border_src=BDS_CONST; |
|
Fs->border_attr=LTGRAY<<4+DrvTextAttrGet(':')&15; |
|
Fs->text_attr =LTGRAY<<4+BLUE; |
|
LBtr(&Fs->display_flags,DISPLAYf_SHOW); |
|
WinHorz(left,Fs->win_right); |
|
WinVert(top,Fs->win_bottom); |
|
DocCursor; |
|
} |
|
|
|
I64 ACSkipCrap(U8 *src,I64 len) |
|
{ |
|
I64 j; |
|
j=len-1; |
|
while (j>=0) { |
|
if (Bt(char_bmp_alpha_numeric,src[j])) |
|
break; |
|
else |
|
j--; |
|
} |
|
return j+1; |
|
} |
|
|
|
I64 ACPriorWordInStr(U8 *src,U8 *dst,I64 len,I64 buf_size) |
|
{ |
|
I64 i,j=0,k; |
|
i=len-1; |
|
while (i>=0) |
|
if (!Bt(char_bmp_alpha_numeric,src[i])) |
|
break; |
|
else |
|
i--; |
|
if (i>=-1 && len>0) |
|
for (k=i+1;k<len && j<buf_size-1;k++) |
|
dst[j++]=src[k]; |
|
dst[j]=0; |
|
return i+1; |
|
} |
|
|
|
U0 ACFillInAdd(CHashAC *tmpw) |
|
{ |
|
I64 k; |
|
if (ac.num_fillins<AC_FILLINS_NUM || |
|
tmpw->hits>ac.fillin_hits[ac.num_fillins-1]) { |
|
for (k=ac.num_fillins-1;k>=0;k--) { |
|
if (tmpw->hits<=ac.fillin_hits[k]) |
|
break; |
|
else { |
|
ac.fillin_matches[k+1]=ac.fillin_matches[k]; |
|
ac.fillin_hits[k+1] =ac.fillin_hits[k]; |
|
} |
|
} |
|
ac.fillin_matches[k+1]=tmpw; |
|
ac.fillin_hits[k+1] =tmpw->hits; |
|
if (ac.num_fillins<AC_FILLINS_NUM) |
|
ac.num_fillins++; |
|
} |
|
} |
|
|
|
U0 ACPutChoices(CDoc *focus_l,CDocEntry *doc_e,CTask *focus_task, |
|
Bool force_refresh) |
|
{ |
|
I64 i,data_col; |
|
U8 *buf,*buf1,*src=NULL,*st; |
|
CHashAC *tmpw; |
|
F64 timeout_time=tS+0.5; |
|
CHashSrcSym *tmph; |
|
|
|
src=DocScanLine(focus_l,doc_e,&data_col); |
|
DocUnlock(focus_l); |
|
i=StrLen(src); |
|
buf =MAlloc(MaxI64(i+1,256)); |
|
buf1=MAlloc(MaxI64(i+1,256)); |
|
if (data_col==-1) |
|
data_col=0; |
|
data_col=ACPriorWordInStr(src,buf,data_col,256); |
|
ac.partial_len=StrLen(buf); |
|
data_col=ACSkipCrap(src,data_col); |
|
data_col=ACPriorWordInStr(src,buf1,data_col,256); |
|
|
|
if (!ac.cur_word || StrCmp(ac.cur_word,buf) || force_refresh) { |
|
st=ac.cur_word; |
|
ac.cur_word=AStrNew(buf); |
|
Free(st); |
|
ac.num_fillins=0; |
|
if (*ac.cur_word) |
|
for (i=0;i<=ac.hash_table->mask && tS<timeout_time;i++) { |
|
tmpw=ac.hash_table->body[i]; |
|
while (tmpw) { |
|
if (!MemCmp(ac.cur_word,tmpw->str,StrLen(ac.cur_word))) |
|
ACFillInAdd(tmpw); |
|
tmpw=tmpw->next; |
|
} |
|
} |
|
ACDocRst(51,13); |
|
if (ac.cur_word && *ac.cur_word) { |
|
"$$PURPLE$$Word:%s$$FG$$\n",ac.cur_word; |
|
for (i=0;i<ac.num_fillins;i++) { |
|
st=ac.fillin_matches[i]->str; |
|
"$$GREEN$$F%02d$$FG$$ ",i+1; |
|
if (TaskValidate(focus_task) && |
|
(tmph=HashFind(st,focus_task->hash_table,HTG_SRC_SYM)) && |
|
tmph->src_link) { |
|
if (tmph->type&HTF_PUBLIC) |
|
"$$RED$$"; |
|
"$$TX+UL+L+PU,\"%$$Q\",A=\"%s\"$$$$FG$$\n",st,tmph->src_link; |
|
} else |
|
"%s\n",st; |
|
} |
|
if (acd.has_words) |
|
ACDDictWordsAdd(ac.cur_word); |
|
} else if (FileFind("::/Doc/StandBy.DD.Z")) |
|
Type("::/Doc/StandBy.DD.Z",0); |
|
} |
|
Free(src); |
|
Free(buf); |
|
Free(buf1); |
|
} |
|
|
|
U0 ACTaskNormal(I64 sc,I64 last_sc, |
|
CTask *focus_task,CTask *original_focus_task) |
|
{ |
|
CDoc *doc; |
|
CDocEntry *doc_e; |
|
if ((doc=DocPut(focus_task)) && |
|
focus_task!=Fs && Bt(&focus_task->display_flags,DISPLAYf_SHOW)) { |
|
DocLock(doc); |
|
if (TaskValidate(focus_task) && original_focus_task==sys_focus_task && |
|
doc && doc==DocPut(focus_task) && (doc_e=doc->cur_entry)) { |
|
if (doc_e==doc) doc_e=doc_e->last; |
|
while (doc_e->last!=doc && (doc_e->type_u8==DOCT_NEW_LINE || |
|
doc_e->type_u8==DOCT_SOFT_NEW_LINE)) |
|
doc_e=doc_e->last; |
|
while (doc_e->last->type_u8!=DOCT_NEW_LINE && doc_e->last!=doc) |
|
doc_e=doc_e->last; |
|
ACPutChoices(doc,doc_e,focus_task,ToBool(sc!=last_sc)); |
|
} else |
|
DocUnlock(doc); |
|
} |
|
if (!LBts(&Fs->display_flags,DISPLAYf_SHOW)) |
|
WinZBufUpdate; |
|
} |
|
|
|
U0 ACTaskCtrl(I64 sc,I64 last_sc, |
|
CTask *focus_task,CTask *original_focus_task) |
|
{ |
|
if (TaskValidate(focus_task) && |
|
(focus_task->scroll_x || focus_task->scroll_y)) { |
|
if (LBtr(&Fs->display_flags,DISPLAYf_SHOW)) |
|
WinZBufUpdate; |
|
} else { |
|
if (sc!=last_sc) { |
|
if (sc&SCF_ALT) { |
|
ACDocRst(27,3); |
|
if (TaskValidate(original_focus_task) && |
|
!Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC)) |
|
KeyMapFamily(original_focus_task,0, |
|
ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT)); |
|
KeyMapCtrlAltFamily( |
|
ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT)); |
|
} else if (TaskValidate(original_focus_task) && |
|
!Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC)) { |
|
ACDocRst(27,3); |
|
KeyMapFamily(original_focus_task,SCF_CTRL, |
|
ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT)); |
|
} |
|
} |
|
if (!LBts(&Fs->display_flags,DISPLAYf_SHOW)) |
|
WinZBufUpdate; |
|
} |
|
} |
|
|
|
U0 ACTaskAlt(I64 sc,I64 last_sc, |
|
CTask *,CTask *original_focus_task) |
|
{ |
|
if (sc!=last_sc && TaskValidate(original_focus_task) && |
|
!Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC)) { |
|
ACDocRst(27,3); |
|
KeyMapFamily(original_focus_task,SCF_ALT, |
|
ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT)); |
|
} |
|
if (!LBts(&Fs->display_flags,DISPLAYf_SHOW)) |
|
WinZBufUpdate; |
|
} |
|
|
|
U0 ACTaskEndCB() |
|
{ |
|
ac.task=NULL; |
|
Exit; |
|
} |
|
|
|
U0 ACTask(I64) |
|
{ |
|
CTask *focus_task,*original_focus_task; |
|
I64 ch,scan_code=0,last_scan_code=0; |
|
CDoc *doc; |
|
Fs->task_end_cb=&ACTaskEndCB; |
|
DocTermNew; |
|
LBts(&Fs->display_flags,DISPLAYf_SHOW); |
|
WinHorz(51,Fs->win_right); |
|
LBts(&Fs->display_flags,DISPLAYf_WIN_ON_TOP); |
|
Fs->win_inhibit=WIG_NO_FOCUS_TASK_DFT; |
|
Free(ac.cur_word); |
|
ac.cur_word=NULL; |
|
while (TRUE) { |
|
if (scan_code&(SCF_CTRL|SCF_ALT) || |
|
GetTSC>KbdMsEvtTime+cnts.time_stamp_freq>>1) { |
|
last_scan_code=scan_code; |
|
scan_code=kbd.scan_code; |
|
} |
|
original_focus_task=focus_task=sys_focus_task; |
|
while (TaskValidate(focus_task) && |
|
Bt(&focus_task->task_flags,TASKf_INPUT_FILTER_TASK)) |
|
focus_task=focus_task->parent_task; |
|
if (scan_code&SCF_CTRL) |
|
ACTaskCtrl(scan_code,last_scan_code,focus_task,original_focus_task); |
|
else if (TaskValidate(focus_task)) { |
|
if (scan_code&SCF_ALT) |
|
ACTaskAlt(scan_code,last_scan_code,focus_task,original_focus_task); |
|
else |
|
ACTaskNormal(scan_code,last_scan_code,focus_task,original_focus_task); |
|
} |
|
Sleep(333); |
|
if (ScanMsg(&ch,,1<<MSG_KEY_DOWN) && (ch==CH_ESC||ch==CH_SHIFT_ESC)) |
|
break; |
|
doc=DocPut; |
|
DocLock(doc); |
|
if (doc->cur_entry->de_flags & DOCEF_LINK) { |
|
'' CH_SPACE; |
|
doc->cur_entry=doc; |
|
} |
|
DocUnlock(doc); |
|
} |
|
} |
|
|
|
public Bool AutoComplete(Bool val=OFF) |
|
{//Turn AutoComplete OFF or ON. |
|
Bool old_val=FALSE; |
|
while (Bt(&ac.flags,ACf_INIT_IN_PROGRESS)) |
|
Sleep(10); |
|
if (val) { |
|
if (Bt(&sys_run_level,RLf_AUTO_COMPLETE)) { |
|
if (TaskValidate(ac.task)) |
|
old_val=TRUE; |
|
else { |
|
ac.task=Spawn(&ACTask,NULL,"AutoComplete"); |
|
TaskWait(ac.task); |
|
} |
|
WinToTop(ac.task); |
|
} |
|
} else { |
|
if (TaskValidate(ac.task)) { |
|
if (Bt(&sys_run_level,RLf_AUTO_COMPLETE)) |
|
old_val=TRUE; |
|
Kill(ac.task); |
|
DeathWait(&ac.task); |
|
} |
|
} |
|
return old_val; |
|
}
|
|
|