LTCD_070816.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:45:20 +02:00
1 parent d14bbc24f9
commit 0e9364ff4c
506 files changed
+157705 -41812

No files matched your search

Binary file not shown.
+154
View File
@@ -0,0 +1,154 @@
LoadStr("ST_BIBLE_FILE","::/LT/Text/Bible.TXZ");
LoadList("ST_BIBLE_BOOKS",
"Genesis\0"
"Exodus\0"
"Leviticus\0"
"Numbers\0"
"Deuteronomy\0"
"Joshua\0"
"Judges\0"
"Ruth\0"
"1 Samuel\0"
"2 Samuel\0"
"1 Kings\0"
"2 Kings\0"
"1 Chronicles\0"
"2 Chronicles\0"
"Ezra\0"
"Nehemiah\0"
"Tobit\0"
"Judith\0"
"Esther\0"
"1 Maccabees\0"
"2 Maccabees\0"
"Job\0"
"Psalms\0"
"Proverbs\0"
"Ecclesiastes\0"
"Song of Songs\0"
"Wisdom\0"
"Sirach\0"
"Isaiah\0"
"Jeremiah\0"
"Lamentations\0"
"Baruch\0"
"Ezekiel\0"
"Daniel\0"
"Hosea\0"
"Joel\0"
"Amos\0"
"Obadiah\0"
"Jonah\0"
"Micah\0"
"Nahum\0"
"Habakkuk\0"
"Zephaniah\0"
"Haggai\0"
"Zechariah\0"
"Malachi\0"
"Matthew\0"
"Mark\0"
"Luke\0"
"John\0"
"Acts\0"
"Romans\0"
"1 Corinthians\0"
"2 Corinthians\0"
"Galatians\0"
"Ephesians\0"
"Philippians\0"
"Colossians\0"
"1 Thessalonians\0"
"2 Thessalonians\0"
"1 Timothy\0"
"2 Timothy\0"
"Titus\0"
"Philemon\0"
"Hebrews\0"
"James\0"
"1 Peter\0"
"2 Peter\0"
"1 John\0"
"2 John\0"
"3 John\0"
"Jude\0"
"Revelation\0"
"\0");
LoadList("ST_BIBLE_BOOK_LINES",
"297\0"
"5068\0"
"9123\0"
"12005\0"
"15977\0"
"19168\0"
"21329\0"
"23598\0"
"23902\0"
"26892\0"
"29345\0"
"32241\0"
"34961\0"
"37633\0"
"40756\0"
"41671\0"
"Tobit\0"
"Judith\0"
"42963\0"
"1 Maccabees\0"
"2 Maccabees\0"
"43605\0"
"46190\0"
"53793\0"
"56267\0"
"56966\0"
"Wisdom\0"
"Sirach\0"
"57332\0"
"61806\0"
"66736\0"
"Baruch\0"
"67217\0"
"71804\0"
"73189\0"
"73876\0"
"74130\0"
"74615\0"
"74697\0"
"74860\0"
"75241\0"
"75416\0"
"75604\0"
"75806\0"
"75932\0"
"76684\0"
"76908\0"
"79970\0"
"81941\0"
"85266\0"
"87803\0"
"90914\0"
"92110\0"
"93323\0"
"94088\0"
"94514\0"
"94869\0"
"95153\0"
"95402\0"
"95647\0"
"95772\0"
"96090\0"
"96320\0"
"96440\0"
"96500\0"
"97370\0"
"97687\0"
"97976\0"
"98163\0"
"98506\0"
"98552\0"
"98597\0"
"98684\0"
"\0");
+930
View File
@@ -0,0 +1,930 @@
#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_PLACE_ANCHOR 11
I8 PopUpLinkType(BoolU4 include_anchor)
{
I8 i;
Ltf *l=LtfNew;
LtfPutSExt(l,"$$MU,\"To file\",LK_FILE$$\r\n");
LtfPutSExt(l,"$$MU,\"To anchor in file\",LK_FILE_ANCHOR$$\r\n");
LtfPutSExt(l,"$$MU,\"To str in file\",LK_FILE_FIND$$\r\n");
LtfPutSExt(l,"$$MU,\"To line in file\",LK_FILE_LINE$$\r\n");
LtfPutSExt(l,"$$MU,\"To man page\",LK_MAN_PAGE$$\r\n");
LtfPutSExt(l,"$$MU,\"To plain-text file\",LK_PLAIN$$\r\n");
LtfPutSExt(l,"$$MU,\"To str in plain-text file\",LK_PLAIN_FIND$$\r\n");
LtfPutSExt(l,"$$MU,\"To line in plain-text file\",LK_PLAIN_LINE$$\r\n");
LtfPutSExt(l,"$$MU,\"To Bible chapter line and verse\",LK_BIBLE_FIND$$\r\n");
LtfPutSExt(l,"$$MU,\"To Dictionary Definition\",LK_DEF$$\r\n");
LtfPutSExt(l,"$$MU,\"To Help Index\",LK_HELP_INDEX$$\r\n");
if (include_anchor)
LtfPutSExt(l,"$$MU,\"Place Anchor\",LK_PLACE_ANCHOR$$\r\n");
LtfPutSExt(l,"$$MU,\"CANCEL\",-1$$");
i=PopUpMenu(l);
LtfDel(l);
return i;
}
class EditFileLinkStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 file[132] fmtstr "$$DA-P,131,\"File :%s\"$$\r\n";
I1 aux[132];
I8 num;
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
BoolU4 hide;
};
class EditFileAnchorLinkStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 file[132] fmtstr "$$DA-P,131,\"File :%s\"$$\r\n";
I1 aux[132] fmtstr "$$DA-P,131,\"Anchor Label :%s\"$$\r\n";
I8 num;
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
BoolU4 hide;
};
class EditFileFindLinkStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 file[132] fmtstr "$$DA-P,131,\"File :%s\"$$\r\n";
I1 aux[132] fmtstr "$$DA-P,131,\"Str :%s\"$$\r\n";
I8 num fmtstr "$$DA-T,131,\"Occurrence Num:%04d\"$$\r\n";
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
BoolU4 hide;
};
class EditFileLineLinkStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 file[132] fmtstr "$$DA-P,131,\"File :%s\"$$\r\n";
I1 aux[132];
I8 num fmtstr "$$DA-T,131,\"Line Num :%04d\"$$\r\n";
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
BoolU4 hide;
};
class EditManPageLinkStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 file[132];
I1 aux[132] fmtstr "$$DA-P,131,\"Label :%s\"$$\r\n";
I8 num;
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
BoolU4 hide;
};
class EditPlaceAnchorStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 file[132];
I1 aux[132] fmtstr "$$DA-P,131,\"Anchor Label :%s\"$$\r\n";
I8 num;
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
BoolU4 hide fmtstr "$$CB,\"Hide\"$$\r\n";
};
class EditBibleLinkStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 file[132];
I1 aux[132] fmtstr "$$DA-P,131,\"Chapter Verse :%s\"$$\r\n";
I8 num;
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
BoolU4 hide;
};
class EditDefLinkStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 file[132];
I1 aux[132] fmtstr "$$DA-P,131,\"Word :%s\"$$\r\n";
I8 num fmtstr "$$DA-T,131,\"Def Num :%4d\"$$\r\n";
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
BoolU4 hide;
};
I1 *ctrl_L_header="Press WINDOW's key for help\r\n\r\n";
BoolU8 PmtLink(I8 type,I1 **display,I1 **link,BoolU4 *quote)
{
I8 i;
BoolU4 result=FALSE;
if (quote) *quote=FALSE;
EditFileLinkStruct *el=MAllocZ(sizeof(EditFileLinkStruct));
if (type>=0) {
el->num=1;
switch (type) {
case LK_FILE:
if (DoForm(el,"EditFileLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=NewStr(el->file);
else
*display=NewStr(el->display);
*link=MSPrintF("FI:%s",el->file);
}
break;
case LK_PLAIN:
if (DoForm(el,"EditFileLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=NewStr(el->file);
else
*display=NewStr(el->display);
*link=MSPrintF("PI:%s",el->file);
}
break;
case LK_FILE_ANCHOR:
if (DoForm(el,"EditFileAnchorLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=NewStr(el->aux);
else
*display=NewStr(el->display);
*link=MSPrintF("FA:%s,%s",el->file,el->aux);
}
break;
case LK_FILE_FIND:
if (DoForm(el,"EditFileFindLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (el->num==1) {
if (!el->display[0])
*display=NewStr(el->aux);
else
*display=NewStr(el->display);
*link=MSPrintF("FF:%s,%s",el->file,el->aux);
} else {
if (!el->display[0])
*display=NewStr(el->aux);
else
*display=NewStr(el->display);
*link=MSPrintF("FF:%s,%s:%d",el->file,el->aux,el->num);
}
}
break;
case LK_PLAIN_FIND:
if (DoForm(el,"EditFileFindLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (el->num==1) {
if (!el->display[0])
*display=NewStr(el->aux);
else
*display=NewStr(el->display);
*link=MSPrintF("PF:%s,%s",el->file,el->aux);
} else {
if (!el->display[0])
*display=NewStr(el->aux);
else
*display=NewStr(el->display);
*link=MSPrintF("PF:%s,%s:%d",el->file,el->aux,el->num);
}
}
break;
case LK_FILE_LINE:
if (DoForm(el,"EditFileLineLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=NewStr(el->file);
else
*display=NewStr(el->display);
*link=MSPrintF("FL:%s,%d",el->file,el->num);
}
break;
case LK_PLAIN_LINE:
if (DoForm(el,"EditFileLineLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=NewStr(el->file);
else
*display=NewStr(el->display);
*link=MSPrintF("PL:%s,%d",el->file,el->num);
}
break;
case LK_MAN_PAGE:
if (DoForm(el,"EditManPageLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=NewStr(el->aux);
else
*display=NewStr(el->display);
*link=MSPrintF("MN:%s",el->aux);
}
break;
case LK_PLACE_ANCHOR:
if (DoForm(el,"EditPlaceAnchorStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0]) {
if (el->hide)
*display=NewStr("");
else
*display=NewStr(el->aux);
} else
*display=NewStr(el->display);
*link=NewStr(el->aux);
}
break;
case LK_BIBLE_FIND: //TODO
i=PopUpPickSysTextSub("ST_BIBLE_BOOKS");
if (i>=0) {
if (DoForm(el,"EditBibleLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=MSPrintF("%Z,%s",i,"ST_BIBLE_BOOKS",el->aux);
else
*display=NewStr(el->display);
*link=MSPrintF("BF:%Z,%s",i,"ST_BIBLE_BOOKS",el->aux);
}
}
break;
case LK_DEF:
el->num=-1;
if (DoForm(el,"EditDefLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=NewStr(el->aux);
else
*display=NewStr(el->display);
if (el->num<0)
*link=MSPrintF("DF:%s",el->aux);
else
*link=MSPrintF("DF:%s,%d",el->aux,el->num);
}
break;
case LK_HELP_INDEX:
if (DoForm(el,"EditManPageLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
result=TRUE;
if (!el->display[0])
*display=NewStr(el->aux);
else
*display=NewStr(el->display);
*link=MSPrintF("HI:%s",el->aux);
}
break;
}
}
if (el->quote) *quote=TRUE;
Free(el);
return result;
}
void EditInsertLink()
{
I1 *display=NULL,*link=NULL,*st=NULL;
BoolU4 quote=FALSE;
I8 type=PopUpLinkType(TRUE);
if (type>=0) {
if (PmtLink(type,&display,&link,&quote)) {
if (type==LK_PLACE_ANCHOR)
st=MSPrintF("$$AN,\"%s\",\"%s\"$$",display,link);
else
st=MSPrintF("$$LK,\"%s\",\"%s\"$$",display,link);
}
}
if (st) {
if (quote)
PrintF("%Q",st);
else
PutS(st);
}
Free(display);
Free(link);
Free(st);
}
I8 PopUpColorType()
{
I8 i;
Ltf *l=LtfNew;
LtfPutSExt(l,"$$MU,\"Foreground\" LTFT_FOREGROUND_COLOR$$\r\n");
LtfPutSExt(l,"$$MU,\"Background\" LTFT_BACKGROUND_COLOR$$\r\n");
LtfPutSExt(l,"$$MU,\"Default Foreground\" LTFT_DEFAULT_FOREGROUND_COLOR$$\r\n");
LtfPutSExt(l,"$$MU,\"Default Background\" LTFT_DEFAULT_BACKGROUND_COLOR$$\r\n");
LtfPutSExt(l,"$$MU,\"Link Foreground\" LTFT_LINK_FOREGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Link Background\" LTFT_LINK_BACKGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Macro Foreground\" LTFT_MACRO_FOREGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Macro Background\" LTFT_MACRO_BACKGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Anchor Foreground\" LTFT_ANCHOR_FOREGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Anchor Background\" LTFT_ANCHOR_BACKGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Hidden Foreground\" LTFT_HIDDEN_FOREGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Hidden Background\" LTFT_HIDDEN_BACKGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Tree Foreground\" LTFT_TREE_FOREGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"Tree Background\" LTFT_TREE_BACKGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"User Foreground\" LTFT_USER_FOREGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"User Background\" LTFT_USER_BACKGROUND$$\r\n");
LtfPutSExt(l,"$$MU,\"CANCEL\" -1$$");
i=PopUpMenu(l);
LtfDel(l);
return i;
}
I8 PopUpPageSettingType()
{
I8 i;
Ltf *l=LtfNew;
LtfPutSExt(l,"$$MU,\"Page Length\",LTFT_PAGE_LENGTH$$\r\n");
LtfPutSExt(l,"$$MU,\"Page Header\",LTFT_HEADER$$\r\n");
LtfPutSExt(l,"$$MU,\"Page Footer\",LTFT_FOOTER$$\r\n");
LtfPutSExt(l,"$$MU,\"Left Margin\",LTFT_LEFT_MARGIN$$\r\n");
LtfPutSExt(l,"$$MU,\"Right Margin\",LTFT_RIGHT_MARGIN$$\r\n");
i=PopUpMenu(l);
LtfDel(l);
return i;
}
void EditInsertColor()
{
I8 type=PopUpColorType,col=LTF_DEFAULT;
if (type>=0) {
col=PopUpColor;
if (col==LTF_DEFAULT)
PrintF("$$%Z$$",type,"ST_LTF_CMDS");
else if (col>=0)
PrintF("$$%Z,%d$$",type,"ST_LTF_CMDS",col);
}
}
class EditPageSettingStruct
{
I1 value[132] fmtstr "$$DA -P 131 \"Setting Value:%s\"$$\r\n";
};
class EditPageSettingStruct2
{
I1 value[132] fmtstr "$$DA -P 131 \"Setting Value:%s\"$$\r\n";
BoolU4 winrel fmtstr "$$CB \"Win Relative\"$$\r\n";
};
void EditInsertPageSetting()
{
I8 type=PopUpPageSettingType;
EditPageSettingStruct *el=MAllocZ(sizeof(EditPageSettingStruct));
EditPageSettingStruct2 *el2=MAllocZ(sizeof(EditPageSettingStruct2));
if (type>=0) {
if (type==LTFT_RIGHT_MARGIN) {
if (DoForm(el2,"EditPageSettingStruct2")) {
if (el2->winrel) {
if (*el2->value)
PrintF("$$%Z+WR,%s$$",type,"ST_LTF_CMDS",el2->value);
else
PrintF("$$%Z+WR$$",type,"ST_LTF_CMDS");
} else {
if (*el2->value)
PrintF("$$%Z,%s$$",type,"ST_LTF_CMDS",el2->value);
else
PrintF("$$%Z$$",type,"ST_LTF_CMDS");
}
}
} else {
if (DoForm(el,"EditPageSettingStruct")) {
if (*el->value)
PrintF("$$%Z,%s$$",type,"ST_LTF_CMDS",el->value);
else
PrintF("$$%Z$$",type,"ST_LTF_CMDS");
}
}
}
Free(el2);
Free(el);
}
I8 PopUpDollarType()
{
I8 i;
Ltf *l=LtfNew;
LtfPutSExt(l,"$$MU,\"Link\" LTFT_LINK$$\r\n");
LtfPutSExt(l,"$$MU,\"Text\" LTFT_TEXT$$\r\n");
LtfPutSExt(l,"$$MU,\"Tree Branch\" LTFT_TREE$$\r\n");
LtfPutSExt(l,"$$MU,\"Color\" LTFT_FOREGROUND_COLOR$$\r\n");
LtfPutSExt(l,"$$MU,\"Page Settings\" LTFT_PAGE_LENGTH$$\r\n");
LtfPutSExt(l,"$$MU,\"Cursor Movement\" LTFT_CURSOR_MOVEMENT$$\r\n");
LtfPutSExt(l,"$$MU,\"Button\" LTFT_BUTTON$$\r\n");
LtfPutSExt(l,"$$MU,\"Check Box\" LTFT_CHECK_BOX$$\r\n");
LtfPutSExt(l,"$$MU,\"Macro\" LTFT_MACRO$$\r\n");
LtfPutSExt(l,"$$MU,\"Menu Value\" LTFT_MENU_VALUE$$\r\n");
LtfPutSExt(l,"$$MU,\"Button\" LTFT_BUTTON$$\r\n");
LtfPutSExt(l,"$$MU,\"Data\" LTFT_DATA$$\r\n");
LtfPutSExt(l,"$$MU,\"Hex Edit\" LTFT_HEX_EDIT$$\r\n");
LtfPutSExt(l,"$$MU,\"Hidden Widget\" LTFT_HIDE_START$$\r\n");
LtfPutSExt(l,"$$MU,\"Song\" LTFT_SONG$$\r\n");
LtfPutSExt(l,"$$MU,\"CANCEL\" -1$$");
i=PopUpMenu(l);
LtfDel(l);
return i;
}
class EditDollarTextStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
BoolU4 left_x fmtstr "$$CB,\"Left X\"$$\r\n";
BoolU4 center_x fmtstr "$$CB,\"Center X\"$$\r\n";
BoolU4 right_x fmtstr "$$CB,\"Right X\"$$\r\n";
BoolU4 margin_rel fmtstr "$$CB,\"Margin Rel X\"$$\r\n";
BoolU4 blink fmtstr "$$CB,\"Blink\"$$\r\n";
BoolU4 invert fmtstr "$$CB,\"Invert\"$$\r\n";
BoolU4 underline fmtstr "$$CB,\"Underline\"$$\r\n";
BoolU4 tree fmtstr "$$CB,\"Tree\"$$\r\n";
BoolU4 collapsed fmtstr "$$CB,\"Collapsed\"$$\r\n";
BoolU4 alias fmtstr "$$CB,\"Alias\"$$\r\n";
I1 scroll_x [132] fmtstr "$$DA-P,131,\"Scroll X Length Expression:%s\"$$\r\n";
I1 shift_x [132] fmtstr "$$DA-P,131,\"X Offset Expression :%s\"$$\r\n";
I1 shift_y [132] fmtstr "$$DA-P,131,\"Y Offset Expression :%s\"$$\r\n";
};
void EditInsertDollarText()
{
I1 *st,buf[132];
EditDollarTextStruct *dt=MAllocZ(sizeof(EditDollarTextStruct));
if (DoForm(dt,"EditDollarTextStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
*buf=0;
if (dt->left_x ) StrCat(buf,"+LX");
if (dt->center_x) StrCat(buf,"+CX");
if (dt->right_x ) StrCat(buf,"+RX");
if (dt->margin_rel) StrCat(buf,"+MRX");
if (dt->blink) StrCat(buf,"+BK");
if (dt->invert) StrCat(buf,"+IV");
if (dt->underline) StrCat(buf,"+UL");
if (dt->tree) StrCat(buf,"+TR");
if (dt->collapsed) StrCat(buf,"+C");
if (dt->alias) StrCat(buf,"+AL");
if (*dt->scroll_x) StrCat(buf,"+SCX");
if (*dt->shift_x) StrCat(buf,"+SX");
if (*dt->shift_y) StrCat(buf,"+SY");
st=MSPrintF("%q",dt->display);
PrintF("$$TX%s,\"%Q\"",buf,st);
Free(st);
if (*dt->shift_x)
PrintF(",%s",dt->shift_x);
if (*dt->shift_y)
PrintF(",%s",dt->shift_y);
if (*dt->scroll_x)
PrintF(",%s",dt->scroll_x);
PrintF("$$");
}
Free(dt);
}
class EditSongStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I1 song[512] fmtstr "$$DA-P,511,\"Song :%s\"$$\r\n";
};
void EditInsertSong()
{
EditSongStruct *dt=MAllocZ(sizeof(EditSongStruct));
if (DoForm(dt,"EditSongStruct",CTRL_L_HELP,TRUE,ctrl_L_header))
PrintF("$$SO,\"%s\",\"%s\"$$",dt->display,dt->song);
Free(dt);
}
class EditMacroMenuStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text :%s\"$$\r\n";
I1 left_macro[512] fmtstr "$$DA-P,511,\"Left Click Macro :%s\"$$\r\n";
I1 left_exp[132] fmtstr "$$DA-P,131,\"Left Click Expression :%s\"$$\r\n";
BoolU4 popup fmtstr "$$CB,\"PopUp\"$$\r\n";
BoolU4 left_is_auto fmtstr "$$CB,\"Left is AutoStr\"$$\r\n";
BoolU4 left_x fmtstr "$$CB,\"Left X \"$$\r\n";
BoolU4 center_x fmtstr "$$CB,\"Center X \"$$\r\n";
BoolU4 right_x fmtstr "$$CB,\"Right X \"$$\r\n";
BoolU4 margin_rel fmtstr "$$CB,\"Margin Rel X\"$$\r\n";
BoolU4 blink fmtstr "$$CB,\"Blink\"$$\r\n";
BoolU4 invert fmtstr "$$CB,\"Invert\"$$\r\n";
BoolU4 underline fmtstr "$$CB,\"Underline\"$$\r\n";
BoolU4 escape fmtstr "$$CB,\"Escape\"$$\r\n";
I1 scroll_x[132] fmtstr "$$DA-P,131,\"Scroll X Length Expression:%s\"$$\r\n";
I1 shift_x[132] fmtstr "$$DA-P,131,\"X Offset Expression :%s\"$$\r\n";
I1 shift_y[132] fmtstr "$$DA-P,131,\"Y Offset Expression :%s\"$$\r\n";
};
void EditInsertMacroMenu(BoolU4 is_macro)
{
I1 *st,buf[132];
EditMacroMenuStruct *dt=MAllocZ(sizeof(EditMacroMenuStruct));
dt->underline=TRUE;
dt->escape=TRUE;
if (DoForm(dt,"EditMacroMenuStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
*buf=0;
if (is_macro && *dt->display) StrCat(buf,"+A ");
if (dt->popup) StrCat(buf,"+PU-X");
if (dt->left_x ) StrCat(buf,"+LX");
if (dt->center_x) StrCat(buf,"+CX");
if (dt->right_x ) StrCat(buf,"+RX");
if (dt->margin_rel) StrCat(buf,"+MRX");
if (dt->blink) StrCat(buf,"+BK");
if (dt->invert) StrCat(buf,"+IV");
if (!dt->underline) StrCat(buf,"-UL");
if (!dt->escape) StrCat(buf,"-X");
if (*dt->scroll_x) StrCat(buf,"+SCX");
if (*dt->shift_x) StrCat(buf,"+SX");
if (*dt->shift_y) StrCat(buf,"+SY");
if (is_macro) {
if (*dt->left_exp) StrCat(buf,"+LE");
if (!*dt->left_macro) StrCat(buf,"-LM");
} else {
if (!*dt->left_exp) StrCat(buf,"-LE");
if (*dt->left_macro) StrCat(buf,"+LM");
}
if (dt->left_is_auto) StrCat(buf,"+LA");
if (*dt->display || is_macro) {
if (is_macro) {
if (*dt->display) {
st=MSPrintF("%q",dt->display);
PrintF("$$MA %s,\"%Q\"",buf,st);
Free(st);
} else
PrintF("$$MA %s,",buf);
} else {
st=MSPrintF("%q",dt->display);
PrintF("$$MU %s,\"%Q\"",buf,st);
Free(st);
}
if (*dt->left_exp)
PrintF(",%s",dt->left_exp);
if (*dt->left_macro) {
st=MSPrintF("%q",dt->left_macro);
PrintF(",\"%Q\"",st);
Free(st);
}
if (*dt->shift_x)
PrintF(",%s",dt->shift_x);
if (*dt->shift_y)
PrintF(",%s",dt->shift_y);
if (*dt->scroll_x)
PrintF(",%s",dt->scroll_x);
PutS("$$");
}
}
Free(dt);
}
class EditButtonStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
BoolU4 popup fmtstr "$$CB,\"PopUp\"$$\r\n";
BoolU4 left_x fmtstr "$$CB,\"Left X \"$$\r\n";
BoolU4 center_x fmtstr "$$CB,\"Center X \"$$\r\n";
BoolU4 right_x fmtstr "$$CB,\"Right X \"$$\r\n";
BoolU4 margin_rel fmtstr "$$CB,\"Margin Rel X\"$$\r\n";
BoolU4 escape fmtstr "$$CB,\"Escape\"$$\r\n";
I1 left_macro [132] fmtstr "$$DA-P,131,\"Left Click Macro:%s\"$$\r\n";
BoolU4 left_is_auto fmtstr "$$CB,\"Left is AutoStr\"$$\r\n";
I1 left_exp [132] fmtstr "$$DA-P,131,\"Left Click Expression:%s\"$$\r\n";
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
};
void EditInsertButton()
{
I1 *st,buf[132];
EditButtonStruct *dt=MAllocZ(sizeof(EditButtonStruct));
dt->escape=TRUE;
if (DoForm(dt,"EditButtonStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
*buf=0;
if (dt->popup) StrCat(buf,"+PU-X");
if (dt->left_x ) StrCat(buf,"+LX");
if (dt->center_x) StrCat(buf,"+CX");
if (dt->right_x ) StrCat(buf,"+RX");
if (dt->margin_rel) StrCat(buf,"+MRX");
if (!dt->escape) StrCat(buf,"-X");
if (!*dt->left_exp) StrCat(buf,"-LE");
if (*dt->left_macro) StrCat(buf,"+LM");
if (dt->left_is_auto) StrCat(buf,"+LA");
if (dt->display[0]) {
if (dt->quote) {
st=MSPrintF("%q",dt->display);
PrintF("$$$$BT%s,\\\"%Q\\\"",buf,st);
Free(st);
if (*dt->left_exp)
PrintF(",%s",dt->left_exp);
if (*dt->left_macro) {
st=MSPrintF("%q",dt->left_macro);
PrintF(",\\\"%Q\\\"",st);
Free(st);
}
PutS("$$$$");
} else {
st=MSPrintF("%q",dt->display);
PrintF("$$BT%s,\"%Q\"",buf,st);
Free(st);
if (*dt->left_exp)
PrintF(",%s",dt->left_exp);
if (*dt->left_macro) {
st=MSPrintF("%q",dt->left_macro);
PrintF(",\"%Q\"",st);
Free(st);
}
PutS("$$");
}
}
}
Free(dt);
}
class EditCursorMovementStruct
{
I1 left_exp[132] fmtstr "$$DA-P,131,\"X Expression:%s\"$$\r\n";
I1 right_exp[132] fmtstr "$$DA-P,131,\"Y Expression:%s\"$$\r\n";
BoolU4 left_x fmtstr "$$CB,\"Left X \"$$\r\n";
BoolU4 center_x fmtstr "$$CB,\"Center X \"$$\r\n";
BoolU4 right_x fmtstr "$$CB,\"Right X \"$$\r\n";
BoolU4 margin_rel fmtstr "$$CB,\"Margin Rel X\"$$\r\n";
BoolU4 top_y fmtstr "$$CB,\"Top Y \"$$\r\n";
BoolU4 center_y fmtstr "$$CB,\"Center Y \"$$\r\n";
BoolU4 bottom_y fmtstr "$$CB,\"Bottom Y \"$$\r\n";
BoolU4 page_rel fmtstr "$$CB,\"Page Rel Y\"$$\r\n";
BoolU4 quote fmtstr "$$CB,\"Quote\"$$\r\n";
};
void EditInsertCursorMovement()
{
I1 buf[132];
EditCursorMovementStruct *dt=MAllocZ(sizeof(EditCursorMovementStruct));
if (DoForm(dt,"EditCursorMovementStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
*buf=0;
if (dt->left_x ) StrCat(buf,"+LX");
if (dt->center_x) StrCat(buf,"+CX");
if (dt->right_x ) StrCat(buf,"+RX");
if (dt->margin_rel) StrCat(buf,"+MRX");
if (dt->top_y ) StrCat(buf,"+TY");
if (dt->center_y) StrCat(buf,"+CY");
if (dt->bottom_y) StrCat(buf,"+BY");
if (dt->page_rel) StrCat(buf,"+PRY");
if (!*dt->left_exp) StrCat(buf,"-LE");
if (!*dt->right_exp) StrCat(buf,"-RE");
if (dt->quote)
PutS("$$");
PrintF("$$CM%s",buf);
if (*dt->left_exp)
PrintF(",%s",dt->left_exp);
if (*dt->right_exp)
PrintF(",%s",dt->right_exp);
PutS("$$");
if (dt->quote)
PutS("$$");
}
Free(dt);
}
class EditDataStruct
{
I1 format_str [132] fmtstr "$$DA-P,131,\"Format Str:%s\"$$\r\n";
U8 len fmtstr "$$DA,256,\"Length:%d\"$$\r\n";
BoolU4 term fmtstr "$$CB,\"Terminator\"$$\r\n";
BoolU4 str fmtstr "$$CB,\"Str\"$$\r\n";
BoolU4 refresh fmtstr "$$CB,\"Refresh Data\"$$\r\n";
};
void EditInsertData()
{
I1 *st,buf[132];
EditDataStruct *dt=MAllocZ(sizeof(EditDataStruct));
dt->term=TRUE;
dt->len=256;
if (DoForm(dt,"EditDataStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
*buf=0;
if (dt->str) StrCat(buf,"-P");
if (!dt->term) StrCat(buf,"-T");
if (dt->refresh) StrCat(buf,"+RD");
st=MSPrintF("%q",dt->format_str);
PrintF("$$$$DA%s,%d,\\\"%Q\\\"$$$$",
buf,dt->len,st);
Free(st);
}
Free(dt);
}
class EditCheckBoxStruct
{
I1 label [132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
BoolU4 refresh fmtstr "$$CB,\"Refresh Data\"$$\r\n";
};
void EditInsertCheckBox()
{
I1 *st,buf[132];
EditCheckBoxStruct *dt=MAllocZ(sizeof(EditCheckBoxStruct));
if (DoForm(dt,"EditCheckBoxStruct",CTRL_L_HELP,TRUE)) {
*buf=0;
if (dt->refresh) StrCat(buf,"+RD");
st=MSPrintF("%q",dt->label);
PrintF("$$$$CB %s,\\\"%Q\\\"$$$$",
buf,st);
Free(st);
}
Free(dt);
}
class EditHexEditStruct
{
U8 cnt fmtstr "$$DA,256,\"Count:%d\"$$\r\n";
U8 cols fmtstr "$$DA,256,\"Columns:%d\"$$\r\n";
BoolU4 zero fmtstr "$$CB,\"Zero Based\"$$\r\n";
BoolU4 refresh fmtstr "$$CB,\"Refresh Data\"$$\r\n";
};
void EditInsertHexEdit()
{
I1 buf[132];
EditHexEditStruct *dt=MAllocZ(sizeof(EditHexEditStruct));
dt->cnt=128;
dt->cols=4;
dt->zero=TRUE;
if (DoForm(dt,"EditHexEditStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
*buf=0;
if (!dt->zero) StrCat(buf,"-Z");
if (dt->refresh) StrCat(buf,"+RD");
PrintF("$$$$HX %s,%d,%d$$$$",
buf,dt->cnt,dt->cols);
}
Free(dt);
}
class EditTreeStruct
{
I1 label[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n";
I8 indent fmtstr "$$DA,131,\"Indention:%d\"$$\r\n";
BoolU4 collapsed fmtstr "$$CB,\"Collapsed\"$$\r\n";
};
void EditInsertTree()
{
I1 *st,*st2,buf[132];
EditTreeStruct *dt=MAllocZ(sizeof(EditTreeStruct));
dt->collapsed=TRUE;
dt->indent=2;
if (DoForm(dt,"EditTreeStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) {
*buf=0;
if (!dt->collapsed) StrCat(buf,"-C");
st=MSPrintF("%q",dt->label);
st2=MSPrintF("$$TR %s,\"%Q\"$$\r\n$$ID,%d$$*\r\n$$ID,%d$$",
buf,st,dt->indent,-dt->indent);
LtfSafeInsert(Fs->cur_ltf,st2);
Free(st);
Free(st2);
}
Free(dt);
}
void EditInsertHidden()
{
LtfSafeInsert(Fs->cur_ltf,"$$HS$$*$$HE$$");
}
void EditInsertDollarCmd()
{
I8 type=PopUpDollarType;
switch (type) {
case LTFT_FOREGROUND_COLOR:
EditInsertColor;
break;
case LTFT_PAGE_LENGTH:
EditInsertPageSetting;
break;
case LTFT_LINK:
EditInsertLink;
break;
case LTFT_TEXT:
EditInsertDollarText;
break;
case LTFT_TREE:
EditInsertTree;
break;
case LTFT_MACRO:
EditInsertMacroMenu(TRUE);
break;
case LTFT_MENU_VALUE:
EditInsertMacroMenu(FALSE);
break;
case LTFT_CURSOR_MOVEMENT:
EditInsertCursorMovement;
break;
case LTFT_BUTTON:
EditInsertButton;
break;
case LTFT_DATA:
EditInsertData;
break;
case LTFT_CHECK_BOX:
EditInsertCheckBox;
break;
case LTFT_HEX_EDIT:
EditInsertHexEdit;
break;
case LTFT_HIDE_START:
EditInsertHidden;
break;
case LTFT_SONG:
EditInsertSong;
break;
}
}
I8 PopUpPictureType()
{
I8 i;
Ltf *l=LtfNew;
LtfPutSExt(l,"$$MU,\"Just Picture\",1$$\r\n");
LtfPutSExt(l,"$$MU,\"Macro\",2$$\r\n");
LtfPutSExt(l,"$$MU,\"Menu Item\",3$$\r\n");
LtfPutSExt(l,"$$MU,\"Link\",4$$\r\n");
LtfPutSExt(l,"$$MU,\"CANCEL\",-1$$");
i=PopUpMenu(l);
LtfDel(l);
return i;
}
class EditJustPictureStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text :%s\"$$\r\n";
};
class EditMacroPictureStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text :%s\"$$\r\n";
I1 exp[512] fmtstr "$$DA-P,511,\"Macro :%s\"$$\r\n";
BoolU4 escape fmtstr "$$CB,\"Escape\"$$\r\n";
BoolU4 popup fmtstr "$$CB,\"PopUp\"$$\r\n";
BoolU4 is_auto fmtstr "$$CB,\"AutoStr\"$$\r\n";
};
class EditMenuPictureStruct
{
I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text :%s\"$$\r\n";
I1 exp[512] fmtstr "$$DA-P,511,\"Expression :%s\"$$\r\n";
BoolU4 escape fmtstr "$$CB,\"Escape\"$$\r\n";
};
I1 *EditPictureLink()
{
I1 *result=NULL,*display=NULL,*link=NULL;
BoolU4 quote=FALSE;
I8 type=PopUpLinkType(FALSE);
if (type>=0) {
if (PmtLink(type,&display,&link,&quote))
result=MSPrintF("\"%s\",\"%s\"",display,link);
}
Free(display);
Free(link);
return result;
}
I1 *EditPicture()
{
I8 type=PopUpPictureType;
I1 *st,*st1=NULL,*st2=NULL,buf[132];
EditMacroPictureStruct *dt=MAllocZ(sizeof(EditMacroPictureStruct));
*buf=0;
switch (type) {
case 1:
if (DoForm(dt,"EditJustPictureStruct",CTRL_L_HELP,TRUE))
st1=MSPrintF("\"%Q\"",dt->display);
break;
case 2:
dt->escape=TRUE;
if (DoForm(dt,"EditMacroPictureStruct",CTRL_L_HELP,TRUE)) {
StrCat(buf,"+LM+UL");
if (dt->is_auto) StrCat(buf,"+LA");
if (dt->popup) StrCat(buf,"+PU");
if (dt->escape) StrCat(buf,"+X");
st=MSPrintF("%q",dt->exp);
st1=MSPrintF("\"%Q\",\"%Q\"",dt->display,st);
Free(st);
}
break;
case 3:
dt->escape=TRUE;
if (DoForm(dt,"EditMenuPictureStruct",CTRL_L_HELP,TRUE)) {
StrCat(buf,"+LE");
if (dt->escape) StrCat(buf,"+X");
st1=MSPrintF("\"%Q\",\"%Q\"",dt->display,dt->exp);
}
break;
case 4:
StrCat(buf,"+L+A");
st1=EditPictureLink;
break;
}
if (st1) {
st2=MSPrintF("$$PI%s,%s$$",buf,st1);
Free(st1);
}
Free(dt);
return st2;
}
File diff suppressed because it is too large. Load diff
+313
View File
@@ -0,0 +1,313 @@
public void LtfLoad(Ltf *l,I1 *src2,U8 size)
{
I8 i;
I1 *src;
LtfBinEntry *tempb;
if (src2) {
LtfPutSExt(l,src2);
src=src2+StrLen(src2)+1;
i=size-(offset(LtfBinEntry.data)-offset(LtfBinEntry.start));
while (src<=src2+i) {
tempb=MAllocZ(sizeof(LtfBinEntry),l->mem_tss);
MemCpy(&tempb->start,src,offset(LtfBinEntry.data)-offset(LtfBinEntry.start));
src+=offset(LtfBinEntry.data)-offset(LtfBinEntry.start);
tempb->data=MAlloc(tempb->size,l->mem_tss);
if (tempb->size) {
MemCpy(tempb->data,src,tempb->size);
src+=tempb->size;
}
InsQue(tempb,l->bin_root.last);
if (tempb->num>=l->cur_bin_num)
l->cur_bin_num=tempb->num+1;
}
}
if (!(l->flags & (LTFF_PLAIN_TEXT|LTFF_PLAIN_TEXT_WITH_TABS)))
LtfValidateBins(l);
l->recalc_start=l;
LtfRecalc(l);
}
public Ltf *LtfRead(I1 *name,U8 flags=0)
{
Ltf *l=LtfNew;
I1 *src,*name2;
U8 size=0;
l->flags|=flags;
name2=AbsoluteFileName(name);
StrCpy(l->filename.name,name2);
src=ReadFile(name2,&size,&l->file_attr);
Free(name2);
if (src) {
LtfLoad(l,src,size);
Free(src);
}
return l;
}
public void *LtfSave(Ltf *l,U8 *size=NULL)
{
LtfEntry *cl;
LtfBinEntry *b;
I1 *st;
U8 cnt=2; //cursor + terminator
I1 *result,*dst,*src,ch;
I8 i;
if (!(l->flags & (LTFF_PLAIN_TEXT|LTFF_PLAIN_TEXT_WITH_TABS)))
LtfValidateBins(l);
l->recalc_start=l;
LtfRecalc(l);
for (cl=l->dummy.next;cl!=l;cl=cl->next) {
if (!Bt(ltf_data_types,cl->btype)) {
if (cl->btype==LTFT_TEXT &&
!(cl->flags & ~(LTFLF_WORD_WRAP |LTFLF_UNDERLINED |
LTFLF_INVERTED | LTFLF_BLINK | LTFLF_SKIP))) {
cnt+=StrLen(cl->display);
if (!(l->flags & (LTFF_PLAIN_TEXT | LTFF_PLAIN_TEXT_WITH_TABS)))
cnt+=Occurrences(cl->display,'$$');
} else if (cl->btype==LTFT_TAB ||
cl->btype==LTFT_PAGE_BREAK)
cnt++;
else if (cl->btype==LTFT_CR)
cnt+=2;
else if (cl->btype==LTFT_PICWORD)
cnt+=StrLen(cl->aux_str);
else if (cl->btype!=LTFT_SOFT_CR &&
cl->btype!=LTFT_CURSOR &&
cl->btype!=LTFT_BPT) {
st=LtfToPlainText(l,cl);
cnt+=StrLen(st)+2;
Free(st,l->mem_tss);
}
}
}
for (b=l->bin_root.next;b!=&l->bin_root;b=b->next) {
if (b->use_cnt>b->temp_use_cnt)
cnt+=offset(LtfBinEntry.data)-
offset(LtfBinEntry.start)+b->size;
}
result=MAlloc(cnt);
dst=result;
for (cl=l->dummy.next;cl!=l;cl=cl->next) {
if (!Bt(ltf_data_types,cl->btype)) {
if (cl->btype==LTFT_TEXT &&
!(cl->flags & ~(LTFLF_WORD_WRAP |LTFLF_UNDERLINED |
LTFLF_INVERTED | LTFLF_BLINK | LTFLF_SKIP))) {
src=cl->display;
i=0;
while (ch=*src++) {
if (cl==l->cur_entry && i++==l->cur_data_col)
*dst++=CH_CURSOR;
*dst++=ch;
if (ch=='$$') {
if (!(l->flags & (LTFF_PLAIN_TEXT | LTFF_PLAIN_TEXT_WITH_TABS)))
*dst++=ch;
}
}
if (cl==l->cur_entry && i++==l->cur_data_col)
*dst++=CH_CURSOR;
} else {
if (cl==l->cur_entry)
*dst++=CH_CURSOR;
if (cl->btype==LTFT_TAB)
*dst++=CH_TAB;
else if (cl->btype==LTFT_PAGE_BREAK)
*dst++=CH_FORM_FEED;
else if (cl->btype==LTFT_CR) {
*dst++=CH_CR;
*dst++=CH_LINE_FEED;
} else if (cl->btype==LTFT_PICWORD) {
StrCpy(dst,cl->aux_str);
dst+=StrLen(cl->aux_str);
} else if (cl->btype!=LTFT_SOFT_CR &&
cl->btype!=LTFT_CURSOR &&
cl->btype!=LTFT_BPT) {
*dst++='$$';
st=LtfToPlainText(l,cl);
StrCpy(dst,st);
dst+=StrLen(st);
*dst++='$$';
Free(st,l->mem_tss);
}
}
}
}
*dst++=0;
b=l->bin_root.next;
if (b!=&l->bin_root) {
while (b!=&l->bin_root) {
if (b->use_cnt>b->temp_use_cnt) {
MemCpy(dst,&b->type,offset(LtfBinEntry.data)-offset(LtfBinEntry.start));
dst+=offset(LtfBinEntry.data)-offset(LtfBinEntry.start);
MemCpy(dst,b->data,b->size);
dst+=b->size;
}
b=b->next;
}
} else
cnt--;
if (size) *size=cnt;
return result;
}
public void LtfWrite(Ltf *l,BoolU4 prompt=FALSE)
{
U8 size;
I1 *buf=LtfSave(l,&size);
if (prompt) {
if (DoForm(&l->filename,"EditFileNameStruct"))
WriteFile(l->filename.name,buf,size,0,l->file_attr);
} else
WriteFile(l->filename.name,buf,size,0,l->file_attr);
Free(buf);
}
public void DelClipboard()
{
LtfReset(sys_clipboard_ltf,TRUE);
}
public void EditCopyToClipboard(Ltf *l)
{
Ltf *b=sys_clipboard_ltf;
LtfEntry *cl=l->dummy.next,*nl;
DelClipboard;
while (cl!=l) {
if (cl->type & LTFLT_SELECTED) {
cl->type&=~LTFLT_SELECTED;
if (!Bt(ltf_data_types,cl->btype)) {
nl=LtfCopyEntry(b,cl);
InsQue(nl,b->dummy.last);
}
}
cl=cl->next;
}
}
public void EditCutToClipboard(Ltf *l)
{
Ltf *b=sys_clipboard_ltf;
LtfEntry *cl=l->dummy.next,*cl1,*nl,*cl2=NULL;
DelClipboard;
while (cl!=l) {
cl1=cl->next;
if (cl->type & LTFLT_SELECTED) {
cl->type&=~LTFLT_SELECTED;
if (!Bt(ltf_data_types,cl->btype)) {
nl=LtfCopyEntry(b,cl);
InsQue(nl,b->dummy.last);
}
if (cl==l->cur_entry || cl==cl2)
cl2=cl->next;
LtfDelEntry(l,cl);
}
cl=cl1;
}
if (cl2) {
l->cur_entry=cl2;
l->cur_data_col=cl2->min_col;
}
l->recalc_start=l;
LtfRemoveSoftCRs(l,NULL);
}
public void EditInsertLtf(Ltf *l,Ltf *b)
{ //TODO: $LK,"LtfReset","MN:LtfReset"$
I1 *dst;
BoolU4 old_preempt=Preempt(OFF);
LtfEntry *nl,*cl=b->dummy.next;
LtfRemoveSoftCRs(l,NULL);
if (l->cur_entry->btype==LTFT_TEXT &&
l->cur_data_col>l->cur_entry->min_col) {
if (l->cur_data_col<l->cur_entry->max_col) {
nl=MAllocZ(sizeof(LtfEntryBase)+sizeof(void *),l->mem_tss);
nl->type=LTFT_TEXT | l->cur_entry->type & 0xFFFFFF00;
nl->flags=l->cur_entry->flags;
nl->x=l->cur_entry->x;
nl->y=l->cur_entry->y;
nl->indent=l->cur_entry->indent;
nl->page_line_num=l->cur_entry->page_line_num;
nl->left_margin=l->cur_entry->left_margin;
nl->right_margin=l->cur_entry->right_margin;
dst=l->cur_entry->display+l->cur_data_col;
nl->display=NewStr(dst,l->mem_tss);
nl->max_col=StrLen(dst);
*dst=0;
l->cur_entry->max_col=l->cur_data_col;
InsQue(nl,l->cur_entry);
l->cur_entry=nl;
l->cur_data_col=nl->min_col;
} else
if (l->cur_entry!=l)
l->cur_entry=l->cur_entry->next;
}
while (cl!=b) {
if (cl->btype!=LTFT_SOFT_CR) {
nl=LtfCopyEntry(l,cl);
InsQue(nl,l->cur_entry->last);
}
cl=cl->next;
}
l->recalc_start=l;
Preempt(old_preempt);
}
BoolU4 LtfCaptureUndo(Ltf *l)
{
BoolU4 result=FALSE,old_preempt=Preempt(OFF);
U8 i=GetTimeStamp;
LtfUndo *u;
if (l->flags&LTFF_UNDO_DIRTY &&
i>l->undo_root.last->timestamp+15*time_stamp_freq &&
l->flags&LTFF_ALLOW_UNDO) {
u=MAllocZ(sizeof(LtfUndo),l->mem_tss);
u->timestamp=i;
u->body=LtfSave(l,&u->size);
InsQue(u,l->undo_root.last);
l->flags&=~LTFF_UNDO_DIRTY;
l->undo_cnt++;
u->ltf_flags=l->flags;
}
Preempt(old_preempt);
return result;
}
void LtfRestoreUndo(Ltf *l)
{
BoolU4 old_preempt=Preempt(OFF);
LtfUndo *u=l->undo_root.last,*u_next,*u_last;
Ltf *m;
if (u!=&l->undo_root) {
RemQue(u);
u_next=l->undo_root.next;
u_last=l->undo_root.last;
l->undo_root.next=&l->undo_root;
l->undo_root.last=&l->undo_root;
m=l->menu_ltf;
LtfReset(l,TRUE);
l->flags=u->ltf_flags;
LtfLoad(l,u->body,u->size);
LtfDelUndo(l,u);
l->undo_root.next=u_next;
l->undo_root.last=u_last;
l->menu_ltf=m;
}
LtfSetUndoCnt(l);
l->flags&=~LTFF_UNDO_DIRTY;
Preempt(old_preempt);
}
#help_index "File/Cmd Line (Typically);Ltf/Cmd Line (Typically)"
public void Type(I1 *name)
//Output a file to the command line.
//Even graphics and macros will be sent.
{
Ltf *l=LtfRead(name);
EditInsertLtf(Fs->cur_ltf,l);
LtfDel(l);
}
#help_index "Ltf"
+126
View File
@@ -0,0 +1,126 @@
I1 captured_macro_name[128];
*captured_macro_name=0;
I8 PopUpExitRecordPlayStopInsert()
{
I8 result=0;
I1 buf[80];
TssCmdStruct *tempc;
Ltf *l=LtfNew;
LtfEntry *ll;
ll=LtfPutSExt(l,"$$DA-P,127,\"Name:%s\"$$");
ll->data=captured_macro_name;
LtfFormatData(ll);
LtfPutSExt(l,"$$CM+LX+TY,2,4$$$$BT, \"RECORD\",1$$");
LtfPutSExt(l,"$$CM+LX+TY,18,4$$$$BT, \"PLAY\",2$$");
LtfPutSExt(l,"$$CM+LX+TY,2,7$$$$BT, \"STOP\",3$$");
LtfPutSExt(l,"$$CM+LX+TY,18,7$$$$BT, \"EXIT\",0$$");
LtfPutSExt(l,"$$CM+LX+TY,2,10$$$$BT, \"INSERT\",4$$");
l->flags|=LTFF_MIN_SIZE | LTFF_FORM;
SPrintF(buf,"DoMenu(0x%X);",l);
macro_util_tss=Spawn(&ServantUserCmdLine,"MACRO POPUP",Fs);
Fs->popup_tss=macro_util_tss;
tempc=QueueTaskRequest(macro_util_tss,Fs,buf,
1<<TSSCf_WAKE_MASTER | 1<<TSSCf_FOCUS_MASTER);
GetRequestResult(tempc,&result);
Fs->popup_tss=NULL;
Kill(macro_util_tss);
macro_util_tss=NULL;
LtfGetData(ll);
LtfDel(l);
return result;
}
void DelSysMacro()
{
TssCmdStruct *tempc,*tempc1;
tempc=sys_macro_queue.next;
while (tempc!=&sys_macro_queue) {
tempc1=tempc->next;
RemQue(tempc);
AFree(tempc);
tempc=tempc1;
}
}
I1 *SysMacro2Str()
{
TssCmdStruct *tempc;
I8 cnt=0;
I1 *ptr,*m;
LBtr(&sys_semas[SYS_SEMA_RECORD_MACRO],0);
tempc=sys_macro_queue.next;
while (tempc!=&sys_macro_queue) {
if (tempc->cmd_code==TSSCT_MSG)
cnt++;
tempc=tempc->next;
}
m=MAlloc(cnt*54+1);
ptr=m;
tempc=sys_macro_queue.next;
while (tempc!=&sys_macro_queue) {
if (tempc->cmd_code==TSSCT_MSG) {
SPrintF(ptr,"Msg(0x%08X,0x%016X,0x%016X);",
tempc->msg_code,tempc->p1,tempc->p2);
ptr+=54;
}
tempc=tempc->next;
}
return m;
}
void PlaySysMacro()
{
I1 *m=SysMacro2Str;
while (sys_cur_focus_task==Fs)
SwapInNext;
XTalkStrWithWait(sys_cur_focus_task,m);
Free(m);
}
void MacroTask()
{
I8 i;
StrCpy(captured_macro_name,"Click Here");
do {
i=PopUpExitRecordPlayStopInsert;
RefocusWin;
switch (i) {
case 1:
LBtr(&sys_semas[SYS_SEMA_RECORD_MACRO],0);
DelSysMacro;
LBts(&sys_semas[SYS_SEMA_RECORD_MACRO],0);
break;
case 2:
LBtr(&sys_semas[SYS_SEMA_RECORD_MACRO],0);
PlaySysMacro;
break;
case 3:
LBtr(&sys_semas[SYS_SEMA_RECORD_MACRO],0);
break;
case 4:
LBtr(&sys_semas[SYS_SEMA_RECORD_MACRO],0);
if (sys_cur_focus_task)
QueueMsg(sys_cur_focus_task,0,
MSG_KEY_DOWN,0,SC_F2|SCF_SHIFT,0);
break;
}
} while (i>0);
}
void EditMacroUtil()
{
if (!macro_util_tss)
Spawn(&MacroTask,"MACRO TASK");
}
void EditInsertCapturedMacro()
{
BoolU4 old_preempt=Preempt(OFF);
I1 *st=SysMacro2Str;
PrintF("$$MA+A+LM+LA,\"%s\",\"%s\"$$",
captured_macro_name,st);
Free(st);
Preempt(old_preempt);
}
+677
View File
@@ -0,0 +1,677 @@
#help_index "Ltf/Cmd Line (Typically)"
public BoolU4 Edit(I1 *filename)
{
I1 *buf=NewStr(filename),
*buf2=NewStr(filename);
U8 num=1;
I1 *temp_filename=NewStr(filename),
*tfn_ptr=temp_filename;
SysHashEntry *temph;
I8 i;
BoolU4 cont,result=FALSE;
Ltf *l;
i=LK_FILE;
StrCpy(temp_filename,filename);
if (StrLen(filename)>3 && filename[2]==':') {
buf[2]=0;
i=MatchSysTextEntry(buf,"ST_LINK_TYPES",MLE_IGNORE_CASE);
tfn_ptr=temp_filename+3;
switch (i) {
case LK_MAN_PAGE:
temph=FindLocalHash(tfn_ptr,
HTT_GLBL_VAR|HTT_CLASS|HTT_FUNCTION|
HTT_STR_CONST|HTT_SYS_SYMBOL);
if (temph)
result=Edit(temph->source_link);
Free(temp_filename);
Free(buf);
Free(buf2);
return result;
case LK_DEF:
if (Occurrences(tfn_ptr,',')) {
RemoveLastSeg(tfn_ptr,",",buf);
i=AtoI(buf);
} else
i=-1;
WsdPopUpDef(tfn_ptr,i);
Free(temp_filename);
Free(buf);
Free(buf2);
return TRUE;
case LK_HELP_INDEX:
l=LtfNew;
LtfHelpIndex(l,tfn_ptr);
Free(temp_filename);
Free(buf);
Free(buf2);
DoLtf(l,TRUE);
LtfDel(l);
return TRUE;
case LK_BIBLE_FIND:
if (Occurrences(tfn_ptr,',')) {
RemoveLastSeg(tfn_ptr,",",buf);
} else
*buf=0;
num=AtoI(SysTextSub(
MatchSysTextEntry(tfn_ptr,"ST_BIBLE_BOOKS",MLE_IGNORE_CASE),
"ST_BIBLE_BOOK_LINES"));
tfn_ptr=SysText("ST_BIBLE_FILE");
break;
case LK_FILE_LINE:
case LK_PLAIN_LINE:
if (Occurrences(tfn_ptr,',')) {
RemoveLastSeg(tfn_ptr,",",buf);
num=AtoI(buf);
}
break;
case LK_FILE_ANCHOR:
*buf=0;
if (Occurrences(tfn_ptr,','))
RemoveLastSeg(tfn_ptr,",",buf);
break;
case LK_FILE_FIND:
case LK_PLAIN_FIND:
*buf=0;
*buf2=0;
if (Occurrences(tfn_ptr,','))
RemoveLastSeg(tfn_ptr,",",buf);
if (Occurrences(buf,':')) {
RemoveLastSeg(buf,":",buf2);
num=AtoI(buf2);
}
break;
}
}
tfn_ptr=NewStr(tfn_ptr);
cont=TRUE;
if (!IsTextFile(tfn_ptr)) {
if (!PopUpNoYes(ST_WARNING "Not Text File\r\n"
"Proceed anyway?\r\n\r\n"))
cont=FALSE;
}
if (cont)
result=LtfEditFile(i,tfn_ptr,buf,num);
ClearWinText(Fs);
Free(tfn_ptr);
Free(temp_filename);
Free(buf);
Free(buf2);
return result;
}
public void Plain(I1 *filename)
//Open a document in plain text mode,
//so that dollar signs are not special.
{
I1 *buf=MSPrintF("PI:%s",filename);
Edit(buf);
Free(buf);
}
#help_index "Ltf"
public Ltf *InitSysAuxLtf(BoolU4 has_menu)
{
BoolU4 old_preempt=Preempt(OFF);
LtfEntry *ll;
Ltf *aux;
aux=LtfNew;
LtfPutSExt(aux,"$$CM+H+BY+RX,-7,1$$");
ll=LtfPutSExt(aux,"$$TX+H+BD+DC,\" \"$$");
ll->display_cb=&EditPreemptCB;
LtfPutSExt(aux,"$$CM+H+BY+RX,-6,1$$");
ll=LtfPutSExt(aux,"$$TX+H+BD+DC,\" \"$$");
ll->user_data=Fs->cur_ltf;
ll->display_cb=&EditOverStrikeCB;
LtfPutSExt(aux,"$$CM+H+BY+RX,-5,1$$"); //gets merged without this
ll=LtfPutSExt(aux,"$$TX+H+BD+DC,\" \"$$");
ll->user_data=Fs->cur_ltf;
ll->display_cb=&EditDollarCB;
LtfPutSExt(aux,"$$CM+H+BY+RX,-4,1$$"); //gets merged without this
ll=LtfPutSExt(aux,"$$TX+H+BD+DC,\" \"$$");
ll->display_cb=&EditQuotesCB;
LtfPutSExt(aux,"$$CM+H+BY+RX,-3,1$$"); //gets merged without this
ll=LtfPutSExt(aux,"$$TX+H+BD+DC,\" \"$$");
ll->display_cb=&EditBracesCB;
LtfPutSExt(aux,"$$CM+H+BY+RX,-2,1$$"); //gets merged without this
ll=LtfPutSExt(aux,"$$TX+H+BD+DC,\" \"$$");
ll->display_cb=&EditSemicolonCB;
if (Fs->cur_ltf) {
LtfPutSExt(aux,"$$CM+H+BY+RX,-11,1$$");
ll=LtfPutSExt(aux,"$$TX+H+BD+DC,\" \"$$");
ll->user_data=Fs->cur_ltf;
ll->display_cb=&EditDollarTypeCB;
}
if (Fs->user_num)
LtfPrintF(aux,"$$CM+H+TY+LX,5,-1$$$$TX+H+BD,\"#%d\"$$",Fs->user_num);
LtfPutSExt(aux,"$$CM+H+TY,0,-1$$");
ll=LtfPutSExt(aux,"$$DA+H-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$$");
ll->data=&Fs->task_descriptor;
LtfFormatData(ll);
LtfPrintF(aux,"$$CM+H,1,0$$$$TX+H+BD+IV,\"%X\"$$",Fs);
aux->text_attribute=Fs->border_attribute;
if (Bt(&Fs->crt_flags,CRTf_HAS_CLOSE_WIN))
LtfPutSExt(aux,"$$TX+H+RX+BD,\"[X]\"$$");
if (has_menu) {
LtfPutSExt(aux,"$$TX+H+LX+BD,\"MENU\"$$");
Bts(&Fs->crt_flags,CRTf_HAS_MENU);
}
Preempt(old_preempt);
return aux;
}
public void UseConsoleLtf(I1 *menu_file)
{
BoolU4 old_preempt=Preempt(OFF);
Ltf *l=LtfNew,*m;
Fs->cur_ltf=l;
l->RightClickLink=&ConsoleRightClickLink;
l->max_entries=4096;
l->flags|=LTFF_ATTR_BY_PARTITION;
if (menu_file) {
m=LtfRead(menu_file);
m->flags|=LTFF_ATTR_BY_PARTITION|LTFF_ALLOW_UNDO;
l->menu_ltf=m;
Fs->aux_ltf=InitSysAuxLtf(TRUE);
} else
Fs->aux_ltf=InitSysAuxLtf(FALSE);
Fs->update_win=&LtfUpdateBothLtf;
Fs->scroll_speed=7;
Preempt(old_preempt);
Raw(OFF);
}
#help_index "Ltf/Input"
public I1 *LtfGetLine(Ltf *l,LtfEntry *cl,I8 *cur_col=NULL)
{
LtfEntry *cl2=cl;
BoolU4 old_preempt=Preempt(OFF);
I1 *result,*dst,*src,*start;
U8 i=0;
if (*cur_col)
*cur_col=-1;
while (cl2!=l && cl2->btype!=LTFT_CR) {
if (Bt(ltf_display_types,cl2->btype)) {
if (cl2->btype==LTFT_PICWORD)
src=cl2->aux_str;
else
src=cl2->display;
i+=StrLen(src);
} else if (cl2->btype==LTFT_TAB)
i++;
cl2=cl2->next;
}
result=MAlloc(i+1);
dst=result;
while (cl!=l && cl->btype!=LTFT_CR) {
start=dst;
if (Bt(ltf_display_types,cl->btype)) {
if (cl->btype==LTFT_PICWORD)
src=cl->aux_str;
else
src=cl->display;
while (*src)
*dst++=*src++;
} else if (cl->btype==LTFT_TAB)
*dst++=CH_TAB;
if (cl==l->cur_entry && cur_col)
*cur_col=start-result+l->cur_data_col;
cl=cl->next;
}
*dst++=0;
if (cl==l->cur_entry && cur_col && !l->cur_data_col)
*cur_col=dst-1-result;
Preempt(old_preempt);
return result;
}
#help_index "Ltf/Output"
public void LtfDump(Ltf *l,U8 uS_delay=0)
{
I1 *st;
LtfEntry *cl;
cl=l->dummy.next;
while (cl!=l) {
st=LtfGetLine(l,cl);
PutS(st);
Free(st);
do cl=cl->next;
while (cl!=l && cl->btype!=LTFT_CR);
if (cl->btype==LTFT_CR) {
cl=cl->next;
CrLf;
BusyWait(uS_delay);
}
}
}
public BoolU4 View()
{
I8 ch=0;
U8 sc=0;
BoolU4 old_preempt=Preempt(OFF);
while (ch!=CH_ESC && ch!=CH_CTRLQ) {
Preempt(OFF);
if (ScanKey(&ch,&sc)) {
Preempt(old_preempt);
PutKey(ch,sc);
LtfRecalc(Fs->cur_ltf);
} else {
Fs->task_flags|=1<<TSSf_IDLE;
if (!Fs->rmt_chnl &&
!(Fs->parent_tss && Fs->parent_tss->popup_tss==Fs)) {
Fs->task_flags|=1<<TSSf_AWAITING_MSG;
SwapInNext;
Preempt(old_preempt);
} else {
Preempt(old_preempt);
WinSync;
}
Fs->task_flags&=~(1<<TSSf_IDLE);
}
}
Preempt(old_preempt);
return ch==CH_ESC;
}
public LtfEntry *LtfPutLine(LtfEntry *cl)
{
I1 ch,*ptr,*ptr2;
while (cl->btype!=LTFT_ERROR && cl->btype!=LTFT_CR) {
if (Bt(ltf_display_types,cl->btype)) {
if (cl->btype==LTFT_PICWORD)
ptr=cl->aux_str;
else
ptr=cl->display;
do {
ptr2=ptr;
while (ch=*ptr)
if (ch=='$$')
break;
else
ptr++;
*ptr=0;
PutS(ptr2);
*ptr=ch;
if (ch=='$$') {
PutS("$$$$");
ptr++;
}
} while (ch);
} else if (cl->btype==LTFT_TAB)
PutChar(CH_TAB);
cl=cl->next;
}
CrLf;
return (cl->btype==LTFT_ERROR) ? cl:cl->next;
}
#help_index "Ltf/Input"
public I1 *LtfMGetS()
{
Ltf *l=Fs->cur_ltf;
LtfEntry *cl;
BoolU4 old_preempt;
I1 *result;
U8 sc;
I8 ch;
old_preempt=Preempt(OFF);
PutS("$$FU$$$$BU$$");
do {
Preempt(OFF);
if (ScanKey(&ch,&sc)) {
if (ch==CH_ESC) {
if (l=Fs->aux_ltf) {
if (!l->best_d && l->cur_entry!=l) {
cl=LtfCopyEntry(l,l->cur_entry);
if (Fs->cur_ltf)
LtfBottom(Fs->cur_ltf);
LtfRunEntry(l,cl,TRUE,old_preempt);
LtfDelEntry(l,cl);
goto next;
}
}
if (l=Fs->cur_ltf) {
if (l->cur_entry!=l) {
cl=LtfCopyEntry(l,l->cur_entry);
LtfBottom(l);
LtfRunEntry(l,cl,TRUE,old_preempt);
LtfDelEntry(l,cl);
}
}
next:
} if (ch==CH_CTRLQ)
Exit;
else {
Preempt(old_preempt);
PutKey(ch,sc);
LtfRecalc(Fs->cur_ltf);
}
} else {
Fs->task_flags|=1<<TSSf_IDLE;
if (!Fs->rmt_chnl &&
!(Fs->parent_tss && Fs->parent_tss->popup_tss==Fs)) {
Fs->task_flags|=1<<TSSf_AWAITING_MSG;
SwapInNext;
Preempt(old_preempt);
} else {
Preempt(old_preempt);
WinSync;
}
Fs->task_flags&=~(1<<TSSf_IDLE);
}
//Ctrl shift <CR> is a blank line without entry
} while (ch!=CH_CR || sc & SCF_CTRL && (sc & SCF_SHIFT));
Preempt(OFF);
l=Fs->cur_ltf;
cl=l->cur_entry;
do cl=cl->last;
while (cl!=l && cl->btype!=LTFT_CR &&
cl->btype!=LTFT_USER_FOREGROUND && cl->btype!=LTFT_USER_BACKGROUND);
do cl=cl->last;
while (cl!=l && cl->btype!=LTFT_CR &&
cl->btype!=LTFT_USER_FOREGROUND && cl->btype!=LTFT_USER_BACKGROUND);
cl=cl->next;
result=LtfGetLine(l,cl,NULL);
PutS("$$FU$$$$FG$$$$BG$$");
Preempt(old_preempt);
return result;
}
#help_index "Char/Input"
public I8 PmtI8(I1 *msg,I8 default,I8 lo=MIN_I8,I8 hi=MAX_I8)
{
I8 result;
I1 *st;
while (TRUE) {
PrintF(msg,default);
st=MGetS;
if (!*st) {
Free(st);
return default;
}
result=AtoI(st);
Free(st);
if (result>=lo && result<=hi)
return result;
}
}
public double PmtDouble(I1 *msg,double default,double lo=MIN_double,double hi=MAX_double)
{
double result;
I1 *st;
while (TRUE) {
PrintF(msg,default);
st=MGetS;
if (!*st) {
Free(st);
return default;
}
result=A2Double(st);
Free(st);
if (result>=lo && result<=hi)
return result;
}
}
public I1 *PmtStr(I1 *msg,I1 *default=NULL)
{
I1 *st;
if (default)
PrintF(msg,default);
else
PrintF(msg);
st=MGetS;
if (!*st) {
Free(st);
if (default)
return NewStr(default);
else
return NewStr("");
}
return st;
}
public LTDate PmtLTDate(I1 *msg,LTDate default,LTDate lo=MIN_I8,LTDate hi=MAX_I8)
{
LTDate result;
I1 *st;
while (TRUE) {
PrintF(msg,default,default);
st=MGetS;
if (!*st) {
Free(st);
return default;
}
result=A2LTDate(st);
Free(st);
if (result>=lo && result<=hi)
return result;
}
}
#help_index "Ltf"
I8 PopUpCancelIncludeDelAuto(I1 *header=NULL,I1 *footer=NULL)
{
I8 i;
Ltf *l=LtfNew;
if (header) LtfPutSExt(l,header);
LtfPutSExt(l,"$$CM+LX,2,4 $$$$BT, \"INCLUDE (.CPZ)\",1$$");
LtfPutSExt(l,"$$CM+LX,26,0$$$$BT, \"DEBUG \",9$$");
LtfPutSExt(l,"$$CM+LX,2,3 $$$$BT, \"COMPILE (.SPZ)\",5$$");
LtfPutSExt(l,"$$CM+LX,26,0$$$$BT, \"LOAD (.BIZ)\",6$$");
LtfPutSExt(l,"$$CM+LX,2,3 $$$$BT, \"ADAM_INCLUDE (.APZ)\",4$$");
LtfPutSExt(l,"$$CM+LX,26,0$$$$BT, \"AUTOFILE (.AUZ)\",3$$");
LtfPutSExt(l,"$$CM+LX,2,3 $$$$BT, \"COPY \",7$$");
LtfPutSExt(l,"$$CM+LX,26,0$$$$BT, \"MOVE \",8$$");
LtfPutSExt(l,"$$CM+LX,2,3 $$$$BT, \"DELETE \",2$$");
LtfPutSExt(l,"$$CM+LX,26,0$$$$BT, \"CANCEL \",0$$");
if (footer) LtfPutSExt(l,footer);
i=PopUpMenu(l);
LtfDel(l);
return i;
}
void EditLeftClickLink(Ltf *l,LtfEntry *cl,U2 old_preempt2)
{
BoolU4 old_preempt=IsPreempt;
I1 *st;
nounusedwarn l;
if (cl->flags & LTFLF_AUX_STR)
st=NewStr(cl->aux_str);
else
st=NewStr(cl->display);
Preempt(old_preempt2);
Edit(st);
Preempt(old_preempt);
Free(st);
}
void ConsoleRightClickLink(Ltf *l,LtfEntry *cl,BoolU4 old_preempt2)
{
BoolU4 send_cr=FALSE,old_preempt=IsPreempt;
I1 *st2,*st;
I8 i;
EditFileNameStruct fn;
if (cl->flags & LTFLF_AUX_STR)
st2=NewStr(cl->aux_str);
else
st2=NewStr(cl->display);
st=(st2[2]==':') ? st2+3:st2;
i=PopUpCancelIncludeDelAuto(st);
Preempt(old_preempt2);
if (i>0) {
LtfBottom(l);
switch (i) {
case 1:
if (Occurrences(st,'.') && !WildCardMatch("*.CP?",st)) {
if (!PopUpNoYes(ST_WARNING "Not .CP? File\r\n"
"Proceed anyway?\r\n\r\n")) {
send_cr=TRUE;
break;
}
}
cout "#include \"",st,"\";\r\n$$FU$$$$FG$$$$BG$$";
ExecuteFile(st);
break;
case 2:
Del(st);
break;
case 3:
if (Occurrences(st,'.') && !WildCardMatch("*.AU?",st)) {
if (!PopUpNoYes(ST_WARNING "Not .AU? File\r\n"
"Proceed anyway?\r\n\r\n")) {
send_cr=TRUE;
break;
}
}
cout "AutoFile(\"",st,"\");\r\n$$FU$$$$FG$$$$BG$$";
AutoStr("%F\r",st);
break;
case 4:
if (Occurrences(st,'.') && !WildCardMatch("*.AP?",st)) {
if (!PopUpNoYes(ST_WARNING "Not .CP? File\r\n"
"Proceed anyway?\r\n\r\n")) {
send_cr=TRUE;
break;
}
}
cout "Adam(\"#include \\\"",st,"\\\"\" );\r\n$$FU$$$$FG$$$$BG$$";
Adam(";#include \"%s\"",st);
break;
case 5:
if (Occurrences(st,'.') && !WildCardMatch("*.SP?",st)) {
if (!PopUpNoYes(ST_WARNING "Not .SP? File\r\n"
"Proceed anyway?\r\n\r\n")) {
send_cr=TRUE;
break;
}
}
cout "CompileFile(\"",st,"\");\r\n$$FU$$$$FG$$$$BG$$";
CompileFile(st);
break;
case 6:
if (Occurrences(st,'.') && !WildCardMatch("*.BI?",st)) {
if (!PopUpNoYes(ST_WARNING "Not .BI? File\r\n"
"Proceed anyway?\r\n\r\n")) {
send_cr=TRUE;
break;
}
}
cout "Load(\"",st,"\");\r\n$$FU$$$$FG$$$$BG$$";
Load(st);
break;
case 7:
StrCpy(fn.name,st);
if (DoForm(fn.name,"EditFileNameStruct"))
Copy(st,fn.name);
break;
case 8:
StrCpy(fn.name,st);
if (DoForm(fn.name,"EditFileNameStruct"))
Move(st,fn.name);
break;
case 9:
if (Occurrences(st,'.') && !WildCardMatch("*.CP?",st)) {
if (!PopUpNoYes(ST_WARNING "Not .CP? File\r\n"
"Proceed anyway?\r\n\r\n")) {
send_cr=TRUE;
break;
}
}
cout "IDE(\"",st,"\");\r\n$$FU$$$$FG$$$$BG$$";
IDE(st);
break;
}
} else
send_cr=TRUE;
LtfBottom(l);
cout "$$FU$$$$FG$$$$BG$$";
if (send_cr)
PutChar(CH_CR);
Preempt(old_preempt);
Free(st2);
}
#help_index "Ltf/Cmd Line (Typically)"
public void Man(I1 *st)
//Enter the name of a symbol and this
//will jump to the source code.
{
I1 *name=MAlloc(3+StrLen(st)+1);
StrCpy(name,"MN:");
StrCat(name,st);
Edit(name);
Free(name);
}
#help_index "Debugging;Ltf/Cmd Line (Typically);Ltf/Output"
public void LtfDm(U1 *buf,U8 cnt=0x80)
//Dumps a chunk of memory, showing
//addresses. It is live and can be
//edited.
{
LtfEntry *ll;
BoolU4 old_preempt=Preempt(OFF);
Ltf *l=Fs->cur_ltf;
ll=LtfPrintF(l,"$$HX-Z,%d,16$$",cnt);
ll->data=buf;
l->cur_entry=ll->next;
LtfRecalc(l);
Preempt(old_preempt);
}
public void LtfD(U1 *buf,U8 cnt=0x80)
//Dumps a chunk of memory, showing
//offsets. It is live and can be
//edited.
{
LtfEntry *ll;
BoolU4 old_preempt=Preempt(OFF);
Ltf *l=Fs->cur_ltf;
ll=LtfPrintF(l,"$$HX,%d,16$$",cnt);
ll->data=buf;
l->cur_entry=ll->next;
LtfRecalc(l);
Preempt(old_preempt);
}
#help_index "Ltf/Output"
BoolU8 LtfPutS(I1 *st)
{
Ltf *l;
BoolU4 old_preempt=Preempt(OFF);
l=Fs->cur_ltf;
if (l)
LtfPutSPartial(l,st,old_preempt);
Preempt(old_preempt);
return FALSE;
}
AddKeyDev(&LtfPutKey,&LtfPutS,0x80000000);
ext[EXT_LTF_READ]=&LtfRead;
ext[EXT_LTF_WRITE]=&LtfWrite;
ext[EXT_LTF_NEW]=&LtfNew;
ext[EXT_LTF_RESET]=&LtfReset;
ext[EXT_LTF_DEL]=&LtfDel;
ext[EXT_MGETS]=&LtfMGetS;
#help_index "Ltf"
+505
View File
@@ -0,0 +1,505 @@
U8 ltf_display_types[1],ltf_nondisplay_invisible_types[1],
ltf_form_types[1],ltf_data_types[1];
U8 ltf_clean_scancodes[4]={0,0,0,0};
ltf_display_types[0]=
1<<LTFT_TEXT|
1<<LTFT_DATA|
1<<LTFT_MENU_VALUE|
1<<LTFT_HIDE_START |
1<<LTFT_TREE|
1<<LTFT_HIDE_END|
1<<LTFT_MACRO|
1<<LTFT_BUTTON|
1<<LTFT_CHECK_BOX|
1<<LTFT_LINK|
1<<LTFT_ANCHOR|
1<<LTFT_PICTURE|
1<<LTFT_PICWORD|
1<<LTFT_INSERT_BINARY|
1<<LTFT_INSERT_BINARY_TYPE|
1<<LTFT_INSERT_BINARY_SIZE|
1<<LTFT_SONG;
ltf_nondisplay_invisible_types[0]=
1<<LTFT_PAGE_LENGTH|
1<<LTFT_LEFT_MARGIN|
1<<LTFT_RIGHT_MARGIN|
1<<LTFT_HEADER|
1<<LTFT_FOOTER|
1<<LTFT_INDENT|
1<<LTFT_FOREGROUND_COLOR|
1<<LTFT_BACKGROUND_COLOR|
1<<LTFT_DEFAULT_FOREGROUND_COLOR|
1<<LTFT_DEFAULT_BACKGROUND_COLOR|
1<<LTFT_LINK_FOREGROUND|
1<<LTFT_LINK_BACKGROUND|
1<<LTFT_MACRO_FOREGROUND|
1<<LTFT_MACRO_BACKGROUND|
1<<LTFT_ANCHOR_FOREGROUND|
1<<LTFT_ANCHOR_BACKGROUND|
1<<LTFT_HIDDEN_FOREGROUND|
1<<LTFT_HIDDEN_BACKGROUND|
1<<LTFT_TREE_FOREGROUND|
1<<LTFT_TREE_BACKGROUND|
1<<LTFT_USER_FOREGROUND|
1<<LTFT_USER_BACKGROUND|
1<<LTFT_WORD_WRAP|
1<<LTFT_UNDERLINED|
1<<LTFT_INVERTED|
1<<LTFT_BLINK|
1<<LTFT_SHIFTED_X|
1<<LTFT_SHIFTED_Y|
1<<LTFT_PICTURE|
1<<LTFT_PICWORD|
1<<LTFT_TOP_LEFT_TOOLBAR|
1<<LTFT_TOP_RIGHT_TOOLBAR|
1<<LTFT_BPT;
ltf_form_types[0]=ltf_display_types[0] & ~(1<<LTFT_TEXT)|1<<LTFT_HEX_EDIT;
ltf_data_types[0]=1<<LTFT_DATA|
1<<LTFT_HEX_EDIT|
1<<LTFT_CHECK_BOX;
Bts(ltf_clean_scancodes,SC_CURSOR_RIGHT);
Bts(ltf_clean_scancodes,SC_CURSOR_LEFT);
Bts(ltf_clean_scancodes,SC_CURSOR_UP);
Bts(ltf_clean_scancodes,SC_CURSOR_DOWN);
Bts(ltf_clean_scancodes,SC_PAGE_UP);
Bts(ltf_clean_scancodes,SC_PAGE_DOWN);
Bts(ltf_clean_scancodes,SC_ALT);
Bts(ltf_clean_scancodes,SC_CTRL);
Bts(ltf_clean_scancodes,SC_SHIFT);
Bts(ltf_clean_scancodes,SC_CAPS);
Bts(ltf_clean_scancodes,SC_NUM);
Bts(ltf_clean_scancodes,SC_SCROLL);
Bts(ltf_clean_scancodes,SC_HOME);
Bts(ltf_clean_scancodes,SC_END);
Bts(ltf_clean_scancodes,SC_GUI);
Bts(ltf_clean_scancodes,SC_BACKSPACE); //Handled specially
LtfBinEntry *LtfFindBin(Ltf *l,U8 num)
{
LtfBinEntry *b=l->bin_root.next;
while (b!=&l->bin_root) {
if (b->num==num)
return b;
b=b->next;
}
return NULL;
}
void LtfValidateBins(Ltf *l)
{
LtfBinEntry *b=l->bin_root.next,*b1;
LtfEntry *cl=l->dummy.next,*cl2;
while (b!=&l->bin_root) {
b->use_cnt=0;
b->temp_use_cnt=0;
b=b->next;
}
while (cl!=l) {
cl2=cl->next;
if (cl->flags & LTFLF_HAS_BIN) {
if (cl->bin_data=LtfFindBin(l,cl->bin_num)) {
cl->bin_data->use_cnt++;
if (cl->btype==LTFT_PICWORD)
cl->bin_data->temp_use_cnt++;
} else {
DbgStr("Bin Not Found",3000);
RemQue(cl); //don't attempt to delete
}
}
cl=cl2;
}
b=l->bin_root.next;
l->cur_bin_num=1;
while (b!=&l->bin_root) {
b1=b->next;
if (!b->use_cnt) {
RemQue(b);
Free(b->data,l->mem_tss);
Free(b,l->mem_tss);
} else {
if (b->num>=l->cur_bin_num)
l->cur_bin_num=b->num+1;
}
b=b1;
}
}
void LtfDelBin(Ltf *l,LtfBinEntry *b)
{
b->use_cnt--;
if (!b->use_cnt) {
RemQue(b);
Free(b->data,l->mem_tss);
Free(b,l->mem_tss);
}
}
void LtfDelEntry(Ltf *l,LtfEntry *cl)
{
if (l==cl)
DbgStr("Ltf Del Header",10000);
else {
if (l->cur_entry==cl)
l->cur_entry=cl->next;
if (l->top_entry==cl)
l->top_entry=cl->next;
RemQue(cl);
if (Bt(ltf_display_types,cl->btype))
Free(cl->display,l->mem_tss);
if (cl->flags & LTFLF_LEFT_MACRO)
Free(cl->left_macro,l->mem_tss);
if (cl->flags & LTFLF_RIGHT_MACRO)
Free(cl->right_macro,l->mem_tss);
if (cl->flags & LTFLF_AUX_STR)
Free(cl->aux_str,l->mem_tss);
if (cl->flags & LTFLF_HAS_BIN)
LtfDelBin(l,cl->bin_data);
Free(cl,l->mem_tss);
}
}
void LtfDelUndo(Ltf *l,LtfUndo *u)
{
Free(u->body,l->mem_tss);
Free(u,l->mem_tss);
}
void LtfSetUndoCnt(Ltf *l)
{
BoolU4 old_preempt=Preempt(OFF);
LtfUndo *u=l->undo_root.next;
l->undo_cnt=0;
while (u!=&l->undo_root) {
l->undo_cnt++;
u=u->next;
}
Preempt(old_preempt);
}
BoolU8 LtfCheckBin(Ltf *l,LtfBinEntry *b)
{
if (MTss(b->data)!=l->mem_tss)
return FALSE;
if (MTss(b)!=l->mem_tss)
return FALSE;
return TRUE;
}
BoolU8 LtfCheckEntry(Ltf *l,LtfEntry *cl)
{
if (l==cl)
DbgStr("Ltf Del Header",10000);
else {
if (Bt(ltf_display_types,cl->btype))
if (MTss(cl->display)!=l->mem_tss)
return FALSE;
if (cl->flags & LTFLF_LEFT_MACRO)
if (MTss(cl->left_macro)!=l->mem_tss)
return FALSE;
if (cl->flags & LTFLF_RIGHT_MACRO)
if (MTss(cl->right_macro)!=l->mem_tss)
return FALSE;
if (cl->flags & LTFLF_AUX_STR)
if (MTss(cl->aux_str)!=l->mem_tss)
return FALSE;
if (cl->flags & LTFLF_HAS_BIN)
if (!LtfCheckBin(l,cl->bin_data))
return FALSE;
if (MTss(cl)!=l->mem_tss)
return FALSE;
}
return TRUE;
}
LtfEntry *LtfCopyEntry(Ltf *l,LtfEntry *cl)
{
LtfEntry *nl;
LtfBinEntry *tempb;
TssStruct *tss=l->mem_tss;
nl=MAllocIdentical(cl,tss);
nl->next=nl;
nl->last=nl;
if (Bt(ltf_display_types,cl->btype))
nl->display=MAllocIdentical(cl->display,tss);
if (cl->flags & LTFLF_AUX_STR)
nl->aux_str=MAllocIdentical(cl->aux_str,tss);
if (cl->flags & LTFLF_LEFT_MACRO)
nl->left_macro=MAllocIdentical(cl->left_macro,tss);
if (cl->flags & LTFLF_RIGHT_MACRO)
nl->right_macro=MAllocIdentical(cl->right_macro,tss);
if (cl->flags & LTFLF_HAS_BIN) {
tempb=MAllocIdentical(cl->bin_data,tss);
tempb->data=MAllocIdentical(cl->bin_data->data,tss);
nl->bin_num=l->cur_bin_num;
tempb->num=l->cur_bin_num++;
nl->bin_data=tempb;
InsQue(tempb,l->bin_root.last);
}
return nl;
}
void LtfFormForward(Ltf *l)
{
LtfEntry *cl=l->cur_entry,*cl1=cl->last,*cl2=cl;
if (l->flags & LTFF_FORM) {
while (cl!=cl1 && !Bt(ltf_form_types,cl->btype))
cl=cl->next;
}
while (cl->btype==LTFT_INDENT)
cl=cl->next;
if (cl!=cl2) {
l->cur_data_col=cl->min_col;
l->cur_entry=cl;
}
}
void LtfFormBackward(Ltf *l)
{
LtfEntry *cl=l->cur_entry,*cl1=cl->next,*cl2=cl;
if (l->flags & LTFF_FORM) {
while (cl!=cl1 && !Bt(ltf_form_types,cl->btype))
cl=cl->last;
}
while (cl->btype==LTFT_INDENT)
cl=cl->next;
if (cl!=cl2) {
l->cur_data_col=cl->min_col;
l->cur_entry=cl;
}
}
public void LtfHome(Ltf *l=NULL)
{
if (!l) {
l=Fs->cur_ltf;
if (!l) return;
}
l->cur_entry=l->dummy.next;
l->cur_data_col=l->cur_entry->min_col;
l->x=0;
l->y=0;
l->line_start_col=0;
l->cur_top_line_num=0;
LtfFormForward(l);
}
public BoolU4 LtfCheck(Ltf *l=NULL)
{
LtfEntry *cl,*cl1;
if (!l) {
l=Fs->cur_ltf;
if (!l) return FALSE;
}
cl=l->dummy.next;
while (cl!=l) {
cl1=cl->next;
if (!LtfCheckEntry(l,cl))
return FALSE;
cl=cl1;
}
return TRUE;
}
public void LtfReset(Ltf *l,BoolU4 is_old)
{
LtfEntry *cl,*cl1;
LtfUndo *u,*u1;
if (!l) {
l=Fs->cur_ltf;
if (!l) return;
}
if (is_old) {
cl=l->dummy.next;
while (cl!=l) {
cl1=cl->next;
LtfDelEntry(l,cl);
cl=cl1;
}
u=l->undo_root.next;
while (u!=&l->undo_root) {
u1=u->next;
LtfDelUndo(l,u);
u=u1;
}
}
//Check $LK,"EditInsertLtf","MN:EditInsertLtf"$
l->start_text_attribute=(WHITE<<4)+BLUE;
l->text_attribute=l->start_text_attribute;
l->link_attribute=(WHITE<<4)+RED;
l->macro_attribute=(WHITE<<4)+LTBLUE;
l->anchor_attribute=(WHITE<<4)+BLACK;
l->hidden_attribute=(WHITE<<4)+BLACK;
l->tree_attribute=(WHITE<<4)+PURPLE;
l->user_attribute=(WHITE<<4)+GREEN;
l->flags=0;
l->dummy.next=l;
l->dummy.last=l;
l->bin_root.next=&l->bin_root;
l->bin_root.last=&l->bin_root;
l->undo_root.next=&l->undo_root;
l->undo_root.last=&l->undo_root;
l->undo_root.timestamp=0;
l->undo_cnt=0;
l->cur_bin_num=1;
l->recalc_start=l;
l->menu_ltf=NULL;
l->dollar_buf_ptr=0;
l->cmd_I1=CH_SPACE;
l->indent=0;
l->page_line_num=0;
l->page_length=66;
l->left_margin=LTF_DEFAULT;
l->right_margin=LTF_DEFAULT;
l->header=LTF_DEFAULT;
l->footer=LTF_DEFAULT;
l->best_d=MAX_I8;
cl=&l->dummy;
cl->type=LTFT_ERROR;
cl->flags=0;
cl->x=0;
cl->y=0;
cl->min_col=0;
cl->max_col=0;
cl->indent=l->indent;
cl->page_line_num=l->page_line_num;
cl->left_margin=l->left_margin;
cl->right_margin=l->right_margin;
LtfHome(l);
}
public void LtfDel(Ltf *l)
{
Ltf *m;
if (!l) return;
m=l->menu_ltf;
LtfReset(l,TRUE);
Free(l->find_replace,l->mem_tss);
Free(l->dollar_buf,l->mem_tss);
LtfDel(m);
Free(l,l->mem_tss);
}
void LtfFormatData(LtfEntry *cl)
{
BoolU4 *b;
U8 *d;
I8 i;
if (cl->btype==LTFT_DATA) {
d=cl->data;
if (cl->flags & LTFLF_DATA_IS_PTR)
SPrintF(cl->display,cl->aux_str,*d,cl->my_format_data);
else
SPrintF(cl->display,cl->aux_str,d,cl->my_format_data);
if (cl->flags & LTFLF_HAS_TERMINATOR) {
i=StrLen(cl->display);
cl->display[i++]='_';
cl->display[i]=0;
}
cl->max_col=StrLen(cl->display);
} else if (cl->btype==LTFT_CHECK_BOX) {
if (cl->flags & LTFLF_DATA_IS_PTR)
b=cl->data;
else
b=&cl->data;
if (*b)
cl->flags|=LTFLF_CHECKED;
else
cl->flags&=~LTFLF_CHECKED;
}
}
void LtfGetData(LtfEntry *cl)
{
BoolU4 *b;
I8 i;
if (cl->btype==LTFT_DATA) {
i=StrLen(cl->display);
if (cl->flags & LTFLF_HAS_TERMINATOR)
cl->display[--i]=0;
if (i>cl->len+cl->min_col)
cl->display[cl->len+cl->min_col]=0;
if (cl->flags & LTFLF_DATA_IS_PTR)
GetF(cl->display,cl->aux_str,cl->data,cl->my_format_data);
else
GetF(cl->display,cl->aux_str,&cl->data,cl->my_format_data);
if (cl->flags & LTFLF_HAS_TERMINATOR)
cl->display[i]='_';
} else if (cl->btype==LTFT_CHECK_BOX) {
if (cl->flags & LTFLF_DATA_IS_PTR)
b=cl->data;
else
b=&cl->data;
if (cl->flags & LTFLF_CHECKED)
*b=TRUE;
else
*b=FALSE;
}
}
void LtfRemoveSoftCRs(Ltf *l=NULL,LtfEntry *cl=NULL)
{
LtfEntry *cl2,*saved_cl=cl;
BoolU4 old_preempt=Preempt(OFF);
if (!l) {
l=Fs->cur_ltf;
if (!l) return;
}
if (!cl) cl=l->dummy.next;
while (cl!=l) {
cl2=cl->next;
if (cl->btype==LTFT_SOFT_CR) {
if (l->cur_entry==cl) {
l->cur_entry=cl2;
l->cur_data_col=l->cur_entry->min_col;
}
LtfDelEntry(l,cl);
} else if (saved_cl && cl->btype==LTFT_CR)
break;
cl=cl2;
}
Preempt(old_preempt);
}
#help_index "Ltf/Cmd Line (Typically)"
public void LtfMax(U8 i=MAX_I4)
//Adjusts the size of the Ltf buffer.
//Normally, the command line deletes
//entries after a while.
{
Ltf *l=Fs->cur_ltf;
l->max_entries=i;
}
#help_index "Ltf"
public Ltf *LtfNew()
{
Ltf *l;
l=MAllocZ(sizeof(Ltf));
StrCpy(l->filename.name,sys_temp_filename);
l->file_attr=0;
l->find_replace=MAllocZ(sizeof(EditFindTextStruct));
l->find_replace->scan_forward=1;
l->find_replace->match_case=1;
l->LeftClickLink=&EditLeftClickLink;
l->dollar_buf_size=84;
l->dollar_buf=MAlloc(l->dollar_buf_size);
l->max_entries=MAX_I4;
l->ww_lines_back=32;
l->win_tss=Fs;
l->mem_tss=Fs;
LtfReset(l,FALSE);
return l;
}
sys_clipboard_ltf=LtfNew;
+688
View File
@@ -0,0 +1,688 @@
void ParseLtfFlags(LexStruct *l,U8 *flags,U4 *type)
{
I8 i;
BoolU4 turn_on;
while (l->token=='+' || l->token=='-') {
turn_on=(l->token=='+');
if (Lex(l)==TK_IDENT) {
i=MatchSysTextEntry(l->ident,"ST_LTF_FLAGS",MLE_EXACT);
if (i<0)
*type=LTFT_ERROR;
else {
AssignBit(flags,i,turn_on);
if (i==LTFLf_SELECTED)
AssignBit(type,30,turn_on);
else if (i==LTFLf_UNDERLINED)
AssignBit(type,31,turn_on);
else if (i==LTFLf_INVERTED)
AssignBit(type,29,turn_on);
else if (i==LTFLf_BLINK)
AssignBit(type,28,turn_on);
}
Lex(l); //skip flag
}
}
}
void LtfDefaultFlags(U4 *type,U8 *f1)
{
switch (*type & 255) {$AN,"default_flags","default_flags"$
case LTFT_TREE:
*f1=LTFLF_COLLAPSED|LTFLF_TREE;
*type|=LTFLT_UNDERLINE;
break;
case LTFT_DATA:
*f1=LTFLF_DATA_IS_PTR | LTFLF_HAS_TERMINATOR | LTFLF_AUX_STR;
break;
case LTFT_CURSOR_MOVEMENT:
*f1=LTFLF_LEFT_EXP | LTFLF_RIGHT_EXP;
break;
case LTFT_LINK:
*f1=LTFLF_LINK|LTFLF_AUX_STR;
*type|=LTFLT_UNDERLINE;
break;
case LTFT_ANCHOR:
*f1=LTFLF_AUX_STR;
break;
case LTFT_BUTTON:
*f1=LTFLF_ESC | LTFLF_LEFT_EXP | LTFLF_HAS_BORDER;
break;
case LTFT_CHECK_BOX:
*f1=LTFLF_DATA_IS_PTR;
break;
case LTFT_MACRO:
*f1=LTFLF_ESC | LTFLF_LEFT_MACRO;
*type|=LTFLT_UNDERLINE;
break;
case LTFT_MENU_VALUE:
*f1=LTFLF_ESC | LTFLF_LEFT_EXP;
*type|=LTFLT_UNDERLINE;
break;
case LTFT_HEX_EDIT:
*f1=LTFLF_DATA_IS_PTR | LTFLF_ZERO_BASED;
break;
case LTFT_PICWORD:
*f1=LTFLF_HAS_BIN|LTFLF_AUX_STR|LTFLF_FROM_START|LTFLF_WIDTH|LTFLF_HEIGHT;
break;
case LTFT_PICTURE:
*f1=LTFLF_HAS_BIN;
break;
case LTFT_TOP_LEFT_TOOLBAR:
*f1=LTFLF_HAS_BIN|LTFLF_TOP_LEFT_MENU|LTFLF_WIDTH|LTFLF_HEIGHT;
break;
case LTFT_TOP_RIGHT_TOOLBAR:
*f1=LTFLF_HAS_BIN|LTFLF_TOP_RIGHT_MENU|LTFLF_WIDTH|LTFLF_HEIGHT;
break;
case LTFT_INSERT_BINARY:
case LTFT_INSERT_BINARY_TYPE:
case LTFT_INSERT_BINARY_SIZE:
*f1=LTFLF_HAS_BIN;
break;
case LTFT_HIDE_START:
*f1=LTFLF_COLLAPSED;
*type|=LTFLT_UNDERLINE;
break;
case LTFT_SONG:
*f1=LTFLF_SONG;
break;
}
}
I1 *LtfToPlainText(Ltf *l,LtfEntry *ll)
{ //TODO: break strs
I8 i,j;
U8 type=ll->btype,f1=0,flags;
I1 *buf,*buf2;
buf=NewStr(SysTextSub(ll->btype,"ST_LTF_CMDS"));
if (ll->btype!=LTFT_ERROR) {
LtfDefaultFlags(&type,&f1);
flags=ll->flags & ~(LTFLF_WORD_WRAP |LTFLF_UNDERLINED |
LTFLF_INVERTED | LTFLF_BLINK | LTFLF_SKIP);
for (i=0;i<64;i++)
if (Bt(&f1,i)!=Bt(&flags,i)) {
if (Bt(&flags,i))
buf=Add2Str(buf,"+");
else
buf=Add2Str(buf,"-");
buf=Add2Str(buf,SysTextSub(i,"ST_LTF_FLAGS"));
}
for (i=28;i<32;i++)
if (Bt(&type,i)!=Bt(&ll->type,i)) {
if (Bt(&ll->type,i))
buf=Add2Str(buf,"+");
else
buf=Add2Str(buf,"-");
switch (i) {
case 28: j=LTFLf_BLINK; break;
case 29: j=LTFLf_INVERTED; break;
case 30: j=LTFLf_SELECTED; break;
case 31: j=LTFLf_UNDERLINED; break;
}
buf=Add2Str(buf,SysTextSub(j,"ST_LTF_FLAGS"));
}
buf=Add2Str(buf,",");
switch (ll->btype) {
case LTFT_TEXT:
case LTFT_LINK:
case LTFT_ANCHOR:
case LTFT_MENU_VALUE:
case LTFT_BUTTON:
case LTFT_CHECK_BOX:
case LTFT_TREE:
case LTFT_PICTURE:
case LTFT_PICWORD:
case LTFT_INSERT_BINARY:
case LTFT_INSERT_BINARY_TYPE:
case LTFT_INSERT_BINARY_SIZE:
case LTFT_SONG:
buf=Add2Str(buf,"\"");
if (i==LTFT_CHECK_BOX) {
buf=Add2Str(buf,ll->display+4);
} else {
if (ll->flags & LTFLF_TREE)
buf=Add2Str(buf,ll->display+3);
else
buf=Add2Str(buf,ll->display);
}
buf=Add2Str(buf,"\",");
break;
case LTFT_DATA:
buf2=MSPrintF("%s%d,",buf,ll->len);
Free(buf); buf=buf2;
break;
case LTFT_HEX_EDIT:
buf2=MSPrintF("%s%d,",buf,ll->len);
Free(buf); buf=buf2;
buf2=MSPrintF("%s%d,",buf,ll->hex_edit_width);
Free(buf); buf=buf2;
break;
case LTFT_PAGE_LENGTH:
case LTFT_LEFT_MARGIN:
case LTFT_RIGHT_MARGIN:
case LTFT_HEADER:
case LTFT_FOOTER:
case LTFT_INDENT:
case LTFT_FOREGROUND_COLOR:
case LTFT_BACKGROUND_COLOR:
case LTFT_DEFAULT_FOREGROUND_COLOR:
case LTFT_DEFAULT_BACKGROUND_COLOR:
case LTFT_LINK_FOREGROUND:
case LTFT_LINK_BACKGROUND:
case LTFT_MACRO_FOREGROUND:
case LTFT_MACRO_BACKGROUND:
case LTFT_ANCHOR_FOREGROUND:
case LTFT_ANCHOR_BACKGROUND:
case LTFT_HIDDEN_FOREGROUND:
case LTFT_HIDDEN_BACKGROUND:
case LTFT_TREE_FOREGROUND:
case LTFT_TREE_BACKGROUND:
case LTFT_USER_FOREGROUND:
case LTFT_USER_BACKGROUND:
case LTFT_WORD_WRAP:
case LTFT_UNDERLINED:
case LTFT_INVERTED:
case LTFT_BLINK:
case LTFT_SHIFTED_X:
case LTFT_SHIFTED_Y:
if (ll->attr!=LTF_DEFAULT) {
buf2=MSPrintF("%s%d,",buf,ll->attr);
Free(buf); buf=buf2;
}
break;
}
flags=ll->flags& (LTFLF_SCROLLING_X|LTFLF_SHIFTED_X|LTFLF_SCROLLING_Y|
LTFLF_AUX_STR|LTFLF_LEFT_EXP|LTFLF_LEFT_MACRO|
LTFLF_HAS_BIN|LTFLF_RIGHT_EXP|LTFLF_RIGHT_MACRO|
LTFLF_WIDTH|LTFLF_HEIGHT);
while (flags) {
j=Bsf(flags);
Btr(&flags,j);
switch (j) {
case LTFLf_SCROLLING_X:
buf2=MSPrintF("%s%d",buf,ll->scroll_len);
Free(buf); buf=buf2;
break;
case LTFLf_SHIFTED_X:
j=(ll->type.u2[1])&0x1F;
if (j&0x10) j|=0xFFFFFFF0;
buf2=MSPrintF("%s%d",buf,j);
Free(buf); buf=buf2;
break;
case LTFLf_SHIFTED_Y:
j=(ll->type>>21)&0x1F;
if (j&0x10) j|=0xFFFFFFF0;
buf2=MSPrintF("%s%d",buf,j);
Free(buf); buf=buf2;
break;
case LTFLf_AUX_STR:
buf2=MSPrintF("%s\"%Q\"",buf,ll->aux_str);
Free(buf); buf=buf2;
break;
case LTFLf_LEFT_EXP:
buf2=MSPrintF("%s%d",buf,ll->left_exp);
Free(buf); buf=buf2;
break;
case LTFLf_LEFT_MACRO:
buf2=MSPrintF("%s\"%Q\"",buf,ll->left_macro);
Free(buf); buf=buf2;
break;
case LTFLf_RIGHT_EXP:
buf2=MSPrintF("%s%d",buf,ll->right_exp);
Free(buf); buf=buf2;
break;
case LTFLf_RIGHT_MACRO:
buf2=MSPrintF("%s\"%Q\"",buf,ll->right_macro);
Free(buf); buf=buf2;
break;
case LTFLf_HAS_BIN:
buf2=MSPrintF("%s%d",buf,ll->bin_num);
Free(buf); buf=buf2;
break;
case LTFLf_WIDTH:
buf2=MSPrintF("%s%d",buf,ll->width);
Free(buf); buf=buf2;
break;
case LTFLf_HEIGHT:
buf2=MSPrintF("%s%d",buf,ll->height);
Free(buf); buf=buf2;
break;
}
buf=Add2Str(buf,",");
}
buf[StrLen(buf)-1]=0; //Kill last comma
}
buf2=NewStr(buf,l->mem_tss); //exact allocation
Free(buf);
return buf2;
}
LtfEntry *ParseDollarCmd(Ltf *l,I1 *st)
{
I8 i,j,size,flags;
I1 *ptr,*st2;
LtfEntry *ll=NULL;
LexStruct *lx=LexNew(st,LF_DONT_FREE_BUFFER,NULL);
Lex(lx);
if (lx->token==TK_IDENT) {
i=MatchSysTextEntry(lx->ident,"ST_LTF_CMDS",MLE_IGNORE_CASE);
if (i<0)
i=LTFT_ERROR;
Lex(lx); //skip cmd code
ll=MAllocZ(sizeof(LtfEntry),l->mem_tss);
ll->type=i;
LtfDefaultFlags(&ll->type,&ll->flags);
ParseLtfFlags(lx,&ll->flags,&ll->type);
if (lx->token==',')
Lex(lx);
switch (i) {
case LTFT_TEXT:
case LTFT_LINK:
case LTFT_ANCHOR:
case LTFT_MENU_VALUE:
case LTFT_BUTTON:
case LTFT_CHECK_BOX:
case LTFT_TREE:
case LTFT_PICTURE:
case LTFT_PICWORD:
case LTFT_INSERT_BINARY:
case LTFT_INSERT_BINARY_TYPE:
case LTFT_INSERT_BINARY_SIZE:
case LTFT_SONG:
if (lx->token==TK_STR) {
st2=LexExtendStr(lx,&size);
if (i==LTFT_CHECK_BOX) {
st=MSPrintF("[X] %s",st2);
Free(st2);
ll->min_col=1;
} else if (ll->flags & LTFLF_TREE) {
st=MSPrintF("+] %s",st2);
Free(st2);
ll->min_col=1;
} else
st=st2;
ll->display=NewStr(st,l->mem_tss);
Free(st);
} else {
if (i>=LTFT_PICTURE && i<=LTFT_INSERT_BINARY_SIZE ||
i==LTFT_SONG)
ll->display=NewStr("",l->mem_tss);
else {
ll->display=NULL;
ll->type=LTFT_ERROR;
}
}
break;
case LTFT_HIDE_START:
ll->display=NewStr("<-",l->mem_tss);
ll->min_col=1;
break;
case LTFT_HIDE_END:
ll->display=NewStr(">",l->mem_tss);
break;
case LTFT_DATA:
ll->flags|=LTFLF_AUX_STR; //don't allow switched off
ll->len=Expression(lx);
break;
case LTFT_HEX_EDIT:
ll->len=Expression(lx);
if (lx->token==',')
Lex(lx);
ll->hex_edit_width=Expression(lx);
break;
case LTFT_PAGE_LENGTH:
case LTFT_LEFT_MARGIN:
case LTFT_RIGHT_MARGIN:
case LTFT_HEADER:
case LTFT_FOOTER:
case LTFT_INDENT:
case LTFT_FOREGROUND_COLOR:
case LTFT_BACKGROUND_COLOR:
case LTFT_DEFAULT_FOREGROUND_COLOR:
case LTFT_DEFAULT_BACKGROUND_COLOR:
case LTFT_LINK_FOREGROUND:
case LTFT_LINK_BACKGROUND:
case LTFT_MACRO_FOREGROUND:
case LTFT_MACRO_BACKGROUND:
case LTFT_ANCHOR_FOREGROUND:
case LTFT_ANCHOR_BACKGROUND:
case LTFT_HIDDEN_FOREGROUND:
case LTFT_HIDDEN_BACKGROUND:
case LTFT_TREE_FOREGROUND:
case LTFT_TREE_BACKGROUND:
case LTFT_USER_FOREGROUND:
case LTFT_USER_BACKGROUND:
case LTFT_WORD_WRAP:
case LTFT_UNDERLINED:
case LTFT_INVERTED:
case LTFT_BLINK:
case LTFT_SHIFTED_X:
case LTFT_SHIFTED_Y:
if (!lx->token)
ll->attr=LTF_DEFAULT;
else
ll->attr=Expression(lx);
break;
case LTFT_ERROR:
ll->flags=0;
ll->type=LTFT_ERROR;
break;
}
flags=ll->flags& (LTFLF_SCROLLING_X|LTFLF_SHIFTED_X|LTFLF_SCROLLING_Y|
LTFLF_AUX_STR|LTFLF_LEFT_EXP|LTFLF_LEFT_MACRO|
LTFLF_HAS_BIN|LTFLF_RIGHT_EXP|LTFLF_RIGHT_MACRO|
LTFLF_WIDTH|LTFLF_HEIGHT);
while (flags) {
j=Bsf(flags);
Btr(&flags,j);
while (lx->token==',')
Lex(lx);
switch (j) { //TODO: Might check for expression errors
case LTFLf_SCROLLING_X:
ll->scroll_len=Expression(lx);
break;
case LTFLf_SHIFTED_X:
ll->type|=((Expression(lx) & 0x1F)<<16);
break;
case LTFLf_SHIFTED_Y:
ll->type|=((Expression(lx) & 0x1F)<<21);
break;
case LTFLf_AUX_STR:
if (lx->token==TK_STR) {
st2=LexExtendStr(lx,&size);
ll->aux_str=NewStr(st2,l->mem_tss);
Free(st2);
if (i==LTFT_MACRO && !ll->display)
ll->display=NewStr(ll->aux_str,l->mem_tss);
if (i==LTFT_DATA) {
if (ptr=StrStr(ll->aux_str,":"))
ll->min_col=ptr-ll->aux_str+1;
ll->display=MAlloc(ll->len+ll->min_col+2,l->mem_tss);
}
} else
ll->type=LTFT_ERROR;
break;
case LTFLf_LEFT_EXP:
ll->left_exp=Expression(lx);
break;
case LTFLf_LEFT_MACRO:
if (lx->token==TK_STR) {
st2=LexExtendStr(lx,&size);
ll->left_macro=NewStr(st2,l->mem_tss);
Free(st2);
if (i==LTFT_MACRO && !ll->display)
ll->display=NewStr(ll->left_macro,l->mem_tss);
} else
ll->type=LTFT_ERROR;
break;
case LTFLf_RIGHT_EXP:
ll->right_exp=Expression(lx);
break;
case LTFLf_RIGHT_MACRO:
if (lx->token==TK_STR) {
st2=LexExtendStr(lx,&size);
ll->right_macro=NewStr(st2,l->mem_tss);
Free(st2);
if (i==LTFT_MACRO && !ll->display)
ll->display=NewStr(ll->right_macro,l->mem_tss);
} else
ll->type=LTFT_ERROR;
break;
case LTFLf_HAS_BIN:
if (!lx->token)
ll->bin_num=0;
else
ll->bin_num=Expression(lx);
break;
case LTFLf_WIDTH:
ll->width=Expression(lx);
break;
case LTFLf_HEIGHT:
ll->height=Expression(lx);
break;
}
}
} else if (!ll) {
ll=MAllocZ(sizeof(LtfEntry),l->mem_tss);
ll->type=LTFT_ERROR;
}
LexDel(lx);
return ll;
}
void LtfInsert(Ltf *l,LtfEntry *ll)
{
I1 *dst;
LtfEntry *cl=l->cur_entry,*nl;
ll->x=cl->x;
ll->y=cl->y;
ll->indent=cl->indent;
ll->page_line_num=cl->page_line_num;
ll->left_margin=cl->left_margin;
ll->right_margin=cl->right_margin;
if (l->cur_data_col>0 &&
cl->btype==LTFT_TEXT &&
l->cur_data_col<cl->max_col) {
nl=MAllocZ(sizeof(LtfEntryBase)+sizeof(void *),l->mem_tss);
nl->type=LTFT_TEXT|cl->type&-0x100;
nl->x=cl->x;
nl->y=cl->y;
nl->indent=cl->indent;
nl->page_line_num=cl->page_line_num;
nl->left_margin=cl->left_margin;
nl->right_margin=cl->right_margin;
nl->flags=cl->flags;
dst=cl->display+l->cur_data_col;
nl->display=NewStr(dst,l->mem_tss);
*dst=0;
cl->max_col=l->cur_data_col;
InsQue(nl,cl);
l->cur_data_col=0;
cl=nl;
cl->max_col=StrLen(cl->display);
}
if (cl->btype==LTFT_TEXT && l->cur_data_col>=cl->max_col) {
InsQue(ll,cl);
l->cur_entry=ll->next;
} else {
InsQue(ll,cl->last);
l->cur_entry=cl;
}
l->cur_data_col=l->cur_entry->min_col;
LtfRemoveSoftCRs(l,l->cur_entry);
}
#help_index "Ltf/Output"
public LtfEntry *LtfPutSExt(Ltf *l,I1 *st)
{
I1 ch,*ptr=st,*ptr2,*st2,*ptr3,*ptr4,*src;
BoolU4 old_preempt=Preempt(OFF);
LtfEntry *ll=NULL,*result=NULL,*cl=l->cur_entry;
l->recalc_start=l; //TODO:This might be optimized
if (!st) {
Preempt(old_preempt);
return NULL;
}
while (*ptr) {
ptr2=ptr;
ch=*ptr++;
while (TRUE) {
if (l->flags & LTFF_PLAIN_TEXT_WITH_TABS)
while (ch && ch!=CH_CR && ch!=CH_LINE_FEED && ch!=CH_CURSOR)
ch=*ptr++;
else if (l->flags & LTFF_PLAIN_TEXT)
while (ch && ch!=CH_CR && ch!=CH_LINE_FEED && ch!=CH_TAB && ch!=CH_CURSOR && ch!=CH_FORM_FEED)
ch=*ptr++;
else
while (ch && ch!=CH_CR && ch!=CH_LINE_FEED && ch!=CH_TAB && ch!=CH_CURSOR && ch!=CH_FORM_FEED && ch!='$$')
ch=*ptr++;
if (ch==CH_CURSOR) {
if (l->flags & LTFF_NO_CURSOR)
ch=*ptr++;
else
break;
} else
break;
}
ptr--;
if (!ch) {
if (ptr!=ptr2) {
ll=MAllocZ(sizeof(LtfEntryBase)+sizeof(void *),l->mem_tss);
ll->type=LTFT_TEXT | l->text_attribute << 8;
if (l->flags & LTFF_NO_CURSOR) {
src=NewStr(ptr2);
StrUtil(src,SU_REMOVE_CTRL_CHARS);
} else
src=ptr2;
ll->display=NewStr(src,l->mem_tss);
ll->max_col=StrLen(src);
LtfInsert(l,ll);
if (l->flags & LTFF_NO_CURSOR)
Free(src);
}
} else {
if (ptr!=ptr2) {
*ptr=0;
ll=MAllocZ(sizeof(LtfEntryBase)+sizeof(void *),l->mem_tss);
ll->type=LTFT_TEXT | l->text_attribute << 8;
if (l->flags & LTFF_NO_CURSOR) {
src=NewStr(ptr2);
StrUtil(src,SU_REMOVE_CTRL_CHARS);
} else
src=ptr2;
ll->display=NewStr(src,l->mem_tss);
ll->max_col=StrLen(src);
LtfInsert(l,ll);
if (l->flags & LTFF_NO_CURSOR)
Free(src);
*ptr=ch;
}
if (ch==CH_CURSOR) { //cursor
ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss);
ll->type=LTFT_CURSOR | l->text_attribute << 8;
LtfInsert(l,ll);
ptr++;
} else if (ch==CH_FORM_FEED) {
ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss);
ll->type=LTFT_PAGE_BREAK | l->text_attribute << 8;
LtfInsert(l,ll);
ptr++;
} else if (ch==CH_TAB) {
ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss);
ll->type=LTFT_TAB | l->text_attribute << 8;
LtfInsert(l,ll);
ptr++;
} else if (ch=='$$') {
ptr++; //skip first dollar
ptr2=ptr;
while (*ptr && *ptr!='$$')
ptr++;
if (*ptr) {
*ptr=0; //zero second dollar
if (ptr==ptr2) {
ll=MAllocZ(sizeof(LtfEntryBase)+sizeof(void *),l->mem_tss);
ll->type=LTFT_TEXT | l->text_attribute << 8;
ll->max_col=1;
if (l->flags & LTFF_DOUBLE_DOLLARS)
ll->display=NewStr("$$$$",l->mem_tss);
else
ll->display=NewStr("$$",l->mem_tss);
LtfInsert(l,ll);
} else {
st2=MAlloc(ptr-ptr2+1);
ptr3=ptr2;
ptr4=st2;
while (*ptr3) {
ch=*ptr3++;
if (ch==CH_CURSOR) {
ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss);
ll->type=LTFT_CURSOR | l->text_attribute << 8;
LtfInsert(l,ll);
} else if (ch==CH_FORM_FEED) {
ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss);
ll->type=LTFT_PAGE_BREAK | l->text_attribute << 8;
LtfInsert(l,ll);
} else
*ptr4++=ch;
}
*ptr4=0;
if (ll=ParseDollarCmd(l,st2)) {
result=ll;
LtfInsert(l,ll);
}
Free(st2);
}
*ptr++='$$';
}
} else {
ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss);
ll->type=LTFT_CR | l->text_attribute << 8;
LtfInsert(l,ll);
if (ch==CH_CR)
while (*ptr==CH_CR)
ptr++;
if (*ptr==CH_LINE_FEED)
ptr++;
while (*ptr==CH_CR)
ptr++;
}
}
}
Preempt(old_preempt);
return result;
}
public LtfEntry *LtfPrintF(Ltf *l,I1 *src,...)
{
LtfEntry *result;
I1 *buf=SPrintFJoin(NULL,src,argc,argv);
result=LtfPutSExt(l,buf);
Free(buf);
return result;
}
#help_index "PicWords"
#help_file "::/LT/Doc/PicWords.TXZ"
#help_index "PicWords;Ltf/Output"
public PicWordEntry *AddPicWord(I1 *st,GrElem *tempe,U8 size,I8 width=0,I8 height=0,I1 *txt=NULL)
{
//If you set $FG,4$txt$FG$, then include dollar signs
//$FG,4$$$PW,"padspaces","Word",%d,width,height$$$FG$
//
//If you want a macro picword
//$FG,4$$$PW+LM,"padspaces","Word","Macro",%d,width,height$$$FG$
//See $LK,"LtfWordsToPics","MN:LtfWordsToPics"$
I1 *st2;
I8 l;
PicWordEntry *temppw=MAllocZ(sizeof(PicWordEntry));
temppw->type=HTT_PIC_WORD;
temppw->use_cnt=0;
temppw->grelem=tempe;
temppw->size=size;
temppw->width=width;
temppw->height=height;
if (txt) {
l=StrLen(txt);
if (l>2) {
st2=MAlloc(l-2+1);
MemCpy(st2,txt+1,l-2);
st2[l-2]=0;
temppw->txt=st2;
}
}
temppw->source_link=NULL;
temppw->str=NewStr(st);
AddSysHashEntry(temppw,Fs->hash_table);
return temppw;
}
#help_index "Ltf"
+621
View File
@@ -0,0 +1,621 @@
public I8 LtfRunEntry(Ltf *l,LtfEntry *cl,BoolU4 exited,BoolU4 old_preempt)
{ //Call with preempt off
I8 result=-1;
I1 ch=l->cmd_I1,*st;
I8 cb(Ltf *l,LtfEntry *ll);
if (!exited) {
if (cl->flags & LTFLF_ESC) {
Msg(MSG_KEY_DOWN,CH_ESC,0,1<<TSSCf_DONT_FILTER);
return 0;
} if (cl->flags & LTFLF_QUIT) {
Msg(MSG_KEY_DOWN,CH_CTRLQ,0,1<<TSSCf_DONT_FILTER);
return 0;
}
}
l->best_d=MAX_I8;
if (cl->flags & LTFLF_LINK) {
try {
if (ch==CH_SPACE) {
if (l->LeftClickLink)
l->LeftClickLink(l,cl,old_preempt);
} else if (ch==CH_CR) {
if (l->RightClickLink)
l->RightClickLink(l,cl,old_preempt);
}
} catch
LtfBottom(l);
return 0;
}
if (ch==CH_SPACE && cl->flags & LTFLF_TREE || cl->btype==LTFT_HIDE_START)
cl->flags^=LTFLF_COLLAPSED;
if ((cl->btype>=LTFT_BUTTON && cl->btype<=LTFT_MENU_VALUE) ||
cl->btype==LTFT_PICTURE ||
cl->btype==LTFT_PICWORD ||
cl->btype==LTFT_TOP_LEFT_TOOLBAR ||
cl->btype==LTFT_TOP_RIGHT_TOOLBAR) {
if (cl->btype==LTFT_CHECK_BOX)
cl->flags^=LTFLF_CHECKED;
if (ch==CH_SPACE) {
if (cl->flags & LTFLF_LEFT_EXP) {
result=cl->left_exp;
Msg(MSG_CMD,result,0,1<<TSSCf_DONT_FILTER);
}
if (cl->flags & LTFLF_LEFT_CB) {
cb=cl->left_cb;
Preempt(old_preempt);
result=cb(l,cl);
Preempt(OFF);
Msg(MSG_CMD,result,0,1<<TSSCf_DONT_FILTER);
}
if (cl->flags & LTFLF_LEFT_MACRO) {
if (cl->flags & LTFLF_POPUP) {
st=NewStr(cl->left_macro);
Preempt(old_preempt);
PopUp(st,Fs);
Preempt(OFF);
Free(st);
} else {
if (cl->flags & LTFLF_LEFT_AUTO)
AutoStr("%s",cl->left_macro);
else
Auto(cl->left_macro);
}
}
} else if (ch==CH_CR) {
if (cl->flags & LTFLF_RIGHT_EXP) {
result=cl->right_exp;
Msg(MSG_CMD,result,0,1<<TSSCf_DONT_FILTER);
}
if (cl->flags & LTFLF_RIGHT_CB) {
cb=cl->right_cb;
Preempt(old_preempt);
result=cb(l,cl);
Preempt(OFF);
Msg(MSG_CMD,result,0,1<<TSSCf_DONT_FILTER);
}
if (cl->flags & LTFLF_RIGHT_MACRO) {
if (cl->flags & LTFLF_POPUP) {
st=NewStr(cl->right_macro);
Preempt(old_preempt);
PopUp(st,Fs);
Preempt(OFF);
Free(st);
} else {
if (cl->flags & LTFLF_RIGHT_AUTO)
AutoStr("%s",cl->right_macro);
else
Auto(cl->right_macro);
}
}
}
}
l->cmd_I1=CH_SPACE;
return result;
}
I1 *EditOverStrikeCB(Ltf *l,LtfEntry *ll,TssStruct *mem_tss)
{
Ltf *ltf=ll->user_data;
I1 *st=MAlloc(8,mem_tss);
nounusedwarn l;
st[0]=(ltf->flags & LTFF_OVERSTRIKE) ? 'O':130;
st[1]=0;
return st;
}
I1 *EditDollarCB(Ltf *l,LtfEntry *ll,TssStruct *mem_tss)
{
Ltf *ltf=ll->user_data;
I1 *st=MAlloc(8,mem_tss);
nounusedwarn l;
st[0]=(ltf->flags & LTFF_IN_DOLLAR) ? '$$':130;
st[1]=0;
return st;
}
I1 *EditQuotesCB(Ltf *l,LtfEntry *ll,TssStruct *mem_tss)
{
LexStruct *lx=mem_tss->last_lex;
I1 *st=MAlloc(8,mem_tss);
nounusedwarn l,ll;
st[0]=(lx->flags & LF_IN_QUOTES) ? '"':130;
st[1]=0;
return st;
}
I1 *EditBracesCB(Ltf *l,LtfEntry *ll,TssStruct *mem_tss)
{
LexStruct *lx=mem_tss->last_lex;
I1 *st=MAlloc(8,mem_tss);
nounusedwarn l,ll;
st[0]=(lx->braces_cnt) ? '}':130;
st[1]=0;
return st;
}
I1 *EditSemicolonCB(Ltf *l,LtfEntry *ll,TssStruct *mem_tss)
{
LexStruct *lx=mem_tss->last_lex;
I1 *st=MAlloc(8,mem_tss);
nounusedwarn l,ll;
st[0]=(lx->statement_cnt) ? ';':130;
st[1]=0;
return st;
}
I1 *EditPreemptCB(Ltf *l,LtfEntry *ll,TssStruct *mem_tss)
{
I1 *st=MAlloc(8,mem_tss);
nounusedwarn l,ll;
st[0]=Bt(&mem_tss->task_flags,TSSf_PREEMPT) ? 'P':130;
st[1]=0;
return st;
}
I1 *EditDollarTypeCB(Ltf *l,LtfEntry *ll,TssStruct *mem_tss)
{
Ltf *ltf=ll->user_data;
I1 *src=SysTextSub(ltf->cur_entry->btype,"ST_LTF_CMDS");
I1 *st=MAllocZ(8,mem_tss);
nounusedwarn l;
if (ltf->cur_entry==ltf) {
StrCpy(st,"EOF");
} else if (src) StrCpy(st,src);
return st;
}
public BoolU4 DoLtf(Ltf *l,BoolU4 home=TRUE,I1 *help=NULL,BoolU4 help_is_file=FALSE)
{
Ltf *menu=NULL,*old_ltf=Fs->cur_ltf,*old_aux=Fs->aux_ltf,*aux;
I8 old_attribute=Fs->text_attribute;
I8 ch=0;
U8 sc=0;
LtfEntry *ll;
void * old_update=Fs->update_win;
BoolU4 old_preempt;
if (help && !l->menu_ltf) {
if (help_is_file)
menu=LtfRead(help);
else {
menu=LtfNew;
menu->text_attribute=l->text_attribute;
LtfPutSExt(menu,help);
}
l->menu_ltf=menu;
}
l->win_tss=Fs;
aux=LtfNew;
aux->text_attribute=Fs->border_attribute;
LtfPutSExt(aux,"$$CM +TY,0,-1$$");
if (Bt(&Fs->crt_flags,CRTf_HAS_CLOSE_WIN))
LtfPutSExt(aux,"$$TX+RX+BD,\"[X]\"$$");
if (l->menu_ltf)
LtfPutSExt(aux,"$$TX+LX+BD,\"MENU\"$$");
ll=LtfPutSExt(aux,"$$DA-T-P+BD+RD+CX+SCX+IV,256,\"%s...\",16$$");
ll->data=&l->filename.name;
LtfFormatData(ll);
if (l->flags & LTFF_ALLOW_UNDO) {
LtfPutSExt(aux,"$$CM+BY+LX,0,1$$");
ll=LtfPutSExt(aux,"$$DA+BD+RD-T,32,\"Undo:%04d\"$$\r\n");
ll->data=&l->undo_cnt;
LtfFormatData(ll);
}
LtfPutSExt(aux,"$$CM+BY+RX,-24,1$$");
ll=LtfPutSExt(aux,"$$TX+BD+DC,\" \"$$");
ll->user_data=l;
ll->display_cb=&EditDollarTypeCB;
LtfPutSExt(aux,"$$CM+BY+RX,-21,1$$");
ll=LtfPutSExt(aux,"$$TX+BD+DC,\" \"$$");
ll->user_data=l;
ll->display_cb=&EditOverStrikeCB;
LtfPutSExt(aux,"$$CM+BY+RX,-20,1$$"); //gets merged without this
ll=LtfPutSExt(aux,"$$TX+BD+DC,\" \"$$");
ll->user_data=l;
ll->display_cb=&EditDollarCB;
ll=LtfPutSExt(aux,"$$DA+BD+RD-T,32,\"Line:%04d \"$$");
ll->data=&l->line;
LtfFormatData(ll);
ll=LtfPutSExt(aux,"$$DA+BD+RD-T,32,\"Col:%04d\"$$\r\n");
ll->data=&l->col;
LtfFormatData(ll);
old_preempt=Preempt(OFF);
aux->recalc_start=aux;
LtfRecalc(aux);
Fs->aux_ltf=aux;
l->recalc_start=l;
LtfRecalc(l);
if (home)
LtfHome(l);
Fs->cur_ltf=l;
Fs->text_attribute=l->text_attribute;
AssignBit(&Fs->crt_flags,CRTf_HAS_MENU,l->menu_ltf);
Fs->update_win=&LtfUpdateBothLtf;
Bts(&Fs->crt_flags,CRTf_SHOW);
do {
Preempt(OFF);
if (ScanKey(&ch,&sc)) {
Preempt(old_preempt);
PutKey(ch,sc);
LtfRecalc(Fs->cur_ltf);
} else {
Fs->task_flags|=1<<TSSf_IDLE;
if (!Fs->rmt_chnl &&
!(Fs->parent_tss && Fs->parent_tss->popup_tss==Fs)) {
Fs->task_flags|=1<<TSSf_AWAITING_MSG;
SwapInNext;
Preempt(old_preempt);
} else {
Preempt(old_preempt);
WinSync;
}
Fs->task_flags&=~(1<<TSSf_IDLE);
}
} while (ch!=CH_ESC && ch!=CH_CTRLQ);
Preempt(OFF);
Fs->cur_ltf=old_ltf;
Fs->aux_ltf=old_aux;
AssignBit(&Fs->crt_flags,CRTf_HAS_MENU,old_ltf->menu_ltf);
Fs->text_attribute=old_attribute;
Fs->update_win=old_update;
LtfDel(aux);
if (menu) {
l->menu_ltf=NULL;
LtfDel(menu);
}
Preempt(old_preempt);
return ch==CH_ESC;
}
#help_index "Ltf/Input"
public BoolU4 DoForm(U1 *D,I1 *class_name,
I1 *help=NULL,BoolU4 help_is_file=FALSE,
I1 *header=NULL,I1 *footer=NULL)
//Supply a class name that has fmtstr definitions
//and this routine will allow user input.
{
BoolU4 result=FALSE,old_preempt;
MemberListStruct *ml;
LtfEntry *ll;
I8 ch=0;
ClassStruct *cl=FindLocalHash(class_name,HTT_CLASS);
Ltf *l;
if (!cl) return FALSE;
l=LtfNew;
if (header) LtfPutSExt(l,header);
l->flags|=LTFF_OVERSTRIKE | LTFF_FORM;
ml=cl->member_list;
while (ml) {
if (ml->fmtstr) {
ll=LtfPutSExt(l,ml->fmtstr);
ll->data=D+ml->offset;
ll->my_format_data=ml->fmtdata;
LtfFormatData(ll);
}
ml=ml->next;
}
if (footer) LtfPutSExt(l,footer);
if (l->dummy.next!=l) {
l->flags&=~(LTFF_ATTR_BY_PARTITION | LTFF_ATTR_BY_FILENAME);
LtfRecalc(l);
if (DoLtf(l,TRUE,help,help_is_file)) {
old_preempt=Preempt(OFF);
ll=l->dummy.next;
while (ll!=l) {
if (ll->btype==LTFT_DATA || ll->btype==LTFT_CHECK_BOX)
LtfGetData(ll);
ll=ll->next;
}
ll=l->cur_entry;
if (ll!=l)
LtfRunEntry(l,ll,TRUE,old_preempt);
Preempt(old_preempt);
result=TRUE;
}
}
LtfDel(l);
return result;
}
void EndDoMenuCb()
{
WinToTop;
throw(EXCEPT_LOCAL);
}
public I8 DoMenu(Ltf *m,I1 *help=NULL,U8 flags=0)
{
void *old_end_cb=Fs->end_task_cb;
LtfEntry *ll;
I8 result=-1;
BoolU4 old_preempt;
Fs->end_task_cb=&EndDoMenuCb;
try {
if (m) {
m->flags&=~(LTFF_ATTR_BY_PARTITION | LTFF_ATTR_BY_FILENAME);
if (DoLtf(m,TRUE,help)) {
old_preempt=Preempt(OFF);
ll=m->cur_entry;
if (ll!=m)
result=LtfRunEntry(m,ll,TRUE,old_preempt);
Preempt(old_preempt);
}
}
} catch {
if (Fs->except_argc==1 && Fs->except_argv[0]==EXCEPT_LOCAL) {
if (!(flags & LTFPUF_INTERCEPT_TASK_END))
Exit;
Fs->catch_except=TRUE;
Preempt(old_preempt);
}
}
Fs->end_task_cb=old_end_cb;
return result;
}
#help_index "Ltf"
public I8 PopUp(I1 *msg,TssStruct *parent=NULL,TssStruct **pu_tss=NULL)
{
U8 result=0;
BoolU4 old_preempt=Preempt(OFF);
TssCmdStruct *tempc;
TssStruct *tss;
tss=Spawn(&ServantUserCmdLine,"SYSTEM TASK",parent);
if (!parent) {
QueueTaskRequest(tss,parent,msg,(1<<TSSCf_EXIT_ON_COMPLETE));
if (pu_tss) *pu_tss=tss;
Preempt(old_preempt);
return 0;
} else {
Fs->popup_tss=tss;
tempc=QueueTaskRequest(tss,parent,msg,
1<<TSSCf_WAKE_MASTER | 1<<TSSCf_FOCUS_MASTER);
GetRequestResult(tempc,&result);
Fs->popup_tss=NULL;
Kill(tss);
if (pu_tss) *pu_tss=NULL;
Preempt(old_preempt);
return result;
}
}
#help_index "Ltf/Output"
public TssStruct *PopUpViewLtf(Ltf *l,I1 *help=NULL)
{
I1 *buf=MSPrintF("Preempt(ON);DoLtf(0x%X,TRUE,0x%X);",l,help);
TssStruct *tss=Spawn(&ServantUserCmdLine,"View",Fs);
QueueTaskRequest(tss,NULL,buf,1<<TSSCf_EXIT_ON_COMPLETE);
Free(buf);
return tss;
}
void PopUpViewStrEndTsk()
{
LtfDel(Fs->user_data0);
Exit;
}
public TssStruct *PopUpViewStr(I1 *msg)
{
TssStruct *tss;
Ltf *l=LtfNew;
LtfPrintF(l,msg);
tss=PopUpViewLtf(l);
tss->user_data0=l;
tss->end_task_cb=&PopUpViewStrEndTsk;
return tss;
}
#help_index "Ltf/Input"
public I8 PopUpMenu(Ltf *l,I1 *help=NULL,U8 flags=0)
{
l->flags|=LTFF_MIN_SIZE | LTFF_FORM;
return ServantUser("DoMenu(0x%X,0x%X,0x%X);",l,help,flags);
}
void LTDirEntryToFileLtf(Ltf *l,LTDirEntry *tempm)
{
LtfEntry *ll;
while (tempm) {
if (tempm->attr & LT_ATTR_DIR) {
ll=LtfPrintF(l,"$$TR,\"%s\"$$",tempm->name);
ll->user_data=tempm;
LtfPutSExt(l,"\r\n$$ID,+2$$");
if (tempm->sub)
LTDirEntryToFileLtf(l,tempm->sub);
LtfPutSExt(l,"$$ID,-2$$");
} else
LtfPrintF(l,"$$MU,\"%s\",0x%08X$$\r\n",
tempm->name,tempm);
tempm=tempm->next;
}
}
public I1 *PopUpPickFile(I1 *mask="/*",I1 *flags=NULL)
{
I1 *result=NULL;
LTDirEntry *tempm,*tempm1;
U8 f=0;
Ltf *l=LtfNew;
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),"+r");
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),flags);
tempm=FindFiles(mask,f);
LtfPutSExt(l,"$$TR-C+AL,\"\"$$\r\n");
LtfPutSExt(l,"$$ID,+2$$");
LTDirEntryToFileLtf(l,tempm);
LtfPutSExt(l,"$$ID,-2$$");
tempm1=PopUpMenu(l);
if (tempm1<MAX_I4)
result=NewStr(tempm1->full_name);
else
result=NewStr("");
LtfDel(l);
DelLTDirList(tempm);
return result;
}
#help_index "Ltf/Output"
public void LTDirEntryToDirLtf(Ltf *l,LTDirEntry *tempm)
{
while (tempm) {
LtfPrintF(l,"$$TR,\"\"$$");
LtfPrintF(l,"$$MU,\"%s\",0x%08X$$\r\n",
tempm->name,tempm);
LtfPutSExt(l,"$$ID,+2$$");
if (tempm->sub)
LTDirEntryToDirLtf(l,tempm->sub);
LtfPutSExt(l,"$$ID,-2$$");
tempm=tempm->next;
}
}
#help_index "Ltf/Input"
public I1 *PopUpPickDir(I1 *mask="/*",I1 *flags=NULL)
{ //+r=recurse +D=just dirs
I1 *result=NULL;
LTDirEntry *tempm,*tempm1;
U8 f=0;
Ltf *l=LtfNew;
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),"+r+D");
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),flags);
tempm=FindFiles(mask,f);
LtfPutSExt(l,"$$TR-C+AL,\"\"$$\r\n");
LtfPutSExt(l,"$$ID,+2$$");
LTDirEntryToDirLtf(l,tempm);
LtfPutSExt(l,"$$ID,-2$$");
tempm1=PopUpMenu(l);
if (tempm1<MAX_I4)
result=NewStr(tempm1->full_name);
else
result=NewStr("");
LtfDel(l);
DelLTDirList(tempm);
return result;
}
#help_index "Ltf"
public BoolU4 PopUpCd()
{
I1 *st=PopUpPickDir;
BoolU4 result=Cd(st);
Free(st);
return result;
}
#help_index "Ltf/Input"
public I1 *PopUpPickListEntry(I1 *lst)
{
I8 i=0;
Ltf *l=LtfNew;
while (*lst) {
if (*lst=='@') { /* Check for '@' alias list entry*/
i--;
lst++;
}
LtfPrintF(l,"$$MU,\"%s\",0x%08X$$\r\n",
lst,i++);
lst+=StrLen(lst)+1;
}
LtfPrintF(l,"$$MU,\"CANCEL\",-1$$\r\n");
i=PopUpMenu(l);
LtfDel(l);
return i;
}
public I1 *PopUpPickSysTextSub(I1 *st)
{
return PopUpPickListEntry(SysText(st));
}
public BoolU4 PopUpDoForm(U1 *d,I1 *class_name,
I1 *help=NULL,BoolU4 help_is_file=FALSE)
{ //TODO: add header/footer
BoolU4 result;
result=ServantUser("DoForm(0x%X,\"%s\",0x%X,%d);",d,class_name,help,help_is_file);
return result;
}
public I8 PopUpOk(I1 *header=NULL,I1 *footer=NULL)
{
I8 i;
Ltf *l=LtfNew;
if (header) LtfPutSExt(l,header);
LtfPutSExt(l,"$$CM +CX,0,4$$$$BT, \"OKAY\" 1$$");
if (footer) LtfPutSExt(l,footer);
i=PopUpMenu(l);
LtfDel(l);
return i;
}
public I8 PopUpNoYes(I1 *header=NULL,I1 *footer=NULL)
{
I8 i;
Ltf *l=LtfNew;
if (header) LtfPutSExt(l,header);
LtfPutSExt(l,"$$CM +LX, 2,4$$$$BT, \"YES\",1$$");
LtfPutSExt(l,"$$CM +LX, 18,0$$$$BT, \"NO\",0$$");
if (footer) LtfPutSExt(l,footer);
i=PopUpMenu(l);
LtfDel(l);
return i;
}
public I8 PopUpCancelOk(I1 *header=NULL,I1 *footer=NULL)
{
I8 i;
Ltf *l=LtfNew;
if (header) LtfPutSExt(l,header);
LtfPutSExt(l,"$$CM +LX, 2,4$$$$BT, \"OK\",1$$");
LtfPutSExt(l,"$$CM +LX, 18,0$$$$BT, \"CANCEL\",0$$");
if (footer) LtfPutSExt(l,footer);
i=PopUpMenu(l);
LtfDel(l);
return i;
}
public I8 PopUpReplaceSkipAllCancel(I1 *header=NULL,I1 *footer=NULL)
{
I8 i;
Ltf *l=LtfNew;
if (header) LtfPutSExt(l,header);
LtfPutSExt(l,"$$CM +LX,2,4$$$$BT, \"REPLACE\",0$$");
LtfPutSExt(l,"$$CM +LX, 18,0$$$$BT, \"SKIP\",1$$");
LtfPutSExt(l,"$$CM +LX, 2,3$$$$BT, \"ALL\",2$$");
LtfPutSExt(l,"$$CM +LX, 18,0$$$$BT, \"CANCEL\",3$$");
if (footer) LtfPutSExt(l,footer);
i=PopUpMenu(l);
LtfDel(l);
return i;
}
#help_index "Ltf/Input;Input Pointer"
public I8 PopUpInputPointer()
{
I8 i;
Ltf *l=LtfNew;
LtfPutSExt(l,"$$CM+LX,2,4$$$$BT,\"Mouse\",IP_MOUSE$$");
LtfPutSExt(l,"$$CM+LX,18,0$$$$BT,\"JoyStick\",IP_JOYSTICK0$$");
i=PopUpMenu(l);
switch (i) {
case IP_MOUSE:
ip_pointer_type=i;
break;
case IP_JOYSTICK0:
ip_pointer_type=i;
LoadJoystickCalibration;
break;
}
LtfDel(l);
return i;
}
#help_index "Ltf"
File diff suppressed because it is too large. Load diff