home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC-Online 1999 November
/
PCOnline_11_1999.iso
/
filesbbs
/
OS2
/
MMSRC029.ZIP
/
mmail-0.29
/
interfac
/
help.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1999-08-14
|
5KB
|
272 lines
/*
* MultiMail offline mail reader
* help windows
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"
HelpWindow::HelpWindow()
{
baseReset();
}
void HelpWindow::newHelpMenu(const char **keys, const char **func, int it)
{
int x, y, z, end;
items = it;
menu = new Win(3, COLS - 2, LINES - 4, C_HELP2);
midpos = (COLS / 2) - 6;
endpos = COLS - 21;
if (items < 10)
end = items;
else {
end = base + 8;
if (end > items)
end = items;
}
for (z = base; z < end; z++) {
if (keys[z]) {
x = (z - base) / 3;
switch ((z - base) % 3) {
case 0:
y = 2;
break;
case 1:
y = midpos;
break;
default:
y = endpos;
}
menu->attrib(C_HELP1);
menu->put(x, y, ": ");
menu->put(x, y + 2, func[z]);
y -= strlen(keys[z]);
menu->attrib(C_HELP2);
menu->put(x, y, keys[z]);
}
}
if (items > 9) {
menu->put(2, endpos - 1, "O");
menu->attrib(C_HELP1);
menu->put(2, endpos, ": Other functions");
}
menu->delay_update();
}
void HelpWindow::h_packetlist()
{
static const char *keys[] = {
"Q", "Enter", "S, $",
"K", "/, .", "G",
"U", "R",
"A", "^T", "^Z",
"B", "Space, F", "^X"
}, *func[] = {
"Quit", "select packet", "change Sort type",
"Kill packet", "search / next", "Go to directory",
"Update list", "Rename packet",
"Addressbook", "Tagline editor", "command shell",
"alias for PgUp", "aliases for PgDn", "eXit now"
};
newHelpMenu(keys, func, 14);
}
void HelpWindow::h_arealist()
{
static const char *keys[] = {
"Q", "Enter", "F2, !",
"E", "S, Ins", "U, Del",
"L", "-", "+"
}, *func[] = {
"back to packet list", "select area", "Make reply packet",
"Enter letter in area", "Subscribe", "Unsubscribe",
"Long/short area list", "prev non-empty", "next non-empty"
};
newHelpMenu(keys, func, 9);
}
void HelpWindow::h_letterlist()
{
static const char *keys[] = {
"L", "Enter", "$",
"E", "^F", "S",
"U", "M",
"A", "^T", "F2, !",
0, "-", "+"
}, *func[] = {
"List all/unread", "read letter", "change sort type",
"Enter letter in area", "Forward letter", "Save (all/marked)",
"Unread/read toggle", "Mark/unmark",
"Addressbook", "Tagline editor", "Make reply packet",
0, "previous unread", "next unread"
}, *repkeys[] = {
"K", "Enter", "$",
"E", "^F", "S",
0, "^B",
"A", "^T", "F2, !"
}, *repfunc[] = {
"Kill letter", "read letter", "change sort type",
"Edit letter", "Forward letter", "Save (all/marked)",
0, "Break into parts",
"Addressbook", "Tagline editor", "Make reply packet"
};
if (!mm.areaList->isReplyArea())
newHelpMenu(keys, func, 14);
else
newHelpMenu(repkeys, repfunc, 11);
}
void HelpWindow::h_letter(bool isAnsi)
{
enum {width = 60, citems = 18, regitems = 7, repitems = 3,
ansitems = 9};
static const char *common[citems] = {
"S - Save letter",
"A - Addressbook",
"C - toggle Character set",
"D - Decrypt (rot13) toggle",
"X - eXtra (hidden) lines",
"I - Ignore soft CRs toggle",
"^T - Tagline editor",
"^F - Forward letter",
"F2, ! - Make reply packet",
"V, ^V, ^A - ANSI viewer",
"/ - start a search",
". - repeat last search",
"- - previous letter",
"+, Enter - next letter",
"Space - page through area",
"^Z - command shell",
"Q - back to letter list",
"^X - eXit " MM_NAME " now"
}, *regular[] = {
"E - Enter letter",
"R - Reply to letter",
"O - reply to Original sender",
"N - Netmail/Internet reply",
"T - Take tagline",
"M - Mark/unmark letter",
"U - Unread/read toggle"
}, *reply[] = {
"K - Kill letter",
"E, R - [Re-]Edit letter",
"^B - Break reply into parts"
}, *ansi[] = {
"S - Save to file",
"C - toggle Character set",
"V, ^V, ^A - Animate",
"/ - start a search",
". - repeat last search",
"Space - page down/next",
"- - previous",
"+ - next",
"Q - Quit ANSI viewer"
};
int base = isAnsi ? ansitems : mm.areaList->isReplyArea() ?
repitems : regitems;
int usecommon = isAnsi ? 0 : citems;
int height = ((base + usecommon + 1) >> 1) + 4;
menu = new ShadowedWin(height, width, (LINES - height) >> 1,
C_HELP3);
menu->attrib(C_HELP4);
const char **basechar = isAnsi ? ansi :
((base == 7) ? regular : reply);
int line = 0;
for (int x = 0; x < base; x++) {
if (!(x & 1))
line++;
menu->put(line, (x & 1) ? (width >> 1) + 2 : 2,
basechar[x]);
}
for (int x = base; x < usecommon + base; x++) {
if (!(x & 1))
line++;
menu->put(line, (x & 1) ? (width >> 1) + 2 : 2,
common[x - base]);
}
menu->put(line + 2, 2,
"Plus the standard direction keys");
menu->wtouch();
}
void HelpWindow::MakeActive()
{
switch (interface->active()) {
case ansi_help:
h_letter(true);
break;
case letter_help:
h_letter(false);
break;
case letterlist:
h_letterlist();
break;
case arealist:
h_arealist();
break;
case packetlist:
h_packetlist();
default:;
}
}
void HelpWindow::Delete()
{
switch (interface->active()) {
case ansi_help:
case letter_help:
delete (ShadowedWin *) menu;
break;
case letterlist:
case arealist:
case packetlist:
delete menu;
default:;
}
}
void HelpWindow::baseNext()
{
if (items > 9) {
base += 8;
if (base > (items - 1))
base = 0;
}
Delete();
MakeActive();
}
void HelpWindow::baseReset()
{
base = 0;
}