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>
38 #include <Xm/LabelG.h>
39 #include <Xm/DialogS.h>
41 #include <Xm/Protocols.h>
42 #include <Xm/PushBG.h>
43 #include <Xm/SeparatoG.h>
47 #include <Xm/ToggleB.h>
48 #include <Xm/ToggleBG.h>
50 #include <Xm/SSpinB.h>
51 #include <Xm/RowColumn.h>
52 #include <Dt/HourGlass.h>
58 #include "datefield.h"
65 /* needed for view-specific print routines */
66 #include "dayglance.h"
67 #include "weekglance.h"
68 #include "monthglance.h"
69 #include "yearglance.h"
71 static char *printErrorTitle = "Calendar : Error - Print";
72 static char *setupErrorTitle = "Calendar : Error - Print Setup";
73 static char *pdmErrorText = "Print Dialog Manager error - setup failed.";
79 Widget report_type_option;
96 Boolean setupDataValid;
97 DtPrintSetupData setupData;
99 Boolean badAllocError;
103 * private function declarations
105 static void print_cb(Widget, XtPointer, XtPointer);
106 static void print_setup_cb(Widget, XtPointer, XtPointer);
107 static void close_print_display_cb(Widget, XtPointer, XtPointer);
108 static void cancel_cb(Widget, XtPointer, XtPointer);
109 static void pdm_notify_cb(Widget, XtPointer, XtPointer);
110 static void report_option_cb(Widget, XtPointer, XtPointer);
111 static void from_modify_verify_cb(Widget, XtPointer, XtPointer);
112 static void to_modify_verify_cb(Widget, XtPointer, XtPointer);
113 static void spin_field_changed_cb(Widget, XtPointer, XtPointer);
114 static void more_opts_cb(Widget, XtPointer, XtPointer);
115 static Tick pd_modify_day(Calendar *, int, Boolean);
116 static Tick pd_modify_month(Calendar *, int, Boolean);
117 static Tick pd_modify_year(Calendar *, int, Boolean);
118 static Boolean pd_set_start_date(Calendar *, Tick);
119 static Boolean pd_set_end_date(Calendar *, Tick);
120 static Boolean pd_set_max_start_date(Calendar *, Tick);
121 static Boolean pd_set_min_end_date(Calendar *, Tick);
122 static Boolean pd_set_report_type(Calendar *, int);
123 static Boolean pd_set_report_managed(Calendar *, int);
124 static Boolean pd_get_start_positions(Calendar *, int *, int *, int *);
125 static Boolean pd_get_end_positions(Calendar *, int *, int *, int *);
126 static void clearSetupData(_DtCmPrintData *);
127 static void createPrintShell(Calendar *);
128 static void report_error(Calendar *, char *, char *);
132 inDebugMode(Calendar *c)
134 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
135 if (pd != (_DtCmPrintData *)NULL)
136 return XmToggleButtonGadgetGetState(pd->debugToggle);
143 pd_set_start_date(Calendar *c, Tick tick)
145 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
146 Props *p = (Props *)c->properties;
147 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
148 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
152 if (pd == (_DtCmPrintData *)NULL)
155 if (tick > get_eot())
158 if (pd_get_report_type(c) == PR_WEEK_VIEW)
160 /* Week view - start at Monday. */
161 tick = first_dow(tick);
164 if (tick < get_bot())
167 if (XtIsManaged(pd->from_day))
170 XtSetArg(args[nargs], XmNposition, dom(tick)); nargs++;
171 XtSetArg(args[nargs], XmNmaximumValue, monthlength(tick)); nargs++;
172 XtSetValues(pd->from_day, args, nargs);
174 if (XtIsManaged(pd->from_month))
176 XtSetArg(args[0], XmNposition, month(tick) - 1);
177 XtSetValues(pd->from_month, args, 1);
179 XtSetArg(args[0], XmNposition, year(tick));
180 XtSetValues(pd->from_year, args, 1);
186 pd_set_end_date(Calendar *c, Tick tick)
188 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
189 Props *p = (Props *)c->properties;
190 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
191 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
195 if (pd == (_DtCmPrintData *)NULL)
198 if (tick < get_bot())
201 if (pd_get_report_type(c) == PR_WEEK_VIEW)
203 /* Week view - end on Sunday. */
204 tick = last_dow(tick);
207 if (tick > get_eot())
210 if (XtIsManaged(pd->to_day))
213 XtSetArg(args[nargs], XmNposition, dom(tick)); nargs++;
214 XtSetArg(args[nargs], XmNmaximumValue, monthlength(tick)); nargs++;
215 XtSetValues(pd->to_day, args, nargs);
217 if (XtIsManaged(pd->to_month))
219 XtSetArg(args[0], XmNposition, month(tick) - 1);
220 XtSetValues(pd->to_month, args, 1);
222 XtSetArg(args[0], XmNposition, year(tick));
223 XtSetValues(pd->to_year, args, 1);
229 pd_set_max_start_date(Calendar *c, Tick tick)
231 Tick curTick = pd_get_start_date(c);
233 return (tick < curTick) ? pd_set_start_date(c, tick) : True;
237 pd_set_min_end_date(Calendar *c, Tick tick)
239 Tick curTick = pd_get_end_date(c);
241 return (tick > curTick) ? pd_set_end_date(c, tick) : True;
245 pd_set_report_type(Calendar *c, int reportType)
247 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
248 Widget optionMenu = (Widget)NULL;
252 if (pd == (_DtCmPrintData *)NULL)
255 if (reportType == pd->report_type)
259 XtSetArg(args[nargs], XmNsubMenuId, &optionMenu); nargs++;
260 XtGetValues(pd->report_type_option, args, nargs);
262 if (optionMenu != (Widget)NULL)
264 WidgetList optionChildren;
268 XtSetArg(args[nargs], XmNchildren, &optionChildren); nargs++;
269 XtSetArg(args[nargs], XmNnumChildren, &nChildren); nargs++;
270 XtGetValues(optionMenu, args, nargs);
272 if (nChildren > reportType)
275 XtSetArg(args[nargs], XmNmenuHistory,
276 optionChildren[reportType]); nargs++;
277 XtSetValues(pd->report_type_option, args, nargs);
279 return pd_set_report_managed(c, reportType);
287 pd_set_report_managed(Calendar *c, int reportType)
289 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
293 if (pd == (_DtCmPrintData *)NULL)
296 if (reportType == pd->report_type)
299 pd->report_type = reportType;
304 XtManageChild(pd->from_year);
305 XtManageChild(pd->to_year);
307 XtUnmanageChild(pd->from_day);
308 XtUnmanageChild(pd->from_month);
309 XtUnmanageChild(pd->to_day);
310 XtUnmanageChild(pd->to_month);
314 XtManageChild(pd->from_year);
315 XtManageChild(pd->from_month);
316 XtManageChild(pd->from_day);
317 XtManageChild(pd->to_year);
318 XtManageChild(pd->to_month);
319 XtManageChild(pd->to_day);
322 XtSetArg(args[nargs], XmNeditable, False); nargs++;
323 XtSetArg(args[nargs], XmNcursorPositionVisible, False); nargs++;
324 XtSetValues(pd->from_day, args, nargs);
325 XtSetValues(pd->to_day, args, nargs);
331 XtManageChild(pd->from_year);
332 XtManageChild(pd->from_month);
333 XtManageChild(pd->from_day);
334 XtManageChild(pd->to_year);
335 XtManageChild(pd->to_month);
336 XtManageChild(pd->to_day);
339 XtSetArg(args[nargs], XmNeditable, True); nargs++;
340 XtSetArg(args[nargs], XmNcursorPositionVisible, True); nargs++;
341 XtSetValues(pd->from_day, args, nargs);
342 XtSetValues(pd->to_day, args, nargs);
347 XtManageChild(pd->from_year);
348 XtManageChild(pd->from_month);
349 XtManageChild(pd->to_year);
350 XtManageChild(pd->to_month);
352 XtUnmanageChild(pd->from_day);
353 XtUnmanageChild(pd->to_day);
361 pd_get_start_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->from_day))
370 XtVaGetValues(pd->from_day, XmNposition, &dayPos, NULL);
371 if (XtIsManaged(pd->from_month))
372 XtVaGetValues(pd->from_month, XmNposition, &monthPos, NULL);
373 XtVaGetValues(pd->from_year, XmNposition, &yearPos, NULL);
383 pd_get_end_positions(Calendar *c, int *m, int *d, int *y)
385 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
386 int dayPos = 1, monthPos = 0, yearPos;
388 if (pd == (_DtCmPrintData *)NULL)
391 if (XtIsManaged(pd->to_day))
392 XtVaGetValues(pd->to_day, XmNposition, &dayPos, NULL);
393 if (XtIsManaged(pd->to_month))
394 XtVaGetValues(pd->to_month, XmNposition, &monthPos, NULL);
395 XtVaGetValues(pd->to_year, XmNposition, &yearPos, NULL);
405 from_modify_verify_cb(Widget w, XtPointer uDataP, XtPointer cbDataP)
407 Calendar *c = (Calendar *)uDataP;
408 XmSpinBoxCallbackStruct *cbStruct = (XmSpinBoxCallbackStruct *)cbDataP;
409 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
413 cbStruct->doit = False;
415 if (cbStruct->widget == pd->from_day)
417 newTick = pd_modify_day(c, cbStruct->reason, False);
419 else if (cbStruct->widget == pd->from_month)
421 newTick = pd_modify_month(c, cbStruct->reason, False);
423 else if (cbStruct->widget == pd->from_year)
425 newTick = pd_modify_year(c, cbStruct->reason, False);
429 if (pd_set_start_date(c, newTick) && pd_set_min_end_date(c, newTick))
431 int monthPos, dayPos, yearPos;
433 pd_get_start_positions(c, &monthPos, &dayPos, &yearPos);
434 if (cbStruct->widget == pd->from_day)
435 cbStruct->position = dayPos;
436 else if (cbStruct->widget == pd->from_month)
437 cbStruct->position = monthPos;
438 else cbStruct->position = yearPos;
439 cbStruct->doit = True;
444 to_modify_verify_cb(Widget w, XtPointer uDataP, XtPointer cbDataP)
446 Calendar *c = (Calendar *)uDataP;
447 XmSpinBoxCallbackStruct *cbStruct = (XmSpinBoxCallbackStruct *)cbDataP;
448 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
451 cbStruct->doit = False;
453 if (cbStruct->widget == pd->to_day)
455 newTick = pd_modify_day(c, cbStruct->reason, True);
457 else if (cbStruct->widget == pd->to_month)
459 newTick = pd_modify_month(c, cbStruct->reason, True);
461 else if (cbStruct->widget == pd->to_year)
463 newTick = pd_modify_year(c, cbStruct->reason, True);
467 if (pd_set_end_date(c, newTick) && pd_set_max_start_date(c, newTick))
469 int monthPos, dayPos, yearPos;
471 pd_get_end_positions(c, &monthPos, &dayPos, &yearPos);
472 if (cbStruct->widget == pd->to_day)
473 cbStruct->position = dayPos;
474 else if (cbStruct->widget == pd->to_month)
475 cbStruct->position = monthPos;
476 else cbStruct->position = yearPos;
477 cbStruct->doit = True;
482 spin_field_changed_cb(Widget field, XtPointer uData, XtPointer cbData)
487 unsigned char sbcType;
491 XmStringTable strings;
497 XtSetArg(args[nargs], XmNspinBoxChildType, &sbcType); nargs++;
498 XtSetArg(args[nargs], XmNmaximumValue, &maxValue); nargs++;
499 XtSetArg(args[nargs], XmNminimumValue, &minValue); nargs++;
500 XtSetArg(args[nargs], XmNnumValues, &nValues); nargs++;
501 XtSetArg(args[nargs], XmNposition, &curPos); nargs++;
502 XtSetArg(args[nargs], XmNvalues, &strings); nargs++;
503 XtSetArg(args[nargs], XmNvalue, &newStr); nargs++;
504 XtSetArg(args[nargs], XmNcursorPosition, &cursorPosition); nargs++;
505 XtGetValues(field, args, nargs);
508 if (sbcType == XmSTRING)
510 XmString xmString = XmStringCreateLocalized(newStr);
512 for (newPos = 0; newPos < nValues; newPos++)
514 if (XmStringCompare(xmString, strings[newPos]))
518 if (newPos >= nValues)
521 XmStringFree(xmString);
523 else if (sbcType == XmNUMERIC)
525 newPos = atoi(newStr);
527 if ((newPos < minValue) ||
532 if (newPos != curPos)
535 XtSetArg(args[nargs], XmNposition, newPos); nargs++;
536 XtSetValues(field, args, nargs);
538 /* After the above does its thing, restore original cursor position. */
540 XtSetArg(args[nargs], XmNcursorPosition, cursorPosition); nargs++;
541 XtSetValues(field, args, nargs);
548 more_opts_cb(Widget w, XtPointer uData, XtPointer cbData)
550 Calendar *c = (Calendar *)uData;
551 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
553 _DtTurnOnHourGlass(c->frame);
554 _DtTurnOnHourGlass(pd->pdb);
556 show_print_props_pu(c);
558 _DtTurnOffHourGlass(pd->pdb);
559 _DtTurnOffHourGlass(c->frame);
563 pd_modify_day(Calendar *c, int reason, Boolean isTo)
565 int monthPos, dayPos, yearPos;
570 int reportType = pd_get_report_type(c);
574 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
579 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
586 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
587 maxDay = monthlength(tmpTick);
588 if ((dayPos == 1) || (dayPos > maxDay))
591 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
592 newTick = (reportType == PR_WEEK_VIEW) ?
593 nextweek(curTick) : nextday(curTick);
596 case XmCR_SPIN_PRIOR:
597 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
598 maxDay = monthlength(tmpTick);
599 if (dayPos >= maxDay)
602 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
603 newTick = (reportType == PR_WEEK_VIEW) ?
604 prevweek(curTick) : prevday(curTick);
608 case XmCR_SPIN_FIRST:
609 newTick = monthdayyear(monthPos + 1, 1, yearPos);
610 if (reportType == PR_WEEK_VIEW)
614 /* We want the first Sunday in the month. */
615 newTick = last_dow(newTick);
619 /* We want the first Monday in the month. */
620 int dayOffset = (dow(newTick) + 6) % 7;
623 newTick = next_ndays(newTick, 7 - dayOffset);
629 curTick = monthdayyear(monthPos + 1, 1, yearPos);
630 newTick = last_dom(curTick);
631 if (reportType == PR_WEEK_VIEW)
635 /* We want the last Sunday in the month. */
636 int dayOffset = dow(newTick);
639 newTick = last_ndays(newTick, dayOffset);
643 /* We want the last Monday in the month. */
644 newTick = first_dow(newTick);
654 pd_modify_month(Calendar *c, int reason, Boolean isTo)
656 int monthPos, dayPos, yearPos;
661 int reportType = pd_get_report_type(c);
665 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
670 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
681 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
682 if (reportType == PR_WEEK_VIEW)
683 newTick = next_ndays(curTick, 4 * 7);
686 tmpTick = nextmonth(curTick);
687 maxDay = monthlength(tmpTick);
690 newTick = monthdayyear(month(tmpTick), dayPos, year(tmpTick));
694 case XmCR_SPIN_PRIOR:
699 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
700 if (reportType == PR_WEEK_VIEW)
701 newTick = last_ndays(curTick, 4 * 7);
704 /* ... There is no prevmonth()! ... */
705 tmpTick = prev_nmonth(curTick, 1);
706 maxDay = monthlength(tmpTick);
709 newTick = monthdayyear(month(tmpTick), dayPos, year(tmpTick));
714 case XmCR_SPIN_FIRST:
715 newTick = monthdayyear(1, 1, yearPos);
716 if (reportType == PR_WEEK_VIEW)
720 /* We want the first Sunday in the month. */
721 newTick = last_dow(newTick);
725 /* We want the first Monday in the month. */
726 int dayOffset = (dow(newTick) + 6) % 7;
729 newTick = next_ndays(newTick, 7 - dayOffset);
735 newTick = monthdayyear(12, 31, yearPos);
736 if (reportType == PR_WEEK_VIEW)
740 /* We want the last Sunday in the month. */
741 int dayOffset = dow(newTick);
744 newTick = last_ndays(newTick, dayOffset);
748 /* We want the last Monday in the month. */
749 newTick = first_dow(newTick);
759 pd_modify_year(Calendar *c, int reason, Boolean isTo)
761 int monthPos, dayPos, yearPos;
766 int reportType = pd_get_report_type(c);
770 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
775 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
784 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
785 if (reportType == PR_WEEK_VIEW)
786 newTick = next_ndays(curTick, 52 * 7);
789 tmpTick = monthdayyear(monthPos + 1, 1, yearPos + 1);
790 maxDay = monthlength(tmpTick);
793 newTick = monthdayyear(monthPos + 1, dayPos, yearPos + 1);
797 case XmCR_SPIN_PRIOR:
800 curTick = monthdayyear(monthPos + 1, dayPos, yearPos);
801 if (reportType == PR_WEEK_VIEW)
802 newTick = last_ndays(curTick, 52 * 7);
805 tmpTick = monthdayyear(monthPos + 1, 1, yearPos - 1);
806 maxDay = monthlength(tmpTick);
809 newTick = monthdayyear(monthPos + 1, dayPos, yearPos - 1);
814 case XmCR_SPIN_FIRST:
815 yearPos = year(get_bot());
816 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
817 maxDay = monthlength(tmpTick);
820 newTick = monthdayyear(monthPos + 1, dayPos, yearPos);
824 yearPos = year(get_eot());
825 tmpTick = monthdayyear(monthPos + 1, 1, yearPos);
826 maxDay = monthlength(tmpTick);
829 newTick = monthdayyear(monthPos + 1, dayPos, yearPos);
837 * post_print_dialog()
839 * Create and display the Print dialog.
847 create_print_dialog(c);
849 /* display the dialog on-screen */
850 if ((pd = (_DtCmPrintData *)c->print_data) != (_DtCmPrintData *)NULL)
852 if (!XtIsManaged(pd->pdb))
853 XtManageChild(pd->pdb);
854 else XRaiseWindow(XtDisplay(pd->pdb),
855 XtWindow(XtParent(pd->pdb)));
860 clearSetupData(_DtCmPrintData *pd)
862 if (pd->setupDataValid)
864 DtPrintFreeSetupData(&pd->setupData);
865 pd->setupDataValid = False;
868 memset(&pd->setupData, 0, sizeof(DtPrintSetupData));
872 createPrintShell(Calendar *c)
874 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
879 if (pd->printShell != (Widget)NULL)
880 XtDestroyWidget(pd->printShell);
882 pd->printShell = XmCreateDialogShell(c->frame, "Print",
887 if (pd->printShell == (Widget)NULL)
890 XmPrintSetup(pd->pdb,
891 XpGetScreenOfContext(pd->setupData.print_display,
892 pd->setupData.print_context),
895 XtAddCallback(pd->printShell, XmNpdmNotificationCallback,
896 pdm_notify_cb, (XtPointer)c);
901 create_print_dialog(Calendar *c)
903 XmString xmstr, day_view, week_view, month_view,
904 year_view, appt_list, todo_list, view;
906 char fnamebuf[BUFSIZ];
912 XmString abbrevMonths[12];
918 if ((pd = (_DtCmPrintData *)c->print_data) == NULL)
920 c->print_data = (caddr_t)XtMalloc(sizeof(_DtCmPrintData));
921 pd = (_DtCmPrintData *) c->print_data;
923 /* Initialize filename to dir+filename from props */
924 print_file = get_char_prop((Props *)c->properties,CP_PRINTFILENAME);
927 print_dir = get_char_prop((Props *)c->properties,CP_PRINTDIRNAME);
930 sprintf(fnamebuf, "%s/%s", print_dir, print_file);
932 title = XtNewString(catgets(c->DT_catd, 1, 728, "Calendar : Print"));
934 XtSetArg(args[nargs], XmNtitle, title); nargs++;
935 XtSetArg(args[nargs], XmNdeleteResponse, XmUNMAP); nargs++;
936 XtSetArg(args[nargs], DtNfileName, fnamebuf); nargs++;
937 XtSetArg(args[nargs], XmNautoUnmanage, False); nargs++;
938 XtSetArg(args[nargs], XmNdeleteResponse, XmDO_NOTHING); nargs++;
939 pd->pdb = DtCreatePrintSetupDialog(c->frame, "Calendar - Print",
943 setup_quit_handler(XtParent(pd->pdb), cancel_cb, (XtPointer)c);
945 XtAddCallback(pd->pdb, DtNcancelCallback,
946 cancel_cb, (XtPointer)c);
947 XtAddCallback(pd->pdb, DtNprintCallback,
948 print_cb, (XtPointer)c);
949 XtAddCallback(pd->pdb, DtNclosePrintDisplayCallback,
950 close_print_display_cb, (XtPointer)c);
951 XtAddCallback(pd->pdb, DtNsetupCallback,
952 print_setup_cb, (XtPointer)c);
954 helpButton = XtNameToWidget(pd->pdb, "Help");
955 if (helpButton != (Widget)NULL)
956 XtAddCallback(helpButton, XmNactivateCallback,
957 help_cb, (XtPointer)PRINT_HELP_BUTTON);
958 XtAddCallback(pd->pdb, XmNhelpCallback,
959 help_cb, (XtPointer)PRINT_HELP_BUTTON);
962 XtSetArg(args[nargs], XmNfractionBase, 3); nargs++;
963 pd->form = XmCreateForm(pd->pdb, "RangeForm", args, nargs);
965 view = XmStringCreateLocalized(
966 catgets(c->DT_catd, 1, 976, "Report Type:"));
967 day_view = XmStringCreateLocalized(
968 catgets(c->DT_catd, 1, 977, "Day View"));
969 week_view = XmStringCreateLocalized(
970 catgets(c->DT_catd, 1, 978, "Week View"));
971 month_view = XmStringCreateLocalized(
972 catgets(c->DT_catd, 1, 979, "Month View"));
973 year_view = XmStringCreateLocalized(
974 catgets(c->DT_catd, 1, 980, "Year View"));
975 appt_list = XmStringCreateLocalized(
976 catgets(c->DT_catd, 1, 981, "Appointment List"));
977 todo_list = XmStringCreateLocalized(
978 catgets(c->DT_catd, 1, 982, "To Do List"));
981 * remember - this returns a RowColumn widget!
983 pd->report_type = PR_DAY_VIEW;
984 pd->report_type_option = XmVaCreateSimpleOptionMenu(pd->form,
985 "TypeOptionMenu", view, NULL,
986 pd->report_type, report_option_cb,
987 XmVaPUSHBUTTON, day_view, NULL, NULL, NULL,
988 XmVaPUSHBUTTON, week_view, NULL, NULL, NULL,
989 XmVaPUSHBUTTON, month_view, NULL, NULL, NULL,
990 XmVaPUSHBUTTON, year_view, NULL, NULL, NULL,
991 XmVaPUSHBUTTON, appt_list, NULL, NULL, NULL,
992 XmVaPUSHBUTTON, todo_list, NULL, NULL, NULL,
993 XmNorientation, XmVERTICAL,
994 XmNtopAttachment, XmATTACH_FORM,
996 XmNleftAttachment, XmATTACH_POSITION,
1000 XmNnavigationType, XmTAB_GROUP,
1002 XtManageChild(pd->report_type_option);
1004 XmStringFree(day_view);
1005 XmStringFree(week_view);
1006 XmStringFree(month_view);
1007 XmStringFree(year_view);
1008 XmStringFree(appt_list);
1009 XmStringFree(todo_list);
1012 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
1014 pd->from_label = XtVaCreateWidget("FromLabel",
1017 XmNlabelString, xmstr,
1018 XmNleftAttachment, XmATTACH_POSITION,
1021 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1022 XmNtopWidget, pd->report_type_option,
1025 XmStringFree(xmstr);
1026 XtManageChild(pd->from_label);
1029 XtSetArg(args[nargs], XmNleftAttachment,
1030 XmATTACH_OPPOSITE_WIDGET); nargs++;
1031 XtSetArg(args[nargs], XmNleftWidget, pd->from_label); nargs++;
1032 XtSetArg(args[nargs], XmNleftOffset, 0); nargs++;
1033 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1034 XtSetArg(args[nargs], XmNtopWidget, pd->from_label); nargs++;
1035 XtSetArg(args[nargs], XmNtopOffset, 4); nargs++;
1036 XtSetArg(args[nargs], XmNshadowThickness, 1); nargs++;
1037 pd->from_spin = XmCreateSpinBox(pd->form, "FromSpinBox",
1039 XtAddCallback(pd->from_spin, XmNmodifyVerifyCallback,
1040 from_modify_verify_cb, (XtPointer)c);
1043 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1044 XtSetArg(args[nargs], XmNminimumValue, 1); nargs++;
1045 XtSetArg(args[nargs], XmNmaximumValue, 31); nargs++;
1046 XtSetArg(args[nargs], XmNcolumns, 2); nargs++;
1047 XtSetArg(args[nargs], XmNmaxLength, 2); nargs++;
1048 XtSetArg(args[nargs], XmNposition, 1); nargs++;
1049 pd->from_day = XmCreateTextField(pd->from_spin, "FromDay",
1051 XtAddCallback(pd->from_day, XmNvalueChangedCallback,
1052 spin_field_changed_cb, (XtPointer)NULL);
1053 XtManageChild(pd->from_day);
1056 for (i = 0; i < 12; i++)
1058 abbrevMonths[i] = XmStringCreateLocalized(months2[i + 1]);
1059 if (cm_strlen(months2[i + 1]) > maxMonthLen)
1060 maxMonthLen = cm_strlen(months2[i + 1]);
1063 XtSetArg(args[nargs], XmNspinBoxChildType, XmSTRING); nargs++;
1064 XtSetArg(args[nargs], XmNnumValues, 12); nargs++;
1065 XtSetArg(args[nargs], XmNvalues, abbrevMonths); nargs++;
1066 XtSetArg(args[nargs], XmNcolumns, maxMonthLen); nargs++;
1067 XtSetArg(args[nargs], XmNmaxLength, maxMonthLen); nargs++;
1068 XtSetArg(args[nargs], XmNposition, 0); nargs++;
1069 pd->from_month = XmCreateTextField(pd->from_spin, "FromMonth",
1071 XtAddCallback(pd->from_month, XmNvalueChangedCallback,
1072 spin_field_changed_cb, (XtPointer)NULL);
1073 XtManageChild(pd->from_month);
1076 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1077 XtSetArg(args[nargs], XmNminimumValue,
1078 year(get_bot())); nargs++;
1079 XtSetArg(args[nargs], XmNmaximumValue,
1080 year(get_eot())); nargs++;
1081 XtSetArg(args[nargs], XmNcolumns, 4); nargs++;
1082 XtSetArg(args[nargs], XmNmaxLength, 4); nargs++;
1083 XtSetArg(args[nargs], XmNposition,
1084 year(get_bot())); nargs++;
1085 XtSetArg(args[nargs], XmNwrap, False); nargs++;
1086 pd->from_year = XmCreateTextField(pd->from_spin, "FromYear",
1088 XtAddCallback(pd->from_year, XmNvalueChangedCallback,
1089 spin_field_changed_cb, (XtPointer)NULL);
1090 XtManageChild(pd->from_year);
1091 XtManageChild(pd->from_spin);
1093 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
1095 pd->to_label = XtVaCreateWidget("ToLabel",
1098 XmNlabelString, xmstr,
1099 XmNleftAttachment, XmATTACH_POSITION,
1102 XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
1103 XmNtopWidget, pd->report_type_option,
1106 XmStringFree(xmstr);
1107 XtManageChild(pd->to_label);
1110 XtSetArg(args[nargs], XmNleftAttachment,
1111 XmATTACH_OPPOSITE_WIDGET); nargs++;
1112 XtSetArg(args[nargs], XmNleftWidget, pd->to_label); nargs++;
1113 XtSetArg(args[nargs], XmNleftOffset, 0); nargs++;
1114 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1115 XtSetArg(args[nargs], XmNtopWidget, pd->to_label); nargs++;
1116 XtSetArg(args[nargs], XmNtopOffset, 4); nargs++;
1117 XtSetArg(args[nargs], XmNshadowThickness, 1); nargs++;
1118 pd->to_spin = XmCreateSpinBox(pd->form, "ToSpinBox",
1120 XtAddCallback(pd->to_spin, XmNmodifyVerifyCallback,
1121 to_modify_verify_cb, (XtPointer)c);
1124 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1125 XtSetArg(args[nargs], XmNminimumValue, 1); nargs++;
1126 XtSetArg(args[nargs], XmNmaximumValue, 31); nargs++;
1127 XtSetArg(args[nargs], XmNcolumns, 2); nargs++;
1128 XtSetArg(args[nargs], XmNmaxLength, 2); nargs++;
1129 XtSetArg(args[nargs], XmNposition, 1); nargs++;
1130 pd->to_day = XmCreateTextField(pd->to_spin, "ToDay",
1132 XtAddCallback(pd->to_day, XmNvalueChangedCallback,
1133 spin_field_changed_cb, (XtPointer)NULL);
1134 XtManageChild(pd->to_day);
1137 XtSetArg(args[nargs], XmNspinBoxChildType, XmSTRING); nargs++;
1138 XtSetArg(args[nargs], XmNnumValues, 12); nargs++;
1139 XtSetArg(args[nargs], XmNvalues, abbrevMonths); nargs++;
1140 XtSetArg(args[nargs], XmNcolumns, maxMonthLen); nargs++;
1141 XtSetArg(args[nargs], XmNmaxLength, maxMonthLen); nargs++;
1142 XtSetArg(args[nargs], XmNposition, 0); nargs++;
1143 pd->to_month = XmCreateTextField(pd->to_spin, "ToMonth",
1145 XtAddCallback(pd->to_month, XmNvalueChangedCallback,
1146 spin_field_changed_cb, (XtPointer)NULL);
1147 XtManageChild(pd->to_month);
1148 for (i = 0; i < 12; i++)
1149 XmStringFree(abbrevMonths[i]);
1152 XtSetArg(args[nargs], XmNspinBoxChildType, XmNUMERIC); nargs++;
1153 XtSetArg(args[nargs], XmNminimumValue,
1154 year(get_bot())); nargs++;
1155 XtSetArg(args[nargs], XmNmaximumValue,
1156 year(get_eot())); nargs++;
1157 XtSetArg(args[nargs], XmNcolumns, 4); nargs++;
1158 XtSetArg(args[nargs], XmNmaxLength, 4); nargs++;
1159 XtSetArg(args[nargs], XmNposition,
1160 year(get_bot())); nargs++;
1161 XtSetArg(args[nargs], XmNwrap, False); nargs++;
1162 pd->to_year = XmCreateTextField(pd->to_spin, "ToYear",
1164 XtAddCallback(pd->to_year, XmNvalueChangedCallback,
1165 spin_field_changed_cb, (XtPointer)NULL);
1166 XtManageChild(pd->to_year);
1167 XtManageChild(pd->to_spin);
1169 xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1,
1172 XtSetArg(args[nargs], XmNlabelString, xmstr); nargs++;
1173 XtSetArg(args[nargs], XmNrightAttachment, XmATTACH_FORM); nargs++;
1174 XtSetArg(args[nargs], XmNrightOffset, 10); nargs++;
1175 XtSetArg(args[nargs], XmNtopAttachment, XmATTACH_WIDGET); nargs++;
1176 XtSetArg(args[nargs], XmNtopWidget, pd->to_spin); nargs++;
1177 XtSetArg(args[nargs], XmNtopOffset, 10); nargs++;
1178 pd->more_opts = XmCreatePushButtonGadget(pd->form, "MoreOpts",
1180 XtAddCallback(pd->more_opts, XmNactivateCallback,
1181 more_opts_cb, (XtPointer)c);
1182 XtManageChild(pd->more_opts);
1183 XmStringFree(xmstr);
1187 XtSetArg(args[nargs], XmNleftAttachment, XmATTACH_FORM); nargs++;
1188 XtSetArg(args[nargs], XmNleftOffset, 10); nargs++;
1189 XtSetArg(args[nargs], XmNtopAttachment,
1190 XmATTACH_OPPOSITE_WIDGET); nargs++;
1191 XtSetArg(args[nargs], XmNtopWidget, pd->more_opts); nargs++;
1192 XtSetArg(args[nargs], XmNtopOffset, 10); nargs++;
1193 pd->debugToggle = XmCreateToggleButtonGadget(pd->form, "Debug Mode",
1195 XtManageChild(pd->debugToggle);
1198 XtManageChild(pd->form);
1200 pd->setupDataValid = False;
1202 pd->printShell = (Widget)NULL;
1203 pd->badAllocError = False;
1206 /* Set report type and dates according to current view/day. */
1207 switch (c->view->glance) {
1208 case dayGlance : reportType = PR_DAY_VIEW; break;
1209 case weekGlance : reportType = PR_WEEK_VIEW; break;
1210 case yearGlance : reportType = PR_YEAR_VIEW; break;
1212 case monthGlance : reportType = PR_MONTH_VIEW; break;
1215 pd_set_report_type(c, reportType);
1217 pd_set_start_date(c, c->view->date);
1218 pd_set_end_date(c, c->view->date);
1225 cancel_cb(Widget w, XtPointer data, XtPointer ignore)
1227 Calendar *c = (Calendar *)data;
1228 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1230 XtUnmanageChild(pd->pdb);
1234 report_error(Calendar *c, char *title, char *errText)
1236 Props_pu *pu = (Props_pu *)c->properties_pu;
1239 label = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
1241 dialog_popup(c->frame,
1242 DIALOG_TITLE, title,
1243 DIALOG_TEXT, errText,
1244 BUTTON_IDENT, 1, label,
1245 DIALOG_IMAGE, pu->xm_error_pixmap,
1252 pdm_notify_cb(Widget w, XtPointer uData, XtPointer cbData)
1254 XmPrintShellCallbackStruct *cbStruct =
1255 (XmPrintShellCallbackStruct *)cbData;
1256 Calendar *c = (Calendar *)uData;
1257 char *errText = (char *)NULL;
1260 switch (cbStruct->reason)
1263 case XmCR_PDM_START_ERROR:
1264 case XmCR_PDM_EXIT_ERROR:
1265 errText = XtNewString(catgets(c->DT_catd, 1, 1112, pdmErrorText));
1274 title = XtNewString(catgets(c->DT_catd, 1, 1111, setupErrorTitle));
1276 report_error(c, title, errText);
1284 * Called when print dialog box's print display is closed.
1287 close_print_display_cb(Widget w, XtPointer uData, XtPointer cbData)
1289 Calendar *c = (Calendar *)uData;
1290 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1292 if (pd != (_DtCmPrintData *)NULL)
1294 /* Destroy printShell associated with Display, if any. */
1295 if (pd->printShell != (Widget)NULL)
1297 XtDestroyWidget(pd->printShell);
1298 pd->printShell = (Widget)NULL;
1306 * Print callback: do the deed!
1309 print_cb(Widget w, XtPointer data, XtPointer cbDataP)
1311 Calendar *c = (Calendar *)data;
1312 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1313 DtPrintSetupCallbackStruct *cbStruct =
1314 (DtPrintSetupCallbackStruct *)cbDataP;
1317 DtPrintCopySetupData(&pd->setupData, cbStruct->print_data);
1318 pd->setupDataValid = True;
1320 _DtTurnOnHourGlass(c->frame);
1322 _DtTurnOffHourGlass(c->frame);
1324 /* Leave setupDataValid=True for quick print! */
1328 print_setup_cb(Widget w, XtPointer uData, XtPointer cbData)
1330 Calendar *c = (Calendar *)uData;
1331 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1332 DtPrintSetupCallbackStruct *cbStruct =
1333 (DtPrintSetupCallbackStruct *)cbData;
1336 DtPrintCopySetupData(&pd->setupData, cbStruct->print_data);
1337 pd->setupDataValid = True;
1340 /* Force debug mode off. */
1342 XmToggleButtonGadgetSetState(pd->debugToggle, False, False);
1345 createPrintShell(c);
1347 if (XmPrintPopupPDM(pd->printShell, w) != XmPDM_NOTIFY_SUCCESS)
1349 char *errText = XtNewString(catgets(c->DT_catd, 1, 1112,
1351 char *title = XtNewString(catgets(c->DT_catd, 1, 1111, setupErrorTitle));
1353 report_error(c, title, errText);
1363 * print_report: dispatch the view-specific output routine
1366 print_report(Calendar *c)
1368 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1369 Props *p = (Props *) c->properties;
1370 Props_pu *pu = (Props_pu *) c->properties_pu;
1371 int r = pd_get_report_type(c);
1372 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
1373 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
1374 Tick start_date = pd_get_start_date(c);
1375 Tick end_date = pd_get_end_date(c);
1376 char *text = (char *)NULL;
1378 if ((start_date == DATE_BBOT) || (end_date == DATE_BBOT) ||
1379 (start_date == DATE_AEOT) || (end_date == DATE_BBOT))
1381 text = XtNewString(catgets(c->DT_catd, 1, 892,
1382 "The dates for printing must be between 1969 and 2038."));
1384 else if (start_date <= 0)
1386 text = XtNewString(catgets(c->DT_catd, 1, 894,
1387 "Malformed \"From\" date"));
1389 else if (end_date <= 0)
1391 text = XtNewString(catgets(c->DT_catd, 1, 896,
1392 "Malformed \"To\" date"));
1394 else if (start_date > end_date)
1396 text = XtNewString(catgets(c->DT_catd, 1, 898,
1397 "The \"To\" date for printing must be after the \"From\" date for printing"));
1402 char *title = XtNewString(catgets(c->DT_catd, 1, 736, printErrorTitle));
1404 report_error(c, title, text);
1411 if (pd == (_DtCmPrintData *)NULL)
1414 if (!pd->setupDataValid)
1416 if (DtPrintFillSetupData(pd->pdb, &pd->setupData) != DtPRINT_SUCCESS)
1419 * NOTE: DtPrintFillSetupData() displays an error dialog if
1420 * it is unsuccessful; no need to display our own.
1425 pd->setupDataValid = True;
1428 if (XtIsManaged(pd->pdb))
1429 _DtTurnOnHourGlass(XtParent(pd->pdb));
1431 createPrintShell(c);
1436 print_std_year_range(year(start_date), year(end_date));
1440 print_month_range(c, start_date, end_date);
1443 print_week_range(c, start_date, end_date);
1446 print_day_range(c, start_date, end_date);
1449 x_print_list_range(c, CSA_TYPE_EVENT, (int) c->view->glance,
1450 start_date, end_date);
1453 x_print_list_range(c, CSA_TYPE_TODO, (int) VIEW_ALL,
1454 start_date, end_date);
1461 XtDestroyWidget(pd->printShell);
1462 pd->printShell = (Widget)NULL;
1466 if (XtIsManaged(pd->pdb))
1468 _DtTurnOffHourGlass(XtParent(pd->pdb));
1469 XtUnmanageChild(pd->pdb);
1472 /* Keep setupDataValid=True for future QuickPrint operations. */
1478 * callback for report-type option menu.
1479 * Here we just store the button number of the selected
1480 * button in the print_data structure, to make life easy
1481 * when the print callback is invoked.
1484 report_option_cb(Widget w, XtPointer client_data, XtPointer call_data)
1486 int choice = (int) client_data;
1487 Calendar *c = calendar;
1489 pd_set_report_managed(c, choice);
1491 pd_set_start_date(c, pd_get_start_date(c));
1492 pd_set_end_date(c, pd_get_end_date(c));
1496 pd_get_printer_name(Calendar *c)
1498 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1500 if ((pd == (_DtCmPrintData *)NULL) ||
1501 (!pd->setupDataValid) ||
1502 pd_print_to_file(c))
1503 return (char *)NULL;
1505 return pd->setupData.printer_name ?
1506 XtNewString(pd->setupData.printer_name) : (char *)NULL;
1510 pd_get_copies(Calendar *c)
1512 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1515 if (pd == (_DtCmPrintData *)NULL)
1518 XtVaGetValues(pd->pdb, DtNcopies, &nCopies, NULL);
1523 pd_get_start_date(Calendar *c)
1525 int dayPos, monthPos, yearPos;
1527 if (!pd_get_start_positions(c, &monthPos, &dayPos, &yearPos))
1530 return monthdayyear(monthPos + 1, dayPos, yearPos);
1534 pd_get_end_date(Calendar *c)
1536 int dayPos, monthPos, yearPos;
1538 if (!pd_get_end_positions(c, &monthPos, &dayPos, &yearPos))
1541 return monthdayyear(monthPos + 1, dayPos, yearPos);
1545 pd_get_print_options(Calendar *c)
1547 return XtNewString("");
1551 pd_print_to_file(Calendar *c)
1553 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1555 if ((pd == (_DtCmPrintData *)NULL) ||
1556 (!pd->setupDataValid))
1559 return pd->setupData.destination == DtPRINT_TO_FILE;
1563 pd_get_file_name(Calendar *c)
1565 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1567 if ((pd == (_DtCmPrintData *)NULL) ||
1568 (!pd->setupDataValid) ||
1569 !pd_print_to_file(c))
1570 return (char *)NULL;
1572 return pd->setupData.dest_info ?
1573 XtNewString(pd->setupData.dest_info) : (char *)NULL;
1577 pd_get_report_type(Calendar *c)
1579 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1581 if (pd == (_DtCmPrintData *)NULL)
1582 return PR_MONTH_VIEW;
1584 return pd->report_type;
1588 pd_get_print_shell(Calendar *c)
1590 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1592 if (pd == (_DtCmPrintData *)NULL)
1593 return (Widget)NULL;
1595 return pd->printShell;
1599 pd_get_print_display(Calendar *c)
1601 Widget printShell = pd_get_print_shell(c);
1603 if (printShell == (Widget)NULL)
1604 return (Display *)NULL;
1606 return XtDisplay(printShell);
1610 pd_set_bad_alloc_error(Calendar *c, Boolean errorOn)
1612 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1614 if (pd != (_DtCmPrintData *)NULL)
1615 pd->badAllocError = errorOn;
1619 pd_get_bad_alloc_error(Calendar *c)
1621 _DtCmPrintData *pd = (_DtCmPrintData *)c->print_data;
1623 if (pd != (_DtCmPrintData *)NULL)
1624 return pd->badAllocError;