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 /*******************************************************************************
27 ** $XConsortium: dssw.c /main/7 1996/10/14 16:06:20 barstow $
29 ** RESTRICTED CONFIDENTIAL INFORMATION:
31 ** The information in this document is subject to special
32 ** restrictions in a confidential disclosure agreement between
33 ** HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
34 ** document outside HP, IBM, Sun, USL, SCO, or Univel without
35 ** Sun's specific written approval. This document and all copies
36 ** and derivative works thereof must be returned or destroyed at
39 ** Copyright 1993 Sun Microsystems, Inc. All rights reserved.
41 *******************************************************************************/
44 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
45 * (c) Copyright 1993, 1994 International Business Machines Corp. *
46 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
47 * (c) Copyright 1993, 1994 Novell, Inc. *
51 static char sccsid[] = "@(#)dssw.c 1.58 95/08/07 Copyr 1993 Sun Microsystems, Inc.";
54 #include <EUSCompat.h>
58 #include <Xm/RowColumn.h>
60 #include <Xm/LabelG.h>
61 #include <Xm/ToggleBG.h>
62 #include <Xm/ToggleB.h>
69 #include <sys/param.h>
72 extern Dimension ComputeMaxWidth(Widget, Widget, Widget, Widget);
75 /*******************************************************************************
77 ** Static functions visible to dssw.c only
79 *******************************************************************************/
81 dssw_get_non_times(DSSW *dssw, time_t t) {
83 Props *p = (Props *)dssw->cal->properties;
84 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
85 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
87 cm_strcpy(dssw->date_val,
88 get_date_from_widget(t, dssw->date_text, ot, st));
90 str = XmTextGetString(dssw->what_text);
91 strcpy(dssw->what_val, str);
96 dssw_set_non_times(DSSW *dssw, time_t t) {
97 Props *p = (Props *)dssw->cal->properties;
98 OrderingType ot = get_int_prop(p, CP_DATEORDERING);
99 SeparatorType st = get_int_prop(p, CP_DATESEPARATOR);
101 set_date_in_widget(t, dssw->date_text, ot, st);
102 XmTextSetString(dssw->what_text, dssw->what_val);
106 ** Callback from start time and stop time to set text fields accordingly
109 dssw_set_start_hour(Widget w, XtPointer client_data, XtPointer cbs) {
110 int start_hrs, stop_hrs, dur, start_mins, stop_mins;
112 DSSW *dssw = (DSSW *)client_data;
113 Props *p = (Props *)dssw->cal->properties;
114 DisplayType dt = get_int_prop(p, CP_DEFAULTDISP);
116 XtVaGetValues(w, XmNuserData, &user_data, NULL);
118 if (user_data == NO_TIME) {
119 dssw->start_val.val[0] = '\0';
120 dssw->stop_val.val[0] = '\0';
121 dssw->start_val.block = dssw->stop_val.block = TIME_AM;
122 } else if (user_data == ALL_DAY) {
124 sprintf(dssw->start_val.val, "12:00");
125 sprintf(dssw->stop_val.val, "11:59");
127 sprintf(dssw->start_val.val, "0000");
128 sprintf(dssw->stop_val.val, "2359");
130 dssw->start_val.block = TIME_AM;
131 dssw->stop_val.block = TIME_PM;
133 start_hrs = user_data / hrsec;
134 dur = get_int_prop(p, CP_APPTDURATION) * minsec;
135 stop_hrs = (user_data + dur) / hrsec;
136 start_mins = (user_data - (start_hrs * hrsec)) / minsec;
137 stop_mins = ((user_data + dur) - (stop_hrs * hrsec)) / minsec;
138 stop_hrs = stop_hrs % 24;
141 dssw->start_val.block =
142 (adjust_hour(&start_hrs)) ? TIME_AM : TIME_PM;
143 dssw->stop_val.block =
144 (adjust_hour(&stop_hrs)) ? TIME_AM : TIME_PM;
145 sprintf(dssw->start_val.val, "%2d:%02d",
146 start_hrs, start_mins);
147 sprintf(dssw->stop_val.val, "%2d:%02d",
148 stop_hrs, stop_mins);
150 dssw->start_val.block =
151 (start_hrs > 12) ? TIME_PM : TIME_AM;
152 dssw->stop_val.block =
153 (stop_hrs > 12) ? TIME_PM : TIME_AM;
154 sprintf(dssw->start_val.val, "%02d%02d",
155 start_hrs, start_mins);
156 sprintf(dssw->stop_val.val, "%02d%02d",
157 stop_hrs, stop_mins);
160 set_dssw_times(dssw);
164 dssw_set_stop_hour(Widget w, XtPointer client_data, XtPointer cbs) {
167 DSSW *dssw = (DSSW *)client_data;
168 Props *p = (Props *)dssw->cal->properties;
169 DisplayType dt = get_int_prop(p, CP_DEFAULTDISP);
171 get_dssw_times(dssw);
172 XtVaGetValues(w, XmNuserData, &user_data, NULL);
174 if (user_data == NO_TIME) {
175 dssw->stop_val.val[0] = '\0';
176 dssw->stop_val.block = TIME_AM;
178 hrs = user_data / hrsec;
179 mins = (user_data - (hrs * hrsec)) / minsec;
182 dssw->stop_val.block =
183 (adjust_hour(&hrs)) ? TIME_AM : TIME_PM;
184 sprintf(dssw->stop_val.val, "%2d:%02d", hrs, mins);
186 dssw->stop_val.block = (hrs > 12) ? TIME_PM : TIME_AM;
187 sprintf(dssw->stop_val.val, "%02d%02d", hrs, mins);
190 set_dssw_times(dssw);
193 /*******************************************************************************
195 ** External functions
197 *******************************************************************************/
200 set_dssw_menus(DSSW *dssw, Props *p) {
202 set_time_submenu(dssw->dssw_form_mgr, dssw->start_menu, p,
203 dssw_set_start_hour, (XtPointer)dssw,
204 dssw->show_notime_selection, dssw->show_allday_selection,
205 &dssw->start_menu_widget_list, &dssw->start_menu_widget_count);
207 set_time_submenu(dssw->dssw_form_mgr, dssw->stop_menu, p,
208 dssw_set_stop_hour, (XtPointer)dssw, dssw->show_notime_selection, False,
209 &dssw->stop_menu_widget_list, &dssw->stop_menu_widget_count);
211 set_dssw_defaults(dssw, calendar->view->date, True);
229 Dimension max_left_label_width;
232 Dimension highest, widest;
234 Dimension _toLabel, _toText, _toMenu, _toRC;
237 dssw->parent = parent;
238 p = (Props *)c->properties;
240 dt = get_int_prop(p, CP_DEFAULTDISP);
242 dssw->show_notime_selection = show_notime;
243 dssw->show_allday_selection = show_allday;
246 ** One form manager for the widget
248 dssw->dssw_form_mgr = XtVaCreateWidget("dssw_form_mgr",
249 xmFormWidgetClass, parent,
250 XmNautoUnmanage, False,
253 label_str = XmStringCreateLocalized(catgets(c->DT_catd, 1, 828, "Date:"));
254 dssw->date_label = XtVaCreateWidget("date_label",
255 xmLabelGadgetClass, dssw->dssw_form_mgr,
256 XmNlabelString, label_str,
258 XmStringFree(label_str);
260 label_str = XmStringCreateLocalized(catgets(c->DT_catd, 1, 829, "Start:"));
261 dssw->start_label = XtVaCreateWidget("start_label",
262 xmLabelGadgetClass, dssw->dssw_form_mgr,
263 XmNlabelString, label_str,
265 XmStringFree(label_str);
267 label_str = XmStringCreateLocalized(catgets(c->DT_catd, 1, 832, "End:"));
268 dssw->stop_label = XtVaCreateWidget("stop_label",
269 xmLabelGadgetClass, dssw->dssw_form_mgr,
270 XmNlabelString, label_str,
272 XmStringFree(label_str);
274 label_str = XmStringCreateLocalized(catgets(c->DT_catd, 1, 835, "What:"));
275 dssw->what_label = XtVaCreateWidget("what_label",
276 xmLabelGadgetClass, dssw->dssw_form_mgr,
277 XmNlabelString, label_str,
279 XmStringFree(label_str);
281 dssw->date_text = XtVaCreateWidget("date_text",
282 xmTextWidgetClass, dssw->dssw_form_mgr,
283 XmNeditMode, XmSINGLE_LINE_EDIT,
284 XmNmaxLength, DATE_LEN - 1,
288 ** Radio button behavior for AM/PM selection for start time
290 dssw->start_text = XtVaCreateWidget("start_text",
291 xmTextWidgetClass, dssw->dssw_form_mgr,
292 XmNeditMode, XmSINGLE_LINE_EDIT,
293 XmNmaxLength, START_STOP_LEN - 1,
296 dssw->start_menu = create_start_stop_time_menu(dssw->dssw_form_mgr,
297 NULL, dssw_set_start_hour, (XtPointer)dssw, p, show_notime,
298 show_allday, &dssw->start_menu_widget_list,
299 &dssw->start_menu_widget_count);
301 XtVaSetValues(dssw->start_menu,
302 XmNnavigationType, XmTAB_GROUP,
305 dssw->start_ampm_rc_mgr = XtVaCreateWidget("start_ampm_rc_mgr",
306 xmRowColumnWidgetClass, dssw->dssw_form_mgr,
307 XmNpacking, XmPACK_COLUMN,
308 XmNorientation, XmHORIZONTAL,
309 XmNradioBehavior, True,
310 XmNisHomogeneous, True,
311 XmNentryClass, xmToggleButtonGadgetClass,
314 label_str = XmStringCreateLocalized(catgets(c->DT_catd, 1, 830, "AM"));
315 child[0] = dssw->start_am = XtVaCreateWidget("start_am",
316 xmToggleButtonGadgetClass, dssw->start_ampm_rc_mgr,
317 XmNlabelString, label_str,
318 XmNsensitive, (dt == HOUR12) ? True : False,
320 XmStringFree(label_str);
322 label_str = XmStringCreateLocalized(catgets(c->DT_catd, 1, 831, "PM"));
323 child[1] = dssw->start_pm = XtVaCreateWidget("start_pm",
324 xmToggleButtonGadgetClass, dssw->start_ampm_rc_mgr,
325 XmNlabelString, label_str,
326 XmNsensitive, (dt == HOUR12) ? True : False,
328 XmStringFree(label_str);
330 XtManageChildren(child, 2);
333 ** Last and near the end, the stop stuff
334 ** Radio button behavior for AM/PM selection for stop time
336 dssw->stop_text = XtVaCreateWidget("stop_text",
337 xmTextWidgetClass, dssw->dssw_form_mgr,
338 XmNeditMode, XmSINGLE_LINE_EDIT,
339 XmNmaxLength, START_STOP_LEN - 1,
342 dssw->stop_menu = create_start_stop_time_menu(dssw->dssw_form_mgr,
343 NULL, dssw_set_stop_hour, (XtPointer)dssw, p, show_notime,
344 False, &dssw->stop_menu_widget_list,
345 &dssw->stop_menu_widget_count);
347 XtVaSetValues(dssw->stop_menu,
348 XmNnavigationType, XmTAB_GROUP,
351 dssw->stop_ampm_rc_mgr = XtVaCreateWidget("stop_ampm_rc_mgr",
352 xmRowColumnWidgetClass, dssw->dssw_form_mgr,
353 XmNpacking, XmPACK_COLUMN,
354 XmNorientation, XmHORIZONTAL,
355 XmNradioBehavior, True,
356 XmNisHomogeneous, True,
357 XmNentryClass, xmToggleButtonGadgetClass,
360 label_str = XmStringCreateLocalized(catgets(c->DT_catd, 1, 833, "AM"));
361 child[0] = dssw->stop_am = XtVaCreateWidget("stop_am",
362 xmToggleButtonGadgetClass, dssw->stop_ampm_rc_mgr,
363 XmNlabelString, label_str,
364 XmNsensitive, (dt == HOUR12) ? True : False,
366 XmStringFree(label_str);
368 label_str = XmStringCreateLocalized(catgets(c->DT_catd, 1, 834, "PM"));
369 child[1] = dssw->stop_pm = XtVaCreateWidget("stop_pm",
370 xmToggleButtonGadgetClass, dssw->stop_ampm_rc_mgr,
371 XmNlabelString, label_str,
372 XmNsensitive, (dt == HOUR12) ? True : False,
374 XmStringFree(label_str);
376 XtManageChildren(child, 2);
380 ** Finally the what text field
383 XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT), n++;
384 /* XtSetArg(args[n], XmNscrollVertical, True), n++; */
385 XtSetArg(args[n], XmNscrollHorizontal, False), n++;
386 XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC), n++;
387 XtSetArg(args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED), n++;
388 XtSetArg(args[n], XmNrows, 3), n++;
389 XtSetArg(args[n], XmNmaxLength, WHAT_LEN - 1), n++;
391 dssw->what_text = XmCreateScrolledText(dssw->dssw_form_mgr,
392 "what_text", args, n);
394 dssw->what_scrollwindow = XtParent(dssw->what_text);
395 XtManageChild(dssw->what_text);
400 _i18n_WidestWidget( 4, &prev, &max_left_label_width,
401 dssw->date_label, dssw->start_label, dssw->stop_label,
403 _toText = max_left_label_width + 2 * GAP;
406 * dssw->date_label, dssw->date_text
408 _i18n_WidestWidget( 1, &curr, &widest, dssw->date_label );
409 _toLabel = _toText - GAP - widest;
410 _i18n_HighestWidgetAdjust( 2, &curr, &highest, dssw->date_label,
413 XmNtopAttachment, XmATTACH_FORM,
416 XtVaSetValues( dssw->date_label,
417 XmNleftAttachment, XmATTACH_FORM,
418 XmNleftOffset, _toLabel,
420 XtVaSetValues( dssw->date_text,
421 XmNleftAttachment, XmATTACH_FORM,
422 XmNleftOffset, _toText,
423 XmNrightAttachment, XmATTACH_FORM,
428 * dssw->start_label, dssw->start_text, dssw->start_menu,
429 * dssw->start_ampm_rc_mgr
431 _i18n_WidestWidget( 1, &curr, &widest, dssw->start_label );
432 _toLabel = _toText - GAP - widest;
433 _i18n_WidestWidget( 1, &curr, &widest, dssw->start_text );
434 _toMenu = _toText + widest + GAP;
435 _i18n_WidestWidget( 1, &curr, &widest, dssw->start_menu );
436 _toRC = _toMenu + widest + GAP;
437 _i18n_HighestWidgetAdjust( 4, &curr, &highest, dssw->start_label,
438 dssw->start_text, dssw->start_menu, dssw->start_ampm_rc_mgr );
440 XmNtopAttachment, XmATTACH_WIDGET,
444 XtVaSetValues( dssw->start_label,
445 XmNleftAttachment, XmATTACH_FORM,
446 XmNleftOffset, _toLabel,
448 XtVaSetValues( dssw->start_text,
449 XmNleftAttachment, XmATTACH_FORM,
450 XmNleftOffset, _toText,
452 XtVaSetValues( dssw->start_menu,
453 XmNleftAttachment, XmATTACH_FORM,
454 XmNleftOffset, _toMenu,
456 XtVaSetValues( dssw->start_ampm_rc_mgr,
457 XmNleftAttachment, XmATTACH_FORM,
458 XmNleftOffset, _toRC,
463 * dssw->stop_label, dssw->stop_text, dssw->stop_menu,
464 * dssw->stop_ampm_rc_mgr
466 _i18n_WidestWidget( 1, &curr, &widest, dssw->stop_label );
467 _toLabel = _toText - GAP - widest;
468 _i18n_WidestWidget( 1, &curr, &widest, dssw->stop_text );
469 _toMenu = _toText + widest + GAP;
470 _i18n_WidestWidget( 1, &curr, &widest, dssw->stop_menu );
471 _toRC = _toMenu + widest + GAP;
472 _i18n_HighestWidgetAdjust( 4, &curr, &highest, dssw->stop_label,
473 dssw->stop_text, dssw->stop_menu, dssw->stop_ampm_rc_mgr );
475 XmNtopAttachment, XmATTACH_WIDGET,
479 XtVaSetValues( dssw->stop_label,
480 XmNleftAttachment, XmATTACH_FORM,
481 XmNleftOffset, _toLabel,
483 XtVaSetValues( dssw->stop_text,
484 XmNleftAttachment, XmATTACH_FORM,
485 XmNleftOffset, _toText,
487 XtVaSetValues( dssw->stop_menu,
488 XmNleftAttachment, XmATTACH_FORM,
489 XmNleftOffset, _toMenu,
491 XtVaSetValues( dssw->stop_ampm_rc_mgr,
492 XmNleftAttachment, XmATTACH_FORM,
493 XmNleftOffset, _toRC,
498 * dssw->what_label, dssw->what_scrollwindow
500 _i18n_WidestWidget( 1, &curr, &widest, dssw->what_label );
501 _toLabel = _toText - GAP - widest;
502 XtVaSetValues( dssw->what_label,
503 XmNtopAttachment, XmATTACH_WIDGET,
506 XmNleftAttachment, XmATTACH_FORM,
507 XmNleftOffset, _toLabel,
509 XtVaSetValues( dssw->what_scrollwindow,
510 XmNtopAttachment, XmATTACH_WIDGET,
513 XmNleftAttachment, XmATTACH_FORM,
514 XmNleftOffset, _toText,
515 XmNrightAttachment, XmATTACH_FORM,
516 XmNbottomAttachment, XmATTACH_FORM,
521 ** This function will consume form values and stuff them into an appointment.
524 dssw_form_to_appt(DSSW *dssw, Dtcm_appointment *a, char *name, Tick t)
526 return dssw_form_flags_to_appt(dssw, a, name, t, (int *)NULL);
530 dssw_form_flags_to_appt(DSSW *dssw, Dtcm_appointment *a, char *name, Tick t, int *flagsP)
532 time_t start_tick, stop_tick;
533 char ampm_buf[BUFSIZ], buf[BUFSIZ];
534 Props *p = (Props *)dssw->cal->properties;
535 Props_pu *pu = (Props_pu *)dssw->cal->properties_pu;
536 DisplayType dt = get_int_prop(p, CP_DEFAULTDISP);
539 if (flagsP == (int *)NULL)
543 ** If neither start nor end times exist, then the start time is set
544 ** to 3:41am (magic time) and the end time to 3:41 plus one minute.
546 get_dssw_vals(dssw, t);
547 if (blank_buf(dssw->date_val)) {
548 editor_err_msg(dssw->parent, name, MISSING_DATE,
549 pu->xm_error_pixmap);
553 if (!blank_buf(dssw->start_val.val)) {
554 if (!valid_time(p, dssw->start_val.val)) {
555 if (a->type->value->item.sint32_value == CSA_TYPE_TODO)
556 editor_err_msg(dssw->parent, name,
558 pu->xm_error_pixmap);
560 editor_err_msg(dssw->parent, name,
562 pu->xm_error_pixmap);
567 /* am and pm should not be translated. They are only
568 * used in the date parsing code and never shown to
571 if (dssw->start_val.block == TIME_AM)
572 sprintf(ampm_buf, "am");
574 sprintf(ampm_buf, "pm");
578 sprintf(buf, "%s %s%s",
579 dssw->date_val, dssw->start_val.val, ampm_buf);
581 if (!blank_buf(dssw->stop_val.val)
582 && !valid_time(p, dssw->stop_val.val)) {
583 editor_err_msg(dssw->parent, name, INVALID_STOP,
584 pu->xm_error_pixmap);
587 } else if (!blank_buf(dssw->stop_val.val)) {
588 editor_err_msg(dssw->parent, name, MISSING_START,
589 pu->xm_error_pixmap);
592 sprintf(buf, "%s 3:41am", dssw->date_val);
594 start_tick = cm_getdate(buf, NULL);
596 editor_err_msg(dssw->parent, name, INVALID_DATE,
597 pu->xm_error_pixmap);
601 if (blank_buf(dssw->what_val) && blank_buf(dssw->start_val.val)
602 && blank_buf(dssw->stop_val.val)) {
603 editor_err_msg(dssw->parent, name, INVALID_NOTIME_APPT,
604 pu->xm_error_pixmap);
608 a->time->value->item.date_time_value = (char *) malloc(BUFSIZ);
609 _csa_tick_to_iso8601(start_tick, a->time->value->item.date_time_value);
610 a->what->value->item.string_value = (char *)cm_strdup(dssw->what_val);
611 a->show_time->value->item.sint32_value = True;
613 if (!blank_buf(dssw->stop_val.val)) {
615 /* am and pm should not be translated. They are only
616 * used in the date parsing code and never shown to
619 if (dssw->stop_val.block == TIME_AM)
620 sprintf(ampm_buf, "am");
622 sprintf(ampm_buf, "pm");
626 sprintf(buf, "%s %s%s", dssw->date_val,
627 dssw->stop_val.val, ampm_buf);
628 if ((stop_tick = cm_getdate(buf, NULL)) <= 0) {
629 editor_err_msg(dssw->parent, name, INVALID_DATE,
630 pu->xm_error_pixmap);
633 if (stop_tick < start_tick) {
636 char *title = XtNewString(catgets(calendar->DT_catd, 1, 248,
637 "Calendar : Schedule Appointment"));
638 char *ident1 = XtNewString(catgets(calendar->DT_catd, 1,
640 char *ident2 = XtNewString(catgets(calendar->DT_catd, 1,
642 sprintf(buf, "%s", catgets(calendar->DT_catd, 1, 247,
643 "This appointment has an end time earlier than\nits begin time. Do you want to\nschedule it into the next day?"));
644 *flagsP = dialog_popup(dssw->parent,
647 BUTTON_IDENT, -1, ident1,
648 BUTTON_IDENT, DSSW_NEXT_DAY, ident2,
649 DIALOG_IMAGE, pu->xm_question_pixmap,
666 a->end_time->value->item.date_time_value = (char *) malloc(BUFSIZ);
667 _csa_tick_to_iso8601(stop_tick, a->end_time->value->item.date_time_value);
668 } else if (blank_buf(dssw->start_val.val)) {
669 a->end_time->value->item.date_time_value = (char *) malloc(BUFSIZ);
670 _csa_tick_to_iso8601(start_tick + minsec, a->end_time->value->item.date_time_value);
671 a->show_time->value->item.sint32_value = False;
673 free(a->end_time->value);
674 a->end_time->value = NULL;
680 ** This function will consume form values and stuff them into an appointment.
683 dssw_form_to_todo(DSSW *dssw, Dtcm_appointment *a, char *name, Tick t)
685 time_t start_tick, stop_tick;
686 char ampm_buf[BUFSIZ], buf[BUFSIZ];
687 Props *p = (Props *)dssw->cal->properties;
688 Props_pu *pu = (Props_pu *)dssw->cal->properties_pu;
689 DisplayType dt = get_int_prop(p, CP_DEFAULTDISP);
691 get_dssw_vals(dssw, t);
693 * Todo does not have end time. So to distinguish between this
694 * and the editor, zero this out.
696 dssw->stop_val.val[0] = '\0';
697 if (blank_buf(dssw->date_val)) {
698 editor_err_msg(dssw->parent, name, MISSING_DATE,
699 pu->xm_error_pixmap);
703 if (!blank_buf(dssw->start_val.val)) {
704 if (!valid_time(p, dssw->start_val.val)) {
705 editor_err_msg(dssw->parent, name, INVALID_TIME,
706 pu->xm_error_pixmap);
711 if (dssw->start_val.block == TIME_AM)
712 sprintf(ampm_buf, "am");
714 sprintf(ampm_buf, "pm");
718 sprintf(buf, "%s %s%s",
719 dssw->date_val, dssw->start_val.val, ampm_buf);
722 * No check here for stop time.
725 editor_err_msg(dssw->parent, name, MISSING_TIME,
726 pu->xm_error_pixmap);
730 start_tick = cm_getdate(buf, NULL);
732 editor_err_msg(dssw->parent, name, INVALID_DATE,
733 pu->xm_error_pixmap);
737 a->time->value->item.date_time_value = (char *) malloc(BUFSIZ);
738 _csa_tick_to_iso8601(start_tick, a->time->value->item.date_time_value);
739 a->what->value->item.string_value = (char *)cm_strdup(dssw->what_val);
740 a->show_time->value->item.sint32_value = True;
742 free(a->end_time->value);
743 a->end_time->value = NULL;
749 ** The next two functions will take appointment values and stuff them into
753 dssw_appt_to_form(DSSW *dssw, CSA_entry_handle entry) {
755 CSA_return_code stat;
756 Dtcm_appointment *appt;
758 appt = allocate_appt_struct(appt_read,
759 dssw->cal->general->version,
760 CSA_ENTRY_ATTR_START_DATE_I,
761 CSA_ENTRY_ATTR_SUMMARY_I,
762 CSA_ENTRY_ATTR_END_DATE_I,
763 CSA_X_DT_ENTRY_ATTR_SHOWTIME_I,
765 stat = query_appt_struct(dssw->cal->cal_handle, entry, appt);
766 backend_err_msg(dssw->cal->frame, dssw->cal->view->current_calendar,
767 stat, ((Props_pu *)dssw->cal->properties_pu)->xm_error_pixmap);
768 if (stat != CSA_SUCCESS) {
769 free_appt_struct(&appt);
773 ret_val = dssw_attrs_to_form(dssw, appt);
774 free_appt_struct(&appt);
780 dssw_attrs_to_form(DSSW *dssw, Dtcm_appointment *appt) {
781 int start_hr, stop_hr;
783 time_t tick, end_tick = 0;
785 Props *p = (Props *)dssw->cal->properties;
786 DisplayType dt = get_int_prop(p, CP_DEFAULTDISP);
788 _csa_iso8601_to_tick(appt->time->value->item.date_time_value, &tick);
789 showtime = showtime_set(appt);
791 _csa_iso8601_to_tick(appt->end_time->value->item.\
792 date_time_value, &end_tick);
793 what = appt->what->value->item.string_value;
796 ** Set the date, start, stop, and what fields
798 if (!showtime || magic_time(tick)) {
799 dssw->start_val.val[0] = '\0';
800 dssw->stop_val.val[0] = '\0';
802 if ((start_hr = hour(tick)) < 12)
803 dssw->start_val.block = TIME_AM;
805 dssw->start_val.block = TIME_PM;
810 else if (start_hr > 12)
812 sprintf(dssw->start_val.val, "%2d:%02d", start_hr,
815 sprintf(dssw->start_val.val, "%02d%02d", start_hr,
819 if ((stop_hr = hour(end_tick)) < 12)
820 dssw->stop_val.block = TIME_AM;
822 dssw->stop_val.block = TIME_PM;
827 else if (stop_hr > 12)
829 sprintf(dssw->stop_val.val, "%2d:%02d", stop_hr,
832 sprintf(dssw->stop_val.val, "%02d%02d", stop_hr,
836 dssw->stop_val.val[0] = '\0';
837 dssw->stop_val.block = TIME_AM;
841 /* limit the size of the text pulled out of the appointment. */
844 strncpy(dssw->what_val, what, WHAT_LEN - 1);
845 dssw->what_val[WHAT_LEN-1] = '\0';
848 set_dssw_vals(dssw, tick);
854 get_dssw_times(DSSW *dssw) {
857 str = XmTextGetString(dssw->start_text);
858 strcpy(dssw->start_val.val, str);
860 dssw->start_val.block =
861 XmToggleButtonGetState(dssw->start_am) ? TIME_AM : TIME_PM;
863 str = XmTextGetString(dssw->stop_text);
864 strcpy(dssw->stop_val.val, str);
866 dssw->stop_val.block =
867 XmToggleButtonGetState(dssw->stop_am) ? TIME_AM : TIME_PM;
871 get_dssw_vals(DSSW *dssw, Tick t) {
872 dssw_get_non_times(dssw, t);
873 get_dssw_times(dssw);
877 set_dssw_times(DSSW *dssw) {
879 Props *p = (Props *)dssw->cal->properties;
880 DisplayType dt = get_int_prop(p, CP_DEFAULTDISP);
882 XtVaSetValues(dssw->start_text, XmNvalue, dssw->start_val.val,
884 XtVaSetValues(dssw->stop_text, XmNvalue, dssw->stop_val.val,
887 xmstr = XmStringCreateLocalized(dssw->start_val.val);
888 XtVaSetValues(XmOptionButtonGadget(dssw->start_menu),
889 XmNlabelString, xmstr,
892 xmstr = XmStringCreateLocalized(dssw->stop_val.val);
893 XtVaSetValues(XmOptionButtonGadget(dssw->stop_menu),
894 XmNlabelString, xmstr,
899 if (dssw->start_val.block == TIME_AM)
900 XmToggleButtonSetState(dssw->start_am, True, True);
902 XmToggleButtonSetState(dssw->start_pm, True, True);
903 if (dssw->stop_val.block == TIME_AM)
904 XmToggleButtonSetState(dssw->stop_am, True, True);
906 XmToggleButtonSetState(dssw->stop_pm, True, True);
911 load_dssw_times(DSSW *dssw, Tick start, Tick stop, Boolean set_no_time) {
913 Props *p = (Props *)dssw->cal->properties;
917 * If start and stop times were specified, do the right thing to the
920 dt = get_int_prop(p, CP_DEFAULTDISP);
922 if (set_no_time == True){
923 strcpy(dssw->start_val.val, " ");
924 strcpy(dssw->stop_val.val, " ");
929 format_time(start, dt, buf);
931 strncpy(dssw->start_val.val, buf, 5);
932 dssw->start_val.val[5] = '\0';
933 dssw->start_val.block = (buf[5] == 'a') ?
936 strcpy(dssw->start_val.val, buf);
937 dssw->start_val.block = TIME_AM;
941 format_time(stop, dt, buf);
943 strncpy(dssw->stop_val.val, buf, 5);
944 dssw->stop_val.val[5] = '\0';
945 dssw->stop_val.block = (buf[5] == 'a') ?
948 snprinf(dssw->stop_val.val, START_STOP_LEN, "%s", buf);
949 dssw->stop_val.block = TIME_AM;
955 set_dssw_vals(DSSW *dssw, Tick t) {
956 dssw_set_non_times(dssw, t);
957 set_dssw_times(dssw);
961 set_dssw_defaults(DSSW *dssw, Tick t, Boolean set_times) {
962 int appt_beg, appt_end, beg_hr, end_hr;
963 Props *p = (Props *)dssw->cal->properties;
965 Time_scope_menu_op dur_scope;
968 dt = get_int_prop(p, CP_DEFAULTDISP);
969 appt_beg = get_int_prop(p, CP_APPTBEGIN);
970 beg_hr = appt_beg / minsec;
971 appt_end = get_int_prop(p, CP_APPTDURATION) + appt_beg;
972 end_hr = appt_end / minsec;
973 end_hr = end_hr % 24;
976 dssw->start_val.block = (adjust_hour(&beg_hr)) ?
978 dssw->stop_val.block = (adjust_hour(&end_hr)) ?
980 sprintf(dssw->start_val.val, "%2d:%02d",
981 beg_hr, appt_beg % minsec);
982 sprintf(dssw->stop_val.val, "%2d:%02d",
983 end_hr, appt_end % minsec);
985 sprintf(dssw->start_val.val, "%02d%02d",
986 beg_hr, appt_beg % minsec);
987 sprintf(dssw->stop_val.val, "%02d%02d",
988 end_hr, appt_end % minsec);
989 dssw->start_val.block = dssw->stop_val.block = TIME_AM;
992 dssw->what_val[0] = '\0';
994 set_dssw_vals(dssw, t);