[alt.sources] Xkal - X appointment calendar, Part03/04

ferguson@cs.rochester.edu (George Ferguson) (11/15/90)

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 3 (of 4)."
# Contents:  db.c month.c resources.h schedule.c
# Wrapped by ferguson@swan.cs.rochester.edu on Mon Nov 12 14:07:07 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'db.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'db.c'\"
else
echo shar: Extracting \"'db.c'\" \(9500 characters\)
sed "s/^X//" >'db.c' <<'END_OF_FILE'
X/*
X *	db.c : Database routines for xkal.
X *	       Handles searching and updating the appointment array.
X *
X *	George Ferguson (ferguson@cs.rochester.edu), 27 Oct 1990.
X *
X *	$Id: db.c,v 1.5 90/11/07 11:22:44 ferguson Exp $
X *
X */
X#include <stdio.h>
X#include <string.h>
X#include <ctype.h>
X#include <errno.h>
X#include <X11/Intrinsic.h>
X#include "util.h"
X#include "date-strings.h"
Xextern char *getenv();
X
Xextern char *program;
X
X/*
X * Functions defined here:
X */
Xvoid initDb(), addAppoint(), deleteAppoint();
Xvoid addScheduleDow(), addSchedule(), deleteScheduleDow(), deleteSchedule();
Xchar *lookup(),*lookupAppoint(),*lookupScheduleDow(),*lookupSchedule();
Xvoid readAppoints(), writeAppoints();
Xstatic void parseApp(), parseSched();
Xstatic char *expandFilename();
X
X/*	-	-	-	-	-	-	-	-	*/
X
Xtypedef struct _msgrec {
X	int pos;
X	char *text;
X	struct _msgrec *next;
X} Msgrec;
Xtypedef struct _dayrec {
X	int day;
X	Msgrec *msgs;
X	struct _dayrec *next;
X} Dayrec;
Xtypedef struct _monrec {
X	int mon;
X	Dayrec *days;
X	struct _monrec *next;
X} Monrec;
Xtypedef struct _yearrec {
X	int year;
X	Monrec *mons;
X	struct _yearrec *next;
X} Yearrec;
X
Xstatic Yearrec *Db = NULL;
Xstatic char *schedule[7][22];
X
X/*	-	-	-	-	-	-	-	-	*/
X/* Initialization (pretty lame) */
X
Xvoid
XinitDb()
X{
X    int i,j;
X
X    Db = NULL;	/* should really free everything... */
X    for (i=0; i < 7; i++)
X	for (j=0; j < 22; j++)
X	    schedule[i][j] = NULL;
X}
X
X/*	-	-	-	-	-	-	-	-	*/
X/* Appointment routines */
X
Xvoid
XaddAppoint(pos,day,mon,year,text)
Xint pos,day,mon,year;
Xchar *text;
X{
X  Yearrec *yp;
X  Monrec *mp;
X  Dayrec *dp;
X  Msgrec *xp;
X
X    if (Db == NULL) {
X	Db = XtNew(Yearrec);
X	Db->year = year;
X	Db->mons = NULL;
X	Db->next = NULL;
X    }
X    for (yp = Db; yp->year != year && yp->next != NULL; yp = yp->next) ;
X    if (yp->year != year) {
X	yp->next = XtNew(Yearrec);
X	yp->next->year = year;
X	yp->next->mons = NULL;
X	yp->next->next = NULL;
X	yp = yp->next;
X    }
X    if (yp->mons == NULL) {
X	yp->mons = XtNew(Monrec);
X	yp->mons->mon = mon;
X	yp->mons->days = NULL;
X	yp->mons->next = NULL;
X    }
X    for (mp = yp->mons; mp->mon != mon && mp->next != NULL; mp = mp->next) ;
X    if (mp->mon != mon) {
X	mp->next = XtNew(Monrec);
X	mp->next->mon = mon;
X	mp->next->days = NULL;
X	mp->next->next=NULL;
X	mp = mp->next;
X    }
X
X    if (mp->days == NULL) {
X	mp->days = XtNew(Dayrec);
X	mp->days->day = day;
X	mp->days->msgs = NULL;
X	mp->days->next = NULL;
X    }
X    for (dp = mp->days; dp->day != day && dp->next != NULL; dp = dp->next) ;
X    if (dp->day != day) {
X	dp->next = XtNew(Dayrec);
X	dp->next->day = day;
X	dp->next->msgs = NULL;
X	dp->next->next=NULL;
X	dp = dp->next;
X    }
X
X    if (dp->msgs == NULL) {
X	dp->msgs = XtNew(Msgrec);
X	dp->msgs->pos = pos;
X	dp->msgs->text = NULL;
X	dp->msgs->next = NULL;
X    }
X    for (xp = dp->msgs; xp->pos != pos && xp->next != NULL; xp = xp->next) ;
X    if (xp->pos != pos) {
X	xp->next = XtNew(Msgrec);
X	xp->next->pos = pos;
X	xp->next->text = NULL;
X	xp->next->next = NULL;
X	xp = xp->next;
X    }
X    XtFree(xp->text);
X    xp->text = XtNewString(text);
X}
X
Xvoid
XdeleteAppoint(pos,day,mon,year)
Xint pos,day,mon,year;
X{
X  Yearrec *yp,*yp2;
X  Monrec *mp,*mp2;
X  Dayrec *dp,*dp2;
X  Msgrec *xp,*xp2;
X
X    for (yp = Db; yp != NULL && yp->year != year; yp = yp->next) ;
X    if (yp == NULL)
X	return;		/* error? */
X
X    for (mp = yp->mons; mp != NULL && mp->mon != mon; mp = mp->next) ;
X    if (mp == NULL)
X	return;		/* error? */
X
X    for (dp = mp->days; dp != NULL && dp->day != day; dp = dp->next) ;
X    if (dp == NULL)
X	return;		/* error? */
X
X    for (xp = dp->msgs; xp != NULL && xp->pos != pos; xp = xp->next) ;
X    if (xp == NULL)
X	return;		/* error? */
X
X	/* Now free 'em up */
X
X    XtFree(xp->text);		/* free the text */
X    
X    if (dp->msgs == xp)		/* and the msgrec */
X	dp->msgs = xp->next;
X    else {
X	for (xp2 = dp->msgs; xp2->next != xp; xp2 = xp2->next) ;
X	xp2->next = xp->next;
X    }
X    XtFree(xp);
X
X    if (dp->msgs == NULL) {	/* if no more entries, free the day */
X	if (mp->days == dp)
X	    mp->days = dp->next;
X	else {
X	    for (dp2 = mp->days; dp2->next != dp; dp2 = dp2->next) ;
X	    dp2->next = dp->next;
X	}
X	XtFree(dp);
X    }
X
X    if (mp->days == NULL) {	/* if no more days, free the month */
X	if (yp->mons == mp)
X	    yp->mons = mp->next;
X	else {
X	    for (mp2 = yp->mons; mp2->next != mp; mp2 = mp2->next) ;
X	    mp2->next = mp->next;
X	}
X	XtFree(mp);
X    }
X
X    if (yp->mons == NULL) {	/* if no more months, free the year */
X	if (Db == yp)
X	    Db = NULL;
X	else {
X	    for (yp2 = Db; yp2->next != yp; yp2 = yp2->next) ;
X	    yp2->next = yp->next;
X	}
X	XtFree(yp);
X    }
X}
X
X/*	-	-	-	-	-	-	-	-	*/
X/* Schedule routines */
X
Xvoid
XaddScheduleDow(pos,dow,msg)
Xint pos,dow;
Xchar *msg;
X{
X    XtFree(schedule[dow][pos]);
X    schedule[dow][pos] = XtNewString(msg);
X}
X
Xvoid
XaddSchedule(pos,day,mon,year,msg)
Xint pos,day,mon,year;
Xchar *msg;
X{
X    lookupScheduleDow(pos,computeDOW(day,mon,year),msg);
X}
X
Xvoid
XdeleteScheduleDow(pos,dow)
Xint pos,dow;
X{
X    XtFree(schedule[dow][pos]);
X    schedule[dow][pos] = NULL;
X}
X
Xvoid
XdeleteSchedule(pos,day,mon,year)
Xint pos,day,mon,year;
X{
X    lookupScheduleDow(pos,computeDOW(day,mon,year));
X}
X
X/*	-	-	-	-	-	-	-	-	*/
X/* Lookup routines */
X
Xchar *
Xlookup(pos,day,mon,year)
X{
X    char *s;
X
X    if ((s=lookupAppoint(pos,day,mon,year)) != NULL)
X	return(s);
X    else
X	return(lookupSchedule(pos,day,mon,year));
X}
X
Xchar *
XlookupAppoint(pos,day,mon,year)
Xint pos,day,mon,year;
X{
X    Yearrec *yp;
X    Monrec *mp;
X    Dayrec *dp;
X    Msgrec *xp;
X
X    for (yp = Db; yp != NULL && yp->year != year; yp = yp->next) ;
X    if (yp != NULL) {
X      for (mp = yp->mons; mp != NULL && mp->mon != mon; mp = mp->next) ;
X      if (mp != NULL) {
X	for (dp = mp->days; dp != NULL && dp->day != day; dp = dp->next) ;
X	if (dp != NULL) {
X	  for (xp = dp->msgs; xp != NULL && xp->pos != pos; xp = xp->next) ;
X	  if (xp != NULL)
X	      return(xp->text);
X	}
X      }
X    }
X    return(NULL);
X}
X
Xchar *
XlookupScheduleDow(pos,dow)
Xint pos,dow;
X{
X    return(schedule[dow][pos]);
X}
X
Xchar *
XlookupSchedule(pos,day,mon,year)
Xint pos,day,mon,year;
X{
X    return(lookupScheduleDow(pos,computeDOW(day,mon,year)));
X}
X    
X    
X/*	-	-	-	-	-	-	-	-	*/
X/* I/O routines */
X
Xvoid
XreadAppoints(name)
Xchar *name;
X{
X    FILE *fp;
X    char *fname,buf[256];
X    int line,i,n,c;
X
X    fname = expandFilename(name);
X    if ((fp=fopen(fname,"r")) == NULL) {
X	if (errno != ENOENT)	/* appointment file may not exist */
X	    perror(fname);
X	return;
X    }
X    line = 0;
X    while (1) {
X	n = 0;
X	line += 1;
X	while (n < 255 && (c=getc(fp)) != EOF && c != '\n')
X	    buf[n++] = c;
X	buf[n] = '\0';
X	if (n == 0)
X	    break;
X	else if (c != EOF && c != '\n') {
X	    fprintf(stderr,"%s: line %d too long, file %s\n",program,
X								line,fname);
X	    while ((c=getc(fp)) != EOF && c != '\n') ;
X	}
X	for (i=0; isspace(buf[i]) && i < n; i++) ;
X	if (buf[i] == '#')
X	    continue;
X	else if (isdigit(buf[i]))
X	    parseApp(buf,line,fname);
X	else
X	    parseSched(buf,line,fname);
X    }
X    fclose(fp);
X}
X
Xstatic void
XparseApp(buf,line,fname)
Xchar *buf;
Xint line;
Xchar *fname;
X{
X    int d,m,y,h,h2,pos;
X    char mstr[4],msg[256];
X
X    if (sscanf(buf,"%d %3s %d %d:%d %256[^\n]",&d,mstr,&y,&h,&h2,msg) != 6) {
X	fprintf(stderr,"%s: file \"%s\", line %d: invalid appointment: %s\n",
X							program,fname,line,buf);
X	return;
X    }
X    if (islower(mstr[0]))
X	mstr[0] = toupper(mstr[0]);
X    for (m=0; m < 12; m++)
X	if (strncmp(shortMonStr[m],mstr,3) == 0)
X	    break;
X    if (m == 12) {
X	fprintf(stderr,"%s: file \"%s\", line %d: invalid month: %s\n",
X						program,fname,line,mstr);
X	return;
X    }
X    if (h2 < 30)
X	pos = (h-8)*2;
X    else
X	pos = (h-8)*2+1;
X    addAppoint(pos,d,m,y-1900,msg);
X}
X
Xstatic void
XparseSched(buf,line,fname)
Xchar *buf;
Xint line;
Xchar *fname;
X{
X    int d,h,h2,pos;
X    char dowstr[4],msg[256];
X
X    if (sscanf(buf,"%3s %d:%d %256[^\n]",dowstr,&h,&h2,msg) != 4) {
X	fprintf(stderr,"%s: file \"%s\", line %d: invalid schedule entry: %s\n",
X							program,fname,line,buf);
X	return;
X    }
X    if (islower(dowstr[0]))
X	dowstr[0] = toupper(dowstr[0]);
X    for (d=0; d<7; d++)
X	if (strcmp(dowstr,shortDayStr[d]) == 0)
X	    break;
X    if (d == 7) {
X	fprintf(stderr,"%s: file \"%s\", line %d: invalid day-of-week: %s\n",
X						program,fname,line,dowstr);
X	return;
X    }
X    if (h2 < 30)
X	pos = (h-8)*2;
X    else
X	pos = (h-8)*2+1;
X    addScheduleDow(pos,d,msg);
X}
X
Xvoid
XwriteAppoints(name)
Xchar *name;
X{
X    FILE *fp;
X    char *fname;
X    Yearrec *yp;
X    Monrec *mp;
X    Dayrec *dp;
X    Msgrec *xp;
X    int h,h2,i,d;
X
X    fname = expandFilename(name);
X    if ((fp=fopen(fname,"w")) == NULL) {
X	perror(fname);
X	return;
X    }
X    for (d=0; d < 7; d++)
X	for (i=0; i < 22; i++)
X	    if (schedule[d][i] != NULL)
X		fprintf(fp,"%3s %2d:%02d %s\n",shortDayStr[d],i/2+8,i%2*30,
X								schedule[d][i]);
X    for (yp = Db; yp != NULL; yp = yp->next)
X	for (mp = yp->mons; mp != NULL; mp = mp->next)
X	    for (dp = mp->days; dp != NULL; dp = dp->next)
X		for (xp = dp->msgs; xp != NULL; xp = xp->next) {
X		    h = 8+(xp->pos / 2);
X		    h2 = (xp->pos % 2)*30;
X		    fprintf(fp,"%2d %3.3s %4d %2d:%02d %s\n",
X						dp->day,shortMonStr[mp->mon],
X								1900+yp->year,
X								h,h2,xp->text);
X		}
X    fclose(fp);
X}
X
Xstatic char filename[1024];
X
Xstatic char *
XexpandFilename(name)
Xchar *name;
X{
X    char *s;
X
X    if (*name == '~') {
X	if ((s=getenv("HOME")) == NULL) {
X	    printf("%s: can't expand ~ to $HOME\n",program);
X	    return;
X	} else {
X	    strcpy(filename,s);
X	    strcat(filename,name+1);
X	}
X    } else {
X	strcpy(filename,name);
X    }
X    return(filename);
X}
END_OF_FILE
if test 9500 -ne `wc -c <'db.c'`; then
    echo shar: \"'db.c'\" unpacked with wrong size!
