1 /* $XConsortium: print.c /main/18 1996/11/25 10:23:05 rswiston $ */
3 * (c) Copyright 1993, 1994 Hewlett-Packard Company
4 * (c) Copyright 1993, 1994 International Business Machines Corp.
5 * (c) Copyright 1993, 1994 Novell, Inc.
6 * (c) Copyright 1993, 1994 Sun Microsystems, Inc.
16 #include <Xm/LabelG.h>
17 #include <Xm/DialogS.h>
19 #include <Xm/Protocols.h>
20 #include <Xm/PushBG.h>
21 #include <Xm/SeparatoG.h>
25 #include <Xm/ToggleB.h>
26 #include <Xm/ToggleBG.h>
28 #include <Xm/SSpinB.h>
29 #include <Xm/RowColumn.h>
30 #include <Dt/HourGlass.h>
36 #include "datefield.h"
43 /* needed for view-specific print routines */
44 #include "dayglance.h"
45 #include "weekglance.h"
46 #include "monthglance.h"
47 #include "yearglance.h"
49 static char *printErrorTitle = "Calendar : Error - Print";
50 static char *setupErrorTitle = "Calendar : Error - Print Setup";
51 static char *pdmErrorText = "Print Dialog Manager error - setup failed.";
57 Widget report_type_option;
74 Boolean setupDataValid;
75 DtPrintSetupData setupData;
77 Boolean badAllocError;
81 * private function declarations
83 static void print_cb(Widget, XtPointer, XtPointer);
84 static void print_setup_cb(Widget, XtPointer, XtPointer);
85 static void close_print_display_cb(Widget, XtPointer, XtPointer);
86 static void cancel_cb(Widget, XtPointer, XtPointer);
87 static void pdm_notify_cb(Widget, XtPointer, XtPointer);
88 static void report_option_cb(Widget, XtPointer, XtPointer);
89 static void from_modify_verify_cb(Widget, XtPointer, XtPointer);
90 static void to_modify_verify_cb(Widget, XtPointer, XtPointer);
91 static void spin_field_changed_cb(Widget, XtPointer, XtPointer);
92 static void more_opts_cb(Widget, XtPointer, XtPointer);
93 static Tick pd_modify_day(Calendar *, int, Boolean);
94 static Tick pd_modify_month(Calendar *, int, Boolean);
95 static Tick pd_modify_year(Calendar *, int, Boolean);
96 static Boolean pd_set_start_date(Calendar *, Tick);
97 static Boolean pd_set_end_date(Calendar *, Tick);
98 static Boolean pd_set_max_start_date(Calendar *, Tick);
99 static Boolean pd_set_min_end_date(Calendar *, Tick);
100 static Boolean pd_set_report_type(Calendar *, int);
101 static Boolean pd_set_report_managed(Calendar *, int);
102 static Boolean pd_get_start_positions(Calendar *, int *, int *, int *);
103 static Boolean pd_get_end_positions(Calendar *, int *, int *, int *);
104 static void clearSetupData(_DtCmPrintData *);
105 static void createPrintShell(Calendar *);
106 static void report_error(Calendar *, char *, char *);
110 inDebugMode(Calendar *c)
112 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
113 if (pd != (_DtCmPrintData *)NULL)
114 return XmToggleButtonGadgetGetState(pd->debugToggle);
121 pd_set_start_date(Calendar *c, Tick tick)
123 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
124 Props *p = (Props *)c->properties;
125 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
126 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
130 if (pd == (_DtCmPrintData *)NULL)
133 if (tick > get_eot())
136 if (pd_get_report_type(c) == PR_WEEK_VIEW)
138 /* Week view - start at Monday. */
139 tick = first_dow(tick);
142 if (tick < get_bot())
145 if (XtIsManaged(pd->from_day))
148 XtSetArg(args[nargs], XmNposition, dom(tick)); nargs++;
149 XtSetArg(args[nargs], XmNmaximumValue, monthlength(tick)); nargs++;
150 XtSetValues(pd->from_day, args, nargs);
152 if (XtIsManaged(pd->from_month))
154 XtSetArg(args[0], XmNposition, month(tick) - 1);
155 XtSetValues(pd->from_month, args, 1);
157 XtSetArg(args[0], XmNposition, year(tick));
158 XtSetValues(pd->from_year, args, 1);
164 pd_set_end_date(Calendar *c, Tick tick)
166 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
167 Props *p = (Props *)c->properties;
168 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
169 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
173 if (pd == (_DtCmPrintData *)NULL)
176 if (tick < get_bot())
179 if (pd_get_report_type(c) == PR_WEEK_VIEW)
181 /* Week view - end on Sunday. */
182 tick = last_dow(tick);
185 if (tick > get_eot())
188 if (XtIsManaged(pd->to_day))
191 XtSetArg(args[nargs], XmNposition, dom(tick)); nargs++;
192 XtSetArg(args[nargs], XmNmaximumValue, monthlength(tick)); nargs++;
193 XtSetValues(pd->to_day, args, nargs);
195 if (XtIsManaged(pd->to_month))
197 XtSetArg(args[0], XmNposition, month(tick) - 1);
198 XtSetValues(pd->to_month, args, 1);
200 XtSetArg(args[0], XmNposition, year(tick));
201 XtSetValues(pd->to_year, args, 1);
207 pd_set_max_start_date(Calendar *c, Tick tick)
209 Tick curTick = pd_get_start_date(c);
211 return (tick < curTick) ? pd_set_start_date(c, tick) : True;
215 pd_set_min_end_date(Calendar *c, Tick tick)
217 Tick curTick = pd_get_end_date(c);
219 return (tick > curTick) ? pd_set_end_date(c, tick) : True;
223 pd_set_report_type(Calendar *c, int reportType)
225 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
226 Widget optionMenu = (Widget)NULL;
230 if (pd == (_DtCmPrintData *)NULL)
233 if (reportType == pd->report_type)
237 XtSetArg(args[nargs], XmNsubMenuId, &optionMenu); nargs++;
238 XtGetValues(pd->report_type_option, args, nargs);
240 if (optionMenu != (Widget)NULL)
242 WidgetList optionChildren;
246 XtSetArg(args[nargs], XmNchildren, &optionChildren); nargs++;
247 XtSetArg(args[nargs], XmNnumChildren, &nChildren); nargs++;
248 XtGetValues(optionMenu, args, nargs);
250 if (nChildren > reportType)
253 XtSetArg(args[nargs], XmNmenuHistory,
254 optionChildren[reportType]); nargs++;
255 XtSetValues(pd->report_type_option, args, nargs);
257 return pd_set_report_managed(c, reportType);
265 pd_set_report_managed(Calendar *c, int reportType)
267 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
271 if (pd == (_DtCmPrintData *)NULL)
274 if (reportType == pd->report_type)
277 pd->report_type = reportType;
282 XtManageChild(pd->from_year);
283 XtManageChild(pd->to_year);
285 XtUnmanageChild(pd->from_day);
286 XtUnmanageChild(pd->from_month);
287 XtUnmanageChild(pd->to_day);
288 XtUnmanageChild(pd->to_month);
292 XtManageChild(pd->from_year);
293 XtManageChild(pd->from_month);
294 XtManageChild(pd->from_day);
295 XtManageChild(pd->to_year);
296 XtManageChild(pd->to_month);
297 XtManageChild(pd->to_day);
300 XtSetArg(args[nargs], XmNeditable, False); nargs++;
301 XtSetArg(args[nargs], XmNcursorPositionVisible, False); nargs++;
302 XtSetValues(pd->from_day, args, nargs);
303 XtSetValues(pd->to_day, args, nargs);
309 XtManageChild(pd->from_year);
310 XtManageChild(pd->from_month);
311 XtManageChild(pd->from_day);
312 XtManageChild(pd->to_year);
313 XtManageChild(pd->to_month);
314 XtManageChild(pd->to_day);
317 XtSetArg(args[nargs], XmNeditable, True); nargs++;
318 XtSetArg(args[nargs], XmNcursorPositionVisible, True); nargs++;
319 XtSetValues(pd->from_day, args, nargs);
320 XtSetValues(pd->to_day, args, nargs);
325 XtManageChild(pd->from_year);
326 XtManageChild(pd->from_month);
327 XtManageChild(pd->to_year);
328 XtManageChild(pd->to_month);
330 XtUnmanageChild(pd->from_day);
331 XtUnmanageChild(pd->to_day);
339 pd_get_start_positions(Calendar *c, int *m, int *d, int *y)
341 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
342 int dayPos = 1, monthPos = 0, yearPos;
344 if (pd == (_DtCmPrintData *)NULL)
347 if (XtIsManaged(pd->from_day))
348 XtVaGetValues(pd->from_day, XmNposition, &dayPos, NULL);
349 if (XtIsManaged(pd->from_month))
350 XtVaGetValues(pd->from_month, XmNposition, &monthPos, NULL);
351 XtVaGetValues(pd->from_year, XmNposition, &yearPos, NULL);
361 pd_get_end_positions(Calendar *c, int *m, int *d, int *y)
363 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
364 int dayPos = 1, monthPos = 0, yearPos;
366 if (pd == (_DtCmPrintData *)NULL)
369 if (XtIsManaged(pd->to_day))
370 XtVaGetValues(pd->to_day, XmNposition, &dayPos, NULL);
371 if (XtIsManaged(pd->to_month))
372 XtVaGetValues(pd->to_month, XmNposition, &monthPos, NULL);
373 XtVaGetValues(pd->to_year, XmNposition, &yearPos, NULL);
383 from_modify_verify_cb(Widget w, XtPointer uDataP, XtPointer cbDataP)
385 Calendar *c = (Calendar *)uDataP;
386 XmSpinBoxCallbackStruct *cbStruct = (XmSpinBoxCallbackStruct *)cbDataP;
387 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
391 cbStruct->doit = False;
393 if (cbStruct->widget == pd->from_day)
395 newTick = pd_modify_day(c, cbStruct->reason, False);
397 else if (cbStruct->widget == pd->from_month)
399 newTick = pd_modify_month(c, cbStruct->reason, False);
401 else if (cbStruct->widget == pd->from_year)
403 newTick = pd_modify_year(c, cbStruct->reason, False);
407 if (pd_set_start_date(c, newTick) && pd_set_min_end_date(c, newTick))
409 int monthPos, dayPos, yearPos;
411 pd_get_start_positions(c, &monthPos, &dayPos, &yearPos);
412 if (cbStruct->widget == pd->from_day)
413 cbStruct->position = dayPos;
414 else if (cbStruct->widget == pd->from_month)
415 cbStruct->position = monthPos;
416 else cbStruct->position = yearPos;
417 cbStruct->doit = True;
422 to_modify_verify_cb(Widget w, XtPointer uDataP, XtPointer cbDataP)
424 Calendar *c = (Calendar *)uDataP;
425 XmSpinBoxCallbackStruct *cbStruct = (XmSpinBoxCallbackStruct *)cbDataP;
426 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
429 cbStruct->doit = False;
431 if (cbStruct->widget == pd->to_day)
433 newTick = pd_modify_day(c, cbStruct->reason, True);
435 else if (cbStruct->widget == pd->to_month)
437 newTick = pd_modify_month(c, cbStruct->reason, True);
439 else if (cbStruct->widget == pd->to_year)
441 newTick = pd_modify_year(c, cbStruct->reason, True);
445 if (pd_set_end_date(c, newTick) && pd_set_max_start_date(c, newTick))
447 int monthPos, dayPos, yearPos;
449 pd_get_end_positions(c, &monthPos, &dayPos, &yearPos);
450 if (cbStruct->widget == pd->to_day)
451 cbStruct->position = dayPos;
452 else if (cbStruct->widget == pd->to_month)
453 cbStruct->position = monthPos;
454 else cbStruct->position = yearPos;
455 cbStruct->doit = True;
460 spin_field_changed_cb(Widget field, XtPointer uData, XtPointer cbData)
465 unsigned char sbcType;
469 XmStringTable strings;
475 XtSetArg(args[nargs], XmNspinBoxChildType, &sbcType); nargs++;
476 XtSetArg(args[nargs], XmNmaximumValue, &maxValue); nargs++;
477 XtSetArg(args[nargs], XmNminimumValue, &minValue); nargs++;
478 XtSetArg(args[nargs], XmNnumValues, &nValues); nargs++;
479 XtSetArg(args[nargs], XmNposition, &curPos); nargs++;
480 XtSetArg(args[nargs], XmNvalues, &strings); nargs++;
481 XtSetArg(args[nargs], XmNvalue, &newStr); nargs++;
482 XtSetArg(args[nargs], XmNcursorPosition, &cursorPosition); nargs++;
483 XtGetValues(field, args, nargs);
486 if (sbcType == XmSTRING)
488 XmString xmString = XmStringCreateLocalized(newStr);
490 for (newPos = 0; newPos < nValues; newPos++)
492 if (XmStringCompare(xmString, strings[newPos]))
496 if (newPos >= nValues)
499 XmStringFree(xmString);
501 else if (sbcType == XmNUMERIC)
503 newPos = atoi(newStr);
505 if ((newPos < minValue) ||
510 if (newPos != curPos)
513 XtSetArg(args[nargs], XmNposition, newPos); nargs++;
514 XtSetValues(field, args, nargs);
516 /* After the above does its thing, restore original cursor position. */
518 XtSetArg(args[nargs], XmNcursorPosition, cursorPosition); nargs++;
519 XtSetValues(field, args, nargs);
526 more_opts_cb(Widget w, XtPointer uData, XtPointer cbData)
528 Calendar *c = (Calendar *)uData;
529 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
531 _DtTurnOnHourGlass(c->frame);
532 _DtTurnOnHourGlass(pd->pdb);
534 show_print_props_pu(c);
536 _DtTurnOffHourGlass(pd->pdb);
537 _DtTurnOffHourGlass(c->frame);
541 pd_modify_day(Calendar *c, int reason, Boolean isTo)
543 int monthPos, dayPos, yearPos;
548 int reportType = pd_get_report_type(c);
552 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
557 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
564 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
565 maxDay = monthlength(tmpTick);
566 if ((dayPos == 1) || (dayPos > maxDay))
569 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
570 newTick = (reportType == PR_WEEK_VIEW) ?
571 nextweek(curTick) : nextday(curTick);
574 case XmCR_SPIN_PRIOR:
575 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
576 maxDay = monthlength(tmpTick);
577 if (dayPos >= maxDay)
580 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
581 newTick = (reportType == PR_WEEK_VIEW) ?
582 prevweek(curTick) : prevday(curTick);
586 case XmCR_SPIN_FIRST:
587 newTick = monthdayyear(monthPos + 1, 1, yearPos);
588 if (reportType == PR_WEEK_VIEW)
592 /* We want the first Sunday in the month. */
593 newTick = last_dow(newTick);
597 /* We want the first Monday in the month. */
598 int dayOffset = (dow(newTick) + 6) % 7;
601 newTick = next_ndays(newTick, 7 - dayOffset);
607 curTick = monthdayyear(monthPos + 1, 1, yearPos);
608 newTick = last_dom(curTick);
609 if (reportType == PR_WEEK_VIEW)
613 /* We want the last Sunday in the month. */
614 int dayOffset = dow(newTick);
617 newTick = last_ndays(newTick, dayOffset);
621 /* We want the last Monday in the month. */
622 newTick = first_dow(newTick);
632 pd_modify_month(Calendar *c, int reason, Boolean isTo)
634 int monthPos, dayPos, yearPos;
639 int reportType = pd_get_report_type(c);
643 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
648 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
659 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
660 if (reportType == PR_WEEK_VIEW)
661 newTick = next_ndays(curTick, 4 * 7);
664 tmpTick = nextmonth(curTick);
665 maxDay = monthlength(tmpTick);
668 newTick = monthdayyear(month(tmpTick), dayPos, year(tmpTick));
672 case XmCR_SPIN_PRIOR:
677 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
678 if (reportType == PR_WEEK_VIEW)
679 newTick = last_ndays(curTick, 4 * 7);
682 /* ... There is no prevmonth()! ... */
683 tmpTick = prev_nmonth(curTick, 1);
684 maxDay = monthlength(tmpTick);
687 newTick = monthdayyear(month(tmpTick), dayPos, year(tmpTick));
692 case XmCR_SPIN_FIRST:
693 newTick = monthdayyear(1, 1, yearPos);
694 if (reportType == PR_WEEK_VIEW)
698 /* We want the first Sunday in the month. */
699 newTick = last_dow(newTick);
703 /* We want the first Monday in the month. */
704 int dayOffset = (dow(newTick) + 6) % 7;
707 newTick = next_ndays(newTick, 7 - dayOffset);
713 newTick = monthdayyear(12, 31, yearPos);
714 if (reportType == PR_WEEK_VIEW)
718 /* We want the last Sunday in the month. */
719 int dayOffset = dow(newTick);
722 newTick = last_ndays(newTick, dayOffset);
726 /* We want the last Monday in the month. */
727 newTick = first_dow(newTick);
737 pd_modify_year(Calendar *c, int reason, Boolean isTo)
739 int monthPos, dayPos, yearPos;
744 int reportType = pd_get_report_type(c);
748 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
753 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
762 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
763 if (reportType == PR_WEEK_VIEW)
764 newTick = next_ndays(curTick, 52 * 7);
767 tmpTick = monthdayyear(monthPos + 1, 1, yearPos + 1);
768 maxDay = monthlength(tmpTick);
771 newTick = monthdayyear(monthPos + 1, dayPos, yearPos + 1);
775 case XmCR_SPIN_PRIOR:
778 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
779 if (reportType == PR_WEEK_VIEW)
780 newTick = last_ndays(curTick, 52 * 7);
783 tmpTick = monthdayyear(monthPos + 1, 1, yearPos - 1);
784 maxDay = monthlength(tmpTick);
787 newTick = monthdayyear(monthPos + 1, dayPos, yearPos - 1);
792 case XmCR_SPIN_FIRST:
793 yearPos = year(get_bot());
794 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
795 maxDay = monthlength(tmpTick);
798 newTick = monthdayyear(monthPos + 1, dayPos, yearPos);
802 yearPos = year(get_eot());
803 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
804 maxDay = monthlength(tmpTick);
807 newTick = monthdayyear(monthPos + 1, dayPos, yearPos);
815 * post_print_dialog()
817 * Create and display the Print dialog.
825 create_print_dialog(c);
827 /* display the dialog on-screen */
828 if ((pd = (_DtCmPrintData *)c->print_data) != (_DtCmPrintData *)NULL)
830 if (!XtIsManaged(pd->pdb))
831 XtManageChild(pd->pdb);
832 else XRaiseWindow(XtDisplay(pd->pdb),
833 XtWindow(XtParent(pd->pdb)));
838 clearSetupData(_DtCmPrintData *pd)
840 if (pd->setupDataValid)
842 DtPrintFreeSetupData(&pd->setupData);
843 pd->setupDataValid = False;
846 memset(&pd->setupData, 0, sizeof(DtPrintSetupData));
850 createPrintShell(Calendar *c)
852 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
857 if (pd->printShell != (Widget)NULL)
858 XtDestroyWidget(pd->printShell);
860 pd->printShell = XmCreateDialogShell(c->frame, "Print",
865 if (pd->printShell == (Widget)NULL)
868 XmPrintSetup(pd->pdb,
869 XpGetScreenOfContext(pd->setupData.print_display,
870 pd->setupData.print_context),
873 XtAddCallback(pd->printShell, XmNpdmNotificationCallback,
874 pdm_notify_cb, (XtPointer)c);
879 create_print_dialog(Calendar *c)
881 XmString xmstr, day_view, week_view, month_view,
882 year_view, appt_list, todo_list, view;
884 char fnamebuf[BUFSIZ];
890 XmString abbrevMonths[12];
896 if ((pd = (_DtCmPrintData *)c->print_data) == NULL)
898 c->print_data = (caddr_t)XtMalloc(sizeof(_DtCmPrintData));
899 pd = (_DtCmPrintData *) c->print_data;
901 /* Initialize filename to dir+filename from props */
902 print_file = get_char_prop((Props *)c->properties,CP_PRINTFILENAME);
905 print_dir = get_char_prop((Props *)c->properties,CP_PRINTDIRNAME);
908 sprintf(fnamebuf, "%s/%s", print_dir, print_file);
910 title = XtNewString(catgets(c->DT_catd, 1, 728, "Calendar : Print"));
912 XtSetArg(args[nargs], XmNtitle, title); nargs++;
913 XtSetArg(args[nargs], XmNdeleteResponse, XmUNMAP); nargs++;
914 XtSetArg(args[nargs], DtNfileName, fnamebuf); nargs++;
915 XtSetArg(args[nargs], XmNautoUnmanage, False); nargs++;
916 XtSetArg(args[nargs], XmNdeleteResponse, XmDO_NOTHING); nargs++;
917 pd->pdb = DtCreatePrintSetupDialog(c->frame, "Calendar - Print",
921 setup_quit_handler(XtParent(pd->pdb), cancel_cb, (XtPointer)c);
923 XtAddCallback(pd->pdb, DtNcancelCallback,
924 cancel_cb, (XtPointer)c);
925 XtAddCallback(pd->pdb, DtNprintCallback,
926 print_cb, (XtPointer)c);
927 XtAddCallback(pd->pdb, DtNclosePrintDisplayCallback,
928 close_print_display_cb, (XtPointer)c);
929 XtAddCallback(pd->pdb, DtNsetupCallback,
930 print_setup_cb, (XtPointer)c);
932 helpButton = XtNameToWidget(pd->pdb, "Help");
933 if (helpButton != (Widget)NULL)
934 XtAddCallback(helpButton, XmNactivateCallback,
935 help_cb, (XtPointer)PRINT_HELP_BUTTON);
936 XtAddCallback(pd->pdb, XmNhelpCallback,
937 help_cb, (XtPointer)PRINT_HELP_BUTTON);
940 XtSetArg(args[nargs], XmNfractionBase, 3); nargs++;
941 pd->form = XmCreateForm(pd->pdb, "RangeForm", args, nargs);
943 view = XmStringCreateLocalized(
944 catgets(c->DT_catd, 1, 976, "Report Type:"));
945 day_view = XmStringCreateLocalized(
946 catgets(c->DT_catd, 1, 977, "Day View"));
947 week_view = XmStringCreateLocalized(
948 catgets(c->DT_catd, 1, 978, "Week View"));
949 month_view = XmStringCreateLocalized(
950 catgets(c->DT_catd, 1, 979, "Month View"));
951 year_view = XmStringCreateLocalized(
952 catgets(c->DT_catd, 1, 980, "Year View"));
953 appt_list = XmStringCreateLocalized(
954 catgets(c->DT_catd, 1, 981, "Appointment List"));
955 todo_list = XmStringCreateLocalized(
956 catgets(c->DT_catd, 1, 982, "To Do List"));
959 * remember - this returns a RowColumn widget!
961 pd->report_type = PR_DAY_VIEW;
962 pd->report_type_option = XmVaCreateSimpleOptionMenu(pd->form,
963 "TypeOptionMenu", view, NULL,
964 pd->report_type, report_option_cb,
965 XmVaPUSHBUTTON, day_view, NULL, NULL, NULL,
966 XmVaPUSHBUTTON, week_view, NULL, NULL, NULL,
967 XmVaPUSHBUTTON, month_view, NULL, NULL, NULL,
968 XmVaPUSHBUTTON, year_view, NULL, NULL, NULL,
969 XmVaPUSHBUTTON, appt_list, NULL, NULL, NULL,
970 XmVaPUSHBUTTON, todo_list, NULL, NULL, NULL,
971 XmNorientation, XmVERTICAL,
972 XmNtopAttachment, XmATTACH_FORM,
974 XmNleftAttachment, XmATTACH_POSITION,
978 XmNnavigationType, XmTAB_GROUP,
980 XtManageChild(pd->report_type_option);
982 XmStringFree(day_view);
983 XmStringFree(week_view);
984 XmStringFree(month_view);
985 XmStringFree(year_view);
986 XmStringFree(appt_list);
987 XmStringFree(todo_list);
990 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
992 pd->from_label = XtVaCreateWidget("FromLabel",
995 XmNlabelString, xmstr,
996 XmNleftAttachment, XmATTACH_POSITION,
999 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1000 XmNtopWidget, pd->report_type_option,
1003 XmStringFree(xmstr);
1004 XtManageChild(pd->from_label);
1007 XtSetArg(args[nargs], XmNleftAttachment,
1008 XmATTACH_OPPOSITE_WIDGET); nargs++;
1009 XtSetArg(args[nargs], XmNleftWidget, pd->from_label); nargs++;
1010 XtSetArg(args[nargs], XmNleftOffset, 0); nargs++;
1011 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1012 XtSetArg(args[nargs], XmNtopWidget, pd->from_label); nargs++;
1013 XtSetArg(args[nargs], XmNtopOffset, 4); nargs++;
1014 XtSetArg(args[nargs], XmNshadowThickness, 1); nargs++;
1015 pd->from_spin = XmCreateSpinBox(pd->form, "FromSpinBox",
1017 XtAddCallback(pd->from_spin, XmNmodifyVerifyCallback,
1018 from_modify_verify_cb, (XtPointer)c);
1021 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1022 XtSetArg(args[nargs], XmNminimumValue, 1); nargs++;
1023 XtSetArg(args[nargs], XmNmaximumValue, 31); nargs++;
1024 XtSetArg(args[nargs], XmNcolumns, 2); nargs++;
1025 XtSetArg(args[nargs], XmNmaxLength, 2); nargs++;
1026 XtSetArg(args[nargs], XmNposition, 1); nargs++;
1027 pd->from_day = XmCreateTextField(pd->from_spin, "FromDay",
1029 XtAddCallback(pd->from_day, XmNvalueChangedCallback,
1030 spin_field_changed_cb, (XtPointer)NULL);
1031 XtManageChild(pd->from_day);
1034 for (i = 0; i < 12; i++)
1036 abbrevMonths[i] = XmStringCreateLocalized(months2[i + 1]);
1037 if (cm_strlen(months2[i + 1]) > maxMonthLen)
1038 maxMonthLen = cm_strlen(months2[i + 1]);
1041 XtSetArg(args[nargs], XmNspinBoxChildType, XmSTRING); nargs++;
1042 XtSetArg(args[nargs], XmNnumValues, 12); nargs++;
1043 XtSetArg(args[nargs], XmNvalues, abbrevMonths); nargs++;
1044 XtSetArg(args[nargs], XmNcolumns, maxMonthLen); nargs++;
1045 XtSetArg(args[nargs], XmNmaxLength, maxMonthLen); nargs++;
1046 XtSetArg(args[nargs], XmNposition, 0); nargs++;
1047 pd->from_month = XmCreateTextField(pd->from_spin, "FromMonth",
1049 XtAddCallback(pd->from_month, XmNvalueChangedCallback,
1050 spin_field_changed_cb, (XtPointer)NULL);
1051 XtManageChild(pd->from_month);
1054 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1055 XtSetArg(args[nargs], XmNminimumValue,
1056 year(get_bot())); nargs++;
1057 XtSetArg(args[nargs], XmNmaximumValue,
1058 year(get_eot())); nargs++;
1059 XtSetArg(args[nargs], XmNcolumns, 4); nargs++;
1060 XtSetArg(args[nargs], XmNmaxLength, 4); nargs++;
1061 XtSetArg(args[nargs], XmNposition,
1062 year(get_bot())); nargs++;
1063 XtSetArg(args[nargs], XmNwrap, False); nargs++;
1064 pd->from_year = XmCreateTextField(pd->from_spin, "FromYear",
1066 XtAddCallback(pd->from_year, XmNvalueChangedCallback,
1067 spin_field_changed_cb, (XtPointer)NULL);
1068 XtManageChild(pd->from_year);
1069 XtManageChild(pd->from_spin);
1071 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
1073 pd->to_label = XtVaCreateWidget("ToLabel",
1076 XmNlabelString, xmstr,
1077 XmNleftAttachment, XmATTACH_POSITION,
1080 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1081 XmNtopWidget, pd->report_type_option,
1084 XmStringFree(xmstr);
1085 XtManageChild(pd->to_label);
1088 XtSetArg(args[nargs], XmNleftAttachment,
1089 XmATTACH_OPPOSITE_WIDGET); nargs++;
1090 XtSetArg(args[nargs], XmNleftWidget, pd->to_label); nargs++;
1091 XtSetArg(args[nargs], XmNleftOffset, 0); nargs++;
1092 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1093 XtSetArg(args[nargs], XmNtopWidget, pd->to_label); nargs++;
1094 XtSetArg(args[nargs], XmNtopOffset, 4); nargs++;
1095 XtSetArg(args[nargs], XmNshadowThickness, 1); nargs++;
1096 pd->to_spin = XmCreateSpinBox(pd->form, "ToSpinBox",
1098 XtAddCallback(pd->to_spin, XmNmodifyVerifyCallback,
1099 to_modify_verify_cb, (XtPointer)c);
1102 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1103 XtSetArg(args[nargs], XmNminimumValue, 1); nargs++;
1104 XtSetArg(args[nargs], XmNmaximumValue, 31); nargs++;
1105 XtSetArg(args[nargs], XmNcolumns, 2); nargs++;
1106 XtSetArg(args[nargs], XmNmaxLength, 2); nargs++;
1107 XtSetArg(args[nargs], XmNposition, 1); nargs++;
1108 pd->to_day = XmCreateTextField(pd->to_spin, "ToDay",
1110 XtAddCallback(pd->to_day, XmNvalueChangedCallback,
1111 spin_field_changed_cb, (XtPointer)NULL);
1112 XtManageChild(pd->to_day);
1115 XtSetArg(args[nargs], XmNspinBoxChildType, XmSTRING); nargs++;
1116 XtSetArg(args[nargs], XmNnumValues, 12); nargs++;
1117 XtSetArg(args[nargs], XmNvalues, abbrevMonths); nargs++;
1118 XtSetArg(args[nargs], XmNcolumns, maxMonthLen); nargs++;
1119 XtSetArg(args[nargs], XmNmaxLength, maxMonthLen); nargs++;
1120 XtSetArg(args[nargs], XmNposition, 0); nargs++;
1121 pd->to_month = XmCreateTextField(pd->to_spin, "ToMonth",
1123 XtAddCallback(pd->to_month, XmNvalueChangedCallback,
1124 spin_field_changed_cb, (XtPointer)NULL);
1125 XtManageChild(pd->to_month);
1126 for (i = 0; i < 12; i++)
1127 XmStringFree(abbrevMonths[i]);
1130 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1131 XtSetArg(args[nargs], XmNminimumValue,
1132 year(get_bot())); nargs++;
1133 XtSetArg(args[nargs], XmNmaximumValue,
1134 year(get_eot())); nargs++;
1135 XtSetArg(args[nargs], XmNcolumns, 4); nargs++;
1136 XtSetArg(args[nargs], XmNmaxLength, 4); nargs++;
1137 XtSetArg(args[nargs], XmNposition,
1138 year(get_bot())); nargs++;
1139 XtSetArg(args[nargs], XmNwrap, False); nargs++;
1140 pd->to_year = XmCreateTextField(pd->to_spin, "ToYear",
1142 XtAddCallback(pd->to_year, XmNvalueChangedCallback,
1143 spin_field_changed_cb, (XtPointer)NULL);
1144 XtManageChild(pd->to_year);
1145 XtManageChild(pd->to_spin);
1147 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
1150 XtSetArg(args[nargs], XmNlabelString, xmstr); nargs++;
1151 XtSetArg(args[nargs], XmNrightAttachment, XmATTACH_FORM); nargs++;
1152 XtSetArg(args[nargs], XmNrightOffset, 10); nargs++;
1153 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1154 XtSetArg(args[nargs], XmNtopWidget, pd->to_spin); nargs++;
1155 XtSetArg(args[nargs], XmNtopOffset, 10); nargs++;
1156 pd->more_opts = XmCreatePushButtonGadget(pd->form, "MoreOpts",
1158 XtAddCallback(pd->more_opts, XmNactivateCallback,
1159 more_opts_cb, (XtPointer)c);
1160 XtManageChild(pd->more_opts);
1161 XmStringFree(xmstr);
1165 XtSetArg(args[nargs], XmNleftAttachment, XmATTACH_FORM); nargs++;
1166 XtSetArg(args[nargs], XmNleftOffset, 10); nargs++;
1167 XtSetArg(args[nargs], XmNtopAttachment,
1168 XmATTACH_OPPOSITE_WIDGET); nargs++;
1169 XtSetArg(args[nargs], XmNtopWidget, pd->more_opts); nargs++;
1170 XtSetArg(args[nargs], XmNtopOffset, 10); nargs++;
1171 pd->debugToggle = XmCreateToggleButtonGadget(pd->form, "Debug Mode",
1173 XtManageChild(pd->debugToggle);
1176 XtManageChild(pd->form);
1178 pd->setupDataValid = False;
1180 pd->printShell = (Widget)NULL;
1181 pd->badAllocError = False;
1184 /* Set report type and dates according to current view/day. */
1185 switch (c->view->glance) {
1186 case dayGlance : reportType = PR_DAY_VIEW; break;
1187 case weekGlance : reportType = PR_WEEK_VIEW; break;
1188 case yearGlance : reportType = PR_YEAR_VIEW; break;
1190 case monthGlance : reportType = PR_MONTH_VIEW; break;
1193 pd_set_report_type(c, reportType);
1195 pd_set_start_date(c, c->view->date);
1196 pd_set_end_date(c, c->view->date);
1203 cancel_cb(Widget w, XtPointer data, XtPointer ignore)
1205 Calendar *c = (Calendar *)data;
1206 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1208 XtUnmanageChild(pd->pdb);
1212 report_error(Calendar *c, char *title, char *errText)
1214 Props_pu *pu = (Props_pu *)c->properties_pu;
1217 label = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
1219 dialog_popup(c->frame,
1220 DIALOG_TITLE, title,
1221 DIALOG_TEXT, errText,
1222 BUTTON_IDENT, 1, label,
1223 DIALOG_IMAGE, pu->xm_error_pixmap,
1230 pdm_notify_cb(Widget w, XtPointer uData, XtPointer cbData)
1232 XmPrintShellCallbackStruct *cbStruct =
1233 (XmPrintShellCallbackStruct *)cbData;
1234 Calendar *c = (Calendar *)uData;
1235 char *errText = (char *)NULL;
1238 switch (cbStruct->reason)
1241 case XmCR_PDM_START_ERROR:
1242 case XmCR_PDM_EXIT_ERROR:
1243 errText = XtNewString(catgets(c->DT_catd, 1, 1112, pdmErrorText));
1252 title = XtNewString(catgets(c->DT_catd, 1, 1111, setupErrorTitle));
1254 report_error(c, title, errText);
1262 * Called when print dialog box's print display is closed.
1265 close_print_display_cb(Widget w, XtPointer uData, XtPointer cbData)
1267 Calendar *c = (Calendar *)uData;
1268 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1270 if (pd != (_DtCmPrintData *)NULL)
1272 /* Destroy printShell associated with Display, if any. */
1273 if (pd->printShell != (Widget)NULL)
1275 XtDestroyWidget(pd->printShell);
1276 pd->printShell = (Widget)NULL;
1284 * Print callback: do the deed!
1287 print_cb(Widget w, XtPointer data, XtPointer cbDataP)
1289 Calendar *c = (Calendar *)data;
1290 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1291 DtPrintSetupCallbackStruct *cbStruct =
1292 (DtPrintSetupCallbackStruct *)cbDataP;
1295 DtPrintCopySetupData(&pd->setupData, cbStruct->print_data);
1296 pd->setupDataValid = True;
1298 _DtTurnOnHourGlass(c->frame);
1300 _DtTurnOffHourGlass(c->frame);
1302 /* Leave setupDataValid=True for quick print! */
1306 print_setup_cb(Widget w, XtPointer uData, XtPointer cbData)
1308 Calendar *c = (Calendar *)uData;
1309 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1310 DtPrintSetupCallbackStruct *cbStruct =
1311 (DtPrintSetupCallbackStruct *)cbData;
1314 DtPrintCopySetupData(&pd->setupData, cbStruct->print_data);
1315 pd->setupDataValid = True;
1318 /* Force debug mode off. */
1320 XmToggleButtonGadgetSetState(pd->debugToggle, False, False);
1323 createPrintShell(c);
1325 if (XmPrintPopupPDM(pd->printShell, w) != XmPDM_NOTIFY_SUCCESS)
1327 char *errText = XtNewString(catgets(c->DT_catd, 1, 1112,
1329 char *title = XtNewString(catgets(c->DT_catd, 1, 1111, setupErrorTitle));
1331 report_error(c, title, errText);
1341 * print_report: dispatch the view-specific output routine
1344 print_report(Calendar *c)
1346 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1347 Props *p = (Props *) c->properties;
1348 Props_pu *pu = (Props_pu *) c->properties_pu;
1349 int r = pd_get_report_type(c);
1350 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
1351 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
1352 Tick start_date = pd_get_start_date(c);
1353 Tick end_date = pd_get_end_date(c);
1354 char *text = (char *)NULL;
1356 if ((start_date == DATE_BBOT) || (end_date == DATE_BBOT) ||
1357 (start_date == DATE_AEOT) || (end_date == DATE_BBOT))
1359 text = XtNewString(catgets(c->DT_catd, 1, 892,
1360 "The dates for printing must be between 1969 and 2038."));
1362 else if (start_date <= 0)
1364 text = XtNewString(catgets(c->DT_catd, 1, 894,
1365 "Malformed \"From\" date"));
1367 else if (end_date <= 0)
1369 text = XtNewString(catgets(c->DT_catd, 1, 896,
1370 "Malformed \"To\" date"));
1372 else if (start_date > end_date)
1374 text = XtNewString(catgets(c->DT_catd, 1, 898,
1375 "The \"To\" date for printing must be after the \"From\" date for printing"));
1380 char *title = XtNewString(catgets(c->DT_catd, 1, 736, printErrorTitle));
1382 report_error(c, title, text);
1389 if (pd == (_DtCmPrintData *)NULL)
1392 if (!pd->setupDataValid)
1394 if (DtPrintFillSetupData(pd->pdb, &pd->setupData) != DtPRINT_SUCCESS)
1397 * NOTE: DtPrintFillSetupData() displays an error dialog if
1398 * it is unsuccessful; no need to display our own.
1403 pd->setupDataValid = True;
1406 if (XtIsManaged(pd->pdb))
1407 _DtTurnOnHourGlass(XtParent(pd->pdb));
1409 createPrintShell(c);
1414 print_std_year_range(year(start_date), year(end_date));
1418 print_month_range(c, start_date, end_date);
1421 print_week_range(c, start_date, end_date);
1424 print_day_range(c, start_date, end_date);
1427 x_print_list_range(c, CSA_TYPE_EVENT, (int) c->view->glance,
1428 start_date, end_date);
1431 x_print_list_range(c, CSA_TYPE_TODO, (int) VIEW_ALL,
1432 start_date, end_date);
1439 XtDestroyWidget(pd->printShell);
1440 pd->printShell = (Widget)NULL;
1444 if (XtIsManaged(pd->pdb))
1446 _DtTurnOffHourGlass(XtParent(pd->pdb));
1447 XtUnmanageChild(pd->pdb);
1450 /* Keep setupDataValid=True for future QuickPrint operations. */
1456 * callback for report-type option menu.
1457 * Here we just store the button number of the selected
1458 * button in the print_data structure, to make life easy
1459 * when the print callback is invoked.
1462 report_option_cb(Widget w, XtPointer client_data, XtPointer call_data)
1464 int choice = (int) client_data;
1465 Calendar *c = calendar;
1467 pd_set_report_managed(c, choice);
1469 pd_set_start_date(c, pd_get_start_date(c));
1470 pd_set_end_date(c, pd_get_end_date(c));
1474 pd_get_printer_name(Calendar *c)
1476 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1478 if ((pd == (_DtCmPrintData *)NULL) ||
1479 (!pd->setupDataValid) ||
1480 pd_print_to_file(c))
1481 return (char *)NULL;
1483 return pd->setupData.printer_name ?
1484 XtNewString(pd->setupData.printer_name) : (char *)NULL;
1488 pd_get_copies(Calendar *c)
1490 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1493 if (pd == (_DtCmPrintData *)NULL)
1496 XtVaGetValues(pd->pdb, DtNcopies, &nCopies, NULL);
1501 pd_get_start_date(Calendar *c)
1503 int dayPos, monthPos, yearPos;
1505 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
1508 return monthdayyear(monthPos + 1, dayPos, yearPos);
1512 pd_get_end_date(Calendar *c)
1514 int dayPos, monthPos, yearPos;
1516 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
1519 return monthdayyear(monthPos + 1, dayPos, yearPos);
1523 pd_get_print_options(Calendar *c)
1525 return XtNewString("");
1529 pd_print_to_file(Calendar *c)
1531 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1533 if ((pd == (_DtCmPrintData *)NULL) ||
1534 (!pd->setupDataValid))
1537 return pd->setupData.destination == DtPRINT_TO_FILE;
1541 pd_get_file_name(Calendar *c)
1543 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1545 if ((pd == (_DtCmPrintData *)NULL) ||
1546 (!pd->setupDataValid) ||
1547 !pd_print_to_file(c))
1548 return (char *)NULL;
1550 return pd->setupData.dest_info ?
1551 XtNewString(pd->setupData.dest_info) : (char *)NULL;
1555 pd_get_report_type(Calendar *c)
1557 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1559 if (pd == (_DtCmPrintData *)NULL)
1560 return PR_MONTH_VIEW;
1562 return pd->report_type;
1566 pd_get_print_shell(Calendar *c)
1568 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1570 if (pd == (_DtCmPrintData *)NULL)
1571 return (Widget)NULL;
1573 return pd->printShell;
1577 pd_get_print_display(Calendar *c)
1579 Widget printShell = pd_get_print_shell(c);
1581 if (printShell == (Widget)NULL)
1582 return (Display *)NULL;
1584 return XtDisplay(printShell);
1588 pd_set_bad_alloc_error(Calendar *c, Boolean errorOn)
1590 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1592 if (pd != (_DtCmPrintData *)NULL)
1593 pd->badAllocError = errorOn;
1597 pd_get_bad_alloc_error(Calendar *c)
1599 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1601 if (pd != (_DtCmPrintData *)NULL)
1602 return pd->badAllocError;