home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC-Online 1999 November
/
PCOnline_11_1999.iso
/
filesbbs
/
OS2
/
MMSRC029.ZIP
/
mmail-0.29
/
interfac
/
arealist.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1999-08-23
|
8KB
|
369 lines
/*
* MultiMail offline mail reader
* area list
Copyright (c) 1996 Kolossvary Tamas <thomas@vma.bme.hu>
Copyright (c) 1999 William McBrine <wmcbrine@clark.net>
Distributed under the GNU General Public License.
For details, see the file COPYING in the parent directory. */
#include "interfac.h"
//************** LittleAreaListWindow *****************
void LittleAreaListWindow::MakeActive()
{
position = active = 0;
areanum = -1;
disp = 0;
do
mm.areaList->gotoActive(disp++);
while (mm.areaList->isCollection());
disp--;
list_max_y = (NumOfItems() < LINES - 10) ? NumOfItems() : LINES - 10;
list_max_x = 52;
top_offset = 3;
borderCol = C_LALBTEXT;
list = new InfoWin(list_max_y + 4, 54, 3, borderCol, 0, 0, 4,
top_offset);
mm.areaList->gotoArea(mm.letterList->getAreaID());
active = mm.areaList->getActive() - disp;
list->put(1, 2, "Reply goes to area:");
DrawAll();
Select();
}
void LittleAreaListWindow::Select()
{
mm.areaList->gotoActive(active + disp);
}
void LittleAreaListWindow::Delete()
{
delete list;
}
int LittleAreaListWindow::getArea()
{
return areanum;
}
int LittleAreaListWindow::NumOfItems()
{
return mm.areaList->noOfActive() - disp;
}
void LittleAreaListWindow::oneLine(int i)
{
mm.areaList->gotoActive(position + i + disp);
sprintf(list->lineBuf, "%c%-50.50s ", (!mm.areaList->isShortlist()
&& (mm.areaList->getType() & ACTIVE)) ? '*' : ' ',
mm.areaList->getDescription());
areaconv_in(list->lineBuf);
DrawOne(i, C_LALLINES);
}
searchret LittleAreaListWindow::oneSearch(int x, const char *item,
int ignore)
{
ignore = ignore;
mm.areaList->gotoActive(x + disp);
return searchstr(mm.areaList->getDescription(), item) ? True : False;
}
bool LittleAreaListWindow::extrakeys(int key)
{
switch (key) {
case MM_ENTER:
Select();
areanum = mm.areaList->getAreaNo();
break;
case 'L':
interface->areas.Select();
interface->areas.KeyHandle('L');
}
return false;
}
//************* AreaListWindow ******************
void AreaListWindow::FirstUnread()
{
int i;
position = active = 0;
for (i = 0; i < NumOfItems(); i++) {
mm.areaList->gotoActive(i);
if (!mm.areaList->getNoOfUnread())
Move(DOWN);
else
break;
}
if (i == NumOfItems()) {
position = active = 0;
for (i = 0; i < NumOfItems(); i++) {
mm.areaList->gotoActive(i);
if (!mm.areaList->getNoOfLetters())
Move(DOWN);
else
break;
}
}
}
int AreaListWindow::NumOfItems()
{
return mm.areaList->noOfActive();
}
void AreaListWindow::oneLine(int i)
{
char *p = list->lineBuf;
mm.areaList->gotoActive(position + i);
int attrib = mm.areaList->getType();
if (position + i == active) {
p += sprintf(p, "%.20s", mm.areaList->getAreaType());
if (mm.areaList->isNetmail())
p += sprintf(p, ", Netmail");
else
if (mm.areaList->isInternet())
p += sprintf(p, ", Email");
else
if (mm.areaList->isUsenet())
p += sprintf(p, ", Usenet");
else
if (attrib & ECHO)
p += sprintf(p, ", Echo");
if (attrib & PERSONLY)
p += sprintf(p, ", Pers");
else
if (attrib & PERSALL)
p += sprintf(p, ", Pers+All");
int q = 27 - (p - list->lineBuf);
while (--q > 0)
sprintf(p++, " ");
p = list->lineBuf;
list->attrib(C_ALINFOTEXT2);
list->put(list_max_y + 4, 8, p);
sprintf(p, format2, mm.areaList->getDescription());
areaconv_in(p);
list->put(list_max_y + 5, 20, p);
list->delay_update();
}
p += sprintf(p, format, ((attrib & ADDED) ? '+' :
((attrib & DROPPED) ? '-' : ((attrib & ACTIVE) &&
!mm.areaList->isShortlist()) ? '*' : ' ')),
mm.areaList->getShortName(), mm.areaList->getDescription());
if (mm.areaList->getNoOfLetters())
p += sprintf(p, " %5d ", mm.areaList->getNoOfLetters());
else
p += sprintf(p, " . ");
if (mm.areaList->getNoOfUnread())
p += sprintf(p, " %5d ", mm.areaList->getNoOfUnread());
else
p += sprintf(p, " . ");
if (mode)
if (mm.areaList->getNoOfPersonal())
sprintf(p, " %5d ",
mm.areaList->getNoOfPersonal());
else
sprintf(p, " . ");
chtype ch = (attrib & (REPLYAREA | ADDED | DROPPED)) ?
C_ALREPLINE : C_ALPACKETLINE;
areaconv_in(list->lineBuf);
DrawOne(i, mm.areaList->getNoOfUnread() ? emph(ch) : noemph(ch));
}
searchret AreaListWindow::oneSearch(int x, const char *item, int mode)
{
const char *s;
searchret retval;
mm.areaList->gotoActive(x);
s = searchstr(mm.areaList->getShortName(), item);
if (!s)
s = searchstr(mm.areaList->getDescription(), item);
retval = s ? True : False;
if (!s && (mode < s_arealist) && mm.areaList->getNoOfLetters()) {
int oldactive = active;
ResetActive();
mm.areaList->getLetterList();
mm.letterList->relist();
interface->changestate(letterlist);
interface->letters.setActive(-1);
retval = interface->letters.search(item, mode);
if (retval != True) {
active = oldactive;
interface->changestate(arealist);
delete mm.letterList;
}
}
return retval;
}
void AreaListWindow::Select()
{
mm.areaList->gotoActive(active);
}
void AreaListWindow::ResetActive()
{
active = mm.areaList->getActive();
}
void AreaListWindow::MakeActive()
{
int padding, middle;
char tmp[80], tpad[7];
mode = mm.driverList->hasPersonal();
sprintf(tmp, "Message Areas (%d)", NumOfItems());
list_max_y = LINES - 15;
list_max_x = COLS - 6;
top_offset = 2;
borderCol = C_ALBORDER;
list = new InfoWin(list_max_y + 7, list_max_x + 2, 2, borderCol,
tmp, C_ALBTEXT, 7);
list->attrib(C_ALHEADTEXT);
list->put(1, 3, "Area# Description");
int newloc = list_max_x - 15;
if (mode)
newloc -= 11;
list->put(1, newloc, "Total Unread");
if (mode)
list->put(1, list_max_x - 9, "Personal");
list->horizline(list_max_y + 2, list_max_x);
padding = list_max_x - 28;
if (mode)
padding -= 11;
sprintf(format, "%%c%%6s %%-%d.%ds", padding, padding);
middle = (list_max_x - 2) >> 1;
list->attrib(C_ALINFOTEXT);
list->put(list_max_y + 3, 3, "BBS:");
list->put(list_max_y + 3, middle, " Sysop:");
list->put(list_max_y + 4, 2, "Type:");
list->put(list_max_y + 4, middle, "Packet:");
list->put(list_max_y + 5, 2, "Area description:");
sprintf(tpad, "%%.%ds", (middle < 87) ? middle - 8 : 79);
middle += 8;
list->attrib(C_ALINFOTEXT2);
sprintf(tmp, tpad, mm.resourceObject->get(BBSName));
charconv_in(tmp);
list->put(list_max_y + 3, 8, tmp);
sprintf(tmp, tpad, mm.resourceObject->get(SysOpName));
charconv_in(tmp);
list->put(list_max_y + 3, middle, tmp);
list->put(list_max_y + 4, middle, mm.resourceObject->get(PacketName));
padding = list_max_x - 20;
sprintf(format2, "%%-%d.%ds", padding, padding);
DrawAll();
Select();
}
void AreaListWindow::Delete()
{
delete list;
}
void AreaListWindow::Prev()
{
do {
Move(UP);
Select();
} while (!mm.areaList->getNoOfLetters() &&
(mm.areaList->getActive() > 0));
}
void AreaListWindow::Next()
{
do {
Move(DOWN);
Select();
} while (!mm.areaList->getNoOfLetters() &&
(mm.areaList->getActive() <
mm.areaList->noOfActive() - 1));
}
bool AreaListWindow::extrakeys(int key)
{
bool end = false;
Select();
switch (key) {
case 'E':
if (!mm.areaList->isCollection()) {
if (mm.areaList->isEmail()) {
interface->addressbook();
Select();
}
interface->letterwindow.set_Letter_Params(
mm.areaList->getAreaNo(), 'E');
interface->letterwindow.EnterLetter();
interface->redraw();
}
break;
case 'L':
mm.areaList->relist();
ResetActive();
interface->redraw();
break;
case 'S':
case KEY_IC:
case 'U':
case KEY_DC:
if (mm.areaList->hasOffConfig()) {
if ((key == 'S') || (key == KEY_IC))
mm.areaList->Add();
else
mm.areaList->Drop();
interface->setUnsavedNoAuto();
Move(DOWN);
Draw();
} else
interface->nonFatalError(
"Offline config is unavailable");
}
return end;
}