fi
# end of 'db.c'
fi
if test -f 'month.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'month.c'\"
else
echo shar: Extracting \"'month.c'\" \(5647 characters\)
sed "s/^X//" >'month.c' <<'END_OF_FILE'
X/*
X *	month.c : Widget creation and action binding for the month
X *		  forms, and it's sub-widgets.
X *
X *      George Ferguson (ferguson@cs.rochester.edu), 27 Oct 1990.
X *
X *	$Id: month.c,v 1.1 90/11/07 11:22:57 ferguson Exp $
X */
X#include <X11/Intrinsic.h>
X#include <X11/Shell.h>
X#include <X11/StringDefs.h>
X#include <X11/Xaw/Form.h>
X#include <X11/Xaw/Command.h>
X#include <X11/Xaw/Toggle.h>
X#include <X11/Xaw/Label.h>
X#include <X11/Xaw/AsciiText.h>
X#include <X11/Xaw/Cardinals.h>
X#include "app-resources.h"
X#include "widgets.h"
X#include "month.h"
X#include "day.h"
X#include "db.h"
X#include "date-strings.h"
X
Xextern int numMonths;
X
X/*
X * Functions defined in this file
X */
XMonthFormData *createMonthFormData();
Xvoid setMonthFormData();
Xvoid selectDay();
Xvoid shadeButton();
X
Xstatic void dayButtonCallbackProc();
Xstatic void getGCAndXY();
X
X/*
X * Data defined in this file
X */
Xstatic int dayAppointsChanged;
Xstatic Widget radioGroup;
X
X/*	-	-	-	-	-	-	-	-	*/
X/* returns an unmanaged form */
X
XMonthFormData *
XcreateMonthFormData(parent,name,num)
XWidget parent;
Xchar *name;
Xint num;		/* 1,3,12 */
X{
X    MonthFormData *m;
X    DayButtonData *d;
X    Widget widget;
X    Arg args[3];
X    char text[16];
X    int row,col;
X    int w,h;
X
X    m = XtNew(MonthFormData);
X    m->form = XtCreateWidget(name,formWidgetClass,parent,NULL,ZERO);
X    switch (num) {
X	case 1: w = appResources.dateWidth1;
X		h = appResources.dateHeight1;
X		break;
X	case 3: w = appResources.dateWidth3;
X		h = appResources.dateHeight3;
X		break;
X	case 12: w = appResources.dateWidth12;
X		 h = appResources.dateHeight12;
X		 break;
X    }
X    sprintf(text,"monthLabel%d",num);
X    m->label = XtCreateManagedWidget(text,labelWidgetClass,m->form,NULL,ZERO);
X    if (appResources.dowLabels) {
X	sprintf(text,"dowLabel%d",num);
X	XtSetArg(args[0],XtNfromVert,m->label);
X	XtSetArg(args[1],XtNfromHoriz,NULL);
X	for (col=0; col < 7; col++) {
X	    XtSetArg(args[2],XtNlabel,shortDayStr[col]);
X	    widget = XtCreateManagedWidget(text,labelWidgetClass,m->form,
X								args,THREE);
X	    XtSetArg(args[1],XtNfromHoriz,widget);
X	}
X	XtSetArg(args[0],XtNfromVert,widget);
X    } else {
X	XtSetArg(args[0],XtNfromVert,m->label);
X    }
X    sprintf(text,"dayButton%d",num);
X    for (row=0; row < 6; row++) {
X	XtSetArg(args[1],XtNfromHoriz,NULL);
X	for (col=0; col < 7; col++) {
X	    d = m->days[row*7+col] = XtNew(DayButtonData);
X	    d->button = XtCreateManagedWidget(text,toggleWidgetClass,
X							m->form,args,TWO);
X	    XtAddCallback(d->button,"callback",dayButtonCallbackProc,d);
X	    XtSetArg(args[2],XtNradioData,d->button);
X	    XtSetValues(d->button,args+2,ONE);
X	    if (radioGroup == NULL)
X		radioGroup = d->button;
X	    XawToggleChangeRadioGroup(d->button,radioGroup);
X	    d->pixmap = XCreatePixmap(display,root,w,h,
X						DefaultDepthOfScreen(screen));
X
X	    XtSetArg(args[1],XtNfromHoriz,d->button);
X	}
X        XtSetArg(args[0],XtNfromVert,d->button);
X    }
X    return(m);
X}
X
Xvoid
XsetMonthFormData(m,num,month,year)
XMonthFormData *m;
Xint num,month,year;
X{
X    DayButtonData *d;
X    Arg args[1];
X    GC gc;
X    char text[16];
X    int first,numDays;
X    int i,x,y,n;
X
X    first = firstDOW(month,year);
X    numDays = lastDay(month,year);
X    getGCAndXY(num,&gc,&x,&y);
X    XawFormDoLayout(m->form,False);
X    XawToggleUnsetCurrent(radioGroup);
X    sprintf(text,"%s %d",longMonStr[month],year+1900);
X    XtSetArg(args[0],XtNlabel,text);
X    XtSetValues(m->label,args,ONE);
X    for (i=0; i < 42; i++) {
X	d = m->days[i];
X	if (i < first || i >= first+numDays) {
X	    d->day = 0;
X	    XFillRectangle(display,d->pixmap,emptyGC,0,0,50,50);
X	    XtSetArg(args[0],XtNbitmap,d->pixmap);
X	    XtSetValues(d->button,args,ONE);
X	} else {
X	    d->day = i-first+1;
X	    d->month = month;
X	    d->year = year;
X	    shadeButton(d,gc,x,y);
X	}
X    }
X    XawFormDoLayout(m->form,True);
X    m->month = month;
X    m->year = year;
X}
X
X/* This function is here so it can be outside the loop in setMonthFormData(),
X   but really belongs in shadeButton.					*/
Xstatic void
XgetGCAndXY(num,gcp,xp,yp)
XGC *gcp;
Xint *xp,*yp;
X{
X    int w,h;
X
X    switch (num) {
X	case 1: XParseGeometry(appResources.datePosition1,xp,yp,&w,&h);
X		*gcp = dateGC1;
X		break;
X	case 3: XParseGeometry(appResources.datePosition3,xp,yp,&w,&h);
X		*gcp = dateGC3;
X		break;
X	case 12: XParseGeometry(appResources.datePosition12,xp,yp,&w,&h);
X		 *gcp = dateGC12;
X		 break;
X    }
X}
X
X/* Global so can be called after appointments have changed */
Xvoid
XshadeButton(d,gc,x,y)
XDayButtonData *d;
XGC gc;
Xint x,y;
X{
X    Arg args[1];
X    char text[4];
X    int n;
X
X    if (gc == (GC)NULL)
X	getGCAndXY(numMonths,&gc,&x,&y);
X    n = countAppoints(d->day,d->month,d->year);
X    XFillRectangle(display,d->pixmap,shadeGC[n],0,0,50,50);
X    sprintf(text,"%d",d->day);
X    if (appResources.opaqueDates)
X	XDrawImageString(display,d->pixmap,gc,x,y,text,strlen(text));
X    else
X	XDrawString(display,d->pixmap,gc,x,y,text,strlen(text));
X    XtSetArg(args[0],XtNbitmap,d->pixmap);
X    XtSetValues(d->button,args,ONE);
X}
X
Xvoid
XselectDay(m,day,mon,year)
XMonthFormData *m;
Xint day,mon,year;
X{
X    int first,i;
X
X    first = firstDOW(mon,year);
X    for (i=0; i < 42; i++)
X	if (i == first+day-1) {
X	    XawToggleSetCurrent(radioGroup,m->days[i]->button);
X	    break;
X	}
X}
X
Xstatic void
XdayButtonCallbackProc(w,client_data,call_data)
XWidget w;
Xcaddr_t client_data,call_data;
X{
X    DayButtonData *d = (DayButtonData *)client_data;
X
X    if (d->day == 0)
X	return;
X    if (currentDayFormData == NULL)
X	currentDayFormData = createPopupDayFormData();
X    else
X	checkpointAppoints(currentDayFormData);
X    currentDayFormData->buttonData = d;
X    setDayFormData(currentDayFormData,d->day,d->month,d->year);
X}
END_OF_FILE
if test 5647 -ne `wc -c <'month.c'`; then
    echo shar: \"'month.c'\" unpacked with wrong size!
