2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: print.c /main/18 1996/11/25 10:23:05 rswiston $ */
25 * (c) Copyright 1993, 1994 Hewlett-Packard Company
26 * (c) Copyright 1993, 1994 International Business Machines Corp.
27 * (c) Copyright 1993, 1994 Novell, Inc.
28 * (c) Copyright 1993, 1994 Sun Microsystems, Inc.
31 #include <EUSCompat.h>
39 #include <Xm/LabelG.h>
40 #include <Xm/DialogS.h>
42 #include <Xm/Protocols.h>
43 #include <Xm/PushBG.h>
44 #include <Xm/SeparatoG.h>
48 #include <Xm/ToggleB.h>
49 #include <Xm/ToggleBG.h>
51 #include <Xm/SSpinB.h>
52 #include <Xm/RowColumn.h>
53 #include <Dt/HourGlass.h>
59 #include "datefield.h"
66 /* needed for view-specific print routines */
67 #include "dayglance.h"
68 #include "weekglance.h"
69 #include "monthglance.h"
70 #include "yearglance.h"
72 static char *printErrorTitle = "Calendar : Error - Print";
73 static char *setupErrorTitle = "Calendar : Error - Print Setup";
74 static char *pdmErrorText = "Print Dialog Manager error - setup failed.";
80 Widget report_type_option;
97 Boolean setupDataValid;
98 DtPrintSetupData setupData;
100 Boolean badAllocError;
104 * private function declarations
106 static void print_cb(Widget, XtPointer, XtPointer);
107 static void print_setup_cb(Widget, XtPointer, XtPointer);
108 static void close_print_display_cb(Widget, XtPointer, XtPointer);
109 static void cancel_cb(Widget, XtPointer, XtPointer);
110 static void pdm_notify_cb(Widget, XtPointer, XtPointer);
111 static void report_option_cb(Widget, XtPointer, XtPointer);
112 static void from_modify_verify_cb(Widget, XtPointer, XtPointer);
113 static void to_modify_verify_cb(Widget, XtPointer, XtPointer);
114 static void spin_field_changed_cb(Widget, XtPointer, XtPointer);
115 static void more_opts_cb(Widget, XtPointer, XtPointer);
116 static Tick pd_modify_day(Calendar *, int, Boolean);
117 static Tick pd_modify_month(Calendar *, int, Boolean);
118 static Tick pd_modify_year(Calendar *, int, Boolean);
119 static Boolean pd_set_start_date(Calendar *, Tick);
120 static Boolean pd_set_end_date(Calendar *, Tick);
121 static Boolean pd_set_max_start_date(Calendar *, Tick);
122 static Boolean pd_set_min_end_date(Calendar *, Tick);
123 static Boolean pd_set_report_type(Calendar *, int);
124 static Boolean pd_set_report_managed(Calendar *, int);
125 static Boolean pd_get_start_positions(Calendar *, int *, int *, int *);
126 static Boolean pd_get_end_positions(Calendar *, int *, int *, int *);
127 static void clearSetupData(_DtCmPrintData *);
128 static void createPrintShell(Calendar *);
129 static void report_error(Calendar *, char *, char *);
133 inDebugMode(Calendar *c)
135 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
136 if (pd != (_DtCmPrintData *)NULL)
137 return XmToggleButtonGadgetGetState(pd->debugToggle);
144 pd_set_start_date(Calendar *c, Tick tick)
146 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
147 Props *p = (Props *)c->properties;
148 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
149 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
153 if (pd == (_DtCmPrintData *)NULL)
156 if (tick > get_eot())
159 if (pd_get_report_type(c) == PR_WEEK_VIEW)
161 /* Week view - start at Monday. */
162 tick = first_dow(tick);
165 if (tick < get_bot())
168 if (XtIsManaged(pd->from_day))
171 XtSetArg(args[nargs], XmNposition, dom(tick)); nargs++;
172 XtSetArg(args[nargs], XmNmaximumValue, monthlength(tick)); nargs++;
173 XtSetValues(pd->from_day, args, nargs);
175 if (XtIsManaged(pd->from_month))
177 XtSetArg(args[0], XmNposition, month(tick) - 1);
178 XtSetValues(pd->from_month, args, 1);
180 XtSetArg(args[0], XmNposition, year(tick));
181 XtSetValues(pd->from_year, args, 1);
187 pd_set_end_date(Calendar *c, Tick tick)
189 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
190 Props *p = (Props *)c->properties;
191 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
192 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
196 if (pd == (_DtCmPrintData *)NULL)
199 if (tick < get_bot())
202 if (pd_get_report_type(c) == PR_WEEK_VIEW)
204 /* Week view - end on Sunday. */
205 tick = last_dow(tick);
208 if (tick > get_eot())
211 if (XtIsManaged(pd->to_day))
214 XtSetArg(args[nargs], XmNposition, dom(tick)); nargs++;
215 XtSetArg(args[nargs], XmNmaximumValue, monthlength(tick)); nargs++;
216 XtSetValues(pd->to_day, args, nargs);
218 if (XtIsManaged(pd->to_month))
220 XtSetArg(args[0], XmNposition, month(tick) - 1);
221 XtSetValues(pd->to_month, args, 1);
223 XtSetArg(args[0], XmNposition, year(tick));
224 XtSetValues(pd->to_year, args, 1);
230 pd_set_max_start_date(Calendar *c, Tick tick)
232 Tick curTick = pd_get_start_date(c);
234 return (tick < curTick) ? pd_set_start_date(c, tick) : True;
238 pd_set_min_end_date(Calendar *c, Tick tick)
240 Tick curTick = pd_get_end_date(c);
242 return (tick > curTick) ? pd_set_end_date(c, tick) : True;
246 pd_set_report_type(Calendar *c, int reportType)
248 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
249 Widget optionMenu = (Widget)NULL;
253 if (pd == (_DtCmPrintData *)NULL)
256 if (reportType == pd->report_type)
260 XtSetArg(args[nargs], XmNsubMenuId, &optionMenu); nargs++;
261 XtGetValues(pd->report_type_option, args, nargs);
263 if (optionMenu != (Widget)NULL)
265 WidgetList optionChildren;
269 XtSetArg(args[nargs], XmNchildren, &optionChildren); nargs++;
270 XtSetArg(args[nargs], XmNnumChildren, &nChildren); nargs++;
271 XtGetValues(optionMenu, args, nargs);
273 if (nChildren > reportType)
276 XtSetArg(args[nargs], XmNmenuHistory,
277 optionChildren[reportType]); nargs++;
278 XtSetValues(pd->report_type_option, args, nargs);
280 return pd_set_report_managed(c, reportType);
288 pd_set_report_managed(Calendar *c, int reportType)
290 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
294 if (pd == (_DtCmPrintData *)NULL)
297 if (reportType == pd->report_type)
300 pd->report_type = reportType;
305 XtManageChild(pd->from_year);
306 XtManageChild(pd->to_year);
308 XtUnmanageChild(pd->from_day);
309 XtUnmanageChild(pd->from_month);
310 XtUnmanageChild(pd->to_day);
311 XtUnmanageChild(pd->to_month);
315 XtManageChild(pd->from_year);
316 XtManageChild(pd->from_month);
317 XtManageChild(pd->from_day);
318 XtManageChild(pd->to_year);
319 XtManageChild(pd->to_month);
320 XtManageChild(pd->to_day);
323 XtSetArg(args[nargs], XmNeditable, False); nargs++;
324 XtSetArg(args[nargs], XmNcursorPositionVisible, False); nargs++;
325 XtSetValues(pd->from_day, args, nargs);
326 XtSetValues(pd->to_day, args, nargs);
332 XtManageChild(pd->from_year);
333 XtManageChild(pd->from_month);
334 XtManageChild(pd->from_day);
335 XtManageChild(pd->to_year);
336 XtManageChild(pd->to_month);
337 XtManageChild(pd->to_day);
340 XtSetArg(args[nargs], XmNeditable, True); nargs++;
341 XtSetArg(args[nargs], XmNcursorPositionVisible, True); nargs++;
342 XtSetValues(pd->from_day, args, nargs);
343 XtSetValues(pd->to_day, args, nargs);
348 XtManageChild(pd->from_year);
349 XtManageChild(pd->from_month);
350 XtManageChild(pd->to_year);
351 XtManageChild(pd->to_month);
353 XtUnmanageChild(pd->from_day);
354 XtUnmanageChild(pd->to_day);
362 pd_get_start_positions(Calendar *c, int *m, int *d, int *y)
364 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
365 int dayPos = 1, monthPos = 0, yearPos;
367 if (pd == (_DtCmPrintData *)NULL)
370 if (XtIsManaged(pd->from_day))
371 XtVaGetValues(pd->from_day, XmNposition, &dayPos, NULL);
372 if (XtIsManaged(pd->from_month))
373 XtVaGetValues(pd->from_month, XmNposition, &monthPos, NULL);
374 XtVaGetValues(pd->from_year, XmNposition, &yearPos, NULL);
384 pd_get_end_positions(Calendar *c, int *m, int *d, int *y)
386 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
387 int dayPos = 1, monthPos = 0, yearPos;
389 if (pd == (_DtCmPrintData *)NULL)
392 if (XtIsManaged(pd->to_day))
393 XtVaGetValues(pd->to_day, XmNposition, &dayPos, NULL);
394 if (XtIsManaged(pd->to_month))
395 XtVaGetValues(pd->to_month, XmNposition, &monthPos, NULL);
396 XtVaGetValues(pd->to_year, XmNposition, &yearPos, NULL);
406 from_modify_verify_cb(Widget w, XtPointer uDataP, XtPointer cbDataP)
408 Calendar *c = (Calendar *)uDataP;
409 XmSpinBoxCallbackStruct *cbStruct = (XmSpinBoxCallbackStruct *)cbDataP;
410 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
414 cbStruct->doit = False;
416 if (cbStruct->widget == pd->from_day)
418 newTick = pd_modify_day(c, cbStruct->reason, False);
420 else if (cbStruct->widget == pd->from_month)
422 newTick = pd_modify_month(c, cbStruct->reason, False);
424 else if (cbStruct->widget == pd->from_year)
426 newTick = pd_modify_year(c, cbStruct->reason, False);
430 if (pd_set_start_date(c, newTick) && pd_set_min_end_date(c, newTick))
432 int monthPos, dayPos, yearPos;
434 pd_get_start_positions(c, &monthPos, &dayPos, &yearPos);
435 if (cbStruct->widget == pd->from_day)
436 cbStruct->position = dayPos;
437 else if (cbStruct->widget == pd->from_month)
438 cbStruct->position = monthPos;
439 else cbStruct->position = yearPos;
440 cbStruct->doit = True;
445 to_modify_verify_cb(Widget w, XtPointer uDataP, XtPointer cbDataP)
447 Calendar *c = (Calendar *)uDataP;
448 XmSpinBoxCallbackStruct *cbStruct = (XmSpinBoxCallbackStruct *)cbDataP;
449 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
452 cbStruct->doit = False;
454 if (cbStruct->widget == pd->to_day)
456 newTick = pd_modify_day(c, cbStruct->reason, True);
458 else if (cbStruct->widget == pd->to_month)
460 newTick = pd_modify_month(c, cbStruct->reason, True);
462 else if (cbStruct->widget == pd->to_year)
464 newTick = pd_modify_year(c, cbStruct->reason, True);
468 if (pd_set_end_date(c, newTick) && pd_set_max_start_date(c, newTick))
470 int monthPos, dayPos, yearPos;
472 pd_get_end_positions(c, &monthPos, &dayPos, &yearPos);
473 if (cbStruct->widget == pd->to_day)
474 cbStruct->position = dayPos;
475 else if (cbStruct->widget == pd->to_month)
476 cbStruct->position = monthPos;
477 else cbStruct->position = yearPos;
478 cbStruct->doit = True;
483 spin_field_changed_cb(Widget field, XtPointer uData, XtPointer cbData)
488 unsigned char sbcType;
492 XmStringTable strings;
498 XtSetArg(args[nargs], XmNspinBoxChildType, &sbcType); nargs++;
499 XtSetArg(args[nargs], XmNmaximumValue, &maxValue); nargs++;
500 XtSetArg(args[nargs], XmNminimumValue, &minValue); nargs++;
501 XtSetArg(args[nargs], XmNnumValues, &nValues); nargs++;
502 XtSetArg(args[nargs], XmNposition, &curPos); nargs++;
503 XtSetArg(args[nargs], XmNvalues, &strings); nargs++;
504 XtSetArg(args[nargs], XmNvalue, &newStr); nargs++;
505 XtSetArg(args[nargs], XmNcursorPosition, &cursorPosition); nargs++;
506 XtGetValues(field, args, nargs);
509 if (sbcType == XmSTRING)
511 XmString xmString = XmStringCreateLocalized(newStr);
513 for (newPos = 0; newPos < nValues; newPos++)
515 if (XmStringCompare(xmString, strings[newPos]))
519 if (newPos >= nValues)
522 XmStringFree(xmString);
524 else if (sbcType == XmNUMERIC)
526 newPos = atoi(newStr);
528 if ((newPos < minValue) ||
533 if (newPos != curPos)
536 XtSetArg(args[nargs], XmNposition, newPos); nargs++;
537 XtSetValues(field, args, nargs);
539 /* After the above does its thing, restore original cursor position. */
541 XtSetArg(args[nargs], XmNcursorPosition, cursorPosition); nargs++;
542 XtSetValues(field, args, nargs);
549 more_opts_cb(Widget w, XtPointer uData, XtPointer cbData)
551 Calendar *c = (Calendar *)uData;
552 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
554 _DtTurnOnHourGlass(c->frame);
555 _DtTurnOnHourGlass(pd->pdb);
557 show_print_props_pu(c);
559 _DtTurnOffHourGlass(pd->pdb);
560 _DtTurnOffHourGlass(c->frame);
564 pd_modify_day(Calendar *c, int reason, Boolean isTo)
566 int monthPos, dayPos, yearPos;
571 int reportType = pd_get_report_type(c);
575 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
580 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
587 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
588 maxDay = monthlength(tmpTick);
589 if ((dayPos == 1) || (dayPos > maxDay))
592 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
593 newTick = (reportType == PR_WEEK_VIEW) ?
594 nextweek(curTick) : nextday(curTick);
597 case XmCR_SPIN_PRIOR:
598 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
599 maxDay = monthlength(tmpTick);
600 if (dayPos >= maxDay)
603 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
604 newTick = (reportType == PR_WEEK_VIEW) ?
605 prevweek(curTick) : prevday(curTick);
609 case XmCR_SPIN_FIRST:
610 newTick = monthdayyear(monthPos + 1, 1, yearPos);
611 if (reportType == PR_WEEK_VIEW)
615 /* We want the first Sunday in the month. */
616 newTick = last_dow(newTick);
620 /* We want the first Monday in the month. */
621 int dayOffset = (dow(newTick) + 6) % 7;
624 newTick = next_ndays(newTick, 7 - dayOffset);
630 curTick = monthdayyear(monthPos + 1, 1, yearPos);
631 newTick = last_dom(curTick);
632 if (reportType == PR_WEEK_VIEW)
636 /* We want the last Sunday in the month. */
637 int dayOffset = dow(newTick);
640 newTick = last_ndays(newTick, dayOffset);
644 /* We want the last Monday in the month. */
645 newTick = first_dow(newTick);
655 pd_modify_month(Calendar *c, int reason, Boolean isTo)
657 int monthPos, dayPos, yearPos;
662 int reportType = pd_get_report_type(c);
666 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
671 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
682 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
683 if (reportType == PR_WEEK_VIEW)
684 newTick = next_ndays(curTick, 4 * 7);
687 tmpTick = nextmonth(curTick);
688 maxDay = monthlength(tmpTick);
691 newTick = monthdayyear(month(tmpTick), dayPos, year(tmpTick));
695 case XmCR_SPIN_PRIOR:
700 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
701 if (reportType == PR_WEEK_VIEW)
702 newTick = last_ndays(curTick, 4 * 7);
705 /* ... There is no prevmonth()! ... */
706 tmpTick = prev_nmonth(curTick, 1);
707 maxDay = monthlength(tmpTick);
710 newTick = monthdayyear(month(tmpTick), dayPos, year(tmpTick));
715 case XmCR_SPIN_FIRST:
716 newTick = monthdayyear(1, 1, yearPos);
717 if (reportType == PR_WEEK_VIEW)
721 /* We want the first Sunday in the month. */
722 newTick = last_dow(newTick);
726 /* We want the first Monday in the month. */
727 int dayOffset = (dow(newTick) + 6) % 7;
730 newTick = next_ndays(newTick, 7 - dayOffset);
736 newTick = monthdayyear(12, 31, yearPos);
737 if (reportType == PR_WEEK_VIEW)
741 /* We want the last Sunday in the month. */
742 int dayOffset = dow(newTick);
745 newTick = last_ndays(newTick, dayOffset);
749 /* We want the last Monday in the month. */
750 newTick = first_dow(newTick);
760 pd_modify_year(Calendar *c, int reason, Boolean isTo)
762 int monthPos, dayPos, yearPos;
767 int reportType = pd_get_report_type(c);
771 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
776 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
785 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
786 if (reportType == PR_WEEK_VIEW)
787 newTick = next_ndays(curTick, 52 * 7);
790 tmpTick = monthdayyear(monthPos + 1, 1, yearPos + 1);
791 maxDay = monthlength(tmpTick);
794 newTick = monthdayyear(monthPos + 1, dayPos, yearPos + 1);
798 case XmCR_SPIN_PRIOR:
801 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
802 if (reportType == PR_WEEK_VIEW)
803 newTick = last_ndays(curTick, 52 * 7);
806 tmpTick = monthdayyear(monthPos + 1, 1, yearPos - 1);
807 maxDay = monthlength(tmpTick);
810 newTick = monthdayyear(monthPos + 1, dayPos, yearPos - 1);
815 case XmCR_SPIN_FIRST:
816 yearPos = year(get_bot());
817 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
818 maxDay = monthlength(tmpTick);
821 newTick = monthdayyear(monthPos + 1, dayPos, yearPos);
825 yearPos = year(get_eot());
826 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
827 maxDay = monthlength(tmpTick);
830 newTick = monthdayyear(monthPos + 1, dayPos, yearPos);
838 * post_print_dialog()
840 * Create and display the Print dialog.
848 create_print_dialog(c);
850 /* display the dialog on-screen */
851 if ((pd = (_DtCmPrintData *)c->print_data) != (_DtCmPrintData *)NULL)
853 if (!XtIsManaged(pd->pdb))
854 XtManageChild(pd->pdb);
855 else XRaiseWindow(XtDisplay(pd->pdb),
856 XtWindow(XtParent(pd->pdb)));
861 clearSetupData(_DtCmPrintData *pd)
863 if (pd->setupDataValid)
865 DtPrintFreeSetupData(&pd->setupData);
866 pd->setupDataValid = False;
869 memset(&pd->setupData, 0, sizeof(DtPrintSetupData));
873 createPrintShell(Calendar *c)
875 #if defined(PRINTING_SUPPORTED)
876 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
881 if (pd->printShell != (Widget)NULL)
882 XtDestroyWidget(pd->printShell);
884 pd->printShell = XmCreateDialogShell(c->frame, "Print",
889 if (pd->printShell == (Widget)NULL)
892 XmPrintSetup(pd->pdb,
893 XpGetScreenOfContext(pd->setupData.print_display,
894 pd->setupData.print_context),
897 XtAddCallback(pd->printShell, XmNpdmNotificationCallback,
898 pdm_notify_cb, (XtPointer)c);
900 #endif /* PRINTING_SUPPORTED */
904 create_print_dialog(Calendar *c)
906 XmString xmstr, day_view, week_view, month_view,
907 year_view, appt_list, todo_list, view;
909 char fnamebuf[BUFSIZ];
915 XmString abbrevMonths[12];
921 if ((pd = (_DtCmPrintData *)c->print_data) == NULL)
923 c->print_data = (caddr_t)XtMalloc(sizeof(_DtCmPrintData));
924 pd = (_DtCmPrintData *) c->print_data;
926 /* Initialize filename to dir+filename from props */
927 print_file = get_char_prop((Props *)c->properties,CP_PRINTFILENAME);
930 print_dir = get_char_prop((Props *)c->properties,CP_PRINTDIRNAME);
933 sprintf(fnamebuf, "%s/%s", print_dir, print_file);
935 title = XtNewString(catgets(c->DT_catd, 1, 728, "Calendar : Print"));
937 XtSetArg(args[nargs], XmNtitle, title); nargs++;
938 XtSetArg(args[nargs], XmNdeleteResponse, XmUNMAP); nargs++;
939 XtSetArg(args[nargs], DtNfileName, fnamebuf); nargs++;
940 XtSetArg(args[nargs], XmNautoUnmanage, False); nargs++;
941 XtSetArg(args[nargs], XmNdeleteResponse, XmDO_NOTHING); nargs++;
942 pd->pdb = DtCreatePrintSetupDialog(c->frame, "Calendar - Print",
946 setup_quit_handler(XtParent(pd->pdb), cancel_cb, (XtPointer)c);
948 XtAddCallback(pd->pdb, DtNcancelCallback,
949 cancel_cb, (XtPointer)c);
950 XtAddCallback(pd->pdb, DtNprintCallback,
951 print_cb, (XtPointer)c);
952 XtAddCallback(pd->pdb, DtNclosePrintDisplayCallback,
953 close_print_display_cb, (XtPointer)c);
954 XtAddCallback(pd->pdb, DtNsetupCallback,
955 print_setup_cb, (XtPointer)c);
957 helpButton = XtNameToWidget(pd->pdb, "Help");
958 if (helpButton != (Widget)NULL)
959 XtAddCallback(helpButton, XmNactivateCallback,
960 help_cb, (XtPointer)PRINT_HELP_BUTTON);
961 XtAddCallback(pd->pdb, XmNhelpCallback,
962 help_cb, (XtPointer)PRINT_HELP_BUTTON);
965 XtSetArg(args[nargs], XmNfractionBase, 3); nargs++;
966 pd->form = XmCreateForm(pd->pdb, "RangeForm", args, nargs);
968 view = XmStringCreateLocalized(
969 catgets(c->DT_catd, 1, 976, "Report Type:"));
970 day_view = XmStringCreateLocalized(
971 catgets(c->DT_catd, 1, 977, "Day View"));
972 week_view = XmStringCreateLocalized(
973 catgets(c->DT_catd, 1, 978, "Week View"));
974 month_view = XmStringCreateLocalized(
975 catgets(c->DT_catd, 1, 979, "Month View"));
976 year_view = XmStringCreateLocalized(
977 catgets(c->DT_catd, 1, 980, "Year View"));
978 appt_list = XmStringCreateLocalized(
979 catgets(c->DT_catd, 1, 981, "Appointment List"));
980 todo_list = XmStringCreateLocalized(
981 catgets(c->DT_catd, 1, 982, "To Do List"));
984 * remember - this returns a RowColumn widget!
986 pd->report_type = PR_DAY_VIEW;
987 pd->report_type_option = XmVaCreateSimpleOptionMenu(pd->form,
988 "TypeOptionMenu", view, 0,
989 pd->report_type, report_option_cb,
990 XmVaPUSHBUTTON, day_view, NULL, NULL, NULL,
991 XmVaPUSHBUTTON, week_view, NULL, NULL, NULL,
992 XmVaPUSHBUTTON, month_view, NULL, NULL, NULL,
993 XmVaPUSHBUTTON, year_view, NULL, NULL, NULL,
994 XmVaPUSHBUTTON, appt_list, NULL, NULL, NULL,
995 XmVaPUSHBUTTON, todo_list, NULL, NULL, NULL,
996 XmNorientation, XmVERTICAL,
997 XmNtopAttachment, XmATTACH_FORM,
999 XmNleftAttachment, XmATTACH_POSITION,
1003 XmNnavigationType, XmTAB_GROUP,
1005 XtManageChild(pd->report_type_option);
1007 XmStringFree(day_view);
1008 XmStringFree(week_view);
1009 XmStringFree(month_view);
1010 XmStringFree(year_view);
1011 XmStringFree(appt_list);
1012 XmStringFree(todo_list);
1015 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
1017 pd->from_label = XtVaCreateWidget("FromLabel",
1020 XmNlabelString, xmstr,
1021 XmNleftAttachment, XmATTACH_POSITION,
1024 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1025 XmNtopWidget, pd->report_type_option,
1028 XmStringFree(xmstr);
1029 XtManageChild(pd->from_label);
1032 XtSetArg(args[nargs], XmNleftAttachment,
1033 XmATTACH_OPPOSITE_WIDGET); nargs++;
1034 XtSetArg(args[nargs], XmNleftWidget, pd->from_label); nargs++;
1035 XtSetArg(args[nargs], XmNleftOffset, 0); nargs++;
1036 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1037 XtSetArg(args[nargs], XmNtopWidget, pd->from_label); nargs++;
1038 XtSetArg(args[nargs], XmNtopOffset, 4); nargs++;
1039 XtSetArg(args[nargs], XmNshadowThickness, 1); nargs++;
1040 pd->from_spin = XmCreateSpinBox(pd->form, "FromSpinBox",
1042 XtAddCallback(pd->from_spin, XmNmodifyVerifyCallback,
1043 from_modify_verify_cb, (XtPointer)c);
1046 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1047 XtSetArg(args[nargs], XmNminimumValue, 1); nargs++;
1048 XtSetArg(args[nargs], XmNmaximumValue, 31); nargs++;
1049 XtSetArg(args[nargs], XmNcolumns, 2); nargs++;
1050 XtSetArg(args[nargs], XmNmaxLength, 2); nargs++;
1051 XtSetArg(args[nargs], XmNposition, 1); nargs++;
1052 pd->from_day = XmCreateTextField(pd->from_spin, "FromDay",
1054 XtAddCallback(pd->from_day, XmNvalueChangedCallback,
1055 spin_field_changed_cb, (XtPointer)NULL);
1056 XtManageChild(pd->from_day);
1059 for (i = 0; i < 12; i++)
1061 abbrevMonths[i] = XmStringCreateLocalized(months2[i + 1]);
1062 if (cm_strlen(months2[i + 1]) > maxMonthLen)
1063 maxMonthLen = cm_strlen(months2[i + 1]);
1066 XtSetArg(args[nargs], XmNspinBoxChildType, XmSTRING); nargs++;
1067 XtSetArg(args[nargs], XmNnumValues, 12); nargs++;
1068 XtSetArg(args[nargs], XmNvalues, abbrevMonths); nargs++;
1069 XtSetArg(args[nargs], XmNcolumns, maxMonthLen); nargs++;
1070 XtSetArg(args[nargs], XmNmaxLength, maxMonthLen); nargs++;
1071 XtSetArg(args[nargs], XmNposition, 0); nargs++;
1072 pd->from_month = XmCreateTextField(pd->from_spin, "FromMonth",
1074 XtAddCallback(pd->from_month, XmNvalueChangedCallback,
1075 spin_field_changed_cb, (XtPointer)NULL);
1076 XtManageChild(pd->from_month);
1079 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1080 XtSetArg(args[nargs], XmNminimumValue,
1081 year(get_bot())); nargs++;
1082 XtSetArg(args[nargs], XmNmaximumValue,
1083 year(get_eot())); nargs++;
1084 XtSetArg(args[nargs], XmNcolumns, 4); nargs++;
1085 XtSetArg(args[nargs], XmNmaxLength, 4); nargs++;
1086 XtSetArg(args[nargs], XmNposition,
1087 year(get_bot())); nargs++;
1088 XtSetArg(args[nargs], XmNwrap, False); nargs++;
1089 pd->from_year = XmCreateTextField(pd->from_spin, "FromYear",
1091 XtAddCallback(pd->from_year, XmNvalueChangedCallback,
1092 spin_field_changed_cb, (XtPointer)NULL);
1093 XtManageChild(pd->from_year);
1094 XtManageChild(pd->from_spin);
1096 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
1098 pd->to_label = XtVaCreateWidget("ToLabel",
1101 XmNlabelString, xmstr,
1102 XmNleftAttachment, XmATTACH_POSITION,
1105 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1106 XmNtopWidget, pd->report_type_option,
1109 XmStringFree(xmstr);
1110 XtManageChild(pd->to_label);
1113 XtSetArg(args[nargs], XmNleftAttachment,
1114 XmATTACH_OPPOSITE_WIDGET); nargs++;
1115 XtSetArg(args[nargs], XmNleftWidget, pd->to_label); nargs++;
1116 XtSetArg(args[nargs], XmNleftOffset, 0); nargs++;
1117 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1118 XtSetArg(args[nargs], XmNtopWidget, pd->to_label); nargs++;
1119 XtSetArg(args[nargs], XmNtopOffset, 4); nargs++;
1120 XtSetArg(args[nargs], XmNshadowThickness, 1); nargs++;
1121 pd->to_spin = XmCreateSpinBox(pd->form, "ToSpinBox",
1123 XtAddCallback(pd->to_spin, XmNmodifyVerifyCallback,
1124 to_modify_verify_cb, (XtPointer)c);
1127 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1128 XtSetArg(args[nargs], XmNminimumValue, 1); nargs++;
1129 XtSetArg(args[nargs], XmNmaximumValue, 31); nargs++;
1130 XtSetArg(args[nargs], XmNcolumns, 2); nargs++;
1131 XtSetArg(args[nargs], XmNmaxLength, 2); nargs++;
1132 XtSetArg(args[nargs], XmNposition, 1); nargs++;
1133 pd->to_day = XmCreateTextField(pd->to_spin, "ToDay",
1135 XtAddCallback(pd->to_day, XmNvalueChangedCallback,
1136 spin_field_changed_cb, (XtPointer)NULL);
1137 XtManageChild(pd->to_day);
1140 XtSetArg(args[nargs], XmNspinBoxChildType, XmSTRING); nargs++;
1141 XtSetArg(args[nargs], XmNnumValues, 12); nargs++;
1142 XtSetArg(args[nargs], XmNvalues, abbrevMonths); nargs++;
1143 XtSetArg(args[nargs], XmNcolumns, maxMonthLen); nargs++;
1144 XtSetArg(args[nargs], XmNmaxLength, maxMonthLen); nargs++;
1145 XtSetArg(args[nargs], XmNposition, 0); nargs++;
1146 pd->to_month = XmCreateTextField(pd->to_spin, "ToMonth",
1148 XtAddCallback(pd->to_month, XmNvalueChangedCallback,
1149 spin_field_changed_cb, (XtPointer)NULL);
1150 XtManageChild(pd->to_month);
1151 for (i = 0; i < 12; i++)
1152 XmStringFree(abbrevMonths[i]);
1155 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1156 XtSetArg(args[nargs], XmNminimumValue,
1157 year(get_bot())); nargs++;
1158 XtSetArg(args[nargs], XmNmaximumValue,
1159 year(get_eot())); nargs++;
1160 XtSetArg(args[nargs], XmNcolumns, 4); nargs++;
1161 XtSetArg(args[nargs], XmNmaxLength, 4); nargs++;
1162 XtSetArg(args[nargs], XmNposition,
1163 year(get_bot())); nargs++;
1164 XtSetArg(args[nargs], XmNwrap, False); nargs++;
1165 pd->to_year = XmCreateTextField(pd->to_spin, "ToYear",
1167 XtAddCallback(pd->to_year, XmNvalueChangedCallback,
1168 spin_field_changed_cb, (XtPointer)NULL);
1169 XtManageChild(pd->to_year);
1170 XtManageChild(pd->to_spin);
1172 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
1175 XtSetArg(args[nargs], XmNlabelString, xmstr); nargs++;
1176 XtSetArg(args[nargs], XmNrightAttachment, XmATTACH_FORM); nargs++;
1177 XtSetArg(args[nargs], XmNrightOffset, 10); nargs++;
1178 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1179 XtSetArg(args[nargs], XmNtopWidget, pd->to_spin); nargs++;
1180 XtSetArg(args[nargs], XmNtopOffset, 10); nargs++;
1181 pd->more_opts = XmCreatePushButtonGadget(pd->form, "MoreOpts",
1183 XtAddCallback(pd->more_opts, XmNactivateCallback,
1184 more_opts_cb, (XtPointer)c);
1185 XtManageChild(pd->more_opts);
1186 XmStringFree(xmstr);
1190 XtSetArg(args[nargs], XmNleftAttachment, XmATTACH_FORM); nargs++;
1191 XtSetArg(args[nargs], XmNleftOffset, 10); nargs++;
1192 XtSetArg(args[nargs], XmNtopAttachment,
1193 XmATTACH_OPPOSITE_WIDGET); nargs++;
1194 XtSetArg(args[nargs], XmNtopWidget, pd->more_opts); nargs++;
1195 XtSetArg(args[nargs], XmNtopOffset, 10); nargs++;
1196 pd->debugToggle = XmCreateToggleButtonGadget(pd->form, "Debug Mode",
1198 XtManageChild(pd->debugToggle);
1201 XtManageChild(pd->form);
1203 pd->setupDataValid = False;
1205 pd->printShell = (Widget)NULL;
1206 pd->badAllocError = False;
1209 /* Set report type and dates according to current view/day. */
1210 switch (c->view->glance) {
1211 case dayGlance : reportType = PR_DAY_VIEW; break;
1212 case weekGlance : reportType = PR_WEEK_VIEW; break;
1213 case yearGlance : reportType = PR_YEAR_VIEW; break;
1215 case monthGlance : reportType = PR_MONTH_VIEW; break;
1218 pd_set_report_type(c, reportType);
1220 pd_set_start_date(c, c->view->date);
1221 pd_set_end_date(c, c->view->date);
1228 cancel_cb(Widget w, XtPointer data, XtPointer ignore)
1230 Calendar *c = (Calendar *)data;
1231 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1233 XtUnmanageChild(pd->pdb);
1237 report_error(Calendar *c, char *title, char *errText)
1239 Props_pu *pu = (Props_pu *)c->properties_pu;
1242 label = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
1244 dialog_popup(c->frame,
1245 DIALOG_TITLE, title,
1246 DIALOG_TEXT, errText,
1247 BUTTON_IDENT, 1, label,
1248 DIALOG_IMAGE, pu->xm_error_pixmap,
1255 pdm_notify_cb(Widget w, XtPointer uData, XtPointer cbData)
1257 #if defined(PRINTING_SUPPORTED)
1258 XmPrintShellCallbackStruct *cbStruct =
1259 (XmPrintShellCallbackStruct *)cbData;
1260 Calendar *c = (Calendar *)uData;
1261 char *errText = (char *)NULL;
1264 switch (cbStruct->reason)
1267 case XmCR_PDM_START_ERROR:
1268 case XmCR_PDM_EXIT_ERROR:
1269 errText = XtNewString(catgets(c->DT_catd, 1, 1112, pdmErrorText));
1278 title = XtNewString(catgets(c->DT_catd, 1, 1111, setupErrorTitle));
1280 report_error(c, title, errText);
1285 #endif /* PRINTING_SUPPORTED */
1289 * Called when print dialog box's print display is closed.
1292 close_print_display_cb(Widget w, XtPointer uData, XtPointer cbData)
1294 Calendar *c = (Calendar *)uData;
1295 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1297 if (pd != (_DtCmPrintData *)NULL)
1299 /* Destroy printShell associated with Display, if any. */
1300 if (pd->printShell != (Widget)NULL)
1302 XtDestroyWidget(pd->printShell);
1303 pd->printShell = (Widget)NULL;
1311 * Print callback: do the deed!
1314 print_cb(Widget w, XtPointer data, XtPointer cbDataP)
1316 Calendar *c = (Calendar *)data;
1317 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1318 DtPrintSetupCallbackStruct *cbStruct =
1319 (DtPrintSetupCallbackStruct *)cbDataP;
1322 DtPrintCopySetupData(&pd->setupData, cbStruct->print_data);
1323 pd->setupDataValid = True;
1325 _DtTurnOnHourGlass(c->frame);
1327 _DtTurnOffHourGlass(c->frame);
1329 /* Leave setupDataValid=True for quick print! */
1333 print_setup_cb(Widget w, XtPointer uData, XtPointer cbData)
1335 #if defined(PRINTING_SUPPORTED)
1336 Calendar *c = (Calendar *)uData;
1337 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1338 DtPrintSetupCallbackStruct *cbStruct =
1339 (DtPrintSetupCallbackStruct *)cbData;
1342 DtPrintCopySetupData(&pd->setupData, cbStruct->print_data);
1343 pd->setupDataValid = True;
1346 /* Force debug mode off. */
1348 XmToggleButtonGadgetSetState(pd->debugToggle, False, False);
1351 createPrintShell(c);
1353 if (XmPrintPopupPDM(pd->printShell, w) != XmPDM_NOTIFY_SUCCESS)
1355 char *errText = XtNewString(catgets(c->DT_catd, 1, 1112,
1357 char *title = XtNewString(catgets(c->DT_catd, 1, 1111, setupErrorTitle));
1359 report_error(c, title, errText);
1366 #endif /* PRINTING_SUPPORTED */
1370 * print_report: dispatch the view-specific output routine
1373 print_report(Calendar *c)
1375 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1376 Props *p = (Props *) c->properties;
1377 Props_pu *pu = (Props_pu *) c->properties_pu;
1378 int r = pd_get_report_type(c);
1379 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
1380 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
1381 Tick start_date = pd_get_start_date(c);
1382 Tick end_date = pd_get_end_date(c);
1383 char *text = (char *)NULL;
1385 if ((start_date == DATE_BBOT) || (end_date == DATE_BBOT) ||
1386 (start_date == DATE_AEOT) || (end_date == DATE_BBOT))
1388 text = XtNewString(catgets(c->DT_catd, 1, 892,
1389 "The dates for printing must be between 1969 and 2038."));
1391 else if (start_date <= 0)
1393 text = XtNewString(catgets(c->DT_catd, 1, 894,
1394 "Malformed \"From\" date"));
1396 else if (end_date <= 0)
1398 text = XtNewString(catgets(c->DT_catd, 1, 896,
1399 "Malformed \"To\" date"));
1401 else if (start_date > end_date)
1403 text = XtNewString(catgets(c->DT_catd, 1, 898,
1404 "The \"To\" date for printing must be after the \"From\" date for printing"));
1409 char *title = XtNewString(catgets(c->DT_catd, 1, 736, printErrorTitle));
1411 report_error(c, title, text);
1418 if (pd == (_DtCmPrintData *)NULL)
1421 if (!pd->setupDataValid)
1423 if (DtPrintFillSetupData(pd->pdb, &pd->setupData) != DtPRINT_SUCCESS)
1426 * NOTE: DtPrintFillSetupData() displays an error dialog if
1427 * it is unsuccessful; no need to display our own.
1432 pd->setupDataValid = True;
1435 if (XtIsManaged(pd->pdb))
1436 _DtTurnOnHourGlass(XtParent(pd->pdb));
1438 createPrintShell(c);
1443 print_std_year_range(year(start_date), year(end_date));
1447 print_month_range(c, start_date, end_date);
1450 print_week_range(c, start_date, end_date);
1453 print_day_range(c, start_date, end_date);
1456 x_print_list_range(c, CSA_TYPE_EVENT, (int) c->view->glance,
1457 start_date, end_date);
1460 x_print_list_range(c, CSA_TYPE_TODO, (int) VIEW_ALL,
1461 start_date, end_date);
1468 XtDestroyWidget(pd->printShell);
1469 pd->printShell = (Widget)NULL;
1473 if (XtIsManaged(pd->pdb))
1475 _DtTurnOffHourGlass(XtParent(pd->pdb));
1476 XtUnmanageChild(pd->pdb);
1479 /* Keep setupDataValid=True for future QuickPrint operations. */
1485 * callback for report-type option menu.
1486 * Here we just store the button number of the selected
1487 * button in the print_data structure, to make life easy
1488 * when the print callback is invoked.
1491 report_option_cb(Widget w, XtPointer client_data, XtPointer call_data)
1493 int choice = (int) (intptr_t) client_data;
1494 Calendar *c = calendar;
1496 pd_set_report_managed(c, choice);
1498 pd_set_start_date(c, pd_get_start_date(c));
1499 pd_set_end_date(c, pd_get_end_date(c));
1503 pd_get_printer_name(Calendar *c)
1505 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1507 if ((pd == (_DtCmPrintData *)NULL) ||
1508 (!pd->setupDataValid) ||
1509 pd_print_to_file(c))
1510 return (char *)NULL;
1512 return pd->setupData.printer_name ?
1513 XtNewString(pd->setupData.printer_name) : (char *)NULL;
1517 pd_get_copies(Calendar *c)
1519 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1522 if (pd == (_DtCmPrintData *)NULL)
1525 XtVaGetValues(pd->pdb, DtNcopies, &nCopies, NULL);
1530 pd_get_start_date(Calendar *c)
1532 int dayPos, monthPos, yearPos;
1534 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
1537 return monthdayyear(monthPos + 1, dayPos, yearPos);
1541 pd_get_end_date(Calendar *c)
1543 int dayPos, monthPos, yearPos;
1545 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
1548 return monthdayyear(monthPos + 1, dayPos, yearPos);
1552 pd_get_print_options(Calendar *c)
1554 return XtNewString("");
1558 pd_print_to_file(Calendar *c)
1560 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1562 if ((pd == (_DtCmPrintData *)NULL) ||
1563 (!pd->setupDataValid))
1566 return pd->setupData.destination == DtPRINT_TO_FILE;
1570 pd_get_file_name(Calendar *c)
1572 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1574 if ((pd == (_DtCmPrintData *)NULL) ||
1575 (!pd->setupDataValid) ||
1576 !pd_print_to_file(c))
1577 return (char *)NULL;
1579 return pd->setupData.dest_info ?
1580 XtNewString(pd->setupData.dest_info) : (char *)NULL;
1584 pd_get_report_type(Calendar *c)
1586 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1588 if (pd == (_DtCmPrintData *)NULL)
1589 return PR_MONTH_VIEW;
1591 return pd->report_type;
1595 pd_get_print_shell(Calendar *c)
1597 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1599 if (pd == (_DtCmPrintData *)NULL)
1600 return (Widget)NULL;
1602 return pd->printShell;
1606 pd_get_print_display(Calendar *c)
1608 Widget printShell = pd_get_print_shell(c);
1610 if (printShell == (Widget)NULL)
1611 return (Display *)NULL;
1613 return XtDisplay(printShell);
1617 pd_set_bad_alloc_error(Calendar *c, Boolean errorOn)
1619 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1621 if (pd != (_DtCmPrintData *)NULL)
1622 pd->badAllocError = errorOn;
1626 pd_get_bad_alloc_error(Calendar *c)
1628 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1630 if (pd != (_DtCmPrintData *)NULL)
1631 return pd->badAllocError;