ssdken@watson.claremont.edu (Ken Nelson) (08/28/90)
Submitted-by: Ken Nelson <ssdken@watson.claremont.edu> Posting-number: Volume 8, Issue 104 Archive-name: xpeg/part02 #! /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 2 (of 2)." # Contents: xpeg1.0/pegbd.c xpeg1.0/xui.c # Wrapped by ssdken@watson on Fri Aug 24 10:13:38 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'xpeg1.0/pegbd.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xpeg1.0/pegbd.c'\" else echo shar: Extracting \"'xpeg1.0/pegbd.c'\" \(12816 characters\) sed "s/^X//" >'xpeg1.0/pegbd.c' <<'END_OF_FILE' X/*************************************************************************\ X* Xpeg 1.0 * X* * X* Copyright 1990, Kenneth C. Nelson * X* * X* Rights : I, Ken Nelson own Xpeg. I am donating the source * X* to the public domain with the restriction that nobody * X* sells it, or anything derived from it, for anything more * X* than media costs. Xpeg uses a dynamic object library * X* that I don't own. See the subdirectory dynobj for * X* restrictions on its use. * X* * X* Please feel free to modify Xpeg. See Todo for details. * X* * X\*************************************************************************/ X X/* X * pegbd.c - routines to update the internal storage of the pegboard. X * This is done with a Dynamic object, storing a list of X * person records. A person record has a name, a date last updated, X * and a location. Each of these fields also has an X Widget associated X * with it. X */ X X X#include <stdio.h> X X#include "pegbd.h" X#include "dyn.h" X X X X#define VALID_XPEG_STR "XPEG_FILE\n" X#define UNKNOWN_STR "Unknown" X X X X/* X * Routine which removes leading and trailing characters in string1 from string2 and X * returns copy of the trim string. X * X */ X Xextern char *strtrim(); X X X#include <X11/Intrinsic.h> X#include <X11/StringDefs.h> X Xextern char *strdup(); X X Xstatic char *group = NULL; /* The name of the group this pegboard tracks. */ Xstatic char *pegfilename = NULL; /* The name of the pegfile */ Xstatic char *username = NULL; /* The name of the user running Xpeg. */ X X X X/* X * dateString() - takes a number representing time and converts to string X * that represents the date as the Xpeg user wants it. X * TBD - for now the X * X */ X Xchar *dateString(time) X long time; X{ X return strdup(ctime(&time)); X} X X X X/* X * setUserName() - sets the name of the pegfile, used by update, save, and load. X * X*/ Xvoid setUserName(name) X{ X if (name != NULL) X username = strdup(name); X} X X X/* X * userName() - returns the name of the person running Xpeg. X * X */ X Xchar *userName() X{ X if (username == NULL) X return UNKNOWN_STR; X else X return username; X} X X X X/* X * personEditable() - returns TRUE if the person running this Xpeg can edit the persons X * location. X */ X Xint personEditable(personNum) X int personNum; X{ X int validPerson(); X Person *getPerson(); X X if (validPerson(personNum)) X { X return getPerson(personNum)->okay_to_edit; X } X else X { X return FALSE; X } X} X X X X X/* X * setPegfileName() - sets the name of the pegfile, used by update, save, and load. X * X*/ Xvoid setPegfileName(name) X{ X if (name != NULL) X pegfilename = strdup(name); X} X X X/* X * pegfileName() - returns the name of the current pegfile X * X */ X Xchar *pegfileName() X{ X return pegfilename; X} X X X X X/* X * setGroupName() - sets the name of the group this pegboard tracks. X * X */ X Xvoid setGroupName(name) X char *name; X{ X if (group != NULL) X { X free(NULL); X } X group = strdup(name); X} X X X/* X * groupName() - returns the name of the group or empty string if not set X * X */ X Xchar *groupName() X{ X if (group == NULL) X { X return ""; X } X else X { X return group; X } X} X X X X/* X * A dynamic array of people that is in the pegboard. X * X */ X X Xstatic DynObject people = (DynObject) NULL; X X X X X/* X * newPerson() - allocates a new person, this is a local routine. X * X */ X Xstatic Person *newPerson(name,date,location,okay_to_edit) X char *name; X char *date; X char *location; X int okay_to_edit; X X{ X Person *new_person; X char tmp[256]; X X new_person = (Person *) calloc(1,sizeof(Person)); X X /* X * Trim carriage returns, and update the Person record. X * X */ X X new_person->name = strtrim(name,"\n"); X new_person->date = strtrim(date,"\n"); X new_person->location = strtrim(location,"\n"); X new_person->wname = NULL; X new_person->wdate = NULL; X new_person->wlocation = NULL; X new_person->okay_to_edit = okay_to_edit; X X return new_person; X} X X X X X/* X * getPerson() - returns the numbered person record. X * this is a local routine. X * X */ X Xstatic Person *getPerson(number) X int number; X{ X return (Person *) DynGet(people,number); X} X X X X X/* X * firstPerson() - returns the number of the first person in the pegboard. X * X */ X Xint firstPerson() X{ X if (people != NULL) X return DynLow(people); X else X return 0; X} X X X X X/* X * lastPerson() - returns the number of the last person in the pegboard. X * X */ X Xint lastPerson() X{ X if (people != NULL) X { X return DynHigh(people); X } X else X { X return 0; X } X} X X X X/* X * numPeople() - returns the number of people in the pegboard. X * X */ X Xint numPeople() X{ X if (people != NULL) X return DynSize(people); X else X return 0; X} X X X X/* X * nextPerson() - returns the number of the next person in the pegboard. X * kind of a kludge in that it only increments a number, X * but it reads nicer than i++. X */ X Xint nextPerson(personNum) X{ X return personNum+1; X} X X X X/* X * validPerson() - returns TRUE if personNum identifies a valid person, FALSE otherwise. X * X */ X Xstatic int validPerson(personNum) X{ X return (personNum >= firstPerson() && personNum <= lastPerson()); X} X X X X X X/* X * setPersonName() - sets the name of the numbered person, does nothing if X * the person number is not valid. X * X */ X Xvoid setPersonName(personNum,name) X int personNum; X char *name; X{ X Person *person; X X if (validPerson(personNum)) X { X person = getPerson(personNum); X if (person->name != NULL) X { X cfree(person->name); X } X person->name = strtrim(name,"\n"); /* add name without leading of trailing \n's */ X } X} X X X/* X * setPersonNameWidget() - sets the name widget of the numbered person, does nothing if X * the person number is not valid. X * X */ X Xvoid setPersonNameWidget(personNum,w) X int personNum; X Widget w; X{ X Person *person; X X if (validPerson(personNum)) X { X person = getPerson(personNum); X person->wname = w; X } X} X X X X/* X * personName() - returns the name of the numbered person, or Unknown string. X * X */ X X Xchar *personName(personNum) X int personNum; X{ X X if (validPerson(personNum)) X { X return getPerson(personNum)->name; X } X else X { X return UNKNOWN_STR; X } X} X X X X/* X * personNameWidget() - returns the name of the numbered person, or NULL. X * X */ X X XWidget personNameWidget(personNum) X int personNum; X{ X X if (validPerson(personNum)) X { X return getPerson(personNum)->wname; X } X else X { X return NULL; X } X} X X X X X/* X * personDate() - returns the date that this person was last updated into X * the pegboard, or uknown string. X * X */ X X Xchar *personDate(personNum) X int personNum; X{ X X if (validPerson(personNum)) X { X return getPerson(personNum)->date; X } X else X { X return UNKNOWN_STR; X } X} X X X X/* X * personDateWidget() - returns the date widget of the numbered person, or NULL. X * X */ X X XWidget personDateWidget(personNum) X int personNum; X{ X X if (validPerson(personNum)) X { X return getPerson(personNum)->wdate; X } X else X { X return NULL; X } X} X X X X/* X * setPersonDate() - sets the date of the numbered person, does nothing if X * the person number is not valid. X * X */ X Xvoid setPersonDate(personNum,date) X int personNum; X char *date; X{ X Person *person; X X if (validPerson(personNum)) X { X person = getPerson(personNum); X if (person->date != NULL) X { X cfree(person->date); X } X person->date = strtrim(date,"\n"); /* add name without leading of trailing \n's */ X } X} X X X X/* X * setPersonDateWidget() - sets the date widget of the numbered person, does nothing if X * the person number is not valid. X * X */ X Xvoid setPersonDateWidget(personNum,w) X int personNum; X Widget w; X{ X Person *person; X X if (validPerson(personNum)) X { X person = getPerson(personNum); X person->wdate = w; X } X} X X X X X X/* X * personLocation() - returns the location of this person, or the unknown string. X * X */ X X Xchar *personLocation(personNum) X int personNum; X{ X X if (validPerson(personNum)) X { X return getPerson(personNum)->location; X } X else X { X return UNKNOWN_STR; X } X} X X X X/* X * personLocationWidget() - returns the location of the numbered person, or NULL. X * X */ X X XWidget personLocationWidget(personNum) X int personNum; X{ X X if (validPerson(personNum)) X { X return getPerson(personNum)->wlocation; X } X else X { X return NULL; X } X} X X X X X/* X * setPersonLocation() - sets the location of the numbered person, does nothing if X * the person number is not valid. X * X */ X Xvoid setPersonLocation(personNum,loc) X int personNum; X char *loc; X{ X Person *person; X X if (validPerson(personNum)) X { X person = getPerson(personNum); X if (person->location != NULL) X { X cfree(person->location); X } X person->location = strtrim(loc,"\n"); /* add loc without leading of trailing \n's */ X } X} X X X/* X * setPersonLocationWidget() - sets the location widget of the numbered person, does nothing if X * the person number is not valid. X * X */ X Xvoid setPersonLocationWidget(personNum,w) X int personNum; X Widget w; X{ X Person *person; X X if (validPerson(personNum)) X { X person = getPerson(personNum); X person->wlocation = w; X } X} X X X X X X X/* X * addPerson() - adds the person into the pegboard, no checking to see if the X * name of the person matches one already there,etc... X */ X Xvoid addPerson(name,date,location,changeable) X char *name; X char *date; X char *location; X int changeable; X{ X Person new_person; X X if (people == NULL) X { X /* X * Create a dynmaic array realloced every 100 inserts X * X */ X X people = DynCreate(sizeof(Person),100); X } X DynAdd(people,newPerson(name,date,location,changeable)); X} X X X X X/* X * buildXpegBoard() - reads the Xpeg file and builds up the board. X * X*/ X X Xvoid buildXpegBoard(filename) X char *filename; X{ X FILE *file = NULL; X char line[256]; X char name[256],date[256],location[256]; X int okay_to_edit = FALSE; X X X file = fopen(filename,"r"); X if (file == NULL) X { X printf("xpeg: Could not open %s.\n",filename); X } X else X { X fgets(line,256,file); X if (strcmp(line,VALID_XPEG_STR) != 0) X { X printf("xpeg: Invalid Xpeg file: %s\n",filename); X exit(1); X } X else X { X fgets(line,256,file); X setGroupName(line); X X while (!feof(file)) X { X fgets(name,256,file); X X if (strcmp(userName(),strtrim(name,"\n")) == 0) X { X okay_to_edit = TRUE; X } X else X { X okay_to_edit = FALSE; X } X X fgets(date,256,file); X fgets(location,256,file); X if (!feof(file)) X { X addPerson(name,date,location,okay_to_edit); X } X } X fclose(file); X } X } X X} X X X X X/* X * updateXpegBoard() - re-reads the file and updates any date and location X * information that has changed. X * X */ X Xvoid updateXpegBoard(filename) X char *filename; X{ X FILE *file = NULL; X char line[256]; X char name[256],date[256],location[256]; X int personNum; X int num_people; X X num_people = numPeople(people); X X file = fopen(filename,"r"); X if (file == NULL) X { X printf("Xpeg: Could not open %s.\n",filename); X } X else X { X fgets(line,256,file); X if (strcmp(line,VALID_XPEG_STR) != 0) X { X printf("Xpeg: Invalid Xpeg file: %s\n",filename); X exit(1); X } X else X { X fgets(line,256,file); X setGroupName(line); X X personNum = firstPerson(); X while (!feof(file)) X { X fgets(name,256,file); X fgets(date,256,file); X fgets(location,256,file); X X /* X * If more people have been added then add them. X * else just update their information. X * X */ X X if (!feof(file)) X { X if (personNum > num_people) X { X addPerson(name,date,location,FALSE); X } X else X { X setPersonName(personNum,strtrim(name,"\n")); X setPersonDate(personNum,strtrim(date,"\n")); X setPersonLocation(personNum,strtrim(location,"\n")); X } X personNum = nextPerson(personNum); X } X } X fclose(file); X } X } X X} X X X X X X/* X * saveXpegBoard() - saves the current board into the xpeg file. X * X */ X Xvoid saveXpegBoard(filename) X char *filename; X{ X FILE *file = NULL; X int personNum; X char *groupName(); X char *strtrim(); X X file = fopen(filename,"w"); X if (file != NULL) X { X fprintf(file,"%s",VALID_XPEG_STR); X fprintf(file,"%s\n",strtrim(groupName(),"\n")); X if (numPeople() > 0) X { X for (personNum = firstPerson(); personNum <= lastPerson(); personNum = nextPerson(personNum)) X { X fprintf(file,"%s\n%s\n%s\n",personName(personNum), X personDate(personNum), X personLocation(personNum) X ); X } X } X fclose(file); X } X else X { X printf("Xpeg: Error saving pegboard file: %s\n",filename); X } X} X X X END_OF_FILE if test 12816 -ne `wc -c <'xpeg1.0/pegbd.c'`; then echo shar: \"'xpeg1.0/pegbd.c'\" unpacked with wrong size! fi # end of 'xpeg1.0/pegbd.c' fi if test -f 'xpeg1.0/xui.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xpeg1.0/xui.c'\" else echo shar: Extracting \"'xpeg1.0/xui.c'\" \(21089 characters\) sed "s/^X//" >'xpeg1.0/xui.c' <<'END_OF_FILE' X/*************************************************************************\ X* Xpeg 1.0 * X* * X* Copyright 1990, Kenneth C. Nelson * X* * X* Rights : I, Ken Nelson own Xpeg. I am donating the source * X* to the public domain with the restriction that nobody * X* sells it, or anything derived from it, for anything more * X* than media costs. Xpeg uses a dynamic object library * X* that I don't own. See the subdirectory dynobj for * X* restrictions on its use. * X* * X* Please feel free to modify Xpeg. See Todo for details. * X* * X\*************************************************************************/ X X/* X * xui.c - builds the X interface to Xpeg. X * X */ X X#include <X11/Intrinsic.h> X#include <X11/StringDefs.h> X#include <X11/Xaw/Box.h> X#include <X11/Xaw/Label.h> X#include <X11/Xaw/Command.h> X#include <X11/Xaw/Paned.h> X#include <X11/Xaw/AsciiText.h> X#include <X11/Xaw/Dialog.h> X#include <X11/Shell.h> X#include <X11/Xaw/Form.h> X#include <X11/Xaw/Viewport.h> X X#include "pegbd.h" X X X#include "xpeg.icon" X X X#define DEFAULT_HELP "XPeg, a tool for the 90's." X#define ABOUT_HELP "About Xpeg." X#define QUIT_HELP "Quit Xpeg, no confirmation." X#define SAVE_HELP "Save any changes in the pegboard." X#define UPDATE_HELP "Rescan status of people in the pegboard." X#define NEW_HELP "Add a new person to the pegboard." X#define GROUP_HELP "Change, or edit the name of the group this pegboard tracks." X X X#define ABOUT_STR \ X" Xpeg 1.0\n\ X By\n\ X Ken Nelson\n\n\ X Send me an email if use Xpeg.\n\ X ssdken@jarthur.claremont.edu\n\n\ X Enjoy!!\n\ X" X X#define NAME_WIDTH 150 X#define DATE_WIDTH 140 X#define LOC_WIDTH 300 X#define XPEG_WIDTH 690 X X/* X * Widgets that need (or it is nice) to have global. X * X */ X XWidget titleBar; XWidget groupBar; XWidget toplevel; XWidget helpArea; XWidget buttonBox; XWidget viewport; XWidget commandPane; XWidget groupDialogShell; XWidget newPersonFormShell; XWidget nameEditor; XWidget locEditor; XWidget groupEditor; XWidget aboutDialogShell; X X#include <stdio.h> X X X X/* X * Action Routines X * X */ X X X/*ARGSUSED*/ Xvoid ACTsetHelp(w,event) X Widget w; X XButtonEvent event; X{ X char *widgetLabel; X X XtVaGetValues(w,"label",&widgetLabel,NULL); X X if (strcmp(widgetLabel,"quit") == 0) X { X XtVaSetValues(helpArea,XtNlabel,QUIT_HELP,NULL); X } X else X if (strcmp(widgetLabel,"save") == 0) X { X XtVaSetValues(helpArea,XtNlabel,SAVE_HELP,NULL); X } X else X if (strcmp(widgetLabel,"update") == 0) X { X XtVaSetValues(helpArea,XtNlabel,UPDATE_HELP,NULL); X } X else X if (strcmp(widgetLabel,"new") == 0) X { X XtVaSetValues(helpArea,XtNlabel,NEW_HELP,NULL); X } X else X if (strcmp(widgetLabel,"group") == 0) X { X XtVaSetValues(helpArea,XtNlabel,GROUP_HELP,NULL); X } X else X if (strcmp(widgetLabel,"about") == 0) X { X XtVaSetValues(helpArea,XtNlabel,ABOUT_HELP,NULL); X } X else X { X XtVaSetValues(helpArea,XtNlabel,DEFAULT_HELP,NULL); X } X X} X X X/*ARGSUSED*/ Xvoid ACTresetHelp(w,event) X Widget w; X XButtonEvent event; X{ X XtVaSetValues(helpArea,XtNlabel,DEFAULT_HELP,NULL); X} X X X X X/* X * Call Back Routines X * X */ X X/* X * Callback for About button X * X */ X X X/*ARGSUSED*/ Xvoid CBabout(w,client_data,call_data) X Widget w; X XtPointer client_data; X XtPointer call_data; X{ X Position x,y; X Dimension width,height; X X /* X * Locate where the invoking widget is. X * So we can place the popup in the middle. X * X */ X X XtVaGetValues(w,"width",&width,"height",&height,NULL); X XtTranslateCoords(toplevel, X (Position) width/2, /* X */ X (Position) height/2, /* Y */ X &x,&y X ); X X XtVaSetValues(aboutDialogShell, X XtNx,x, X XtNy,y, X NULL X ); X X XtPopup(aboutDialogShell,XtGrabNonexclusive); X} X X X/* X * CBaboutDismiss() - callback for the dismiss button of the about popup. X * X */ X X/*ARGUSED*/ Xvoid CBaboutDismiss(w,client_data,call_data) X Widget w; X XtPointer client_data; X XtPointer call_data; X{ X XtPopdown(aboutDialogShell); X} X X X X/* X * Callback for the Quit Button X * X */ X X/*ARGSUSED*/ Xvoid CBquit(w,client_data,call_data) X Widget w; X XtPointer client_data; X XtPointer call_data; X{ X exit(0); X} X X X/* X * CBupdate() - Callback for update button. X * X */ X X/*ARGSUSED*/ Xvoid CBupdate(w,client_data,call_data) X Widget w; X XtPointer client_data; X XtPointer call_data; X{ X int personNum; X void addXpegPerson(); X void setGroupBar(); X X /* X * Use updateXpegBoard to read in the file X * X */ X X updateXpegBoard(pegfileName()); X X /* X * Now take the info read in and update what the X * user sees. X * X */ X X setGroupBar(groupName()); X if (numPeople() > 0) X { X for (personNum=firstPerson(); personNum<=lastPerson(); personNum=nextPerson(personNum)) X { X /* X * If there is a widget for this person then update it, else X * this is a new person and the X pegboard needs to be updated X * X */ X X if (personNameWidget(personNum) != NULL) X { X XtVaSetValues(personNameWidget(personNum), X XtNlabel,personName(personNum), X XtNwidth,NAME_WIDTH, X NULL X ); X XtVaSetValues(personDateWidget(personNum), X XtNlabel,personDate(personNum), X XtNwidth,DATE_WIDTH, X NULL X ); X XtVaSetValues(personLocationWidget(personNum), X XtNstring,personLocation(personNum), X XtNwidth,LOC_WIDTH, X NULL X ); X X } X else X { X addXpegPerson(personNum, X personName(personNum), X personDate(personNum), X personLocation(personNum) X ); X } X } X } X X} X X X X/* X * CBsave() - callback for the save button. X * X */ X X X/*ARGSUSED*/ Xvoid CBsave(w,client_data,call_data) X Widget w; X XtPointer client_data; X XtPointer call_data; X{ X int personNum; X char *location; X char *date; X X /* X * update the strings in the person record, from the X * text editors. X * X */ X X if (numPeople() > 0) X { X for (personNum=firstPerson(); personNum<=lastPerson(); personNum=nextPerson(personNum)) X { X if (personLocationWidget(personNum) != NULL) X { X XtVaGetValues(personLocationWidget(personNum), X "string",&location, X NULL X ); X X /* X * if the location has changed update the time stamp in the pegboard and X * on the screen. Also update the new location in the pegfile. X */ X X if (strcmp(location,personLocation(personNum)) != 0) X { X date = dateString(time(0)); X X XtVaSetValues(personDateWidget(personNum), X XtNlabel,date, X XtNwidth,DATE_WIDTH, X NULL X ); X X setPersonDate(personNum,date); X setPersonLocation(personNum,location); X } X } X } X } X X saveXpegBoard(pegfileName()); X X} X X X/* X * CBnew() - callback for the new button. X * Pops up the new person form. X * X */ X X X/*ARGSUSED*/ Xvoid CBnew(w,client_data,call_data) X Widget w; X XtPointer client_data; X XtPointer call_data; X{ X X Position x,y; X Dimension width,height; X X /* X * Locate where the invoking widget is. X * So we can place the popup in the middle. X * X */ X X XtVaGetValues(w,"width",&width,"height",&height,NULL); X XtTranslateCoords(toplevel, X (Position) width/2, /* X */ X (Position) height/2, /* Y */ X &x,&y X ); X X XtVaSetValues(newPersonFormShell, X XtNx,x, X XtNy,y, X NULL X ); X X XtPopup(newPersonFormShell,XtGrabNonexclusive); X X} X X X X/* X * CBgroup() - callback for the group button. X * X */ X X X/*ARGSUSED*/ Xvoid CBgroup(w,client_data,call_data) X Widget w; X XtPointer client_data; X XtPointer call_data; X{ X Position x,y; X Dimension width,height; X X XtVaGetValues(w,"width",&width,"height",&height,NULL); X XtTranslateCoords(toplevel, X (Position) width/2, /* X */ X (Position) height/2, /* Y */ X &x,&y X ); X X XtVaSetValues(groupDialogShell, X XtNx,x, X XtNy,y, X NULL X ); X X X XtPopup(groupDialogShell,XtGrabNonexclusive); X} X X X/* X * CBgroupOk() - callback for the change group dialog OK button. X * X */ X X X/*ARGSUSED*/ Xvoid CBgroupOk(w,dialog,call_data) X Widget w; X Widget dialog; /* The dialog this button was in. */ X XtPointer call_data; X{ X char *group; X void setGroupBar(); X X XtVaGetValues(groupEditor,"string",&group); X setGroupBar(group); X X /* X * Set the group name to the one in the title bar X */ X X setGroupName(group); X X XtPopdown(groupDialogShell); X X} X X X/* X * CBnewPersonAdd() - callback for the change group dialog OK button. X * X */ X X X/*ARGSUSED*/ Xvoid CBnewPersonAdd(w,client_data,call_data) X Widget w; X XtPointer client_data; X XtPointer call_data; X{ X char *name,*location; X void addXpegPerson(); X char *date; X X XtPopdown(newPersonFormShell); X X XtVaGetValues(nameEditor,"string",&name); X XtVaGetValues(locEditor,"string",&location); X date = dateString(time(0)); X addPerson(name,date,location,TRUE); X addXpegPerson(lastPerson(),name,date,location); X} X X X X X/* X * CBnewPersonCancel() - callback for the add new person cancel button. X * X */ X X X/*ARGSUSED*/ Xvoid CBnewPersonCancel(w,dialog,call_data) X Widget w; X Widget dialog; /* The dialog this button was in. */ X XtPointer call_data; X{ X XtPopdown(newPersonFormShell); X} X X Xvoid setTitleBar(title) X char *title; X{ X XtVaSetValues(titleBar,XtNlabel,title,NULL); X} X X XWidget addTitleBar(parent,title) X Widget parent; X char *title; X{ X return XtVaCreateManagedWidget( X "titlebar", X labelWidgetClass, X parent, X XtNlabel,title, X NULL X ); X} X X XWidget addGroupBar(parent,group) X Widget parent; X char *group; X{ X return XtVaCreateManagedWidget( X "groupbar", X labelWidgetClass, X parent, X XtNlabel,group, X NULL X ); X} X Xvoid setGroupBar(group) X char *group; X{ X XtVaSetValues(groupBar,XtNlabel,group,NULL); X} X X X Xchar *groupBarStr() X{ X char *group; X X XtVaGetValues(groupBar,"string",&group,NULL); X return group; X X} X X X/* X * buildGroupDialog() - Builds the group dialog and returns the shell that holds it. X * X */ X XWidget buildGroupDialog(parent) X Widget parent; X{ X Widget popupShell; X Widget dialog,button,label; X X X popupShell = XtCreatePopupShell( X "groupShell", X transientShellWidgetClass, X parent, X NULL, X 0 X ); X X dialog = XtVaCreateManagedWidget( X "groupDialog", X formWidgetClass, X popupShell, X NULL X ); X X X label = XtVaCreateManagedWidget( X "groupDialogLabel", X labelWidgetClass, X dialog, X XtNborderWidth,0, X XtNlabel,"Group Description: ", X NULL X ); X X groupEditor = XtVaCreateManagedWidget( X "groupEditor", X asciiTextWidgetClass, X dialog, X XtNfromHoriz,label, X XtNstring,groupName(), X XtNwidth,400, X XtNeditType,XawtextEdit, X NULL X ); X X X button = XtVaCreateManagedWidget( X "groupDialogButton", X commandWidgetClass, X dialog, X XtNlabel,"OK", X XtNfromVert,label, X NULL X ); X X XtAddCallback(button,XtNcallback,CBgroupOk,dialog); X return popupShell; X} X X X X X/* X * buildAboutDialog() - Builds the about dialog and returns the shell that holds it. X * X */ X XWidget buildAboutDialog(parent) X Widget parent; X{ X Widget popupShell; X Widget dialog,button,label; X X X popupShell = XtCreatePopupShell( X "About", X transientShellWidgetClass, X parent, X NULL, X 0 X ); X X dialog = XtVaCreateManagedWidget( X "aboutForm", X formWidgetClass, X popupShell, X NULL X ); X X X label = XtVaCreateManagedWidget( X "groupDialogLabel", X labelWidgetClass, X dialog, X XtNborderWidth,0, X XtNjustify,XtJustifyCenter, X XtNlabel,ABOUT_STR, X NULL X ); X X X button = XtVaCreateManagedWidget( X "aboutDismissButton", X commandWidgetClass, X dialog, X XtNlabel,"Dismiss", X XtNfromVert,label, X NULL X ); X X XtAddCallback(button,XtNcallback,CBaboutDismiss,dialog); X X return popupShell; X} X X X XWidget buildNewPersonForm(parent) X Widget parent; X{ X X Widget popupShell; X Widget form; X Widget addButton,cancelButton; X Widget nameLabel,locLabel; X X X popupShell = XtCreatePopupShell( X "NewPerson", X transientShellWidgetClass, X parent, X NULL, X 0 X ); X X form = XtVaCreateManagedWidget( X "newPersonForm", X formWidgetClass, X popupShell, X NULL X ); X X nameLabel = XtVaCreateManagedWidget( X "newPersonLabel", X labelWidgetClass, X form, X XtNlabel,"Name :", X XtNborderWidth,0, X NULL X ); X X nameEditor = XtVaCreateManagedWidget( X "nameEditor", X asciiTextWidgetClass, X form, X XtNwidth,300, X XtNeditType,XawtextEdit, X XtNfromHoriz,nameLabel, X NULL X ); X X locLabel = XtVaCreateManagedWidget( X "newPersonLabel", X labelWidgetClass, X form, X XtNlabel,"Enter Location: ", X XtNfromVert,nameLabel, X XtNborderWidth,0, X NULL X ); X X X locEditor = XtVaCreateManagedWidget( X "locationEditor", X asciiTextWidgetClass, X form, X XtNwidth,300, X XtNeditType,XawtextEdit, X XtNfromVert,nameEditor, X XtNfromHoriz,locLabel, X NULL X ); X X X X cancelButton = XtVaCreateManagedWidget( X "newPersonCancel", X commandWidgetClass, X form, X XtNlabel,"cancel", X XtNfromVert,locLabel, X NULL X ); X X X XtAddCallback( X cancelButton, X XtNcallback, X CBnewPersonCancel, X NULL X ); X X X addButton = XtVaCreateManagedWidget( X "newPersonAdd", X commandWidgetClass, X form, X XtNlabel,"Add", X XtNfromHoriz,cancelButton, X XtNfromVert,locLabel, X NULL X ); X XtAddCallback( X addButton, X XtNcallback, X CBnewPersonAdd, X NULL X ); X X X return popupShell; X X} X X X XWidget addXpegButtonArea(parent) X Widget parent; X { X Widget buttonbox; X Widget button,label; X XtTranslations buttonTranslations; X X X /* X * Append to the translation table for thse buttons so X * that help is updated on entry and exit. X * X */ X X static char buttonTranslationsStr[] = "#override\n\ X <EnterWindow> : highlight() sethelp() \n\ X <LeaveWindow> : reset() resethelp() "; X X /* X * These are the actions that update the help based on widget label, X * and reset the help to the default help. X * X */ X X static XtActionsRec buttonActions[] = { X {"sethelp",ACTsetHelp}, X {"resethelp",ACTresetHelp} X }; X X X buttonTranslations = XtParseTranslationTable(buttonTranslationsStr); X X X /* X * Setup the actions that provide the help when entering a window. X * X */ X X X XtAddActions(buttonActions,XtNumber(buttonActions)); X X X /* X * Now create an Athena Box widget which will manage these X * buttons. X */ X X buttonbox = XtVaCreateManagedWidget( X "buttonbox", X boxWidgetClass, X parent, X XtNwidth,200, X XtNheight,200, X NULL X ); X X /* X * And then the buttons, which are Athena Command Widgets. X * X */ X X button = XtVaCreateManagedWidget( X "about", X commandWidgetClass, X buttonbox, X XtNlabel,"about", X NULL X ); X X X XtAddCallback(button,XtNcallback,CBabout,NULL); X XtOverrideTranslations(button,buttonTranslations); X X button = XtVaCreateManagedWidget( X "quit", X commandWidgetClass, X buttonbox, X XtNlabel,"quit", X NULL X ); X X XtAddCallback(button,XtNcallback,CBquit,NULL); X XtOverrideTranslations(button,buttonTranslations); X X X X button = XtVaCreateManagedWidget( X "update", X commandWidgetClass, X buttonbox, X XtNlabel,"update", X NULL X ); X XtAddCallback(button,XtNcallback,CBupdate,NULL); X XtOverrideTranslations(button,buttonTranslations); X X X button = XtVaCreateManagedWidget( X "save", X commandWidgetClass, X buttonbox, X XtNlabel,"save", X NULL X ); X XtAddCallback(button,XtNcallback,CBsave,NULL); X XtOverrideTranslations(button,buttonTranslations); X X button = XtVaCreateManagedWidget( X "new", X commandWidgetClass, X buttonbox, X XtNlabel,"new", X NULL X ); X XtAddCallback(button,XtNcallback,CBnew,NULL); X XtOverrideTranslations(button,buttonTranslations); X X X button = XtVaCreateManagedWidget( X "group", X commandWidgetClass, X buttonbox, X XtNlabel,"group", X NULL X ); X XtAddCallback(button,XtNcallback,CBgroup,NULL); X XtOverrideTranslations(button,buttonTranslations); X X X label = XtVaCreateManagedWidget( X "yourusername", X labelWidgetClass, X buttonbox, X XtNlabel,"Your Username: ", X XtNborderWidth,0, X NULL X ); X X label = XtVaCreateManagedWidget( X "username", X labelWidgetClass, X buttonbox, X XtNlabel,userName(), X XtNborderWidth,0, X NULL X ); X X return buttonbox; X} X X X Xvoid addXpegPerson(personNumber,name,date,loc) X int personNumber; X char *name; X char *date; X char *loc; X{ X Widget box; X Widget wname,wdate,wloc; X char text[256]; X Person *person; X X X box = XtVaCreateManagedWidget( X tmpnam(text), X boxWidgetClass, X commandPane, X NULL X ); X X XawPanedAllowResize(box,FALSE); X X wname = XtVaCreateManagedWidget( X tmpnam(text), X labelWidgetClass, X box, X XtNlabel,name, X XtNwidth,NAME_WIDTH, X NULL X ); X X wdate = XtVaCreateManagedWidget( X tmpnam(text), X labelWidgetClass, X box, X XtNlabel,date, X XtNwidth,DATE_WIDTH, X NULL X ); X X if (personEditable(personNumber)) X { X wloc = XtVaCreateManagedWidget( X tmpnam(text), X asciiTextWidgetClass, X box, X XtNstring,loc, X XtNwidth,LOC_WIDTH, X XtNeditType,XawtextEdit, X NULL X ); X } X else X { X wloc = XtVaCreateManagedWidget( X tmpnam(text), X asciiTextWidgetClass, X box, X XtNstring,loc, X XtNwidth,LOC_WIDTH, X XtNeditType,XawtextRead, X NULL X ); X } X X /* X * Update this persons Widgets. X * X */ X X setPersonNameWidget(personNumber,wname); X setPersonDateWidget(personNumber,wdate); X setPersonLocationWidget(personNumber,wloc); X X} X X X X X/* X * initXpegInterface() - parses the command line for xtoolkit options, X * and then makes a toplevel shell. X*/ X Xvoid initXpegInterface(argc,argv) X int *argc; X char **argv; X{ X X X toplevel = XtInitialize( X argv[0], X (char *)xpeg_version(), X NULL, X 0, X argc, X argv X ); X X} X X X Xvoid addXpegIcon() X{ X Pixmap icon_pixmap; X X icon_pixmap = XCreateBitmapFromData(XtDisplay(toplevel), X RootWindowOfScreen(XtScreen(toplevel)), X xpeg_bits, X xpeg_width, X xpeg_height X ); X XtVaSetValues(toplevel,XtNiconPixmap,icon_pixmap,NULL); X} X X X/* X * buildXpegInterface() - does just that, builds the X interface. X * X */ X Xvoid buildXpegInterface() X{ X X int personNum; X X X addXpegIcon(); X X commandPane = XtVaCreateManagedWidget("commandpane", X panedWidgetClass, X toplevel, X XtNwidth,XPEG_WIDTH, X NULL X ); X X titleBar = addTitleBar(commandPane,(char *)xpeg_version()); X X groupBar = addGroupBar(commandPane,groupName()); X groupDialogShell = buildGroupDialog(toplevel); X aboutDialogShell = buildAboutDialog(toplevel); X newPersonFormShell = buildNewPersonForm(toplevel); X X X helpArea = XtVaCreateManagedWidget( X "help", X labelWidgetClass, X commandPane, X XtNlabel,DEFAULT_HELP, X NULL X ); X X X XawPanedAllowResize(titleBar,FALSE); X X /* X * Add the button command area. X * X */ X X buttonBox = addXpegButtonArea(commandPane); X XawPanedAllowResize(buttonBox,FALSE); X X X /* X * Now for each person read in from the pegboard file, add them to X * the interface. X * X */ X X X if (numPeople() > 0) X { X for (personNum = firstPerson(); personNum <= lastPerson(); personNum = nextPerson(personNum)) X { X addXpegPerson(personNum, X personName(personNum), X personDate(personNum), X personLocation(personNum) X ); X } X } X X} X X X X/* X * runXpegInterface() - realizes the toplevel x widget, and then does the X event loop. X * X */ X Xvoid runXpegInterface() X{ X XtRealizeWidget(toplevel); /* Realize the widgets */ X XtMainLoop(); X} X END_OF_FILE if test 21089 -ne `wc -c <'xpeg1.0/xui.c'`; then echo shar: \"'xpeg1.0/xui.c'\" unpacked with wrong size! fi # end of 'xpeg1.0/xui.c' fi echo shar: End of archive 2 \(of 2\). cp /dev/null ark2isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both 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 Keywords: dan ---------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com Opinions expressed reflect those of the author only.