986eba38a42a920170f200f7fc7bf81b816977fb
[oweals/cde.git] / cde / programs / dtcm / dtcm / reminders.c
1 /*******************************************************************************
2 **
3 **  reminders.c
4 **
5 **  $XConsortium: reminders.c /main/7 1996/08/06 11:41:54 barstow $
6 **
7 **  RESTRICTED CONFIDENTIAL INFORMATION:
8 **
9 **  The information in this document is subject to special
10 **  restrictions in a confidential disclosure agreement between
11 **  HP, IBM, Sun, USL, SCO and Univel.  Do not distribute this
12 **  document outside HP, IBM, Sun, USL, SCO, or Univel without
13 **  Sun's specific written approval.  This document and all copies
14 **  and derivative works thereof must be returned or destroyed at
15 **  Sun's request.
16 **
17 **  Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
18 **
19 *******************************************************************************/
20
21 /*                                                                      *
22  * (c) Copyright 1993, 1994 Hewlett-Packard Company                     *
23  * (c) Copyright 1993, 1994 International Business Machines Corp.       *
24  * (c) Copyright 1993, 1994 Sun Microsystems, Inc.                      *
25  * (c) Copyright 1993, 1994 Novell, Inc.                                *
26  */
27
28 #include <EUSCompat.h>
29 #include <stdlib.h>
30 #include <stdarg.h>
31 #include <unistd.h>
32 #include <stdio.h>
33 #include <sys/param.h>
34 #include <ctype.h>
35 #include <Xm/Form.h>
36 #include <Xm/LabelG.h>
37 #include <Xm/RowColumn.h>
38 #include <Xm/Text.h>
39 #include <Xm/ToggleBG.h>
40 #include <Xm/ToggleB.h>
41 #include "reminders.h"
42 #include "props.h"
43 #include "help.h"
44 #include "props_pu.h"
45 #include "util.h"
46
47 extern  int _csa_duration_to_iso8601(int, char *);
48 extern  int _csa_iso8601_to_duration(char *, int*);
49
50 /*******************************************************************************
51 **
52 **  Static functions local to reminders.c only
53 **
54 *******************************************************************************/
55
56 static Reminder_val_op
57 r_validate_advance(char *advance_string) {
58
59         char    *c_p = advance_string;
60         char    *end_ptr;
61         Boolean scanned_sign = False;
62
63         /* crush out leading white space for the name
64            comparison/insert process */
65  
66         while ((*c_p == ' ') || (*c_p == '\t'))
67                 c_p++;
68  
69         /* compress off trailing whitespace */
70  
71         end_ptr = c_p;
72         while (*end_ptr)
73                 end_ptr++;
74         while ((end_ptr > c_p) &&
75                ((*(end_ptr - 1) == ' ') || (*(end_ptr - 1) == '\t')))
76                 end_ptr--;
77  
78         *end_ptr = NULL;
79
80
81         if (blank_buf(c_p)) {
82                 return(ADVANCE_BLANK);
83         }
84
85         if (embedded_blank(c_p)) {
86                 return(ADVANCE_CONTAINS_BLANK);
87         }
88
89         while (c_p && *c_p) {
90                 if (isdigit(*c_p) || ((*c_p == '-') && (scanned_sign == False))) {
91                         if ((*c_p == '-') && (scanned_sign == False))
92                                 scanned_sign = True;
93                         c_p++;
94                 } else {
95                         return(ADVANCE_NONNUMERIC);
96
97                 }
98         }
99
100         return(REMINDERS_OK);
101 }
102
103 static Reminder_val_op
104 r_get_bfpm_vals(Widget toggle, Widget text, Reminders_val *val,
105                 Boolean convert_to_secs) {
106         char                    *cval;
107         Time_scope_menu_op      scope;
108         Reminder_val_op         status;
109
110         if (!XmToggleButtonGetState(toggle)) {
111                 val->selected = False;
112                 val->scope_val = -1;
113                 return(REMINDERS_OK);
114         }
115
116         val->selected = True;
117         cval = XmTextGetString(text);
118
119         if ((status = r_validate_advance(cval)) != REMINDERS_OK)
120                 return(status);
121
122         val->scope_val = atoi(cval);
123         XtFree(cval);
124
125         switch(val->scope) {
126         case TIME_DAYS:
127                 if (convert_to_secs)
128                         val->scope_val = days_to_seconds(val->scope_val);
129                 break;
130         case TIME_HRS:
131                 if (convert_to_secs)
132                         val->scope_val = hours_to_seconds(val->scope_val);
133                 break;
134         case TIME_MINS:
135         default:
136                 if (convert_to_secs)
137                         val->scope_val = minutes_to_seconds(val->scope_val);
138                 break;
139         }
140
141         return(REMINDERS_OK);
142 }
143
144 static void
145 r_get_mailto_val(Reminders *r) {
146         char    *c;
147
148         c = XmTextGetString(r->mailto_text);
149         if (!blank_buf(c))
150                 cm_strcpy(r->mailto_val, c);
151         else
152                 cm_strcpy(r->mailto_val, cm_get_credentials());
153         XtFree(c);
154 }
155
156 static void
157 r_set_bfpm_vals(
158         Widget          toggle, 
159         Widget          text, 
160         Widget          menu, 
161         Reminders_val  *val,
162         Boolean         compute_best_fit) 
163 {
164         char            buf[128];
165         Calendar       *c = calendar;
166         Widget          submenu;
167         int             n;
168         WidgetList      option_items;
169         Time_scope_menu_op      scope = val->scope;
170         XmString                xmstr;
171
172
173         if (!XtIsManaged(toggle))
174                 return;
175
176         XtVaGetValues(menu,
177                 XmNsubMenuId,   &submenu,
178                 NULL);
179         
180         XtVaGetValues(submenu,
181                 XmNchildren,    &option_items,
182                 XmNnumChildren, &n,
183                 NULL);
184
185         if (!val->selected) {
186                 XmToggleButtonSetState(toggle, False, True);
187                 XtVaSetValues(text, XmNvalue, "\0",
188                         NULL);
189
190                 switch ( scope ) {
191                   case TIME_MINS :
192                       xmstr = XmStringCreateLocalized(
193                 catgets( calendar->DT_catd, 1, 877, time_scope_str(scope) ) );
194                       break;
195                   case TIME_HRS :
196                       xmstr = XmStringCreateLocalized(
197                 catgets( calendar->DT_catd, 1, 878, time_scope_str(scope) ) );
198                       break;
199                   case TIME_DAYS :
200                       xmstr = XmStringCreateLocalized(
201                 catgets( calendar->DT_catd, 1, 879, time_scope_str(scope) ) );
202                       break;
203                   default :
204                       xmstr = XmStringCreateLocalized(time_scope_str(scope));
205                 }
206                 XtVaSetValues(XmOptionButtonGadget(menu), XmNlabelString, xmstr,
207                         NULL);
208                 XmStringFree(xmstr);
209
210                 return;
211         }
212
213         if (compute_best_fit) {
214                 if (val->scope_val % daysec == 0) {
215                         val->scope = TIME_DAYS;
216                         sprintf(buf, "%d", seconds_to_days(val->scope_val));
217                 } else if (val->scope_val % hrsec == 0) {
218                         val->scope = TIME_HRS;
219                         sprintf(buf, "%d", seconds_to_hours(val->scope_val));
220                 } else {
221                         val->scope = TIME_MINS;
222                         sprintf(buf, "%d", seconds_to_minutes(val->scope_val));
223                 }
224         } else
225                 sprintf(buf, "%d", val->scope_val);
226
227         switch ( scope ) {
228           case TIME_MINS :
229               xmstr = XmStringCreateLocalized(
230                 catgets( calendar->DT_catd, 1, 877, time_scope_str(scope) ) );
231               break;
232           case TIME_HRS :
233               xmstr = XmStringCreateLocalized(
234                 catgets( calendar->DT_catd, 1, 878, time_scope_str(scope) ) );
235               break;
236           case TIME_DAYS :
237               xmstr = XmStringCreateLocalized(
238                 catgets( calendar->DT_catd, 1, 879, time_scope_str(scope) ) );
239               break;
240           default :
241               xmstr = XmStringCreateLocalized(time_scope_str(scope));
242         }
243         XtVaSetValues(XmOptionButtonGadget(menu), XmNlabelString, xmstr,
244                 NULL);
245         XmStringFree(xmstr);
246
247         XmToggleButtonSetState(toggle, True, True);
248         XtVaSetValues(text, XmNvalue, buf,
249                 NULL);
250 }
251
252 static void
253 r_set_mailto_val(Reminders *r) {
254         XtVaSetValues(r->mailto_text, XmNvalue, r->mailto_val,
255                 NULL);
256 }
257
258 /*
259 **  The function ensures the user data is set properly for the time scope
260 **  menus.  This way, when the r_get_bfpm_vals function is called, it knows
261 **  how it should convert the value found in the text field.
262 */
263 static void
264 r_scope_menu_proc(Widget item, XtPointer client_data, XtPointer cbs) {
265         Reminders_val           *val = (Reminders_val *)client_data;
266         Time_scope_menu_op      scope;
267
268         XtVaGetValues(item, XmNuserData, &val->scope,
269                 NULL);
270 }
271
272 /*
273 **  Function sets the alarm text fields and menus sensitive/insensitive
274 **  depending on the state of the toggle button.
275 */
276 static void
277 r_alarm_toggle_proc(Widget toggle_w, XtPointer client_data, XtPointer cbs) {
278
279         Boolean         status = XmToggleButtonGetState(toggle_w);
280         Reminders       *r = (Reminders *)client_data;
281         Widget          text_w, menu_w;
282
283         if (!r)
284                 return;
285
286         if (toggle_w == r->beep_toggle) {
287                 XtVaSetValues(r->beep_text, XmNsensitive, status,
288                         NULL);
289                 XtVaSetValues(XmOptionButtonGadget(r->beep_menu),
290                         XmNsensitive, status,
291                         NULL);
292         } else if (toggle_w == r->flash_toggle) {
293                 XtVaSetValues(r->flash_text, XmNsensitive, status,
294                         NULL);
295                 XtVaSetValues(XmOptionButtonGadget(r->flash_menu),
296                         XmNsensitive, status,
297                         NULL);
298         } else if (toggle_w == r->popup_toggle) {
299                 XtVaSetValues(r->popup_text, XmNsensitive, status,
300                         NULL);
301                 XtVaSetValues(XmOptionButtonGadget(r->popup_menu),
302                         XmNsensitive, status,
303                         NULL);
304         } else if (toggle_w == r->mail_toggle) {
305                 XtVaSetValues(r->mail_text, XmNsensitive, status,
306                         NULL);
307                 XtVaSetValues(XmOptionButtonGadget(r->mail_menu),
308                         XmNsensitive, status,
309                         NULL);
310                 XtVaSetValues(r->mailto_label, XmNsensitive, status,
311                         NULL);
312                 XtVaSetValues(r->mailto_text, XmNsensitive, status,
313                         NULL);
314         }
315 }
316
317 /*******************************************************************************
318 **
319 **  External functions
320 **
321 *******************************************************************************/
322 extern void
323 build_reminders(Reminders *r, Calendar *c, Widget parent) {
324
325         Widget          widest_toggle;
326         Dimension       widest, highest;
327         Widget          prev, curr;
328         Dimension       _toText, _toOption;
329         XmString        xmstr;
330
331         r->cal = c;
332         r->parent = parent;
333
334         /*
335         **  Base form and label
336         */
337         r->bfpm_form_mgr = XtVaCreateWidget("bfpm_form_mgr",
338                 xmFormWidgetClass, parent,
339                 XmNautoUnmanage, False,
340                 NULL);
341
342         xmstr = XmStringCreateLocalized(
343                                 catgets(c->DT_catd, 1, 985, "Reminders"));
344         r->alarm_label = XtVaCreateWidget("Reminders",
345                 xmLabelGadgetClass, r->bfpm_form_mgr,
346                 XmNlabelString,         xmstr,
347                 XmNtopAttachment, XmATTACH_FORM,
348                 XmNtopOffset, 5,
349                 XmNleftAttachment, XmATTACH_FORM,
350                 XmNleftOffset, 5,
351                 NULL);
352         XmStringFree(xmstr);
353
354         /* Create the 4 toggle items to see which one is the longest */
355
356         xmstr = XmStringCreateLocalized(
357                                 catgets(c->DT_catd, 1, 986, "Beep"));
358         r->beep_toggle = XtVaCreateWidget("Beep",
359                 xmToggleButtonGadgetClass, r->bfpm_form_mgr,
360                 XmNlabelString,         xmstr,
361                 XmNnavigationType, XmTAB_GROUP,
362                 NULL);
363         XmStringFree(xmstr);
364
365
366         xmstr = XmStringCreateLocalized(
367                                 catgets(c->DT_catd, 1, 987, "Flash"));
368         r->flash_toggle = XtVaCreateWidget("Flash",
369                 xmToggleButtonGadgetClass, r->bfpm_form_mgr,
370                 XmNlabelString,         xmstr,
371                 XmNnavigationType, XmTAB_GROUP,
372                 NULL);
373         XmStringFree(xmstr);
374
375
376         xmstr = XmStringCreateLocalized(
377                                 catgets(c->DT_catd, 1, 988, "Popup"));
378         r->popup_toggle = XtVaCreateWidget("Popup",
379                 xmToggleButtonGadgetClass, r->bfpm_form_mgr,
380                 XmNlabelString,         xmstr,
381                 XmNnavigationType, XmTAB_GROUP,
382                 NULL);
383         XmStringFree(xmstr);
384
385
386         xmstr = XmStringCreateLocalized(
387                                 catgets(c->DT_catd, 1, 989, "Mail"));
388         r->mail_toggle = XtVaCreateWidget("Mail",
389                 xmToggleButtonGadgetClass, r->bfpm_form_mgr,
390                 XmNlabelString,         xmstr,
391                 XmNnavigationType, XmTAB_GROUP,
392                 NULL);
393         XmStringFree(xmstr);
394
395
396         xmstr = XmStringCreateLocalized(
397                            catgets(c->DT_catd, 1, 990, "Mail To:" ) );
398         r->mailto_label = XtVaCreateManagedWidget("MailTo",
399                 xmLabelGadgetClass, r->bfpm_form_mgr,
400                 XmNlabelString, xmstr,
401                 XmNsensitive, False,
402                 NULL);
403         XmStringFree(xmstr);
404
405
406         /*
407         **  Beep toggle, text, and menu
408         */
409         XtAddCallback(r->beep_toggle, XmNvalueChangedCallback,
410                 r_alarm_toggle_proc, r);
411
412         r->beep_text = XtVaCreateWidget("beep_text",
413                 xmTextWidgetClass, r->bfpm_form_mgr,
414                 XmNeditMode, XmSINGLE_LINE_EDIT,
415                 XmNsensitive, False,
416                 XmNmaxLength, REMINDER_SCOPE_LEN - 1,
417                 NULL);
418
419         r->beep_menu = (Widget)create_time_scope_menu(r->bfpm_form_mgr,
420                 NULL, r_scope_menu_proc, (XtPointer)&r->beep_val);
421         XtVaSetValues(r->beep_menu,
422                 XmNnavigationType, XmTAB_GROUP,
423                 NULL);
424
425         /*
426         **  Flash toggle, text, and menu
427         */
428         XtAddCallback(r->flash_toggle, XmNvalueChangedCallback,
429                 r_alarm_toggle_proc, r);
430
431         r->flash_text = XtVaCreateWidget("flash_text",
432                 xmTextWidgetClass, r->bfpm_form_mgr,
433                 XmNeditMode, XmSINGLE_LINE_EDIT,
434                 XmNsensitive, False,
435                 XmNmaxLength, REMINDER_SCOPE_LEN - 1,
436                 NULL);
437
438         r->flash_menu = (Widget)create_time_scope_menu(r->bfpm_form_mgr,
439                 NULL, r_scope_menu_proc, (XtPointer)&r->flash_val);
440         XtVaSetValues(r->flash_menu,
441                 XmNnavigationType, XmTAB_GROUP,
442                 NULL);
443
444         /*
445         **  Popup toggle, text, and menu
446         */
447         XtAddCallback(r->popup_toggle, XmNvalueChangedCallback,
448                 r_alarm_toggle_proc, r);
449
450         r->popup_text = XtVaCreateWidget("popup_text",
451                 xmTextWidgetClass, r->bfpm_form_mgr,
452                 XmNeditMode, XmSINGLE_LINE_EDIT,
453                 XmNsensitive, False,
454                 XmNmaxLength, REMINDER_SCOPE_LEN - 1,
455                 NULL);
456
457         r->popup_menu = (Widget)create_time_scope_menu(r->bfpm_form_mgr,
458                 NULL, r_scope_menu_proc, (XtPointer)&r->popup_val);
459         XtVaSetValues(r->popup_menu,
460                 XmNnavigationType, XmTAB_GROUP,
461                 NULL);
462
463         /*
464         **  Mail toggle, text, and menu
465         */
466         XtAddCallback(r->mail_toggle, XmNvalueChangedCallback,
467                 r_alarm_toggle_proc, r);
468
469         r->mail_text = XtVaCreateWidget("mail_text",
470                 xmTextWidgetClass, r->bfpm_form_mgr,
471                 XmNeditMode, XmSINGLE_LINE_EDIT,
472                 XmNsensitive, False,
473                 XmNmaxLength, REMINDER_SCOPE_LEN - 1,
474                 NULL);
475
476         r->mail_menu = (Widget)create_time_scope_menu(r->bfpm_form_mgr,
477                 NULL, r_scope_menu_proc, (XtPointer)&r->mail_val);
478         XtVaSetValues(r->mail_menu,
479                 XmNnavigationType, XmTAB_GROUP,
480                 NULL);
481
482         /*
483         **  Mailto text
484         */
485         r->mailto_text = XtVaCreateWidget("mailto_text",
486                 xmTextWidgetClass, r->bfpm_form_mgr,
487                 XmNeditMode, XmSINGLE_LINE_EDIT,
488                 XmNsensitive, False,
489                 XmNmaxLength, MAILTO_LEN - 1,
490                 NULL);
491         /*
492          * Here, we do a layout.
493          */
494
495         _i18n_WidestWidget( 5, &prev, &widest, r->beep_toggle, r->flash_toggle,
496                         r->popup_toggle, r->mail_toggle, r->mailto_label );
497         _toText = 5 + 10 + widest + 10;
498
499         _i18n_WidestWidget( 4, &prev, &widest, r->beep_text, r->flash_text,
500                         r->popup_text, r->mail_text );
501         _toOption = _toText + widest + 5;
502
503         /*
504          * r->beep_toggle,r->beep_text,r->beep_menu
505          */
506         prev = r->alarm_label;
507         _i18n_HighestWidgetAdjust( 3, &curr, &highest, r->beep_toggle,
508                          r->beep_text, r->beep_menu );
509         XtVaSetValues( curr,
510                         XmNtopAttachment, XmATTACH_WIDGET,
511                         XmNtopWidget, prev,
512                         XmNtopOffset, 10,
513                         NULL );
514         XtVaSetValues( r->beep_toggle,
515                         XmNleftAttachment, XmATTACH_FORM,
516                         XmNleftOffset, 5 + 10,
517                         NULL );
518         XtVaSetValues( r->beep_text,
519                         XmNleftAttachment, XmATTACH_FORM,
520                         XmNleftOffset, _toText,
521                         NULL );
522         XtVaSetValues( r->beep_menu,
523                         XmNleftAttachment, XmATTACH_FORM,
524                         XmNleftOffset, _toOption,
525                         NULL );
526         prev = curr;
527
528         /*
529          * r->flash_toggle,r->flash_text,r->flash_menu
530          */
531         _i18n_HighestWidgetAdjust( 3, &curr, &highest, r->flash_toggle,
532                         r->flash_text, r->flash_menu );
533         XtVaSetValues( curr,
534                         XmNtopAttachment, XmATTACH_WIDGET,
535                         XmNtopWidget, prev,
536                         XmNtopOffset, 10,
537                         NULL );
538         XtVaSetValues( r->flash_toggle,
539                         XmNleftAttachment, XmATTACH_FORM,
540                         XmNleftOffset, 5 + 10,
541                         NULL );
542         XtVaSetValues( r->flash_text,
543                         XmNleftAttachment, XmATTACH_FORM,
544                         XmNleftOffset, _toText,
545                         NULL );
546         XtVaSetValues( r->flash_menu,
547                         XmNleftAttachment, XmATTACH_FORM,
548                         XmNleftOffset, _toOption,
549                         NULL );
550         prev = curr;
551
552         /*
553          * r->popup_toggle,r->popup_text,r->popup_menu
554          */
555         _i18n_HighestWidgetAdjust( 3, &curr, &highest, r->popup_toggle,
556                         r->popup_text, r->popup_menu );
557         XtVaSetValues( curr,
558                         XmNtopAttachment, XmATTACH_WIDGET,
559                         XmNtopWidget, prev,
560                         XmNtopOffset, 10,
561                         NULL );
562         XtVaSetValues( r->popup_toggle,
563                         XmNleftAttachment, XmATTACH_FORM,
564                         XmNleftOffset, 5 + 10,
565                         NULL );
566         XtVaSetValues( r->popup_text,
567                         XmNleftAttachment, XmATTACH_FORM,
568                         XmNleftOffset, _toText,
569                         NULL );
570         XtVaSetValues( r->popup_menu,
571                         XmNleftAttachment, XmATTACH_FORM,
572                         XmNleftOffset, _toOption,
573                         NULL );
574         prev = curr;
575
576         /*
577          * r->mail_toggle,r->mail_text,r->mail_menu
578          */
579         _i18n_HighestWidgetAdjust( 3, &curr, &highest, r->mail_toggle,
580                                 r->mail_text, r->mail_menu );
581         XtVaSetValues( curr,
582                         XmNtopAttachment, XmATTACH_WIDGET,
583                         XmNtopWidget, prev,
584                         XmNtopOffset, 10,
585                         NULL );
586         XtVaSetValues( r->mail_toggle,
587                         XmNleftAttachment, XmATTACH_FORM,
588                         XmNleftOffset, 5 + 10,
589                         NULL );
590         XtVaSetValues( r->mail_text,
591                         XmNleftAttachment, XmATTACH_FORM,
592                         XmNleftOffset, _toText,
593                         NULL );
594         XtVaSetValues( r->mail_menu,
595                         XmNleftAttachment, XmATTACH_FORM,
596                         XmNleftOffset, _toOption,
597                         NULL );
598         prev = curr;
599
600         /*
601          * r->mailto_label,r->mailto_text
602          */
603         _i18n_HighestWidgetAdjust( 2, &curr, &highest, r->mailto_label,
604                                         r->mailto_text );
605         XtVaSetValues( curr,
606                         XmNtopAttachment, XmATTACH_WIDGET,
607                         XmNtopWidget, prev,
608                         XmNtopOffset, 20,
609                         NULL );
610         XtVaSetValues( r->mailto_label,
611                         XmNleftAttachment, XmATTACH_FORM,
612                         XmNleftOffset, 5 + 10,
613                         NULL );
614         XtVaSetValues( r->mailto_text,
615                         XmNleftAttachment, XmATTACH_FORM,
616                         XmNleftOffset, _toText,
617                         NULL );
618 }
619
620 extern Reminder_val_op
621 get_reminders_vals(Reminders *r, Boolean convert_to_secs) {
622
623         Reminder_val_op status;
624
625         if ((status = r_get_bfpm_vals(r->beep_toggle, r->beep_text, &r->beep_val,
626                         convert_to_secs)) != REMINDERS_OK)
627                 return(status);
628
629         if ((status = r_get_bfpm_vals(r->flash_toggle, r->flash_text, &r->flash_val,
630                         convert_to_secs)) != REMINDERS_OK)
631                 return(status);
632
633         if ((status = r_get_bfpm_vals(r->mail_toggle, r->mail_text, &r->mail_val,
634                         convert_to_secs)) != REMINDERS_OK)
635                 return(status);
636
637         if ((status = r_get_bfpm_vals(r->popup_toggle, r->popup_text, &r->popup_val,
638                         convert_to_secs)) != REMINDERS_OK)
639                 return(status);
640
641         r_get_mailto_val(r);
642
643         return(REMINDERS_OK);
644 }
645
646 static void
647 reminder_err_msg(Widget frame, char *name, Reminder_val_op op, Pixmap p) 
648 {
649         Calendar        *c = calendar;
650         char            buf[MAXNAMELEN], buf2[MAXNAMELEN * 2];
651         char            *title;
652         char            *ident1;
653
654         switch(op) {
655         case ADVANCE_BLANK:
656                 sprintf(buf, catgets(c->DT_catd, 1, 775, "You must specify a reminder advance\nOperation was cancelled.  Calendar"));
657                 break;
658         case ADVANCE_CONTAINS_BLANK:
659                 sprintf(buf, catgets(c->DT_catd, 1, 776, "A reminder advance may not contain an embedded blank\nOperation was cancelled.  Calendar"));
660                 break;
661         case ADVANCE_NONNUMERIC:
662                 sprintf(buf, catgets(c->DT_catd, 1, 777, "Advance values must be a number with an optional sign\nOperation was cancelled.  Calendar"));
663                 break;
664         case REMINDERS_OK:
665         default:
666                 return;
667         }
668
669  
670         sprintf(buf2, "%s %s", buf, name);
671         title = XtNewString(catgets(c->DT_catd, 1, 364,
672                         "Calendar : Error - Editor"));
673         ident1 = XtNewString(catgets(c->DT_catd, 1, 95, "Continue"));
674         dialog_popup(frame, DIALOG_TITLE, title,
675                 DIALOG_TEXT, buf2,
676                 BUTTON_IDENT, 1, ident1,
677                 BUTTON_HELP, ADVANCE_ERROR_HELP,
678                 DIALOG_IMAGE, p,
679                 NULL);
680         XtFree(ident1);
681         XtFree(title);
682 }
683
684
685 /*
686 **  This function will consume form values and stuff them into an appointment.
687 */
688 extern Boolean 
689 reminders_form_to_appt(Reminders *r, Dtcm_appointment *appt, char *name) {
690
691         Reminder_val_op status;
692         Props_pu        *pu = (Props_pu *)r->cal->properties_pu;
693
694         if (r->bfpm_form_mgr) {
695                 if ((status = get_reminders_vals(r, True)) != REMINDERS_OK) {
696                         reminder_err_msg(r->parent, name, status, 
697                                                         pu->xm_error_pixmap);
698                         return(False);
699                 }
700         }
701
702         if (!r->beep_val.selected) {
703                 free(appt->beep->value);
704                 appt->beep->value = NULL;
705         } else {
706                 appt->beep->value->item.reminder_value->lead_time = (char *) malloc(BUFSIZ);
707                 _csa_duration_to_iso8601(r->beep_val.scope_val, appt->beep->value->item.reminder_value->lead_time);
708                 appt->beep->value->item.reminder_value->reminder_data.data = NULL;
709                 appt->beep->value->item.reminder_value->reminder_data.size = 0;
710         }
711
712         if (!r->flash_val.selected) {
713                 free(appt->flash->value);
714                 appt->flash->value = NULL;
715         } else { 
716                 appt->flash->value->item.reminder_value->lead_time = (char *) malloc(BUFSIZ);
717                 _csa_duration_to_iso8601(r->flash_val.scope_val, appt->flash->value->item.reminder_value->lead_time);
718                 appt->flash->value->item.reminder_value->reminder_data.data = NULL;
719                 appt->flash->value->item.reminder_value->reminder_data.size = 0;
720         }
721
722         if (!r->popup_val.selected) {
723                 free(appt->popup->value);
724                 appt->popup->value = NULL;
725         } else {
726                 appt->popup->value->item.reminder_value->lead_time = (char *) malloc(BUFSIZ);
727                 _csa_duration_to_iso8601(r->popup_val.scope_val, appt->popup->value->item.reminder_value->lead_time);
728                 appt->popup->value->item.reminder_value->reminder_data.data = NULL;
729                 appt->popup->value->item.reminder_value->reminder_data.size = 0;
730         }
731
732         if (!r->mail_val.selected) {
733                 free(appt->mail->value);
734                 appt->mail->value = NULL;
735         } else {
736                 appt->mail->value->item.reminder_value->lead_time = (char *) malloc(BUFSIZ);
737                 _csa_duration_to_iso8601(r->mail_val.scope_val, appt->mail->value->item.reminder_value->lead_time);
738                 appt->mail->value->item.reminder_value->reminder_data.data = (CSA_uint8 *) cm_strdup(r->mailto_val);
739                 appt->mail->value->item.reminder_value->reminder_data.size = strlen(r->mailto_val);
740         }
741
742         return True;
743 }
744
745 /*
746 **  This function will take appointment values and stuff them into a form.
747 */
748 extern Boolean
749 reminders_appt_to_form(Reminders *r, CSA_entry_handle entry) {
750         Boolean                 ret_val;
751         CSA_return_code         stat;
752         Dtcm_appointment        *appt;
753
754         appt = allocate_appt_struct(appt_read,
755                                     r->cal->general->version,
756                                     CSA_ENTRY_ATTR_AUDIO_REMINDER_I,
757                                     CSA_ENTRY_ATTR_FLASHING_REMINDER_I,
758                                     CSA_ENTRY_ATTR_POPUP_REMINDER_I,
759                                     CSA_ENTRY_ATTR_MAIL_REMINDER_I,
760                                     NULL);
761         stat = query_appt_struct(r->cal->cal_handle, entry, appt);
762         backend_err_msg(r->cal->frame, r->cal->view->current_calendar, stat,
763                 ((Props_pu *)r->cal->properties_pu)->xm_error_pixmap);
764         if (stat != CSA_SUCCESS) {
765                 free_appt_struct(&appt);
766                 return False;
767         }
768
769         ret_val = reminders_attrs_to_form(r, appt);
770         free_appt_struct(&appt);
771
772         return ret_val;
773 }
774
775 extern Boolean
776 reminders_attrs_to_form(Reminders *r, Dtcm_appointment *appt) {
777
778         if (appt->beep && appt->beep->value) {
779                 r->beep_val.selected = True;
780                 _csa_iso8601_to_duration(appt->beep->value->item.reminder_value->lead_time, &r->beep_val.scope_val);
781         } else {
782                 r->beep_val.selected = False;
783                 r->beep_val.scope_val = -1;
784         }
785
786         if (appt->flash && appt->flash->value) {
787                 r->flash_val.selected = True;
788                 _csa_iso8601_to_duration(appt->flash->value->item.reminder_value->lead_time, &r->flash_val.scope_val);
789         } else {
790                 r->flash_val.selected = False;
791                 r->flash_val.scope_val = -1;
792         }
793
794         if (appt->popup && appt->popup->value) {
795                 r->popup_val.selected = True;
796                 _csa_iso8601_to_duration(appt->popup->value->item.reminder_value->lead_time, &r->popup_val.scope_val);;
797         } else {
798                 r->popup_val.selected = False;
799                 r->popup_val.scope_val = -1;
800         }
801         if (appt->mail && appt->mail->value) {
802                 r->mail_val.selected = True;
803                 _csa_iso8601_to_duration(appt->mail->value->item.reminder_value->lead_time, &r->mail_val.scope_val);
804                 memset(r->mailto_val, NULL, MAILTO_LEN);
805                 strncpy(r->mailto_val, (char *) appt->mail->value->item.reminder_value->reminder_data.data, appt->mail->value->item.reminder_value->reminder_data.size);
806         } else {
807                 r->mail_val.selected = False;
808                 r->mail_val.scope_val = -1;
809                 r->mailto_val[0] = '\0';
810         }
811
812         set_reminders_vals(r, True);
813
814         return True;
815 }
816
817 extern void
818 set_reminders_defaults(Reminders *r) {
819         Props           *p = (Props *)r->cal->properties;
820         Reminders_val   *val;
821
822         val = &r->beep_val;
823         val->selected = convert_boolean_str(get_char_prop(p, CP_BEEPON));
824         val->scope = convert_time_scope_str(get_char_prop(p, CP_BEEPUNIT));
825         val->scope_val = get_int_prop(p, CP_BEEPADV);
826
827         val = &r->flash_val;
828         val->selected = convert_boolean_str(get_char_prop(p, CP_FLASHON));
829         val->scope = convert_time_scope_str(get_char_prop(p, CP_FLASHUNIT));
830         val->scope_val = get_int_prop(p, CP_FLASHADV);
831
832         val = &r->popup_val;
833         val->selected = convert_boolean_str(get_char_prop(p, CP_OPENON));
834         val->scope = convert_time_scope_str(get_char_prop(p, CP_OPENUNIT));
835         val->scope_val = get_int_prop(p, CP_OPENADV);
836
837         val = &r->mail_val;
838         val->selected = convert_boolean_str(get_char_prop(p, CP_MAILON));
839         val->scope = convert_time_scope_str(get_char_prop(p, CP_MAILUNIT));
840         val->scope_val = get_int_prop(p, CP_MAILADV);
841         strcpy(r->mailto_val, get_char_prop(p, CP_MAILTO));
842
843         set_reminders_vals(r, False);
844 }
845
846 extern void
847 set_reminders_vals(Reminders *r, Boolean compute_best_fit) {
848
849         r_set_bfpm_vals(r->beep_toggle, r->beep_text, r->beep_menu,
850                 &r->beep_val, compute_best_fit);
851         r_set_bfpm_vals(r->flash_toggle, r->flash_text, r->flash_menu,
852                 &r->flash_val, compute_best_fit);
853         r_set_bfpm_vals(r->mail_toggle, r->mail_text, r->mail_menu,
854                 &r->mail_val, compute_best_fit);
855         r_set_bfpm_vals(r->popup_toggle, r->popup_text, r->popup_menu,
856                 &r->popup_val, compute_best_fit);
857
858         r_set_mailto_val(r);
859 }
860
861 static int
862 convert_time_val(
863         int                     value,
864         Time_scope_menu_op      type)
865 {
866         switch(type) {
867         case TIME_DAYS:
868                 return days_to_seconds(value);
869         case TIME_HRS:
870                 return hours_to_seconds(value);
871         case TIME_MINS:
872         default:
873                 return minutes_to_seconds(value);
874         }
875 }
876
877 extern void
878 reminders_init(
879         Reminders       *r,
880         Calendar        *c,
881         Widget           parent)
882 {
883         Props           *p = (Props *)c->properties;
884         Reminders_val   *val;
885
886         r->parent = parent;
887         r->cal = c;
888
889         val = &r->beep_val;
890         val->selected = convert_boolean_str(get_char_prop(p, CP_BEEPON));
891         val->scope = convert_time_scope_str(get_char_prop(p, CP_BEEPUNIT));
892         val->scope_val = convert_time_val(get_int_prop(p, CP_BEEPADV), 
893                                           val->scope);
894
895         val = &r->flash_val;
896         val->selected = convert_boolean_str(get_char_prop(p, CP_FLASHON));
897         val->scope = convert_time_scope_str(get_char_prop(p, CP_FLASHUNIT));
898         val->scope_val = convert_time_val(get_int_prop(p, CP_FLASHADV), 
899                                           val->scope);
900
901         val = &r->popup_val;
902         val->selected = convert_boolean_str(get_char_prop(p, CP_OPENON));
903         val->scope = convert_time_scope_str(get_char_prop(p, CP_OPENUNIT));
904         val->scope_val = convert_time_val(get_int_prop(p, CP_OPENADV), 
905                                           val->scope);
906
907         val = &r->mail_val;
908         val->selected = convert_boolean_str(get_char_prop(p, CP_MAILON));
909         val->scope = convert_time_scope_str(get_char_prop(p, CP_MAILUNIT));
910         val->scope_val = convert_time_val(get_int_prop(p, CP_MAILADV), 
911                                           val->scope);
912         strcpy(r->mailto_val, get_char_prop(p, CP_MAILTO));
913
914 }
915