home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2058 / month.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-28  |  5.5 KB  |  229 lines

  1. /*
  2.  *    month.c : Widget creation and action binding for the month
  3.  *          forms, and it's sub-widgets.
  4.  *
  5.  *      George Ferguson (ferguson@cs.rochester.edu), 27 Oct 1990.
  6.  *
  7.  *    $Id: month.c,v 1.1 90/11/07 11:22:57 ferguson Exp $
  8.  */
  9. #include <X11/Intrinsic.h>
  10. #include <X11/Shell.h>
  11. #include <X11/StringDefs.h>
  12. #include <X11/Xaw/Form.h>
  13. #include <X11/Xaw/Command.h>
  14. #include <X11/Xaw/Toggle.h>
  15. #include <X11/Xaw/Label.h>
  16. #include <X11/Xaw/AsciiText.h>
  17. #include <X11/Xaw/Cardinals.h>
  18. #include "app-resources.h"
  19. #include "widgets.h"
  20. #include "month.h"
  21. #include "day.h"
  22. #include "db.h"
  23. #include "date-strings.h"
  24.  
  25. extern int numMonths;
  26.  
  27. /*
  28.  * Functions defined in this file
  29.  */
  30. MonthFormData *createMonthFormData();
  31. void setMonthFormData();
  32. void selectDay();
  33. void shadeButton();
  34.  
  35. static void dayButtonCallbackProc();
  36. static void getGCAndXY();
  37.  
  38. /*
  39.  * Data defined in this file
  40.  */
  41. static int dayAppointsChanged;
  42. static Widget radioGroup;
  43.  
  44. /*    -    -    -    -    -    -    -    -    */
  45. /* returns an unmanaged form */
  46.  
  47. MonthFormData *
  48. createMonthFormData(parent,name,num)
  49. Widget parent;
  50. char *name;
  51. int num;        /* 1,3,12 */
  52. {
  53.     MonthFormData *m;
  54.     DayButtonData *d;
  55.     Widget widget;
  56.     Arg args[3];
  57.     char text[16];
  58.     int row,col;
  59.     int w,h;
  60.  
  61.     m = XtNew(MonthFormData);
  62.     m->form = XtCreateWidget(name,formWidgetClass,parent,NULL,ZERO);
  63.     switch (num) {
  64.     case 1: w = appResources.dateWidth1;
  65.         h = appResources.dateHeight1;
  66.         break;
  67.     case 3: w = appResources.dateWidth3;
  68.         h = appResources.dateHeight3;
  69.         break;
  70.     case 12: w = appResources.dateWidth12;
  71.          h = appResources.dateHeight12;
  72.          break;
  73.     }
  74.     sprintf(text,"monthLabel%d",num);
  75.     m->label = XtCreateManagedWidget(text,labelWidgetClass,m->form,NULL,ZERO);
  76.     if (appResources.dowLabels) {
  77.     sprintf(text,"dowLabel%d",num);
  78.     XtSetArg(args[0],XtNfromVert,m->label);
  79.     XtSetArg(args[1],XtNfromHoriz,NULL);
  80.     for (col=0; col < 7; col++) {
  81.         XtSetArg(args[2],XtNlabel,shortDayStr[col]);
  82.         widget = XtCreateManagedWidget(text,labelWidgetClass,m->form,
  83.                                 args,THREE);
  84.         XtSetArg(args[1],XtNfromHoriz,widget);
  85.     }
  86.     XtSetArg(args[0],XtNfromVert,widget);
  87.     } else {
  88.     XtSetArg(args[0],XtNfromVert,m->label);
  89.     }
  90.     sprintf(text,"dayButton%d",num);
  91.     for (row=0; row < 6; row++) {
  92.     XtSetArg(args[1],XtNfromHoriz,NULL);
  93.     for (col=0; col < 7; col++) {
  94.         d = m->days[row*7+col] = XtNew(DayButtonData);
  95.         d->button = XtCreateManagedWidget(text,toggleWidgetClass,
  96.                             m->form,args,TWO);
  97.         XtAddCallback(d->button,"callback",dayButtonCallbackProc,d);
  98.         XtSetArg(args[2],XtNradioData,d->button);
  99.         XtSetValues(d->button,args+2,ONE);
  100.         if (radioGroup == NULL)
  101.         radioGroup = d->button;
  102.         XawToggleChangeRadioGroup(d->button,radioGroup);
  103.         d->pixmap = XCreatePixmap(display,root,w,h,
  104.                         DefaultDepthOfScreen(screen));
  105.  
  106.         XtSetArg(args[1],XtNfromHoriz,d->button);
  107.     }
  108.         XtSetArg(args[0],XtNfromVert,d->button);
  109.     }
  110.     return(m);
  111. }
  112.  
  113. void
  114. setMonthFormData(m,num,month,year)
  115. MonthFormData *m;
  116. int num,month,year;
  117. {
  118.     DayButtonData *d;
  119.     Arg args[1];
  120.     GC gc;
  121.     char text[16];
  122.     int first,numDays;
  123.     int i,x,y,n;
  124.  
  125.     first = firstDOW(month,year);
  126.     numDays = lastDay(month,year);
  127.     getGCAndXY(num,&gc,&x,&y);
  128.     XawFormDoLayout(m->form,False);
  129.     XawToggleUnsetCurrent(radioGroup);
  130.     sprintf(text,"%s %d",longMonStr[month],year+1900);
  131.     XtSetArg(args[0],XtNlabel,text);
  132.     XtSetValues(m->label,args,ONE);
  133.     for (i=0; i < 42; i++) {
  134.     d = m->days[i];
  135.     if (i < first || i >= first+numDays) {
  136.         d->day = 0;
  137.         XFillRectangle(display,d->pixmap,emptyGC,0,0,50,50);
  138.         XtSetArg(args[0],XtNbitmap,d->pixmap);
  139.         XtSetValues(d->button,args,ONE);
  140.     } else {
  141.         d->day = i-first+1;
  142.         d->month = month;
  143.         d->year = year;
  144.         shadeButton(d,gc,x,y);
  145.     }
  146.     }
  147.     XawFormDoLayout(m->form,True);
  148.     m->month = month;
  149.     m->year = year;
  150. }
  151.  
  152. /* This function is here so it can be outside the loop in setMonthFormData(),
  153.    but really belongs in shadeButton.                    */
  154. static void
  155. getGCAndXY(num,gcp,xp,yp)
  156. GC *gcp;
  157. int *xp,*yp;
  158. {
  159.     int w,h;
  160.  
  161.     switch (num) {
  162.     case 1: XParseGeometry(appResources.datePosition1,xp,yp,&w,&h);
  163.         *gcp = dateGC1;
  164.         break;
  165.     case 3: XParseGeometry(appResources.datePosition3,xp,yp,&w,&h);
  166.         *gcp = dateGC3;
  167.         break;
  168.     case 12: XParseGeometry(appResources.datePosition12,xp,yp,&w,&h);
  169.          *gcp = dateGC12;
  170.          break;
  171.     }
  172. }
  173.  
  174. /* Global so can be called after appointments have changed */
  175. void
  176. shadeButton(d,gc,x,y)
  177. DayButtonData *d;
  178. GC gc;
  179. int x,y;
  180. {
  181.     Arg args[1];
  182.     char text[4];
  183.     int n;
  184.  
  185.     if (gc == (GC)NULL)
  186.     getGCAndXY(numMonths,&gc,&x,&y);
  187.     n = countAppoints(d->day,d->month,d->year);
  188.     XFillRectangle(display,d->pixmap,shadeGC[n],0,0,50,50);
  189.     sprintf(text,"%d",d->day);
  190.     if (appResources.opaqueDates)
  191.     XDrawImageString(display,d->pixmap,gc,x,y,text,strlen(text));
  192.     else
  193.     XDrawString(display,d->pixmap,gc,x,y,text,strlen(text));
  194.     XtSetArg(args[0],XtNbitmap,d->pixmap);
  195.     XtSetValues(d->button,args,ONE);
  196. }
  197.  
  198. void
  199. selectDay(m,day,mon,year)
  200. MonthFormData *m;
  201. int day,mon,year;
  202. {
  203.     int first,i;
  204.  
  205.     first = firstDOW(mon,year);
  206.     for (i=0; i < 42; i++)
  207.     if (i == first+day-1) {
  208.         XawToggleSetCurrent(radioGroup,m->days[i]->button);
  209.         break;
  210.     }
  211. }
  212.  
  213. static void
  214. dayButtonCallbackProc(w,client_data,call_data)
  215. Widget w;
  216. caddr_t client_data,call_data;
  217. {
  218.     DayButtonData *d = (DayButtonData *)client_data;
  219.  
  220.     if (d->day == 0)
  221.     return;
  222.     if (currentDayFormData == NULL)
  223.     currentDayFormData = createPopupDayFormData();
  224.     else
  225.     checkpointAppoints(currentDayFormData);
  226.     currentDayFormData->buttonData = d;
  227.     setDayFormData(currentDayFormData,d->day,d->month,d->year);
  228. }
  229.