TempleOSCDV3.11.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:46:29 +02:00
1 parent f8c05f98f4
commit ed64d7e3b8
549 files changed
+10643 -12855

No files matched your search

-103
View File
@@ -1,103 +0,0 @@
#help_index "DolDoc"
#help_file "::/Doc/DolDoc"
/*$AN,"",A="Doc"$
TempleOS DolDoc's can have "cursor movement" cmds which can move the cursor up
the screen and layer on existing text. It can also have callback funs which
supply live, changing text. For these reasons, you can't assume you know
where the visible portion of the document is and must process much
of the document each time it is placed on the screen, becoming CPU
intensive on big documents.
See $LK,"::/Doc/DolDocOverview.TXT"$
*/
extern I64 EdLeftClickLink(CDoc *doc,CDocEntry *doc_e);
extern I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e);
extern U0 DocPrintPartial(CDoc *doc,U8 *fmt,...);
extern U0 DocFormBwd(CDoc *doc,Bool giveup=FALSE);
extern U0 EdUndoFilter(CDoc *doc);
extern U8 *PopUpPickLst(U8 *lst);
#define DHT_DOC_CMD 1
#define DHT_DOC_FLAG 2
#define DHT_COLOR 4
/* See $LK,"TempleOS Link Types",A="MN:ST_LINK_TYPES"$.
"filename"
"FI:filename"
"FA:haystack_filename,needle_anchor_str"
"FF:haystack_filename,needle_str"
"FF:haystack_filename,needle_str:occurnum"
"FL:filename,linenum"
"MN:SymName"
"PI:filename"
"PF:haystack_filename,needle_str"
"PF:haystack_filename,needle_str:occurnum"
"PL:filename,linenum"
"BF:haystack_bible_book,needle_str"
"DF:word"
"DF:word,defnum"
"HI:index"
"AD:code_address_number"
To edit a doc structure already in memory. See $LK,"SpriteEdText",A="MN:SpriteEdText"$().
"AI:doc_address"
"AA:haystack_doc_address,needle_anchor_str"
"AF:haystack_doc_address,needle_str"
"AF:haystack_doc_address,needle_str:occurnum"
"AL:doc_address,linenum"
*/
#define LK_FILE 0
#define LK_FILE_ANCHOR 1
#define LK_FILE_FIND 2
#define LK_FILE_LINE 3
#define LK_MAN_PAGE 4
#define LK_PLAIN 5
#define LK_PLAIN_FIND 6
#define LK_PLAIN_LINE 7
#define LK_BIBLE_FIND 8
#define LK_DEF 9
#define LK_HELP_INDEX 10
#define LK_ADDR 11
#define LK_DOC 12 //See $LK,"SpriteEdText",A="MN:SpriteEdText"$()
#define LK_DOC_ANCHOR 13
#define LK_DOC_FIND 14
#define LK_DOC_LINE 15
#define LK_PLACE_ANCHOR 16
public class CDolDocGlbls
{
CHashTable *hash;
I64 dft_de_flags [DOCT_NUM_TYPES],
type_flags_nontag_invisible [(DOCT_NUM_TYPES+63)/64],
type_flags_form [(DOCT_NUM_TYPES+63)/64],
type_flags_data [(DOCT_NUM_TYPES+63)/64],
clean_scan_codes [4];
I32 dft_type_flags [DOCT_NUM_TYPES];
} doldoc;
MemSet(&doldoc,0,sizeof(CDolDocGlbls));
#help_index "God"
#define BIBLE_FILENAME "::/Misc/Bible.TXT.Z"
#include "DocNew"
#include "DocPlain"
#include "DocInit"
#include "DocHighlight"
#include "DocRecalcA"
#include "DocRecalcB"
sys_clipboard_doc=DocNew;
#include "DocFile"
#include "DocOpt"
#include "DocPopUp"
#include "DocCtrlL"
#include "DocMacro"
#include "DocFind"
#include "DocEdA"
#include "DocEdB"
#include "DocCodeTools"
#include "DocTree"
#include "DocMain"
+142
View File
@@ -0,0 +1,142 @@
#help_index "DolDoc/Bin"
CDocBin *DocBinFindNum(CDoc *haystack_doc,I64 needle_num)
{
CDocBin *b=haystack_doc->bin_root.next;
while (b!=&haystack_doc->bin_root) {
if (b->num==needle_num)
return b;
b=b->next;
}
return NULL;
}
CDocBin *DocBinFindTag(CDoc *haystack_doc,U8 *needle_tag)
{
CDocBin *b;
if (needle_tag) {
b=haystack_doc->bin_root.next;
while (b!=&haystack_doc->bin_root) {
if (b->tag && !StrCmp(b->tag,needle_tag))
return b;
b=b->next;
}
}
return NULL;
}
U0 DocBinsValidate(CDoc *doc)
{
Bool unlock=DocLock(doc);
CDocBin *b,*b1;
CDocEntry *doc_e,*doc_e2;
I64 renum_num=0;
b=doc->bin_root.next;
while (b!=&doc->bin_root) {
b->use_cnt=0;
b->temp_use_cnt=0;
b->renum_num=-1;
Free(b->tag);
b->tag=NULL;
b=b->next;
}
doc_e=doc->root.next;
while (doc_e!=doc) {
doc_e2=doc_e->next;
if (doc_e->de_flags & DOCEF_HAS_BIN) {
if (b=doc_e->bin_data=DocBinFindNum(doc,doc_e->bin_num)) {
if (doc_e->de_flags & DOCEF_BIN_PTR_LINK)
b->temp_use_cnt=MAX_I32;
if (!b->use_cnt++)
b->renum_num=++renum_num;
doc_e->bin_num=b->renum_num;
if (!b->tag && doc_e->de_flags&DOCEF_TAG && doc_e->tag && *doc_e->tag)
b->tag=StrNew(doc_e->tag,doc->mem_task);
} else {
RawPrint(3000,"Bin Not Found");
doc_e->type=doc_e->de_flags=0;
doc_e->type_u8=DOCT_ERROR;
}
}
doc_e=doc_e2;
}
b=doc->bin_root.next;
doc->cur_bin_num=1;
while (b!=&doc->bin_root) {
b1=b->next;
if (!b->use_cnt) {
QueRem(b);
Free(b->data);
Free(b);
} else {
b->num=b->renum_num;
if (b->num>=doc->cur_bin_num)
doc->cur_bin_num=b->num+1;
}
b=b1;
}
if (unlock)
DocUnlock(doc);
}
U0 DocBinDel(CDoc *doc,CDocBin *b)
{
if (doc && b && b->use_cnt) {
b->use_cnt--;
if (!b->use_cnt) {
QueRem(b);
Free(b->tag);
Free(b->data);
Free(b);
}
} else
RawPrint(3000,"DocBinDel");
}
I64 DocBinPtrRst(CDoc *doc,CDocEntry *doc_e)
{
U8 *st,*st2;
CDoc *doc2;
CDocBin *tempb,*tempb2;
I64 i,bin_num=0;
if (doc_e->de_flags&DOCEF_HAS_BIN &&
doc_e->bin_ptr_link && StrLen(doc_e->bin_ptr_link)) {
bin_num=doc_e->bin_num;
st=StrNew(doc_e->bin_ptr_link);
st2=StrNew(st);
StrLastRem(st,",",st2);
i=Str2I64(st2);
if (i>0||*st2) {
doc2=DocRead(st);
if (i>0 && (tempb2=DocBinFindNum(doc2,i)) ||
i==0 && (tempb2=DocBinFindTag(doc2,st2))) {
i=1;
if (bin_num>0) {
if (tempb=DocBinFindNum(doc,bin_num)) {
i=tempb->use_cnt;
DocBinDel(doc,tempb);
}
} else
bin_num=doc->cur_bin_num++;
tempb=MAllocIdentical(tempb2,doc->mem_task);
tempb->use_cnt=i;
tempb->data=MAllocIdentical(tempb2->data,doc->mem_task);
tempb->num=bin_num;
doc_e->bin_data=tempb;
if (doc_e->de_flags&DOCEF_TAG && doc_e->tag && *doc_e->tag)
tempb->tag=StrNew(doc_e->tag,doc->mem_task);
else
tempb->tag=NULL;
QueIns(tempb,doc->bin_root.last);
} else
bin_num=0;
DocDel(doc2);
} else
bin_num=0;
Free(st2);
Free(st);
doc_e->bin_num=bin_num;
}
return bin_num;
}
@@ -456,8 +456,8 @@ U0 EdInsChar(I64 ch,I64 sc,CDoc *doc)
goto ic_cont;
} else {
doc->dollar_buf[doc->dollar_buf_ptr]=0;
DocPrint(doc,doc->dollar_buf);
doc->flags&=~DOCF_IN_DOLLAR;
DocPrint(doc,doc->dollar_buf);
doc->dollar_buf_ptr=0;
goto ic_done;
}
@@ -646,125 +646,3 @@ U0 EdDelLine(CDoc *doc)
doc_ce=doc_ce2;
}
}
U0 DocEntryToggle(CDoc *doc)
{
Bool unlock=DocLock(doc),old_color_names;
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->de_flags &
~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|
DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP)) &&
!(doc_ce->type&DOCG_BL_IV_UL)) {
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->de_flags==doc_ce2->de_flags &&
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_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->de_flags==doc_ce2->de_flags &&
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_col;
while (i>doc_ce->min_col && doc_ce->tag[i]!='$$')
i--;
j=doc->cur_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_col=i;
st2=MStrPrint("%q",st);
if (doc_ce=DocPrint(doc,st2)) {
doc->cur_entry=doc_ce;
doc->cur_col=doc_ce->min_col;
}
Free(st);
Free(st2);
}
} else {
old_color_names=LBts(&doc->flags,DOCf_COLOR_NAMES);
st=Doc2PlainText(doc,doc_ce);
LBEqu(&doc->flags,DOCf_COLOR_NAMES,old_color_names);
DocEntryDel(doc,doc_ce);
DocPrint(doc,"$$$$%Q$$$$",st);
}
DocRecalc(doc);
}
if (unlock)
DocUnlock(doc);
}
U0 DocFlagsToggle(CDoc *doc,I64 tog_flags)
{
Bool unlock=DocLock(doc);
I64 size,flags=doc->flags^tog_flags;
U8 *st;
CDocUndo *u_next,*u_last;
doc->flags|=DOCF_COLOR_NAMES;
st=DocSave(doc,&size);
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->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);
}
+123
View File
@@ -0,0 +1,123 @@
#help_index "DolDoc/Clipboard"
sys_clipboard_doc=DocNew;
public U0 ClipboardDel()
{//Delete everything on clipboard.
DocRst(sys_clipboard_doc,TRUE);
}
public U0 EdCopyToClipboard(CDoc *doc)
{//Copy $LK,"DOCET_SELECTED",A="MN:DOCET_SELECTED"$ flagged entries to clipboard.
CDoc *doc2=sys_clipboard_doc;
Bool unlock_doc=DocLock(doc),
unlock_doc2=DocLock(doc2);
CDocEntry *doc_e=doc->root.next,*doc_ne;
ClipboardDel;
while (doc_e!=doc) {
if (doc_e->type & DOCET_SELECTED) {
doc_e->type&=~DOCET_SELECTED;
if (!Bt(doldoc.type_flags_data,doc_e->type_u8)) {
doc_ne=DocEntryCopy(doc2,doc_e);
QueIns(doc_ne,doc2->root.last);
}
}
doc_e=doc_e->next;
}
if (unlock_doc2)
DocUnlock(doc2);
if (unlock_doc)
DocUnlock(doc);
}
public U0 EdCutToClipboard(CDoc *doc)
{//Remove selected entries and place on clipboard.
CDoc *doc2=sys_clipboard_doc;
Bool unlock_doc=DocLock(doc),
unlock_doc2=DocLock(doc2);
CDocEntry *doc_e=doc->root.next,*doc_e1,*doc_ne,*doc_e2=NULL;
ClipboardDel;
while (doc_e!=doc) {
doc_e1=doc_e->next;
if (doc_e->type & DOCET_SELECTED) {
doc_e->type&=~DOCET_SELECTED;
if (!Bt(doldoc.type_flags_data,doc_e->type_u8)) {
doc_ne=DocEntryCopy(doc2,doc_e);
QueIns(doc_ne,doc2->root.last);
}
if (doc_e==doc->cur_entry || doc_e==doc_e2)
doc_e2=doc_e->next;
DocEntryDel(doc,doc_e);
}
doc_e=doc_e1;
}
if (doc_e2) {
doc->cur_entry=doc_e2;
doc->cur_col=doc_e2->min_col;
}
DocRemSoftNewLines(doc,NULL);
if (unlock_doc2)
DocUnlock(doc2);
if (unlock_doc)
DocUnlock(doc);
}
public U0 EdPasteClipboard(CDoc *doc)
{//Insert copy of clipboard at insert pt, cur_entry.
CDoc *doc2=sys_clipboard_doc;
Bool unlock_doc=DocLock(doc),
unlock_doc2=DocLock(doc2);
CDocEntry *doc_ce=doc->cur_entry,*doc_e;
if (doc_ce->type_u8==DOCT_DATA) {
doc_e=doc2->root.next;
while (doc_e!=doc2) {
if (doc_e->de_flags&DOCEF_TAG)
DocPrintPartial(doc,"%s",doc_e->tag);
doc_e=doc_e->next;
}
} else
DocInsDoc(doc,doc2);
if (unlock_doc2)
DocUnlock(doc2);
if (unlock_doc)
DocUnlock(doc);
}
public U0 DocCut(CDoc *doc,CDocEntry *start,CDocEntry *end)
{//Del start to end entry, including end points.
Bool unlock_doc=DocLock(doc);
CDocEntry *doc_e1;
while (start!=doc) {
doc_e1=start->next;
if (start==doc->cur_entry) {
doc->cur_entry=start->next;
doc->cur_col=doc->cur_entry->min_col;
}
DocEntryDel(doc,start);
if (start==end)
break;
start=doc_e1;
}
DocRemSoftNewLines(doc,NULL);
if (unlock_doc)
DocUnlock(doc);
}
public CDoc *DocCopy(CDoc *doc,CDocEntry *start,CDocEntry *end)
{//Copies start to end entry, including end points.
CDoc *doc2=DocNew;
Bool unlock_doc=DocLock(doc);
CDocEntry *doc_ne;
while (start!=doc) {
if (!Bt(doldoc.type_flags_data,start->type_u8)) {
doc_ne=DocEntryCopy(doc2,start);
QueIns(doc_ne,doc2->root.last);
}
if (start==end)
break;
start=start->next;
}
if (unlock_doc)
DocUnlock(doc);
return doc2;
}
+108
View File
@@ -0,0 +1,108 @@
#help_index "DolDoc/Task;StdOut/Task"
public CDoc *DocPut(CTask *task=NULL)
{//Current document that StdOut Put() goes to.
//Basically, StdOut unless double buffering.
CDoc *result;
if (!task) task=Fs;
if ((result=task->put_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
return result;
else
return NULL;
}
public CDoc *DocDisplay(CTask *task=NULL)
{//StdOut displayed unless double buffering.
CDoc *result;
if (!task) task=Fs;
if ((result=task->display_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
return result;
else
return NULL;
}
public CDoc *DocBorder(CTask *task=NULL)
{//Doc holding border of window text.
CDoc *result;
if (!task) task=Fs;
if ((result=task->border_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
return result;
else
return NULL;
}
public CDoc *DocDblBufStart(CTask *task=NULL)
{//See $LK,"::/Demo/Spy.CPP"$
Bool unlock_ddoc;
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task),*result;
if (!pdoc || !ddoc || pdoc!=ddoc)
result=NULL; //Already Double buffering
else {
if (!task) task=Fs;
unlock_ddoc=DocLock(ddoc); //dont change during winupdate, so lock DocPut$WW,0$
result=DocNew(,task);
result->win_task =ddoc->win_task;
result->max_entries =ddoc->max_entries;
MemCpy(result->find_replace,ddoc->find_replace,sizeof(CEdFindText));
MemCpy(&result->filename,&ddoc->filename,sizeof(CEdFileName));
result->left_click_link =ddoc->left_click_link;
result->right_click_link =ddoc->right_click_link;
result->user_put_data =ddoc->user_put_data;
result->user_put_key =ddoc->user_put_key;
result->user_put_s =ddoc->user_put_s;
result->parent_doc =ddoc->parent_doc;
result->desc =ddoc->desc;
result->user_data =ddoc->user_data;
result->flags|=ddoc->flags&DOCG_DBL_BUF_FLAGS | DOCF_DONT_SHOW;
task->put_doc=result;
if (unlock_ddoc)
DocUnlock(ddoc);
}
return result;
}
public Bool DocDblBufEnd(CTask *task=NULL)
{//See $LK,"::/Demo/Spy.CPP"$
Bool result=FALSE;
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task);
if (pdoc && ddoc && pdoc!=ddoc) {//Double buffering?
if (!task) task=Fs;
ddoc->flags|=DOCF_DONT_SHOW;
pdoc->flags&=~DOCF_DONT_SHOW;
DocLock(ddoc);
task->display_doc=pdoc;
DocUnlock(ddoc);
DocDel(ddoc);
result=TRUE;
}
return result;
}
public Bool DocDblBufSwap(CTask *task=NULL)
{//See $LK,"::/Demo/Spy.CPP"$
Bool result=FALSE;
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task);
if (pdoc && ddoc && pdoc!=ddoc) {//Double buffering?
if (!task) task=Fs;
ddoc->flags|=DOCF_DONT_SHOW;
pdoc->flags&=~DOCF_DONT_SHOW;
DocLock(ddoc);
task->display_doc=pdoc;
DocUnlock(ddoc);
DocRst(ddoc,TRUE);
MemCpy(ddoc->find_replace,pdoc->find_replace,sizeof(CEdFindText));
MemCpy(&ddoc->filename,&pdoc->filename,sizeof(CEdFileName));
ddoc->max_entries =pdoc->max_entries;
ddoc->flags =pdoc->flags&DOCG_DBL_BUF_FLAGS |
ddoc->flags&~DOCG_DBL_BUF_FLAGS;
ddoc->left_click_link =pdoc->left_click_link;
ddoc->right_click_link =pdoc->right_click_link;
ddoc->user_put_data =pdoc->user_put_data;
ddoc->user_put_key =pdoc->user_put_key;
ddoc->user_put_s =pdoc->user_put_s;
ddoc->desc =pdoc->desc;
ddoc->user_data =pdoc->user_data;
task->put_doc=ddoc;
result=TRUE;
}
return result;
}
+249
View File
@@ -0,0 +1,249 @@
#help_index "DolDoc/Output;StdOut/DolDoc"
public Bool View()
{//Go live for user interaction until <ESC> or <SHIFT-ESC>.
I64 ch;
do ch=DocGetKey;
while (ch!=CH_ESC && ch!=CH_SHIFT_ESC);
return ch==CH_ESC;
}
#help_index "DolDoc"
U8 *EdOverStrikeCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *st=MAlloc(8,mem_task);
if (doc->flags & DOCF_OVERSTRIKE)
*st='O';
else
*st='Ä';
st[1]=0;
return st;
}
U8 *EdFilterCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *st=MAlloc(8,mem_task);
if (doc->find_replace->filter_lines)
*st='F';
else
*st='Ä';
st[1]=0;
return st;
}
U8 *EdDollarCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *st=MAlloc(8,mem_task);
if (doc->flags & DOCF_IN_DOLLAR)
*st='$$';
else
*st='Ä';
st[1]=0;
return st;
}
U8 *EdMoreCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *st=MAlloc(8,mem_task);
if (doc->flags&DOCF_MORE)
StrCpy(st,"MoreÄ");
else
StrCpy(st,"ÄÄÄÄÄ");
return st;
}
U8 *EdDollarTypeCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *src=DefineSub(doc->cur_entry->type_u8,"ST_DOC_CMDS"),
*st=CAlloc(8,mem_task);
if (doc->cur_entry==doc)
src="EOF";
else if (!src)
src="ERR";
StrPrint(st,"%-3ts",src);
return st;
}
public Bool DocEd(CDoc *doc,I64 dof_flags=0)
{//Live for user interaction. End on <ESC> or <SHIFT-ESC>.
CDoc *old_put_doc =DocPut,
*old_display_doc=DocDisplay,
*old_border_doc =DocBorder,*bdoc;
CDocEntry *doc_e;
I64 old_attr=Fs->text_attr,
old_top =Fs->win_top, old_bottom=Fs->win_bottom,
old_left=Fs->win_left,old_right =Fs->win_right,
old_title_src=Fs->title_src;
Bool result,unlock;
U8 *old_task_title;
if (dof_flags&DOF_WIN_MAX)
WinMax;
unlock=DocLock(doc);
doc->win_task=Fs;
bdoc=DocNew;
bdoc->flags|=DOCF_BORDER_DOC;
DocPrint(bdoc,"$$CM+TY+LX+NC,0,-1$$");
DocPrint(bdoc,"$$TX+RX+BD,\"[X]\"$$");
DocPrint(bdoc,"$$BK,1$$$$TX+LX+BD,\"MENU\"$$$$BK,0$$");
old_task_title=StrNew(Fs->task_title);
if (Fs->title_src!=TTS_LOCKED_CONST) {
Fs->title_src=TTS_ED_FILENAME;
MemCpy(Fs->task_title,doc->filename.name,TASK_TITLE_LEN);
}
doc_e=DocPrint(bdoc,"$$DA-TRM-P+BD+RD+CX+IV,140,A=\"%%s...\",SCX=16$$");
doc_e->data=&Fs->task_title;
DocDataFmt(bdoc,doc_e);
if (doc->flags & DOCF_ALLOW_UNDO) {
DocPrint(bdoc,"$$CM+BY+LX+NC,1,1$$");
doc_e=DocPrint(bdoc,"$$DA+BD+RD-TRM,32,RT=U32,A=\"Undo:%%03d\"$$\n");
doc_e->data=&doc->undo_cnt;
DocDataFmt(bdoc,doc_e);
}
DocPrint(bdoc,"$$CM+BY+RX+NC,-30,1$$");
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdMoreCB;
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdDollarTypeCB;
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdFilterCB;
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdOverStrikeCB;
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdDollarCB;
doc_e=DocPrint(bdoc,"$$DA+BD+RD-TRM,32,A=\"Line:%%04d \"$$");
doc_e->data=&doc->line;
DocDataFmt(bdoc,doc_e);
doc_e=DocPrint(bdoc,"$$DA+BD+RD-TRM,32,A=\"Col:%%04d\"$$\n");
doc_e->data=&doc->col;
DocDataFmt(bdoc,doc_e);
DocRecalc(bdoc);
DocRecalc(doc);
if (!(dof_flags&DOF_DONT_HOME))
DocTop(doc);
Fs->border_doc=bdoc;
if (doc!=old_display_doc)
doc->parent_doc=old_display_doc;
Fs->put_doc=Fs->display_doc=doc;
if (!(dof_flags&DOF_DONT_TEXT_ATTR))
Fs->text_attr=DOC_ATTR_DFT_TEXT;
if (!(dof_flags&DOF_DONT_SHOW)) {
LBts(&Fs->display_flags,DISPLAYf_SHOW);
WinZBufUpdate;
}
if (dof_flags&DOF_MIN_SIZE)
doc->flags|=DOCF_MIN_SIZE;
DocUnlock(doc);
if (!(dof_flags&DOF_DONT_WINMGR_SYNC)) {
WinMgrSync(2,TRUE);
if (doc->flags&DOCF_MIN_SIZE)
WinMgrSync(2,TRUE);
}
result=View;
DocLock(doc);
if (result) {
doc_e=doc->root.next;
while (doc_e!=doc) {
if (doc_e->type_u8==DOCT_DATA || doc_e->type_u8==DOCT_CHECK_BOX)
DocDataScan(doc,doc_e);
doc_e=doc_e->next;
}
}
if (unlock)
DocUnlock(doc);
Fs->border_doc =old_border_doc;
Fs->display_doc=old_display_doc;
Fs->put_doc =old_put_doc;
Fs->text_attr =old_attr;
if (Fs->title_src!=TTS_LOCKED_CONST) {
Fs->title_src =old_title_src;
StrCpy(Fs->task_title,old_task_title);
}
Free(old_task_title);
DocDel(bdoc);
if (dof_flags&DOF_MIN_SIZE) {
WinHorz(old_left,old_right);
WinVert(old_top,old_bottom);
}
return result;
}
#help_index "DolDoc/Cmd Line (Typically);Cmd Line (Typically)"
public Bool Ed(U8 *link_st,I64 edf_dof_flags=0)
{//Invoke document editor.
U8 *filename,*needle_str;
I64 i,num;
Bool cont,result=FALSE;
CDoc *doc;
switch (i=EdLinkCvt(link_st,&filename,&needle_str,&num,edf_dof_flags)) {
case -1:
break;
case LK_DEF:
doc=DocNew;
doc->desc='DictDef';
ACDDefsPut(doc,filename,num);
goto ej_doc;
case LK_HELP_INDEX:
doc=DocNew;
doc->desc='HelpIndx';
DocHelpIndex(doc,filename);
ej_doc:
if (!(edf_dof_flags&EDF_BAIL)) {
DocEd(doc);
DocDel(doc);
}
if (!(edf_dof_flags&EDF_WAS_WRITE))
result=TRUE;
break;
default:
if (IsRaw)
result=EdLite(filename,num,edf_dof_flags);
else {
cont=TRUE;
if (!(edf_dof_flags&EDF_BAIL) && !(LK_DOC<=i<=LK_DOC_LINE) &&
!FilesFindMatch(filename,FILEMASK_TXT) &&
!PopUpCancelOk(ST_WARN_ST "Not Text File\n\n"))
cont=FALSE;
if (cont)
result=DocFileEd(i,filename,needle_str,&num,edf_dof_flags);
}
}
Free(filename);
Free(needle_str);
return result;
}
public Bool Plain(U8 *filename,I64 edf_dof_flags=0)
{//Edit document in plain text mode, so dollar signs are not special.
Bool result;
U8 *st=MStrPrint("PI:%s",filename);
result=Ed(st,edf_dof_flags);
Free(st);
return result;
}
#help_index "DolDoc;Task/Srv/Exe"
public I64 PopUpEd(U8 *filename,CTask *parent=NULL,CTask **_pu_task=NULL)
{//Create PopUp win task and edit a doc.
U8 *st=MStrPrint("Ed(\"%Q\");",filename);
I64 result=PopUp(st,parent,_pu_task);
Free(st);
return result;
}
-980
View File
@@ -1,980 +0,0 @@
#help_index "DolDoc/Output;StdOut/DolDoc"
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_bmp_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
FindWiz;
} 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_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_col=doc_ce->min_col;
} else {
doc->cur_col=doc_ce->max_col;
if (doc->cur_col>doc_ce->min_col)
doc->cur_col--;
EdDelChar(doc);
}
} else {
doc->cur_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");
DocMenu(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->top_line_num)*FONT_HEIGHT);
else
EdSpriteIns(doc,
(doc_ce->x+doc->cur_col-doc->line_start_col)*FONT_WIDTH,
(doc_ce->y-doc->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))
PostMsgWait(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) {
DocUnlock(doc);
GodDoodle;
DocLock(doc);
} 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_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_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_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_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_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_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_bmp_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_bmp_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_col;
doc->cur_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_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) && DocEd(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;
}
+13
View File
@@ -0,0 +1,13 @@
#help_index "DolDoc"
extern Bool DocEd(CDoc *doc,I64 dof_flags=0);
extern I64 DocEntryRun(CDoc *doc,CDocEntry *doc_e,
Bool exited,I64 *_has_action=NULL);
extern U0 DocFormBwd(CDoc *doc,Bool giveup=FALSE);
extern U0 DocLoad(CDoc *doc,U8 *src2,I64 size);
extern U0 DocPrintAtomic(CDoc *doc,U8 *fmt,...);
extern U0 DocPrintPartial(CDoc *doc,U8 *fmt,...);
extern CDocEntry *DocPutS(CDoc *doc,U8 *st);
extern U8 *DocSave(CDoc *doc,I64 *_size=NULL);
extern I64 EdLeftClickLink(CDoc *doc,CDocEntry *doc_e);
extern U8 *PopUpPickLst(U8 *lst);
extern I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e);
+1 -124
View File
@@ -38,7 +38,7 @@ public CDoc *DocRead(U8 *name=NULL,I64 flags=0)
CDoc *doc=DocNew;
U8 *src,*name2;
I64 size=0;
if (!name) name=dsk.temp_filename;
if (!name) name=blkdev.temp_filename;
doc->flags|=flags;
name2=FileNameAbs(name);
StrCpy(doc->filename.name,name2);
@@ -242,129 +242,7 @@ public U0 DocInsDoc(CDoc *doc=NULL,CDoc *doc2)
DocUnlock(doc);
}
#help_index "DolDoc/Clipboard"
public U0 ClipboardDel()
{//Delete everything on clipboard.
DocRst(sys_clipboard_doc,TRUE);
}
public U0 EdCopyToClipboard(CDoc *doc)
{//Copy $LK,"DOCET_SELECTED",A="MN:DOCET_SELECTED"$ flagged entries to clipboard.
CDoc *doc2=sys_clipboard_doc;
Bool unlock_doc=DocLock(doc),
unlock_doc2=DocLock(doc2);
CDocEntry *doc_e=doc->root.next,*doc_ne;
ClipboardDel;
while (doc_e!=doc) {
if (doc_e->type & DOCET_SELECTED) {
doc_e->type&=~DOCET_SELECTED;
if (!Bt(doldoc.type_flags_data,doc_e->type_u8)) {
doc_ne=DocEntryCopy(doc2,doc_e);
QueIns(doc_ne,doc2->root.last);
}
}
doc_e=doc_e->next;
}
if (unlock_doc2)
DocUnlock(doc2);
if (unlock_doc)
DocUnlock(doc);
}
public U0 EdCutToClipboard(CDoc *doc)
{//Remove selected entries and place on clipboard.
CDoc *doc2=sys_clipboard_doc;
Bool unlock_doc=DocLock(doc),
unlock_doc2=DocLock(doc2);
CDocEntry *doc_e=doc->root.next,*doc_e1,*doc_ne,*doc_e2=NULL;
ClipboardDel;
while (doc_e!=doc) {
doc_e1=doc_e->next;
if (doc_e->type & DOCET_SELECTED) {
doc_e->type&=~DOCET_SELECTED;
if (!Bt(doldoc.type_flags_data,doc_e->type_u8)) {
doc_ne=DocEntryCopy(doc2,doc_e);
QueIns(doc_ne,doc2->root.last);
}
if (doc_e==doc->cur_entry || doc_e==doc_e2)
doc_e2=doc_e->next;
DocEntryDel(doc,doc_e);
}
doc_e=doc_e1;
}
if (doc_e2) {
doc->cur_entry=doc_e2;
doc->cur_col=doc_e2->min_col;
}
DocRemSoftNewLines(doc,NULL);
if (unlock_doc2)
DocUnlock(doc2);
if (unlock_doc)
DocUnlock(doc);
}
public U0 EdPasteClipboard(CDoc *doc)
{//Insert copy of clipboard at insert pt, cur_entry.
CDoc *doc2=sys_clipboard_doc;
Bool unlock_doc=DocLock(doc),
unlock_doc2=DocLock(doc2);
CDocEntry *doc_ce=doc->cur_entry,*doc_e;
if (doc_ce->type_u8==DOCT_DATA) {
doc_e=doc2->root.next;
while (doc_e!=doc2) {
if (doc_e->de_flags&DOCEF_TAG)
DocPrintPartial(doc,"%s",doc_e->tag);
doc_e=doc_e->next;
}
} else
DocInsDoc(doc,doc2);
if (unlock_doc2)
DocUnlock(doc2);
if (unlock_doc)
DocUnlock(doc);
}
public U0 DocCut(CDoc *doc,CDocEntry *start,CDocEntry *end)
{//Del start to end entry, including end points.
Bool unlock_doc=DocLock(doc);
CDocEntry *doc_e1;
while (start!=doc) {
doc_e1=start->next;
if (start==doc->cur_entry) {
doc->cur_entry=start->next;
doc->cur_col=doc->cur_entry->min_col;
}
DocEntryDel(doc,start);
if (start==end)
break;
start=doc_e1;
}
DocRemSoftNewLines(doc,NULL);
if (unlock_doc)
DocUnlock(doc);
}
public CDoc *DocCopy(CDoc *doc,CDocEntry *start,CDocEntry *end)
{//Copies start to end entry, including end points.
CDoc *doc2=DocNew;
Bool unlock_doc=DocLock(doc);
CDocEntry *doc_ne;
while (start!=doc) {
if (!Bt(doldoc.type_flags_data,start->type_u8)) {
doc_ne=DocEntryCopy(doc2,start);
QueIns(doc_ne,doc2->root.last);
}
if (start==end)
break;
start=start->next;
}
if (unlock_doc)
DocUnlock(doc);
return doc2;
}
#help_index "DolDoc/Compiler;Compiler/Directive"
public U0 StreamDoc(CDoc *doc)
{//Inject doc into compile stream. Use inside #exe{}.
//TODO: $LK,"DocRst",A="MN:DocRst"$
@@ -384,7 +262,6 @@ public U0 StreamDoc(CDoc *doc)
}
#help_index "DolDoc"
Bool DocCaptureUndo(CDoc *doc,Bool force=FALSE)
{
Bool result=FALSE,unlock;
+18 -12
View File
@@ -362,17 +362,23 @@ sf_done:
DocUnlock(doc);
}
U0 EdUndoFilter(CDoc *doc)
#define RSAC_REPLACE 0
#define RSAC_SKIP 1
#define RSAC_ALL 2
I64 PopUpReplaceSkipAllCancel(U8 *header=NULL,U8 *footer=NULL)
{
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->root.next;
while (doc_ce!=doc) {
doc_ce->de_flags&=~DOCEF_FILTER_SKIP;
doc_ce=doc_ce->next;
}
doc->find_replace->filter_lines=0;
if (unlock)
DocUnlock(doc);
I64 i;
CDoc *doc=DocNew;
if (header) DocPrint(doc,"%s",header);
DocPrint(doc,"$$CM+LX,1,4$$$$BT,\"REPLACE\",LE=RSAC_REPLACE$$"
"$$CM+LX,17,0$$$$BT,\"SKIP\",LE=RSAC_SKIP$$"
"$$CM+LX,1,3$$$$BT,\"ALL\",LE=RSAC_ALL$$"
"$$CM+LX,17,0$$$$BT,\"CANCEL\",LE=DOCM_CANCEL$$\n");
if (footer) DocPrint(doc,"%s",footer);
i=PopUpMenu(doc);
DocDel(doc);
return i;
}
I64 EdFindReplace(CDoc *doc)
@@ -481,8 +487,6 @@ I64 EdFindReplace(CDoc *doc)
doc->cur_entry=doc_e;
if (cmd!=RSAC_ALL)
DocCenter(doc);
doc_e=doc->cur_entry;
src=doc->cur_col+doc_e->tag;
if (cmd!=RSAC_ALL) {
DocUnlock(doc);
cmd=PopUpReplaceSkipAllCancel("");
@@ -490,6 +494,8 @@ I64 EdFindReplace(CDoc *doc)
if (cmd<0)
goto fr_unlock_done;
}
doc_e=doc->cur_entry;
src=doc->cur_col+doc_e->tag;
if (cmd==RSAC_REPLACE || cmd==RSAC_ALL) {
dlen=StrLen(doc_e->tag);
doc_e->max_col=dlen+rlen-plen;
+284
View File
@@ -0,0 +1,284 @@
#help_index "DolDoc/Form"
U0 DocFormFwd(CDoc *doc,Bool giveup=FALSE)
{
CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e;
if (doc->flags & DOCF_FORM) {
if (doc_e==doc) goto ff_recover;
while (!Bt(doldoc.type_flags_form,doc_e->type_u8) &&
!(doc_e->de_flags&DOCEF_LINK) ||
doc_e->de_flags&DOCEF_SKIP_IN_FORM) {
doc_e=doc_e->next;
if (doc_e==doc) {
ff_recover:
doc->cur_col=0;
if (!giveup) {
doc->cur_entry=doc_e->last;
DocFormBwd(doc,TRUE);
} else
doc->cur_entry=doc;
return;
}
}
}
while (doc_e->type_u8==DOCT_INDENT)
doc_e=doc_e->next;
if (doc_e!=doc_e2) {
doc->cur_col=doc_e->min_col;
doc->cur_entry=doc_e;
}
}
U0 DocFormBwd(CDoc *doc,Bool giveup=FALSE)
{
CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e;
if (doc->flags & DOCF_FORM) {
while (!Bt(doldoc.type_flags_form,doc_e->type_u8) &&
!(doc_e->de_flags&DOCEF_LINK) ||
doc_e->de_flags&DOCEF_SKIP_IN_FORM) {
doc_e=doc_e->last;
if (doc_e==doc) {
doc->cur_col=0;
if (!giveup) {
doc->cur_entry=doc_e->next;
DocFormFwd(doc,TRUE);
} else
doc->cur_entry=doc;
return;
}
}
}
while (doc_e->type_u8==DOCT_INDENT)
doc_e=doc_e->next;
if (doc_e!=doc_e2) {
doc->cur_col=doc_e->min_col;
doc->cur_entry=doc_e;
}
}
U0 DocDataFmt(CDoc *doc,CDocEntry *doc_e,I64 d=DOCM_CANCEL)
{
I64 i;
U8 *ptr;
CHashDefineStr *temph;
if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR ||
doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) {
if (d==DOCM_CANCEL) {
if (doc_e->de_flags & DOCEF_DATA_IS_PTR) {
if (!(ptr=doc_e->data)) return;
} else
ptr=&doc_e->data;
switch(doc_e->raw_type) {
case RT_I0:
case RT_U0: d=0; break;
case RT_I8: d=*ptr(I8 *); break;
case RT_U8: d=*ptr(U8 *); break;
case RT_I16: d=*ptr(I16 *); break;
case RT_U16: d=*ptr(U16 *); break;
case RT_I32: d=*ptr(I32 *); break;
case RT_U32: d=*ptr(U32 *); break;
default: d=*ptr(I64 *);
}
}
if (doc_e->type_u8==DOCT_DATA) {
StrPrint(doc_e->tag,doc_e->aux_str,d,doc_e->my_fmt_data);
if (doc_e->de_flags & DOCEF_HAS_TERMINATOR) {
i=StrLen(doc_e->tag);
doc_e->tag[i++]='_';
doc_e->tag[i]=0;
}
doc_e->max_col=StrLen(doc_e->tag);
} else if (doc_e->de_flags & DOCEF_LST) {
if (doc_e->de_flags & DOCEF_DEFINE && (temph=HashFind(doc_e->define_str,
doc->win_task->hash_table,HTT_DEFINE_STR)) && 0<=d<temph->cnt) {
ptr=MStrPrint("[%s]",temph->sub_lst[d]);
Free(doc_e->tag);
doc_e->tag=StrNew(ptr,doc->mem_task);
Free(ptr);
} else {
Free(doc_e->tag);
doc_e->tag=StrNew("[]",doc->mem_task);
}
} else {
if (d)
doc_e->de_flags|=DOCEF_CHECKED_COLLAPSED;
else
doc_e->de_flags&=~DOCEF_CHECKED_COLLAPSED;
}
}
}
U0 DocDataScan(CDoc *doc,CDocEntry *doc_e)
{
I64 i,d;
U8 *ptr,*ptr1,*ptr2;
CHashDefineStr *temph;
if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR ||
doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) {
if (doc_e->de_flags & DOCEF_DATA_IS_PTR) {
if (!(ptr=doc_e->data)) return;
} else
ptr=&doc_e->data;
if (doc_e->type_u8==DOCT_DATA) {
i=StrLen(doc_e->tag);
if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)
doc_e->tag[--i]=0;
if (i>doc_e->len+doc_e->min_col)
doc_e->tag[doc_e->len+doc_e->min_col]=0;
if (RT_I8<=doc_e->raw_type<=RT_U32) {
StrScan(doc_e->tag,doc_e->aux_str,&d,doc_e->my_fmt_data);
if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)
doc_e->tag[i]='_';
} else if (RT_I64<=doc_e->raw_type<=RT_UF64) {
StrScan(doc_e->tag,doc_e->aux_str,ptr,doc_e->my_fmt_data);
if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)
doc_e->tag[i]='_';
return;
}
} else if (doc_e->de_flags & DOCEF_LST) {
d=0;
if (doc_e->tag && doc_e->de_flags & DOCEF_DEFINE &&
(temph=HashFind(doc_e->define_str,
doc->win_task->hash_table,HTT_DEFINE_STR))) {
ptr1=ptr2=StrNew(doc_e->tag);
if (*ptr2=='[') {
ptr2++;
i=StrLen(ptr2);
if (ptr2[i-1]==']')
ptr2[i-1]=0;
}
d=LstMatch(ptr2,temph->data);
Free(ptr1);
}
} else {
if (doc_e->de_flags & DOCEF_CHECKED_COLLAPSED)
d=TRUE;
else
d=FALSE;
}
switch(doc_e->raw_type) {
case RT_I8:
case RT_U8:
*ptr(U8 *)=d;
case RT_I0:
case RT_U0:
break;
case RT_I16:
case RT_U16:
*ptr(U16 *)=d;
break;
case RT_I32:
case RT_U32:
*ptr(U32 *)=d;
break;
default:
*ptr(I64 *)=d;
}
}
}
#help_index "DolDoc/Input;StdIn/DolDoc"
public Bool DocForm(U8 *_d,U8 *class_name=lastclass,
I64 dof_flags=0,U8 *header=NULL,U8 *footer=NULL)
{//User input. Supply a class name that has fmtstr definitions.
//See $LK,"::/Demo/DolDoc/Form.CPP"$ and $LK,"::/Demo/LastClass.CPP"$.
CMemberLst *ml;
CDocEntry *doc_e;
U8 *fmtstr;
CHashClass *tempc;
CDoc *doc;
Bool result=FALSE;
I64 old_border_src=Fs->border_src,has_action;
if (!(tempc=HashFind(class_name,Fs->hash_table,HTT_CLASS)))
return FALSE;
doc=DocNew;
doc->desc='Form';
if (header) DocPrint(doc,"%s",header);
doc->flags|=DOCF_OVERSTRIKE|DOCF_FORM;
if (dof_flags&DOF_MIN_SIZE)
doc->flags|=DOCF_MIN_SIZE;
ml=tempc->member_lst_and_root;
while (ml) {
if (fmtstr=MemberMetaData("fmtstr",ml)) {
doc_e=DocPrint(doc,"%s",fmtstr);
doc_e->data=_d+ml->offset;
doc_e->my_fmt_data=MemberMetaData("fmtdata",ml);
DocDataFmt(doc,doc_e);
}
ml=ml->next;
}
if (footer) DocPrint(doc,"%s",footer);
if (doc->root.next!=doc) {
Fs->border_src=BDS_CONST;
DocRecalc(doc);
if (DocEd(doc,dof_flags)) {
doc_e=doc->cur_entry;
result=TRUE;
if (doc_e!=doc) {
if (DocEntryRun(doc,doc_e,TRUE,&has_action)==DOCM_CANCEL && has_action)
result=FALSE;
DocUnlock(doc);
}
}
}
DocDel(doc);
Fs->border_src=old_border_src;
return result;
}
U0 DocMenuEndTaskCB()
{
WinToTop;
throw;
}
public I64 DocMenu(CDoc *m,I64 dof_flags=0)
{//Run menu chooser doc. Returns menu doc unlocked.
U8 *old_end_cb=Fs->task_end_cb;
Bool old_break_shift_esc=LBts(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC);
CDocEntry *doc_e;
I64 old_border_src=Fs->border_src,result=DOCM_CANCEL,has_action;
Fs->task_end_cb=&DocMenuEndTaskCB;
try {
if (m) {
m->desc='Menu';
Fs->border_src=BDS_CONST;
dm_restart:
if (DocEd(m,dof_flags)) {
doc_e=m->cur_entry;
if (doc_e!=m) {
result=DocEntryRun(m,doc_e,TRUE,&has_action);
DocUnlock(m);
if (!has_action) {
result=DOCM_CANCEL;
dof_flags|=DOF_DONT_HOME;
goto dm_restart;
}
}
}
}
} catch {
if (!Fs->except_ch) {
if (!(dof_flags & DOF_INTERCEPT_TASK_END))
Exit;
Fs->catch_except=TRUE;
}
}
LBEqu(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC,old_break_shift_esc);
Fs->border_src=old_border_src;
Fs->task_end_cb=old_end_cb;
return result;
}
public I64 PopUpMenu(CDoc *doc,I64 dof_flags=0)
{//Run menu chooser doc in PopUp win task.
doc->flags|=DOCF_MIN_SIZE | DOCF_FORM;
return PopUpPrint("DocMenu(0x%X,0x%X);",doc,dof_flags);
}
public Bool PopUpForm(U8 *_d,U8 *class_name=lastclass,
I64 dof_flags=DOF_MIN_SIZE,U8 *header=NULL,U8 *footer=NULL)
{//See $LK,"::/Demo/DolDoc/Form.CPP"$ and $LK,"::/Demo/LastClass.CPP"$.
return PopUpPrint("DocForm(0x%X,0x%X,0x%X,0x%X,0x%X);",_d,class_name,
dof_flags,header,footer);
}
+224
View File
@@ -0,0 +1,224 @@
#help_index "DolDoc"
U0 EdUndoFilter(CDoc *doc)
{
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->root.next;
while (doc_ce!=doc) {
doc_ce->de_flags&=~DOCEF_FILTER_SKIP;
doc_ce=doc_ce->next;
}
doc->find_replace->filter_lines=0;
if (unlock)
DocUnlock(doc);
}
public I64 DocGetKey(I64 *_sc=NULL)
{//Called by $LK,"View",A="MN:View"$. You probably don't need this.
I64 ch,sc;
Bool cont,old_key_desc;
do {
old_key_desc=LBtr(&Fs->win_inhibit,WIf_SELF_KEY_DESC);
do ch=GetKey(&sc,TRUE);
while (sc&SCF_KEY_DESC);
LBEqu(&Fs->win_inhibit,WIf_SELF_KEY_DESC,old_key_desc);
DocRecalc(DocPut);
cont=FALSE;
if ((ch==CH_ESC || ch==CH_SHIFT_ESC) && //Check for exit filter mode
DocPut && DocPut->find_replace->filter_lines) {
EdUndoFilter(DocPut);
cont=TRUE;
}
} while (cont);
if (_sc) *_sc=sc;
return ch;
}
#help_index "DolDoc/Input;StdIn/DolDoc"
public U8 *DocScanLine(CDoc *doc,CDocEntry *doc_e,
I64 *cur_col=NULL,CDocEntry **_do_e_end=NULL)
{//Start at entry in doc,make and return one line as str.
CDocEntry *doc_e2=doc_e;
Bool unlock=DocLock(doc);
U8 *dst,*src,*start,*result;
I64 i=0;
if (cur_col)
*cur_col=-1;
while (doc_e2!=doc && doc_e2->type_u8!=DOCT_NEW_LINE) {
if (doc_e2->de_flags&DOCEF_TAG && doc_e2->tag) {
src=doc_e2->tag;
i+=StrLen(src);
} else if (doc_e2->type_u8==DOCT_TAB)
i++;
doc_e2=doc_e2->next;
}
result=MAlloc(i+1);
dst=result;
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE) {
start=dst;
if (doc_e->de_flags&DOCEF_TAG && doc_e->tag) {
src=doc_e->tag;
while (*src)
*dst++=*src++;
} else if (doc_e->type_u8==DOCT_TAB)
*dst++='\t';
if (doc_e==doc->cur_entry && cur_col)
*cur_col=start-result+doc->cur_col;
doc_e=doc_e->next;
}
if (_do_e_end) *_do_e_end=doc_e;
*dst=0;
if (doc_e==doc->cur_entry && cur_col && !doc->cur_col)
*cur_col=dst-result;
if (unlock)
DocUnlock(doc);
return result;
}
U8 *DocGetStr2(I64 flags=0)
{//$LK,"Flags",A="MN:GSF_SHIFT_ESC_EXIT"$
CDoc *doc;
CDocEntry *doc_e,*doc_e_end;
U8 *st,*st2,*result;
I64 ch,sc;
"$$PT$$";
do {
ch=DocGetKey(&sc);
if (ch==CH_ESC) {
if (doc=DocPut) {
DocLock(doc);
if (doc->doc_signature==DOC_SIGNATURE_VAL && doc->cur_entry!=doc) {
doc_e=DocEntryCopy(doc,doc->cur_entry);
DocBottom(doc);
DocEntryRun(doc,doc_e,TRUE);
DocEntryDel(doc,doc_e);
}
DocUnlock(doc);
}
if (flags&GSF_WITH_NEW_LINE)
break;
} if (ch==CH_SHIFT_ESC) {
if (flags&GSF_SHIFT_ESC_EXIT)
Exit;
else {
result=StrNew("");
goto gs_done;
}
}
//<CTRL-SHIFT-ENTER> is a blank line without entry
} while (flags&GSF_WITH_NEW_LINE || ch!='\n' ||
sc&SCF_CTRL && sc&SCF_SHIFT);
doc=DocPut;
DocLock(doc);
if (flags&GSF_WITH_NEW_LINE) {
doc_e=doc->cur_entry;
do doc_e=doc_e->last;
while (doc_e!=doc && doc_e->type_u8!=DOCT_PMT);
doc_e=doc_e->next;
if (result=DocScanLine(doc,doc_e,NULL,&doc_e_end)) {
while (doc_e_end!=doc && doc_e_end->type_u8==DOCT_NEW_LINE) {
st2=MStrPrint("%s\n",result);
Free(result);
result=st2;
if (st=DocScanLine(doc,doc_e_end->next,NULL,&doc_e_end)) {
st2=MStrPrint("%s%s",result,st);
Free(st);
Free(result);
result=st2;
}
}
}
} else {
doc_e=doc->cur_entry;
do doc_e=doc_e->last;
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE &&
doc_e->type_u8!=DOCT_PMT);
if (doc_e!=doc && doc_e->type_u8!=DOCT_PMT) {
do doc_e=doc_e->last;
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE &&
doc_e->type_u8!=DOCT_PMT);
}
doc_e=doc_e->next;
result=DocScanLine(doc,doc_e,NULL);
}
DocUnlock(doc);
gs_done:
"$$PT$$$$FG$$$$BG$$";
return result;
}
#help_index "Keyboard Devices;Char/Input;StdIn"
public I64 GetI64(U8 *msg=NULL,I64 dft=0,I64 lo=MIN_I64,I64 hi=MAX_I64)
{//Prompt user for I64 expression.
Bool okay;
U8 *st;
I64 result;
while (TRUE) {
if (msg)
"" msg,dft;
st=GetStr;
if (!*st) {
Free(st);
return dft;
}
try {
result=ExePrint2("ToI64(%s);",st);
okay=TRUE;
} catch {
Fs->catch_except=TRUE;
okay=FALSE;
}
Free(st);
if (okay && lo<=result<=hi)
return result;
}
}
public F64 GetF64(U8 *msg=NULL,F64 dft=0,F64 lo=MIN_F64,F64 hi=MAX_F64)
{//Prompt user for F64 expression.
Bool okay;
U8 *st;
F64 result;
while (TRUE) {
if (msg)
"" msg,dft;
st=GetStr;
if (!*st) {
Free(st);
return dft;
}
try {
result=ExePrint2("ToF64(%s);",st)(F64);
okay=TRUE;
} catch {
Fs->catch_except=TRUE;
okay=FALSE;
}
Free(st);
if (okay && lo<=result<=hi)
return result;
}
}
public CDate GetDate(U8 *msg=NULL,CDate dft=MIN_I64,
CDate lo=MIN_I64,CDate hi=MAX_I64)
{//Prompt user for date expression. (Use $LK,"Now",A="MN:Now"$() if you want current time.)
U8 *st;
CDate result;
if (dft==MIN_I64) dft=Now;
while (TRUE) {
if (msg)
"" msg,dft,dft;
st=GetStr;
if (!*st) {
Free(st);
return dft;
}
result=Str2Date(st);
Free(st);
if (result>=lo && result<=hi)
return result;
}
}
+161
View File
@@ -0,0 +1,161 @@
#help_index "Graphics/Input"
public I64 PopUpColor(U8 *header=NULL,
Bool allow_transparent=TRUE,Bool allow_dft=TRUE)
{//Chooser for 16-color, default or transparent.
I64 i;
CDoc *doc=DocNew;
if (header)
DocPrint(doc,"%s",header);
if (allow_transparent)
DocPrint(doc,"$$MU,\"TRANSPARENT\",LE=TRANSPARENT$$\n");
for (i=0;i<NUM_COLORS;i++)
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-8Z__\",LE=%d$$$$BG$$\n",i,i,"ST_COLORS",i);
if (allow_dft)
DocPrint(doc,"$$BG,WHITE$$$$MU,\"DEFAULT\",LE=DOC_DFT$$$$BG$$");
i=PopUpMenu(doc);
DocDel(doc);
return i;
}
public I64 PopUpColorLighting(U8 *header=NULL)
{//Chooser for std TempleOS $LK,"DCLighting",A="MN:DCLighting"$() color.
I64 i;
CDoc *doc=DocNew;
if (header)
DocPrint(doc,"%s",header);
DocPrint(doc,"\nSingle-Sided means both sides same color."
"\nDouble-Sided means back side darker."
"\n"
"\nHalf-Range means 0 to [0,7]"
"\n [8,15]-8 to [8,15]"
"\nFull-Range means 0 to [0,7] to [0,7]+8"
"\n");
DocPrint(doc,
"\n$$LTPURPLE$$Single-Sided Full-Range Double-Sided Full-Range\n$$BLACK$$");
for (i=0;i<NUM_COLORS/2;i++) {
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",LE=%d$$$$BG$$ ",i,i,"ST_COLORS",i);
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",LE=%d$$$$BG$$\n",i,i,"ST_COLORS",
ROPF_TWO_SIDED+i);
}
DocPrint(doc,
"\n$$LTPURPLE$$Single-Sided Half-Range Double-Sided Half-Range\n$$BLACK$$");
for (i=0;i<NUM_COLORS;i++) {
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",LE=%d$$$$BG$$ ",
i,i,"ST_COLORS",ROPF_HALF_RANGE_COLOR+i);
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",LE=%d$$$$BG$$\n",
i,i,"ST_COLORS",ROPF_TWO_SIDED+ROPF_HALF_RANGE_COLOR+i);
}
i=PopUpMenu(doc);
DocDel(doc);
return i;
}
class CTransformForm
{
F64 x_scale fmtstr "$$DA-TRM,32,RT=F64,A=\"X Scale :%12.6f\"$$\n";
F64 y_scale fmtstr "$$DA-TRM,32,RT=F64,A=\"Y Scale :%12.6f\"$$\n";
F64 z_scale fmtstr "$$DA-TRM,32,RT=F64,A=\"Z Scale :%12.6f\"$$\n";
F64 é_z fmtstr
"\nAngles are in degrees\n$$DA-TRM,32,RT=F64,A=\"Z-Axis :%12.6f\"$$\n";
F64 é_y fmtstr "$$DA-TRM,32,RT=F64,A=\"Y-Axis :%12.6f\"$$\n";
F64 é_x fmtstr "$$DA-TRM,32,RT=F64,A=\"X-Axis :%12.6f\"$$\n";
F64 x_offset fmtstr "\n$$DA-TRM,32,RT=F64,A=\"X Offset:%12.6f\"$$\n";
F64 y_offset fmtstr "$$DA-TRM,32,RT=F64,A=\"Y Offset:%12.6f\"$$\n";
F64 z_offset fmtstr "$$DA-TRM,32,RT=F64,A=\"Z Offset:%12.6f\"$$\n";
};
Bool PopUpTransform(I64 *r)
{
CTransformForm *tf=MAlloc(sizeof(CTransformForm));
tf->x_scale=1.0;
tf->y_scale=1.0;
tf->z_scale=1.0;
tf->é_x=0.0;
tf->é_y=0.0;
tf->é_z=0.0;
tf->x_offset=0.0;
tf->y_offset=0.0;
tf->z_offset=0.0;
if (PopUpForm(tf)) {
MemSet(r,0,16*sizeof(I64));
r[0] =tf->x_scale*GR_SCALE;
r[5] =tf->y_scale*GR_SCALE;
r[10]=tf->z_scale*GR_SCALE;
r[15]=GR_SCALE;
Mat4x4RotZ(r,tf->é_z*ã/180.0);
Mat4x4RotY(r,tf->é_y*ã/180.0);
Mat4x4RotX(r,tf->é_x*ã/180.0);
r[3] =tf->x_offset*GR_SCALE;
r[7] =tf->y_offset*GR_SCALE;
r[11]=tf->z_offset*GR_SCALE;
return TRUE;
} else
return FALSE;
}
#define PU_SPACING 10
U0 DrawIt(CTask *task,CDC *dc)
{
I64 i,j,i1,j1;
CDoc *doc=DocPut(task);
for (j=0;j<17;j++)
for (i=0;i<17;i++) {
if (j<16)
j1=j;
else
j1=TRANSPARENT;
if (i<16)
i1=i;
else
i1=TRANSPARENT;
dc->color=j1+i1<<16+ROPF_DITHER;
GrRect(dc,i*PU_SPACING,j*PU_SPACING+FramePtr("DitherFrame",task),
PU_SPACING,PU_SPACING);
}
i=(17*PU_SPACING+FONT_WIDTH-1)/FONT_WIDTH;
if (doc->max_x>i) i=doc->max_x;
WinHorz(task->win_left,task->win_left+i,task);
WinVert(task->win_top,task->win_top+doc->max_y+
(17*PU_SPACING+FONT_WIDTH-1)/FONT_WIDTH,task);
}
I64 DitherColor2(U8 *header=NULL)
{
I64 msg_code,a1,a2,result=-1,i,j;
DocClear;
"%s",header;
DocRecalc(DocPut);
FramePtrAdd("DitherFrame",(DocPut->max_y+1)*FONT_HEIGHT);
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
Fs->draw_it=&DrawIt;
do {
msg_code=GetMsg(&a1,&a2,1<<MSG_IP_L_DOWN|1<<MSG_KEY_DOWN);
if (msg_code==MSG_IP_L_DOWN) {
msg_code=GetMsg(&a1,&a2,1<<MSG_IP_L_UP);
i=a1/PU_SPACING;
j=(a2-FramePtr("DitherFrame"))/PU_SPACING;
if (a1>=0 && a2>=0 && 0<=j<17 && 0<=i<17) {
if (j==16) j=TRANSPARENT;
if (i==16) i=TRANSPARENT;
result=j+i<<16+ROPF_DITHER;
goto dc_done;
}
}
} while (!(msg_code==MSG_KEY_DOWN && (a1==CH_ESC || a1==CH_SHIFT_ESC)));
do GetMsg(&a1,&a2,1<<MSG_KEY_UP);
while (!a1);
dc_done:
SettingsPop;
FramePtrDel("DitherFrame");
return result;
}
public I64 PopUpColorDither(U8 *header=NULL)
{//Chooser for 2 x 16 colors or transparent.
U8 buf[STR_LEN];
StrPrint(buf,"DitherColor2(0x%X);",header);
return PopUp(buf,Fs);
}
+1 -1
View File
@@ -1,7 +1,7 @@
#help_index "DolDoc/Misc"
U32 *DocHighlight(CDocEntry *doc_e,U8 *src,I64 len,I64 _temp_u32_attr)
{//Be aware of $LK,"::/Adam/Utils/ToHtml.CPP"$.
{//Be aware of $LK,"::/Adam/Opt/Utils/ToHtml.CPP"$.
U32 *result=MAlloc((len+1)*sizeof(U32)),*dst=result;
U8 *ptr;
CDocSettings *s=&doc_e->settings;
+344
View File
@@ -0,0 +1,344 @@
#help_index "DolDoc/Link"
/* See $LK,"TempleOS Link Types",A="MN:ST_LINK_TYPES"$.
"filename"
"FI:filename"
"FA:haystack_filename,needle_anchor_str"
"FF:haystack_filename,needle_str"
"FF:haystack_filename,needle_str:occurnum"
"FL:filename,linenum"
"MN:SymName"
"PI:filename"
"PF:haystack_filename,needle_str"
"PF:haystack_filename,needle_str:occurnum"
"PL:filename,linenum"
"BF:haystack_bible_book,needle_str"
"DF:word"
"DF:word,defnum"
"HI:index"
"AD:code_address_number"
To edit a doc structure already in memory. See $LK,"SpriteEdText",A="MN:SpriteEdText"$().
"AI:doc_address"
"AA:haystack_doc_address,needle_anchor_str"
"AF:haystack_doc_address,needle_str"
"AF:haystack_doc_address,needle_str:occurnum"
"AL:doc_address,linenum"
*/
#define LK_FILE 0
#define LK_FILE_ANCHOR 1
#define LK_FILE_FIND 2
#define LK_FILE_LINE 3
#define LK_MAN_PAGE 4
#define LK_PLAIN 5
#define LK_PLAIN_FIND 6
#define LK_PLAIN_LINE 7
#define LK_BIBLE_FIND 8
#define LK_DEF 9
#define LK_HELP_INDEX 10
#define LK_ADDR 11
#define LK_DOC 12 //See $LK,"SpriteEdText",A="MN:SpriteEdText"$()
#define LK_DOC_ANCHOR 13
#define LK_DOC_FIND 14
#define LK_DOC_LINE 15
#define LK_PLACE_ANCHOR 16
public U8 *DocEntryLink(CDoc *doc,CDocEntry *doc_e)
{//MAlloc new str, either tag or aux_str if link.
if (doc_e->de_flags&DOCEF_LINK) {
if (doc_e->de_flags & DOCEF_AUX_STR)
return StrNew(doc_e->aux_str,doc->mem_task);
else if (doc_e->de_flags & DOCEF_TAG)
return StrNew(doc_e->tag,doc->mem_task);
}
return NULL;
}
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) && DocEd(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;
}
#define DFT_ADDR_LINK_BIN_SIZE 64
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=blkdev.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;
}
public Bool DocLinkChk(U8 *link_st)
{//Check for bad $LK,"Editor Link",A="MN:LK_FILE"$.
U8 *filename,*st;
Bool result=FALSE;
if (link_st) {
switch (EdLinkCvt(link_st,&filename)) {
case -1:
break;
case LK_FILE_LINE:
case LK_PLAIN_LINE:
case LK_FILE:
//We don't check line number
result=FileFind(filename,,
FUF_JUST_FILES|FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);
break;
case LK_BIBLE_FIND:
st=StrNew(link_st+3);
if (StrOcc(st,','))
StrLastRem(st,",");
if (DefineMatch(st,"ST_BIBLE_BOOKS",LMF_IGNORE_CASE)>=0)
result=TRUE;
Free(st);
break;
default://TODO: Need to validate HI: and DF:
if (Ed(link_st,EDF_BAIL))
result=TRUE;
}
Free(filename);
}
return result;
}
public U8 *DocLinkFile(U8 *link_st,CTask *mem_task=NULL)
{//Return the file for an $LK,"Editor Link Types",A="MN:LK_FILE"$.
U8 *filename=NULL,*st,*result=NULL;
if (link_st) {
switch (EdLinkCvt(link_st,&filename)) {
case LK_FILE:
case LK_FILE_ANCHOR:
case LK_FILE_FIND:
case LK_FILE_LINE:
case LK_PLAIN:
case LK_PLAIN_FIND:
case LK_PLAIN_LINE:
st=FileNameAbs(filename,FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);
result=StrNew(st);
Free(st);
break;
case LK_BIBLE_FIND:
result=StrNew(BIBLE_FILENAME,mem_task);
break;
}
Free(filename);
}
return result;
}
-7
View File
@@ -58,7 +58,6 @@ U8 *SysMacro2Str(CSrvCmd *macro_root)
I64 cnt=1; //terminating zero
U8 *ptr,*m;
CMacroTemp *tempmt,*tempmt1,root;
Bool old_preempt=Preempt;
LBtr(&sys_semas[SYS_SEMA_RECORD_MACRO],0);
QueInit(&root);
@@ -102,18 +101,15 @@ U8 *SysMacro2Str(CSrvCmd *macro_root)
tempmt=tempmt1;
}
*ptr=0;
Preempt(old_preempt);
return m;
}
U0 PlaySysMacro(I64 n=1)
{
CTask *task=sys_focus_task;
Bool old_preempt;
U8 *m;
if (TaskValidate(task)) {
LBtr(&sys_semas[SYS_SEMA_RECORD_MACRO],0);
old_preempt=Preempt;
m=SysMacro2Str(&sys_macro_root);
while (n-- && TaskValidate(task)) {
if (task==Fs)
@@ -122,20 +118,17 @@ U0 PlaySysMacro(I64 n=1)
XTalkStrWait(task,"%s",m);
}
Free(m);
Preempt(old_preempt);
}
}
U0 EdInsCapturedMacro()
{
Bool old_preempt=Preempt;
U8 *st=SysMacro2Str(&sys_macro_root);
if (sys_focus_task) {
XTalk(sys_focus_task,"$$MA+LA,T=\"%s\",LM=\"%Q\"$$",
captured_macro_name,st);
Free(st);
}
Preempt(old_preempt);
}
#define SM_RECORD 0
-602
View File
@@ -1,602 +0,0 @@
#help_index "DolDoc/Cmd Line (Typically);Cmd Line (Typically)"
public Bool Ed(U8 *link_st,I64 edf_dof_flags=0)
{//Invoke document editor.
U8 *filename,*needle_str;
I64 i,num;
Bool cont,result=FALSE;
CDoc *doc;
switch (i=EdLinkCvt(link_st,&filename,&needle_str,&num,edf_dof_flags)) {
case -1:
break;
case LK_DEF:
doc=DocNew;
doc->desc='DictDef';
ACDDefsPut(doc,filename,num);
goto ej_doc;
case LK_HELP_INDEX:
doc=DocNew;
doc->desc='HelpIndx';
DocHelpIndex(doc,filename);
ej_doc:
if (!(edf_dof_flags&EDF_BAIL)) {
DocEd(doc);
DocDel(doc);
}
if (!(edf_dof_flags&EDF_WAS_WRITE))
result=TRUE;
break;
default:
if (IsRaw)
result=EdLite(filename,num,edf_dof_flags);
else {
cont=TRUE;
if (!(edf_dof_flags&EDF_BAIL) && !(LK_DOC<=i<=LK_DOC_LINE) &&
!FilesFindMatch(filename,FILEMASK_TXT) &&
!PopUpCancelOk(ST_WARN_ST "Not Text File\n\n"))
cont=FALSE;
if (cont)
result=DocFileEd(i,filename,needle_str,&num,edf_dof_flags);
}
}
Free(filename);
Free(needle_str);
return result;
}
public Bool Plain(U8 *filename,I64 edf_dof_flags=0)
{//Edit document in plain text mode, so dollar signs are not special.
Bool result;
U8 *st=MStrPrint("PI:%s",filename);
result=Ed(st,edf_dof_flags);
Free(st);
return result;
}
#help_index "DolDoc"
public Bool DocLinkChk(U8 *link_st)
{//Check for bad $LK,"Editor Link",A="MN:LK_FILE"$.
U8 *filename,*st;
Bool result=FALSE;
if (link_st) {
switch (EdLinkCvt(link_st,&filename)) {
case -1:
break;
case LK_FILE_LINE:
case LK_PLAIN_LINE:
case LK_FILE:
//We don't check line number
result=FileFind(filename,,
FUF_JUST_FILES|FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);
break;
case LK_BIBLE_FIND:
st=StrNew(link_st+3);
if (StrOcc(st,','))
StrLastRem(st,",");
if (DefineMatch(st,"ST_BIBLE_BOOKS",LMF_IGNORE_CASE)>=0)
result=TRUE;
Free(st);
break;
default://TODO: Need to validate HI: and DF:
if (Ed(link_st,EDF_BAIL))
result=TRUE;
}
Free(filename);
}
return result;
}
public U8 *DocLinkFile(U8 *link_st,CTask *mem_task=NULL)
{//Return the file for an $LK,"Editor Link Types",A="MN:LK_FILE"$.
U8 *filename=NULL,*st,*result=NULL;
if (link_st) {
switch (EdLinkCvt(link_st,&filename)) {
case LK_FILE:
case LK_FILE_ANCHOR:
case LK_FILE_FIND:
case LK_FILE_LINE:
case LK_PLAIN:
case LK_PLAIN_FIND:
case LK_PLAIN_LINE:
st=FileNameAbs(filename,FUF_Z_OR_NOT_Z|FUF_SCAN_PARENTS);
result=StrNew(st);
Free(st);
break;
case LK_BIBLE_FIND:
result=StrNew(BIBLE_FILENAME,mem_task);
break;
}
Free(filename);
}
return result;
}
#help_index "DolDoc/Task;StdOut/Task"
public CDoc *DocBorderNew(CDoc *pdoc)
{//Make new std border doc.
CDocEntry *doc_e;
CDoc *bdoc;
bdoc=DocNew;
bdoc->flags|=DOCF_BORDER_DOC;
if (pdoc) {
DocPrint(bdoc,"$$CM+H+BY+RX+NC,-7,1$$");
doc_e=DocPrint(bdoc,"$$TX+H+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdFilterCB;
doc_e=DocPrint(bdoc,"$$TX+H+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdOverStrikeCB;
doc_e=DocPrint(bdoc,"$$TX+H+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdDollarCB;
DocPrint(bdoc,"$$CM+H+BY+RX+NC,-18,1$$");
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdMoreCB;
doc_e=DocPrint(bdoc,"$$TX+H+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdDollarTypeCB;
}
DocPrint(bdoc,"$$CM+H+TY+NC,0,-1$$");
doc_e=DocPrint(bdoc,"$$DA+H-TRM-P+BD+RD+CX+IV,140,A=\"%%s...\",SCX=15$$");
doc_e->data=&Fs->task_title;
DocDataFmt(bdoc,doc_e);
DocPrint(bdoc,"$$CM+H+NC,1,0$$$$TX+H+BD+IV,\"%X\"$$",Fs);
DocPrint(bdoc,"$$TX+H+RX+BD,\"[X]\"$$");
DocPrint(bdoc,"$$BK,1$$$$TX+H+LX+BD,\"MENU\"$$$$BK,0$$");
return bdoc;
}
public U0 DocTermNew()
{//Make into term win task with Put/Display/Border docs.
Bool old_preempt=Preempt;
CDoc *pdoc=DocNew;
pdoc->right_click_link=&TermRightClickLink;
pdoc->max_entries=4096;
Fs->border_src=BDS_CUR_DRV;
pdoc->desc='Term';
Fs->put_doc=Fs->display_doc=pdoc;
Fs->border_doc=DocBorderNew(pdoc);
Fs->cur_menu=MenuFile("::/Doc/EdPullDown.TXT");
WinScrollsInit(Fs);
Preempt(old_preempt);
Raw(OFF);
}
#help_index "DolDoc/Input;StdIn/DolDoc"
public U8 *DocScanLine(CDoc *doc,CDocEntry *doc_e,
I64 *cur_col=NULL,CDocEntry **_do_e_end=NULL)
{//Start at entry in doc,make and return one line as str.
CDocEntry *doc_e2=doc_e;
Bool unlock=DocLock(doc);
U8 *dst,*src,*start,*result;
I64 i=0;
if (cur_col)
*cur_col=-1;
while (doc_e2!=doc && doc_e2->type_u8!=DOCT_NEW_LINE) {
if (doc_e2->de_flags&DOCEF_TAG && doc_e2->tag) {
src=doc_e2->tag;
i+=StrLen(src);
} else if (doc_e2->type_u8==DOCT_TAB)
i++;
doc_e2=doc_e2->next;
}
result=MAlloc(i+1);
dst=result;
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE) {
start=dst;
if (doc_e->de_flags&DOCEF_TAG && doc_e->tag) {
src=doc_e->tag;
while (*src)
*dst++=*src++;
} else if (doc_e->type_u8==DOCT_TAB)
*dst++='\t';
if (doc_e==doc->cur_entry && cur_col)
*cur_col=start-result+doc->cur_col;
doc_e=doc_e->next;
}
if (_do_e_end) *_do_e_end=doc_e;
*dst=0;
if (doc_e==doc->cur_entry && cur_col && !doc->cur_col)
*cur_col=dst-result;
if (unlock)
DocUnlock(doc);
return result;
}
#help_index "DolDoc/Output;StdOut/DolDoc"
U0 DocDump(CDoc *doc,I64 uS_delay=0)
{
U8 *st;
CDocEntry *doc_e,*doc_e2;
Bool unlock=DocLock(doc);
doc_e=doc->root.next;
while (doc_e!=doc) {
st=DocScanLine(doc,doc_e,NULL,&doc_e2);
"%s",st;
Free(st);
doc_e=doc_e2;
if (doc_e->type_u8==DOCT_NEW_LINE) {
'\n';
BusyWait(uS_delay);
doc_e=doc_e->next;
}
}
if (unlock)
DocUnlock(doc);
}
public CDocEntry *DocPutLine(CDoc *doc=NULL,CDocEntry *doc_e)
{//Send line from other doc to StdOut $LK,"DocPut",A="MN:DocPut"$.
I64 ch;
U8 *ptr,*ptr2;
Bool unlock;
if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
return NULL;
unlock=DocLock(doc);
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE) {
if (doc_e->de_flags&DOCEF_TAG) {
ptr=doc_e->tag;
do {
ptr2=ptr;
while (ch=*ptr)
if (ch=='$$')
break;
else
ptr++;
*ptr=0;
"%s",ptr2;
*ptr=ch;
if (ch=='$$') {
"$$$$";
ptr++;
}
} while (ch);
} else if (doc_e->type_u8==DOCT_TAB)
'\t';
doc_e=doc_e->next;
}
'\n';
if (doc_e!=doc)
doc_e=doc_e->next;
if (unlock)
DocUnlock(doc);
return doc_e;
}
#help_index "DolDoc/Input;StdIn/DolDoc"
U8 *DocGetStr2(I64 flags=0)
{//$LK,"Flags",A="MN:GSF_SHIFT_ESC_EXIT"$
CDoc *doc;
CDocEntry *doc_e,*doc_e_end;
Bool old_preempt=IsPreempt;
U8 *st,*st2,*result;
I64 ch,sc;
"$$PT$$";
do {
ch=DocGetKey(&sc);
if (ch==CH_ESC) {
if (doc=DocPut) {
DocLock(doc);
if (doc->doc_signature==DOC_SIGNATURE_VAL && doc->cur_entry!=doc) {
doc_e=DocEntryCopy(doc,doc->cur_entry);
DocBottom(doc);
DocEntryRun(doc,doc_e,TRUE);
DocEntryDel(doc,doc_e);
}
DocUnlock(doc);
}
if (flags&GSF_WITH_NEW_LINE)
break;
} if (ch==CH_SHIFT_ESC) {
if (flags&GSF_SHIFT_ESC_EXIT)
Exit;
else {
result=StrNew("");
goto gs_done;
}
}
//<CTRL-SHIFT-ENTER> is a blank line without entry
} while (flags&GSF_WITH_NEW_LINE || ch!='\n' ||
sc & SCF_CTRL && sc & SCF_SHIFT);
Preempt;
doc=DocPut;
DocLock(doc);
if (flags&GSF_WITH_NEW_LINE) {
doc_e=doc->cur_entry;
do doc_e=doc_e->last;
while (doc_e!=doc && doc_e->type_u8!=DOCT_PMT);
doc_e=doc_e->next;
if (result=DocScanLine(doc,doc_e,NULL,&doc_e_end)) {
while (doc_e_end!=doc && doc_e_end->type_u8==DOCT_NEW_LINE) {
st2=MStrPrint("%s\n",result);
Free(result);
result=st2;
if (st=DocScanLine(doc,doc_e_end->next,NULL,&doc_e_end)) {
st2=MStrPrint("%s%s",result,st);
Free(st);
Free(result);
result=st2;
}
}
}
} else {
doc_e=doc->cur_entry;
do doc_e=doc_e->last;
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE &&
doc_e->type_u8!=DOCT_PMT);
if (doc_e!=doc && doc_e->type_u8!=DOCT_PMT) {
do doc_e=doc_e->last;
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE &&
doc_e->type_u8!=DOCT_PMT);
}
doc_e=doc_e->next;
result=DocScanLine(doc,doc_e,NULL);
}
DocUnlock(doc);
gs_done:
"$$PT$$$$FG$$$$BG$$";
Preempt(old_preempt);
return result;
}
#help_index "Keyboard Devices;Char/Input;StdIn"
public I64 GetI64(U8 *msg=NULL,I64 dft=0,I64 lo=MIN_I64,I64 hi=MAX_I64)
{//Prompt user for I64 expression.
Bool okay;
U8 *st;
I64 result;
while (TRUE) {
if (msg)
"" msg,dft;
st=GetStr;
if (!*st) {
Free(st);
return dft;
}
try {
result=ExePrint2("ToI64(%s);",st);
okay=TRUE;
} catch {
Fs->catch_except=TRUE;
okay=FALSE;
}
Free(st);
if (okay && lo<=result<=hi)
return result;
}
}
public F64 GetF64(U8 *msg=NULL,F64 dft=0,F64 lo=MIN_F64,F64 hi=MAX_F64)
{//Prompt user for F64 expression.
Bool okay;
U8 *st;
F64 result;
while (TRUE) {
if (msg)
"" msg,dft;
st=GetStr;
if (!*st) {
Free(st);
return dft;
}
try {
result=ExePrint2("ToF64(%s);",st)(F64);
okay=TRUE;
} catch {
Fs->catch_except=TRUE;
okay=FALSE;
}
Free(st);
if (okay && lo<=result<=hi)
return result;
}
}
public CDate GetDate(U8 *msg=NULL,CDate dft=MIN_I64,
CDate lo=MIN_I64,CDate hi=MAX_I64)
{//Prompt user for date expression. (Use $LK,"Now",A="MN:Now"$() if you want current time.)
U8 *st;
CDate result;
if (dft==MIN_I64) dft=Now;
while (TRUE) {
if (msg)
"" msg,dft,dft;
st=GetStr;
if (!*st) {
Free(st);
return dft;
}
result=Str2Date(st);
Free(st);
if (result>=lo && result<=hi)
return result;
}
}
#help_index "DolDoc"
#define RIGHT_INCLUDE 0
#define RIGHT_AINCLUDE 1
#define RIGHT_COPY 2
#define RIGHT_MOVE 3
#define RIGHT_DELETE 4
#define RIGHT_TYPE 5
#define RIGHT_ED 6
#define RIGHT_PLAIN 7
#define RIGHT_AUTOFILE 8
I64 PopUpTermRight(U8 *header)
{
I64 i;
CDoc *doc=DocNew;
if (header) DocPrint(doc,"%s",header);
DocPrint(doc,"\n\n"
"TXT=%s\nJIT=%s\nGRA=%s"
"$$CM+LX,1,3 $$$$BT,\"INCLUDE JIT\",LE=RIGHT_INCLUDE$$"
"$$CM+LX,26,0$$$$BT,\"ADAM_INCLUDE JIT\",LE=RIGHT_AINCLUDE$$"
"$$CM+LX,1,3 $$$$BT,\"COPY \",LE=RIGHT_COPY$$"
"$$CM+LX,26,0$$$$BT,\"MOVE OR RENAME \",LE=RIGHT_MOVE$$"
"$$CM+LX,1,3 $$$$BT,\"DELETE \",LE=RIGHT_DELETE$$"
"$$CM+LX,26,0$$$$BT,\"TYPE TXT;GRA\",LE=RIGHT_TYPE$$"
"$$CM+LX,1,3 $$$$BT,\"ED TXT\",LE=RIGHT_ED$$"
"$$CM+LX,26,0$$$$BT,\"PLAIN ED TXT\",LE=RIGHT_PLAIN$$"
"$$CM+LX,1,3 $$$$BT,\"CANCEL \",LE=DOCM_CANCEL$$"
"$$CM+LX,26,0$$$$BT,\"AUTOFILE AUT\",LE=RIGHT_AUTOFILE$$\n",
FILEMASK_TXT,FILEMASK_JIT,FILEMASK_GRA);
i=PopUpMenu(doc);
DocDel(doc);
return i;
}
I64 EdLeftClickLink(CDoc *doc,CDocEntry *doc_e)
{//Called with doc locked, exit unlocked
Bool result;
U8 *st;
if (st=DocEntryLink(doc,doc_e)) {
DocUnlock(doc);
if (doc_e->de_flags & DOCEF_POPUP)
result=PopUpEd(st);
else
result=Ed(st);
Free(st);
return result;
}
}
I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
{//Called with doc locked, exit unlocked
Bool send_new_line=FALSE,result=FALSE;
U8 *st,*st2;
I64 i;
CEdFileName fn;
if (st2=DocEntryLink(doc,doc_e)) {
if (st=DocLinkFile(st2)) {
DocUnlock(doc);
if ((i=PopUpTermRight(st))>=0) {
DocBottom(doc);
switch (i) {
case RIGHT_INCLUDE:
if (FileExtDot(st) && !FilesFindMatch(st,FILEMASK_JIT)) {
if (!PopUpCancelOk(ST_WARN_ST "Not .CPP File\n\n")) {
send_new_line=TRUE;
break;
}
}
"#include \"%s\";\n$$PT$$$$FG$$$$BG$$",st;
WinZBufUpdate;
ExeFile(st);
result=TRUE;
break;
case RIGHT_AINCLUDE:
if (FileExtDot(st) && !FilesFindMatch(st,FILEMASK_JIT)) {
if (!PopUpCancelOk(ST_WARN_ST "Not .CPP File\n\n")) {
send_new_line=TRUE;
break;
}
}
"Adam(\"#include \\\"%s\\\"\" );\n$$PT$$$$FG$$$$BG$$",st;
WinZBufUpdate;
AdamFile(st,FALSE);
result=TRUE;
break;
case RIGHT_COPY:
StrCpy(fn.name,st);
if (DocForm(&fn)) {
result=ToBool(Copy(st,fn.name));
} else
send_new_line=TRUE;
break;
case RIGHT_MOVE:
StrCpy(fn.name,st);
if (DocForm(&fn))
result=Move(st,fn.name);
else
send_new_line=TRUE;
break;
case RIGHT_DELETE:
result=ToBool(Del(st));
break;
case RIGHT_TYPE:
result=Type(st);
break;
case RIGHT_ED:
"Ed(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
result=Ed(st);
break;
case RIGHT_PLAIN:
"Plain(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
result=Plain(st);
break;
case RIGHT_AUTOFILE:
if (FileExtDot(st) && !FilesFindMatch(st,"*.AUT*")) {
if (!PopUpCancelOk(ST_WARN_ST "Not .AUT File\n\n")) {
send_new_line=TRUE;
break;
}
}
"AutoFile(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
WinZBufUpdate;
AutoFile(st);
result=TRUE;
break;
}
} else
send_new_line=TRUE;
Free(st);
} else
send_new_line=TRUE;
Free(st2);
} else
send_new_line=TRUE;
DocBottom(doc);
"$$PT$$$$FG$$$$BG$$";
if (send_new_line)
'\n';
return result;
}
#help_index "Debugging/Dump;DolDoc/Cmd Line (Typically);"\
"Cmd Line (Typically);DolDoc/Output;StdOut/DolDoc"
public U0 DocDm(U8 *buf,I64 cnt=0x80)
{//Dump live chunk of mem showing addresses. Can be edited.
CDocEntry *doc_e;
CDoc *doc=DocPut;
Bool unlock=DocLock(doc);
doc_e=DocPrint(doc,"$$HX-Z,%d,16$$",cnt);
doc_e->data=buf;
doc->cur_entry=doc_e->next;
DocRecalc(doc);
if (unlock)
DocUnlock(doc);
}
public U0 DocD(U8 *buf,I64 cnt=0x80)
{//Dump live chunk of mem showing offsets. Can be edited.
CDocEntry *doc_e;
CDoc *doc=DocPut;
Bool unlock=DocLock(doc);
doc_e=DocPrint(doc,"$$HX,%d,16$$",cnt);
doc_e->data=buf;
doc->cur_entry=doc_e->next;
DocRecalc(doc);
if (unlock)
DocUnlock(doc);
}
#help_index "DolDoc/Output;StdOut/DolDoc"
Bool KDDocPutS(U8 *st)
{
CDoc *doc;
if (doc=DocPut)
DocPrintPartial(doc,"%s",st);
return FALSE;
}
KeyDevAdd(&KDDocPutKey,&KDDocPutS,0x80000000,TRUE);
fp_getstr2=&DocGetStr2;
fp_doc_put=&DocPut;
+52 -447
View File
@@ -27,100 +27,6 @@ public Bool DocUnlock(CDoc *doc)
return FALSE;
}
CDocBin *DocBinFindNum(CDoc *haystack_doc,I64 needle_num)
{
CDocBin *b=haystack_doc->bin_root.next;
while (b!=&haystack_doc->bin_root) {
if (b->num==needle_num)
return b;
b=b->next;
}
return NULL;
}
CDocBin *DocBinFindTag(CDoc *haystack_doc,U8 *needle_tag)
{
CDocBin *b;
if (needle_tag) {
b=haystack_doc->bin_root.next;
while (b!=&haystack_doc->bin_root) {
if (b->tag && !StrCmp(b->tag,needle_tag))
return b;
b=b->next;
}
}
return NULL;
}
U0 DocBinsValidate(CDoc *doc)
{
Bool unlock=DocLock(doc);
CDocBin *b,*b1;
CDocEntry *doc_e,*doc_e2;
I64 renum_num=0;
b=doc->bin_root.next;
while (b!=&doc->bin_root) {
b->use_cnt=0;
b->temp_use_cnt=0;
b->renum_num=-1;
Free(b->tag);
b->tag=NULL;
b=b->next;
}
doc_e=doc->root.next;
while (doc_e!=doc) {
doc_e2=doc_e->next;
if (doc_e->de_flags & DOCEF_HAS_BIN) {
if (b=doc_e->bin_data=DocBinFindNum(doc,doc_e->bin_num)) {
if (doc_e->de_flags & DOCEF_BIN_PTR_LINK)
b->temp_use_cnt=MAX_I32;
if (!b->use_cnt++)
b->renum_num=++renum_num;
doc_e->bin_num=b->renum_num;
if (!b->tag && doc_e->de_flags&DOCEF_TAG && doc_e->tag && *doc_e->tag)
b->tag=StrNew(doc_e->tag,doc->mem_task);
} else {
RawPrint(3000,"Bin Not Found");
doc_e->type=doc_e->de_flags=0;
doc_e->type_u8=DOCT_ERROR;
}
}
doc_e=doc_e2;
}
b=doc->bin_root.next;
doc->cur_bin_num=1;
while (b!=&doc->bin_root) {
b1=b->next;
if (!b->use_cnt) {
QueRem(b);
Free(b->data);
Free(b);
} else {
b->num=b->renum_num;
if (b->num>=doc->cur_bin_num)
doc->cur_bin_num=b->num+1;
}
b=b1;
}
if (unlock)
DocUnlock(doc);
}
U0 DocBinDel(CDoc *doc,CDocBin *b)
{
if (doc && b && b->use_cnt) {
b->use_cnt--;
if (!b->use_cnt) {
QueRem(b);
Free(b->tag);
Free(b->data);
Free(b);
}
} else
RawPrint(3000,"DocBinDel");
}
Bool IsEditableText(CDocEntry *doc_e)
{
if (doc_e->type_u8==DOCT_TEXT&&!(doc_e->de_flags&DOCEG1_DONT_EDIT))
@@ -249,88 +155,63 @@ public CDocEntry *DocEntryCopy(CDoc *doc,CDocEntry *doc_e)
return doc_ne;
}
public U8 *DocEntryLink(CDoc *doc,CDocEntry *doc_e)
{//MAlloc new str, either tag or aux_str if link.
if (doc_e->de_flags&DOCEF_LINK) {
if (doc_e->de_flags & DOCEF_AUX_STR)
return StrNew(doc_e->aux_str,doc->mem_task);
else if (doc_e->de_flags & DOCEF_TAG)
return StrNew(doc_e->tag,doc->mem_task);
}
return NULL;
}
U0 DocFormFwd(CDoc *doc,Bool giveup=FALSE)
U0 DocRemSoftNewLines(CDoc *doc=NULL,CDocEntry *doc_e=NULL)
{
CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e;
if (doc->flags & DOCF_FORM) {
if (doc_e==doc) goto ff_recover;
while (!Bt(doldoc.type_flags_form,doc_e->type_u8) &&
!(doc_e->de_flags&DOCEF_LINK) ||
doc_e->de_flags&DOCEF_SKIP_IN_FORM) {
doc_e=doc_e->next;
if (doc_e==doc) {
ff_recover:
doc->cur_col=0;
if (!giveup) {
doc->cur_entry=doc_e->last;
DocFormBwd(doc,TRUE);
} else
doc->cur_entry=doc;
return;
}
}
}
while (doc_e->type_u8==DOCT_INDENT)
doc_e=doc_e->next;
if (doc_e!=doc_e2) {
doc->cur_col=doc_e->min_col;
doc->cur_entry=doc_e;
}
}
U0 DocFormBwd(CDoc *doc,Bool giveup=FALSE)
{
CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e;
if (doc->flags & DOCF_FORM) {
while (!Bt(doldoc.type_flags_form,doc_e->type_u8) &&
!(doc_e->de_flags&DOCEF_LINK) ||
doc_e->de_flags&DOCEF_SKIP_IN_FORM) {
doc_e=doc_e->last;
if (doc_e==doc) {
doc->cur_col=0;
if (!giveup) {
doc->cur_entry=doc_e->next;
DocFormFwd(doc,TRUE);
} else
doc->cur_entry=doc;
return;
}
}
}
while (doc_e->type_u8==DOCT_INDENT)
doc_e=doc_e->next;
if (doc_e!=doc_e2) {
doc->cur_col=doc_e->min_col;
doc->cur_entry=doc_e;
}
}
public U0 DocTop(CDoc *doc=NULL)
{//Move cursor, cur_entry, to top.
CDocEntry *doc_e2,*saved_ll=doc_e;
Bool unlock;
if (!doc && !(doc=DocPut))
return;
unlock=DocLock(doc);
doc->cur_entry=doc->root.next;
doc->cur_col=doc->cur_entry->min_col;
doc->x=0;
doc->y=0;
doc->line_start_col=0;
doc->top_line_num=0;
if (!doc_e) doc_e=doc->root.next;
while (doc_e!=doc) {
doc_e2=doc_e->next;
if (doc_e->type_u8==DOCT_SOFT_NEW_LINE) {
if (doc->cur_entry==doc_e) {
doc->cur_entry=doc_e2;
doc->cur_col=doc->cur_entry->min_col;
}
DocEntryDel(doc,doc_e);
} else if (saved_ll && doc_e->type_u8==DOCT_NEW_LINE)
break;
doc_e=doc_e2;
}
if (unlock)
DocUnlock(doc);
}
DocFormFwd(doc);
DocRecalc(doc);
public U0 DocInsEntry(CDoc *doc,CDocEntry *doc_e)
{//Insert entry into doc, updating its vals.
U8 *dst;
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->cur_entry,*doc_ne;
doc_e->x=doc_ce->x;
doc_e->y=doc_ce->y;
doc_e->page_line_num=doc_ce->page_line_num;
MemCpy(&doc_e->settings,&doc_ce->settings,sizeof(CDocSettings));
if (doc->cur_col>0 &&
doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->de_flags&(DOCEF_TAG_CB|DOCEF_DEFINE|DOCEF_AUX_STR|
DOCEF_HTML_LINK|DOCEF_BIN_PTR_LINK)) &&
doc->cur_col<doc_ce->max_col) {
dst=doc_ce->tag+doc->cur_col;
doc_ne=DocEntryNew(doc,doc_ce,StrNew(dst,doc->mem_task));
*dst=0;
doc_ne->type=DOCT_TEXT|doc_ce->type&0xFFFFFF00;
doc_ce->max_col=doc->cur_col;
QueIns(doc_ne,doc_ce);
doc->cur_col=0;
doc_ce=doc_ne;
}
if (doc_ce->type_u8==DOCT_TEXT && doc->cur_col>=doc_ce->max_col) {
QueIns(doc_e,doc_ce);
doc->cur_entry=doc_e->next;
} else {
QueIns(doc_e,doc_ce->last);
doc->cur_entry=doc_ce;
}
doc->cur_col=doc->cur_entry->min_col;
DocRemSoftNewLines(doc,doc->cur_entry);
if (unlock)
DocUnlock(doc);
}
@@ -376,7 +257,6 @@ public U0 DocRst(CDoc *doc,Bool is_old)
doc->undo_cnt=0;
doc->cur_bin_num=1;
doc->dollar_buf_ptr=0;
doc->ext_ascii_cnt=doc->ext_ascii_val=0;
doc->cmd_U8=CH_SPACE;
doc->page_line_num=0;
doc->best_d=MAX_I64;
@@ -462,169 +342,6 @@ public I64 DocSize(CDoc *doc)
return result;
}
U0 DocDataFmt(CDoc *doc,CDocEntry *doc_e,I64 d=DOCM_CANCEL)
{
I64 i;
U8 *ptr;
CHashDefineStr *temph;
if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR ||
doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) {
if (d==DOCM_CANCEL) {
if (doc_e->de_flags & DOCEF_DATA_IS_PTR) {
if (!(ptr=doc_e->data)) return;
} else
ptr=&doc_e->data;
switch(doc_e->raw_type) {
case RT_I0:
case RT_U0: d=0; break;
case RT_I8: d=*ptr(I8 *); break;
case RT_U8: d=*ptr(U8 *); break;
case RT_I16: d=*ptr(I16 *); break;
case RT_U16: d=*ptr(U16 *); break;
case RT_I32: d=*ptr(I32 *); break;
case RT_U32: d=*ptr(U32 *); break;
default: d=*ptr(I64 *);
}
}
if (doc_e->type_u8==DOCT_DATA) {
StrPrint(doc_e->tag,doc_e->aux_str,d,doc_e->my_fmt_data);
if (doc_e->de_flags & DOCEF_HAS_TERMINATOR) {
i=StrLen(doc_e->tag);
doc_e->tag[i++]='_';
doc_e->tag[i]=0;
}
doc_e->max_col=StrLen(doc_e->tag);
} else if (doc_e->de_flags & DOCEF_LST) {
if (doc_e->de_flags & DOCEF_DEFINE && (temph=HashFind(doc_e->define_str,
doc->win_task->hash_table,HTT_DEFINE_STR)) && 0<=d<temph->cnt) {
ptr=MStrPrint("[%s]",temph->sub_lst[d]);
Free(doc_e->tag);
doc_e->tag=StrNew(ptr,doc->mem_task);
Free(ptr);
} else {
Free(doc_e->tag);
doc_e->tag=StrNew("[]",doc->mem_task);
}
} else {
if (d)
doc_e->de_flags|=DOCEF_CHECKED_COLLAPSED;
else
doc_e->de_flags&=~DOCEF_CHECKED_COLLAPSED;
}
}
}
U0 DocDataScan(CDoc *doc,CDocEntry *doc_e)
{
I64 i,d;
U8 *ptr,*ptr1,*ptr2;
CHashDefineStr *temph;
if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR ||
doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) {
if (doc_e->de_flags & DOCEF_DATA_IS_PTR) {
if (!(ptr=doc_e->data)) return;
} else
ptr=&doc_e->data;
if (doc_e->type_u8==DOCT_DATA) {
i=StrLen(doc_e->tag);
if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)
doc_e->tag[--i]=0;
if (i>doc_e->len+doc_e->min_col)
doc_e->tag[doc_e->len+doc_e->min_col]=0;
if (RT_I8<=doc_e->raw_type<=RT_U32) {
StrScan(doc_e->tag,doc_e->aux_str,&d,doc_e->my_fmt_data);
if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)
doc_e->tag[i]='_';
} else if (RT_I64<=doc_e->raw_type<=RT_UF64) {
StrScan(doc_e->tag,doc_e->aux_str,ptr,doc_e->my_fmt_data);
if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)
doc_e->tag[i]='_';
return;
}
} else if (doc_e->de_flags & DOCEF_LST) {
d=0;
if (doc_e->tag && doc_e->de_flags & DOCEF_DEFINE &&
(temph=HashFind(doc_e->define_str,
doc->win_task->hash_table,HTT_DEFINE_STR))) {
ptr1=ptr2=StrNew(doc_e->tag);
if (*ptr2=='[') {
ptr2++;
i=StrLen(ptr2);
if (ptr2[i-1]==']')
ptr2[i-1]=0;
}
d=LstMatch(ptr2,temph->data);
Free(ptr1);
}
} else {
if (doc_e->de_flags & DOCEF_CHECKED_COLLAPSED)
d=TRUE;
else
d=FALSE;
}
switch(doc_e->raw_type) {
case RT_I8:
case RT_U8:
*ptr(U8 *)=d;
case RT_I0:
case RT_U0:
break;
case RT_I16:
case RT_U16:
*ptr(U16 *)=d;
break;
case RT_I32:
case RT_U32:
*ptr(U32 *)=d;
break;
default:
*ptr(I64 *)=d;
}
}
}
U0 DocRemSoftNewLines(CDoc *doc=NULL,CDocEntry *doc_e=NULL)
{
CDocEntry *doc_e2,*saved_ll=doc_e;
Bool unlock;
if (!doc && !(doc=DocPut))
return;
unlock=DocLock(doc);
if (!doc_e) doc_e=doc->root.next;
while (doc_e!=doc) {
doc_e2=doc_e->next;
if (doc_e->type_u8==DOCT_SOFT_NEW_LINE) {
if (doc->cur_entry==doc_e) {
doc->cur_entry=doc_e2;
doc->cur_col=doc->cur_entry->min_col;
}
DocEntryDel(doc,doc_e);
} else if (saved_ll && doc_e->type_u8==DOCT_NEW_LINE)
break;
doc_e=doc_e2;
}
if (unlock)
DocUnlock(doc);
}
#help_index "DolDoc/Cmd Line (Typically);Cmd Line (Typically)"
public I64 DocMax(I64 i=MAX_I64)
{//Set max document entries. (Cmd line buffer.)
//Adjusts the size of the cmd line buf.
//Normally, the cmd line deletes entries
//when more are added and the old scroll up.
//See $LK,"max_entries",A="FF:::/Adam/DolDoc/DocMain.CPP,max_entries"$.
I64 result;
CDoc *doc;
if (doc=DocPut) {
result=doc->max_entries;
doc->max_entries=i;
return result;
} else
return 0;
}
#help_index "DolDoc"
public CDoc *DocNew(U8 *filename=NULL,CTask *task=NULL)
{//MAlloc new $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT"$. (Begin a new doc.)
@@ -634,7 +351,7 @@ public CDoc *DocNew(U8 *filename=NULL,CTask *task=NULL)
if (filename)
StrCpy(doc->filename.name,filename);
else
StrCpy(doc->filename.name,dsk.temp_filename);
StrCpy(doc->filename.name,blkdev.temp_filename);
doc->find_replace=CAlloc(sizeof(CEdFindText),task);
doc->find_replace->scan_fwd=TRUE;
doc->find_replace->match_case=TRUE;
@@ -649,115 +366,3 @@ public CDoc *DocNew(U8 *filename=NULL,CTask *task=NULL)
doc->doc_signature=DOC_SIGNATURE_VAL;
return doc;
}
#help_index "DolDoc/Task;StdOut/Task"
public CDoc *DocPut(CTask *task=NULL)
{//Current document that StdOut Put() goes to.
//Basically, StdOut unless double buffering.
CDoc *result;
if (!task) task=Fs;
if ((result=task->put_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
return result;
else
return NULL;
}
public CDoc *DocDisplay(CTask *task=NULL)
{//StdOut displayed unless double buffering.
CDoc *result;
if (!task) task=Fs;
if ((result=task->display_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
return result;
else
return NULL;
}
public CDoc *DocBorder(CTask *task=NULL)
{//Doc holding border of window text.
CDoc *result;
if (!task) task=Fs;
if ((result=task->border_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
return result;
else
return NULL;
}
public CDoc *DocDblBufStart(CTask *task=NULL)
{//See $LK,"::/Demo/Spy.CPP"$
Bool unlock_ddoc,old_preempt=Preempt;
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task),*result;
if (!pdoc || !ddoc || pdoc!=ddoc)
result=NULL; //Already Double buffering
else {
if (!task) task=Fs;
unlock_ddoc=DocLock(ddoc); //dont change during winupdate, so lock DocPut$WW,0$
result=DocNew(,task);
result->win_task =ddoc->win_task;
result->max_entries =ddoc->max_entries;
MemCpy(result->find_replace,ddoc->find_replace,sizeof(CEdFindText));
MemCpy(&result->filename,&ddoc->filename,sizeof(CEdFileName));
result->left_click_link =ddoc->left_click_link;
result->right_click_link =ddoc->right_click_link;
result->user_put_data =ddoc->user_put_data;
result->user_put_key =ddoc->user_put_key;
result->user_put_s =ddoc->user_put_s;
result->parent_doc =ddoc->parent_doc;
result->desc =ddoc->desc;
result->user_data =ddoc->user_data;
result->flags|=ddoc->flags&DOCG_DBL_BUF_FLAGS | DOCF_DONT_SHOW;
task->put_doc=result;
if (unlock_ddoc)
DocUnlock(ddoc);
}
Preempt(old_preempt);
return result;
}
public Bool DocDblBufEnd(CTask *task=NULL)
{//See $LK,"::/Demo/Spy.CPP"$
Bool result=FALSE,old_preempt=Preempt;
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task);
if (pdoc && ddoc && pdoc!=ddoc) {//Double buffering?
if (!task) task=Fs;
ddoc->flags|=DOCF_DONT_SHOW;
pdoc->flags&=~DOCF_DONT_SHOW;
DocLock(ddoc);
task->display_doc=pdoc;
DocUnlock(ddoc);
DocDel(ddoc);
result=TRUE;
}
Preempt(old_preempt);
return result;
}
public Bool DocDblBufSwap(CTask *task=NULL)
{//See $LK,"::/Demo/Spy.CPP"$
Bool result=FALSE,old_preempt=Preempt;
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task);
if (pdoc && ddoc && pdoc!=ddoc) {//Double buffering?
if (!task) task=Fs;
ddoc->flags|=DOCF_DONT_SHOW;
pdoc->flags&=~DOCF_DONT_SHOW;
DocLock(ddoc);
task->display_doc=pdoc;
DocUnlock(ddoc);
DocRst(ddoc,TRUE);
MemCpy(ddoc->find_replace,pdoc->find_replace,sizeof(CEdFindText));
MemCpy(&ddoc->filename,&pdoc->filename,sizeof(CEdFileName));
ddoc->max_entries =pdoc->max_entries;
ddoc->flags =pdoc->flags&DOCG_DBL_BUF_FLAGS |
ddoc->flags&~DOCG_DBL_BUF_FLAGS;
ddoc->left_click_link =pdoc->left_click_link;
ddoc->right_click_link =pdoc->right_click_link;
ddoc->user_put_data =pdoc->user_put_data;
ddoc->user_put_key =pdoc->user_put_key;
ddoc->user_put_s =pdoc->user_put_s;
ddoc->desc =pdoc->desc;
ddoc->user_data =pdoc->user_data;
task->put_doc=ddoc;
result=TRUE;
}
Preempt(old_preempt);
return result;
}
+12 -12
View File
@@ -32,18 +32,18 @@ I64 DocOptEntry(CDoc *,CDocEntry *doc_e)
Free(st);
}
/* !!! Dangerous, but handy !!!
if (doc_e->de_flags & DOCEF_AUX_STR) {
if (st=StrMatch(".Z",doc_e->aux_str)) {
StrCpy(st,st+2);
result++;
}
}
if (doc_e->de_flags&DOCEF_TAG) {
if (st=StrMatch(".Z",doc_e->tag)) {
StrCpy(st,st+2);
result++;
}
}
if (doc_e->de_flags & DOCEF_AUX_STR) {
if (st=StrMatch(".Z",doc_e->aux_str)) {
StrCpy(st,st+2);
result++;
}
}
if (doc_e->de_flags&DOCEF_TAG) {
if (st=StrMatch(".Z",doc_e->tag)) {
StrCpy(st,st+2);
result++;
}
}
*/
}
return result;
+111 -248
View File
@@ -40,53 +40,6 @@ I64 PrsDocFlags(CCmpCtrl *cc,I64 *_de_flags,U32 *_type)
return result;
}
I64 DocBinPtrRst(CDoc *doc,CDocEntry *doc_e)
{
U8 *st,*st2;
CDoc *doc2;
CDocBin *tempb,*tempb2;
I64 i,bin_num=0;
if (doc_e->de_flags&DOCEF_HAS_BIN &&
doc_e->bin_ptr_link && StrLen(doc_e->bin_ptr_link)) {
bin_num=doc_e->bin_num;
st=StrNew(doc_e->bin_ptr_link);
st2=StrNew(st);
StrLastRem(st,",",st2);
i=Str2I64(st2);
if (i>0||*st2) {
doc2=DocRead(st);
if (i>0 && (tempb2=DocBinFindNum(doc2,i)) ||
i==0 && (tempb2=DocBinFindTag(doc2,st2))) {
i=1;
if (bin_num>0) {
if (tempb=DocBinFindNum(doc,bin_num)) {
i=tempb->use_cnt;
DocBinDel(doc,tempb);
}
} else
bin_num=doc->cur_bin_num++;
tempb=MAllocIdentical(tempb2,doc->mem_task);
tempb->use_cnt=i;
tempb->data=MAllocIdentical(tempb2->data,doc->mem_task);
tempb->num=bin_num;
doc_e->bin_data=tempb;
if (doc_e->de_flags&DOCEF_TAG && doc_e->tag && *doc_e->tag)
tempb->tag=StrNew(doc_e->tag,doc->mem_task);
else
tempb->tag=NULL;
QueIns(tempb,doc->bin_root.last);
} else
bin_num=0;
DocDel(doc2);
} else
bin_num=0;
Free(st2);
Free(st);
doc_e->bin_num=bin_num;
}
return bin_num;
}
U8 *Doc2PlainText(CDoc *doc,CDocEntry *doc_e)
{//TODO: break strs
I64 i,j,attr=doc_e->attr,
@@ -537,214 +490,124 @@ pd_err:
return doc_e;
}
public U0 DocInsEntry(CDoc *doc,CDocEntry *doc_e)
{//Insert entry into doc, updating its vals.
U8 *dst;
Bool unlock=DocLock(doc);
CDocEntry *doc_ce=doc->cur_entry,*doc_ne;
doc_e->x=doc_ce->x;
doc_e->y=doc_ce->y;
doc_e->page_line_num=doc_ce->page_line_num;
MemCpy(&doc_e->settings,&doc_ce->settings,sizeof(CDocSettings));
if (doc->cur_col>0 &&
doc_ce->type_u8==DOCT_TEXT &&
!(doc_ce->de_flags&(DOCEF_TAG_CB|DOCEF_DEFINE|
DOCEF_HTML_LINK|DOCEF_BIN_PTR_LINK)) &&
doc->cur_col<doc_ce->max_col) {
dst=doc_ce->tag+doc->cur_col;
doc_ne=DocEntryNew(doc,doc_ce,StrNew(dst,doc->mem_task));
*dst=0;
doc_ne->type=DOCT_TEXT|doc_ce->type&0xFFFFFF00;
doc_ce->max_col=doc->cur_col;
QueIns(doc_ne,doc_ce);
doc->cur_col=0;
doc_ce=doc_ne;
}
if (doc_ce->type_u8==DOCT_TEXT && doc->cur_col>=doc_ce->max_col) {
QueIns(doc_e,doc_ce);
doc->cur_entry=doc_e->next;
} else {
QueIns(doc_e,doc_ce->last);
doc->cur_entry=doc_ce;
}
doc->cur_col=doc->cur_entry->min_col;
DocRemSoftNewLines(doc,doc->cur_entry);
if (unlock)
DocUnlock(doc);
}
#help_index "DolDoc/Output;StdOut/DolDoc"
CDocEntry *DocPutS(CDoc *doc,U8 *st)
{//Don't use this. Use $LK-UL,"DocPrint",A="MN:DocPrint"$().
//Does not handle partial Doc entries
//Returns last newly created dollar-sign CDocEntry.
U8 *ptr=st,*ptr2,*st2,*ptr3,*ptr4,*src,
*char_bitmap;
Bool unlock;
I64 ch,j;
CDocEntry *doc_e=NULL,*result=NULL,*doc_ce;
if (!st || !doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
return NULL;
unlock=DocLock(doc);
if (doc->flags & DOCF_PLAIN_TEXT_WITH_TABS)
char_bitmap=chars_bmp_zero_cr_nl_cursor;
else if (doc->flags & DOCF_PLAIN_TEXT)
char_bitmap=chars_bmp_zero_tab_ff_cr_nl_cursor;
else
char_bitmap=chars_bmp_zero_tab_ff_cr_nl_cursor_dollar;
doc_ce=doc->cur_entry;
while (*ptr) {
ptr2=ptr;
do ch=*ptr++;
while (!Bt(char_bitmap,ch) || ch==CH_CURSOR && doc->flags&DOCF_NO_CURSOR);
ptr--;
if (!ch) {
if (j=ptr-ptr2) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_TEXT];
if (doc->flags & DOCF_NO_CURSOR) {
src=MAlloc(j+1);
MemCpy(src,ptr2,j+1);
StrUtil(src,SUF_REM_CTRL_CHARS);
j=StrLen(src);
U0 DocEntryToggle(CDoc *doc)
{
Bool unlock=DocLock(doc),old_color_names;
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->de_flags &
~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|
DOCEF_SKIP|DOCEF_HARD_SKIP|DOCEF_FILTER_SKIP)) &&
!(doc_ce->type&DOCG_BL_IV_UL)) {
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->de_flags==doc_ce2->de_flags &&
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_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
src=ptr2;
doc_e->tag=MAlloc(j+1,doc->mem_task);
MemCpy(doc_e->tag,src,j+1);
doc_e->max_col=j;
DocInsEntry(doc,doc_e);
if (doc->flags & DOCF_NO_CURSOR)
Free(src);
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->de_flags==doc_ce2->de_flags &&
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_col;
while (i>doc_ce->min_col && doc_ce->tag[i]!='$$')
i--;
j=doc->cur_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_col=i;
st2=MStrPrint("%q",st);
if (doc_ce=DocPrint(doc,st2)) {
doc->cur_entry=doc_ce;
doc->cur_col=doc_ce->min_col;
}
Free(st);
Free(st2);
}
} else {
if (j=ptr-ptr2) {
*ptr=0;
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_TEXT];
if (doc->flags & DOCF_NO_CURSOR) {
src=MAlloc(j+1);
MemCpy(src,ptr2,j+1);
ptr3=src;
ptr4=src;
while (*ptr3)
if (*ptr3!=CH_CURSOR)
*ptr4++=*ptr3++;
else
ptr3++;
*ptr4=0;
j=ptr4-src;
} else
src=ptr2;
doc_e->tag=MAlloc(j+1,doc->mem_task);
MemCpy(doc_e->tag,src,j+1);
doc_e->max_col=j;
DocInsEntry(doc,doc_e);
if (doc->flags & DOCF_NO_CURSOR)
Free(src);
*ptr=ch;
}
switch (ch) {
case CH_CURSOR:
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_CURSOR | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_CURSOR];
DocInsEntry(doc,doc_e);
ptr++;
break;
case CH_FORM_FEED:
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_PAGE_BREAK | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_PAGE_BREAK];
DocInsEntry(doc,doc_e);
ptr++;
break;
case '\t':
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_TAB | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_TAB];
DocInsEntry(doc,doc_e);
ptr++;
break;
case '$$':
ptr++; //skip first dollar
ptr2=ptr;
while (*ptr && *ptr!='$$')
ptr++;
if (*ptr) {
*ptr=0; //zero second dollar
if (ptr-1==ptr2 && *ptr2==CH_CURSOR) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_CURSOR | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_CURSOR];
DocInsEntry(doc,doc_e);
ptr2++;
}
if (ptr==ptr2) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr<<8;
doc_e->max_col=1;
if (doc->flags & DOCF_DBL_DOLLARS)
doc_e->tag=StrNew("$$$$",doc->mem_task);
else
doc_e->tag=StrNew("$$",doc->mem_task);
doc_e->de_flags=doldoc.dft_de_flags[DOCT_TEXT];
DocInsEntry(doc,doc_e);
} else {
st2=MAlloc(ptr-ptr2+1);
ptr3=ptr2;
ptr4=st2;
while (ch=*ptr3++) {
if (ch==CH_CURSOR) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_CURSOR | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_CURSOR];
DocInsEntry(doc,doc_e);
} else if (ch==CH_FORM_FEED) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_PAGE_BREAK |
doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_PAGE_BREAK];
DocInsEntry(doc,doc_e);
} else
*ptr4++=ch;
}
*ptr4=0;
if (doc_e=PrsDollarCmd(doc,st2)) {
result=doc_e;
DocInsEntry(doc,doc_e);
}
Free(st2);
}
*ptr++='$$';
}
break;
default:
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_NEW_LINE | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_NEW_LINE];
DocInsEntry(doc,doc_e);
if (ch=='\r')
while (*ptr=='\r')
ptr++;
if (*ptr=='\n')
ptr++;
while (*ptr=='\r')
ptr++;
}
old_color_names=LBts(&doc->flags,DOCf_COLOR_NAMES);
st=Doc2PlainText(doc,doc_ce);
LBEqu(&doc->flags,DOCf_COLOR_NAMES,old_color_names);
DocEntryDel(doc,doc_ce);
DocPrint(doc,"$$$$%Q$$$$",st);
}
DocRecalc(doc);
}
if (unlock)
DocUnlock(doc);
return result;
}
public CDocEntry *DocPrint(CDoc *doc,U8 *fmt,...)
{//You must not print partial doc cmds.
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
CDocEntry *result=DocPutS(doc,buf);
Free(buf);
return result;
U0 DocFlagsToggle(CDoc *doc,I64 tog_flags)
{
Bool unlock=DocLock(doc);
I64 size,flags=doc->flags^tog_flags;
U8 *st;
CDocUndo *u_next,*u_last;
doc->flags|=DOCF_COLOR_NAMES;
st=DocSave(doc,&size);
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->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);
}
+1 -611
View File
@@ -1,423 +1,7 @@
#help_index "DolDoc"
public I64 DocEntryRun(CDoc *doc,CDocEntry *doc_e,
Bool exited,I64 *_has_action=NULL)
{//Do action on final entry selected by user.
//Sometimes returns locked, sometimes unlocked
U8 ch=doc->cmd_U8,*st;
I64 result=DOCM_CANCEL,has_action=FALSE;
CHashDefineStr *temph;
DocLock(doc);
if (!exited) {
if (doc_e->de_flags & DOCEF_ESC) {
Msg(MSG_KEY_DOWN,CH_ESC,0,1<<SVCf_DONT_FILTER);
has_action=TRUE;
goto er_done;
} if (doc_e->de_flags & DOCEF_QUIT) {
Msg(MSG_KEY_DOWN,CH_SHIFT_ESC,0,1<<SVCf_DONT_FILTER);
has_action=TRUE;
goto er_done;
} else if (doc_e->de_flags & DOCEF_CHECK_COLLAPSABLE) {
doc_e->de_flags^=DOCEF_CHECKED_COLLAPSED;
has_action=TRUE;
}
}
try {
if (ch==CH_SPACE) {
if (doc_e->de_flags & DOCEF_LINK && doc->left_click_link) {
result=(*doc->left_click_link)(doc,doc_e);
has_action=TRUE;
}
if (doc_e->de_flags & DOCEF_LEFT_EXP) {
result=doc_e->left_exp;
has_action=TRUE;
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
}
if (doc_e->de_flags & DOCEF_LEFT_CB && doc_e->left_cb) {
DocUnlock(doc);
result=(*doc_e->left_cb)(doc,doc_e);
has_action=TRUE;
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
}
if (doc_e->de_flags & DOCEF_LEFT_MACRO) {
if (doc_e->de_flags & DOCEF_POPUP) {
st=StrNew(doc_e->left_macro);
DocUnlock(doc);
PopUp(st,Fs);
Free(st);
} else {
if (doc_e->de_flags & DOCEF_LEFT_AUTO)
AutoStr("%s",doc_e->left_macro);
else
Auto("%s",doc_e->left_macro);
}
has_action=TRUE;
}
if (!exited && doc_e->de_flags & DOCEF_LST &&
doc_e->de_flags & DOCEF_DEFINE &&
(temph=HashFind(doc_e->define_str,
doc->win_task->hash_table,HTT_DEFINE_STR)) &&
(result=PopUpPickLst(temph->data))!=DOCM_CANCEL) {
DocDataFmt(doc,doc_e,result);
DocDataScan(doc,doc_e);
has_action=TRUE;
}
} else if (ch=='\n') {
if (doc_e->de_flags & DOCEF_LINK && doc->right_click_link) {
result=(*doc->right_click_link)(doc,doc_e);
has_action=TRUE;
}
if (doc_e->de_flags & DOCEF_RIGHT_EXP) {
result=doc_e->right_exp;
has_action=TRUE;
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
}
if (doc_e->de_flags & DOCEF_RIGHT_CB && doc_e->right_cb) {
DocUnlock(doc);
result=(*doc_e->right_cb)(doc,doc_e);
has_action=TRUE;
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
}
if (doc_e->de_flags & DOCEF_RIGHT_MACRO) {
if (doc_e->de_flags & DOCEF_POPUP) {
st=StrNew(doc_e->right_macro);
DocUnlock(doc);
PopUp(st,Fs);
Free(st);
} else {
if (doc_e->de_flags & DOCEF_RIGHT_AUTO)
AutoStr("%s",doc_e->right_macro);
else
Auto("%s",doc_e->right_macro);
}
has_action=TRUE;
}
}
}
catch
DocBottom(doc);
doc->cmd_U8=CH_SPACE;
er_done:
if (_has_action) *_has_action=has_action;
return result;
}
U8 *EdOverStrikeCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *st=MAlloc(8,mem_task);
if (doc->flags & DOCF_OVERSTRIKE)
*st='O';
else
*st='Ä';
st[1]=0;
return st;
}
U8 *EdFilterCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *st=MAlloc(8,mem_task);
if (doc->find_replace->filter_lines)
*st='F';
else
*st='Ä';
st[1]=0;
return st;
}
U8 *EdDollarCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *st=MAlloc(8,mem_task);
if (doc->flags & DOCF_IN_DOLLAR)
*st='$$';
else
*st='Ä';
st[1]=0;
return st;
}
U8 *EdMoreCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *st=MAlloc(8,mem_task);
if (doc->flags&DOCF_MORE)
StrCpy(st,"MoreÄ");
else
StrCpy(st,"ÄÄÄÄÄ");
return st;
}
U8 *EdDollarTypeCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
{
CDoc *doc=doc_e->user_data;
U8 *src=DefineSub(doc->cur_entry->type_u8,"ST_DOC_CMDS"),
*st=CAlloc(8,mem_task);
if (doc->cur_entry==doc)
src="EOF";
else if (!src)
src="ERR";
StrPrint(st,"%-3ts",src);
return st;
}
public I64 DocGetKey(I64 *_sc=NULL)
{//Called by $LK,"View",A="MN:View"$. You probably don't need this.
I64 ch,sc;
Bool cont,old_preempt=IsPreempt;
do {
ch=GetKey(&sc,TRUE);
DocRecalc(DocPut);
cont=FALSE;
if (ch==CH_ESC || ch==CH_SHIFT_ESC) {//Check for exit filter mode
Preempt;
if (DocPut && DocPut->find_replace->filter_lines) {
EdUndoFilter(DocPut);
cont=TRUE;
}
Preempt(old_preempt);
}
} while (cont);
if (_sc) *_sc=sc;
return ch;
}
#help_index "DolDoc/Output;StdOut/DolDoc"
public Bool View()
{//Go live for user interaction until <ESC> or <SHIFT-ESC>.
I64 ch;
do ch=DocGetKey;
while (ch!=CH_ESC && ch!=CH_SHIFT_ESC);
return ch==CH_ESC;
}
#help_index "DolDoc"
public Bool DocEd(CDoc *doc,I64 dof_flags=0)
{//Live for user interaction. End on <ESC> or <SHIFT-ESC>.
CDoc *old_put_doc =DocPut,
*old_display_doc=DocDisplay,
*old_border_doc =DocBorder,*bdoc;
CDocEntry *doc_e;
I64 old_attr=Fs->text_attr,
old_top =Fs->win_top, old_bottom=Fs->win_bottom,
old_left=Fs->win_left,old_right =Fs->win_right,
old_title_src=Fs->title_src;
Bool result,unlock,old_preempt;
U8 *old_task_title;
if (dof_flags&DOF_WIN_MAX)
WinMax;
unlock=DocLock(doc);
doc->win_task=Fs;
bdoc=DocNew;
bdoc->flags|=DOCF_BORDER_DOC;
DocPrint(bdoc,"$$CM+TY+LX+NC,0,-1$$");
DocPrint(bdoc,"$$TX+RX+BD,\"[X]\"$$");
DocPrint(bdoc,"$$BK,1$$$$TX+LX+BD,\"MENU\"$$$$BK,0$$");
old_task_title=StrNew(Fs->task_title);
if (Fs->title_src!=TTS_LOCKED_CONST) {
Fs->title_src=TTS_ED_FILENAME;
MemCpy(Fs->task_title,doc->filename.name,TASK_TITLE_LEN);
}
doc_e=DocPrint(bdoc,"$$DA-TRM-P+BD+RD+CX+IV,140,A=\"%%s...\",SCX=16$$");
doc_e->data=&Fs->task_title;
DocDataFmt(bdoc,doc_e);
if (doc->flags & DOCF_ALLOW_UNDO) {
DocPrint(bdoc,"$$CM+BY+LX+NC,1,1$$");
doc_e=DocPrint(bdoc,"$$DA+BD+RD-TRM,32,RT=U32,A=\"Undo:%%03d\"$$\n");
doc_e->data=&doc->undo_cnt;
DocDataFmt(bdoc,doc_e);
}
DocPrint(bdoc,"$$CM+BY+RX+NC,-30,1$$");
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdMoreCB;
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdDollarTypeCB;
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdFilterCB;
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdOverStrikeCB;
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=doc;
doc_e->tag_cb=&EdDollarCB;
doc_e=DocPrint(bdoc,"$$DA+BD+RD-TRM,32,A=\"Line:%%04d \"$$");
doc_e->data=&doc->line;
DocDataFmt(bdoc,doc_e);
doc_e=DocPrint(bdoc,"$$DA+BD+RD-TRM,32,A=\"Col:%%04d\"$$\n");
doc_e->data=&doc->col;
DocDataFmt(bdoc,doc_e);
DocRecalc(bdoc);
DocRecalc(doc);
if (!(dof_flags&DOF_DONT_HOME))
DocTop(doc);
old_preempt=Preempt;
Fs->border_doc=bdoc;
if (doc!=old_display_doc)
doc->parent_doc=old_display_doc;
Fs->put_doc=Fs->display_doc=doc;
if (!(dof_flags&DOF_DONT_TEXT_ATTR))
Fs->text_attr=DOC_ATTR_DFT_TEXT;
if (!(dof_flags&DOF_DONT_SHOW)) {
LBts(&Fs->display_flags,DISPLAYf_SHOW);
WinZBufUpdate;
}
if (dof_flags&DOF_MIN_SIZE)
doc->flags|=DOCF_MIN_SIZE;
Preempt(old_preempt);
DocUnlock(doc);
if (!(dof_flags&DOF_DONT_WINMGR_SYNC)) {
WinMgrSync(2,TRUE);
if (doc->flags&DOCF_MIN_SIZE)
WinMgrSync(2,TRUE);
}
result=View;
Preempt;
DocLock(doc);
if (result) {
doc_e=doc->root.next;
while (doc_e!=doc) {
if (doc_e->type_u8==DOCT_DATA || doc_e->type_u8==DOCT_CHECK_BOX)
DocDataScan(doc,doc_e);
doc_e=doc_e->next;
}
}
if (unlock)
DocUnlock(doc);
Fs->border_doc =old_border_doc;
Fs->display_doc=old_display_doc;
Fs->put_doc =old_put_doc;
Fs->text_attr =old_attr;
if (Fs->title_src!=TTS_LOCKED_CONST) {
Fs->title_src =old_title_src;
StrCpy(Fs->task_title,old_task_title);
}
Free(old_task_title);
DocDel(bdoc);
if (dof_flags&DOF_MIN_SIZE) {
WinHorz(old_left,old_right);
WinVert(old_top,old_bottom);
}
Preempt(old_preempt);
return result;
}
#help_index "DolDoc/Input;StdIn/DolDoc"
public Bool DocForm(U8 *_d,U8 *class_name=lastclass,
I64 dof_flags=0,U8 *header=NULL,U8 *footer=NULL)
{//User input. Supply a class name that has fmtstr definitions.
//See $LK,"::/Demo/DolDoc/Form.CPP"$ and $LK,"::/Demo/LastClass.CPP"$.
CMemberLst *ml;
CDocEntry *doc_e;
U8 *fmtstr;
CHashClass *tempc;
CDoc *doc;
Bool result=FALSE;
I64 old_border_src=Fs->border_src,has_action;
if (!(tempc=HashFind(class_name,Fs->hash_table,HTT_CLASS)))
return FALSE;
doc=DocNew;
doc->desc='Form';
if (header) DocPrint(doc,"%s",header);
doc->flags|=DOCF_OVERSTRIKE|DOCF_FORM;
if (dof_flags&DOF_MIN_SIZE)
doc->flags|=DOCF_MIN_SIZE;
ml=tempc->member_lst;
while (ml) {
if (fmtstr=MemberMetaData("fmtstr",ml)) {
doc_e=DocPrint(doc,"%s",fmtstr);
doc_e->data=_d+ml->offset;
doc_e->my_fmt_data=MemberMetaData("fmtdata",ml);
DocDataFmt(doc,doc_e);
}
ml=ml->next;
}
if (footer) DocPrint(doc,"%s",footer);
if (doc->root.next!=doc) {
Fs->border_src=BDS_CONST;
DocRecalc(doc);
if (DocEd(doc,dof_flags)) {
doc_e=doc->cur_entry;
result=TRUE;
if (doc_e!=doc) {
if (DocEntryRun(doc,doc_e,TRUE,&has_action)==DOCM_CANCEL && has_action)
result=FALSE;
DocUnlock(doc);
}
}
}
DocDel(doc);
Fs->border_src=old_border_src;
return result;
}
U0 DocMenuEndTaskCB()
{
WinToTop;
throw;
}
public I64 DocMenu(CDoc *m,I64 dof_flags=0)
{//Run menu chooser doc. Returns menu doc unlocked.
U8 *old_end_cb=Fs->task_end_cb;
Bool old_break_shift_esc=LBts(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC);
CDocEntry *doc_e;
I64 old_border_src=Fs->border_src,result=DOCM_CANCEL,has_action;
Fs->task_end_cb=&DocMenuEndTaskCB;
try {
if (m) {
m->desc='Menu';
Fs->border_src=BDS_CONST;
dm_restart:
if (DocEd(m,dof_flags)) {
doc_e=m->cur_entry;
if (doc_e!=m) {
result=DocEntryRun(m,doc_e,TRUE,&has_action);
DocUnlock(m);
if (!has_action) {
result=DOCM_CANCEL;
dof_flags|=DOF_DONT_HOME;
goto dm_restart;
}
}
}
}
} catch {
if (!Fs->except_ch) {
if (!(dof_flags & DOF_INTERCEPT_TASK_END))
Exit;
Fs->catch_except=TRUE;
}
}
LBEqu(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC,old_break_shift_esc);
Fs->border_src=old_border_src;
Fs->task_end_cb=old_end_cb;
return result;
}
#help_index "DolDoc;Task/Srv/Exe"
public I64 PopUpEd(U8 *filename,CTask *parent=NULL,CTask **_pu_task=NULL)
{//Create PopUp win task and edit a doc.
U8 *st=MStrPrint("Ed(\"%Q\");",filename);
I64 result=PopUp(st,parent,_pu_task);
Free(st);
return result;
}
#help_index "DolDoc/Output;StdOut/DolDoc"
public CTask *PopUpViewDoc(CDoc *doc,I64 dof_flags=0)
{//Pass doc to PopUp win task for viewing.
U8 *buf=MStrPrint("Preempt(ON);DocEd(0x%X,0x%X);",doc,dof_flags);
U8 *buf=MStrPrint("DocEd(0x%X,0x%X);",doc,dof_flags);
CTask *task=Spawn(&SrvCmdLine,NULL,"View",,Fs);
TaskExe(task,NULL,buf,1<<SVCf_EXIT_ON_COMPLETE|1<<SVCf_FREE_ON_COMPLETE);
Free(buf);
@@ -443,20 +27,6 @@ public CTask *PopUpViewPrint(U8 *fmt,...)
return task;
}
#help_index "DolDoc/Input;StdIn/DolDoc"
public I64 PopUpMenu(CDoc *doc,I64 dof_flags=0)
{//Run menu chooser doc in PopUp win task.
doc->flags|=DOCF_MIN_SIZE | DOCF_FORM;
return PopUpPrint("DocMenu(0x%X,0x%X);",doc,dof_flags);
}
public Bool PopUpForm(U8 *_d,U8 *class_name=lastclass,
I64 dof_flags=DOF_MIN_SIZE,U8 *header=NULL,U8 *footer=NULL)
{//See $LK,"::/Demo/DolDoc/Form.CPP"$ and $LK,"::/Demo/LastClass.CPP"$.
return PopUpPrint("DocForm(0x%X,0x%X,0x%X,0x%X,0x%X);",_d,class_name,
dof_flags,header,footer);
}
#help_index "DolDoc/Input;File/FileNames;StdIn/DolDoc"
public U8 *PopUpPickFile(U8 *dir=NULL)
{//Filename chooser. Uses $LK,"FileMgr",A="MN:FileMgr"$().
@@ -594,25 +164,6 @@ public Bool PopUpCancelOk(U8 *header=NULL,U8 *footer=NULL)
return PopUp2("OKAY",1,"CANCEL",0,header,footer)>0;
}
#define RSAC_REPLACE 0
#define RSAC_SKIP 1
#define RSAC_ALL 2
I64 PopUpReplaceSkipAllCancel(U8 *header=NULL,U8 *footer=NULL)
{
I64 i;
CDoc *doc=DocNew;
if (header) DocPrint(doc,"%s",header);
DocPrint(doc,"$$CM+LX,1,4$$$$BT,\"REPLACE\",LE=RSAC_REPLACE$$"
"$$CM+LX,17,0$$$$BT,\"SKIP\",LE=RSAC_SKIP$$"
"$$CM+LX,1,3$$$$BT,\"ALL\",LE=RSAC_ALL$$"
"$$CM+LX,17,0$$$$BT,\"CANCEL\",LE=DOCM_CANCEL$$\n");
if (footer) DocPrint(doc,"%s",footer);
i=PopUpMenu(doc);
DocDel(doc);
return i;
}
U8 *PopUpGetStr2(U8 *header,CTask *mem_task)
{
U8 *result,*st;
@@ -753,164 +304,3 @@ public I64 PopUpFile(U8 *filename,Bool warn_ext=TRUE,
Free(name);
return result;
}
#help_index "Graphics/Input"
public I64 PopUpColor(U8 *header=NULL,
Bool allow_transparent=TRUE,Bool allow_dft=TRUE)
{//Chooser for 16-color, default or transparent.
I64 i;
CDoc *doc=DocNew;
if (header)
DocPrint(doc,"%s",header);
if (allow_transparent)
DocPrint(doc,"$$MU,\"TRANSPARENT\",LE=TRANSPARENT$$\n");
for (i=0;i<NUM_COLORS;i++)
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-8Z__\",LE=%d$$$$BG$$\n",i,i,"ST_COLORS",i);
if (allow_dft)
DocPrint(doc,"$$BG,WHITE$$$$MU,\"DEFAULT\",LE=DOC_DFT$$$$BG$$");
i=PopUpMenu(doc);
DocDel(doc);
return i;
}
public I64 PopUpColorLighting(U8 *header=NULL)
{//Chooser for std TempleOS $LK,"DCLighting",A="MN:DCLighting"$() color.
I64 i;
CDoc *doc=DocNew;
if (header)
DocPrint(doc,"%s",header);
DocPrint(doc,"\nSingle-Sided means both sides same color."
"\nDouble-Sided means back side darker."
"\n"
"\nHalf-Range means 0 to [0,7]"
"\n [8,15]-8 to [8,15]"
"\nFull-Range means 0 to [0,7] to [0,7]+8"
"\n");
DocPrint(doc,
"\n$$LTPURPLE$$Single-Sided Full-Range Double-Sided Full-Range\n$$BLACK$$");
for (i=0;i<NUM_COLORS/2;i++) {
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",LE=%d$$$$BG$$ ",i,i,"ST_COLORS",i);
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",LE=%d$$$$BG$$\n",i,i,"ST_COLORS",
ROPF_TWO_SIDED+i);
}
DocPrint(doc,
"\n$$LTPURPLE$$Single-Sided Half-Range Double-Sided Half-Range\n$$BLACK$$");
for (i=0;i<NUM_COLORS;i++) {
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",LE=%d$$$$BG$$ ",
i,i,"ST_COLORS",ROPF_HALF_RANGE_COLOR+i);
DocPrint(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",LE=%d$$$$BG$$\n",
i,i,"ST_COLORS",ROPF_TWO_SIDED+ROPF_HALF_RANGE_COLOR+i);
}
i=PopUpMenu(doc);
DocDel(doc);
return i;
}
class CTransformForm
{
F64 x_scale fmtstr "$$DA-TRM,32,RT=F64,A=\"X Scale :%12.6f\"$$\n";
F64 y_scale fmtstr "$$DA-TRM,32,RT=F64,A=\"Y Scale :%12.6f\"$$\n";
F64 z_scale fmtstr "$$DA-TRM,32,RT=F64,A=\"Z Scale :%12.6f\"$$\n";
F64 é_z fmtstr
"\nAngles are in degrees\n$$DA-TRM,32,RT=F64,A=\"Z-Axis :%12.6f\"$$\n";
F64 é_y fmtstr "$$DA-TRM,32,RT=F64,A=\"Y-Axis :%12.6f\"$$\n";
F64 é_x fmtstr "$$DA-TRM,32,RT=F64,A=\"X-Axis :%12.6f\"$$\n";
F64 x_offset fmtstr "\n$$DA-TRM,32,RT=F64,A=\"X Offset:%12.6f\"$$\n";
F64 y_offset fmtstr "$$DA-TRM,32,RT=F64,A=\"Y Offset:%12.6f\"$$\n";
F64 z_offset fmtstr "$$DA-TRM,32,RT=F64,A=\"Z Offset:%12.6f\"$$\n";
};
Bool PopUpTransform(I64 *r)
{
CTransformForm *tf=MAlloc(sizeof(CTransformForm));
tf->x_scale=1.0;
tf->y_scale=1.0;
tf->z_scale=1.0;
tf->é_x=0.0;
tf->é_y=0.0;
tf->é_z=0.0;
tf->x_offset=0.0;
tf->y_offset=0.0;
tf->z_offset=0.0;
if (PopUpForm(tf)) {
MemSet(r,0,16*sizeof(I64));
r[0] =tf->x_scale*GR_SCALE;
r[5] =tf->y_scale*GR_SCALE;
r[10]=tf->z_scale*GR_SCALE;
r[15]=GR_SCALE;
Mat4x4RotZ(r,tf->é_z*ã/180.0);
Mat4x4RotY(r,tf->é_y*ã/180.0);
Mat4x4RotX(r,tf->é_x*ã/180.0);
r[3] =tf->x_offset*GR_SCALE;
r[7] =tf->y_offset*GR_SCALE;
r[11]=tf->z_offset*GR_SCALE;
return TRUE;
} else
return FALSE;
}
#define PU_SPACING 10
U0 DrawIt(CTask *task,CDC *dc)
{
I64 i,j,i1,j1;
CDoc *doc=DocPut(task);
for (j=0;j<17;j++)
for (i=0;i<17;i++) {
if (j<16)
j1=j;
else
j1=TRANSPARENT;
if (i<16)
i1=i;
else
i1=TRANSPARENT;
dc->color=j1+i1<<16+ROPF_DITHER;
GrRect(dc,i*PU_SPACING,j*PU_SPACING+FramePtr("DitherFrame",task),
PU_SPACING,PU_SPACING);
}
i=(17*PU_SPACING+FONT_WIDTH-1)/FONT_WIDTH;
if (doc->max_x>i) i=doc->max_x;
WinHorz(task->win_left,task->win_left+i,task);
WinVert(task->win_top,task->win_top+doc->max_y+
(17*PU_SPACING+FONT_WIDTH-1)/FONT_WIDTH,task);
}
I64 DitherColor2(U8 *header=NULL)
{
I64 msg_code,a1,a2,result=-1,i,j;
DocClear;
"%s",header;
DocRecalc(DocPut);
FramePtrAdd("DitherFrame",(DocPut->max_y+1)*FONT_HEIGHT);
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
Fs->draw_it=&DrawIt;
do {
msg_code=GetMsg(&a1,&a2,1<<MSG_IP_L_DOWN|1<<MSG_KEY_DOWN);
if (msg_code==MSG_IP_L_DOWN) {
msg_code=GetMsg(&a1,&a2,1<<MSG_IP_L_UP);
i=a1/PU_SPACING;
j=(a2-FramePtr("DitherFrame"))/PU_SPACING;
if (a1>=0 && a2>=0 && 0<=j<17 && 0<=i<17) {
if (j==16) j=TRANSPARENT;
if (i==16) i=TRANSPARENT;
result=j+i<<16+ROPF_DITHER;
goto dc_done;
}
}
} while (!(msg_code==MSG_KEY_DOWN && (a1==CH_ESC || a1==CH_SHIFT_ESC)));
do GetMsg(&a1,&a2,1<<MSG_KEY_UP);
while (!a1);
dc_done:
SettingsPop;
FramePtrDel("DitherFrame");
return result;
}
public I64 PopUpColorDither(U8 *header=NULL)
{//Chooser for 2 x 16 colors or transparent.
U8 buf[STR_LEN];
StrPrint(buf,"DitherColor2(0x%X);",header);
return PopUp(buf,Fs);
}
+729
View File
@@ -0,0 +1,729 @@
#help_index "DolDoc/Output;StdOut/DolDoc"
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;
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_bmp_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;
if (sc&SCF_ALT)
switch (ch) {
case CH_BACKSPACE: //<CTRL-H>
if (!(sc&(SCF_SHIFT|SCF_CTRL))) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Undo");
else
DocUndoRestore(doc);
}
break;
}
else
switch (ch) {
case 0:
switch (sc.u8[0]) {
case SC_CURSOR_DOWN:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Cursor Down, Select");
else
KeyDescSet("Edit/Cursor Down");
} else
EdLineDown(doc,sc);
break;
} else
sc&=~SCF_CTRL;
//Fall Through to SC_END
case SC_END:
if (!(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_col=doc_ce->min_col;
DocFormBwd(doc);
}
}
break;
case SC_CURSOR_UP:
if (!(sc&SCF_CTRL)) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Edit/Cursor Up, Select");
else
KeyDescSet("Edit/Cursor Up");
} else
EdLineUp(doc,sc);
break;
} else
sc&=~SCF_CTRL;
//Fall Through to SC_HOME
case SC_HOME:
if (!(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_col=doc_ce->min_col;
DocFormFwd(doc);
}
}
break;
case SC_PAGE_DOWN:
if (!(sc&SCF_CTRL)) {
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_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_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_CTRL)) {
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_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_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_CTRL)) {
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_SHIFT|SCF_CTRL)!=(SCF_SHIFT|SCF_CTRL)) {
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;
case SC_F1...SC_F10:
if (sc&SCF_CTRL) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /Src Code of Sym");
else
KeyDescSet("Edit/Autocomplete Sym");
} else {
DocUnlock(doc);
if (AutoComplete(ON)) {
if (sc&SCF_SHIFT)
ACMan(sc.u8[0]-SC_F1+1,Fs);
else
ACFillIn(sc.u8[0]-SC_F1+1);
}
DocLock(doc);
}
} else {
switch (sc.u8[0]) {
case SC_F1:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /About");
else
KeyDescSet("Cmd /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))
PostMsgWait(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("Cmd /Insert Directory Name");
else
KeyDescSet("Cmd /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)");
} 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("Cmd /God Doodle");
else
KeyDescSet("Cmd /God Song");
} else {
//$LK,"::/Adam/God/HSNotes.TXT"$
if (sc&SCF_SHIFT) {
DocUnlock(doc);
GodDoodle;
DocLock(doc);
} else
GodSong;
}
break;
case SC_F7:
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /God Passage");
else
KeyDescSet("Cmd /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;
}
break;
case CH_CTRLA:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Save As");
else
DocWrite(doc,TRUE);
}
break;
case CH_CTRLB:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Toggle Border");
else
WinBorder(Bt(&doc->win_task->display_flags,
DISPLAYf_NO_BORDER),doc->win_task);
}
break;
case CH_CTRLC:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Copy to Clipboard");
else
EdCopyToClipboard(doc);
}
break;
case CH_CTRLD:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /File Manager");
else {
DocUnlock(doc);
FileMgr;
DocLock(doc);
}
}
break;
case CH_CTRLF:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Search Files");
else
FindWiz;
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Find & Replace");
else
EdFindReplace(doc);
}
break;
case CH_CTRLG:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/GoTo Line Num");
else
EdGoToLine(doc);
}
break;
case CH_BACKSPACE: //<CTRL-H>
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Char /Back Space");
else {
DocCaptureUndo(doc);
doc_ce=doc->cur_entry;
if (doc->cur_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_col=doc_ce->min_col;
} else {
doc->cur_col=doc_ce->max_col;
if (doc->cur_col>doc_ce->min_col)
doc->cur_col--;
EdDelChar(doc);
}
} else {
doc->cur_col--;
EdDelChar(doc);
}
}
}
break;
case CH_CTRLI:
if (sc.u8[0]!=SC_TAB) {
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Indent Out");
else
DocPrint(doc,"$$ID,-2$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /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_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Blinking Text Off");
else
DocPrint(doc,"$$BK,0$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Blinking Text On");
else
DocPrint(doc,"$$BK,1$$");
}
break;
case CH_CTRLL:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Code Tools");
else
EdCodeTools(doc);
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Insert Text Widgets Wizard");
else {
DocUnlock(doc);
EdInsWidgetWiz;
DocLock(doc);
}
}
break;
case CH_CTRLM:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Personal Notes");
else
Ed("::/Home/PersonalNotes.TXT.Z");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Personal Menu");
else {
m=DocRead("::/Home/PersonalMenu.TXT.Z");
DocMenu(m);
DocDel(m);
}
}
break;
case CH_CTRLO:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Collapse");
else
DocCollapse(TRUE,doc);
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Uncolapse");
else
DocCollapse(FALSE,doc);
}
break;
case CH_CTRLP:
if (doc->flags & (DOCF_SUPERSCRIPT_MODE | DOCF_SUBSCRIPT_MODE)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /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("Dol /Toggle Subscript");
else {
DocPrint(doc,"$$SY,3$$");
doc->flags|=DOCF_SUBSCRIPT_MODE;
}
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Toggle Superscript");
else {
DocPrint(doc,"$$SY,-3$$");
doc->flags|=DOCF_SUPERSCRIPT_MODE;
}
}
break;
case CH_CTRLQ:
break;
case CH_CTRLR:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Cmd /Sprite Graphic Resource");
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->top_line_num)*FONT_HEIGHT);
else
EdSpriteIns(doc,
(doc_ce->x+doc->cur_col-doc->line_start_col)*FONT_WIDTH,
(doc_ce->y-doc->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_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Underline Off");
else
DocPrint(doc,"$$UL,0$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Underline On");
else
DocPrint(doc,"$$UL,1$$");
}
break;
case CH_CTRLV:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Paste Clipboard");
else
EdPasteClipboard(doc);
}
break;
case CH_CTRLW:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Word Wrap Off");
else
DocPrint(doc,"$$WW,0$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Word Wrap On");
else
DocPrint(doc,"$$WW,1$$");
}
break;
case CH_CTRLX:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Cut To Clipboard");
else
EdCutToClipboard(doc);
}
break;
case CH_CTRLY:
if (!(sc&SCF_SHIFT)) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Edit/Delete Line");
else
EdDelLine(doc);
}
break;
case CH_CTRLZ:
if (sc&SCF_SHIFT) {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Inverted Text Off");
else
DocPrint(doc,"$$IV,0$$");
} else {
if (sc&SCF_KEY_DESC)
KeyDescSet("Dol /Inverted Text On");
else
DocPrint(doc,"$$IV,1$$");
}
break;
case '0'...'9':
if (sc&SCF_CTRL) {
if (sc&SCF_KEY_DESC) {
if (sc&SCF_SHIFT)
KeyDescSet("Cmd /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);
}
}
}
break;
case '[':
if (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_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;
}
}
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;
}
+358
View File
@@ -0,0 +1,358 @@
#help_index "DolDoc/Output;StdOut/DolDoc"
CDocEntry *DocPutS(CDoc *doc,U8 *st)
{//Don't use this. Use $LK-UL,"DocPrint",A="MN:DocPrint"$().
//Does not handle partial Doc entries
//Returns last newly created dollar-sign CDocEntry.
U8 *ptr=st,*ptr2,*st2,*ptr3,*ptr4,*src,
*char_bitmap;
Bool unlock;
I64 ch,j;
CDocEntry *doc_e=NULL,*result=NULL,*doc_ce;
if (!st || !doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
return NULL;
unlock=DocLock(doc);
if (doc->flags & DOCF_PLAIN_TEXT_WITH_TABS)
char_bitmap=chars_bmp_zero_cr_nl_cursor;
else if (doc->flags & DOCF_PLAIN_TEXT)
char_bitmap=chars_bmp_zero_tab_ff_cr_nl_cursor;
else
char_bitmap=chars_bmp_zero_tab_ff_cr_nl_cursor_dollar;
doc_ce=doc->cur_entry;
while (*ptr) {
ptr2=ptr;
do ch=*ptr++;
while (!Bt(char_bitmap,ch) || ch==CH_CURSOR && doc->flags&DOCF_NO_CURSOR);
ptr--;
if (!ch) {
if (j=ptr-ptr2) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_TEXT];
if (doc->flags & DOCF_NO_CURSOR) {
src=MAlloc(j+1);
MemCpy(src,ptr2,j+1);
StrUtil(src,SUF_REM_CTRL_CHARS);
j=StrLen(src);
} else
src=ptr2;
doc_e->tag=MAlloc(j+1,doc->mem_task);
MemCpy(doc_e->tag,src,j+1);
doc_e->max_col=j;
DocInsEntry(doc,doc_e);
if (doc->flags & DOCF_NO_CURSOR)
Free(src);
}
} else {
if (j=ptr-ptr2) {
*ptr=0;
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_TEXT];
if (doc->flags & DOCF_NO_CURSOR) {
src=MAlloc(j+1);
MemCpy(src,ptr2,j+1);
ptr3=src;
ptr4=src;
while (*ptr3)
if (*ptr3!=CH_CURSOR)
*ptr4++=*ptr3++;
else
ptr3++;
*ptr4=0;
j=ptr4-src;
} else
src=ptr2;
doc_e->tag=MAlloc(j+1,doc->mem_task);
MemCpy(doc_e->tag,src,j+1);
doc_e->max_col=j;
DocInsEntry(doc,doc_e);
if (doc->flags & DOCF_NO_CURSOR)
Free(src);
*ptr=ch;
}
switch (ch) {
case CH_CURSOR:
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_CURSOR | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_CURSOR];
DocInsEntry(doc,doc_e);
ptr++;
break;
case CH_FORM_FEED:
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_PAGE_BREAK | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_PAGE_BREAK];
DocInsEntry(doc,doc_e);
ptr++;
break;
case '\t':
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_TAB | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_TAB];
DocInsEntry(doc,doc_e);
ptr++;
break;
case '$$':
ptr++; //skip first dollar
ptr2=ptr;
while (*ptr && *ptr!='$$')
ptr++;
if (*ptr) {
*ptr=0; //zero second dollar
if (ptr-1==ptr2 && *ptr2==CH_CURSOR) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_CURSOR | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_CURSOR];
DocInsEntry(doc,doc_e);
ptr2++;
}
if (ptr==ptr2) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr<<8;
doc_e->max_col=1;
if (doc->flags & DOCF_DBL_DOLLARS)
doc_e->tag=StrNew("$$$$",doc->mem_task);
else
doc_e->tag=StrNew("$$",doc->mem_task);
doc_e->de_flags=doldoc.dft_de_flags[DOCT_TEXT];
DocInsEntry(doc,doc_e);
} else {
st2=MAlloc(ptr-ptr2+1);
ptr3=ptr2;
ptr4=st2;
while (ch=*ptr3++) {
if (ch==CH_CURSOR) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_CURSOR | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_CURSOR];
DocInsEntry(doc,doc_e);
} else if (ch==CH_FORM_FEED) {
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_PAGE_BREAK |
doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_PAGE_BREAK];
DocInsEntry(doc,doc_e);
} else
*ptr4++=ch;
}
*ptr4=0;
if (doc_e=PrsDollarCmd(doc,st2)) {
result=doc_e;
DocInsEntry(doc,doc_e);
}
Free(st2);
}
*ptr++='$$';
}
break;
default:
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
doc_e->type=DOCT_NEW_LINE | doc->settings_root.dft_text_attr<<8;
doc_e->de_flags=doldoc.dft_de_flags[DOCT_NEW_LINE];
DocInsEntry(doc,doc_e);
if (ch=='\r')
while (*ptr=='\r')
ptr++;
if (*ptr=='\n')
ptr++;
while (*ptr=='\r')
ptr++;
}
}
}
if (unlock)
DocUnlock(doc);
return result;
}
public CDocEntry *DocPrint(CDoc *doc,U8 *fmt,...)
{//You must not print partial doc cmds.
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
CDocEntry *result=DocPutS(doc,buf);
Free(buf);
return result;
}
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_bmp_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_bmp_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_col;
doc->cur_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_col=StrLen(ptr2);
}
*ptr=ch;
DocRemSoftNewLines(doc,doc->cur_entry);
}
}
if (unlock)
DocUnlock(doc);
if (!(doc->flags&DOCF_DONT_SWAP_OUT))
Yield;
Free(buf);
}
Bool KDDocPutS(U8 *st)
{
CDoc *doc;
if (doc=DocPut)
DocPrintPartial(doc,"%s",st);
return FALSE;
}
public U0 DocPrintAtomic(CDoc *doc,U8 *fmt,...)
{//Prints multiple whole cmds all-at-once. Might need this when printing trees.
U8 *buf;
Bool unlock;
I64 old_flags;
if (!doc && !(doc=DocPut))
return;
buf=StrPrintJoin(NULL,fmt,argc,argv);
unlock=DocLock(doc);
old_flags=doc->flags;
doc->flags|=DOCF_NO_CURSOR;
DocPrint(doc,"%s",buf);
DocRecalc(doc);
doc->flags=old_flags;
if (unlock)
DocUnlock(doc);
Free(buf);
}
U0 DocDump(CDoc *doc,I64 uS_delay=0)
{
U8 *st;
CDocEntry *doc_e,*doc_e2;
Bool unlock=DocLock(doc);
doc_e=doc->root.next;
while (doc_e!=doc) {
st=DocScanLine(doc,doc_e,NULL,&doc_e2);
"%s",st;
Free(st);
doc_e=doc_e2;
if (doc_e->type_u8==DOCT_NEW_LINE) {
'\n';
BusyWait(uS_delay);
doc_e=doc_e->next;
}
}
if (unlock)
DocUnlock(doc);
}
public CDocEntry *DocPutLine(CDoc *doc=NULL,CDocEntry *doc_e)
{//Send line from other doc to StdOut $LK,"DocPut",A="MN:DocPut"$.
I64 ch;
U8 *ptr,*ptr2;
Bool unlock;
if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
return NULL;
unlock=DocLock(doc);
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE) {
if (doc_e->de_flags&DOCEF_TAG) {
ptr=doc_e->tag;
do {
ptr2=ptr;
while (ch=*ptr)
if (ch=='$$')
break;
else
ptr++;
*ptr=0;
"%s",ptr2;
*ptr=ch;
if (ch=='$$') {
"$$$$";
ptr++;
}
} while (ch);
} else if (doc_e->type_u8==DOCT_TAB)
'\t';
doc_e=doc_e->next;
}
'\n';
if (doc_e!=doc)
doc_e=doc_e->next;
if (unlock)
DocUnlock(doc);
return doc_e;
}
#help_index "Debugging/Dump;DolDoc/Cmd Line (Typically);"\
"Cmd Line (Typically);DolDoc/Output;StdOut/DolDoc"
public U0 DocDm(U8 *buf,I64 cnt=0x80)
{//Dump live chunk of mem showing addresses. Can be edited.
CDocEntry *doc_e;
CDoc *doc=DocPut;
Bool unlock=DocLock(doc);
doc_e=DocPrint(doc,"$$HX-Z,%d,16$$",cnt);
doc_e->data=buf;
doc->cur_entry=doc_e->next;
DocRecalc(doc);
if (unlock)
DocUnlock(doc);
}
public U0 DocD(U8 *buf,I64 cnt=0x80)
{//Dump live chunk of mem showing offsets. Can be edited.
CDocEntry *doc_e;
CDoc *doc=DocPut;
Bool unlock=DocLock(doc);
doc_e=DocPrint(doc,"$$HX,%d,16$$",cnt);
doc_e->data=buf;
doc->cur_entry=doc_e->next;
DocRecalc(doc);
if (unlock)
DocUnlock(doc);
}
@@ -606,7 +606,7 @@ public Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC)
case DOCT_TEXT:
if (!col2 && !(doc_e->de_flags
&(DOCEF_TREE|DOCEF_LST|DOCEF_TAG_CB|DOCEF_DEFINE|
DOCEF_HTML_LINK|DOCEF_BIN_PTR_LINK)))
DOCEF_AUX_STR|DOCEF_HTML_LINK|DOCEF_BIN_PTR_LINK)))
del_cl=TRUE;
break;
case DOCT_HEX_ED:
@@ -6,21 +6,6 @@ I64 DocCharDist(CDoc *doc,I64 x,I64 y)
return (SqrI64(doc->x-x)+SqrI64(doc->y-y))*FONT_WIDTH*FONT_WIDTH;
}
public U0 DocCenter(CDoc *doc=NULL,I64 recalc=DOC_RECALC)
{//Center win on doc cursor, cur_entry.
Bool unlock;
CTask *task;
if (!doc && !(doc=DocPut))
return;
unlock=DocLock(doc);
task=doc->win_task;
DocRecalc(doc,FALSE,recalc);
if (!(doc->flags&DOCF_BORDER_DOC))
doc->top_line_num=doc->y-(task->win_height+1)>>1;
if (unlock)
DocUnlock(doc);
}
U0 DocDelToNum(CDoc *doc,I64 num)
{
CDocEntry *doc_e=doc->root.next,*doc_e2;
@@ -62,7 +47,6 @@ U0 DocBorderLstDraw(CDoc *doc)
U64 ch;
CDoc *templ=doc;
CD3I64 saved_scroll;
Bool old_preempt=Preempt;
while (templ && templ->doc_signature==DOC_SIGNATURE_VAL) {
y+=(Bsr(templ->desc)+7)>>3+1; //StrLen+1
templ=templ->parent_doc;
@@ -84,7 +68,40 @@ U0 DocBorderLstDraw(CDoc *doc)
templ=templ->parent_doc;
}
WinScrollRestore(win_task,&saved_scroll);
Preempt(old_preempt);
}
public U0 DocTop(CDoc *doc=NULL)
{//Move cursor, cur_entry, to top.
Bool unlock;
if (!doc && !(doc=DocPut))
return;
unlock=DocLock(doc);
doc->cur_entry=doc->root.next;
doc->cur_col=doc->cur_entry->min_col;
doc->x=0;
doc->y=0;
doc->line_start_col=0;
doc->top_line_num=0;
DocFormFwd(doc);
DocRecalc(doc);
if (unlock)
DocUnlock(doc);
}
public U0 DocCenter(CDoc *doc=NULL,I64 recalc=DOC_RECALC)
{//Center win on doc cursor, cur_entry.
Bool unlock;
CTask *task;
if (!doc && !(doc=DocPut))
return;
unlock=DocLock(doc);
task=doc->win_task;
DocRecalc(doc,FALSE,recalc);
if (!(doc->flags&DOCF_BORDER_DOC))
doc->top_line_num=doc->y-(task->win_height+1)>>1;
if (unlock)
DocUnlock(doc);
}
public U0 DocBottom(CDoc *doc=NULL)
@@ -145,25 +162,21 @@ public U0 DocCollapse(Bool collapse=TRUE,CDoc *doc=NULL)
DocUnlock(doc);
}
#help_index "DolDoc/Output;StdOut/DolDoc"
public U0 DocPrintAtomic(CDoc *doc,U8 *fmt,...)
{//Necessary when hidden text might screw-up
//inserts. It does multiple whole doc cmds all-at-once.
U8 *buf;
Bool unlock;
I64 old_flags;
if (!doc && !(doc=DocPut))
return;
buf=StrPrintJoin(NULL,fmt,argc,argv);
unlock=DocLock(doc);
old_flags=doc->flags;
doc->flags|=DOCF_NO_CURSOR;
DocPrint(doc,"%s",buf);
DocRecalc(doc);
doc->flags=old_flags;
if (unlock)
DocUnlock(doc);
Free(buf);
#help_index "DolDoc/Cmd Line (Typically);Cmd Line (Typically)"
public I64 DocMax(I64 i=MAX_I64)
{//Set max document entries. (Cmd line buffer.)
//Adjusts the size of the cmd line buf.
//Normally, the cmd line deletes entries
//when more are added and the old scroll up.
//See $LK,"max_entries",A="FF:::/Adam/DolDoc/DocTerm.CPP,max_entries"$.
I64 result;
CDoc *doc;
if (doc=DocPut) {
result=doc->max_entries;
doc->max_entries=i;
return result;
} else
return 0;
}
#help_index "DolDoc/Task;StdOut/Task"
@@ -172,7 +185,6 @@ U0 DocUpdateTaskDocs(CTask *task)
CDrv *dv;
CDoc *doc;
CD3I64 saved_scroll;
Bool old_preempt=Preempt;
I64 border_attr;
if (task->border_src==BDS_CUR_DRV && task->cur_dv) {
border_attr=task->cur_dv->text_attr;
@@ -193,14 +205,11 @@ U0 DocUpdateTaskDocs(CTask *task)
Fs->catch_except=TRUE;
if (task->title_src==TTS_ED_FILENAME)
MemCpy(task->task_title,doc->filename.name,TASK_TITLE_LEN);
Preempt(old_preempt);
DocRecalc(doc,TRUE,DOC_RECALC_TO_SCREEN);
Preempt;
}
if ((doc=DocBorder(task)) && !(doc->flags&DOCF_DONT_SHOW)) {
WinScrollNull(task,&saved_scroll);
DocRecalc(doc,FALSE,DOC_RECALC_TO_SCREEN);
WinScrollRestore(task,&saved_scroll);
}
Preempt(old_preempt);
}
+103
View File
@@ -0,0 +1,103 @@
#help_index "DolDoc"
public I64 DocEntryRun(CDoc *doc,CDocEntry *doc_e,
Bool exited,I64 *_has_action=NULL)
{//Do action on final entry selected by user.
//Sometimes returns locked, sometimes unlocked
U8 ch=doc->cmd_U8,*st;
I64 result=DOCM_CANCEL,has_action=FALSE;
CHashDefineStr *temph;
DocLock(doc);
if (!exited) {
if (doc_e->de_flags & DOCEF_ESC) {
Msg(MSG_KEY_DOWN,CH_ESC,0,1<<SVCf_DONT_FILTER);
has_action=TRUE;
goto er_done;
} if (doc_e->de_flags & DOCEF_QUIT) {
Msg(MSG_KEY_DOWN,CH_SHIFT_ESC,0,1<<SVCf_DONT_FILTER);
has_action=TRUE;
goto er_done;
} else if (doc_e->de_flags & DOCEF_CHECK_COLLAPSABLE) {
doc_e->de_flags^=DOCEF_CHECKED_COLLAPSED;
has_action=TRUE;
}
}
try {
if (ch==CH_SPACE) {
if (doc_e->de_flags & DOCEF_LINK && doc->left_click_link) {
result=(*doc->left_click_link)(doc,doc_e);
has_action=TRUE;
}
if (doc_e->de_flags & DOCEF_LEFT_EXP) {
result=doc_e->left_exp;
has_action=TRUE;
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
}
if (doc_e->de_flags & DOCEF_LEFT_CB && doc_e->left_cb) {
DocUnlock(doc);
result=(*doc_e->left_cb)(doc,doc_e);
has_action=TRUE;
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
}
if (doc_e->de_flags & DOCEF_LEFT_MACRO) {
if (doc_e->de_flags & DOCEF_POPUP) {
st=StrNew(doc_e->left_macro);
DocUnlock(doc);
PopUp(st,Fs);
Free(st);
} else {
if (doc_e->de_flags & DOCEF_LEFT_AUTO)
AutoStr("%s",doc_e->left_macro);
else
Auto("%s",doc_e->left_macro);
}
has_action=TRUE;
}
if (!exited && doc_e->de_flags & DOCEF_LST &&
doc_e->de_flags & DOCEF_DEFINE &&
(temph=HashFind(doc_e->define_str,
doc->win_task->hash_table,HTT_DEFINE_STR)) &&
(result=PopUpPickLst(temph->data))!=DOCM_CANCEL) {
DocDataFmt(doc,doc_e,result);
DocDataScan(doc,doc_e);
has_action=TRUE;
}
} else if (ch=='\n') {
if (doc_e->de_flags & DOCEF_LINK && doc->right_click_link) {
result=(*doc->right_click_link)(doc,doc_e);
has_action=TRUE;
}
if (doc_e->de_flags & DOCEF_RIGHT_EXP) {
result=doc_e->right_exp;
has_action=TRUE;
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
}
if (doc_e->de_flags & DOCEF_RIGHT_CB && doc_e->right_cb) {
DocUnlock(doc);
result=(*doc_e->right_cb)(doc,doc_e);
has_action=TRUE;
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
}
if (doc_e->de_flags & DOCEF_RIGHT_MACRO) {
if (doc_e->de_flags & DOCEF_POPUP) {
st=StrNew(doc_e->right_macro);
DocUnlock(doc);
PopUp(st,Fs);
Free(st);
} else {
if (doc_e->de_flags & DOCEF_RIGHT_AUTO)
AutoStr("%s",doc_e->right_macro);
else
Auto("%s",doc_e->right_macro);
}
has_action=TRUE;
}
}
}
catch
DocBottom(doc);
doc->cmd_U8=CH_SPACE;
er_done:
if (_has_action) *_has_action=has_action;
return result;
}
+192
View File
@@ -0,0 +1,192 @@
#help_index "DolDoc/Task;StdOut/Task"
public CDoc *DocBorderNew(CDoc *pdoc)
{//Make new std border doc.
CDocEntry *doc_e;
CDoc *bdoc;
bdoc=DocNew;
bdoc->flags|=DOCF_BORDER_DOC;
if (pdoc) {
DocPrint(bdoc,"$$CM+H+BY+RX+NC,-7,1$$");
doc_e=DocPrint(bdoc,"$$TX+H+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdFilterCB;
doc_e=DocPrint(bdoc,"$$TX+H+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdOverStrikeCB;
doc_e=DocPrint(bdoc,"$$TX+H+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdDollarCB;
DocPrint(bdoc,"$$CM+H+BY+RX+NC,-18,1$$");
doc_e=DocPrint(bdoc,"$$TX+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdMoreCB;
doc_e=DocPrint(bdoc,"$$TX+H+BD+TC,\" \"$$");
doc_e->user_data=pdoc;
doc_e->tag_cb=&EdDollarTypeCB;
}
DocPrint(bdoc,"$$CM+H+TY+NC,0,-1$$");
doc_e=DocPrint(bdoc,"$$DA+H-TRM-P+BD+RD+CX+IV,140,A=\"%%s...\",SCX=15$$");
doc_e->data=&Fs->task_title;
DocDataFmt(bdoc,doc_e);
DocPrint(bdoc,"$$CM+H+NC,1,0$$$$TX+H+BD+IV,\"%X\"$$",Fs);
DocPrint(bdoc,"$$TX+H+RX+BD,\"[X]\"$$");
DocPrint(bdoc,"$$BK,1$$$$TX+H+LX+BD,\"MENU\"$$$$BK,0$$");
return bdoc;
}
public U0 DocTermNew()
{//Make into term win task with Put/Display/Border docs.
CDoc *pdoc=DocNew;
pdoc->right_click_link=&TermRightClickLink;
pdoc->max_entries=4096;
Fs->border_src=BDS_CUR_DRV;
pdoc->desc='Term';
Fs->put_doc=Fs->display_doc=pdoc;
Fs->border_doc=DocBorderNew(pdoc);
Fs->cur_menu=MenuFile("::/Doc/EdPullDown.TXT");
WinScrollsInit(Fs);
Raw(OFF);
}
#help_index "DolDoc"
#define RIGHT_INCLUDE 0
#define RIGHT_AINCLUDE 1
#define RIGHT_COPY 2
#define RIGHT_MOVE 3
#define RIGHT_DELETE 4
#define RIGHT_TYPE 5
#define RIGHT_ED 6
#define RIGHT_PLAIN 7
#define RIGHT_AUTOFILE 8
I64 PopUpTermRight(U8 *header)
{
I64 i;
CDoc *doc=DocNew;
if (header) DocPrint(doc,"%s",header);
DocPrint(doc,"\n\n"
"TXT=%s\nJIT=%s\nGRA=%s"
"$$CM+LX,1,3 $$$$BT,\"INCLUDE JIT\",LE=RIGHT_INCLUDE$$"
"$$CM+LX,26,0$$$$BT,\"ADAM_INCLUDE JIT\",LE=RIGHT_AINCLUDE$$"
"$$CM+LX,1,3 $$$$BT,\"COPY \",LE=RIGHT_COPY$$"
"$$CM+LX,26,0$$$$BT,\"MOVE OR RENAME \",LE=RIGHT_MOVE$$"
"$$CM+LX,1,3 $$$$BT,\"DELETE \",LE=RIGHT_DELETE$$"
"$$CM+LX,26,0$$$$BT,\"TYPE TXT;GRA\",LE=RIGHT_TYPE$$"
"$$CM+LX,1,3 $$$$BT,\"ED TXT\",LE=RIGHT_ED$$"
"$$CM+LX,26,0$$$$BT,\"PLAIN ED TXT\",LE=RIGHT_PLAIN$$"
"$$CM+LX,1,3 $$$$BT,\"CANCEL \",LE=DOCM_CANCEL$$"
"$$CM+LX,26,0$$$$BT,\"AUTOFILE AUT\",LE=RIGHT_AUTOFILE$$\n",
FILEMASK_TXT,FILEMASK_JIT,FILEMASK_GRA);
i=PopUpMenu(doc);
DocDel(doc);
return i;
}
I64 EdLeftClickLink(CDoc *doc,CDocEntry *doc_e)
{//Called with doc locked, exit unlocked
Bool result;
U8 *st;
if (st=DocEntryLink(doc,doc_e)) {
DocUnlock(doc);
if (doc_e->de_flags & DOCEF_POPUP)
result=PopUpEd(st);
else
result=Ed(st);
Free(st);
return result;
}
}
I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
{//Called with doc locked, exit unlocked
Bool send_new_line=FALSE,result=FALSE;
U8 *st,*st2;
I64 i;
CEdFileName fn;
if (st2=DocEntryLink(doc,doc_e)) {
if (st=DocLinkFile(st2)) {
DocUnlock(doc);
if ((i=PopUpTermRight(st))>=0) {
DocBottom(doc);
switch (i) {
case RIGHT_INCLUDE:
if (FileExtDot(st) && !FilesFindMatch(st,FILEMASK_JIT)) {
if (!PopUpCancelOk(ST_WARN_ST "Not .CPP File\n\n")) {
send_new_line=TRUE;
break;
}
}
"#include \"%s\";\n$$PT$$$$FG$$$$BG$$",st;
WinZBufUpdate;
ExeFile(st);
result=TRUE;
break;
case RIGHT_AINCLUDE:
if (FileExtDot(st) && !FilesFindMatch(st,FILEMASK_JIT)) {
if (!PopUpCancelOk(ST_WARN_ST "Not .CPP File\n\n")) {
send_new_line=TRUE;
break;
}
}
"Adam(\"#include \\\"%s\\\"\" );\n$$PT$$$$FG$$$$BG$$",st;
WinZBufUpdate;
AdamFile(st,FALSE);
result=TRUE;
break;
case RIGHT_COPY:
StrCpy(fn.name,st);
if (DocForm(&fn)) {
result=ToBool(Copy(st,fn.name));
} else
send_new_line=TRUE;
break;
case RIGHT_MOVE:
StrCpy(fn.name,st);
if (DocForm(&fn))
result=Move(st,fn.name);
else
send_new_line=TRUE;
break;
case RIGHT_DELETE:
result=ToBool(Del(st));
break;
case RIGHT_TYPE:
result=Type(st);
break;
case RIGHT_ED:
"Ed(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
result=Ed(st);
break;
case RIGHT_PLAIN:
"Plain(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
result=Plain(st);
break;
case RIGHT_AUTOFILE:
if (FileExtDot(st) && !FilesFindMatch(st,"*.AUT*")) {
if (!PopUpCancelOk(ST_WARN_ST "Not .AUT File\n\n")) {
send_new_line=TRUE;
break;
}
}
"AutoFile(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
WinZBufUpdate;
AutoFile(st);
result=TRUE;
break;
}
} else
send_new_line=TRUE;
Free(st);
} else
send_new_line=TRUE;
Free(st2);
} else
send_new_line=TRUE;
DocBottom(doc);
"$$PT$$$$FG$$$$BG$$";
if (send_new_line)
'\n';
return result;
}
@@ -4,8 +4,6 @@ U8 *ctrl_L_footer=
"\n$$MU-X+Q,\"Abort\",LE=DOCM_CANCEL$$\n"
"\n\n$$LK+PU,\"Click for Help\",A=\"FI:::/Doc/Widget.TXT\"$$\n";
#define DFT_ADDR_LINK_BIN_SIZE 64
I64 PopUpLinkType(Bool include_anchor)
{
I64 i;
@@ -34,8 +32,9 @@ I64 PopUpLinkType(Bool include_anchor)
class CEdFileLink
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n",
aux[512];
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512];
I64 num;
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
@@ -46,8 +45,9 @@ class CEdFileLink
class CEdFileAnchorLink
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n",
aux[512] fmtstr "$$DA-P,511,A=\"Anchor Label :%s\"$$\n";
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512] fmtstr "$$DA-P,511,A=\"Anchor Label :%s\"$$\n";
I64 num;
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
@@ -58,8 +58,9 @@ class CEdFileAnchorLink
class CEdFileFindLink
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n",
aux[512] fmtstr "$$DA-P,511,A=\"Str :%s\"$$\n";
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512] fmtstr "$$DA-P,511,A=\"Str :%s\"$$\n";
I64 num fmtstr "$$DA-TRM,511,A=\"Occurrence Num:%04d\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
@@ -70,8 +71,9 @@ class CEdFileFindLink
class CEdFileLineLink
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n",
aux[512];
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512];
I64 num fmtstr "$$DA-TRM,511,A=\"Line Num :%04d\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
@@ -82,8 +84,9 @@ class CEdFileLineLink
class CEdManPageLink
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512],
aux[512] fmtstr "$$DA-P,511,A=\"Label :%s\"$$\n";
file[512];
I64 book;
U8 aux[512] fmtstr "$$DA-P,511,A=\"Label :%s\"$$\n";
I64 num;
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
@@ -94,8 +97,9 @@ class CEdManPageLink
class CEdAddrLink
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512],
aux[512] fmtstr "$$DA-P,511,A=\"Addr Exp :%s\"$$\n";
file[512];
I64 book;
U8 aux[512] fmtstr "$$DA-P,511,A=\"Addr Exp :%s\"$$\n";
I64 num fmtstr "$$DA-TRM,511,A=\"Bin Size :%04d\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
@@ -106,8 +110,9 @@ class CEdAddrLink
class CEdPlaceAnchor
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512],
aux[512] fmtstr "$$DA-P,511,A=\"Anchor Label :%s\"$$\n";
file[512];
I64 book;
U8 aux[512] fmtstr "$$DA-P,511,A=\"Anchor Label :%s\"$$\n";
I64 num;
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up,
@@ -118,9 +123,11 @@ class CEdPlaceAnchor
class CEdBibleLink
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512],
aux[512] fmtstr "$$DA-P,511,A=\"Chapter Verse :%s\"$$\n";
file[512];
I64 book fmtstr "$$LS,D=\"ST_BIBLE_BOOKS\"$$\n";
U8 aux[512] fmtstr "$$DA-P,511,A=\"Chapter Verse :%s\"$$\n";
I64 num;
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
quote fmtstr "$$CB,\"Quote\"$$\n",
@@ -130,8 +137,9 @@ class CEdBibleLink
class CEdDefLink
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512],
aux[512] fmtstr "$$DA-P,511,A=\"Word :%s\"$$\n";
file[512];
I64 book;
U8 aux[512] fmtstr "$$DA-P,511,A=\"Word :%s\"$$\n";
I64 num fmtstr "$$DA-TRM,511,A=\"Def Num :%4d\"$$\n";
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
@@ -142,8 +150,9 @@ class CEdDefLink
class CEdProject
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n",
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n",
aux[512];
file[512] fmtstr "$$DA-P,511,A=\"File :%s\"$$\n";
I64 book;
U8 aux[512];
I64 num;
U8 html_link[512] fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n",
@@ -154,7 +163,6 @@ class CEdProject
Bool GetLink(I64 type,U8 **_tag,U8 **_link,Bool *_pop_up,
Bool *_quote,U8 **_html_link)
{
I64 i;
CEdFileLink *e=CAlloc(sizeof(CEdFileLink));
Bool result=FALSE;
if (type>=0) {
@@ -269,17 +277,14 @@ Bool GetLink(I64 type,U8 **_tag,U8 **_link,Bool *_pop_up,
*_link=StrNew(e->aux);
}
break;
case LK_BIBLE_FIND: //TODO
i=PopUpPickDefineSub("ST_BIBLE_BOOKS");
if (i>=0) {
if (DocForm(e,"CEdBibleLink",,,ctrl_L_footer)) {
result=TRUE;
if (!*e->tag)
*_tag=MStrPrint("%Z,%s",i,"ST_BIBLE_BOOKS",e->aux);
else
*_tag=StrNew(e->tag);
*_link=MStrPrint("BF:%Z,%s",i,"ST_BIBLE_BOOKS",e->aux);
}
case LK_BIBLE_FIND:
if (DocForm(e,"CEdBibleLink",,,ctrl_L_footer)) {
result=TRUE;
if (!*e->tag)
*_tag=MStrPrint("%Z,%s",e->book,"ST_BIBLE_BOOKS",e->aux);
else
*_tag=StrNew(e->tag);
*_link=MStrPrint("BF:%Z,%s",e->book,"ST_BIBLE_BOOKS",e->aux);
}
break;
case LK_DEF:
@@ -469,11 +474,11 @@ U0 EdInsPageSetting()
Free(e);
}
I64 PopUpDollarType()
I64 PopUpWidgetType()
{
I64 i;
CDoc *doc=DocNew;
DocPrint(doc,"$$PURPLE$$$$TX+CX,\"Text Widget Menu\"$$\n"
DocPrint(doc,"$$PURPLE$$$$TX+CX,\"Text Widgets Menu\"$$\n"
"\n$$LTBLUE$$$$MU,\"Link\",LE=DOCT_LINK$$\n"
"$$MU,\"Text\",LE=DOCT_TEXT$$\n"
"$$MU,\"Tree Branch\",LE=DOCT_TREE$$\n"
@@ -496,7 +501,7 @@ I64 PopUpDollarType()
return i;
}
class CEdDollarText
class CEdText
{
U8 tag[512] fmtstr "$$DA-P,511,A=\"Tag Text :%s\"$$\n";
Bool left_x fmtstr "$$CB,\"Left X\"$$\n",
@@ -520,10 +525,10 @@ class CEdDollarText
fmtstr "$$DA-P,511,A=\"Html Link :%s\"$$\n";
};
U0 EdInsDollarText()
U0 EdInsText()
{
U8 *st,buf[512];
CEdDollarText *e=CAlloc(sizeof(CEdDollarText));
CEdText *e=CAlloc(sizeof(CEdText));
if (DocForm(e,,,,ctrl_L_footer)) {
*buf=0;
if (e->left_x ) CatPrint(buf,"+LX");
@@ -964,9 +969,9 @@ U0 EdInsTree()
Free(e);
}
U0 EdInsDollarCmd()
U0 EdInsWidgetWiz()
{
I64 type=PopUpDollarType;
I64 type=PopUpWidgetType;
switch (type) {
case DOCT_FOREGROUND:
EdInsColor;
@@ -978,7 +983,7 @@ U0 EdInsDollarCmd()
EdInsLink;
break;
case DOCT_TEXT:
EdInsDollarText;
EdInsText;
break;
case DOCT_TREE:
EdInsTree;
@@ -1030,7 +1035,7 @@ I64 PopUpSpriteType()
{
I64 i;
CDoc *doc=DocNew;
DocPrint(doc,"$$PURPLE$$$$TX+CX,\"Graphic Resource Menu\"$$\n"
DocPrint(doc,"$$PURPLE$$$$TX+CX,\"Graphic Sprite Resource Menu\"$$\n"
"$$LK+PU+CX,\"Click for Help\",A=\"FI:::/Doc/Resource.TXT.Z\"$$\n"
"\n$$LTBLUE$$$$MU,\"Make Sprite\",LE=EST_SPRITE$$\n"
"$$MU,\"Pointer to Sprite\",LE=EST_SPRITE_PTR$$\n"
+69
View File
@@ -0,0 +1,69 @@
Cd(__DIR__);;
#help_index "DolDoc"
#help_file "::/Doc/DolDoc"
/*
TempleOS DolDoc's can have "cursor movement" cmds which can move the cursor up
the screen and layer on existing text. It can also have callback funs which
supply live, changing text. For these reasons, you can't assume you know
where the visible portion of the document is and must process much
of the document each time it is placed on the screen, becoming CPU
intensive on big documents.
See $LK,"::/Doc/DolDocOverview.TXT"$
*/
//Hash Types
#define DHT_DOC_CMD 1
#define DHT_DOC_FLAG 2
#define DHT_COLOR 4
public class CDolDocGlbls
{
CHashTable *hash;
I64 dft_de_flags [DOCT_NUM_TYPES],
type_flags_nontag_invisible [(DOCT_NUM_TYPES+63)/64],
type_flags_form [(DOCT_NUM_TYPES+63)/64],
type_flags_data [(DOCT_NUM_TYPES+63)/64],
clean_scan_codes [4];
I32 dft_type_flags [DOCT_NUM_TYPES];
} doldoc;
MemSet(&doldoc,0,sizeof(CDolDocGlbls));
#help_index "God"
#define BIBLE_FILENAME "::/Misc/Bible.TXT.Z"
#include "DocExt"
#include "DocBin"
#include "DocNew"
#include "DocForm"
#include "DocDblBuf"
#include "DocPlain"
#include "DocInit"
#include "DocHighlight"
#include "DocRecalcLib"
#include "DocRecalc"
#include "DocFile"
#include "DocClipBoard"
#include "DocRun"
#include "DocGet"
#include "DocChar"
#include "DocFind"
#include "DocLink"
#include "DocEd"
#include "DocPopUp"
#include "DocGr"
#include "DocMacro"
#include "DocWidgetWiz"
#include "DocPutKey"
#include "DocPutS"
#include "DocOpt"
#include "DocCodeTools"
#include "DocTree"
#include "DocTerm"
KeyDevAdd(&KDDocPutKey,&KDDocPutS,0x80000000,TRUE);
fp_getstr2=&DocGetStr2;
fp_doc_put=&DocPut;
Cd("..");;