1 /*----------------------------------------------------------------------------
2 --
3 --  Module:           xtmDbFilter
4 --
5 --  Project:          XDiary
6 --  System:           xtm - X Desktop Calendar
7 --    Subsystem:      <>
8 --    Function block: <>
9 --
10 --  Description:
11 --    Selection window with filter to use for database entries.
12 --
13 --  Filename:         xtmDbFilter.c
14 --
15 --  Authors:          Roger Larsson, Ulrika Bornetun
16 --  Creation date:    1992-01-26
17 --
18 --
19 --  (C) Copyright Ulrika Bornetun, Roger Larsson (1995)
20 --      All rights reserved
21 --
22 --  Permission to use, copy, modify, and distribute this software and its
23 --  documentation for any purpose and without fee is hereby granted,
24 --  provided that the above copyright notice appear in all copies. Ulrika
25 --  Bornetun and Roger Larsson make no representations about the usability
26 --  of this software for any purpose. It is provided "as is" without express
27 --  or implied warranty.
28 ----------------------------------------------------------------------------*/
29 
30 /* SCCS module identifier. */
31 static char SCCSID[] = "@(#) Module: xtmDbFilter.c, Version: 1.1, Date: 95/02/18 15:52:07";
32 
33 
34 /*----------------------------------------------------------------------------
35 --  Include files
36 ----------------------------------------------------------------------------*/
37 
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include <ctype.h>
42 
43 #include <X11/Intrinsic.h>
44 
45 #include <Xm/Xm.h>
46 #include <Xm/RowColumn.h>
47 #include <Xm/SeparatoG.h>
48 #include <Xm/ToggleB.h>
49 #include <Xm/Text.h>
50 
51 #include "System.h"
52 #include "Message.h"
53 
54 #include "msgXdiary.h"
55 #include "xtmGlobal.h"
56 #include "xtmDbMisc.h"
57 #include "xtmFields.h"
58 #include "xtmHelp.h"
59 #include "xitError.h"
60 #include "xitFieldSel.h"
61 #include "xitTools.h"
62 #include "xtmDbFilter.h"
63 
64 
65 /*----------------------------------------------------------------------------
66 --  Macro definitions
67 ----------------------------------------------------------------------------*/
68 
69 /* Local widgets in the include window. */
70 #define ho1Sp              dataLocalW[  0 ]
71 #define ho2Sp              dataLocalW[  1 ]
72 #define introLa            dataLocalW[  2 ]
73 #define pickSpecLa         dataLocalW[  3 ]
74 #define pickSpecRc         dataLocalW[  4 ]
75 #define pickTypeLa         dataLocalW[  5 ]
76 #define pickTypeRc         dataLocalW[  6 ]
77 #define searchStrCaseTb    dataLocalW[  7 ]
78 #define searchStrLa        dataLocalW[  8 ]
79 #define searchStrTx        dataLocalW[  9 ]
80 #define tagStrCaseTb       dataLocalW[ 10 ]
81 #define tagStrFs           dataLocalW[ 11 ]
82 #define tagStrLa           dataLocalW[ 12 ]
83 
84 
85 /*----------------------------------------------------------------------------
86 --  Type declarations
87 ----------------------------------------------------------------------------*/
88 
89 /* Filter record. */
90 typedef struct {
91 
92   /* The filter window. */
93   Widget  filterW;
94 
95   /* Application wide data. */
96   XTM_GL_BASE_DATA_REF  appl_data_ref;
97 
98   /* Callback to inform our creator of specific actions. */
99   void              *user_data;
100   XTM_FI_ACTION_CB  actionCB;
101 
102 } FILTER_REC, *FILTER_REC_REF;
103 
104 
105 /*----------------------------------------------------------------------------
106 --  Global definitions
107 ----------------------------------------------------------------------------*/
108 
109 /* Name of module. */
110 static char  *module_name = "xtmDbFilter";
111 
112 /* IDs for the help windows. */
113 static char  *filter_window_id = "CalFilter";
114 
115 
116 /*----------------------------------------------------------------------------
117 --  Function prototypes
118 ----------------------------------------------------------------------------*/
119 
120 static void
121   applyCB( Widget          widget,
122            FILTER_REC_REF  filter_ref,
123            XtPointer       call_data );
124 
125 static void
126   cancelCB( Widget          widget,
127             FILTER_REC_REF  filter_ref,
128             XtPointer       call_data );
129 
130 static Widget
131   createFilterWindow( FILTER_REC_REF  filter_ref,
132                       Widget          parent,
133                       char            *tags_menu,
134                       Boolean         app_modal );
135 
136 static void
137   destroyCB( Widget          widget,
138              FILTER_REC_REF  filter_ref,
139              XtPointer       call_data );
140 
141 static void
142   fetchWindowData( FILTER_REC_REF     filter_ref,
143                    XTM_DM_FILTER_REC  *use_filter_ref );
144 
145 static void
146   helpCB( Widget          widget,
147           FILTER_REC_REF  filter_ref,
148           XtPointer       call_data );
149 
150 static void
151   okCB( Widget          widget,
152         FILTER_REC_REF  filter_ref,
153         XtPointer       call_data );
154 
155 static void
156   setFilterValues( FILTER_REC_REF     filter_ref,
157                    XTM_DM_FILTER_REC  *use_filter_ref );
158 
159 
160 
161 /*----------------------------------------------------------------------------
162 --  Functions
163 ----------------------------------------------------------------------------*/
164 
165 XTM_FI_HANDLE
xtmFiInitialize(XTM_GL_BASE_DATA_REF appl_data_ref,Widget parent,char * tags_menu,Boolean app_modal,XTM_FI_ACTION_CB actionCB,void * user_data)166   xtmFiInitialize( XTM_GL_BASE_DATA_REF  appl_data_ref,
167                    Widget                parent,
168                    char                  *tags_menu,
169                    Boolean               app_modal,
170                    XTM_FI_ACTION_CB      actionCB,
171                    void                  *user_data )
172 {
173 
174   /* Variables. */
175   FILTER_REC_REF     filter_ref;
176   XTM_DM_FILTER_REC  filter_rec;
177 
178 
179   /* Code. */
180 
181   /* Create and initialize our private data. */
182   filter_ref = SysNew( FILTER_REC );
183   if( filter_ref == NULL )
184     return( NULL );
185 
186   filter_ref -> appl_data_ref = appl_data_ref;
187   filter_ref -> actionCB      = actionCB;
188   filter_ref -> user_data     = user_data;
189 
190 
191   /* Create the filter window. */
192   filter_ref -> filterW = createFilterWindow( filter_ref, parent,
193                                               tags_menu,  app_modal );
194   if( filter_ref -> filterW == NULL ) {
195     SysFree( filter_ref );
196 
197     return( NULL );
198   }
199 
200 
201   /* Set default values. */
202   filter_rec.flags = 0;
203   flagSet( filter_rec.flags, XTM_DM_FLAG_ALL );
204 
205   filter_rec.text_string[ 0 ] = '\0';
206   filter_rec.tag_string[  0 ] = '\0';
207 
208   setFilterValues( filter_ref, &filter_rec );
209 
210 
211   return( (XTM_FI_HANDLE) filter_ref );
212 
213 } /* xtmFiInitialize */
214 
215 
216 /*----------------------------------------------------------------------*/
217 
218 void
xtmFiDestroy(XTM_FI_HANDLE filter_handle)219   xtmFiDestroy( XTM_FI_HANDLE  filter_handle )
220 {
221 
222   /* Variables. */
223   FILTER_REC_REF  filter_ref;
224 
225 
226   /* Code. */
227 
228   if( filter_handle == NULL )
229     return;
230 
231   /* Our private data. */
232   filter_ref = (FILTER_REC_REF) filter_handle;
233 
234 
235   /* Destroy the window. */
236   XtDestroyWidget( filter_ref -> filterW );
237 
238 
239   return;
240 
241 } /* xtmFiDestroy */
242 
243 
244 /*----------------------------------------------------------------------*/
245 
246 void
xtmFiDisplayFilterWindow(XTM_FI_HANDLE filter_handle,XTM_DM_FILTER_REC * use_filter_ref)247   xtmFiDisplayFilterWindow( XTM_FI_HANDLE      filter_handle,
248                             XTM_DM_FILTER_REC  *use_filter_ref )
249 {
250 
251   /* Variables. */
252   FILTER_REC_REF  filter_ref;
253 
254 
255   /* Code. */
256 
257   if( filter_handle == NULL )
258     return;
259 
260   /* Our private data. */
261   filter_ref = (FILTER_REC_REF) filter_handle;
262 
263 
264   /* Set filter data? */
265   if( use_filter_ref != NULL )
266     setFilterValues( filter_ref, use_filter_ref );
267 
268 
269   /* Make sure the window is displayed. */
270   XtManageChild( filter_ref -> filterW );
271 
272 
273   return;
274 
275 } /* xtmFiDisplayFilterWindow */
276 
277 
278 /*----------------------------------------------------------------------*/
279 
280 static Widget
createFilterWindow(FILTER_REC_REF filter_ref,Widget parent,char * tags_menu,Boolean app_modal)281   createFilterWindow( FILTER_REC_REF  filter_ref,
282                       Widget          parent,
283                       char            *tags_menu,
284                       Boolean         app_modal )
285 {
286 
287   /* Variables. */
288   int            index;
289   char           buffer[ 100 ];
290   char           *pick_labels[ 9 ];
291   Arg            args[ 10 ];
292   Cardinal       n;
293   Widget         dataLocalW[ 13 ];
294   Widget         filtFd;
295   Widget         pickTb[ 9 ];
296   Widget         tempW;
297   Widget         workFo;
298 
299   static XIT_TEXT_STRUCT text_buffer[] = {
300     { "SearchStrTx", NULL, 1, True },
301   };
302 
303   static XIT_ACTION_AREA_ITEM  action_buttons[] = {
304     { "", okCB,     NULL },
305     { "", applyCB,  NULL },
306     { "", cancelCB, NULL },
307     { "", helpCB,   NULL },
308   };
309 
310 
311   /* Code. */
312 
313   /* Set message strings. */
314   action_buttons[ 0 ].label = msgGetText( MXDI_OK_BUTTON );
315   action_buttons[ 0 ].data  = filter_ref;
316   action_buttons[ 1 ].label = msgGetText( MXDI_APPLY_BUTTON );
317   action_buttons[ 1 ].data  = filter_ref;
318   action_buttons[ 2 ].label = msgGetText( MXDI_CANCEL_BUTTON );
319   action_buttons[ 2 ].data  = filter_ref;
320   action_buttons[ 3 ].label = msgGetText( MXDI_HELP_BUTTON );
321   action_buttons[ 3 ].data  = filter_ref;
322 
323   pick_labels[ 0 ] = msgGetText( MXDI_FILTER_APPOINTMENTS_LABEL );
324   pick_labels[ 1 ] = msgGetText( MXDI_FILTER_NOTES_LABEL );
325   pick_labels[ 2 ] = msgGetText( MXDI_FILTER_ALARMS_LABEL );
326   pick_labels[ 3 ] = msgGetText( MXDI_FILTER_IMPORTANT_LABEL );
327   pick_labels[ 4 ] = msgGetText( MXDI_FILTER_PRIVATE_LABEL );
328   pick_labels[ 5 ] = msgGetText( MXDI_FILTER_DONE_LABEL );
329   pick_labels[ 6 ] = msgGetText( MXDI_FILTER_NOT_DONE_LABEL );
330   pick_labels[ 7 ] = msgGetText( MXDI_FILTER_REPEATED_LABEL );
331   pick_labels[ 8 ] = msgGetText( MXDI_FILTER_STICKY_LABEL );
332 
333 
334   /* Create a form dialog with buttons. */
335   filtFd = xitCreateFormDialog( parent, "FiltFd",
336                                 1, 0,
337                                 action_buttons,
338                                 XtNumber( action_buttons ) );
339 
340   XtAddCallback( filtFd, XmNdestroyCallback,
341                  (XtCallbackProc) destroyCB, (XtPointer) filter_ref );
342 
343 
344   n = 0;
345   XtSetArg( args[ n ], XmNtitle, msgGetText( MXDI_FILTER_DB_TITLE ) ); n++;
346   XtSetValues( XtParent( filtFd ), args, n );
347 
348   n = 0;
349   XtSetArg( args[ n ], XmNdeleteResponse, XmUNMAP ); n++;
350   XtSetValues( filtFd, args, n );
351 
352   if( app_modal ) {
353     n = 0;
354     XtSetArg( args[ n ], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL ); n++;
355     XtSetValues( filtFd, args, n );
356   }
357 
358 
359   /* Create a container for the contents of the window. */
360   workFo = XtNameToWidget( filtFd, "FiltFdFo" );
361 
362   introLa = xitCreateLabel( workFo, "IntroLa",
363                             msgGetText( MXDI_FILTER_INTRO_LABEL ), -1 );
364 
365 
366   /* The type of entry to select. */
367   pickTypeLa = xitCreateLabel( workFo, "PickTypeLa",
368                                msgGetText( MXDI_FILTER_PICK_TYPE_LABEL ), -1 );
369 
370   n = 0;
371   XtSetArg( args[ n ], XmNorientation, XmVERTICAL ); n++;
372   XtSetArg( args[ n ], XmNpacking, XmPACK_COLUMN ); n++;
373   XtSetArg( args[ n ], XmNnumColumns, 2 ); n++;
374   pickTypeRc = XmCreateRowColumn( workFo, "PickTypeRc", args, n );
375 
376   for( index = 0; index < 2; index++ ) {
377     sprintf( buffer, "Pick%dTb", index + 1 );
378 
379     pickTb[ index ] = xitCreateToggleButton( pickTypeRc, buffer,
380                                              pick_labels[ index ], False );
381   }
382 
383 
384   /* The specific entries to select. */
385   pickSpecLa = xitCreateLabel( workFo, "PickSpecLa",
386                                msgGetText( MXDI_FILTER_PICK_SPEC_LABEL ), -1 );
387 
388   n = 0;
389   XtSetArg( args[ n ], XmNorientation, XmVERTICAL ); n++;
390   XtSetArg( args[ n ], XmNpacking, XmPACK_COLUMN ); n++;
391   XtSetArg( args[ n ], XmNnumColumns, 2 ); n++;
392   pickSpecRc = XmCreateRowColumn( workFo, "PickSpecRc", args, n );
393 
394   for( index = 2; index < 9; index++ ) {
395     sprintf( buffer, "Pick%dTb", index + 1 );
396 
397     pickTb[ index ] = xitCreateToggleButton( pickSpecRc, buffer,
398                                              pick_labels[ index ], False );
399   }
400 
401 
402   /* Separator. */
403   n = 0;
404   XtSetArg( args[ n ], XmNorientation, XmHORIZONTAL );  n++;
405   ho1Sp = XmCreateSeparatorGadget( workFo, "Ho1Sp", args, n );
406 
407 
408   /* Search text. */
409   searchStrLa = xitCreateLabel( workFo, "SearchStrLa",
410                                 msgGetText( MXDI_SEARCH_STRING_LABEL ), -1 );
411 
412   searchStrTx = xitCreateTextCols( workFo, &text_buffer[ 0 ], 40 );
413 
414   n = 0;
415   XtSetArg( args[ n ], XmNmaxLength, XTM_DM_MAX_TEXT_SEARCH ); n++;
416   XtSetValues( searchStrTx, args, n );
417 
418   searchStrCaseTb = xitCreateToggleButton(
419                         workFo, "SearchStrCaseTb",
420                         msgGetText( MXDI_CASE_SENSITIVE_LABEL ),
421                         False );
422 
423   /* Separator. */
424   n = 0;
425   XtSetArg( args[ n ], XmNorientation, XmHORIZONTAL );  n++;
426   ho2Sp = XmCreateSeparatorGadget( workFo, "Ho2Sp", args, n );
427 
428 
429   /* Search tag. */
430   tagStrLa = xitCreateLabel( workFo, "TagStrLa",
431                              msgGetText( MXDI_SEARCH_TAG_LABEL ), -1 );
432 
433   tagStrFs = xtmFlCreateSelField( workFo, "TagStrFs",
434                                   XTM_DM_MAX_TAG_SEARCH, tags_menu,
435                                   ' ', True,
436                                   NULL, NULL );
437 
438   tempW = xitFieldSelectGetChild( tagStrFs, xitFIELD_SELECT_TEXT_FIELD );
439 
440   xitFieldSelectSetAppend( tagStrFs, True );
441 
442   tagStrCaseTb = xitCreateToggleButton(
443                    workFo, "TagStrCaseTb",
444                    msgGetText( MXDI_CASE_SENSITIVE_LABEL ),
445                    False );
446 
447 
448   /* Put the Parts together. */
449   xitAttachWidget( introLa,
450                    XmATTACH_FORM, NULL, XmATTACH_FORM, NULL,
451                    XmATTACH_NONE, NULL, XmATTACH_NONE, NULL );
452   xitAttachWidget( pickTypeLa,
453                    XmATTACH_WIDGET, introLa, XmATTACH_FORM, NULL,
454                    XmATTACH_NONE,   NULL,    XmATTACH_NONE, NULL );
455   xitAttachWidget( pickTypeRc,
456                    XmATTACH_WIDGET, pickTypeLa, XmATTACH_FORM, NULL,
457                    XmATTACH_NONE,   NULL,       XmATTACH_NONE, NULL );
458   xitAttachWidget( pickSpecLa,
459                    XmATTACH_WIDGET, pickTypeRc, XmATTACH_FORM, NULL,
460                    XmATTACH_NONE,   NULL,       XmATTACH_NONE, NULL );
461   xitAttachWidget( pickSpecRc,
462                    XmATTACH_WIDGET, pickSpecLa, XmATTACH_FORM, NULL,
463                    XmATTACH_NONE,   NULL,       XmATTACH_NONE, NULL );
464   xitAttachWidget( ho1Sp,
465                    XmATTACH_WIDGET, pickSpecRc, XmATTACH_FORM, NULL,
466                    XmATTACH_FORM,   NULL,       XmATTACH_NONE, NULL );
467   xitAttachWidget( searchStrLa,
468                    XmATTACH_WIDGET, ho1Sp, XmATTACH_FORM, NULL,
469                    XmATTACH_NONE,   NULL,  XmATTACH_NONE, NULL );
470   xitAttachWidget( searchStrTx,
471                    XmATTACH_WIDGET, searchStrLa, XmATTACH_FORM, NULL,
472                    XmATTACH_NONE,   NULL,        XmATTACH_NONE, NULL );
473   xitAttachWidget( searchStrCaseTb,
474                    XmATTACH_WIDGET, searchStrTx, XmATTACH_FORM, NULL,
475                    XmATTACH_NONE,   NULL,        XmATTACH_NONE, NULL );
476   xitAttachWidget( ho2Sp,
477                    XmATTACH_WIDGET, searchStrCaseTb, XmATTACH_FORM, NULL,
478                    XmATTACH_FORM,   NULL,            XmATTACH_NONE, NULL );
479   xitAttachWidget( tagStrLa,
480                    XmATTACH_WIDGET, ho2Sp, XmATTACH_FORM, NULL,
481                    XmATTACH_NONE,   NULL,  XmATTACH_NONE, NULL );
482   xitAttachWidget( tagStrFs,
483                    XmATTACH_WIDGET, tagStrLa, XmATTACH_FORM, NULL,
484                    XmATTACH_NONE,   NULL,     XmATTACH_NONE, NULL );
485   xitAttachWidget( tagStrCaseTb,
486                    XmATTACH_WIDGET, tagStrFs, XmATTACH_FORM, NULL,
487                    XmATTACH_NONE,   NULL,     XmATTACH_NONE, NULL );
488 
489 
490   /* Make sure there is enough space between the children. */
491   n = 0;
492   XtSetArg( args[ n ], XmNtopOffset,    5 ); n++;
493   XtSetArg( args[ n ], XmNleftOffset,   5 ); n++;
494   XtSetArg( args[ n ], XmNrightOffset,  5 ); n++;
495   XtSetArg( args[ n ], XmNbottomOffset, 5 ); n++;
496   XtSetValues( introLa,         args, n );
497   XtSetValues( pickTypeLa,      args, n );
498   XtSetValues( pickTypeRc,      args, n );
499   XtSetValues( pickSpecLa,      args, n );
500   XtSetValues( pickSpecRc,      args, n );
501   XtSetValues( searchStrLa,     args, n );
502   XtSetValues( searchStrTx,     args, n );
503   XtSetValues( searchStrCaseTb, args, n );
504   XtSetValues( tagStrLa,        args, n );
505   XtSetValues( tagStrFs,        args, n );
506   XtSetValues( tagStrCaseTb,    args, n );
507 
508   n = 0;
509   XtSetArg( args[ n ], XmNtopOffset,    5 ); n++;
510   XtSetArg( args[ n ], XmNbottomOffset, 5 ); n++;
511   XtSetValues( ho1Sp, args, n );
512   XtSetValues( ho2Sp, args, n );
513 
514 
515   /* Manage the children. */
516   xitManageChildren( pickTb, XtNumber( pickTb ) );
517 
518   xitManageChildren( dataLocalW, XtNumber( dataLocalW ) );
519 
520 
521   /* Set the initial sizes. */
522   xitSetSizeFormDialog( filtFd, True );
523 
524 
525   return( filtFd );
526 
527 } /* createFilterWindow */
528 
529 
530 /*----------------------------------------------------------------------*/
531 
532 static void
fetchWindowData(FILTER_REC_REF filter_ref,XTM_DM_FILTER_REC * use_filter_ref)533   fetchWindowData( FILTER_REC_REF     filter_ref,
534                    XTM_DM_FILTER_REC  *use_filter_ref )
535 {
536 
537   /* Variables. */
538   char    *char_ref;
539   char    *text_ref;
540   Widget  mainW;
541   Widget  tempW;
542 
543 
544   /* Code. */
545 
546   mainW = XtNameToWidget( filter_ref -> filterW, "FiltFdFo" );
547 
548   use_filter_ref -> flags            = 0;
549   use_filter_ref -> text_string[ 0 ] = '\0';
550   use_filter_ref -> tag_string[ 0 ]  = '\0';
551 
552 
553   /* Type of entries. */
554   tempW = XtNameToWidget( mainW, "PickTypeRc.Pick1Tb" );
555   if( XmToggleButtonGetState( tempW ) )
556     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_APPOINTMENTS );
557 
558 
559   tempW = XtNameToWidget( mainW, "PickTypeRc.Pick2Tb" );
560   if( XmToggleButtonGetState( tempW ) )
561     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_NOTES );
562 
563   if( flagIsSet( use_filter_ref -> flags, XTM_DM_FLAG_APPOINTMENTS ) &&
564       flagIsSet( use_filter_ref -> flags, XTM_DM_FLAG_NOTES ) )
565     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_ALL );
566 
567 
568   /* Specific entries. */
569   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick3Tb" );
570   if( XmToggleButtonGetState( tempW ) )
571     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_ALARMS );
572 
573   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick4Tb" );
574   if( XmToggleButtonGetState( tempW ) )
575     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_IMPORTANT );
576 
577   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick5Tb" );
578   if( XmToggleButtonGetState( tempW ) )
579     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_PRIVATE );
580 
581   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick6Tb" );
582   if( XmToggleButtonGetState( tempW ) )
583     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_DONE );
584 
585   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick7Tb" );
586   if( XmToggleButtonGetState( tempW ) )
587     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_NOT_DONE );
588 
589   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick8Tb" );
590   if( XmToggleButtonGetState( tempW ) )
591     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_REPEATED );
592 
593   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick9Tb" );
594   if( XmToggleButtonGetState( tempW ) )
595     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_STICKY );
596 
597 
598   /* Case sensitive search. */
599   tempW = XtNameToWidget( mainW, "SearchStrCaseTb" );
600   if( XmToggleButtonGetState( tempW ) )
601     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_TEXT_CASE_SENS );
602 
603 
604   tempW = XtNameToWidget( mainW, "TagStrCaseTb" );
605   if( XmToggleButtonGetState( tempW ) )
606     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_TAG_CASE_SENS );
607 
608 
609   /* Text search string. */
610   tempW    = XtNameToWidget( mainW, "SearchStrTx" );
611   text_ref = xitStringGetText( tempW );
612 
613   char_ref = text_ref;
614   while( isspace( *char_ref ) )
615     char_ref++;
616 
617   if( strlen( char_ref ) > 0 ) {
618     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_SEARCH_TEXT );
619     strcpy( use_filter_ref -> text_string, char_ref );
620   }
621 
622   SysFree( text_ref );
623 
624 
625   /* Tag search string. */
626   tempW = XtNameToWidget( mainW, "TagStrFs" );
627   xitFieldSelectGetCurrent( tempW, &text_ref );
628 
629   char_ref = text_ref;
630   while( isspace( *char_ref ) )
631     char_ref++;
632 
633   if( strlen( char_ref ) > 0 ) {
634     flagSet( use_filter_ref -> flags, XTM_DM_FLAG_SEARCH_TAG );
635     strcpy( use_filter_ref -> tag_string, char_ref );
636   }
637 
638   SysFree( text_ref );
639 
640 
641   return;
642 
643 } /* fetchWindowData */
644 
645 
646 /*----------------------------------------------------------------------*/
647 
648 static void
setFilterValues(FILTER_REC_REF filter_ref,XTM_DM_FILTER_REC * use_filter_ref)649   setFilterValues( FILTER_REC_REF     filter_ref,
650                    XTM_DM_FILTER_REC  *use_filter_ref )
651 {
652 
653   /* Variables. */
654   Boolean  set;
655   UINT32   filter;
656   Widget   mainW;
657   Widget   tempW;
658 
659 
660   /* Code. */
661 
662   mainW = XtNameToWidget( filter_ref -> filterW, "FiltFdFo" );
663 
664 
665   /* Set filter buttons. */
666   filter = use_filter_ref -> flags;
667 
668 
669   /* Type of filter. */
670   set = (flagIsSet( filter, (XTM_DM_FLAG_ALL | XTM_DM_FLAG_APPOINTMENTS) )) ?
671            True : False;
672   tempW = XtNameToWidget( mainW, "PickTypeRc.Pick1Tb" );
673   XmToggleButtonSetState( tempW, set, False );
674 
675   set = (flagIsSet( filter, (XTM_DM_FLAG_ALL | XTM_DM_FLAG_NOTES) )) ?
676            True : False;
677   tempW = XtNameToWidget( mainW, "PickTypeRc.Pick2Tb" );
678   XmToggleButtonSetState( tempW, set, False );
679 
680 
681   /* Specific filter. */
682   set   = (flagIsSet( filter, XTM_DM_FLAG_ALARMS )) ? True : False;
683   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick3Tb" );
684   XmToggleButtonSetState( tempW, set, False );
685 
686   set   = (flagIsSet( filter, XTM_DM_FLAG_IMPORTANT )) ? True : False;
687   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick4Tb" );
688   XmToggleButtonSetState( tempW, set, False );
689 
690   set   = (flagIsSet( filter, XTM_DM_FLAG_PRIVATE )) ? True : False;
691   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick5Tb" );
692   XmToggleButtonSetState( tempW, set, False );
693 
694   set   = (flagIsSet( filter, XTM_DM_FLAG_DONE )) ? True : False;
695   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick6Tb" );
696   XmToggleButtonSetState( tempW, set, False );
697 
698   set   = (flagIsSet( filter, XTM_DM_FLAG_NOT_DONE )) ? True : False;
699   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick7Tb" );
700   XmToggleButtonSetState( tempW, set, False );
701 
702   set   = (flagIsSet( filter, XTM_DM_FLAG_REPEATED )) ? True : False;
703   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick8Tb" );
704   XmToggleButtonSetState( tempW, set, False );
705 
706   set   = (flagIsSet( filter, XTM_DM_FLAG_STICKY )) ? True : False;
707   tempW = XtNameToWidget( mainW, "PickSpecRc.Pick9Tb" );
708   XmToggleButtonSetState( tempW, set, False );
709 
710 
711   /* Set case sensitive buttons. */
712   filter = use_filter_ref -> flags;
713 
714   set   = (flagIsSet( filter, XTM_DM_FLAG_TEXT_CASE_SENS )) ? True : False;
715   tempW = XtNameToWidget( mainW, "SearchStrCaseTb" );
716   XmToggleButtonSetState( tempW, set, False );
717 
718   set   = (flagIsSet( filter, XTM_DM_FLAG_TAG_CASE_SENS )) ? True : False;
719   tempW = XtNameToWidget( mainW, "TagStrCaseTb" );
720   XmToggleButtonSetState( tempW, set, False );
721 
722 
723   /* Set search string. */
724   tempW = XtNameToWidget( mainW, "SearchStrTx" );
725   XmTextSetString( tempW, use_filter_ref -> text_string );
726 
727 
728   /* Tag seach string. */
729   tempW = XtNameToWidget( mainW, "TagStrFs" );
730   xitFieldSelectSetCurrent( tempW, use_filter_ref -> tag_string, False );
731 
732 
733   return;
734 
735 } /* setFilterValues */
736 
737 
738 /*----------------------------------------------------------------------*/
739 
740 static void
applyCB(Widget widget,FILTER_REC_REF filter_ref,XtPointer call_data)741   applyCB( Widget          widget,
742            FILTER_REC_REF  filter_ref,
743            XtPointer       call_data )
744 {
745 
746   /* Variables. */
747   XTM_DM_FILTER_REC  filter_rec;
748 
749 
750   /* Code. */
751 
752   /* Fetch the window data. */
753   fetchWindowData( filter_ref, &filter_rec );
754 
755 
756   /* Call callback function? */
757   if( filter_ref -> actionCB != NULL )
758     (* filter_ref -> actionCB)( XTM_FI_REASON_APPLY,
759                                 &filter_rec,
760                                 filter_ref -> user_data );
761 
762 
763   return;
764 
765 } /* applyCB */
766 
767 
768 /*----------------------------------------------------------------------*/
769 
770 static void
cancelCB(Widget widget,FILTER_REC_REF filter_ref,XtPointer call_data)771   cancelCB( Widget          widget,
772             FILTER_REC_REF  filter_ref,
773             XtPointer       call_data )
774 {
775 
776   /* Code. */
777 
778   /* Call callback function? */
779   if( filter_ref -> actionCB != NULL )
780     (* filter_ref -> actionCB)( XTM_FI_REASON_CANCEL,
781                                 NULL, filter_ref -> user_data );
782 
783   /* Hide the window. */
784   XtUnmanageChild( filter_ref -> filterW );
785 
786 
787   return;
788 
789 } /* cancelCB */
790 
791 
792 /*----------------------------------------------------------------------*/
793 
794 static void
destroyCB(Widget widget,FILTER_REC_REF filter_ref,XtPointer call_data)795   destroyCB( Widget          widget,
796              FILTER_REC_REF  filter_ref,
797              XtPointer       call_data )
798 {
799 
800   /* Code. */
801 
802   SysFree( filter_ref );
803 
804 
805   return;
806 
807 } /* destroyCB */
808 
809 
810 /*----------------------------------------------------------------------*/
811 
812 static void
helpCB(Widget widget,FILTER_REC_REF filter_ref,XtPointer call_data)813   helpCB( Widget          widget,
814           FILTER_REC_REF  filter_ref,
815           XtPointer       call_data )
816 {
817 
818   /* Code. */
819 
820   xtmHlDisplayHelp( filter_ref -> appl_data_ref -> info_handle,
821                     XTM_HL_WINDOW_INDEX,
822                     filter_window_id, "" );
823 
824   return;
825 
826 } /* helpCB */
827 
828 
829 /*----------------------------------------------------------------------*/
830 
831 static void
okCB(Widget widget,FILTER_REC_REF filter_ref,XtPointer call_data)832   okCB( Widget          widget,
833         FILTER_REC_REF  filter_ref,
834         XtPointer       call_data )
835 {
836 
837   /* Variables. */
838   XTM_DM_FILTER_REC  filter_rec;
839 
840 
841   /* Code. */
842 
843   /* Fetch the window data. */
844   fetchWindowData( filter_ref, &filter_rec );
845 
846 
847   /* Call callback function? */
848   if( filter_ref -> actionCB != NULL )
849     (* filter_ref -> actionCB)( XTM_FI_REASON_OK,
850                                 &filter_rec,
851                                 filter_ref -> user_data );
852 
853   /* Hide the window. */
854   XtUnmanageChild( filter_ref -> filterW );
855 
856 
857   return;
858 
859 } /* okCB */
860