home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2057 / day.c next >
Encoding:
C/C++ Source or Header  |  1990-12-28  |  5.2 KB  |  214 lines

  1. /*
  2.  *    day.c : The day windows
  3.  *
  4.  *    $Id: day.c,v 1.1 90/11/07 11:22:38 ferguson Exp $
  5.  */
  6. #include <X11/Intrinsic.h>
  7. #include <X11/Shell.h>
  8. #include <X11/StringDefs.h>
  9. #include <X11/Xaw/Form.h>
  10. #include <X11/Xaw/Command.h>
  11. #include <X11/Xaw/Label.h>
  12. #include <X11/Xaw/AsciiText.h>
  13. #include <X11/Xaw/Cardinals.h>
  14. #include "widgets.h"
  15. #include "month.h"
  16. #include "day.h"
  17. #include "db.h"
  18. #include "date-strings.h"
  19.  
  20. extern int appointsChanged;
  21.  
  22. /*
  23.  * Functions defined in this file
  24.  */
  25. DayFormData *createDayFormData(),*createPopupDayFormData();
  26. void setDayFormData();
  27. void checkpointAppoints();
  28.  
  29. static void textEventProc(),dismissProc(),selectProc(),unselectProc();
  30.  
  31. /*
  32.  * Data defined in this file
  33.  */
  34. DayFormData *currentDayFormData;
  35.  
  36. static int dayAppointsChanged;        /* fast, local check */
  37.  
  38. /*    -    -    -    -    -    -    -    -    */
  39.  
  40. DayFormData *
  41. createDayFormData(parent)
  42. Widget parent;
  43. {
  44.     DayFormData *d;
  45.     DayTextData *t;
  46.     Arg args[3];
  47.     int i;
  48.     char *time="XX:XX";
  49.  
  50.     d = XtNew(DayFormData);
  51.     d->form = XtCreateManagedWidget("dayForm",formWidgetClass,parent,
  52.                                 NULL,ZERO);
  53.     d->date = XtCreateManagedWidget("dayLabel",labelWidgetClass,d->form,
  54.                                 NULL,ZERO);
  55.     XtSetArg(args[0],XtNfromVert,d->date);
  56.     for (i = 0; i < 22; i++) {
  57.     t = d->items[i] = XtNew(DayTextData);
  58.     XtSetArg(args[1],XtNfromHoriz,NULL);
  59.     if (i < 20)
  60.         sprintf(time,"%2d:%02d",8+i/2,i%2*30);
  61.     else
  62.         sprintf(time,"NOTES");
  63.     XtSetArg(args[2],XtNlabel,time);
  64.     t->time = XtCreateManagedWidget("timeLabel",labelWidgetClass,
  65.                             d->form,args,THREE);
  66.     XtSetArg(args[1],XtNfromHoriz,t->time);
  67.     t->text = XtCreateManagedWidget("textText",asciiTextWidgetClass,
  68.                             d->form,args,TWO);
  69.     XtAddEventHandler(t->text,KeyPressMask,False,textEventProc,NULL);
  70.     XtSetArg(args[0],XtNfromVert,t->time);
  71.     }
  72.     return(d);
  73. }
  74.  
  75. DayFormData *
  76. createPopupDayFormData()
  77. {
  78.     Widget shell,form,select,dismiss,unselect;
  79.     DayFormData *d;
  80.  
  81.     shell = XtCreatePopupShell("popupShell",topLevelShellWidgetClass,
  82.                             toplevel,NULL,ZERO);
  83.     form = XtCreateManagedWidget("popupForm",formWidgetClass,shell,
  84.                                 NULL,ZERO);
  85.     dismiss = XtCreateManagedWidget("dismissButton",commandWidgetClass,form,
  86.                                 NULL,ZERO);
  87.     select = XtCreateManagedWidget("selectButton",commandWidgetClass,form,
  88.                                 NULL,ZERO);
  89.     unselect = XtCreateManagedWidget("unselectButton",commandWidgetClass,form,
  90.                                 NULL,ZERO);
  91.     d = createDayFormData(form);
  92.     d->shell = shell;
  93.     XtAddCallback(select,"callback",selectProc,d);
  94.     XtAddCallback(dismiss,"callback",dismissProc,d);
  95.     XtAddCallback(unselect,"callback",unselectProc,d);
  96.     XtPopup(shell,XtGrabNone);
  97.     return(d);
  98. }
  99.  
  100. static void
  101. textEventProc(w,client_data,event,continue_flag)
  102. Widget w;
  103. XtPointer client_data;
  104. XEvent *event;
  105. Boolean *continue_flag;
  106. {
  107.     dayAppointsChanged = True;
  108. }
  109.  
  110. static void
  111. dismissProc(w,client_data,call_data)
  112. Widget w;
  113. caddr_t client_data,call_data;
  114. {
  115.     DayFormData *d = (DayFormData *)client_data;
  116.  
  117.     checkpointAppoints(d);
  118.     if (currentDayFormData == d)
  119.     currentDayFormData = NULL;
  120.     XtPopdown(d->shell);
  121.     XtDestroyWidget(d->shell);
  122. }
  123.  
  124. static void
  125. selectProc(w,client_data,call_data)
  126. Widget w;
  127. caddr_t client_data,call_data;
  128. {
  129.     DayFormData *d = (DayFormData *)client_data;
  130.  
  131.     checkpointAppoints(d);
  132.     if (currentDayFormData == d)
  133.     return;
  134.     if (currentDayFormData != NULL)
  135.     XtSetSensitive(currentDayFormData->form,False);
  136.     XtSetSensitive(d->form,True);
  137.     currentDayFormData = d;
  138. }
  139.  
  140. static void
  141. unselectProc(w,client_data,call_data)
  142. Widget w;
  143. caddr_t client_data,call_data;
  144. {
  145.     DayFormData *d = (DayFormData *)client_data;
  146.  
  147.     checkpointAppoints(d);
  148.     XtSetSensitive(d->form,False);
  149.     currentDayFormData = NULL;
  150. }
  151.  
  152. void
  153. setDayFormData(d,day,month,year)
  154. DayFormData *d;
  155. int day,month,year;
  156. {
  157.     char text[32];
  158.     Arg args[1];
  159.     char *s;
  160.     int i;
  161.  
  162.     sprintf(text,"%s %d %s %d",shortDayStr[computeDOW(day,month,year)],day,
  163.                         shortMonStr[month],year+1900);
  164.     XtSetArg(args[0],XtNlabel,text);
  165.     XtSetValues(d->date,args,ONE);
  166.     for (i=0; i < 22; i++) {
  167.     if ((s=lookupAppoint(i,day,month,year)) != NULL) {
  168.         XtSetArg(args[0],XtNstring,s);
  169.         XtSetValues(d->items[i]->text,args[0],ONE);
  170.     } else if ((s=lookupSchedule(i,day,month,year)) != NULL) {
  171.         XtSetArg(args[0],XtNstring,s);
  172.         XtSetValues(d->items[i]->text,args[0],ONE);
  173.     } else {
  174.         XtSetArg(args[0],XtNstring,"");
  175.         XtSetValues(d->items[i]->text,args[0],ONE);
  176.     }
  177.     }
  178.     d->day = day;
  179.     d->month = month;
  180.     d->year = year;
  181. }
  182.  
  183. void
  184. checkpointAppoints(d)
  185. DayFormData *d;
  186. {
  187.     Arg args[1];
  188.     int i;
  189.     char *new,*sch,*app;
  190.  
  191.     if (!dayAppointsChanged)
  192.     return;
  193.     XtSetArg(args[0],XtNstring,&new);
  194.     for (i=0; i < 22; i++) {
  195.     XtGetValues(d->items[i]->text,args,ONE);
  196.     sch = lookupSchedule(i,d->day,d->month,d->year);
  197.     app = lookupAppoint(i,d->day,d->month,d->year);
  198.     if (*new != '\0') {
  199.         if ((app != NULL && strcmp(new,app) != 0) ||
  200.         (sch != NULL && strcmp(new,sch) != 0) ||
  201.         (app == NULL && sch == NULL)) {
  202.         addAppoint(i,d->day,d->month,d->year,new);
  203.         appointsChanged = True;
  204.         }
  205.     } else if (app != NULL) {
  206.         deleteAppoint(i,d->day,d->month,d->year);
  207.         appointsChanged = True;
  208.     }
  209.     }
  210.     dayAppointsChanged = False;
  211.     if (currentDayFormData != NULL)
  212.     shadeButton(currentDayFormData->buttonData,(GC)NULL,0,0);
  213. }
  214.