hschumann2/TempleOS-Source-Code
0847
1 2#help_index "DolDoc/Editor"3 4public I64 EdCurU8(CDoc *doc)5{//Return cur U8. See EdRenumAsm for an example.6 Bool unlock=DocLock(doc);7 CDocEntry *doc_ce=doc->cur_entry;8 I64 res=-1;9 if (doc_ce->type_u8==DOCT_TEXT &&10 doc_ce->min_col<=doc->cur_col<doc_ce->max_col)11 res=doc_ce->tag[doc->cur_col];12 else if (doc_ce->type_u8==DOCT_TAB)13 res='\t';14 else if (doc_ce->type_u8==DOCT_NEW_LINE ||15 doc_ce->type_u8==DOCT_SOFT_NEW_LINE)16 res='\n';17 if (unlock)18 DocUnlock(doc);19 return res;20}21 22public U0 EdCursorLeft(CDoc *doc,I64 sc=I64_MIN)23{//Move cursor left. Might need a call to DocRecalc().24//See EdRenumAsm for an example.25 U8 *dst;26 Bool unlock=DocLock(doc);27 CDocEntry *doc_ce=doc->cur_entry,*original_ce=doc_ce,*doc_ne;28 I64 cc=doc->cur_col,y=doc_ce->y;29 if (sc!=I64_MIN) sc=sc.u32[0];30 if (sc>=0 && sc&SCF_CTRL) {31 while (doc_ce->last!=doc && (doc_ce->last->y==y ||32 doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP)))33 doc_ce=doc_ce->last; //TODO: sel? recurse?34 cc=doc_ce->min_col;35 } else {36 if (cc>doc_ce->min_col) {37 if (IsEditableText(doc_ce) && cc<doc_ce->max_col) {38 dst=doc_ce->tag+cc;39 doc_ne=DocEntryNewTag(doc,doc_ce,dst);40 *dst=0;41 doc_ce->max_col=cc;42 QueIns(doc_ne,doc_ce);43 }44 cc--;45 if (IsEditableText(doc_ce) && cc>doc_ce->min_col) {46 dst=doc_ce->tag+cc;47 doc_ne=DocEntryNewTag(doc,doc_ce,dst);48 *dst=0;49 doc_ce->max_col=cc;50 QueIns(doc_ne,doc_ce);51 doc_ce=doc_ne;52 cc=doc_ce->min_col;53 }54 if (sc>=0)55 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);56 } else {57 cc=doc_ce->min_col;58 while (doc_ce->last!=doc &&59 (doc_ce->last->type_u8==DOCT_SOFT_NEW_LINE ||60 doc_ce->last->type_u8==DOCT_INDENT ||61 doc_ce->last->de_flags&(DOCEF_SKIP|DOCEF_FILTER_SKIP))) {62 doc_ce=doc_ce->last;63 if (sc>=0)64 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);65 }66 if (doc_ce->last!=doc) {67 doc_ce=doc_ce->last;68 if (doc_ce->max_col>doc_ce->min_col) {69 cc=doc_ce->max_col-1;70 if (IsEditableText(doc_ce) && cc>doc_ce->min_col) {71 dst=doc_ce->tag+cc;72 doc_ne=DocEntryNewTag(doc,doc_ce,dst);73 *dst=0;74 doc_ce->max_col=cc;75 QueIns(doc_ne,doc_ce);76 doc_ce=doc_ne;77 cc=doc_ce->min_col;78 }79 } else80 cc=doc_ce->max_col;81 if (sc>=0)82 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);83 }84 }85 }86 doc->cur_col=cc;87 doc->cur_entry=doc_ce;88 if (doc_ce!=original_ce)89 DocFormBwd(doc);90 if (unlock)91 DocUnlock(doc);92}93 94public U0 EdCursorRight(CDoc *doc,I64 sc=I64_MIN)95{//Move cursor right. Might need a call to DocRecalc().96//See EdRenumAsm for an example.97 Bool unlock=DocLock(doc);98 U8 *dst;99 CDocEntry *doc_ce=doc->cur_entry,*original_ce=doc_ce,*doc_ne;100 I64 cc=doc->cur_col,y=doc_ce->y,old_de_flags,old_color;101 if (sc!=I64_MIN) sc=sc.u32[0];102 if (sc>=0 && sc&SCF_CTRL) {103 while (doc_ce!=doc && doc_ce->next->y==y &&104 doc_ce->next->type_u8!=DOCT_SOFT_NEW_LINE && doc_ce->next!=doc &&105 (doc_ce->next->type_u8!=DOCT_NEW_LINE || !(doc->flags & DOCF_FORM)) ||106 doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP))107 doc_ce=doc_ce->next;108 if (doc_ce->max_col>doc_ce->min_col)109 cc=doc_ce->max_col-1;110 else111 cc=doc_ce->min_col;112 } else {113 if (cc<doc_ce->max_col) {114 if (IsEditableText(doc_ce) && cc>doc_ce->min_col) {115 dst=doc_ce->tag+cc;116 doc_ne=DocEntryNewTag(doc,doc_ce,dst);117 *dst=0;118 doc_ce->max_col=cc;119 QueIns(doc_ne,doc_ce);120 doc_ce=doc_ne;121 cc=doc_ce->min_col;122 }123 cc++;124 old_de_flags=doc_ce->de_flags;125 old_color=doc_ce->type;126 if (sc>=0)127 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);128 if (IsEditableText(doc_ce) && cc<doc_ce->max_col) {129 dst=doc_ce->tag+cc;130 doc_ne=DocEntryNewTag(doc,doc_ce,dst);131 *dst=0;132 doc_ne->type=DOCT_TEXT | old_color & -0x100;133 doc_ne->de_flags=old_de_flags|doldoc.dft_de_flags[DOCT_TEXT];134 doc_ce->max_col=cc;135 QueIns(doc_ne,doc_ce);136 doc_ce=doc_ne;137 cc=doc_ce->min_col;138 } else if (cc>=doc_ce->max_col) {139 doc_ce=doc_ce->next;140 cc=doc_ce->min_col;141 }142 } else {143 if (doc_ce!=doc) {144 if (cc<=doc_ce->min_col && sc>=0)145 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);146 doc_ce=doc_ce->next;147 while (doc_ce!=doc && doc_ce->de_flags&(DOCEF_SKIP|DOCEF_FILTER_SKIP)) {148 if (sc>=0)149 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);150 doc_ce=doc_ce->next;151 }152 cc=doc_ce->min_col;153 if (doc_ce->type_u8==DOCT_SOFT_NEW_LINE) {154 if (sc>=0)155 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);156 doc_ce=doc_ce->next;157 cc=doc_ce->min_col;158 }159 }160 }161 }162 doc->cur_col=cc;163 doc->cur_entry=doc_ce;164 if (doc_ce!=original_ce)165 DocFormFwd(doc);166 if (unlock)167 DocUnlock(doc);168}169 170public U0 EdLineUp(CDoc *doc,I64 sc=I64_MIN)171{//Move cursor up. Might need a call to DocRecalc().172//See EdRenumAsm for an example.173 Bool unlock=DocLock(doc);174 U8 *dst;175 I64 y,x;176 CDocEntry *doc_ce=doc->cur_entry,*doc_ne;177 178 if (sc!=I64_MIN) sc=sc.u32[0];179 if (doc_ce->type_u8==DOCT_HEX_ED) {180 doc->cur_col=doc->cur_col-doc_ce->hex_ed_width*3;181 if (doc->cur_col>=0) {182 if (unlock)183 DocUnlock(doc);184 return;185 } else186 doc->cur_col=0;187 }188 x=doc->x; y=doc->y;189 if (IsEditableText(doc_ce)) {190 if (doc_ce->min_col<doc->cur_col<doc_ce->max_col-1) {191 dst=doc_ce->tag+doc->cur_col;192 doc_ne=DocEntryNewTag(doc,doc_ce,dst);193 *dst=0;194 doc_ne->x=doc_ce->x+doc->cur_col;195 doc_ce->max_col=doc->cur_col;196 QueIns(doc_ne,doc_ce);197 } else if (doc->cur_col==doc_ce->min_col && doc_ce->last!=doc)198 doc_ce=doc_ce->last;199 } else if (doc_ce->last!=doc)200 doc_ce=doc_ce->last;201 if (sc>=0)202 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);203 doc->cur_entry=doc_ce;204 DocFormBwd(doc);205 doc_ce=doc->cur_entry;206 while (doc_ce->last!=doc && (doc_ce->y>=y ||207 doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP))) {208 doc_ce=doc_ce->last;209 if (sc>=0)210 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);211 }212 y=doc_ce->y;213 doc->y=y;214 while (doc_ce!=doc && (doc_ce->y>=y && doc_ce->x>=x ||215 doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP))) {216 if (sc>=0)217 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);218 doc_ce=doc_ce->last;219 }220 221 if (doc_ce==doc || doc_ce->y<y)222 doc_ce=doc_ce->next;223 else {224 if (!IsEditableText(doc_ce)) {225 if (sc>=0)226 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);227 } else {228 if (doc_ce->next->x==x) {229 doc_ce=doc_ce->next;230 if (doc->flags & DOCF_FORM)231 while (doc_ce->next->x==x &&232 (!Bt(doldoc.type_flags_form,doc_ce->type_u8) &&233 !(doc_ce->de_flags&DOCEF_LINK)||234 doc_ce->de_flags&DOCEF_SKIP_IN_FORM))235 doc_ce=doc_ce->next;236 }237 }238 }239 if (doc_ce->de_flags&DOCEF_TAG) {240 doc->cur_col=x-doc_ce->x;241 if (IsEditableText(doc_ce)) {242 if (doc->cur_col>doc_ce->max_col)243 doc->cur_col=doc_ce->max_col;244 } else if (doc->cur_col>=doc_ce->max_col)245 doc->cur_col=doc_ce->max_col-1;246 if (doc->cur_col<doc_ce->min_col)247 doc->cur_col=doc_ce->min_col;248 } else {249 if (doc_ce->type_u8==DOCT_HEX_ED) {250 doc->cur_col=RoundI64((doc_ce->len-1)*3,doc_ce->hex_ed_width*3);251 if (doc->cur_col<0)252 doc->cur_col=0;253 } else254 doc->cur_col=doc_ce->min_col;255 }256 if (IsEditableText(doc_ce) && doc_ce->x<x) {257 if (doc->cur_col<doc_ce->max_col-1) {258 dst=doc_ce->tag+doc->cur_col;259 doc_ne=DocEntryNewTag(doc,doc_ce,dst);260 *dst=0;261 if (sc>=0) {262 if (sc&SCF_SHIFT)263 doc_ne->type=doc_ce->type | DOCET_SEL;264 else265 doc_ne->type=doc_ce->type & ~DOCET_SEL;266 }267 doc_ne->x=doc_ce->x+doc->cur_col;268 doc_ce->max_col=doc->cur_col;269 QueIns(doc_ne,doc_ce);270 doc_ce=doc_ne;271 doc->cur_col=doc_ce->min_col;272 }273 }274 doc->cur_entry=doc_ce;275 DocFormFwd(doc);276 doc->x=doc->cur_entry->x+doc->cur_col;277 if (unlock)278 DocUnlock(doc);279}280 281public U0 EdLineDown(CDoc *doc,I64 sc=I64_MIN)282{//Move cursor down. Might need a call to DocRecalc().283//See EdRenumAsm for an example.284 Bool unlock=DocLock(doc);285 U8 *dst;286 I64 y,x,old_de_flags=0,old_color;287 CDocEntry *doc_ce=doc->cur_entry,*doc_ne,*doc_ce2;288 if (sc!=I64_MIN) sc=sc.u32[0];289 if (doc_ce->type_u8==DOCT_HEX_ED) {290 doc->cur_col=doc->cur_col+doc_ce->hex_ed_width*3;291 if (doc->cur_col>=doc_ce->len*3) {292 doc->cur_entry=doc_ce=doc_ce->next;293 doc->cur_col=doc_ce->min_col;294 doc->x=doc_ce->x+doc->cur_col;295 doc->y=doc_ce->y;296 }297 if (unlock)298 DocUnlock(doc);299 return;300 }301 x=doc->x; y=doc->y;302 if (IsEditableText(doc_ce)) {303 if (doc->cur_col>doc_ce->min_col && doc->cur_col<doc_ce->max_col-1) {304 dst=doc_ce->tag+doc->cur_col;305 doc_ne=DocEntryNewTag(doc,doc_ce,dst);306 *dst=0;307 if (sc>=0) {308 if (sc&SCF_SHIFT)309 doc_ne->type=doc_ce->type | DOCET_SEL;310 else311 doc_ne->type=doc_ce->type & ~DOCET_SEL;312 }313 doc_ne->x=doc_ce->x+doc->cur_col;314 doc_ce->max_col=doc->cur_col;315 QueIns(doc_ne,doc_ce);316 doc_ce=doc_ne;317 doc->cur_col=doc_ce->min_col;318 }319 }320 doc_ce2=doc_ce;321 while (doc_ce!=doc && (doc_ce->y<=y ||322 doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP)))323 doc_ce=doc_ce->next;324 y=doc_ce->y;325 doc->y=y;326 while (doc_ce!=doc && (doc_ce->y<=y && doc_ce->x<=x ||327 doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP))) {328 old_de_flags=doc_ce->de_flags;329 old_color=doc_ce->type;330 doc_ce=doc_ce->next;331 }332 if (doc_ce->last!=doc && (doc_ce->x>x && doc_ce->last->y>=y || doc_ce->y>y)) {333 doc_ce=doc_ce->last;334 doc->cur_entry=doc_ce;335 if (!((doc_ce->type_u8==DOCT_NEW_LINE ||336 doc_ce->type_u8==DOCT_SOFT_NEW_LINE ||337 doc_ce->type_u8==DOCT_INDENT) &&338 (doc_ce->last->type_u8==DOCT_NEW_LINE ||339 doc_ce->last->type_u8==DOCT_SOFT_NEW_LINE ||340 doc_ce->last->type_u8==DOCT_INDENT)))341 DocFormBwd(doc);342 doc_ce=doc->cur_entry;343 }344 while (doc_ce2!=doc && (doc_ce2!=doc_ce || IsEditableText(doc_ce))) {345 if ((doc_ce2->y<y || doc_ce2->x<x ||346 doc_ce2->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP) ||347 doc_ce2->x==x && !doc_ce2->max_col &&348 Bt(doldoc.type_flags_nontag_invis,doc_ce2->type_u8)) && sc>=0)349 BEqu(&doc_ce2->type,DOCEt_SEL,sc&SCF_SHIFT);350 if (doc_ce2==doc_ce) break;351 doc_ce2=doc_ce2->next;352 }353 if (doc_ce->de_flags&DOCEF_TAG) {354 doc->cur_col=x-doc_ce->x;355 if (IsEditableText(doc_ce)) {356 if (doc->cur_col>doc_ce->max_col)357 doc->cur_col=doc_ce->max_col;358 } else if (doc->cur_col>=doc_ce->max_col)359 doc->cur_col=doc_ce->max_col-1;360 if (doc->cur_col<doc_ce->min_col)361 doc->cur_col=doc_ce->min_col;362 } else363 doc->cur_col=doc_ce->min_col;364 if (IsEditableText(doc_ce)&&doc_ce->min_col<doc->cur_col<doc_ce->max_col-1) {365 dst=doc_ce->tag+doc->cur_col;366 doc_ne=DocEntryNewTag(doc,doc_ce,dst);367 *dst=0;368 doc_ne->type=DOCT_TEXT | old_color & -0x100;369 doc_ne->de_flags=old_de_flags|doldoc.dft_de_flags[DOCT_TEXT];370 doc_ce->max_col=doc->cur_col;371 doc_ne->x=doc_ce->x+doc->cur_col;372 QueIns(doc_ne,doc_ce);373 doc_ce=doc_ne;374 doc->cur_col=doc_ce->min_col;375 }376 doc->cur_entry=doc_ce;377 DocFormFwd(doc);378 if (!(doc->flags & DOCF_FORM))379 while (doc_ce!=doc && doc_ce!=doc->cur_entry) {380 if (sc>=0)381 BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);382 doc_ce=doc_ce->next;383 }384 doc->x=doc->cur_entry->x+doc->cur_col;385 if (unlock)386 DocUnlock(doc);387}388 389U0 EdCharDel(CDoc *doc)390{391 Bool unlock=DocLock(doc);392 CDocEntry *doc_ce=doc->cur_entry;393 394 if (doc_ce==doc) {395 if (unlock)396 DocUnlock(doc);397 return;398 }399 if (doc_ce->max_col!=0 &&400 (IsEditableText(doc_ce)||doc_ce->type_u8==DOCT_DATA)) {401 if (doc_ce->type_u8==DOCT_DATA && doc_ce->de_flags & DOCEF_HAS_TERMINATOR &&402 doc->cur_col==doc_ce->max_col-1) {403 if (unlock)404 DocUnlock(doc);405 return;406 }407 if (doc->cur_col<doc_ce->max_col)408 StrCpy(doc_ce->tag+doc->cur_col,doc_ce->tag+doc->cur_col+1);409 if (doc->cur_col>=doc_ce->max_col-1) {410 doc->cur_entry=doc_ce->next;411 doc->cur_col=doc->cur_entry->min_col;412 }413 DocRemSoftNewLines(doc,doc->cur_entry);414 if (unlock)415 DocUnlock(doc);416 return;417 }418 doc->cur_entry=doc_ce->next;419 doc->cur_col=doc->cur_entry->min_col;420 if (!(doc_ce->de_flags&DOCEF_FILTER_SKIP))421 DocEntryDel(doc,doc_ce);422 DocRemSoftNewLines(doc,doc->cur_entry);423 if (unlock)424 DocUnlock(doc);425}426 427U0 ChkDollarBufSize(CDoc *doc)428{429 U8 *b;430 if (doc->dollar_buf_ptr>=doc->dollar_buf_size-2) {431 doc->dollar_buf_size<<=1;432 b=MAlloc(doc->dollar_buf_size,doc->mem_task);433 MemCpy(b,doc->dollar_buf,doc->dollar_buf_ptr);434 Free(doc->dollar_buf);435 doc->dollar_buf=b;436 }437}438 439U0 EdCharIns(I64 ch,I64 sc,CDoc *doc)440{441 Bool unlock=DocLock(doc);442 U8 *st,*src,*dst;443 CDocEntry *doc_ce=doc->cur_entry,*doc_ne;444 I64 i,j,m,y=doc_ce->y;445 446 if (doc->flags & DOCF_IN_DOLLAR) {447 if (!Bt(char_bmp_printable,ch))448 goto ic_done;449 ChkDollarBufSize(doc);450 doc->dollar_buf[doc->dollar_buf_ptr++]=ch;451 if (ch=='$') {452 if (doc->dollar_buf_ptr==2) {453 doc->flags&=~DOCF_IN_DOLLAR;454 doc->dollar_buf_ptr=0;455 goto ic_cont;456 } else {457 doc->dollar_buf[doc->dollar_buf_ptr]=0;458 doc->flags&=~DOCF_IN_DOLLAR;459 DocPrint(doc,"%s",doc->dollar_buf);460 doc->dollar_buf_ptr=0;461 goto ic_done;462 }463 } else464 goto ic_done;465 }466 if (ch=='$' && !(doc->flags & (DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_TABS))) {467 doc->flags|=DOCF_IN_DOLLAR;468 doc->dollar_buf_ptr=0;469 doc->dollar_buf[doc->dollar_buf_ptr++]=ch;470 goto ic_done;471 }472 if (ch=='\r') goto ic_done;473 474 ic_cont:475 if ((ch==CH_SPACE || ch=='\n') &&476 !(sc & (SCF_CTRL|SCF_SHIFT)) &&477 doc_ce->de_flags &478 (DOCEF_LINK|DOCEF_TREE|DOCEF_LST|DOCEF_CHECK_COLLAPSABLE|479 DOCEF_LEFT_MACRO|DOCEF_LEFT_EXP|DOCEF_LEFT_CB|DOCEF_LEFT_IN_STR |480 DOCEF_RIGHT_MACRO|DOCEF_RIGHT_EXP|DOCEF_RIGHT_CB|DOCEF_RIGHT_IN_STR)) {481 doc->cmd_U8=ch;482 DocEntryRun(doc,doc_ce,FALSE);483 DocLock(doc);484 goto ic_done;485 }486 if (doc_ce->type_u8==DOCT_HEX_ED) {487 if (doc_ce->de_flags&DOCEF_DEREF_DATA &&488 !(doc_ce->de_flags&DOCEF_REMALLOC_DATA))489 st=doc_ce->data;490 else491 st=&doc_ce->data;492 i=doc->cur_col;493 j=i%(doc_ce->hex_ed_width*3);494 m=i/(doc_ce->hex_ed_width*3)*doc_ce->hex_ed_width;495 if (j>=doc_ce->hex_ed_width<<1)496 st[j-doc_ce->hex_ed_width<<1+m]=ch;497 else {498 ch=ToUpper(ch)-'0';499 if (ch>9) {500 ch+='0'-'A'+10;501 if (!(10<=ch<=15))502 goto ic_done;503 }504 m=j>>1+m;505 if (j & 1)506 st[m]=st[m] & 0xF0| ch;507 else508 st[m]=st[m] & 0xF | ch<<4;509 }510 doc->cur_col++;511 goto ic_done;512 }513 if (doc->flags & DOCF_OVERSTRIKE) {514 if (Bt(char_bmp_displayable,ch)) {515ic_overstrike:516 if (IsEditableText(doc_ce)) {517 if (doc->cur_col<doc_ce->max_col) {518 if (doc_ce->tag[doc->cur_col]) {519 doc_ce->tag[doc->cur_col++]=ch;520 goto ic_done;521 }522 } else {523 doc_ce=doc_ce->next;524 doc->cur_entry=doc_ce;525 doc->cur_col=doc_ce->min_col;526 goto ic_overstrike;527 }528 } else if (doc_ce->type_u8==DOCT_DATA) {529 if (doc_ce->de_flags & DOCEF_HAS_TERMINATOR) {530 if (doc_ce->tag[doc->cur_col] &&531 doc->cur_col<doc_ce->min_col+doc_ce->len) {532 doc_ce->tag[doc->cur_col++]=ch;533 if ( ! doc_ce->tag[doc->cur_col]) {534 doc_ce->tag[doc->cur_col]='_';535 doc_ce->tag[doc->cur_col+1]=0;536 }537 } else if (doc_ce->de_flags & DOCEF_REMALLOC_DATA)538 goto ic_not_overstrike;539 } else if (doc_ce->tag[doc->cur_col])540 doc_ce->tag[doc->cur_col++]=ch;541 goto ic_done;542 }543 doc_ne=DocEntryNewTag(doc,doc_ce,&ch);544 doc_ne->type=DOCT_TEXT | doc->settings_head.dft_text_attr<<8;545 doc_ne->de_flags=doldoc.dft_de_flags[DOCT_TEXT];546 QueIns(doc_ne,doc_ce->last);547 } else if (ch=='\n') {548 while (doc->cur_entry->next!=doc && doc->cur_entry->y==y)549 doc->cur_entry=doc->cur_entry->next;550 doc->cur_col=doc->cur_entry->min_col;551 } else if (ch=='\t') {552 if (doc->flags&DOCF_FORM)553 goto ic_form_tab;554 }555 goto ic_done;556 }557ic_not_overstrike:558 if (ch=='\n') {559 if (sc&SCF_CTRL && !(sc&SCF_SHIFT)) {560 doc_ne=DocEntryNewBase(doc,561 DOCT_PAGE_BREAK|doc->settings_head.dft_text_attr<<8);562 } else {563 doc_ne=DocEntryNewBase(doc,564 DOCT_NEW_LINE|doc->settings_head.dft_text_attr<<8);565 }566 DocInsEntry(doc,doc_ne);567 } else if (ch=='\t') {568 if (doc->flags&DOCF_FORM &&569 (Bt(doldoc.type_flags_form,doc->cur_entry->type_u8) ||570 doc->cur_entry->de_flags&DOCEF_LINK) &&571 !(doc->cur_entry->de_flags&DOCEF_SKIP_IN_FORM)) {572ic_form_tab:573 doc->cur_entry=doc->cur_entry->next;574 doc->cur_col=doc->cur_entry->min_col;575 DocFormFwd(doc);576 goto ic_done;577 } else {578 doc_ne=DocEntryNewBase(doc,DOCT_TAB|doc->settings_head.dft_text_attr<<8);579 DocInsEntry(doc,doc_ne);580 }581 } else {582 if (Bt(char_bmp_displayable,ch)) {583 if (doc_ce->type_u8==DOCT_DATA) {584 while (TRUE) {585 i=doc_ce->len+doc_ce->min_col;586 if (doc_ce->de_flags & DOCEF_HAS_TERMINATOR)587 i++;588 if (doc_ce->max_col<i) {589 st=doc_ce->tag;590 doc_ce->max_col++;591 for (i=doc_ce->max_col;i>doc->cur_col;i--)592 st[i]=st[i-1];593 st[doc->cur_col++]=ch;594 break;595 } else if (doc_ce->de_flags & DOCEF_REMALLOC_DATA) {596 st=MAlloc(doc_ce->max_col+8,doc->mem_task);597 MemCpy(st,doc_ce->tag,doc_ce->max_col+1);598 Free(doc_ce->tag);599 doc_ce->tag=st;600 doc_ce->len=MSize(st)-doc_ce->min_col-2; //See DataTagWidth601 Free(doc_ce->data);602 doc_ce->data=MAlloc(doc_ce->len+2,doc->mem_task);603 } else604 break;605 }606 } else if (IsEditableText(doc_ce)) {607 dst=st=MAlloc(doc_ce->max_col+2,doc->mem_task);608 src=doc_ce->tag;609 i=doc->cur_col;610 while (i-->0)611 *dst++=*src++;612 *dst++=ch;613 while (*dst++=*src++);614 Free(doc_ce->tag);615 doc_ce->tag=st;616 doc_ce->max_col++;617 doc->cur_col++;618 } else {619 doc_ne=DocEntryNewTag(doc,doc_ce,&ch);620 doc_ne->type=DOCT_TEXT | doc->settings_head.dft_text_attr<<8;621 doc_ne->de_flags=doldoc.dft_de_flags[DOCT_TEXT];622 doc_ne->x=doc_ce->x+1;623 QueIns(doc_ne,doc_ce->last);624 }625 }626 }627ic_done:628 DocRemSoftNewLines(doc,doc->cur_entry);629 if (doc->cur_entry->de_flags & DOCEF_UPDATE_DATA &&630 (doc->cur_entry->type_u8==DOCT_DATA ||631 doc->cur_entry->type_u8==DOCT_CHECK_BOX))632 DocDataScan(doc,doc->cur_entry);633 if (unlock)634 DocUnlock(doc);635}636 637U0 EdLineDel(CDoc *doc)638{639 CDocEntry *doc_ce=doc->cur_entry,*doc_ce2;640 I64 y;641 y=doc->y;642 while (doc_ce!=doc && doc_ce->y==y)643 doc_ce=doc_ce->next;644 doc->cur_entry=doc_ce;645 doc->cur_col=doc_ce->min_col;646 doc_ce=doc_ce->last;647 while (doc_ce!=doc && doc_ce->y==y) {648 doc_ce2=doc_ce->last;649 if (!(doc_ce->de_flags&DOCEF_FILTER_SKIP))650 DocEntryDel(doc,doc_ce);651 doc_ce=doc_ce2;652 }653}654 