home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
business
/
calend2.lzh
/
CALENDAR
/
DISPLAY.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-01
|
16KB
|
919 lines
/* display.c */
#include "month.h"
short days;
short crow, ccol;
short current_area;
short message_line_filled;
char *blankout = " ";
extern short SCHEDULE_ROW;
char *days_of_week =
"Sunday Monday Tuesday Wednesday Thursday Friday Saturday";
short schedule_cols[] = {
0, SMONTH_COL, SDAY_COL, SYEAR_COL, MONTHLY_COL, YEARLY_COL,
EVERY_COL, NTH_COL, LAST_COL, SMTWTFS_COL,
SMTWTFS_COL+3, SMTWTFS_COL+6, SMTWTFS_COL+9, SMTWTFS_COL+12,
SMTWTFS_COL+15, SMTWTFS_COL+18, -1
};
char *month_names[] = {
" ",
"JANUARY ",
"FEBRUARY ",
"MARCH ",
"APRIL ",
"MAY ",
"JUNE ",
"JULY ",
"AUGUST ",
"SEPTEMBER",
"OCTOBER ",
"NOVEMBER ",
"DECEMBER " ,
" "
};
char *smtwtfs_names[] = {
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
};
extern short month, day, year, start_day, edit_flag;
extern short this_month, this_day, this_year;
extern struct event_rec current_event;
short first_year;
print_screen()
{
print_month(month);
print_year(year);
print_day_headers();
print_cal(month, year, NULL);
print_all_months();
print_all_years(year);
hl_month_year(month, 1, year, 1);
}
print_month(month)
int month;
{
mvaddstr(0, 35, month_names[month]);
}
print_year(year)
int year;
{
char nbuf[8];
sprintf(nbuf, "%4d", year);
mvaddstr(0, 47, nbuf);
}
print_day_headers()
{
mvaddstr(2, 12, days_of_week);
}
print_cal(month, year, all_events_list)
register month, year;
char *all_events_list;
{
short i, month_is_current, cday;
short row = 4, col = 13, standing_out = 0;
char nbuf[6];
start_day = get_start_day(month, year);
days = days_in(month, year);
if (day > days) {
day = days;
} else if (day < 1) {
day = 1;
}
month_is_current = ((month == this_month) && (year == this_year));
for (i = 1, cday = 1; i <= 42; i++) {
if ((cday <= days) && (i >= (start_day + 1))) {
if (all_events_list && all_events_list[cday]) {
sprintf(nbuf, "(%2d)", cday);
} else {
sprintf(nbuf, " %2d ", cday);
}
cday++;
} else {
strcpy(nbuf, " ");
}
if (month_is_current && ((cday-1) == this_day)) {
standout();
standing_out = 1;
month_is_current = 0;
}
mvaddstr(row, col, nbuf);
if (standing_out) {
standing_out = 0;
standend();
}
if ((i % 7) == 0) {
row += 2;
col = 13;
} else {
col += 10;
}
}
}
print_all_months()
{
short i;
standout();
for (i = 0; i <= 13; i++) {
mvaddstr(TOP_MONTH_ROW + i, 0, month_names[i]);
}
standend();
}
print_all_years(year)
int year;
{
short i;
char nbuf[8];
first_year = year - 4;
standout();
move(YEAR_ROW, YEAR_COL);
addstr("<<");
for (i = first_year; i < (first_year + 10); i++) {
sprintf(nbuf, " %4d ", i);
addstr(nbuf);
}
addstr(">>");
standend();
}
hl_month_year(month, mflag, year, yflag)
short month, mflag, year, yflag;
{
short i;
if (mflag != -1) {
if (!mflag) {
standout();
}
mvaddstr(TOP_MONTH_ROW + month, 0, month_names[month]);
if (!mflag) {
standend();
}
}
if (yflag != -1) {
if (!yflag) {
standout();
}
move(YEAR_ROW, 14 + (6 * (year - first_year)));
for (i = 0; i < 6; i++) {
addch(inch());
}
if (!yflag) {
standend();
}
}
}
start_display()
{
goto_day(day);
}
goto_this_day(gmonth, gday, gyear)
int gmonth, gday, gyear;
{
month = gmonth;
year = gyear;
day = gday;
print_screen();
switch(current_area) {
case MONTHS:
goto_month(month);
break;
case DAYS:
goto_day(day);
break;
case YEARS:
goto_year(year);
break;
}
}
goto_month(month)
int month;
{
crow = TOP_MONTH_ROW + month;
ccol = 9;
current_area = MONTHS;
}
goto_day(tday)
short tday;
{
day = tday;
get_row_col_from_day(&crow, &ccol, day);
current_area = DAYS;
}
goto_year(year)
int year;
{
crow = YEAR_ROW;
ccol = YEAR_COL + 3 + (6 * (year - first_year));
current_area = YEARS;
}
goto_schedule()
{
current_area = SCHEDULE;
crow = SCHEDULE_ROW;
ccol = MONTHLY_COL;
}
move_cursor(dir)
register short dir;
{
short mday, row, col;
if ((current_area != SCHEDULE) &&
((dir == 'm') || (dir == 'y') || (dir == 'd'))) {
if (dir == 'm') {
goto_month(month);
} else if (dir == 'y') {
goto_year(year);
} else {
goto_day(day);
}
return;
}
switch (current_area) {
case MONTHS:
switch(dir) {
case DN_ARROW:
case 'j':
if (crow <= (TOP_MONTH_ROW + 12)) {
crow++;
}
break;
case UP_ARROW:
case 'k':
if (crow > TOP_MONTH_ROW) {
crow--;
}
break;
}
break;
case YEARS:
switch(dir) {
case LF_ARROW:
case 'h':
if (ccol > YEAR_COL) {
if (ccol == (YEAR_COL + 3)) {
ccol = YEAR_COL;
} else {
ccol -= 6;
}
} else {
shift_years(-1);
}
break;
case RT_ARROW:
case 'l':
if (ccol < LAST_YEAR_COL) {
if (ccol == (LAST_YEAR_COL - 6)) {
ccol = LAST_YEAR_COL;
} else if (ccol == YEAR_COL) {
ccol = YEAR_COL + 3;
} else {
ccol += 6;
}
} else {
shift_years(1);
}
break;
}
break;
case DAYS:
row = crow;
col = ccol;
switch(dir) {
case LF_ARROW:
case 'h':
if (col > 15) {
col -= 10;
}
break;
case DN_ARROW:
case 'j':
if (row < 14) {
row += 2;
}
break;
case UP_ARROW:
case 'k':
if (row > 4) {
row -= 2;
}
break;
case RT_ARROW:
case 'l':
if (col < 74 ) {
col += 10;
}
break;
}
if ((mday = get_day_from_row_col(row, col)) > 0) {
day = mday;
crow = row;
ccol = col;
}
break;
case SCHEDULE:
schedule_move_cursor(dir);
break;
}
}
schedule_move_cursor(dir)
short dir;
{
short i;
switch(dir) {
case 'H':
if (crow == SCHEDULE_ROW) {
ccol = DATE_COL;
}
break;
case 'L':
if (crow == SCHEDULE_ROW) {
ccol = SMTWTFS_COL + 18;
}
break;
case LF_ARROW:
dir = 'h';
case RT_ARROW:
case 'h':
case 'l':
if (crow == SCHEDULE_ROW) {
i = 0;
while (schedule_cols[++i] != ccol) ;
i += ((dir == 'h') ? -1 : 1);
if (schedule_cols[i] != -1) {
ccol = schedule_cols[i];
}
} else if ((crow == TIME_ROW) || (crow == DURATION_ROW)) {
ccol = (dir == 'h') ? TIME_COL : MINUTE_COL;
} else if (crow == ACCEPT_ROW) {
ccol = (dir == 'h') ? ACCEPT_COL : CANCEL_COL;
}
break;
case '\t':
case '\n':
case '\r':
if (crow == SCHEDULE_ROW) {
crow += 2;
ccol = TIME_COL;
} else if (crow == DESCRIPTION_ROW) {
crow = ACCEPT_ROW;
ccol = ACCEPT_COL;
} else if (crow == ACCEPT_ROW) {
crow = SCHEDULE_ROW;
ccol = MONTHLY_COL;
} else if (crow == DURATION_ROW) {
crow = DESCRIPTION_ROW;
ccol = TIME_COL + strlen(current_event.event_string);
handle_event_description();
} else {
crow++;
}
break;
case '\033':
goto_day(day);
break;
}
}
selection()
{
short new_year;
int x;
switch(current_area) {
case MONTHS:
if ((crow - TOP_MONTH_ROW) != month) {
if (crow <= TOP_MONTH_ROW) {
hl_month_year(month, 0, 0, -1);
month = 12;
shift_years(-1);
hl_month_year(month, 1, 0, -1);
crow = TOP_MONTH_ROW + 13;
} else if (crow > (TOP_MONTH_ROW + 12)) {
hl_month_year(month, 0, 0, -1);
month = 1;
shift_years(1);
hl_month_year(month, 1, 0, -1);
crow = TOP_MONTH_ROW;
} else {
hl_month_year(month, 0, 0, -1);
month = crow - TOP_MONTH_ROW;
hl_month_year(month, 1, 0, -1);
print_cal(month, year, NULL);
}
print_month(month);
}
break;
`
case YEARS:
if (ccol == YEAR_COL) {
shift_years(-10);
} else if (ccol == LAST_YEAR_COL) {
shift_years(10);
} else {
new_year = first_year +
((ccol - (YEAR_COL + 3)) / 6);
if (new_year != year) {
hl_month_year(0, -1, year, 0);
year = new_year;
}
print_cal_hl_year(month, year);
}
break;
case SCHEDULE:
if (crow == SCHEDULE_ROW) {
select_regularity_col(ccol);
} else if (crow == ACCEPT_ROW) {
x = (ccol == ACCEPT_COL) ? ACCEPT : CANCEL;
accept_cancel(ccol == ACCEPT_COL);
if (edit_flag) {
return(x);
}
} else {
move_cursor('\t');
}
break;
}
return(NOTHING);
}
shift_years(shift)
short shift;
{
if (((year + shift) < (first_year + 10)) &&
((year + shift) >= first_year)) {
hl_month_year(0, -1, year, 0);
year += shift;
hl_month_year(0, -1, year, 1);
} else {
year += shift;
print_all_years(first_year + shift + 4);
}
print_cal_hl_year(month, year);
}
print_cal_hl_year(month, year)
int month, year;
{
print_cal(month, year, NULL);
print_year(year);
hl_month_year(0, -1, year, 1);
}
get_row_col_from_day(row, col, day)
short *row, *col, day;
{
*row = 4 + (((start_day + day - 1) / 7) * 2);
*col = 15 + (((start_day + day - 1) % 7) * 10);
}
get_day_from_row_col(row, col)
short row, col;
{
short mday;
mday = (7 * ((row - 4)) / 2) +
((col - 14) / 10) - start_day + 1;
if ((mday <= days) && (mday > 0)) {
return(mday);
}
return(0);
}
print_event_regularity(event)
struct event_rec *event;
{
if (event->monthly) {
standout();
}
mvaddstr(SCHEDULE_ROW, MONTHLY_COL, "monthly");
standend();
if (event->yearly) {
standout();
}
mvaddstr(SCHEDULE_ROW, YEARLY_COL, "yearly");
standend();
if (event->every) {
standout();
}
mvaddstr(SCHEDULE_ROW, EVERY_COL, "every");
standend();
print_smtwtfs(event->smtwtfs);
print_nth(event);
if (event->last) {
standout();
}
mvaddstr(SCHEDULE_ROW, LAST_COL, "last");
standend();
}
print_smtwtfs(smtwtfs)
char smtwtfs[];
{
short i;
char *s;
move(SCHEDULE_ROW, SMTWTFS_COL);
for (i = 0; i < 7; i++) {
if (smtwtfs[i]) {
standout();
}
addstr(smtwtfs_names[i]);
if (smtwtfs[i]) {
standend();
}
}
}
hl_schedule(col, hflag)
register col, hflag;
{
register int ch;
short i;
move(SCHEDULE_ROW, col);
if (hflag) {
standout();
}
if ((col < SMTWTFS_COL) || (col > (SMTWTFS_COL+18))) {
while((ch = inch()) != ' ') {
move(SCHEDULE_ROW, col);
addch(ch);
col++;
}
} else {
move(SCHEDULE_ROW, col);
for (i = 0; i < 3; i++) {
addch(inch());
}
}
standend();
}
display_event(event)
struct event_rec *event;
{
clear_schedule_area();
print_date(event->event_month, event->event_day, event->event_year);
print_event_regularity(event);
print_time(event);
print_duration(event);
print_event_description(event);
print_accept();
}
print_accept()
{
mvaddstr(ACCEPT_ROW, TIME_COL, "Accept/Cancel");
}
print_time(event)
struct event_rec *event;
{
char buf[32];
short hour;
char *apm;
hour = event->hour;
apm = (hour < 12) ? "AM" : "PM";
if (hour > 12) {
hour = hour % 12;
}
if (hour == 0) {
hour = 12;
}
sprintf(buf, "time: %2d:%02d %s", hour, event->minute, apm);
mvaddstr(TIME_ROW, 4, buf);
}
print_duration(event)
struct event_rec *event;
{
char buf[32];
sprintf(buf, "duration: %2d:%02d", event->duration_hours,
event->duration_minutes);
mvaddstr(DURATION_ROW, 0, buf);
}
print_event_description(event)
struct event_rec *event;
{
char buf[100];
sprintf(buf, "event: %s", event->event_string);
mvaddstr(DESCRIPTION_ROW, 3, buf);
}
scroll_time(dir)
register dir;
{
short hour, minute, d;
if (crow == TIME_ROW) {
hour = current_event.hour;
minute = current_event.minute;
} else if (crow == DURATION_ROW) {
hour = current_event.duration_hours;
minute = current_event.duration_minutes;
} else if (crow != SCHEDULE_ROW) {
return;
}
if (ccol == TIME_COL) {
if (dir == ' ') {
hour = (hour + 1) % 24;
} else {
hour = (hour + 23) % 24;
}
} else if (ccol == MINUTE_COL) {
if (dir == ' ') {
minute = (minute + 15) % 60;
} else {
minute = (minute + 45) % 60;
}
} else {
if (ccol == SMONTH_COL) {
current_event.event_month += ((dir == ' ') ? 1 : -1);
if (current_event.event_month > 12) {
current_event.event_month = 1;
} else if (current_event.event_month <= 0) {
current_event.event_month = 12;
}
} else if (ccol == SDAY_COL) {
d = days_in(current_event.event_month,
current_event.event_year);
current_event.event_day += ((dir == ' ') ? 1 : -1);
if (current_event.event_day > d) {
current_event.event_day = 1;
} else if (current_event.event_day <= 0) {
current_event.event_day = d;
}
} else if (ccol == SYEAR_COL) {
current_event.event_year += ((dir == ' ') ? 1 : -1);
if (current_event.event_year < 0) {
current_event.event_year = this_year;
}
} else if (ccol == NTH_COL) {
current_event.nth += ((dir == ' ') ? 1 : -1);
if (current_event.nth < 1) {
current_event.nth = 53;
} else if (current_event.nth > 53) {
current_event.nth = 1;
}
}
}
if (crow == TIME_ROW) {
current_event.hour = hour;
current_event.minute = minute;
print_time(¤t_event);
} else if (crow == DURATION_ROW) {
current_event.duration_hours = hour;
current_event.duration_minutes = minute;
print_duration(¤t_event);
} else if (ccol <= SYEAR_COL) {
print_date(current_event.event_month,
current_event.event_day, current_event.event_year);
} else if (ccol == NTH_COL) {
current_event.nth_is_on = 1;
print_nth(¤t_event);
}
}
hl_all(event, mf, yf, ef, nf, lf, xf)
struct event_rec *event;
register mf, yf, ef, nf, lf, xf;
{
short i;
toggle_char(&(event->monthly), mf, MONTHLY_COL);
toggle_char(&(event->yearly), yf, YEARLY_COL);
toggle_char(&(event->every), ef, EVERY_COL);
toggle_char(&(event->nth_is_on), nf, NTH_COL);
toggle_char(&(event->last), lf, LAST_COL);
if (xf != -1) {
for (i = 0; i < 7; i++) {
toggle_char(&(event->smtwtfs[i]), xf,
(SMTWTFS_COL+(3*i)));
}
}
}
toggle_char(c, f, col)
char *c;
register f, col;
{
if (f == 1) {
if (!(*c)) {
*c = 1;
hl_schedule(col, f);
}
} else if (!f) {
if (*c) {
*c = 0;
hl_schedule(col, f);
}
}
}
print_date(month, day, year)
int month, day, year;
{
char buf[64];
standout();
sprintf(buf, "%2d/%2d/%4d", month, day, year);
mvaddstr(SCHEDULE_ROW, DATE_COL, buf);
standend();
}
error_message(str, sound)
char *str;
int sound;
{
mvaddstr(0, 0, blankout);
mvaddstr(0, 0, str);
refresh();
if (sound) {
sound_bell();
}
message_line_filled = 1;
}
sound_bell()
{
putchar(7);
fflush(stdout);
}
clear_schedule_area()
{
move(SCHEDULE_ROW, 0);
clrtobot();
}
blank_out(col)
int col;
{
while (col < 35) {
addch(' ');
col++;
}
}
print_nth(event)
struct event_rec *event;
{
char *ns, buf[10];
short n;
if (event->nth_is_on) {
standout();
}
n = event->nth;
if (event->nth > 13) {
n %= 10;
}
switch(n) {
case 0:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
ns = "th";
break;
case 1:
ns = "st";
break;
case 2:
ns = "nd";
break;
case 3:
ns = "rd";
break;
}
sprintf(buf, "%02d%s", event->nth, ns);
mvaddstr(SCHEDULE_ROW, NTH_COL, buf);
standend();
}
remind(str, minutes)
char *str;
int minutes;
{
char s[50];
if (minutes > 1) {
sprintf(s, "In %d minutes", minutes);
} else if (minutes == 1) {
strcpy(s, "In 1 minute");
} else {
strcpy(s, "Right now");
}
printf("\n%s \n%s. \n", str, s);
sound_bell();
}
clear_message_line()
{
message_line_filled = 0;
mvaddstr(0, 0, blankout);
}
incr(ch)
int ch;
{
short inc;
inc = ((ch == 'n') || (ch == '+')) ? 1 : -1;
switch (current_area) {
case MONTHS:
hl_month_year(month, 0, 0, -1);
if ((month == 1) && (inc < 0)) {
shift_years(-1);
month = 12;
} else if ((month == 12) && (inc > 0)) {
shift_years(1);
month = 1;
} else {
month += inc;
}
hl_month_year(month, 1, 0, -1);
print_month(month);
goto_month(month);
print_cal(month, year, NULL);
break;
case DAYS:
if (((inc > 0) && (day < days)) || ((inc < 0) && (day > 1))) {
goto_day(day + inc);
}
break;
case YEARS:
shift_years(inc);
goto_year(year);
break;
}
}