fi
# end of 'month.c'
fi
if test -f 'resources.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'resources.h'\"
else
echo shar: Extracting \"'resources.h'\" \(9114 characters\)
sed "s/^X//" >'resources.h' <<'END_OF_FILE'
X/*
X *	resources.h: All the resource definitions for xkal.
X *
X *	These are only used in xkal.c, other users should simply
X *	include app-resources.h for access to the resources after
X *	they've been loaded.
X *
X */
X
X/*
X * Non-widget resources obtained from the resource manager
X */
Xstatic XtResource resources[] = {
X    { "appoints", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,appoints), XtRImmediate, "~/.appoints" },
X    { "date", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,date), XtRImmediate, "" },
X    { "numMonths", "Int", XtRInt, sizeof(int),
X      XtOffset(AppResources *,numMonths), XtRImmediate, (XtPointer)1 },
X    { "bothShown", "Boolean", XtRBoolean, sizeof(Boolean),
X      XtOffset(AppResources *,bothShown), XtRImmediate, (XtPointer)True },
X    { "listOnly", "Boolean", XtRBoolean, sizeof(Boolean),
X      XtOffset(AppResources *,listOnly), XtRImmediate, (XtPointer)False },
X    { "silent", "Boolean", XtRBoolean, sizeof(Boolean),
X      XtOffset(AppResources *,silent), XtRImmediate, (XtPointer)False },
X    { "opaqueDates", "Boolean", XtRBoolean, sizeof(Boolean),
X      XtOffset(AppResources *,opaqueDates), XtRImmediate, (XtPointer)False },
X    { "dowLabels", "Boolean", XtRBoolean, sizeof(Boolean),
X      XtOffset(AppResources *,dowLabels), XtRImmediate, (XtPointer)False },
X
X    { "dateFont1", "Font", XtRFont, sizeof(Font),
X      XtOffset(AppResources *,dateFont1), XtRString, "*fixed*bold*" },
X    { "dateFont3", "Font", XtRFont, sizeof(Font),
X      XtOffset(AppResources *,dateFont3), XtRString, "*fixed*bold*" },
X    { "dateFont12", "Font", XtRFont, sizeof(Font),
X      XtOffset(AppResources *,dateFont12), XtRString, "*fixed*bold*" },
X
X    { "datePosition1", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,datePosition1), XtRImmediate, "+10+10" },
X    { "datePosition3", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,datePosition3), XtRImmediate, "+10+10" },
X    { "datePosition12", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,datePosition12), XtRImmediate, "+10+10" },
X
X    { "dateWidth1", "Int", XtRInt, sizeof(int),
X      XtOffset(AppResources *,dateWidth1), XtRImmediate, (XtPointer)50 },
X    { "dateWidth3", "Int", XtRInt, sizeof(int),
X      XtOffset(AppResources *,dateWidth3), XtRImmediate, (XtPointer)18 },
X    { "dateWidth12", "Int", XtRInt, sizeof(int),
X      XtOffset(AppResources *,dateWidth12), XtRImmediate, (XtPointer)10 },
X
X    { "dateHeight1", "Int", XtRInt, sizeof(int),
X      XtOffset(AppResources *,dateHeight1), XtRImmediate, (XtPointer)50 },
X    { "dateHeight3", "Int", XtRInt, sizeof(int),
X      XtOffset(AppResources *,dateHeight3), XtRImmediate, (XtPointer)18 },
X    { "dateHeight12", "Int", XtRInt, sizeof(int),
X      XtOffset(AppResources *,dateHeight12), XtRImmediate, (XtPointer)10 },
X
X    { "noDayShade", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,noDayShade), XtRImmediate, "wide_weave" },
X
X    { "shade1", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[1]), XtRImmediate, "gray3" },
X    { "shade2", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[2]), XtRImmediate, "gray3" },
X    { "shade3", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[3]), XtRImmediate, "light_gray" },
X    { "shade4", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[4]), XtRImmediate, "light_gray" },
X    { "shade5", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[5]), XtRImmediate, "gray" },
X    { "shade6", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[6]), XtRImmediate, "gray" },
X    { "shade7", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[7]), XtRImmediate, "flipped_gray" },
X    { "shade8", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[8]), XtRImmediate, "flipped_gray" },
X    { "shade9", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[9]), XtRImmediate, "flipped_gray" },
X    { "shade10", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[10]), XtRImmediate, "flipped_gray" },
X    { "shade11", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[11]), XtRImmediate, "flipped_gray" },
X    { "shade12", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[12]), XtRImmediate, "flipped_gray" },
X    { "shade13", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[13]), XtRImmediate, "flipped_gray" },
X    { "shade14", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[14]), XtRImmediate, "flipped_gray" },
X    { "shade15", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[15]), XtRImmediate, "flipped_gray" },
X    { "shade16", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[16]), XtRImmediate, "flipped_gray" },
X    { "shade17", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[17]), XtRImmediate, "flipped_gray" },
X    { "shade18", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[18]), XtRImmediate, "flipped_gray" },
X    { "shade19", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[19]), XtRImmediate, "flipped_gray" },
X    { "shade20", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[20]), XtRImmediate, "flipped_gray" },
X    { "shade21", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[21]), XtRImmediate, "flipped_gray" },
X    { "shade22", "String", XtRString, sizeof(String),
X      XtOffset(AppResources *,shade[22]), XtRImmediate, "flipped_gray" },
X
X    { "color1", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[1]), XtRString, "Green" },
X    { "color2", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[2]), XtRString, "Green" },
X    { "color3", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[3]), XtRString, "Blue" },
X    { "color4", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[4]), XtRString, "Blue" },
X    { "color5", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[5]), XtRString, "Yellow" },
X    { "color6", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[6]), XtRString, "Yellow" },
X    { "color7", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[7]), XtRString, "Red" },
X    { "color8", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[8]), XtRString, "Red" },
X    { "color9", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[9]), XtRString, "Red" },
X    { "color10", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[10]), XtRString, "Red" },
X    { "color11", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[11]), XtRString, "Red" },
X    { "color12", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[12]), XtRString, "Red" },
X    { "color13", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[13]), XtRString, "Red" },
X    { "color14", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[14]), XtRString, "Red" },
X    { "color15", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[15]), XtRString, "Red" },
X    { "color16", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[16]), XtRString, "Red" },
X    { "color17", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[17]), XtRString, "Red" },
X    { "color18", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[18]), XtRString, "Red" },
X    { "color19", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[19]), XtRString, "Red" },
X    { "color20", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[20]), XtRString, "Red" },
X    { "color21", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[21]), XtRString, "Red" },
X    { "color22", "Pixel", XtRPixel, sizeof(Pixel),
X      XtOffset(AppResources *,color[22]), XtRString, "Red" },
X
X    { "revision", "Revision", XtRString, sizeof(String),
X      XtOffset(AppResources *,revision), XtRImmediate, "" },
X};
X
X/*
X *	Non-widget resources settable on command line.
X */
Xstatic XrmOptionDescRec options[] = {
X    { "-appoints",	".appoints",	XrmoptionSepArg,	"~/.appoints" },
X    { "-date",		".date",	XrmoptionSepArg,	"" },
X    { "-numMonths",	".numMonths",	XrmoptionSepArg,	"1" },
X    { "-bothShown",	".bothShown",	XrmoptionNoArg,		"True" },
X    { "-nobothShown",	".bothShown",	XrmoptionNoArg,		"False" },
X    { "-listOnly",	".listOnly",	XrmoptionNoArg,		"True" },
X    { "-silent",	".silent",	XrmoptionNoArg,		"True" },
X    { "-opaqueDates",	".opaqueDates",	XrmoptionNoArg,		"True" },
X    { "-noopaqueDates",	".opaqueDates",	XrmoptionNoArg,		"False" },
X    { "-dowLabels",	".dowLabels",	XrmoptionNoArg,		"True" },
X    { "-nodowLabels",	".dowLabels",	XrmoptionNoArg,		"False" },
X};
END_OF_FILE
if test 9114 -ne `wc -c <'resources.h'`; then
    echo shar: \"'resources.h'\" unpacked with wrong size!
