hschumann2/TempleOS-Source-Code
0847
1 2#help_index "AutoComplete/Dictionary"3U0 ACDDictWordsAdd(U8 *st)4{5 I64 i;6 U8 *ptr;7 if (st && *st && (ptr=ACDWordPtAt(st))) {8 for (i=0;i<ACD_FILLINS_NUM;i++) {9 if (*ptr++!=ACD_WORD_CHAR)10 break;11 if (i) '\n';12 acd.fillins[i]=ptr-1;13 "$GREEN$'%d'$FG$ %-23ts",i,ptr;14 ptr+=StrLen(ptr)+3;15 }16 acd.num_fillins=i;17 }18}19 20#help_index "AutoComplete"21U0 ACDocRst(I64 left,I64 top)22{23 CDoc *doc=DocPut;24 DocRst(doc,TRUE);25 doc->flags|=DOCF_SIZE_MIN;26 Fs->border_src=BDS_CONST;27 Fs->border_attr=LTGRAY<<4+DrvTextAttrGet(':')&15;28 Fs->text_attr =LTGRAY<<4+BLUE;29 LBtr(&Fs->display_flags,DISPLAYf_SHOW);30 WinHorz(left,Fs->win_right);31 WinVert(top,Fs->win_bottom);32 DocCursor;33}34 35I64 ACSkipCrap(U8 *src,I64 len)36{37 I64 j;38 j=len-1;39 while (j>=0) {40 if (Bt(char_bmp_alpha_numeric,src[j]))41 break;42 else43 j--;44 }45 return j+1;46}47 48I64 ACPriorWordInStr(U8 *src,U8 *dst,I64 len,I64 buf_size)49{50 I64 i,j=0,k;51 i=len-1;52 while (i>=0)53 if (!Bt(char_bmp_alpha_numeric,src[i]))54 break;55 else56 i--;57 if (i>=-1 && len>0)58 for (k=i+1;k<len && j<buf_size-1;k++)59 dst[j++]=src[k];60 dst[j]=0;61 return i+1;62}63 64U0 ACFillInAdd(CHashAC *tmpw)65{66 I64 k;67 if (ac.num_fillins<AC_FILLINS_NUM ||68 tmpw->hits>ac.fillin_hits[ac.num_fillins-1]) {69 for (k=ac.num_fillins-1;k>=0;k--) {70 if (tmpw->hits<=ac.fillin_hits[k])71 break;72 else {73 ac.fillin_matches[k+1]=ac.fillin_matches[k];74 ac.fillin_hits[k+1] =ac.fillin_hits[k];75 }76 }77 ac.fillin_matches[k+1]=tmpw;78 ac.fillin_hits[k+1] =tmpw->hits;79 if (ac.num_fillins<AC_FILLINS_NUM)80 ac.num_fillins++;81 }82}83 84U0 ACPutChoices(CDoc *focus_l,CDocEntry *doc_e,CTask *focus_task,85 Bool force_refresh)86{87 I64 i,data_col;88 U8 *buf,*buf1,*src=NULL,*st;89 CHashAC *tmpw;90 F64 timeout_time=tS+0.5;91 CHashSrcSym *tmph;92 93 src=DocScanLine(focus_l,doc_e,&data_col);94 DocUnlock(focus_l);95 i=StrLen(src);96 buf =MAlloc(MaxI64(i+1,256));97 buf1=MAlloc(MaxI64(i+1,256));98 if (data_col==-1)99 data_col=0;100 data_col=ACPriorWordInStr(src,buf,data_col,256);101 ac.partial_len=StrLen(buf);102 data_col=ACSkipCrap(src,data_col);103 data_col=ACPriorWordInStr(src,buf1,data_col,256);104 105 if (!ac.cur_word || StrCmp(ac.cur_word,buf) || force_refresh) {106 st=ac.cur_word;107 ac.cur_word=AStrNew(buf);108 Free(st);109 ac.num_fillins=0;110 if (*ac.cur_word)111 for (i=0;i<=ac.hash_table->mask && tS<timeout_time;i++) {112 tmpw=ac.hash_table->body[i];113 while (tmpw) {114 if (!MemCmp(ac.cur_word,tmpw->str,StrLen(ac.cur_word)))115 ACFillInAdd(tmpw);116 tmpw=tmpw->next;117 }118 }119 ACDocRst(51,13);120 if (ac.cur_word && *ac.cur_word) {121 "$PURPLE$Word:%s$FG$\n",ac.cur_word;122 for (i=0;i<ac.num_fillins;i++) {123 st=ac.fillin_matches[i]->str;124 "$GREEN$F%02d$FG$ ",i+1;125 if (TaskValidate(focus_task) &&126 (tmph=HashFind(st,focus_task->hash_table,HTG_SRC_SYM)) &&127 tmph->src_link) {128 if (tmph->type&HTF_PUBLIC)129 "$RED$";130 "$TX+UL+L+PU,\"%$Q\",A=\"%s\"$$FG$\n",st,tmph->src_link;131 } else132 "%s\n",st;133 }134 if (acd.has_words)135 ACDDictWordsAdd(ac.cur_word);136 } else if (FileFind("::/Doc/StandBy.DD.Z"))137 Type("::/Doc/StandBy.DD.Z",0);138 }139 Free(src);140 Free(buf);141 Free(buf1);142}143 144U0 ACTaskNormal(I64 sc,I64 last_sc,145 CTask *focus_task,CTask *original_focus_task)146{147 CDoc *doc;148 CDocEntry *doc_e;149 if ((doc=DocPut(focus_task)) &&150 focus_task!=Fs && Bt(&focus_task->display_flags,DISPLAYf_SHOW)) {151 DocLock(doc);152 if (TaskValidate(focus_task) && original_focus_task==sys_focus_task &&153 doc && doc==DocPut(focus_task) && (doc_e=doc->cur_entry)) {154 if (doc_e==doc) doc_e=doc_e->last;155 while (doc_e->last!=doc && (doc_e->type_u8==DOCT_NEW_LINE ||156 doc_e->type_u8==DOCT_SOFT_NEW_LINE))157 doc_e=doc_e->last;158 while (doc_e->last->type_u8!=DOCT_NEW_LINE && doc_e->last!=doc)159 doc_e=doc_e->last;160 ACPutChoices(doc,doc_e,focus_task,ToBool(sc!=last_sc));161 } else162 DocUnlock(doc);163 }164 if (!LBts(&Fs->display_flags,DISPLAYf_SHOW))165 WinZBufUpdate;166}167 168U0 ACTaskCtrl(I64 sc,I64 last_sc,169 CTask *focus_task,CTask *original_focus_task)170{171 if (TaskValidate(focus_task) &&172 (focus_task->scroll_x || focus_task->scroll_y)) {173 if (LBtr(&Fs->display_flags,DISPLAYf_SHOW))174 WinZBufUpdate;175 } else {176 if (sc!=last_sc) {177 if (sc&SCF_ALT) {178 ACDocRst(27,3);179 if (TaskValidate(original_focus_task) &&180 !Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC))181 KeyMapFamily(original_focus_task,0,182 ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT));183 KeyMapCtrlAltFamily(184 ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT));185 } else if (TaskValidate(original_focus_task) &&186 !Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC)) {187 ACDocRst(27,3);188 KeyMapFamily(original_focus_task,SCF_CTRL,189 ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT));190 }191 }192 if (!LBts(&Fs->display_flags,DISPLAYf_SHOW))193 WinZBufUpdate;194 }195}196 197U0 ACTaskAlt(I64 sc,I64 last_sc,198 CTask *,CTask *original_focus_task)199{200 if (sc!=last_sc && TaskValidate(original_focus_task) &&201 !Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC)) {202 ACDocRst(27,3);203 KeyMapFamily(original_focus_task,SCF_ALT,204 ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT));205 }206 if (!LBts(&Fs->display_flags,DISPLAYf_SHOW))207 WinZBufUpdate;208}209 210U0 ACTaskEndCB()211{212 ac.task=NULL;213 Exit;214}215 216U0 ACTask(I64)217{218 CTask *focus_task,*original_focus_task;219 I64 ch,scan_code=0,last_scan_code=0;220 CDoc *doc;221 Fs->task_end_cb=&ACTaskEndCB;222 DocTermNew;223 LBts(&Fs->display_flags,DISPLAYf_SHOW);224 WinHorz(51,Fs->win_right);225 LBts(&Fs->display_flags,DISPLAYf_WIN_ON_TOP);226 Fs->win_inhibit=WIG_NO_FOCUS_TASK_DFT;227 Free(ac.cur_word);228 ac.cur_word=NULL;229 while (TRUE) {230 if (scan_code&(SCF_CTRL|SCF_ALT) ||231 GetTSC>KbdMsEvtTime+cnts.time_stamp_freq>>1) {232 last_scan_code=scan_code;233 scan_code=kbd.scan_code;234 }235 original_focus_task=focus_task=sys_focus_task;236 while (TaskValidate(focus_task) &&237 Bt(&focus_task->task_flags,TASKf_INPUT_FILTER_TASK))238 focus_task=focus_task->parent_task;239 if (scan_code&SCF_CTRL)240 ACTaskCtrl(scan_code,last_scan_code,focus_task,original_focus_task);241 else if (TaskValidate(focus_task)) {242 if (scan_code&SCF_ALT)243 ACTaskAlt(scan_code,last_scan_code,focus_task,original_focus_task);244 else245 ACTaskNormal(scan_code,last_scan_code,focus_task,original_focus_task);246 }247 Sleep(333);248 if (ScanMsg(&ch,,1<<MSG_KEY_DOWN) && (ch==CH_ESC||ch==CH_SHIFT_ESC))249 break;250 doc=DocPut;251 DocLock(doc);252 if (doc->cur_entry->de_flags & DOCEF_LINK) {253 '' CH_SPACE;254 doc->cur_entry=doc;255 }256 DocUnlock(doc);257 }258}259 260public Bool AutoComplete(Bool val=OFF)261{//Turn AutoComplete OFF or ON.262 Bool old_autocomplete=FALSE;263 while (Bt(&ac.flags,ACf_INIT_IN_PROGRESS))264 Sleep(10);265 if (val) {266 if (Bt(&sys_run_level,RLf_AUTO_COMPLETE)) {267 if (TaskValidate(ac.task))268 old_autocomplete=TRUE;269 else {270 ac.task=Spawn(&ACTask,NULL,"AutoComplete");271 TaskWait(ac.task);272 }273 WinToTop(ac.task);274 }275 } else {276 if (TaskValidate(ac.task)) {277 if (Bt(&sys_run_level,RLf_AUTO_COMPLETE))278 old_autocomplete=TRUE;279 Kill(ac.task);280 DeathWait(&ac.task);281 }282 }283 return old_autocomplete;284}285 