dtcm: Resolve all -Wformat-security warnings.
[oweals/cde.git] / cde / programs / dtcm / dtcm / find.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
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)
10  * any later version.
11  *
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
16  * details.
17  *
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
22  */
23 /* $XConsortium: find.c /main/9 1996/11/21 19:42:36 drk $ */
24 /*
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.
29  */
30
31 #include <EUSCompat.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <csa.h>
35 #include <Xm/Xm.h>
36 #include <Xm/Form.h>
37 #include <Xm/LabelG.h>
38 #include <Xm/Label.h>
39 #include <Xm/List.h>
40 #include <Xm/DialogS.h>
41 #include <Xm/PushB.h>
42 #include <Xm/PushBG.h>
43 #include <Xm/RowColumn.h>
44 #include <Xm/Scale.h>
45 #include <Xm/SeparatoG.h>
46 #include <Xm/Text.h>
47 #include <Xm/ToggleBG.h>
48 #include <Dt/HourGlass.h>
49 #include "calendar.h"
50 #include "util.h"
51 #include "timeops.h"
52 #include "find.h"
53 #include "format.h"
54 #include "datefield.h"
55 #include "props.h"
56 #include "editor.h"
57 #include "select.h"
58 #include "help.h"
59 #include "getdate.h"
60
61 #define XOS_USE_XT_LOCKING
62 #define X_INCLUDE_TIME_H
63 #if defined(linux)
64 #undef SVR4
65 #endif
66 #include <X11/Xos_r.h>
67
68 static void layout_labels(Widget, Widget, Widget, Widget);
69
70 extern caddr_t
71 make_find(c)
72 Calendar *c;
73 {
74         Find            *f;
75         Widget           separator1, separator2, button_form;
76         XmString         xmstr;
77         OrderingType     ot = get_int_prop((Props *)c->properties,
78                                                         CP_DATEORDERING);
79         SeparatorType    sep = get_int_prop((Props *)c->properties, 
80                                                         CP_DATESEPARATOR);
81         Tick             cursor, begin_range, end_range;
82         char             buffer[50];
83         int              i;
84         void             find_appts(), show_appt(), f_cancel_cb(), 
85                          f_searchrange_cb(), f_searchall_cb();
86         Arg              args[3];
87         Dimension        highest;
88         Widget           highest_label;
89         char             *title;
90
91         if (c->find == NULL) {
92                 c->find = (caddr_t)ckalloc(sizeof(Find));
93                 f = (Find*)c->find;
94         }
95         else
96                 f = (Find*)c->find;
97
98         title = XtNewString(catgets(c->DT_catd, 1, 283, "Calendar : Find"));
99         f->frame = XtVaCreatePopupShell("frame",
100                 xmDialogShellWidgetClass, 
101                 c->frame,
102                 XmNtitle,               title,
103                 XmNallowShellResize,    True,
104                 XmNmappedWhenManaged,   False,
105                 NULL);
106         XtFree(title);
107
108         f->form = XtVaCreateWidget("form",
109                 xmFormWidgetClass, 
110                 f->frame,
111                 XmNautoUnmanage,        False,
112                 XmNfractionBase,        4,
113                 XmNmarginWidth,         0,
114                 XmNmarginHeight,        0,
115                 NULL);
116
117         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 284, "Find:"));
118         f->apptstr_label = XtVaCreateWidget("label", 
119                 xmLabelWidgetClass, 
120                 f->form,
121                 XmNlabelString,         xmstr,
122                 XmNleftAttachment,      XmATTACH_FORM,
123                 XmNleftOffset,          10,
124                 XmNtopAttachment,       XmATTACH_FORM,
125                 XmNtopOffset,           15,
126                 NULL);
127         XmStringFree(xmstr);
128
129         f->apptstr = XtVaCreateWidget("appt", 
130                 xmTextWidgetClass, 
131                 f->form,
132                 XmNtopAttachment,       XmATTACH_FORM,
133                 XmNtopOffset,           10,
134                 XmNrightAttachment,     XmATTACH_FORM,
135                 XmNrightOffset,         10,
136                 XmNleftAttachment,      XmATTACH_WIDGET,
137                 XmNleftWidget,          f->apptstr_label,
138                 NULL);
139
140         f->search_rc_mgr = XtVaCreateWidget("search_rc_mgr",
141                 xmRowColumnWidgetClass, 
142                 f->form,
143                 XmNpacking,             XmPACK_COLUMN,
144                 XmNorientation,         XmVERTICAL,
145                 XmNradioBehavior,       True,
146                 XmNisHomogeneous,       True,
147                 XmNentryClass,          xmToggleButtonGadgetClass,
148                 XmNmarginWidth,         0,
149                 XmNtopAttachment,       XmATTACH_WIDGET,
150                 XmNtopWidget,           f->apptstr,
151                 XmNleftAttachment,      XmATTACH_OPPOSITE_WIDGET,
152                 XmNleftWidget,          f->apptstr,
153                 XmNleftOffset,          0,
154                 NULL);
155  
156         xmstr = XmStringCreateLocalized(
157                                 catgets(c->DT_catd, 1, 973, "Search all"));
158         f->search_all = XtVaCreateWidget("searchAll",
159                 xmToggleButtonGadgetClass, 
160                 f->search_rc_mgr,
161                 XmNlabelString,         xmstr,
162                 XmNuserData,            f,
163                 NULL);
164         XmStringFree(xmstr);
165         XtAddCallback(f->search_all, XmNvalueChangedCallback, f_searchall_cb, 
166                                                                         NULL);
167  
168         xmstr = XmStringCreateLocalized(
169                                 catgets(c->DT_catd, 1, 974, "Search from"));
170         f->search_range = XtVaCreateWidget("searchrange",
171                 xmToggleButtonGadgetClass, 
172                 f->search_rc_mgr,
173                 XmNlabelString,         xmstr,
174                 XmNuserData,            f,
175                 XmNset,                 True,
176                 NULL);
177         XmStringFree(xmstr);
178         XtAddCallback(f->search_range, XmNvalueChangedCallback, 
179                                                         f_searchrange_cb, NULL);
180
181         f->search_set = search_range;
182  
183         /* default beginning of range query to 6 months ago */
184
185         cursor = now();
186         for (i = 0; i < 6; i++)
187                 cursor = prevmonth_exactday(cursor);
188
189         format_tick(cursor, ot, sep, buffer);
190
191         f->search_from = XtVaCreateWidget("search_from", 
192                 xmTextWidgetClass, 
193                 f->form,
194                 XmNleftAttachment,      XmATTACH_WIDGET,
195                 XmNleftWidget,          f->search_rc_mgr,
196                 XmNtopAttachment,       XmATTACH_WIDGET,
197                 XmNtopWidget,           f->apptstr,
198                 XmNtopOffset,           30, 
199                 XmNuserData,            c,
200                 XmNvalue,               buffer,
201                 NULL);
202         XtSetSensitive(f->search_from, True);
203
204
205         /* default end of range query to 6 from now */
206
207         cursor = now();
208         for (i = 0; i < 6; i++)
209                 cursor = nextmonth_exactday(cursor);
210
211         format_tick(cursor, ot, sep, buffer);
212
213         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 975, "to"));
214         f->search_tolabel = XtVaCreateWidget("tolabel", 
215                 xmLabelWidgetClass, 
216                 f->form,
217                 XmNlabelString,         xmstr,
218                 XmNleftAttachment,      XmATTACH_WIDGET,
219                 XmNleftWidget,          f->search_from,
220                 XmNtopAttachment,       XmATTACH_WIDGET,
221                 XmNtopWidget,           f->apptstr,
222                 XmNtopOffset,           35, 
223                 NULL);
224         XmStringFree(xmstr);
225
226         f->search_to = XtVaCreateWidget("search_to", 
227                 xmTextWidgetClass, 
228                 f->form,
229                 XmNleftAttachment,      XmATTACH_WIDGET,
230                 XmNleftWidget,          f->search_tolabel,
231                 XmNtopAttachment,       XmATTACH_WIDGET,
232                 XmNtopWidget,           f->apptstr,
233                 XmNtopOffset,           30, 
234                 XmNrightOffset,         10, 
235                 XmNuserData,            c,
236                 XmNvalue,               buffer,
237                 NULL);
238         XtSetSensitive(f->search_to, True);
239
240         separator1 = XtVaCreateWidget("separator1",
241                 xmSeparatorGadgetClass, 
242                 f->form,
243                 XmNleftAttachment,      XmATTACH_FORM,
244                 XmNrightAttachment,     XmATTACH_FORM,
245                 XmNtopAttachment,       XmATTACH_WIDGET,
246                 XmNtopWidget,           f->search_rc_mgr,
247                 XmNtopOffset,           5,
248                 NULL);
249  
250         xmstr = XmStringCreateLocalized(
251                 catgets(c->DT_catd, 1, 848, "Date"));
252         f->date_label = XtVaCreateWidget("finddatelabel", 
253                 xmLabelWidgetClass, 
254                 f->form,
255                 XmNlabelString,         xmstr,
256                 XmNtopAttachment,       XmATTACH_WIDGET,
257                 XmNtopWidget,           separator1,
258                 XmNtopOffset,           10,
259                 XmNleftAttachment,      XmATTACH_FORM,
260                 XmNleftOffset,          10,
261                 NULL);
262         XmStringFree(xmstr);
263         xmstr = XmStringCreateLocalized(
264                 catgets(c->DT_catd, 1, 849, "Time"));
265         f->time_label = XtVaCreateWidget("findtimelabel", 
266                 xmLabelWidgetClass, 
267                 f->form,
268                 XmNlabelString,         xmstr,
269                 XmNtopAttachment,       XmATTACH_WIDGET,
270                 XmNtopWidget,           separator1,
271                 XmNtopOffset,           10,
272                 XmNleftAttachment,      XmATTACH_WIDGET,
273                 XmNleftWidget,          f->date_label,
274                 NULL);
275         XmStringFree(xmstr);
276         xmstr = XmStringCreateLocalized(
277                 catgets(c->DT_catd, 1, 850, "What"));
278         f->what_label = XtVaCreateWidget("findwhatlabel", 
279                 xmLabelWidgetClass, 
280                 f->form,
281                 XmNlabelString,         xmstr,
282                 XmNtopAttachment,       XmATTACH_WIDGET,
283                 XmNtopWidget,           separator1,
284                 XmNtopOffset,           10,
285                 XmNleftAttachment,      XmATTACH_WIDGET,
286                 XmNleftWidget,          f->time_label,
287                 NULL);
288         XmStringFree(xmstr);
289
290         f->find_message = XtVaCreateWidget("message",
291                 xmLabelGadgetClass,     f->form,
292                 XmNalignment,           XmALIGNMENT_BEGINNING,
293                 XmNleftAttachment,      XmATTACH_FORM,
294                 XmNleftOffset,          10,
295                 XmNrightAttachment,     XmATTACH_FORM,
296                 XmNbottomAttachment,    XmATTACH_FORM,
297                 NULL);
298
299         button_form = XtVaCreateWidget("print_button_form_mgr",
300                 xmFormWidgetClass,
301                 f->form,
302                 XmNautoUnmanage,        False,
303                 XmNfractionBase,        5,
304                 XmNhorizontalSpacing,   0,
305                 XmNleftAttachment,      XmATTACH_FORM,
306                 XmNleftOffset,          5,
307                 XmNrightAttachment,     XmATTACH_FORM,
308                 XmNrightOffset,         5,
309                 XmNbottomAttachment,    XmATTACH_WIDGET,
310                 XmNbottomWidget,        f->find_message,
311                 XmNbottomOffset,        5,
312                 NULL);
313
314         separator2 = XtVaCreateWidget("separator1",
315                 xmSeparatorGadgetClass, 
316                 f->form,
317                 XmNleftAttachment,      XmATTACH_FORM,
318                 XmNrightAttachment,     XmATTACH_FORM,
319                 XmNbottomAttachment,    XmATTACH_WIDGET,
320                 XmNbottomWidget,        button_form,
321                 XmNbottomOffset,        5,
322                 NULL);
323
324         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 285, "Find"));
325         f->find_button = XtVaCreateWidget("findbutton", 
326                 xmPushButtonGadgetClass, 
327                 button_form,
328                 XmNlabelString,         xmstr,
329                 XmNleftAttachment,      XmATTACH_POSITION,
330                 XmNleftPosition,        0,
331                 XmNleftOffset,          0,
332                 XmNrightAttachment,     XmATTACH_POSITION,
333                 XmNrightPosition,       1,
334                 XmNrightOffset,         0,
335                 XmNbottomAttachment,    XmATTACH_FORM,
336                 XmNshowAsDefault,       0,
337                 NULL);
338         XtAddCallback(f->find_button, XmNactivateCallback, find_appts, NULL);
339         XmStringFree(xmstr);
340                 
341         xmstr = XmStringCreateLocalized(
342                                 catgets(c->DT_catd, 1, 851, "Show Appointment"));
343         f->show_button = XtVaCreateWidget("show", 
344                 xmPushButtonGadgetClass, 
345                 button_form,
346                 XmNlabelString,         xmstr,
347                 XmNleftAttachment,      XmATTACH_POSITION,
348                 XmNleftPosition,        1,
349                 XmNleftOffset,          0,
350                 XmNrightAttachment,     XmATTACH_POSITION,
351                 XmNrightPosition,       3,
352                 XmNrightOffset,         0,
353                 XmNbottomAttachment,    XmATTACH_FORM,
354                 NULL);
355         XmStringFree(xmstr);
356
357         XtAddCallback(f->show_button, XmNactivateCallback, show_appt, NULL);
358
359         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 680, "Close"));
360         f->cancel_button = XtVaCreateWidget("cancel", 
361                 xmPushButtonGadgetClass, 
362                 button_form,
363                 XmNlabelString,         xmstr,
364                 XmNleftAttachment,      XmATTACH_POSITION,
365                 XmNleftPosition,        3,
366                 XmNleftOffset,          0,
367                 XmNrightAttachment,     XmATTACH_POSITION,
368                 XmNrightPosition,       4,
369                 XmNrightOffset,         0,
370                 XmNbottomAttachment,    XmATTACH_FORM,
371                 NULL);
372         XmStringFree(xmstr);
373
374         XtAddCallback(f->cancel_button, XmNactivateCallback, f_cancel_cb, NULL);
375
376         xmstr = XmStringCreateLocalized(catgets(c->DT_catd, 1, 77, "Help"));
377         f->help_button = XtVaCreateWidget("help", 
378                 xmPushButtonGadgetClass, 
379                 button_form,
380                 XmNlabelString,         xmstr,
381                 XmNleftAttachment,      XmATTACH_POSITION,
382                 XmNleftPosition,        4,
383                 XmNleftOffset,          0,
384                 XmNrightAttachment,     XmATTACH_POSITION,
385                 XmNrightPosition,       5,
386                 XmNrightOffset,         0,
387                 XmNbottomAttachment,    XmATTACH_FORM,
388                 NULL);
389         XtAddCallback(f->help_button, XmNactivateCallback, 
390                 (XtCallbackProc)help_cb, FIND_HELP_BUTTON);
391         XtAddCallback(f->form, XmNhelpCallback, 
392                 (XtCallbackProc)help_cb, (XtPointer) FIND_HELP_BUTTON);
393         XmStringFree(xmstr);
394
395         XtSetArg(args[0], XmNlistSizePolicy, XmCONSTANT);
396         XtSetArg(args[1], XmNvisibleItemCount, 5);
397         XtSetArg(args[2], XmNscrollBarDisplayPolicy, XmSTATIC);
398
399         f->find_list = (Widget)XmCreateScrolledList(f->form,
400                 "find_list", args, 3);
401         f->find_list_sw = XtParent(f->find_list);
402
403         _i18n_HighestWidget(3,&highest_label, &highest,
404                 f->date_label, f->time_label, f->what_label);
405
406         XtVaSetValues(f->find_list_sw,
407                 XmNtopAttachment,       XmATTACH_WIDGET,
408                 XmNtopWidget,           highest_label,
409                 XmNleftAttachment,      XmATTACH_FORM,
410                 XmNleftOffset,          10,
411                 XmNrightAttachment,     XmATTACH_FORM,
412                 XmNrightOffset,         10,
413                 XmNbottomAttachment,    XmATTACH_WIDGET,
414                 XmNbottomWidget,        separator2,
415                 XmNbottomOffset,        10,
416                 XmNlistSizePolicy,      XmCONSTANT,
417                 NULL);
418
419         XtManageChild(f->find_list);
420
421         XtAddCallback(f->find_list, XmNdefaultActionCallback, show_appt, NULL);
422
423         layout_labels(f->date_label, f->time_label, 
424                       f->what_label, f->find_list);
425
426         /* set default button */
427         XtVaSetValues(button_form,
428                 XmNdefaultButton,       f->find_button,
429                 XmNcancelButton,        f->cancel_button,
430                 NULL);
431         XtVaSetValues(f->form,
432                 XmNdefaultButton,       f->find_button,
433                 XmNcancelButton,        f->cancel_button,
434                 NULL);
435
436 /*
437         XtManageChild(f->apptstr_label);
438         XtManageChild(f->apptstr);
439         XtManageChild(f->search_rc_mgr);
440         XtManageChild(f->search_all);
441         XtManageChild(f->search_range);
442         XtManageChild(f->search_from);
443         XtManageChild(f->search_to);
444         XtManageChild(f->search_tolabel);
445         XtManageChild(separator1);
446         XtManageChild(f->date_label);
447         XtManageChild(f->time_label);
448         XtManageChild(f->what_label);
449         XtManageChild(f->find_message);
450         XtManageChild(button_form);
451         XtManageChild(separator2);
452         XtManageChild(f->find_list);
453         XtManageChild(f->find_button);
454         XtManageChild(f->show_button);
455         XtManageChild(f->cancel_button);
456         XtManageChild(f->help_button);
457 */
458         ManageChildren(f->search_rc_mgr);
459         ManageChildren(button_form);
460         ManageChildren(f->form);
461         XtManageChild(f->form);
462         XtVaSetValues(f->frame, XmNmappedWhenManaged, True, NULL);
463         XtRealizeWidget(f->frame);
464
465         XtPopup(f->frame, XtGrabNone);
466
467         return(caddr_t)f;
468 }
469
470 static Tick
471 f_get_searchdate(Widget widget, Props *p)
472 {
473         Calendar *c = calendar;
474         OrderingType ot;
475         SeparatorType st;
476         char *buf;
477         Tick new_date;
478
479         ot = get_int_prop(p, CP_DATEORDERING);
480         st = get_int_prop(p, CP_DATESEPARATOR);
481         buf = get_date_from_widget(c->view->date, widget, ot, st);
482
483         new_date = (Tick) cm_getdate(buf, NULL);
484
485         return(new_date);
486 }
487
488 void
489 f_searchall_cb(Widget widget, XtPointer client_data, XtPointer call_data)
490 {
491         Find *f;
492         XmToggleButtonCallbackStruct *state =
493                 (XmToggleButtonCallbackStruct *) call_data;
494
495         XtVaGetValues(widget, XmNuserData, &f, NULL);
496
497         if (state->set)
498                 f->search_set = search_all;
499         XtSetSensitive(f->search_to, False);
500         XtSetSensitive(f->search_from, False);
501 }
502
503 void
504 f_searchrange_cb(Widget widget, XtPointer client_data, XtPointer call_data)
505 {
506         Find *f;
507         XmToggleButtonCallbackStruct *state =
508                 (XmToggleButtonCallbackStruct *) call_data;
509
510         XtVaGetValues(widget, XmNuserData, &f, NULL);
511
512         if (state->set)
513                 f->search_set = search_range;
514         XtSetSensitive(f->search_to, True);
515         XtSetSensitive(f->search_from, True);
516 }
517
518 static void
519 fmt_time_what(
520         Dtcm_appointment        *appt,
521         char                    *buf,
522         DisplayType              display)
523 {
524         int                      hr, mn;
525         time_t                   tick;
526         Lines                   *lines;
527         Boolean                  am;
528         struct tm               *tm;
529         char                     tmp[16];
530         _Xltimeparams            localtime_buf;
531  
532         if(!appt || !buf) return;
533         _csa_iso8601_to_tick(appt->time->value->item.string_value, &tick);
534         tm = _XLocaltime(&tick, localtime_buf);
535         hr = tm->tm_hour;
536         mn = tm->tm_min;
537         if (showtime_set(appt) && !magic_time(tick)) {
538                 if (display == HOUR12) {
539                         am = adjust_hour(&hr);
540                         sprintf(tmp, "%2d:%02d%s  ", hr, mn, am ? "a" : "p");
541                 }
542                 else
543                         sprintf(tmp, "%02d%02d    ", hr, mn);
544
545                 sprintf(buf, "%8s", tmp);
546         } else
547                 sprintf(buf, "%8s", "");
548
549         lines = text_to_lines(appt->what->value->item.string_value, 1);
550         if (lines != NULL && lines->s != NULL) {
551                 (void) cm_strcat(buf, lines->s);
552                 destroy_lines(lines);
553         }
554 }
555
556 void
557 find_appts(widget, client_data, cbs)
558 Widget widget;
559 XtPointer client_data;
560 XmPushButtonCallbackStruct *cbs;
561 {
562         Calendar *c = calendar;
563         Props *p = (Props*)c->properties;
564         OrderingType ot = get_int_prop(p, CP_DATEORDERING);
565         DisplayType dt = get_int_prop(p, CP_DEFAULTDISP);
566         SeparatorType sep = get_int_prop(p, CP_DATESEPARATOR);
567         Find *f = (Find*)c->find;
568         int mos, i, j, range_count;
569         char *location;
570         Dimension w, h;
571         char what_buf[WHAT_LEN+1], buf[WHAT_LEN+1], buf2[WHAT_LEN+1], message[40], *astr;
572         XmString buf_str;
573         int num_items, mo, last_match_total = 0, match_total = 0;
574         pr_pos xy;
575         Tick end_of_time, start, stop;
576         Tick_list *ptr, *next_ptr, *tail_ptr, *new_tick;
577         CSA_session_handle cal = NULL;
578         CSA_return_code stat;
579         CSA_entry_handle *entries = NULL;
580         CSA_enum *ops;
581         CSA_attribute *range_attrs;
582         CSA_uint32 num_entries;
583         Dtcm_appointment *appt;
584         int comparison_length;
585         Tick    real_eot = get_eot();
586         _Xltimeparams localtime_buf;
587
588         astr = XmTextGetString(f->apptstr);
589
590         if (astr == NULL || *astr == NULL) {
591                 sprintf(message, "%s", catgets(c->DT_catd, 1, 290, "Specify Appt String to Match."));
592                 set_message(f->find_message, message);
593                 return;
594         }
595         XmListDeleteAllItems(f->find_list);
596         set_message(f->find_message, " ");
597         ptr = f->ticks;
598         while (ptr != NULL) {
599                 next_ptr = ptr->next;
600                 free(ptr);
601                 ptr = next_ptr;
602         }
603         f->ticks = NULL;
604
605         if (f->search_set == search_all) {
606                 end_of_time = real_eot;
607                 start = get_bot();
608         }
609         else {
610
611                 start = f_get_searchdate(f->search_from, p);
612
613                 if (start == DATE_BBOT)
614                         start = get_bot();
615                 else if (start == DATE_AEOT) {
616                         sprintf(message, "%s", catgets(c->DT_catd, 1, 810, "Please enter a start date after 1/1/1970"));
617                         set_message(f->find_message, message);
618                         return;
619                 }
620                 else if (start <= 0) {
621                         sprintf(message, "%s", catgets(c->DT_catd, 1, 811, "Malformed start date"));
622                         set_message(f->find_message, message);
623                         return;
624                 }
625
626
627                 end_of_time = f_get_searchdate(f->search_to, p);
628
629                 if (end_of_time == DATE_AEOT)
630                         end_of_time = real_eot;
631                 else if (end_of_time == DATE_BBOT) {
632                         sprintf(message, "%s", catgets(c->DT_catd, 1, 812, "Please enter an end date before 1/1/2038"));
633                         set_message(f->find_message, message);
634                         return;
635                 }
636                 else if (end_of_time <= 0) {
637                         sprintf(message, "%s", catgets(c->DT_catd, 1, 813, "Malformed end date"));
638                         set_message(f->find_message, message);
639                         return;
640                 }
641
642                 if (start >= end_of_time) {
643                         sprintf(message, "%s", catgets(c->DT_catd, 1, 713, "You must choose a begin date before the end date."));
644                         set_message(f->find_message, message);
645                         return;
646                 }
647                 
648                 if ((end_of_time < 0) || (end_of_time > real_eot))
649                         end_of_time = real_eot;
650         }
651
652         stop = start + (4 * wksec);
653
654         if (stop > end_of_time)
655                 stop = end_of_time;
656
657         comparison_length = cm_strlen(astr);
658
659         appt = allocate_appt_struct(appt_read,
660                                     c->general->version,
661                                     CSA_ENTRY_ATTR_START_DATE_I,
662                                     CSA_ENTRY_ATTR_SUMMARY_I,
663                                     CSA_X_DT_ENTRY_ATTR_SHOWTIME_I,
664                                     NULL);
665
666         _DtTurnOnHourGlass(f->frame);
667         for (; stop <= end_of_time;) {
668                 setup_range(&range_attrs, &ops, &range_count, start, stop,
669                             CSA_TYPE_EVENT, NULL, B_FALSE, c->general->version);
670                 stat = csa_list_entries(c->cal_handle, range_count, range_attrs, ops, &num_entries, &entries, NULL);
671
672                 if (stat != CSA_SUCCESS) {
673                         free_range(&range_attrs, &ops, range_count);
674                         _DtTurnOffHourGlass(f->frame);
675                         return;
676                 }
677
678                 for (i = 0; i < num_entries; i++) {
679                         stat = query_appt_struct(c->cal_handle, entries[i], appt);
680                         if (stat != CSA_SUCCESS) {
681                                 free_appt_struct(&appt);
682                                 csa_free(entries);
683                                 _DtTurnOffHourGlass(f->frame);
684                                 return;
685                         }
686
687                         for (j = 0; appt->what->value->item.string_value[j] != NULL; j++)
688                                 if (strncasecmp(astr, &(appt->what->value->item.string_value[j]),
689                                         comparison_length) == 0) {
690                                         new_tick = (Tick_list *) ckalloc(sizeof(Tick_list));
691                                         if (new_tick == NULL) {
692                                                 free_appt_struct(&appt);
693                                                 free_range(&range_attrs, &ops, range_count);
694                                                 csa_free(entries);
695                                                 _DtTurnOffHourGlass(f->frame);
696                                                 return;
697                                         }
698                                         new_tick->next = NULL;
699                                         _csa_iso8601_to_tick(appt->time->value->item.date_time_value, &(new_tick->tick));
700                                         if (f->ticks == NULL)
701                                                 f->ticks = new_tick;
702                                         else
703                                                 tail_ptr->next = new_tick;
704                                         tail_ptr = new_tick;
705                                         match_total++;
706                                         strcpy(buf, "");
707                                         strcpy(buf2, "");
708                                         strcpy(what_buf, "");
709                                         strftime(buf, WHAT_LEN, "%h %e, %Y", 
710                                             _XLocaltime(
711                                               (const time_t *)&new_tick->tick,
712                                               localtime_buf));
713                                         fmt_time_what(appt, what_buf, dt);
714                                         sprintf (buf2, "%10s  %s", 
715                                                                 buf, what_buf);
716                                         buf_str = XmStringCreateLocalized(buf2);
717                                         XmListAddItem(f->find_list, buf_str, 0);
718                                         XmStringFree(buf_str);
719
720                                         break;
721                                 }  /* end if stmt */
722                 }  /* end for i = 0 loop */
723
724                 if (match_total != last_match_total) {
725                         if (match_total == 1)
726                                 sprintf(message, catgets(c->DT_catd, 1, 631, "%d match found"), match_total);
727                         else if (match_total > 1)
728                                 sprintf(message, catgets(c->DT_catd, 1, 292, "%d matches found"), match_total);
729
730                         set_message(f->find_message, message);
731                 }
732
733                 last_match_total = match_total;
734
735
736                 csa_free(entries);
737                 free_range(&range_attrs, &ops, range_count);
738
739                 if (stop == real_eot)
740                         break;
741
742                 start = stop + 1;
743         
744                 if (start > end_of_time)
745                         break;
746
747                 stop = start + (4 * wksec);
748                 if ((stop > end_of_time) || (stop < 0))
749                         stop = end_of_time;
750                 
751
752         }  /* end for range.end loop */
753
754         if (match_total == 0)
755                 sprintf(message, "%s", catgets(c->DT_catd, 1, 291, "Appointment Not Found."));
756         else if (match_total == 1)
757                 sprintf(message, catgets(c->DT_catd, 1, 631, "%d match found"), match_total);
758         else
759                 sprintf(message, catgets(c->DT_catd, 1, 292, "%d matches found"), match_total);
760         set_message(f->find_message, message);
761         free_appt_struct(&appt);
762         _DtTurnOffHourGlass(f->frame);
763
764         XtFree(astr);
765         return;
766 }
767
768 void
769 show_appt(widget, client_data, cbs)
770 Widget widget;
771 XtPointer client_data;
772 XmPushButtonCallbackStruct *cbs;
773 {
774         Calendar *c = calendar;
775
776         Props *p = (Props*)c->properties;
777         Find *f = (Find*)c->find;
778         int *pos_list;
779         int pos_cnt;
780         int i;
781         Dimension w, h;
782         Tick_list *ptr;
783         char buf[BUFSIZ];
784         int list_cnt;
785
786         XtVaGetValues(f->find_list, XmNitemCount, &list_cnt, NULL);
787         if (list_cnt == 0) {
788                 sprintf(buf, "%s", catgets(c->DT_catd, 1, 714, "There are no appointments in the list.  You must find one before showing an appointment."));
789                 set_message(f->find_message, buf);
790                 return;
791         }
792         if (!XmListGetSelectedPos(f->find_list, &pos_list, &pos_cnt)) {
793                 sprintf(buf, "%s", catgets(c->DT_catd, 1, 632, "Please select an appointment from the list to show"));
794                 set_message(f->find_message, buf);
795                 return;
796         }
797         set_message(f->find_message, " ");
798         XtVaGetValues(c->canvas, XmNheight, &h, XmNwidth, &w, NULL);
799         gr_clear_area(c->xcontext, 0, 0, w, h);
800
801         c->view->olddate = c->view->date;
802         for (ptr = (Tick_list*)f->ticks, i = 1; ptr != NULL && i < *pos_list; i++)
803                 ptr = ptr->next;
804
805         c->view->date = ptr->tick;
806         c->view->nwks = numwks(c->view->date);
807         XtFree((XtPointer)pos_list);
808         invalidate_cache(c);
809         paint_canvas(c, NULL, RENDER_UNMAP);
810         calendar_deselect(c);
811         paint_selection(c);
812
813 }
814
815 void
816 f_cancel_cb(
817         Widget  widget,
818         XtPointer client_data,
819         XmPushButtonCallbackStruct *cbs)
820 {
821         Calendar *c = calendar;
822         Find      *f;
823
824         f = (Find *)c->find;
825
826         XmTextSetString(f->apptstr, "");
827         set_message(f->find_message, " ");
828         XmListDeleteAllItems(f->find_list);
829
830         XtPopdown(f->frame);
831
832         return;
833 }
834
835 static void
836 layout_labels(
837         Widget  l1, 
838         Widget  l2,
839         Widget  l3,
840         Widget  list)
841 {
842         int             list_char_width;
843         Dimension       label_width;
844         XmString        xmstr;
845         XmFontList      font_list;
846
847         xmstr = XmStringCreateLocalized(" ");
848
849         XtVaGetValues(list, XmNfontList, &font_list, NULL);
850
851         list_char_width = XmStringWidth(font_list, xmstr);
852
853         XtVaGetValues(l1, XmNwidth, &label_width, NULL);
854
855         /*
856          * The ``Time'' label.
857          */
858         XtVaSetValues(l2,
859                 XmNleftOffset,  (14 * list_char_width) - label_width,
860                 NULL);
861
862         XtVaGetValues(l2, XmNwidth, &label_width, NULL);
863
864         /*
865          * The ``What'' label.
866          */
867         XtVaSetValues(l3,
868                 XmNleftOffset,  (8 * list_char_width) - label_width,
869                 NULL);
870
871         XmStringFree(xmstr);
872 }
873