772 lines
22 KiB
C++
772 lines
22 KiB
C++
|
||
/* ------------------------------------------------------------
|
||
* Filename ............... EditVTpl.Cpp
|
||
*
|
||
* General Purpose ........ Edit validate templates
|
||
* ------------------------------------------------------------
|
||
* First date ............. 6 november 1993
|
||
*
|
||
* First in version ....... 2.00
|
||
*
|
||
* Written by ............. Alain Schellinck
|
||
* ------------------------------------------------------------
|
||
* Revisions:
|
||
* ----------
|
||
*
|
||
* Date | By | Purpose |
|
||
* ---------+----+--------------------------------------------+
|
||
* | | |
|
||
* | | |
|
||
* | | |
|
||
*/
|
||
|
||
/*-------------------------------------------------------------------------*/
|
||
|
||
#include <string.h>
|
||
|
||
#define Uses_MultiRecIO
|
||
#include "ThProCfg.Hpp"
|
||
#include "Template.Hpp"
|
||
|
||
/*-------------------------------------------------------------------------*/
|
||
|
||
TemplateIOP tpl = NULL;
|
||
ChrT tplFind[80];
|
||
|
||
/*--] Code [-------------------------------------] search functions [------*/
|
||
|
||
/*
|
||
* Routine : searchTemplate()
|
||
* Purpose : search the whole template database for a selected template
|
||
* ------------------------------------------------------------------------
|
||
* Parameters: record number to start on (-1 for 1st search)
|
||
* Return : record number or -1 if not found
|
||
*
|
||
*/
|
||
|
||
LCL ShrtT searchTemplate(ShrtT startRec)
|
||
{
|
||
ShrtT max_rec = tpl->count();
|
||
if(max_rec < 2)
|
||
return(-1);
|
||
|
||
Window w;
|
||
|
||
if(startRec == -1)
|
||
{
|
||
w.open( 10,
|
||
7,
|
||
62,
|
||
9,
|
||
0x3F,
|
||
SHADOW,
|
||
CHISEL_BORDER,
|
||
0x3B,
|
||
NULL,
|
||
0x31 );
|
||
|
||
CLEAR_OBJECT(tplFind);
|
||
|
||
w << " Search for: ";
|
||
|
||
w.attrib( 0x3E );
|
||
|
||
tsw_cursoron();
|
||
if(w.scan(tplFind, 60, 35, SCAN_UPPER) == SF_ESC)
|
||
return(-1);
|
||
|
||
w.close();
|
||
}
|
||
|
||
tsw_cursoroff();
|
||
|
||
if(strlen(tplFind) == 0)
|
||
return(-1);
|
||
|
||
|
||
if(startRec + 1 >= max_rec)
|
||
return(-1);
|
||
|
||
w.open( 11,
|
||
10,
|
||
70,
|
||
12,
|
||
0x3F,
|
||
BRACKETS,
|
||
CHISEL_BORDER,
|
||
0x3B,
|
||
NULL,
|
||
0x31 );
|
||
|
||
w.title( "Searching (Press <Esc> to cancel)", 0x3E );
|
||
|
||
ShrtT found = -1;
|
||
w.gauge( 2, 1, setFBColor(hWhite, nBlack), 54, 0, max_rec - 1, TRUE);
|
||
for(ShrtT cnt = startRec + 1; cnt < max_rec && found == -1; cnt++)
|
||
{
|
||
w.gauge( 2, 1, setFBColor(hWhite, nBlack), 54, cnt, max_rec - 1, FALSE);
|
||
|
||
if(KB.hit() && KB.get() == KEY_ESC)
|
||
break;
|
||
|
||
tpl->read(cnt);
|
||
|
||
String desc(tpl->desc);
|
||
if(desc.fuzzySearch(tplFind, cfg.fuzzyRate) >= cfg.fuzzyRate)
|
||
found = cnt;
|
||
}
|
||
|
||
return(found);
|
||
}
|
||
|
||
/*--] Code [-------------------------------------] pick functions [--------*/
|
||
|
||
/*
|
||
* Routine : listTemplate()
|
||
* Purpose : list the specified template
|
||
* ------------------------------------------------------------------------
|
||
* Parameters: template number, X and Y coordinates
|
||
* Return : None
|
||
*
|
||
*/
|
||
|
||
LCL void listTemplate(IntT recno, IntT x, IntT y)
|
||
{
|
||
String txt = form(" <20> %5d <20> ............................................................", recno + 1);
|
||
|
||
if(tpl->read(recno) == TRUE)
|
||
if(tpl->inUse() == TRUE)
|
||
txt = form(" %c <20> %5d <20> %s", (tpl->deleted ? '<EFBFBD>' : ' '), recno + 1, tpl->desc);
|
||
|
||
if(txt.len() > 72)
|
||
txt.del(72, 0);
|
||
|
||
tsw_maputs(x , y, 0x3F, txt);
|
||
}
|
||
|
||
/*
|
||
* Routine : pickTemplate
|
||
* Purpose : Let the user pick another template
|
||
* ------------------------------------------------------------------------
|
||
* Parameters: current record number
|
||
* Return : selected record number or -1 to cancel
|
||
*
|
||
*/
|
||
|
||
ShrtT pickTemplate(ShrtT curRecNo)
|
||
{
|
||
ShrtT ret_val = -1;
|
||
|
||
LCL ChrP pickHelp[] =
|
||
{
|
||
" 5EPage Up: 5BGo to previous page",
|
||
" 5EPage Down: 5BGo to next page",
|
||
" 5EHome: 5BGo to first record",
|
||
" 5EEnd: 5BGo to last record",
|
||
" 5EEscape: 5BEnd",
|
||
"50<35><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
|
||
" 5E1..9: 5BStart typing record number to go to",
|
||
" 5EA..Z: 5BStart typing record number to search",
|
||
" 5EALT-G: 5BGo to another record",
|
||
" 5EALT-S: 5BSearch record by description",
|
||
" 5EALT-N: 5BSearch next record",
|
||
NULL
|
||
};
|
||
|
||
KEY hotkeys[]=
|
||
{
|
||
'1','2','3','4','5','6','7','8','9', // GOTO
|
||
'A','B','C','D','E','F','G','H','I', // SEARCH
|
||
'J','K','L','M','N','O','P','Q','R',
|
||
'S','T','U','V','W','X','Y','Z',
|
||
KEY_ALTG, // GOTO
|
||
KEY_ALTN, // SEARCH NEXT
|
||
KEY_ALTS, // SEARCH
|
||
KEY_F1 , // SHOW HELP
|
||
NULL
|
||
};
|
||
|
||
ShrtT maxRec = tpl->count();
|
||
|
||
SelectWindow sw;
|
||
|
||
sw.open( 2,
|
||
3,
|
||
78,
|
||
tsw_vsize - 2,
|
||
0x3F,
|
||
SHADOW | BRACKETS,
|
||
CHISEL_BORDER,
|
||
0x3B,
|
||
NULL,
|
||
0x31 );
|
||
|
||
sw.title( "Select Template", 0x3E );
|
||
|
||
sw.define( maxRec,
|
||
0x1E,
|
||
listTemplate,
|
||
0,
|
||
NULL,
|
||
hotkeys );
|
||
|
||
sw.direct( 4,0 ,0x3B, '<EFBFBD>'); sw.direct(12,0 ,0x3B, '<EFBFBD>');
|
||
sw.direct( 4,tsw_vsize - 5, 0x31, '<EFBFBD>'); sw.direct(12,tsw_vsize - 5,0x31, '<EFBFBD>');
|
||
|
||
sw.show(curRecNo);
|
||
|
||
FlgT pickLoop = TRUE;
|
||
while(pickLoop)
|
||
{
|
||
tsw_showfooter("Press [\001F1\001] to see the help screen", BAR_NORM, BAR_HIGH);
|
||
|
||
tsw_cursoroff();
|
||
ShrtT choice = sw.process();
|
||
tsw_cursoron ();
|
||
|
||
switch(choice)
|
||
{
|
||
case SL_ESC:
|
||
{
|
||
pickLoop = FALSE;
|
||
}
|
||
break;
|
||
|
||
case SL_HOTKEY:
|
||
{
|
||
switch(sw.hotkey)
|
||
{
|
||
case KEY_F1 :
|
||
{
|
||
showHelp( pickHelp, "Pick Template Help" );
|
||
}
|
||
break;
|
||
|
||
case '1': case '2': case '3':
|
||
case '4': case '5': case '6':
|
||
case '7': case '8': case '9':
|
||
{
|
||
KB.push((KEY)(char)sw.hotkey);
|
||
} // NO BREAK!!!
|
||
|
||
case KEY_ALTG :
|
||
{
|
||
IntT tplNo = 1;
|
||
|
||
Window w(10, 5, 36, 7, setFBColor(hWhite, nCyan));
|
||
w.open();
|
||
w << " Goto template: ";
|
||
|
||
tsw_cursoron();
|
||
w.attrib(setFBColor(hYellow, nCyan));
|
||
|
||
if(w.scan(tplNo, 5, 6) == SF_ESC)
|
||
tplNo = -1;
|
||
|
||
tsw_cursoroff();
|
||
|
||
if((tplNo <= maxTemplates) && (tplNo >= 1) )
|
||
{
|
||
pickLoop = FALSE;
|
||
ret_val = tplNo - 1;
|
||
sw.show(ret_val);
|
||
}
|
||
}
|
||
break;
|
||
|
||
case KEY_ALTN:
|
||
{
|
||
ShrtT tplNo = searchTemplate(sw.current);
|
||
if(tplNo != -1)
|
||
{
|
||
sw.show(tplNo);
|
||
}
|
||
else
|
||
tsw_beep();
|
||
}
|
||
break;
|
||
|
||
case 'A': case 'B': case 'C': case 'D':
|
||
case 'E': case 'F': case 'G': case 'H':
|
||
case 'I': case 'J': case 'K': case 'L':
|
||
case 'M': case 'N': case 'O': case 'P':
|
||
case 'Q': case 'R': case 'S': case 'T':
|
||
case 'U': case 'V': case 'W': case 'X':
|
||
case 'Y': case 'Z':
|
||
{
|
||
KB.push((KEY)(char)sw.hotkey);
|
||
}
|
||
|
||
case KEY_ALTS:
|
||
{
|
||
ShrtT tplNo = searchTemplate(-1);
|
||
if(tplNo != -1)
|
||
{
|
||
sw.show(tplNo);
|
||
}
|
||
else
|
||
tsw_beep();
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
|
||
default:
|
||
{
|
||
ret_val = choice;
|
||
pickLoop = FALSE;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
return(ret_val);
|
||
}
|
||
|
||
/*--] Code [-------------------------------------] Edit functions [--------*/
|
||
|
||
/*
|
||
* Routine : helpFunction()
|
||
* Purpose : show the online help for each field
|
||
* ------------------------------------------------------------------------
|
||
* Parameters: field number
|
||
* Return : None
|
||
*
|
||
*/
|
||
|
||
LCL void helpFunction(IntT helpNo)
|
||
{
|
||
ChrP txt[]=
|
||
{
|
||
"Description for this template.",
|
||
"The security level the user will get when validated with this template.",
|
||
"How many days he/she will get the new security level.",
|
||
"The expiration level for this template.",
|
||
"Deposit an amount of time in the user's time bank account.",
|
||
"Deposit an amount of kbytes in the user's time bank account.",
|
||
"The netmail credit a user can use.",
|
||
|
||
"Name of the file containing the validation text (for TheUser).",
|
||
|
||
"Flags to turn on when validating a user.",
|
||
"Flags to turn off when validating a user.",
|
||
"Flags to turn on when a user's level is expired.",
|
||
"Flags to turn off when a user's level is expired.",
|
||
"Comment to place in a user's record.",
|
||
"The new log level for the user after validation.",
|
||
"",
|
||
"",
|
||
"",
|
||
"",
|
||
"",
|
||
"Template marked for deletion?",
|
||
};
|
||
|
||
if(strlen(txt[helpNo]) != 0)
|
||
tsw_showfooter(txt[helpNo], BAR_COLOR);
|
||
else
|
||
tsw_showfooter("Press [\001F1\001] to see the help screen", BAR_NORM, BAR_HIGH);
|
||
}
|
||
|
||
/*
|
||
* Routine : editTemplate()
|
||
* Purpose : edit a selected template
|
||
* ------------------------------------------------------------------------
|
||
* Parameters: system path
|
||
* Return : None
|
||
*
|
||
*/
|
||
|
||
void editTemplate(ChrP sysPath)
|
||
{
|
||
LCL ChrP editHelp[] =
|
||
{
|
||
" 5EPage Up: 5BGo to previous record",
|
||
" 5EPage Down: 5BGo to next record",
|
||
" 5ECTRL-Page Up: 5BGo to first record",
|
||
" 5ECTRL-Page Down: 5BGo to last record",
|
||
" 5EEscape: 5BEnd",
|
||
"50<35><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
|
||
" 5EALT-A: 5BAdd a record",
|
||
" 5EALT-D: 5BDelete / Undelete the current template",
|
||
" 5EALT-F: 5BShow flag description",
|
||
" 5EALT-L: 5BList all records",
|
||
" 5EALT-S: 5BSearch record by description",
|
||
" 5EALT-N: 5BSearch next record",
|
||
NULL
|
||
};
|
||
|
||
CLEAR_OBJECT(tplFind);
|
||
|
||
LCL ChrP LogLevels[] =
|
||
{
|
||
"Friend" , "Normal" , "Suspicious" , "Extensive" , "Ignore",
|
||
NULL
|
||
};
|
||
|
||
LCL ChrP YesNo[] =
|
||
{
|
||
"No", "Yes",
|
||
NULL
|
||
};
|
||
|
||
LCL ChrP YesNoIgnore[] =
|
||
{
|
||
"No", "Yes", "Ignore",
|
||
NULL
|
||
};
|
||
|
||
tpl = new TemplateIO(sysPath);
|
||
if(tpl->open(fmode_rw|fmode_copen)== FALSE)
|
||
{
|
||
tsw_beep();
|
||
return;
|
||
}
|
||
|
||
Field frm[]=
|
||
{
|
||
/* TYPE dataPtr choices hookFunc flags len width x y */
|
||
/* -------------------------------------------------------------------------------------------------- */
|
||
{ FRM_STRING , tpl->desc ,0 ,0 ,0 ,60 ,53 ,19 ,2 }, // description
|
||
{ FRM_UNSIGNED ,&tpl->secLevel ,0 ,0 ,0 ,5 ,6 ,19 ,3 }, // securiy level
|
||
{ FRM_UNSIGNED ,&tpl->subscribe ,0 ,0 ,0 ,5 ,6 ,19 ,5 }, // subscribe
|
||
{ FRM_UNSIGNED ,&tpl->expLevel ,0 ,0 ,0 ,5 ,6 ,19 ,6 }, // expiration level
|
||
{ FRM_UNSIGNED ,&tpl->tbTime ,0 ,0 ,0 ,5 ,6 ,19 ,8 }, // timebank time
|
||
{ FRM_UNSIGNED ,&tpl->tbKbyte ,0 ,0 ,0 ,5 ,6 ,19 ,9 }, // timebank kbyte
|
||
{ FRM_UNSIGNED ,&tpl->netCredit ,0 ,0 ,0 ,5 ,6 ,19 ,10 }, // netmail credit
|
||
{ FRM_STRING , tpl->valMsg ,0 ,0 ,0 ,8 ,9 ,19 ,11 }, // validate message
|
||
{ FRM_FUNCTION ,&tpl->valFlagsOn ,0 ,flag_select ,0 ,26 ,26 ,19 ,13 }, // flags on
|
||
{ FRM_FUNCTION ,&tpl->valFlagsOff,0 ,flag_select ,0 ,26 ,26 ,19 ,14 }, // flags off
|
||
{ FRM_FUNCTION ,&tpl->expFlagsOn ,0 ,flag_select ,0 ,26 ,26 ,19 ,15 }, // flags on
|
||
{ FRM_FUNCTION ,&tpl->expFlagsOff,0 ,flag_select ,0 ,26 ,26 ,19 ,16 }, // flags off
|
||
{ FRM_STRING , tpl->comment ,0 ,0 ,0 ,80 ,53 ,19 ,18 }, // comment
|
||
{ FRM_CHOICE ,&tpl->logLevel ,LogLevels ,0 ,0 ,10 ,10 ,57 ,3 }, // loglevels
|
||
{ FRM_CHOICE ,&tpl->hidden ,YesNoIgnore,0 ,0 ,6 ,6 ,57 ,5 }, // hidden
|
||
{ FRM_CHOICE ,&tpl->noTops ,YesNoIgnore,0 ,0 ,6 ,6 ,57 ,6 }, // in tops
|
||
{ FRM_CHOICE ,&tpl->atten ,YesNoIgnore,0 ,0 ,6 ,6 ,57 ,7 }, // attention
|
||
{ FRM_CHOICE ,&tpl->noKill ,YesNoIgnore,0 ,0 ,6 ,6 ,57 ,8 }, // no kill
|
||
{ FRM_CHOICE ,&tpl->ignDld ,YesNoIgnore,0 ,0 ,6 ,6 ,57 ,9 }, // ignore dl
|
||
{ FRM_CHOICE ,&tpl->deleted ,YesNo ,0 ,0 ,6 ,6 ,57 ,11 }, // template deleted?
|
||
};
|
||
|
||
FormWindow w( 2,
|
||
3,
|
||
77,
|
||
23,
|
||
0x1F,
|
||
SHADOW | BRACKETS,
|
||
CHISEL_BORDER,
|
||
0x19,
|
||
NULL,
|
||
0x10 );
|
||
w.open();
|
||
|
||
w.attrib( 0x1F );
|
||
w << "\n"
|
||
" Description:\n"
|
||
" Security level: Loglevel:\n"
|
||
"\n"
|
||
" Subscribe: Hidden:\n"
|
||
" Expir. level: NoTops:\n"
|
||
" Attention:\n"
|
||
" Time bank time: NoKill:\n"
|
||
" Time bank KB: IgnoreDL:\n"
|
||
" Netmail credit:\n"
|
||
" Validate Msg: Deleted:\n"
|
||
"\n"
|
||
" Val. Flags ON:\n"
|
||
" Val. Flags OFF:\n"
|
||
" Exp. Flags ON:\n"
|
||
" Exp. Flags OFF:\n"
|
||
"\n"
|
||
" Comment:";
|
||
|
||
|
||
KEY hotkeys[]=
|
||
{
|
||
KEY_PGUP , // next
|
||
KEY_PGDN , // previous
|
||
KEY_CPGUP, // first
|
||
KEY_CPGDN, // last
|
||
KEY_ALTA , // add
|
||
KEY_ALTD , // delete / undelete
|
||
KEY_ALTF , // show flags-info
|
||
KEY_ALTL , // list
|
||
KEY_ALTN , // search next
|
||
KEY_ALTS , // search
|
||
KEY_F1 , // help
|
||
NULL
|
||
};
|
||
|
||
w.define( frm,
|
||
20,
|
||
0x1B,
|
||
0x4E,
|
||
hotkeys, helpFunction);
|
||
|
||
ShrtT maxRec = tpl->count();
|
||
if(maxRec == 0)
|
||
{
|
||
tpl->clear();
|
||
tpl->write(0);
|
||
maxRec++;
|
||
}
|
||
|
||
ShrtT curRecNo = 0;
|
||
ShrtT nextRecNo = curRecNo;
|
||
FlgT readRequired = TRUE;
|
||
|
||
tpl->clear();
|
||
|
||
tsw_cursoron();
|
||
|
||
WrdT crcVal;
|
||
|
||
FlgT editLoop = TRUE;
|
||
while(editLoop)
|
||
{
|
||
FlgT forcedSave = FALSE;
|
||
|
||
if(curRecNo != nextRecNo)
|
||
{
|
||
curRecNo = nextRecNo;
|
||
readRequired = TRUE;
|
||
}
|
||
|
||
if(readRequired == TRUE)
|
||
{
|
||
readRequired = FALSE;
|
||
tpl->read(curRecNo);
|
||
crcVal = crc(tpl, sizeof(template_data));
|
||
}
|
||
|
||
w.title( form( "Record %d/%d", curRecNo + 1, maxRec), 0x1E );
|
||
|
||
IntT ret_code = w.process();
|
||
|
||
switch(ret_code)
|
||
{
|
||
case ED_HOT:
|
||
{
|
||
switch(w.scanHotKey)
|
||
{
|
||
case KEY_F1 :
|
||
{
|
||
showHelp( editHelp, "Edit Template Help" );
|
||
continue;
|
||
}
|
||
|
||
case KEY_ALTD :
|
||
{
|
||
if(tpl->inUse())
|
||
tpl->deleted = (tpl->deleted ? FALSE : TRUE);
|
||
|
||
forcedSave = TRUE;
|
||
}
|
||
break;
|
||
|
||
case KEY_ALTF :
|
||
{
|
||
tsw_cursoroff();
|
||
show_flags();
|
||
tsw_cursoron();
|
||
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
|
||
FlgT isChanged = FALSE;
|
||
if(tpl->inUse())
|
||
{
|
||
if(crcVal != crc(tpl, sizeof(template_data)))
|
||
{
|
||
ShrtT stat;
|
||
isChanged = TRUE;
|
||
|
||
if(forcedSave == FALSE)
|
||
stat = ask_save();
|
||
else
|
||
stat = 1;
|
||
|
||
if(stat == 0)
|
||
{
|
||
tpl->write(curRecNo);
|
||
readRequired = TRUE;
|
||
}
|
||
}
|
||
}
|
||
|
||
switch(ret_code)
|
||
{
|
||
case ED_HOT :
|
||
{
|
||
switch(w.scanHotKey)
|
||
{
|
||
case KEY_PGDN :
|
||
{
|
||
if(curRecNo + 1 < maxRec)
|
||
nextRecNo = curRecNo + 1;
|
||
}
|
||
break;
|
||
|
||
case KEY_PGUP :
|
||
{
|
||
if(curRecNo > 0)
|
||
nextRecNo = curRecNo - 1;
|
||
}
|
||
break;
|
||
|
||
case KEY_CPGUP :
|
||
{
|
||
if(curRecNo != 0)
|
||
nextRecNo = 0;
|
||
}
|
||
break;
|
||
|
||
case KEY_CPGDN :
|
||
{
|
||
if(curRecNo + 1 < maxRec)
|
||
nextRecNo = maxRec - 1;
|
||
}
|
||
break;
|
||
|
||
case KEY_ALTA :
|
||
{
|
||
IntT tplNo = tpl->count() + 1;
|
||
|
||
Window w( 10,
|
||
5,
|
||
36,
|
||
7,
|
||
0x3F,
|
||
SHADOW,
|
||
CHISEL_BORDER,
|
||
0x3B,
|
||
NULL,
|
||
0x31 );
|
||
w.open();
|
||
w << " New template: ";
|
||
|
||
tsw_cursoron();
|
||
|
||
w.attrib( 0x3E );
|
||
|
||
if(w.scan(tplNo, 5, 6) == SF_ESC)
|
||
tplNo = -1;
|
||
|
||
tsw_cursoroff();
|
||
|
||
if((tplNo <= maxTemplates) && (tplNo > 1) )
|
||
{
|
||
if(tplNo > maxRec)
|
||
{
|
||
tpl->clear();
|
||
for(ShrtT cnt = maxRec; cnt < tplNo; cnt++)
|
||
tpl->write(cnt);
|
||
}
|
||
|
||
nextRecNo = tplNo - 1;
|
||
}
|
||
|
||
maxRec = tpl->count();
|
||
}
|
||
break;
|
||
|
||
case KEY_ALTL :
|
||
{
|
||
nextRecNo = pickTemplate(curRecNo);
|
||
if(nextRecNo == -1)
|
||
{
|
||
nextRecNo = curRecNo;
|
||
readRequired = TRUE;
|
||
}
|
||
|
||
if(nextRecNo > maxRec - 1)
|
||
{
|
||
tpl->clear();
|
||
for(ShrtT cnt = maxRec; cnt <= nextRecNo; cnt++)
|
||
tpl->write(cnt);
|
||
}
|
||
|
||
maxRec = tpl->count();
|
||
}
|
||
break;
|
||
|
||
case KEY_ALTN :
|
||
{
|
||
nextRecNo = searchTemplate(curRecNo);
|
||
if(nextRecNo == -1)
|
||
{
|
||
tsw_beep();
|
||
nextRecNo = curRecNo;
|
||
readRequired = TRUE;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case KEY_ALTS:
|
||
{
|
||
nextRecNo = searchTemplate(-1);
|
||
if(nextRecNo == -1)
|
||
{
|
||
tsw_beep();
|
||
nextRecNo = curRecNo;
|
||
readRequired = TRUE;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case ED_ESC :
|
||
{
|
||
if((isChanged == FALSE) || (askYesNo("Exit template editor?") == TRUE))
|
||
editLoop = FALSE;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
maxRec = tpl->count();
|
||
|
||
FlgT found = FALSE; // search deleted records
|
||
for(ShrtT cnt = 0; cnt < maxRec && found == FALSE; cnt++)
|
||
if(tpl->read(cnt) == TRUE)
|
||
if(tpl->deleted == TRUE)
|
||
found = TRUE;
|
||
|
||
if(found == TRUE) // clear deleted records
|
||
if(askYesNo("Clear deleted records?") == TRUE)
|
||
for(ShrtT cnt = 0; cnt < maxRec; cnt++)
|
||
if(tpl->read(cnt) == TRUE)
|
||
if(tpl->deleted == TRUE)
|
||
{
|
||
tpl->clear();
|
||
tpl->write(cnt);
|
||
}
|
||
|
||
|
||
ShrtT lastUsed = -1; // search last used record
|
||
for(cnt = maxRec - 1; cnt >= 0 && lastUsed == -1; cnt--)
|
||
if(tpl->read(cnt) == TRUE)
|
||
if(tpl->inUse() == TRUE)
|
||
lastUsed = cnt;
|
||
|
||
if(lastUsed + 1 != maxRec)
|
||
{
|
||
tpl->pos(lastUsed + 1); // cut all other records
|
||
tpl->cut();
|
||
}
|
||
|
||
delete(tpl);
|
||
tsw_cursoroff();
|
||
}
|
||
|
||
/*---------------------------] END OF THE CODE [---------------------------*/
|