Files
TempleOS-Rijn/SparrowOS/Adam/Doc/DocEd.CPP
T
2018-09-08 21:45:28 +02:00

2487 lines
62 KiB
C++

#help_index "Doc/Edit"
public Bool DocLineNumGoTo(CDoc *doc,I64 line_num) //one based
{
Bool result=FALSE,unlock;
if (doc) {
unlock=DocLock(doc);
doc->x=0;
doc->y=line_num-1;
DocRecalc(doc,FALSE,DOC_RECALC_FIND_CURSOR);
if (doc->cur_entry->y==line_num-1)
result=TRUE;
if (!result) DocBottom(doc);
DocCenter(doc);
if (unlock)
DocUnlock(doc);
}
return result;
}
public Bool DocPatternFind(CDoc *doc,I64 start_line_num=MIN_I64,
U8 *pattern,I64 match=1)
{
Bool result=FALSE,unlock;
CDocEntry *doc_e;
U8 *ptr;
I64 i;
if (doc) {
unlock=DocLock(doc);
if (start_line_num==MIN_I64) {
result=TRUE;
doc_e=doc->root.next;
} else {
result=DocLineNumGoTo(doc,start_line_num);
doc_e=doc->cur_entry;
}
if (result) {
if (pattern) {
result=FALSE;
while (doc_e!=doc) {
if (Bt(doc_tag_types,doc_e->type_u8)) {
if (ptr=StrIStr(doc_e->tag,pattern)) { //TODO: handle multientry strings
i=ptr-doc_e->tag;
if (!--match) {
doc->cur_entry=doc_e;
if (i<doc_e->min_col) i=doc_e->min_col;
if (i>doc_e->max_col) i=doc_e->max_col;
doc->cur_data_col=i;
result=TRUE;
break;
}
}
}
doc_e=doc_e->next;
}
} else
result=FALSE;
}
if (!result) DocBottom(doc);
DocCenter(doc);
if (unlock)
DocUnlock(doc);
}
return result;
}
public Bool DocAnchorFind(CDoc *doc,U8 *pattern)
{
Bool result=FALSE,unlock;
CDocEntry *doc_e;
if (doc) {
unlock=DocLock(doc);
doc_e=doc->root.next;
if (pattern)
while (doc_e!=doc) {
if (doc_e->type_u8==DOCT_ANCHOR) {
if (!StrCmp(pattern,doc_e->aux_str)) {
doc->cur_entry=doc_e;
doc->cur_data_col=doc_e->min_col;
result=TRUE;
break;
}
}
doc_e=doc_e->next;
}
if (!result) DocBottom(doc);
DocCenter(doc);
if (unlock)
DocUnlock(doc);
}
return result;
}
public I64 EdCurU8(CDoc *doc)
{
//See $LK,"EdRenumAsm","MN:EdRenumAsm"$ for an example.
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->cur_entry;
I64 result=-1;
if (doc_ce->type_u8==DOCT_TEXT && doc_ce->min_col<=doc->cur_data_col<doc_ce->max_col)
result=doc_ce->tag[doc->cur_data_col];
else if (doc_ce->type_u8==DOCT_TAB)
result=CH_TAB;
else if (doc_ce->type_u8==DOCT_NEW_LINE || doc_ce->type_u8==DOCT_SOFT_NEW_LINE)
result=CH_NEW_LINE;
if (unlock)
DocUnlock(doc);
return result;
}
public U0 EdCursorLeft(CDoc *doc,I64 sc=MIN_I64)
{//You might need a call to $LK,"DocRecalc","MN:DocRecalc"$().
//See $LK,"EdRenumAsm","MN:EdRenumAsm"$ for an example.
U8 *dst;
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->cur_entry,*original_cl=doc_ce,*doc_ne;
I64 cc=doc->cur_data_col,y=doc_ce->y;
if (sc!=MIN_I64) sc=sc.u32[0];
if (sc>=0 && sc&SCF_CTRL) {
while (doc_ce->last!=doc && (doc_ce->last->y==y ||
doc_ce->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP)))
doc_ce=doc_ce->last; //TODO: select? recurse?
cc=doc_ce->min_col;
} else {
if (cc>doc_ce->min_col) {
if (doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
cc<doc_ce->max_col) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=doc_ce->type;
doc_ne->flags1=doc_ce->flags1;
doc_ne->flags2=doc_ce->flags2;
dst=doc_ce->tag+cc;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
doc_ne->x=doc_ce->x;
doc_ne->y=doc_ce->y;
doc_ne->page_line_num=doc_ce->page_line_num;
*dst=0;
doc_ce->max_col=cc;
QueIns(doc_ne,doc_ce);
}
cc--;
if (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
cc>doc_ce->min_col) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=doc_ce->type;
doc_ne->flags1=doc_ce->flags1;
doc_ne->flags2=doc_ce->flags2;
dst=doc_ce->tag+cc;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
doc_ne->x=doc_ce->x;
doc_ne->y=doc_ce->y;
doc_ne->page_line_num=doc_ce->page_line_num;
*dst=0;
doc_ce->max_col=cc;
QueIns(doc_ne,doc_ce);
doc_ce=doc_ne;
cc=doc_ce->min_col;
}
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
} else {
cc=doc_ce->min_col;
while (doc_ce->last!=doc &&
(doc_ce->last->type_u8==DOCT_SOFT_NEW_LINE || doc_ce->last->type_u8==DOCT_INDENT ||
doc_ce->last->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))) {
doc_ce=doc_ce->last;
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
}
if (doc_ce->last!=doc) {
doc_ce=doc_ce->last;
if (doc_ce->max_col>doc_ce->min_col) {
cc=doc_ce->max_col-1;
if (doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
cc>doc_ce->min_col) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=doc_ce->type;
doc_ne->flags1=doc_ce->flags1;
doc_ne->flags2=doc_ce->flags2;
dst=doc_ce->tag+cc;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
doc_ne->x=doc_ce->x;
doc_ne->y=doc_ce->y;
doc_ne->page_line_num=doc_ce->page_line_num;
*dst=0;
doc_ce->max_col=cc;
QueIns(doc_ne,doc_ce);
doc_ce=doc_ne;
cc=doc_ce->min_col;
}
} else
cc=doc_ce->max_col;
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
}
}
}
doc->cur_data_col=cc;
doc->cur_entry=doc_ce;
if (doc_ce!=original_cl)
DocFormBackward(doc);
doc->recalc_start=doc->cur_entry->last;
if (unlock)
DocUnlock(doc);
}
public U0 EdCursorRight(CDoc *doc,I64 sc=MIN_I64)
{//You might need a call to $LK,"DocRecalc","MN:DocRecalc"$().
//See $LK,"EdRenumAsm","MN:EdRenumAsm"$ for an example.
Bool unlock=DocLock(doc);
U8 *dst;
CDocEntry *doc_ce=doc->cur_entry,*original_cl=doc_ce,*doc_ne;
I64 cc=doc->cur_data_col,y=doc_ce->y,old_flags1,old_flags2,old_color;
doc->recalc_start=doc_ce->last;
if (sc!=MIN_I64) sc=sc.u32[0];
if (sc>=0 && sc&SCF_CTRL) {
while (doc_ce!=doc && doc_ce->next->y==y &&
doc_ce->next->type_u8!=DOCT_SOFT_NEW_LINE && doc_ce->next!=doc && (doc_ce->next->type_u8!=DOCT_NEW_LINE || !(doc->flags & DOCF_FORM)) ||
doc_ce->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))
doc_ce=doc_ce->next;
if (doc_ce->max_col>doc_ce->min_col)
cc=doc_ce->max_col-1;
else
cc=doc_ce->min_col;
} else {
if (cc<doc_ce->max_col) {
if (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
cc>doc_ce->min_col) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=doc_ce->type;
doc_ne->flags1=doc_ce->flags1;
doc_ne->flags2=doc_ce->flags2;
doc_ne->x=doc_ce->x;
doc_ne->y=doc_ce->y;
doc_ne->page_line_num=doc_ce->page_line_num;
dst=doc_ce->tag+cc;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
*dst=0;
doc_ce->max_col=cc;
QueIns(doc_ne,doc_ce);
doc_ce=doc_ne;
cc=doc_ce->min_col;
}
cc++;
old_flags1=doc_ce->flags1;
old_flags2=doc_ce->flags2;
old_color=doc_ce->type;
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
if (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
cc<doc_ce->max_col) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=DOCT_TEXT | old_color & -0x100;
doc_ne->flags1=old_flags1;
doc_ne->flags2=old_flags2;
dst=doc_ce->tag+cc;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
doc_ce->max_col=cc;
*dst=0;
doc_ne->x=doc_ce->x;
doc_ne->y=doc_ce->y;
doc_ne->page_line_num=doc_ce->page_line_num;
QueIns(doc_ne,doc_ce);
doc_ce=doc_ne;
cc=doc_ce->min_col;
} else if (cc>=doc_ce->max_col) {
doc_ce=doc_ce->next;
cc=doc_ce->min_col;
}
} else {
if (doc_ce!=doc) {
if (cc<=doc_ce->min_col && sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
doc_ce=doc_ce->next;
while (doc_ce!=doc && doc_ce->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP)) {
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
doc_ce=doc_ce->next;
}
cc=doc_ce->min_col;
if (doc_ce->type_u8==DOCT_SOFT_NEW_LINE) {
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
doc_ce=doc_ce->next;
cc=doc_ce->min_col;
}
}
}
}
doc->cur_data_col=cc;
doc->cur_entry=doc_ce;
if (doc_ce!=original_cl)
DocFormFwd(doc);
if (unlock)
DocUnlock(doc);
}
public U0 EdLineUp(CDoc *doc,I64 sc=MIN_I64)
{//You might need a call to $LK,"DocRecalc","MN:DocRecalc"$().
//See $LK,"EdRenumAsm","MN:EdRenumAsm"$ for an example.
Bool unlock=DocLock(doc);
U8 *dst;
I64 y,x;
CDocEntry *doc_ce=doc->cur_entry,*doc_ne;
if (sc!=MIN_I64) sc=sc.u32[0];
if (doc_ce->type_u8==DOCT_HEX_ED) {
doc->cur_data_col=doc->cur_data_col-doc_ce->hex_ed_width*3;
if (doc->cur_data_col>=0) {
if (unlock)
DocUnlock(doc);
return;
} else
doc->cur_data_col=0;
}
x=doc->x; y=doc->y;
if (doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
if (doc_ce->min_col<doc->cur_data_col<doc_ce->max_col-1) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=doc_ce->type;
doc_ne->flags1=doc_ce->flags1;
doc_ne->flags2=doc_ce->flags2;
dst=doc_ce->tag+doc->cur_data_col;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
doc_ne->y=doc_ce->y;
doc_ne->x=doc_ce->x+doc->cur_data_col;
doc_ne->page_line_num=doc_ce->page_line_num;
*dst=0;
doc_ce->max_col=doc->cur_data_col;
QueIns(doc_ne,doc_ce);
} else
if (doc->cur_data_col==doc_ce->min_col && doc_ce->last!=doc)
doc_ce=doc_ce->last;
} else
if (doc_ce->last!=doc)
doc_ce=doc_ce->last;
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
doc->cur_entry=doc_ce;
DocFormBackward(doc);
doc_ce=doc->cur_entry;
while (doc_ce->last!=doc && (doc_ce->y>=y || doc_ce->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))) {
doc_ce=doc_ce->last;
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
}
y=doc_ce->y;
doc->y=y;
while (doc_ce!=doc && (doc_ce->y>=y && doc_ce->x>=x || doc_ce->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))) {
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
doc_ce=doc_ce->last;
}
if (doc_ce==doc || doc_ce->y<y)
doc_ce=doc_ce->next;
else {
if (doc_ce->type_u8!=DOCT_TEXT||
doc_ce->flags1&DOCEG1_DONT_EDIT ||
doc_ce->flags2&DOCEG2_DONT_EDIT) {
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
} else {
if (doc_ce->next->x==x) {
doc_ce=doc_ce->next;
if (doc->flags & DOCF_FORM) {
while (doc_ce->next->x==x &&
(!Bt(doc_form_types,doc_ce->type_u8) ||
doc_ce->flags1&DOCEF1_SKIP_IN_FORM))
doc_ce=doc_ce->next;
}
}
}
}
if (Bt(doc_tag_types,doc_ce->type_u8)) {
doc->cur_data_col=x-doc_ce->x;
if (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
if (doc->cur_data_col>doc_ce->max_col)
doc->cur_data_col=doc_ce->max_col;
} else {
if (doc->cur_data_col>=doc_ce->max_col)
doc->cur_data_col=doc_ce->max_col-1;
}
if (doc->cur_data_col<doc_ce->min_col)
doc->cur_data_col=doc_ce->min_col;
} else {
if (doc_ce->type_u8==DOCT_HEX_ED) {
doc->cur_data_col=RoundI64((doc_ce->len-1)*3,doc_ce->hex_ed_width*3);
if (doc->cur_data_col<0)
doc->cur_data_col=0;
} else
doc->cur_data_col=doc_ce->min_col;
}
if (doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT) && doc_ce->x<x) {
if (doc->cur_data_col<doc_ce->max_col-1) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=doc_ce->type;
doc_ne->flags1=doc_ce->flags1;
doc_ne->flags2=doc_ce->flags2;
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ne->type=doc_ce->type | DOCET_SELECTED;
else
doc_ne->type=doc_ce->type & ~DOCET_SELECTED;
}
dst=doc_ce->tag+doc->cur_data_col;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
doc_ne->page_line_num=doc_ce->page_line_num;
doc_ne->y=doc_ce->y;
doc_ne->x=doc_ce->x+doc->cur_data_col;
*dst=0;
doc_ce->max_col=doc->cur_data_col;
QueIns(doc_ne,doc_ce);
doc_ce=doc_ne;
doc->cur_data_col=doc_ce->min_col;
}
}
doc->cur_entry=doc_ce;
DocFormFwd(doc);
doc->x=doc->cur_entry->x+doc->cur_data_col;
doc->recalc_start=doc->cur_entry->last;
if (unlock)
DocUnlock(doc);
}
public U0 EdLineDown(CDoc *doc,I64 sc=MIN_I64)
{//You might need a call to $LK,"DocRecalc","MN:DocRecalc"$().
//See $LK,"EdRenumAsm","MN:EdRenumAsm"$ for an example.
Bool unlock=DocLock(doc);
U8 *dst;
I64 y,x,old_flags1=0,old_flags2=0,old_color;
CDocEntry *doc_ce=doc->cur_entry,*doc_ne,*doc_ce2;
if (sc!=MIN_I64) sc=sc.u32[0];
if (doc_ce->type_u8==DOCT_HEX_ED) {
doc->cur_data_col=doc->cur_data_col+doc_ce->hex_ed_width*3;
if (doc->cur_data_col>=doc_ce->len*3) {
doc->cur_entry=doc_ce=doc_ce->next;
doc->cur_data_col=doc_ce->min_col;
doc->x=doc_ce->x+doc->cur_data_col;
doc->y=doc_ce->y;
}
if (unlock)
DocUnlock(doc);
return;
}
doc->recalc_start=doc_ce->last;
x=doc->x; y=doc->y;
if (doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->flags1&DOCEG1_DONT_EDIT)&&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
if (doc->cur_data_col>doc_ce->min_col && doc->cur_data_col<doc_ce->max_col-1) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=doc_ce->type;
doc_ne->flags1=doc_ce->flags1;
doc_ne->flags2=doc_ce->flags2;
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ne->type=doc_ce->type | DOCET_SELECTED;
else
doc_ne->type=doc_ce->type & ~DOCET_SELECTED;
}
dst=doc_ce->tag+doc->cur_data_col;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
doc_ne->page_line_num=doc_ce->page_line_num;
doc_ne->y=doc_ce->y;
doc_ne->x=doc_ce->x+doc->cur_data_col;
*dst=0;
doc_ce->max_col=doc->cur_data_col;
QueIns(doc_ne,doc_ce);
doc_ce=doc_ne;
doc->cur_data_col=doc_ce->min_col;
}
}
doc_ce2=doc_ce;
while (doc_ce!=doc && (doc_ce->y<=y || doc_ce->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP)))
doc_ce=doc_ce->next;
y=doc_ce->y;
doc->y=y;
while (doc_ce!=doc && (doc_ce->y<=y && doc_ce->x<=x || doc_ce->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))) {
old_flags1=doc_ce->flags1;
old_flags2=doc_ce->flags2;
old_color=doc_ce->type;
doc_ce=doc_ce->next;
}
if (doc_ce->last!=doc && (doc_ce->x>x || doc_ce->y>y)) {
doc_ce=doc_ce->last;
doc->cur_entry=doc_ce;
if (!((doc_ce->type_u8==DOCT_NEW_LINE || doc_ce->type_u8==DOCT_SOFT_NEW_LINE || doc_ce->type_u8==DOCT_INDENT) &&
(doc_ce->last->type_u8==DOCT_NEW_LINE || doc_ce->last->type_u8==DOCT_SOFT_NEW_LINE || doc_ce->last->type_u8==DOCT_INDENT)))
DocFormBackward(doc);
doc_ce=doc->cur_entry;
}
while (doc_ce2!=doc && (doc_ce2!=doc_ce || doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT))) {
if (doc_ce2->y<y || doc_ce2->x<x || doc_ce2->flags1 & (DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP) ||
doc_ce2->x==x && !doc_ce2->max_col &&
Bt(doc_nontag_invisible_types,doc_ce2->type_u8)) {
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce2->type|=DOCET_SELECTED;
else
doc_ce2->type&=~DOCET_SELECTED;
}
}
if (doc_ce2==doc_ce) break;
doc_ce2=doc_ce2->next;
}
if (Bt(doc_tag_types,doc_ce->type_u8)) {
doc->cur_data_col=x-doc_ce->x;
if (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
if (doc->cur_data_col>doc_ce->max_col)
doc->cur_data_col=doc_ce->max_col;
} else {
if (doc->cur_data_col>=doc_ce->max_col)
doc->cur_data_col=doc_ce->max_col-1;
}
if (doc->cur_data_col<doc_ce->min_col)
doc->cur_data_col=doc_ce->min_col;
} else
doc->cur_data_col=doc_ce->min_col;
if (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
if (doc_ce->min_col<doc->cur_data_col<doc_ce->max_col-1) {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=DOCT_TEXT | old_color & -0x100;
doc_ne->flags1=old_flags1;
doc_ne->flags2=old_flags2;
dst=doc_ce->tag+doc->cur_data_col;
doc_ne->tag=StrNew(dst,doc->mem_task);
doc_ne->max_col=StrLen(dst);
*dst=0;
doc_ce->max_col=doc->cur_data_col;
doc_ne->y=doc_ce->y;
doc_ne->page_line_num=doc_ce->page_line_num;
doc_ne->x=doc_ce->x+doc->cur_data_col;
QueIns(doc_ne,doc_ce);
doc_ce=doc_ne;
doc->cur_data_col=doc_ce->min_col;
}
}
doc->cur_entry=doc_ce;
DocFormFwd(doc);
if (!(doc->flags & DOCF_FORM))
while (doc_ce!=doc && doc_ce!=doc->cur_entry) {
if (sc>=0) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
}
doc_ce=doc_ce->next;
}
doc->x=doc->cur_entry->x+doc->cur_data_col;
if (unlock)
DocUnlock(doc);
}
U0 EdDelChar(CDoc *doc)
{
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->cur_entry;
if (doc_ce==doc) {
if (unlock)
DocUnlock(doc);
return;
} else
doc->recalc_start=doc_ce->last;
if (doc_ce->max_col!=0 && (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)|| doc_ce->type_u8==DOCT_DATA)) {
if (doc_ce->type_u8==DOCT_DATA) {
if (doc_ce->flags1 & DOCEF1_HAS_TERMINATOR && doc->cur_data_col==doc_ce->max_col-1) {
if (unlock)
DocUnlock(doc);
return;
}
}
if (doc->cur_data_col<doc_ce->max_col)
StrCpy(doc_ce->tag+doc->cur_data_col,doc_ce->tag+doc->cur_data_col+1);
if (doc->cur_data_col>=doc_ce->max_col-1) {
doc->cur_entry=doc_ce->next;
doc->cur_data_col=doc->cur_entry->min_col;
}
DocRemSoftNewLines(doc,doc->cur_entry);
if (unlock)
DocUnlock(doc);
return;
}
doc->cur_entry=doc_ce->next;
doc->cur_data_col=doc->cur_entry->min_col;
if (!(doc_ce->flags1&DOCEF1_FILTER_SKIP))
DocEntryDel(doc,doc_ce);
DocRemSoftNewLines(doc,doc->cur_entry);
if (unlock)
DocUnlock(doc);
}
U0 ChkDollarBufSize(CDoc *doc)
{
U8 *b;
if (doc->dollar_buf_ptr>=doc->dollar_buf_size-2) {
doc->dollar_buf_size<<=1;
b=MAlloc(doc->dollar_buf_size,doc->mem_task);
MemCpy(b,doc->dollar_buf,doc->dollar_buf_ptr);
Free(doc->dollar_buf);
doc->dollar_buf=b;
}
}
U0 EdInsChar(I64 ch,I64 sc,CDoc *doc)
{
Bool unlock=DocLock(doc);
U8 *b,*src,*dst;
CDocEntry *doc_ce=doc->cur_entry,*doc_ne;
I64 i,j,m,y=doc_ce->y;
doc->recalc_start=doc_ce->last;
while (doc->recalc_start!=doc && doc->recalc_start->flags1&(DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))
doc->recalc_start=doc->recalc_start->last;
if (doc->flags & DOCF_IN_DOLLAR) {
if (!Bt(getkey_chars_bitmap,ch))
goto ic_done;
ChkDollarBufSize(doc);
doc->dollar_buf[doc->dollar_buf_ptr++]=ch;
if (ch=='$$') {
if (doc->dollar_buf_ptr==2) {
doc->flags&=~DOCF_IN_DOLLAR;
doc->dollar_buf_ptr=0;
goto ic_cont;
} else {
doc->dollar_buf[doc->dollar_buf_ptr]=0;
DocPutS(doc,doc->dollar_buf);
doc->flags&=~DOCF_IN_DOLLAR;
doc->dollar_buf_ptr=0;
goto ic_done;
}
} else
goto ic_done;
}
if (ch=='$$') {
if (!(doc->flags & (DOCF_PLAIN_TEXT | DOCF_PLAIN_TEXT_WITH_TABS))) {
doc->flags|=DOCF_IN_DOLLAR;
doc->dollar_buf_ptr=0;
doc->dollar_buf[doc->dollar_buf_ptr++]=ch;
goto ic_done;
}
}
if (ch==CH_CARRIAGE_RETURN) goto ic_done;
ic_cont:
if ((ch==CH_SPACE || ch==CH_NEW_LINE) &&
!(sc & (SCF_CTRL|SCF_SHIFT)) &&
doc_ce->flags1 & (DOCEF1_LINK|DOCEF1_TREE|DOCEF1_CHECK_COLLAPSABLE|
DOCEF1_LEFT_MACRO|DOCEF1_LEFT_EXP|DOCEF1_LEFT_CB|DOCEF1_LEFT_AUTO |
DOCEF1_RIGHT_MACRO|DOCEF1_RIGHT_EXP|DOCEF1_RIGHT_CB|DOCEF1_RIGHT_AUTO)) {
doc->cmd_U8=ch;
DocEntryRun(doc,doc_ce,FALSE);
DocLock(doc);
goto ic_done;
}
if (doc_ce->type_u8==DOCT_HEX_ED) {
if (doc_ce->flags1 & DOCEF1_DATA_IS_PTR)
b=doc_ce->data;
else
b=&doc_ce->data;
i=doc->cur_data_col;
j=i%(doc_ce->hex_ed_width*3);
m=i/(doc_ce->hex_ed_width*3)*doc_ce->hex_ed_width;
if (j>=doc_ce->hex_ed_width<<1)
b[j-doc_ce->hex_ed_width<<1+m]=ch;
else {
ch=ToUpper(ch)-'0';
if (ch>9) {
ch+='0'-'A'+10;
if (!(10<=ch<=15))
goto ic_done;
}
m=j>>1+m;
if (j & 1)
b[m]=b[m] & 0xF0| ch;
else
b[m]=b[m] & 0xF | ch<<4;
}
doc->cur_data_col++;
goto ic_done;
}
if (doc->flags & DOCF_OVERSTRIKE) {
if (Bt(displayable_chars_bitmap,ch)) {
ic_overstrike_char:
if (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
if (doc->cur_data_col<doc_ce->max_col) {
if (doc_ce->tag[doc->cur_data_col]) {
doc_ce->tag[doc->cur_data_col++]=ch;
goto ic_done;
}
} else {
doc_ce=doc_ce->next;
doc->cur_entry=doc_ce;
doc->cur_data_col=doc_ce->min_col;
goto ic_overstrike_char;
}
} else if (doc_ce->type_u8==DOCT_DATA) {
if (doc_ce->flags1 & DOCEF1_HAS_TERMINATOR) {
if (doc_ce->tag[doc->cur_data_col] &&
doc->cur_data_col<doc_ce->min_col+doc_ce->len) {
doc_ce->tag[doc->cur_data_col++]=ch;
if ( ! doc_ce->tag[doc->cur_data_col]) {
doc_ce->tag[doc->cur_data_col]='_';
doc_ce->tag[doc->cur_data_col+1]=0;
}
}
} else {
if (doc_ce->tag[doc->cur_data_col])
doc_ce->tag[doc->cur_data_col++]=ch;
}
goto ic_done;
}
b=MAlloc(2,doc->mem_task);
*b=ch;
b[1]=0;
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
doc_ne->tag=b;
doc_ne->max_col=1;
doc_ne->x=doc_ce->x;
doc_ne->y=doc_ce->y;
doc_ne->page_line_num=doc_ce->page_line_num;
QueIns(doc_ne,doc_ce->last);
} else if (ch==CH_NEW_LINE) {
while (doc->cur_entry->next!=doc && doc->cur_entry->y==y)
doc->cur_entry=doc->cur_entry->next;
doc->cur_data_col=doc->cur_entry->min_col;
} else if (ch==CH_TAB) {
if (doc->flags&DOCF_FORM)
goto ic_form_tab;
}
goto ic_done;
}
if (ch==CH_NEW_LINE) {
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
if (sc&SCF_CTRL && !(sc&SCF_SHIFT))
doc_ne->type=DOCT_PAGE_BREAK | doc->settings_root.dft_text_attr << 8;
else
doc_ne->type=DOCT_NEW_LINE | doc->settings_root.dft_text_attr << 8;
DocIns(doc,doc_ne);
} else if (ch==CH_TAB) {
if (doc->flags&DOCF_FORM &&
Bt(doc_form_types,doc->cur_entry->type_u8) &&
!(doc->cur_entry->flags1&DOCEF1_SKIP_IN_FORM)) {
ic_form_tab:
doc->cur_entry=doc->cur_entry->next;
doc->cur_data_col=doc->cur_entry->min_col;
DocFormFwd(doc);
goto ic_done;
} else {
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_ne->type=DOCT_TAB | doc->settings_root.dft_text_attr << 8;
DocIns(doc,doc_ne);
}
} else {
if (Bt(displayable_chars_bitmap,ch)) {
if (doc_ce->type_u8==DOCT_DATA) {
i=doc_ce->len+doc_ce->min_col;
if (doc_ce->flags1 & DOCEF1_HAS_TERMINATOR)
i++;
if (i>doc_ce->max_col) {
b=doc_ce->tag;
doc_ce->max_col++;
for (i=doc_ce->max_col;i>doc->cur_data_col;i--)
b[i]=b[i-1];
b[doc->cur_data_col++]=ch;
}
} else if (doc_ce->type_u8==DOCT_TEXT&&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
dst=b=MAlloc(doc_ce->max_col+2,doc->mem_task);
src=doc_ce->tag;
i=doc->cur_data_col;
while (i-->0)
*dst++=*src++;
*dst++=ch;
while (*dst++=*src++);
Free(doc_ce->tag);
doc_ce->tag=b;
doc_ce->max_col++;
doc->cur_data_col++;
} else {
b=MAlloc(2,doc->mem_task);
*b=ch;
b[1]=0;
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
doc_ne->tag=b;
doc_ne->max_col=1;
doc_ne->x=doc_ce->x+1;
doc_ne->y=doc_ce->y;
doc_ne->page_line_num=doc_ce->page_line_num;
QueIns(doc_ne,doc_ce->last);
}
}
}
ic_done:
DocRemSoftNewLines(doc,doc->cur_entry);
if (doc->cur_entry->flags1 & DOCEF1_UPDATE_DATA) {
if (doc->cur_entry->type_u8==DOCT_DATA || doc->cur_entry->type_u8==DOCT_CHECK_BOX)
DocDataGet(doc->cur_entry);
}
if (unlock)
DocUnlock(doc);
}
U0 EdDelLine(CDoc *doc)
{
CDocEntry *doc_ce=doc->cur_entry,*doc_ce2;
I64 y;
y=doc->y;
while (doc_ce!=doc && doc_ce->y==y)
doc_ce=doc_ce->next;
doc->cur_entry=doc_ce;
doc->cur_data_col=doc_ce->min_col;
doc_ce=doc_ce->last;
while (doc_ce!=doc && doc_ce->y==y) {
doc_ce2=doc_ce->last;
if (!(doc_ce->flags1&DOCEF1_FILTER_SKIP))
DocEntryDel(doc,doc_ce);
doc_ce=doc_ce2;
}
if (doc_ce==doc)
doc->recalc_start=doc_ce;
else
doc->recalc_start=doc_ce->last;
}
public U0 EdFindNext(CDoc *doc)
{
Bool unlock=DocLock(doc);
U8 *ptr,*ptr2,*ptr3;
CDocEntry *doc_ce=doc->cur_entry,*doc_e=doc_ce;
I64 ss_flags;
if (doc->find_replace->match_case)
ss_flags=0;
else
ss_flags=SRF_IGNORE_CASE;
if (doc->find_replace->whole_labels)
ss_flags|=SRG_WHOLE_LABELS;
do {
if (doc_e!=doc) {
if (Bt(doc_tag_types,doc_e->type_u8)&&
!(doc_e->flags1&(DOCEG1_DONT_EDIT|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP)) &&
!(doc_e->flags2&DOCEG2_DONT_EDIT)) {
if (doc_e->type & DOCET_SELECTED || !doc->find_replace->scan_selected_text) {
if (doc->find_replace->scan_fwd) {
if (doc_e==doc_ce) {
ptr=doc_ce->tag+doc->cur_data_col+1;
if (ptr-doc_ce->tag>=doc_ce->max_col)
goto fn_skip;
if (ptr-doc_ce->tag<doc_ce->min_col)
ptr=doc_ce->tag+doc_ce->min_col;
} else
ptr=doc_e->tag;
if (ptr=SearchStr(ptr,doc->find_replace->find_text,ss_flags)) {
doc->cur_entry=doc_e;
doc->cur_data_col=ptr-doc_e->tag;
if (doc->cur_data_col>=doc_e->max_col)
doc->cur_data_col=doc_e->max_col-1;
if (doc->cur_data_col<doc_e->min_col)
doc->cur_data_col=doc_e->min_col;
DocCenter(doc);
if (unlock)
DocUnlock(doc);
return;
}
} else {
ptr2=NULL;
ptr=doc_e->tag+doc_e->min_col;
if (doc_e==doc_ce)
ptr3=doc_ce->tag+doc->cur_data_col;
else
ptr3=doc_e->tag+doc_e->max_col;
while (ptr=SearchStr(ptr,doc->find_replace->find_text,ss_flags)) {
if (ptr>=ptr3)
break;
ptr2=ptr++;
}
if (ptr2 && ptr2<ptr3) {
doc->cur_entry=doc_e;
doc->cur_data_col=ptr2-doc_e->tag;
if (doc->cur_data_col>=doc_e->max_col)
doc->cur_data_col=doc_e->max_col-1;
if (doc->cur_data_col<doc_e->min_col)
doc->cur_data_col=doc_e->min_col;
DocCenter(doc);
if (unlock)
DocUnlock(doc);
return;
}
}
}
}
}
fn_skip:
doc_e= doc->find_replace->scan_fwd ? doc_e->next:doc_e->last;
} while (doc_e!=doc_ce);
if (unlock)
DocUnlock(doc);
}
public U0 EdSelectAll(CDoc *doc,Bool select)
{
Bool unlock=DocLock(doc);
CDocEntry *doc_e=doc->root.next;
while (doc_e!=doc) {
if (select)
doc_e->type|=DOCET_SELECTED;
else
doc_e->type&=~DOCET_SELECTED;
doc_e=doc_e->next;
}
if (unlock)
DocUnlock(doc);
}
#help_index "Doc/IDE"
public Bool EdFindPaired(CDoc *doc,U8 plus,U8 minus,Bool fwd,Bool abort_on_dbl_colon=FALSE)
{
Bool unlock=DocLock(doc),result=FALSE;
U8 ch,*ptr,original_col=doc->cur_data_col;
I64 levels=0,colons=0;
CDocEntry *doc_ce=doc->cur_entry,*doc_e=doc_ce,*original_cl=doc_ce;
if (abort_on_dbl_colon && EdCurU8(doc)==':')
colons=1;
else
colons=0;
do {
if (doc_e!=doc) {
if (Bt(doc_tag_types,doc_e->type_u8)&&!(doc_e->flags1&(DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))) {
if (fwd) {
if (doc_e==doc_ce)
ptr=doc_e->tag+doc->cur_data_col+1;
else
ptr=doc_e->tag;
if (ptr-doc_e->tag<doc_e->min_col)
ptr=doc_e->tag+doc_e->min_col;
if (ptr-doc_e->tag>=doc_e->max_col)
goto pa_skip;
while (ch=*ptr++)
if (abort_on_dbl_colon && ch==':') {
if (++colons==2) {
doc->cur_entry=doc_e;
doc->cur_data_col=ptr-doc_e->tag-1;
EdCursorLeft(doc);
result=FALSE;
goto pa_done;
}
} else {
colons=0;
if (ch==plus)
levels++;
else if (ch==minus) {
if (!levels--) {
doc->cur_entry=doc_e;
doc->cur_data_col=ptr-doc_e->tag-1;
result=doc->cur_entry!=original_cl || doc->cur_data_col!=original_col;
goto pa_done;
}
}
}
} else {
if (doc_e==doc_ce) {
ptr=doc_e->tag+doc->cur_data_col-1;
if (ptr-doc_e->tag>=doc_e->max_col)
ptr=doc_e->tag+doc_e->max_col-1;
} else
ptr=doc_e->tag+doc_e->max_col-1;
if (ptr-doc_e->tag<doc_e->min_col)
goto pa_skip;
while (ptr>=doc_e->tag+doc_e->min_col) {
ch=*ptr--;
if (abort_on_dbl_colon && ch==':') {
if (++colons==2) {
doc->cur_entry=doc_e;
doc->cur_data_col=ptr-doc_e->tag+1;
result=FALSE;
goto pa_done;
}
} else {
colons=0;
if (ch==plus)
levels++;
else if (ch==minus) {
if (!levels--) {
doc->cur_entry=doc_e;
doc->cur_data_col=ptr-doc_e->tag+1;
result=doc->cur_entry!=original_cl || doc->cur_data_col!=original_col;
goto pa_done;
}
}
}
}
}
}
}
pa_skip:
if (fwd)
doc_e=doc_e->next;
else
doc_e=doc_e->last;
} while (doc_e!=doc_ce);
pa_done:
DocRecalc(doc);
DocCenter(doc);
if (unlock)
DocUnlock(doc);
return result;
}
public Bool EdGoToFun(CDoc *doc,Bool fwd,Bool abort_on_dbl_colon)
{
Bool unlock=DocLock(doc),result=FALSE;
I64 ch,levels,colons;
if (fwd) {
levels=0;
colons=0;
while (doc->cur_entry!=doc) {
ch=EdCurU8(doc);
if (abort_on_dbl_colon && ch==':') {
if (++colons==2) {
EdCursorLeft(doc);
break;
}
} else {
colons=0;
if (ch=='{')
levels++;
else if (ch=='}' && !levels--)
break;
}
EdCursorRight(doc);
}
DocRecalc(doc);
if (doc->cur_entry!=doc)
result=TRUE;
} else {
while (EdFindPaired(doc,'}','{',FALSE,abort_on_dbl_colon));
if (doc->cur_entry!=doc) {
ch=EdCurU8(doc);
if (abort_on_dbl_colon && ch==':')
result=TRUE;
else {
if (ch=='{')
result=TRUE;
}
}
}
if (unlock)
DocUnlock(doc);
return result;
}
public U0 EdSelectFun(CDoc *doc,Bool abort_on_dbl_colon=FALSE)
{
Bool unlock=DocLock(doc);
U8 ch,*ptr;
I64 levels=0,colons=0;
CDocEntry *doc_e;
EdSelectAll(doc,FALSE);
EdGoToFun(doc,FALSE,abort_on_dbl_colon);
if (EdCurU8(doc)=='{')
levels--;
else if (abort_on_dbl_colon && EdCurU8(doc)==':') {
EdCursorRight(doc);
if (EdCurU8(doc)==':')
EdCursorRight(doc);
}
doc_e=doc->cur_entry;
while (doc_e!=doc) {
doc_e->type|=DOCET_SELECTED;
if (doc_e->type_u8==DOCT_TEXT) {
ptr=doc_e->tag;
if (doc_e==doc->cur_entry)
ptr+=doc->cur_data_col;
while (ch=*ptr++)
if (abort_on_dbl_colon && ch==':') {
if (++colons==2)
goto sf_done;
} else {
colons=0;
if (ch=='{')
levels++;
else if (ch=='}' && !levels--)
goto sf_done;
}
}
doc_e=doc_e->next;
}
sf_done:
DocRecalc(doc);
if (unlock)
DocUnlock(doc);
}
#help_index "Doc/Edit"
U0 EdUndoFilter(CDoc *doc)
{
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->root.next;
while (doc_ce!=doc) {
doc_ce->flags1&=~DOCEF1_FILTER_SKIP;
doc_ce=doc_ce->next;
}
doc->find_replace->filter_lines=0;
if (unlock)
DocUnlock(doc);
}
I64 EdFindReplace(CDoc *doc)
{
Bool first=TRUE,found,unlock;
I64 cmd,i,j,plen,rlen,dlen,result=-1,ss_flags;
U8 *src,*dst,*dst2;
CDocEntry *doc_ce=doc->cur_entry,*doc_e;
if (doc->find_replace->pmt)
cmd=RSAC_REPLACE;
else
cmd=RSAC_ALL;
if (!doc->find_replace->pmt || DocFormDo(doc->find_replace,"CEdFindText")) {
result=0;
unlock=DocLock(doc);
if (doc->find_replace->match_case || doc->find_replace->local_var)
ss_flags=0;
else
ss_flags=SRF_IGNORE_CASE;
if (doc->find_replace->whole_labels || doc->find_replace->local_var)
ss_flags|=SRG_WHOLE_LABELS;
if (i=doc->find_replace->filter_lines) {
doc_ce=doc->root.next;
while (doc_ce!=doc) {
if (doc_ce->type_u8==DOCT_TEXT && !(doc_ce->flags1&(DOCEF1_TAG_CB|DOCEF1_DEFINE|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))&&
SearchStr(doc_ce->tag,doc->find_replace->find_text,ss_flags)) {
doc_ce->type|=DOCET_SELECTED;
result++;
} else
doc_ce->type&=~DOCET_SELECTED;
doc_ce=doc_ce->next;
}
doc_ce=doc->root.next;
while (doc_ce!=doc) {
if (!(doc_ce->flags1&(DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))) {
found=FALSE;
doc_e=doc_ce;
while (doc_e!=doc && doc_e->y>doc_ce->y-i) {
if (doc_e->type&DOCET_SELECTED) {
found=TRUE;
break;
} else
doc_e=doc_e->last;
}
if (!found) {
doc_e=doc_ce;
while (doc_e!=doc && doc_e->y<doc_ce->y+i) {
if (doc_e->type&DOCET_SELECTED) {
found=TRUE;
break;
} else
doc_e=doc_e->next;
}
}
if (!found)
doc_ce->flags1|=DOCEF1_FILTER_SKIP;
}
doc_ce=doc_ce->next;
}
EdSelectAll(doc,FALSE);
goto fr_unlock_done;
}
if (doc->find_replace->local_var) {
EdSelectFun(doc);
doc_ce=doc->cur_entry;
}
if (!doc->find_replace->replace && !doc->find_replace->local_var) {
EdFindNext(doc);
goto fr_unlock_done;
}
plen=StrLen(doc->find_replace->find_text);
if (!plen)
goto fr_unlock_done;
rlen=StrLen(doc->find_replace->replace_text);
doc_e=doc_ce;
while (doc_e!=doc_ce || first) {
first=FALSE;
if (doc_e->type_u8==DOCT_TEXT &&
!(doc_e->flags1&(DOCEG1_DONT_EDIT|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP)) &&
!(doc_e->flags2&DOCEG2_DONT_EDIT) &&
(doc_e->type & DOCET_SELECTED || !doc->find_replace->scan_selected_text&&!doc->find_replace->local_var)) {
src=doc_e->tag;
while (src) {
src=SearchStr(src,doc->find_replace->find_text,ss_flags);
if (src) {
doc->cur_data_col=src-doc_e->tag;
doc->cur_entry=doc_e;
if (cmd!=RSAC_ALL)
DocCenter(doc);
doc_e=doc->cur_entry;
src=doc->cur_data_col+doc_e->tag;
if (cmd!=RSAC_ALL) {
DocUnlock(doc);
cmd=PopUpReplaceSkipAllCancel("");
DocLock(doc);
if (cmd<0)
goto fr_unlock_done;
}
if (cmd==RSAC_REPLACE || cmd==RSAC_ALL) {
dlen=StrLen(doc_e->tag);
doc_e->max_col=dlen+rlen-plen;
dst=MAlloc(doc_e->max_col+1,doc->mem_task);
dst2=dst;
j=src-doc_e->tag;
for (i=0;i<j;i++)
*dst++=doc_e->tag[i];
for (i=0;i<rlen;i++)
*dst++=doc->find_replace->replace_text[i];
src=dst;
for (i=j+plen;i<=dlen;i++)
*dst++=doc_e->tag[i];
Free(doc_e->tag);
doc_e->tag=dst2;
doc->cur_data_col=src-doc_e->tag;
doc->cur_entry=doc_e;
if (cmd!=RSAC_ALL) {
DocRemSoftNewLines(doc,doc->cur_entry);
DocRecalc(doc);
}
doc_e=doc->cur_entry;
src=doc->cur_data_col+doc_e->tag;
result++;
} else
src++;
}
}
}
if (doc->find_replace->scan_fwd) {
doc_e=doc_e->next;
if (doc_e==doc) {
if (doc_ce==doc) break;
doc_e=doc_e->next;
}
} else {
doc_e=doc_e->last;
if (doc_e==doc) {
if (doc_ce==doc) break;
doc_e=doc_e->last;
}
}
}
fr_unlock_done:
DocRemSoftNewLines(doc,NULL);
DocRecalc(doc);
DocCenter(doc);
if (unlock)
DocUnlock(doc);
}
return result;
}
public I64 EdReplace(CDoc *doc,U8 *find,U8 *replace,
Bool selected=TRUE,Bool match_case=TRUE,Bool whole_labels=FALSE)
{
CEdFindText old_find_replace;
Bool unlock;
I64 i,result=-1;
if (!doc) return -1;
unlock=DocLock(doc);
MemCpy(&old_find_replace,doc->find_replace,sizeof(CEdFindText));
MemSet(doc->find_replace,0,sizeof(CEdFindText));
i=StrLen(find);
if (i<sizeof(CEdFindText.find_text)) {
MemCpy(doc->find_replace->find_text,find,i+1);
i=StrLen(replace);
if (i<sizeof(CEdFindText.replace_text)) {
MemCpy(doc->find_replace->replace_text,replace,i+1);
doc->find_replace->replace=TRUE;
doc->find_replace->scan_selected_text=selected;
doc->find_replace->match_case=match_case;
doc->find_replace->whole_labels=whole_labels;
doc->find_replace->pmt=FALSE;
result=EdFindReplace(doc);
}
}
MemCpy(doc->find_replace,&old_find_replace,sizeof(CEdFindText));
if (unlock)
DocUnlock(doc);
return result;
}
class CEdLineGoTo
{
I64 line fmtstr "$$DA,256,\"Go to Line:%d\"$$";
};
public U0 EdGoToLine(CDoc *doc)
{
CEdLineGoTo gtl;
gtl.line=1;
if (DocFormDo(&gtl,"CEdLineGoTo"))
DocLineNumGoTo(doc,gtl.line);
}
U0 DocEntryToggle(CDoc *doc)
{
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->cur_entry,*cl1,*doc_ce2;
U8 ch,*st,*st2;
I64 i,j,k;
if (doc_ce!=doc && !(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS))) {
if (doc_ce->type_u8==DOCT_TEXT && !(doc_ce->flags1 & ~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER|DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP))) {
doc_ce2=doc_ce->last;
for (k=0;k<20;k++) {
if (doc_ce2!=doc) {
cl1=doc_ce2->last;
if (doc_ce2->type_u8==DOCT_TEXT && doc_ce->flags1==doc_ce2->flags1 && doc_ce->flags2==doc_ce2->flags2 && doc_ce->type==doc_ce2->type) {
i=StrLen(doc_ce2->tag);
j=StrLen(doc_ce->tag);
st=MAlloc(i+j+1,doc->mem_task);
MemCpy(st,doc_ce2->tag,i);
MemCpy(st+i,doc_ce->tag,j+1);
Free(doc_ce->tag);
doc_ce->tag=st;
doc_ce->max_col=i+j;
doc->cur_data_col+=i;
DocEntryDel(doc,doc_ce2);
} else if (doc_ce2->type_u8==DOCT_SOFT_NEW_LINE)
DocEntryDel(doc,doc_ce2);
else
break;
doc_ce2=cl1;
} else
break;
}
doc_ce2=doc_ce->next;
for (k=0;k<20;k++) {
if (doc_ce2!=doc) {
cl1=doc_ce2->next;
if (doc_ce2->type_u8==DOCT_TEXT && doc_ce->flags1==doc_ce2->flags1 && doc_ce->flags2==doc_ce2->flags2 && doc_ce->type==doc_ce2->type) {
i=StrLen(doc_ce->tag);
j=StrLen(doc_ce2->tag);
st=MAlloc(i+j+1,doc->mem_task);
MemCpy(st,doc_ce->tag,i);
MemCpy(st+i,doc_ce2->tag,j+1);
Free(doc_ce->tag);
doc_ce->tag=st;
doc_ce->max_col=i+j;
DocEntryDel(doc,doc_ce2);
} else if (doc_ce2->type_u8==DOCT_SOFT_NEW_LINE)
DocEntryDel(doc,doc_ce2);
else
break;
doc_ce2=cl1;
} else
break;
}
i=doc->cur_data_col;
while (i>doc_ce->min_col && doc_ce->tag[i]!='$$')
i--;
j=doc->cur_data_col+1;
while (j<doc_ce->max_col && doc_ce->tag[j]!='$$')
j++;
if (i<j-1 && doc_ce->min_col<=i<j<doc_ce->max_col && doc_ce->tag[i]=='$$' && doc_ce->tag[j]=='$$') {
ch=doc_ce->tag[j+1];
doc_ce->tag[j+1]=0;
st=StrNew(doc_ce->tag+i);
doc_ce->tag[j+1]=ch;
StrCpy(doc_ce->tag+i,doc_ce->tag+j+1);
doc->cur_data_col=i;
st2=MSPrintF("%q",st);
if (doc_ce=DocPutS(doc,st2)) {
doc->cur_entry=doc_ce;
doc->cur_data_col=doc_ce->min_col;
}
Free(st);
Free(st2);
}
} else {
st=Doc2PlainText(doc,doc_ce);
DocEntryDel(doc,doc_ce);
DocPrintF(doc,"$$$$%Q$$$$",st);
}
DocRecalc(doc);
}
if (unlock)
DocUnlock(doc);
}
U0 DocFlagsToggle(CDoc *doc,I64 tog_flags)
{
Bool unlock=DocLock(doc);
I64 size,start_text_attr=doc->start_text_attr,
flags=doc->flags^tog_flags;
U8 *st=DocSave(doc,&size);
CDocUndo *u_next,*u_last;
u_next=doc->undo_root.next;
u_last=doc->undo_root.last;
doc->undo_root.next=doc->undo_root.last=&doc->undo_root;
DocRst(doc,TRUE);
doc->start_text_attr=start_text_attr;
doc->undo_root.next=u_next;
doc->undo_root.last=u_last;
DocUndoCntSet(doc);
doc->flags=flags & ~(DOCG_BL_IV_UL|DOCF_WORD_WRAP);
DocLoad(doc,st,size);
DocCenter(doc);
if (unlock)
DocUnlock(doc);
Free(st);
}
#help_index "Doc/Output"
public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc)
{
I64 i,x,y,sc2,ext_ascii_cnt=0,timeout;
CDoc *m;
CDocEntry *doc_ce;
U8 *st;
Bool unlock;
if (!doc || doc->doc_signature!=DOC_SIGNATURE_VAL)
return;
if (doc->user_put_key)
if ((*doc->user_put_key)(doc,doc->user_put_data,ch,sc))
return;
unlock=DocLock(doc);
if (!Bt(doc_clean_scancodes,sc.u8[0]))
doc->flags|=DOCF_UNDO_DIRTY;
DocCaptureUndo(doc);
if (Bt(getkey_chars_bitmap,ch) &&
!(sc&(SCF_CTRL|SCF_ALT))) {
if (sc&SCF_KEY_DESC) {
st=A2KeyName(ch,FALSE);
SetKeyDesc("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)
SetKeyDesc("Edit/Save As");
else
DocWrite(doc,TRUE);
break;
case CH_CTRLB:
if (sc&SCF_KEY_DESC)
SetKeyDesc("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)
SetKeyDesc("Edit/Copy to Clipboard");
else
EdCopyToClipboard(doc);
break;
case CH_CTRLD:
if (sc&SCF_KEY_DESC)
SetKeyDesc("Cmd/Jump to File Manager");
else {
DocUnlock(doc);
FileMgr;
DocLock(doc);
}
break;
case CH_CTRLF:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
SetKeyDesc("Cmd/Grep Wizard");
else
GrepWiz;
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("Edit/Find & Replace");
else
EdFindReplace(doc);
}
break;
case CH_CTRLG:
if (sc&SCF_KEY_DESC)
SetKeyDesc("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)
SetKeyDesc("Edit/Undo");
else
DocUndoRestore(doc);
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("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_USER_FOREGROUND) {
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)
SetKeyDesc("Dollar/Indent Out");
else
DocPutS(doc,"$$ID,-2$$");
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("Dollar/Indent In");
else
DocPutS(doc,"$$ID,2$$");
}
break;
case CH_NEW_LINE:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Char/Return");
else
SetKeyDesc("Char/Page Break");
} else
EdInsChar(ch,sc,doc);
break;
case CH_CTRLK:
if (sc&SCF_KEY_DESC)
SetKeyDesc("Dollar/Toggle Blinking Text");
else if (sc&SCF_SHIFT)
DocPutS(doc,"$$BK,0$$");
else
DocPutS(doc,"$$BK,1$$");
break;
case CH_CTRLL:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Managed Code");
else
SetKeyDesc("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)
SetKeyDesc("Cmd/Jump to Notes File");
else
SetKeyDesc("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)
SetKeyDesc("Edit/Collapse");
else
SetKeyDesc("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)
SetKeyDesc("Dollar/Toggle Super or Sub script");
else {
DocPutS(doc,"$$SY,0$$");
doc->flags&=~(DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE);
}
} else if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
SetKeyDesc("Dollar/Toggle Subscript");
else {
DocPutS(doc,"$$SY,3$$");
doc->flags|=DOCF_SUBSCRIPT_MODE;
}
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("Dollar/Toggle Superscript");
else {
DocPutS(doc,"$$SY,-3$$");
doc->flags|=DOCF_SUPERSCRIPT_MODE;
}
}
break;
case CH_CTRLQ:
break;
case CH_CTRLR:
if (sc&SCF_KEY_DESC)
SetKeyDesc("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)
EdExistingGraphic(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
EdInsGraphic(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)
SetKeyDesc("Edit/Find Misspelled");
else
WSFindMisspelled(doc);
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("Edit/Save");
else
DocWrite(doc);
}
break;
case CH_CTRLT:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
SetKeyDesc("Edit/Single Entry Toggle Plain Text");
else
DocEntryToggle(doc);
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("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)
SetKeyDesc("Dollar/Toggle Underline");
else if (sc&SCF_SHIFT)
DocPutS(doc,"$$UL,0$$");
else
DocPutS(doc,"$$UL,1$$");
break;
case CH_CTRLV:
if (sc&SCF_KEY_DESC)
SetKeyDesc("Edit/Paste Clipboard");
else
EdPasteClipboard(doc);
break;
case CH_CTRLW:
if (sc&SCF_KEY_DESC)
SetKeyDesc("Dollar/Toggle Word Wrap");
else if (sc&SCF_SHIFT)
DocPutS(doc,"$$WW,0$$");
else
DocPutS(doc,"$$WW,1$$");
break;
case CH_CTRLX:
if (sc&SCF_KEY_DESC)
SetKeyDesc("Edit/Cut To Clipboard");
else
EdCutToClipboard(doc);
break;
case CH_CTRLY:
if (sc&SCF_KEY_DESC)
SetKeyDesc("Edit/Delete Line");
else
EdDelLine(doc);
break;
case CH_CTRLZ:
if (sc&SCF_KEY_DESC)
SetKeyDesc("Dollar/Toggle Inverted Text");
else if (sc&SCF_SHIFT)
DocPutS(doc,"$$IV,0$$");
else
DocPutS(doc,"$$IV,1$$");
break;
case '0'...'9':
if (!(sc&SCF_ALT)) {
if (sc&SCF_CTRL) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Jump to Word Definition");
else
SetKeyDesc("Edit/Autocomplete Word");
} else {
if (WordStat) {
DocUnlock(doc);
if (sc&SCF_SHIFT)
WSDDef(ch-'0',Fs);
else
WSDFillin(ch-'0');
DocLock(doc);
}
}
}
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("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)
SetKeyDesc("Edit/GoTo matching brace");
else
EdFindPaired(doc,'}','{',FALSE);
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("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)
SetKeyDesc("Edit/GoTo matching brace");
else
EdFindPaired(doc,'{','}',TRUE);
} else {
if (sc&SCF_KEY_DESC)
SetKeyDesc("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)
SetKeyDesc("Edit/Jump to Src of Sym");
else
SetKeyDesc("Edit/Autocomplete Sym");
} else {
if (WordStat) {
DocUnlock(doc);
if (sc&SCF_SHIFT)
WSMan(sc2-SC_F1+1,Fs);
else
WSFillIn(sc2-SC_F1+1);
DocLock(doc);
}
}
} else {
switch (sc2) {
case SC_F1:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("About");
else
SetKeyDesc("Help");
} else {
if (sc&SCF_SHIFT)
Ed("::/SparrowOS/Doc/Splash.TXT.Z");
else
Ed("::/SparrowOS/Doc/HelpIndex.TXT.Z");
}
break;
case SC_F2:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Play Macro");
else
SetKeyDesc("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)
SetKeyDesc("Edit/Find Last");
else
SetKeyDesc("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)
SetKeyDesc("Misc/Insert Directory Name");
else
SetKeyDesc("Misc/Insert File Name");
} else {
DocUnlock(doc);
if (sc&SCF_SHIFT)
st=PopUpPickDir;
else
st=PopUpPickFile;
DocLock(doc);
if (st) {
DocPutSPartial(doc,st);
Free(st);
}
}
break;
case SC_F5:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Cmd/Adam Include");
else
SetKeyDesc("Cmd/Run (Execute);Dbg/Go");
} else {
if (IsDbgTask) {
DocUnlock(doc);
if (!(sc&SCF_SHIFT))
IDEGo;
DocLock(doc);
} else {
if (doc_ce->flags1&DOCEF1_LINK) {
if (doc_ce->flags1 & DOCEF1_AUX_STR)
st=doc_ce->aux_str;
else
st=doc_ce->tag;
st= st[2]==':' ? st+3:st;
} else {
DocWrite(doc);
st=doc->filename.name;
}
if (sc&SCF_SHIFT)
AdamFile(st);
else
PopUpFile(st);
}
}
break;
case SC_F9:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Dbg/Clear All Break Points");
else
SetKeyDesc("Dbg/Toggle Break Point");
} else {
if (IsDbgTask) {
DocUnlock(doc);
if (sc&SCF_SHIFT)
IDEClearAllBpts(doc);
else
IDEToggleBpt(doc);
DocLock(doc);
}
}
break;
case SC_F10:
if (sc&SCF_KEY_DESC) {
if (!(sc&SCF_SHIFT))
SetKeyDesc("Dbg/Step Over");
} else {
if (IsDbgTask) {
DocUnlock(doc);
if (!(sc&SCF_SHIFT))
IDEStepOver(doc);
DocLock(doc);
}
}
break;
}
}
}
break;
case SC_F11:
case SC_F12:
if (!(sc & (SCF_ALT|SCF_CTRL))) {
switch (sc2) {
case SC_F11:
if (sc&SCF_KEY_DESC) {
if (!(sc&SCF_SHIFT))
SetKeyDesc("Dbg/Step Into");
} else {
if (IsDbgTask) {
DocUnlock(doc);
if (!(sc&SCF_SHIFT))
IDEStepInto(doc);
DocLock(doc);
}
}
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)
SetKeyDesc("Edit/GoTo Doc End, Select");
else
SetKeyDesc("Edit/GoTo Doc End");
} else {
while (doc_ce!=doc) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
doc_ce=doc->cur_entry=doc_ce->next;
}
doc->cur_data_col=doc_ce->min_col;
doc->recalc_start=doc;
DocFormBackward(doc);
}
} else if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Cursor Down, Select");
else
SetKeyDesc("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)
SetKeyDesc("Edit/GoTo Top of Doc, Select");
else
SetKeyDesc("Edit/GoTo Top of Doc");
} else {
if (doc_ce==doc) doc_ce=doc_ce->last;
while (doc_ce!=doc) {
if (sc&SCF_SHIFT)
doc_ce->type|=DOCET_SELECTED;
else
doc_ce->type&=~DOCET_SELECTED;
doc_ce=doc->cur_entry=doc_ce->last;
}
doc_ce=doc->cur_entry=doc->root.next;
doc->cur_data_col=doc_ce->min_col;
doc->recalc_start=doc;
DocFormFwd(doc);
}
} else if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Cursor Up, Select");
else
SetKeyDesc("Edit/Cursor Up");
} else
EdLineUp(doc,sc);
break;
case SC_PAGE_DOWN:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Page Down, Select");
else
SetKeyDesc("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) &&
doc_ce->y!=doc->root.last->y) {
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)
SetKeyDesc("Edit/Page Up, Select");
else
SetKeyDesc("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)
SetKeyDesc("Edit/GoTo Start of Line");
else {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Cursor Left, Select");
else
SetKeyDesc("Edit/Cursor Left");
}
} else
EdCursorLeft(doc,sc);
break;
case SC_CURSOR_RIGHT:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_CTRL)
SetKeyDesc("Edit/GoTo End of Line");
else {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Cursor Right, Select");
else
SetKeyDesc("Edit/Cursor Right");
}
} else
EdCursorRight(doc,sc);
break;
case SC_DELETE:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
SetKeyDesc("Edit/Cut To Clipboard");
else
SetKeyDesc("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)
SetKeyDesc("Edit/Paste Clipboard");
else if (sc&SCF_CTRL)
SetKeyDesc("Edit/Copy to Clipboard");
else
SetKeyDesc("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)
}
}
if (!doc->recalc_start)
doc->recalc_start=doc->cur_entry->last;
doc->ext_ascii_cnt=ext_ascii_cnt;
if (unlock)
DocUnlock(doc);
if (doc==Fs->last_doc && !(doc->flags&DOCF_DONT_SWAP_OUT)) {
timeout=GetTimeStamp;
if (timeout>doc->swap_out_time) {
doc->swap_out_time=timeout+time_stamp_freq>>4;
Yield;
}
}
}
Bool AKDDocPutKey(I64 ch,I64 scancode)
{
CDoc *doc;
doc=Fs->next_doc;
while (doc!=(&Fs->next_doc)(U8 *)-offset(CDoc.next_doc) &&
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
if (!(doc->flags&DOCF_DONT_SHOW) && doc->flags&DOCF_AUX_DOC && !doc->best_d) {
DocPutKey(doc,ch,scancode);
return FALSE;
}
doc=doc->next_doc;
}
if (doc=DocCur)
DocPutKey(doc,ch,scancode);
return FALSE;
}
public U0 DocPutSPartial(CDoc *doc,U8 *st)
{
U8 ch,*b,*src,*dst,*ptr=st,*ptr2;
Bool unlock;
CDocEntry *doc_ce,*doc_ne;
I64 i,j,timeout;
if (!st)
return;
if (doc->user_put_s)
if ((*doc->user_put_s)(doc,doc->user_put_data,st))
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(safe_dollar_chars_bitmap,ch) ||
doc->flags & (DOCF_OVERSTRIKE | DOCF_IN_DOLLAR)) {
DocPutKey(doc,ch,0);
ptr++;
} else {
ptr2=ptr++;
while (TRUE) {
ch=*ptr++;
if (!Bt(safe_dollar_chars_bitmap,ch))
break;
}
ptr--;
*ptr=0;
doc_ce=doc->cur_entry;
doc->recalc_start=doc_ce->last;
j=ptr-ptr2;
if (doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
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 {
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
doc_ne->tag=MAlloc(j+1,doc->mem_task);
MemCpy(doc_ne->tag,ptr2,j+1);
doc_ne->x=doc_ce->x;
doc_ne->y=doc_ce->y;
doc_ne->max_col=j;
doc_ne->page_line_num=doc_ce->page_line_num;
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==Fs->last_doc &&
!(doc->flags&DOCF_DONT_SWAP_OUT)) {
timeout=GetTimeStamp;
if (timeout>doc->swap_out_time) {
doc->swap_out_time=timeout+time_stamp_freq>>4;
Yield;
}
}
}
#help_index "Doc"
Bool DocFileEd(I64 type,U8 *filename,
U8 *pattern,I64 *_num,I64 ed_flags)
{
I64 flags=0;
CDocEntry *doc_e;
CDoc *doc;
Bool old_silent=Bt(&Fs->display_flags,DISPLAYf_SILENT),
result=FALSE;
try {
switch (type) {
case LK_PLAIN:
type=LK_FILE;
flags=DOCF_PLAIN_TEXT;
break;
case LK_PLAIN_FIND:
type=LK_FILE_FIND;
flags=DOCF_PLAIN_TEXT;
break;
case LK_PLAIN_LINE:
type=LK_FILE_LINE;
flags=DOCF_PLAIN_TEXT;
break;
case LK_BIBLE_FIND:
flags=DOCF_PLAIN_TEXT;
break;
}
flags|=DOCF_ALLOW_UNDO;
if (!*filename)
doc=DocCur;
else {
Silent(ON);
//if bail, scan parents
result=FileFind(filename,NULL,FALSE,TRUE,Bt(&ed_flags,EDf_BAIL));
doc=DocRead(filename,flags);
StrCpy(doc->desc,"Edit");
Silent(old_silent);
doc->flags|=DOCF_ATTR_BY_FILENAME;
}
if (Bt(&ed_flags,EDf_COLLAPSE))
DocCollapse(TRUE,doc);
else if (Bt(&ed_flags,EDf_UNCOLLAPSE))
DocCollapse(FALSE,doc);
if (result)
switch (type) {
case LK_FILE_LINE:
result=DocLineNumGoTo(doc,*_num);
break;
case LK_FILE_ANCHOR:
result=DocAnchorFind(doc,pattern);
break;
case LK_FILE_FIND:
result=DocPatternFind(doc,,pattern,*_num);
break;
case LK_BIBLE_FIND:
result=DocPatternFind(doc,*_num,pattern);
break;
default:
DocCenter(doc);
}
*_num=doc->cur_entry->y+1;
if (!(ed_flags&EDF_BAIL) && DocDo(doc,DOF_DONT_HOME)) {
DocLock(doc);
doc_e=doc->cur_entry;
if (doc_e!=doc)
DocEntryRun(doc,doc_e,TRUE);
DocUnlock(doc);
DocWrite(doc);
}
if (Fs->last_doc!=doc)
DocDel(doc);
else
result=FALSE;
} catch {
Silent(old_silent);
result=FALSE;
}
return result;
}
public I64 EdLinkCvt(U8 *link_st,U8 **_filename,U8 **_pattern,I64 *_num,I64 ed_flags)
{
U8 *st,*ptr,*filename;
I64 result,i;
CHashSrcSym *temph;
*_filename=NULL;
*_pattern=NULL;
*_num=1;
if (!link_st||!*link_st) {
if (ed_flags&EDF_BAIL)
return -1;
link_st=sys_temp_filename;
}
st=StrNew(link_st);
result=LK_FILE;
if (StrLen(st)>3 && st[2]==':') {
st[2]=0;
filename=st+3;
switch (result=DefineMatch(st,"ST_LINK_TYPES",LEF_IGNORE_CASE)) {
case LK_MAN_PAGE:
if (temph=HashFind(filename,Fs->hash_table,HTG_SRC_SYM)) {
if (temph->type&HTT_DEFINE_STR && temph(CHashDefineStr *)->caller) {
if (ptr=SrcEdLink(temph(CHashDefineStr *)->caller,DFT_ADDR_LINK_BIN_SIZE)) {
result=EdLinkCvt(ptr,_filename,_pattern,_num,ed_flags);
Free(ptr);
} else
result=-1;
} else
result=EdLinkCvt(temph->src_link,_filename,_pattern,_num,ed_flags);
} else
result=-1;
goto lc_done;
case LK_ADDR:
if (ptr=StrLastOcc(filename,",")) {
*ptr=0;
i=A2I(ptr+1);
} else
i=DFT_ADDR_LINK_BIN_SIZE;
if (ptr=SrcEdLink(ExePrintF("%s;",filename),i)) {
result=EdLinkCvt(ptr,_filename,_pattern,_num,ed_flags);
Free(ptr);
} else
result=-1;
goto lc_done;
case LK_DEF:
if (ptr=StrLastOcc(filename,",")) {
*ptr=0;
i=A2I(ptr+1);
} else
i=-1;
*_filename=StrNew(filename);
*_num=i;
goto lc_done;
case LK_HELP_INDEX:
*_filename=StrNew(filename);
goto lc_done;
case LK_BIBLE_FIND:
if (ptr=StrLastOcc(filename,",")) {
*ptr=0;
*_pattern=StrNew(ptr+1);
}
i=DefineMatch(filename,"ST_BIBLE_BOOKS",LEF_IGNORE_CASE);
if (i<0)
result=-1;
else {
*_num=A2I(DefineSub(i,"ST_BIBLE_BOOK_LINES"));
filename=Define("ST_BIBLE_FILE");
}
break;
case LK_FILE_LINE:
case LK_PLAIN_LINE:
if (ptr=StrLastOcc(filename,",")) {
*ptr=0;
*_num=A2I(ptr+1);
}
break;
case LK_FILE_ANCHOR:
if (ptr=StrLastOcc(filename,",")) {
*ptr=0;
*_pattern=StrNew(ptr+1);
}
break;
case LK_FILE_FIND:
case LK_PLAIN_FIND:
if (ptr=StrLastOcc(filename,",")) {
*ptr=0;
*_pattern=StrNew(ptr+1);
if (ptr=StrLastOcc(*_pattern,":")) {
*ptr=0;
*_num=A2I(ptr+1);
}
}
break;
}
} else
filename=st;
if (result>=0)
*_filename=StrNew(filename);
lc_done:
Free(st);
return result;
}