proboard/procfg/EDITGRP.CPP

429 lines
8.4 KiB
C++

#include <stdio.h>
#include <string.h>
#include <tswin.hpp>
#include "procfg.hpp"
const int MAX_GROUPS = 255;
struct AreaGroup : _AreaGroup
{
static File f;
static int file_count;
static String fName;
public:
AreaGroup();
~AreaGroup();
static void setFname(char *n)
{
fName = n;
}
bool read(int);
bool write(int);
bool clear(int);
int numGroups();
void truncate();
};
int AreaGroup::file_count = 0;
File AreaGroup::f;
String AreaGroup::fName;
AreaGroup::AreaGroup()
{
if(file_count <= 0)
{
f.open(FileName(syspath,fName),fmode_rw | fmode_copen);
file_count = 0;
}
file_count++;
}
AreaGroup::~AreaGroup()
{
if(file_count <= 1)
{
f.close();
file_count = 1;
}
file_count--;
}
bool AreaGroup::read(int rec)
{
f.seek(long(rec-1) * sizeof(_AreaGroup));
return (f.read(this,sizeof(*this)) == sizeof(*this)) ? TRUE : FALSE;
}
bool AreaGroup::write(int rec)
{
f.seek(long(rec-1) * sizeof(_AreaGroup));
return (f.write(this,sizeof(*this)) == sizeof(*this)) ? TRUE : FALSE;
}
bool AreaGroup::clear(int rec)
{
CLEAR_OBJECT(*this);
return write(rec);
}
int AreaGroup::numGroups()
{
return f.len() / sizeof(_AreaGroup);
}
void AreaGroup::truncate()
{
AreaGroup fa;
int i = numGroups();
for(;i>0;i--)
{
if(!fa.read(i)) continue;
if(fa.name[0])
{
f.seek(long(i) * sizeof(_AreaGroup));
f.cut();
break;
}
}
if(!i)
{
f.seek(0);
f.cut();
}
}
static
void farea_list_func(int i,int x,int y)
{
AreaGroup fa;
char *ptr;
if(!fa.read(i+1) || !fa.name[0])
{
ptr = form("%5d úúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúú",i+1);
}
else
{
ptr = form("%5d %s",i+1,fa.name);
}
if(strlen(ptr)>43)
{
ptr[43]=0;
}
tsw_maputs( x, y, 0x3F, ptr );
tsw_maputc( x + 6, y, 0x3F, '³' );
}
static
void helpfunction(int i)
{
char *txt[] = {
"Name/description of this group",
"Level needed to access this group",
"Flags needed to access this group"
};
tsw_showfooter(txt[i], BAR_COLOR);
}
void edit_groups( bool filegroups )
{
Field frm[] =
{
{ FRM_STRING , 0 , 0,0 , 0 , 79 , 45, 17,2 },
{ FRM_UNSIGNED, 0 , 0,0 , 0 , 5 , 6 , 17,4 },
{ FRM_FUNCTION, 0 , 0,flagonoff_select ,0, 26 , 26, 17,5 }
};
AreaGroup::setFname(filegroups ? "FGROUPS.PB" : "MGROUPS.PB");
AreaGroup fa;
int num_areas = fa.numGroups();
KEY hotkeys[]={ '1','2','3','4','5','6','7','8','9',KEY_INS, KEY_DEL , NULL };
SelectWindow sw;
sw.open( 3,
3,
50,
tsw_vsize - 3,
0x30,
SHADOW | BRACKETS,
CHISEL_BORDER,
0x3F,
NULL,
0x38 );
sw.title( filegroups ? "Select File Area Group"
: "Select Message Area Group",
0x30 );
sw.define(num_areas,0x1F,farea_list_func,0,NULL,hotkeys);
sw.direct(7, 0, 0x3F, 'Â');
sw.direct(7, tsw_vsize - 6, 0x38, 'Á');
again:
for(;;)
{
int alias;
tsw_showfooter( "\x1<Ins>\x1 - Add Area \x1<Del>\x1 - Delete Area \x1<Enter>\x1 - Edit Area",
BAR_NORM,
BAR_HIGH );
int choice=sw.process();
if(choice==SL_ESC)
{
break;
}
if(choice==SL_HOTKEY)
{
switch ( sw.hotkey )
{
case KEY_DEL:
{
if(!fa.read(sw.current+1))
{
tsw_beep();
continue;
}
if(fa.name[0])
{
if(ask_save() == 0)
{
fa.clear(sw.current+1);
}
}
continue;
}
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
KB.push((KEY)(char)sw.hotkey);
case KEY_INS:
{
int newareanum = num_areas+1;
Window w( 10,
5,
40,
7,
0x70,
SHADOW,
CHISEL_BORDER,
0x7F,
NULL,
0x71 );
w.open();
w << " New group number: ";
tsw_cursoron();
w.attrib(0x1E);
w.scan(newareanum,5,6);
tsw_cursoroff();
if ( newareanum > MAX_GROUPS ||
newareanum < 1 )
{
continue;
}
if ( newareanum > num_areas )
{
for ( int i = num_areas + 1;
i <= newareanum;
i++ )
{
fa.clear( i );
}
num_areas = newareanum;
sw.redefine(num_areas);
}
choice = newareanum - 1;
sw.show(choice);
}
}
}
if ( ! fa.read( choice + 1 ) )
{
tsw_beep();
continue;
}
unsigned crcvalue = crc(&fa,sizeof(fa));
if ( ! fa.name[ 0 ] )
{
memset(&fa,0,sizeof(fa));
fa.level = 1;
}
AccessFlags *flags[2];
flags[0] = &fa.flags;
flags[1] = &fa.flagsNot;
frm[0].value = fa.name;
frm[1].value = &fa.level;
frm[2].value = flags;
FormWindow w( 8,
6,
73,
13,
0x70,
SHADOW | BRACKETS,
CHISEL_BORDER,
0x7F,
NULL,
0x78 );
w.define( frm,
3,
0x71,
0x1E,
NULL,
helpfunction );
w.open();
w.title( form( filegroups
? " File Area Group #%d "
: " Message Area Group #%d ",
choice + 1 ),
0x70 );
w.attrib( 0x70 );
w << "\n Area name:\n\n"
" Access Level:\n"
" Access Flags:";
tsw_cursoron();
w.process();
tsw_cursoroff();
if ( crcvalue != crc( & fa, sizeof( fa ) ) &&
fa.name[ 0 ] )
{
if ( ask_save() == 0)
{
fa.write(choice+1);
}
}
}
if(fa.read(num_areas))
{
if( ! fa.name[ 0 ] )
{
fa.truncate();
}
}
}
void edit_fgroups()
{
edit_groups(TRUE);
}
void edit_mgroups()
{
edit_groups(FALSE);
}