fi
# end of 'resources.h'
fi
if test -f 'schedule.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'schedule.c'\"
else
echo shar: Extracting \"'schedule.c'\" \(2630 characters\)
sed "s/^X//" >'schedule.c' <<'END_OF_FILE'
X/*
X *	schedule.c : The schedule editor window
X *
X *	$Id: schedule.c,v 1.1 90/11/07 11:23:13 ferguson Exp $
X */
X#include <X11/Intrinsic.h>
X#include <X11/Shell.h>
X#include <X11/StringDefs.h>
X#include <X11/Xaw/Form.h>
X#include <X11/Xaw/Command.h>
X#include <X11/Xaw/Cardinals.h>
X#include "widgets.h"
X#include "month.h"
X#include "day.h"
X#include "db.h"
X#include "date-strings.h"
X
Xextern int appointsChanged;
X
X/*
X * Functions defined in this file
X */
Xvoid createPopupSchedule();
Xstatic void dismissSchedProc(), applySchedProc();
X
X/*
X * Data defined in this file
X */
Xstatic Widget schedulePopupShell;
Xstatic DayFormData *scheduleDayFormDatas[7];
Xstatic void dismissSchedProc(),applySchedProc();
X
X/*	-	-	-	-	-	-	-	-	*/
X 
Xvoid
XcreatePopupSchedule()
X{
X    Widget form,dismiss,apply,w;
X    Arg args[1];
X    int dow,i;
X    char *s;
X
X    schedulePopupShell = XtCreatePopupShell("schedulePopupShell",
X				topLevelShellWidgetClass,toplevel,NULL,ZERO);
X    form = XtCreateManagedWidget("popupForm",formWidgetClass,schedulePopupShell,
X								NULL,ZERO);
X    dismiss = XtCreateManagedWidget("dismissSchedButton",commandWidgetClass,
X							form,NULL,ZERO);
X    apply = XtCreateManagedWidget("applySchedButton",commandWidgetClass,form,
X								NULL,ZERO);
X    XtAddCallback(dismiss,"callback",dismissSchedProc,NULL);
X    XtAddCallback(apply,"callback",applySchedProc,NULL);
X    w = NULL;
X    for (dow=0; dow < 7; dow++) {
X	scheduleDayFormDatas[dow] = createDayFormData(form);
X	XtSetArg(args[0],XtNfromHoriz,w);
X	XtSetValues(scheduleDayFormDatas[dow]->form,args,ONE);
X	XtSetArg(args[0],XtNlabel,longDayStr[dow]);
X	XtSetValues(scheduleDayFormDatas[dow]->date,args,ONE);
X	w = scheduleDayFormDatas[dow]->form;
X	for (i=0; i < 22; i++)
X	    if ((s=lookupScheduleDow(i,dow)) != NULL) {
X		XtSetArg(args[0],XtNstring,s);
X		XtSetValues(scheduleDayFormDatas[dow]->items[i]->text,args,ONE);
X	    }
X    }
X    XtPopup(schedulePopupShell,XtGrabNone);
X}
X
Xstatic void
XdismissSchedProc(w,client_data,call_data)
XWidget w;
Xcaddr_t client_data,call_data;
X{
X    XtPopdown(schedulePopupShell);
X    XtDestroyWidget(schedulePopupShell);
X}
X
Xstatic void
XapplySchedProc(w,client_data,call_data)
XWidget w;
Xcaddr_t client_data,call_data;
X{
X    Arg args[1];
X    char *new,*old;
X    int dow,i;
X
X    XtSetArg(args[0],XtNstring,&new);
X    for (dow=0; dow < 7; dow++)
X	for (i=0; i < 22; i++) {
X	    XtGetValues(scheduleDayFormDatas[dow]->items[i]->text,args,ONE);
X	    old = lookupScheduleDow(i,dow);
X	    if (new != old) {
X		if (*new == '\0')
X		    deleteScheduleDow(i,dow,new);
X		else
X		    addScheduleDow(i,dow,new);
X		appointsChanged = True;
X	    }
X	}
X    /* refresh display */
X}
END_OF_FILE
if test 2630 -ne `wc -c <'schedule.c'`; then
    echo shar: \"'schedule.c'\" unpacked with wrong size!
fi
# end of 'schedule.c'
fi
echo shar: End of archive 3 \(of 4\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 4 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
George Ferguson			ARPA: ferguson@cs.rochester.edu
University of Rochester		UUCP: {decvax,rutgers}!rochester!ferguson
Rochester  NY  14627		VOX:  (716) 275-2527