2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: Filter.c /main/8 1996/10/30 11:10:48 drk $ */
24 /************************************<+>*************************************
25 ****************************************************************************
29 * COMPONENT_NAME: Desktop File Manager (dtfile)
31 * Description: Source file for the file filter dialog.
33 * FUNCTIONS: ApplyCallback
51 * UpdateFilterAfterDBReread
55 * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
56 * (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
57 * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
58 * (c) Copyright 1993, 1994, 1995 Novell, Inc.
60 ****************************************************************************
61 ************************************<+>*************************************/
70 #include <Xm/DialogS.h>
71 #include <Xm/DrawingA.h>
73 #include <Xm/LabelG.h>
75 #include <Xm/MessageB.h>
76 #include <Xm/PushBG.h>
77 #include <Xm/RowColumn.h>
79 #include <Xm/ToggleBG.h>
80 #include <Xm/ScrollBar.h>
81 #include <Xm/ScrolledW.h>
82 #include <Xm/SeparatoG.h>
83 #include <Xm/VendorSEP.h>
84 #include <Xm/MwmUtil.h>
85 #include <Xm/Protocols.h>
87 #include <Dt/TitleBox.h>
90 #include <Dt/IconFile.h>
92 #include <X11/ShellP.h>
93 #include <X11/Shell.h>
94 #include <X11/Xatom.h>
97 #include <Dt/DtNlUtils.h>
99 #include <Dt/SharedProcs.h>
102 #include "SharedProcs.h"
111 char **DtDtsDataTypeNames(void);
113 static char * FILE_FILTER = "FileFilter";
116 static DialogResource resources[] =
118 { "matchFilter", XmRBoolean, sizeof(Boolean),
119 XtOffset(FilterDataPtr, match_flag),
120 (XtPointer) True, _DtBooleanToString },
122 { "name", XmRString, sizeof(String),
123 XtOffset(FilterDataPtr, filter),
124 (XtPointer) "", _DtStringToString },
126 { "showHidden", XmRBoolean, sizeof(Boolean),
127 XtOffset(FilterDataPtr, show_hidden),
128 (XtPointer) False, _DtBooleanToString },
130 { "filetypesFilteredCount", XmRInt, sizeof(int),
131 XtOffset(FilterDataPtr, filetypesFilteredCount),
132 (XtPointer) 3, _DtIntToString },
134 { "filetypesFiltered", XmRString, sizeof(String),
135 XtOffset(FilterDataPtr, filetypesFiltered),
136 (XtPointer) DEFAULT_FILTER, _DtStringToString },
140 #define FM_TYPE_LABEL "TYPE_LABEL"
142 /******** Forward Function Declaration ********/
143 int ReadInFiletypes(FilterData *filter_data);
145 /******** Static Function Declarations ********/
150 Widget *return_widget,
152 static void InstallChange(
153 FilterRec *filter_rec,
154 XtCallbackProc callback,
155 XtPointer client_data) ;
156 static void InstallClose(
157 FilterRec *filter_rec,
158 XtCallbackProc callback,
159 XtPointer client_data) ;
161 FilterRec *filter_rec) ;
162 static XtPointer GetValues(
163 FilterRec *filter_rec) ;
164 static XtPointer GetDefaultValues( void ) ;
165 static XtPointer GetResourceValues(
166 XrmDatabase data_base,
168 static void SetValues(
169 FilterRec *filter_rec,
170 FilterData *filter_data) ;
171 static void WriteResourceValues(
175 static void FreeValues(
176 FilterData *filter_data) ;
177 static void DefaultCallback(
179 XtPointer client_data,
180 XtPointer call_data) ;
181 static void CancelCallback(
183 XtPointer client_data,
184 XtPointer call_data) ;
185 static void OkCallback(
187 XtPointer client_data,
188 XtPointer call_data) ;
189 static void ApplyCallback(
191 XtPointer client_data,
192 XtPointer call_data) ;
193 static Boolean GetFilterValues(
194 FilterRec *filter_rec,
195 FilterData *filter_data) ;
196 static void filterTypeChanged(
198 XtPointer client_data,
199 XtPointer call_data ) ;
200 static int FileTypeAscending(
203 static void SelectAllFilter(
207 Cardinal *num_params );
208 static void DeselectAllFilter(
212 Cardinal *num_params );
213 /******** End Static Function Declarations ********/
218 static DialogClass filterClassRec =
223 (DialogInstallChangeProc) InstallChange,
224 (DialogInstallCloseProc) InstallClose,
225 (DialogDestroyProc) Destroy,
226 (DialogGetValuesProc) GetValues,
229 (DialogSetValuesProc) SetValues,
231 (DialogFreeValuesProc) FreeValues,
232 (DialogMapWindowProc) _DtGenericMapWindow,
236 DialogClass * filterClass = (DialogClass *) &filterClassRec;
238 static XtActionsRec FilterAction[] = {
239 { "SelectAllFilter", SelectAllFilter },
240 { "DeselectAllFilter", DeselectAllFilter }
243 static char FilterTranslationString[] = "\
244 Ctrl<Key>slash:SelectAllFilter(@)\n\
245 Ctrl<Key>backslash:DeselectAllFilter(@)";
247 /************************************************************************
251 ************************************************************************/
257 Widget *return_widget,
260 FilterRec * filter_rec;
261 Widget shell, form, fileNameFilter;
262 Widget tog_frame, tog_form, fileTypeScrollWin, file_window;
263 Widget labelPt2, hidden, separator, sel_form;
264 Widget ok, apply, reset, close, help;
265 Widget selectAll, unselectAll;
266 Widget hiddenPulldown;
267 XmString label_string;
268 XtTranslations filterTranslationTable;
273 char * tmpStr, * resolvedFilterTranslationString;
275 /* Allocate the file filter dialog instance record. */
276 filter_rec = (FilterRec *) XtMalloc (sizeof (FilterRec));
278 /* Create the shell and form used for the dialog. */
280 XtSetArg (args[n], XmNmwmFunctions, MWM_FUNC_MOVE |
281 MWM_FUNC_CLOSE); ++n;
282 XtSetArg (args[n], XmNmwmDecorations, MWM_DECOR_BORDER |
283 MWM_DECOR_TITLE); ++n;
284 XtSetArg (args[n], XmNallowShellResize, True); ++n;
285 shell = XmCreateDialogShell (parent, "filter_files", args, n);
287 /* Set the useAsyncGeo on the shell */
288 XtSetArg (args[0], XmNuseAsyncGeometry, True);
289 XtSetValues (XtParent(shell), args, 1);
292 XtSetArg (args[n], XmNmarginWidth, 1); n++;
293 XtSetArg (args[n], XmNmarginHeight, 1); n++;
294 XtSetArg (args[n], XmNshadowThickness, 1); n++;
295 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
296 XtSetArg (args[n], XmNautoUnmanage, False); n++;
297 form = XmCreateForm (shell, "form", args, n);
298 XtAddCallback(form, XmNhelpCallback, HelpRequestCB,
299 HELP_FILTER_DIALOG_STR);
301 XtAppAddActions( XtWidgetToApplicationContext(form),
303 XtNumber(FilterAction));
304 resolvedFilterTranslationString = ResolveTranslationString(
305 FilterTranslationString,
306 (char *)filter_rec );
307 filterTranslationTable = XtParseTranslationTable(
308 resolvedFilterTranslationString );
309 XtFree( resolvedFilterTranslationString );
310 resolvedFilterTranslationString = NULL;
311 XtOverrideTranslations(form, filterTranslationTable);
313 hiddenPulldown = XmCreatePulldownMenu(form, "hiddenPD", args, 0);
315 label_string = XmStringCreateLocalized ((GETMESSAGE(13,27, "Shown")));
316 XtSetArg(args[0], XmNmarginHeight, 1);
317 XtSetArg(args[1], XmNmarginWidth, 1);
318 XtSetArg(args[2], XmNlabelString, label_string);
319 XtSetArg(args[3], XmNuserData, SHOWN);
320 filter_rec->hidArray[SHOWN] =
321 XmCreatePushButtonGadget(hiddenPulldown, "shown", args, 4);
322 XmStringFree(label_string);
323 XtAddCallback(filter_rec->hidArray[SHOWN], XmNactivateCallback,
324 filterTypeChanged, (XtPointer) filter_rec);
326 label_string = XmStringCreateLocalized ((GETMESSAGE(13,28, "Hidden")));
327 XtSetArg(args[2], XmNlabelString, label_string);
328 XtSetArg(args[3], XmNuserData, HIDDEN);
329 filter_rec->hidArray[HIDDEN] =
330 XmCreatePushButtonGadget(hiddenPulldown, "hidden", args, 4);
331 XmStringFree(label_string);
332 XtAddCallback(filter_rec->hidArray[HIDDEN], XmNactivateCallback,
333 filterTypeChanged, (XtPointer) filter_rec);
334 XtManageChildren(filter_rec->hidArray, 2);
336 /* create the Option Menu and attach it to the Pulldown MenuPane */
337 label_string = XmStringCreateLocalized ((GETMESSAGE(13,31,
338 "Select Datatypes to be:")));
340 XtSetArg (args[n], XmNlabelString, label_string); n++;
341 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
342 XtSetArg (args[n], XmNleftOffset, 5); n++;
343 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
344 XtSetArg (args[n], XmNtopOffset, 10); n++;
345 XtSetArg (args[n], XmNsubMenuId, hiddenPulldown); n++;
346 XtSetArg (args[n], XmNmenuHistory, filter_rec->hidArray[HIDDEN]); n++;
347 hidden = XmCreateOptionMenu(form, "file_name_label", args, n);
348 XtManageChild (hidden);
349 XmStringFree (label_string);
350 XtAddCallback(hidden, XmNhelpCallback, HelpRequestCB,
351 HELP_FILTER_DIALOG_STR);
353 /* Create the Scrolled Window For the filetype display area */
354 /* and set the scrollbars colors correctly */
356 XtSetArg (args[n], XmNspacing, 2); n++;
357 XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
358 XtSetArg (args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED); n++;
359 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
360 XtSetArg (args[n], XmNleftOffset, 10); n++;
361 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
362 XtSetArg (args[n], XmNrightOffset, 10); n++;
363 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
364 XtSetArg (args[n], XmNtopWidget, hidden); n++;
365 XtSetArg (args[n], XmNtopOffset, 5); n++;
366 fileTypeScrollWin = XmCreateScrolledWindow(form, "filetypeSWin", args, n);
367 XtManageChild (fileTypeScrollWin);
368 XtAddCallback(fileTypeScrollWin, XmNhelpCallback, HelpRequestCB,
369 HELP_FILTER_DIALOG_STR);
371 /* Create a drawing area as a child of the scrolled window */
374 XtSetArg (args[n], XmNmarginWidth, 4); n++;
375 XtSetArg (args[n], XmNmarginHeight, 4); n++;
376 XtSetArg (args[n], XmNresizePolicy, XmRESIZE_ANY); n++;
377 file_window = XmCreateDrawingArea (fileTypeScrollWin, "file_window",
379 XtManageChild (file_window);
382 XtSetArg (args[n], XmNmarginWidth, 1); n++;
383 XtSetArg (args[n], XmNmarginHeight, 1); n++;
384 XtSetArg (args[n], XmNshadowThickness, 0); n++;
385 XtSetArg (args[n], XmNautoUnmanage, False); n++;
386 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
387 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
388 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
389 XtSetArg (args[n], XmNtopWidget, fileTypeScrollWin); n++;
390 XtSetArg (args[n], XmNtopOffset, 10); n++;
391 sel_form = XmCreateForm (form, "sel_form", args, n);
392 XtManageChild(sel_form);
394 label_string = XmStringCreateLocalized ((GETMESSAGE(13,21, "Select All")));
396 XtSetArg (args[n], XmNlabelString, label_string); n++;
397 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
398 XtSetArg (args[n], XmNleftPosition, 15); n++;
399 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
400 XtSetArg (args[n], XmNtopOffset, 5); n++;
401 XtSetArg (args[n], XmNmarginHeight, 4); n++;
402 XtSetArg (args[n], XmNmarginWidth, 10); n++;
403 selectAll = XmCreatePushButtonGadget (sel_form, "selectAll", args, n);
404 XtManageChild (selectAll);
405 XtAddCallback (selectAll, XmNactivateCallback, SelectAllFileTypes,
406 (XtPointer) filter_rec);
407 XtAddCallback(selectAll, XmNhelpCallback, HelpRequestCB,
408 HELP_FILTER_DIALOG_STR);
409 XmStringFree (label_string);
410 XtSetArg (args[0], XmNdefaultButton, selectAll);
411 XtSetValues (sel_form, args, 1);
413 label_string = XmStringCreateLocalized ((GETMESSAGE(13,22, "Deselect All")));
415 XtSetArg (args[n], XmNlabelString, label_string); n++;
416 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
417 XtSetArg (args[n], XmNleftPosition, 55); n++;
418 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
419 XtSetArg (args[n], XmNtopOffset, 5); n++;
420 XtSetArg (args[n], XmNmarginHeight, 4); n++;
421 XtSetArg (args[n], XmNmarginWidth, 10); n++;
422 unselectAll = XmCreatePushButtonGadget (sel_form, "deselectAll", args, n);
423 XtManageChild (unselectAll);
424 XtAddCallback (unselectAll, XmNactivateCallback, UnselectAllFileTypes,
425 (XtPointer) filter_rec);
426 XtAddCallback(unselectAll, XmNhelpCallback, HelpRequestCB,
427 HELP_FILTER_DIALOG_STR);
428 XmStringFree (label_string);
430 /* Create the file name filter label and text fields. */
431 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(13,26,
432 "Also hide (Optional): ")));
434 XtSetArg (args[n], XmNlabelString, label_string); n++;
435 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
436 XtSetArg (args[n], XmNleftOffset, 5); n++;
437 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
438 XtSetArg (args[n], XmNtopWidget, sel_form); n++;
439 XtSetArg (args[n], XmNtopOffset, 18); n++;
440 XtSetArg (args[n], XmNtraversalOn, False); n++;
441 labelPt2 = XmCreateLabelGadget (form, "file_name_label", args, n);
442 XtManageChild (labelPt2);
443 XmStringFree (label_string);
444 XtAddCallback(labelPt2, XmNhelpCallback, HelpRequestCB,
445 HELP_FILTER_DIALOG_STR);
449 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
450 XtSetArg (args[n], XmNleftWidget, labelPt2); n++;
451 XtSetArg (args[n], XmNleftOffset, 0); n++;
452 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
453 XtSetArg (args[n], XmNtopWidget, sel_form); n++;
454 XtSetArg (args[n], XmNtopOffset, 10); n++;
455 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
456 XtSetArg (args[n], XmNrightOffset, 10); n++;
457 fileNameFilter = XmCreateTextField (form, "file_name_text", args, n);
458 XtManageChild (fileNameFilter);
459 XtAddCallback(fileNameFilter, XmNhelpCallback, HelpRequestCB,
460 HELP_FILTER_DIALOG_STR);
462 /* Create a separator between the buttons */
465 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
466 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
467 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
468 XtSetArg (args[n], XmNtopWidget, fileNameFilter); n++;
469 XtSetArg (args[n], XmNtopOffset, 10); n++;
470 separator = XmCreateSeparatorGadget (form, "separator", args, n);
471 XtManageChild (separator);
474 /* Create the ok, apply, reset, cancel and help buttons */
477 XtSetArg (args[n], XmNlabelString, okXmString); n++;
478 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
479 XtSetArg (args[n], XmNleftPosition, 1); n++;
480 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
481 XtSetArg (args[n], XmNrightPosition, 19); n++;
482 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
483 XtSetArg (args[n], XmNtopWidget, separator); n++;
484 XtSetArg (args[n], XmNtopOffset, 5); n++;
485 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
486 XtSetArg (args[n], XmNbottomOffset, 5); n++;
487 XtSetArg (args[n], XmNmarginWidth, 4); n++;
488 XtSetArg (args[n], XmNmarginHeight, 4); n++;
489 XtSetArg (args[n], XmNmultiClick, XmMULTICLICK_DISCARD); n++;
490 XtSetArg (args[n], XmNuserData, flag); n++;
491 ok = XmCreatePushButtonGadget (form, "ok", args, n);
493 XtAddCallback(ok, XmNhelpCallback, HelpRequestCB,
494 HELP_FILTER_DIALOG_STR);
497 XtSetArg (args[n], XmNlabelString, applyXmString); n++;
498 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
499 XtSetArg (args[n], XmNleftPosition, 21); n++;
500 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
501 XtSetArg (args[n], XmNrightPosition, 39); n++;
502 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
503 XtSetArg (args[n], XmNtopWidget, separator); n++;
504 XtSetArg (args[n], XmNtopOffset, 5); n++;
505 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
506 XtSetArg (args[n], XmNbottomOffset, 5); n++;
507 XtSetArg (args[n], XmNmarginWidth, 4); n++;
508 XtSetArg (args[n], XmNmarginHeight, 4); n++;
509 apply = XmCreatePushButtonGadget (form, "apply", args, n);
510 XtManageChild (apply);
511 XtAddCallback(apply, XmNhelpCallback, HelpRequestCB,
512 HELP_FILTER_DIALOG_STR);
514 XtSetArg (args[0], XmNdefaultButton, apply);
515 XtSetValues (form, args, 1);
517 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(13, 11, "Defaults")));
519 XtSetArg (args[n], XmNlabelString, label_string); n++;
520 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
521 XtSetArg (args[n], XmNleftPosition, 41); n++;
522 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
523 XtSetArg (args[n], XmNrightPosition, 59); n++;
524 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
525 XtSetArg (args[n], XmNtopWidget, separator); n++;
526 XtSetArg (args[n], XmNtopOffset, 5); n++;
527 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
528 XtSetArg (args[n], XmNbottomOffset, 5); n++;
529 XtSetArg (args[n], XmNmarginWidth, 4); n++;
530 XtSetArg (args[n], XmNmarginHeight, 4); n++;
531 reset = XmCreatePushButtonGadget (form, "reset", args, n);
532 XtManageChild (reset);
533 XtAddCallback (reset, XmNactivateCallback, DefaultCallback, (XtPointer) filter_rec);
534 XtAddCallback(reset, XmNhelpCallback, HelpRequestCB,
535 HELP_FILTER_DIALOG_STR);
536 XmStringFree (label_string);
540 XtSetArg (args[n], XmNlabelString, cancelXmString); n++;
541 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
542 XtSetArg (args[n], XmNleftPosition, 61); n++;
543 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
544 XtSetArg (args[n], XmNrightPosition, 79); n++;
545 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
546 XtSetArg (args[n], XmNtopWidget, separator); n++;
547 XtSetArg (args[n], XmNtopOffset, 5); n++;
548 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
549 XtSetArg (args[n], XmNbottomOffset, 5); n++;
550 XtSetArg (args[n], XmNmarginWidth, 4); n++;
551 XtSetArg (args[n], XmNmarginHeight, 4); n++;
552 XtSetArg (args[n], XmNmultiClick, XmMULTICLICK_DISCARD); n++;
553 XtSetArg (args[n], XmNuserData, flag ); n++;
554 close = XmCreatePushButtonGadget (form, "close", args, n);
555 XtAddCallback (close, XmNactivateCallback, CancelCallback, (XtPointer) filter_rec);
556 XtManageChild (close);
557 XtAddCallback(close, XmNhelpCallback, HelpRequestCB,
558 HELP_FILTER_DIALOG_STR);
562 XtSetArg (args[n], XmNlabelString, helpXmString); n++;
563 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
564 XtSetArg (args[n], XmNleftPosition, 81); n++;
565 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
566 XtSetArg (args[n], XmNrightPosition, 99); n++;
567 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
568 XtSetArg (args[n], XmNtopWidget, separator); n++;
569 XtSetArg (args[n], XmNtopOffset, 5); n++;
570 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
571 XtSetArg (args[n], XmNbottomOffset, 5); n++;
572 XtSetArg (args[n], XmNmarginWidth, 4); n++;
573 XtSetArg (args[n], XmNmarginHeight, 4); n++;
574 help = XmCreatePushButtonGadget (form, "help", args, n);
575 XtManageChild (help);
576 XtAddCallback(help, XmNactivateCallback, HelpRequestCB,
577 HELP_FILTER_DIALOG_STR);
578 XtAddCallback(help, XmNhelpCallback, HelpRequestCB,
579 HELP_FILTER_DIALOG_STR);
582 XtSetArg (args[0], XmNcancelButton, close);
583 XtSetValues (form, args, 1);
585 /* Fill in our instance structure */
587 filter_rec->shell = shell;
588 filter_rec->form = form;
589 filter_rec->fileNameFilter = fileNameFilter;
590 filter_rec->hidden = hidden;
591 filter_rec->scrolled_window = fileTypeScrollWin;
592 filter_rec->file_window = file_window;
593 filter_rec->select_all = selectAll;
594 filter_rec->unselect_all = unselectAll;
595 filter_rec->label = labelPt2;
596 filter_rec->cancel = 0x0;
597 filter_rec->previous_filter_data = NULL;
600 filter_rec->apply = apply;
601 filter_rec->reset = reset;
602 filter_rec->close = close;
603 filter_rec->help = help;
605 /* Set the return values for the dialog widget and dialog instance. */
607 *return_widget = form;
608 *dialog = (XtPointer) filter_rec;
614 /************************************************************************
618 ************************************************************************/
622 FilterRec *filter_rec,
623 XtCallbackProc callback,
624 XtPointer client_data )
626 FilterApply * apply_data;
629 /* Setup the callback data to be sent to the Ok callback. */
630 /* This contains the encapsulation callback to invoke upon */
631 /* the data within the dialog being changed. */
633 apply_data = (FilterApply *) XtMalloc (sizeof (FilterApply));
634 apply_data->callback = callback;
635 apply_data->client_data = client_data;
636 apply_data->filter_rec = (XtPointer) filter_rec;
637 filter_rec->apply_data = apply_data;
640 XtAddCallback (filter_rec->apply, XmNactivateCallback,
641 ApplyCallback, (XtPointer) apply_data);
643 XtAddCallback (filter_rec->ok, XmNactivateCallback,
644 OkCallback, (XtPointer) apply_data);
650 /************************************************************************
654 ************************************************************************/
658 FilterRec *filter_rec,
659 XtCallbackProc callback,
660 XtPointer client_data )
662 Atom delete_window_atom;
664 XtAddCallback(filter_rec->close, XmNactivateCallback, callback, client_data);
666 delete_window_atom = XmInternAtom (XtDisplay(filter_rec->shell), "WM_DELETE_WINDOW", True);
667 XmRemoveWMProtocols( filter_rec->shell, &delete_window_atom, 1 );
668 XmAddWMProtocolCallback( filter_rec->shell, delete_window_atom, callback,
669 (XtPointer) client_data );
675 /************************************************************************
679 ************************************************************************/
683 FilterRec *filter_rec )
685 XtDestroyWidget (filter_rec->shell);
686 XtFree ((char *) filter_rec->apply_data);
687 XtFree ((char *) filter_rec);
693 /************************************************************************
697 ************************************************************************/
701 FilterRec *filter_rec )
703 FilterData * filter_data;
705 if( filter_rec->cancel
706 && filter_rec->previous_filter_data )
709 filter_data = filter_rec->previous_filter_data;
710 filter_rec->previous_filter_data = NULL;
716 /* Allocate and initialize the file filter dialog data. */
718 filter_data = (FilterData *) XtMalloc (sizeof (FilterData));
720 filter_data->displayed = True;
722 XtSetArg (args[0], XmNx, &filter_data->x);
723 XtSetArg (args[1], XmNy, &filter_data->y);
724 XtSetArg (args[2], XmNwidth, &filter_data->width);
725 XtSetArg (args[3], XmNheight, &filter_data->height);
726 XtGetValues (filter_rec->shell, args, 4);
728 (void) GetFilterValues (filter_rec, filter_data);
731 filter_rec->cancel = 0x0;
733 return ((XtPointer) filter_data);
739 /************************************************************************
743 ************************************************************************/
746 GetDefaultValues( void )
748 FilterData * filter_data;
750 /* Allocate and initialize the default file filter dialog data. */
752 filter_data = (FilterData *) XtMalloc (sizeof (FilterData));
754 filter_data->displayed = False;
757 filter_data->height = 0;
758 filter_data->width = 0;
759 filter_data->match_flag = True;
760 filter_data->filter = XtNewString(".*");
761 filter_data->show_hidden = False;
762 filter_data->filetypesFilteredCount = 3;
763 filter_data->filetypesFiltered = XtNewString(DEFAULT_FILTER);
764 filter_data->user_data = NULL;
765 filter_data->count = ReadInFiletypes(filter_data);
767 return ((XtPointer) filter_data);
773 /************************************************************************
777 ************************************************************************/
781 XrmDatabase data_base,
784 FilterData * filter_data;
785 static Boolean convertersAdded = False;
788 /* Allocate and get the resources for file filter dialog data. */
790 filter_data = (FilterData *) XtMalloc (sizeof (FilterData));
791 filter_data->user_data = NULL;
793 _DtDialogGetResources (data_base, name_list, FILE_FILTER, (char *)filter_data,
794 resources, filterClass->resource_count);
797 /* Create new strings for any string value we read in from our
801 filter_data->filter = XtNewString(filter_data->filter);
802 filter_data->filetypesFiltered = XtNewString(filter_data->filetypesFiltered);
804 filter_data->count = ReadInFiletypes(filter_data);
806 return ((XtPointer) filter_data);
812 FilterData *filter_data )
814 FilterData * CopiedFilterData;
817 CopiedFilterData = (FilterData *) XtMalloc (sizeof (FilterData));
818 CopiedFilterData->displayed = filter_data->displayed;
819 CopiedFilterData->show_hidden = filter_data->show_hidden;
820 CopiedFilterData->match_flag = filter_data->match_flag;
821 CopiedFilterData->filter = XtNewString( filter_data->filter );
822 CopiedFilterData->filetypesFilteredCount = filter_data->filetypesFilteredCount;
823 CopiedFilterData->filetypesFiltered = XtNewString( filter_data->filetypesFiltered );
824 CopiedFilterData->count = filter_data->count;
825 CopiedFilterData->user_data = (FTData **) XtMalloc(sizeof(FTData *) *
827 for( i = 0; i < filter_data->count; ++i )
829 CopiedFilterData->user_data[i] = (FTData *)XtMalloc(sizeof(FTData));
830 CopiedFilterData->user_data[i]->filetype =
831 XtNewString( filter_data->user_data[i]->filetype );
832 CopiedFilterData->user_data[i]->index =
833 filter_data->user_data[i]->index;
834 CopiedFilterData->user_data[i]->selected =
835 filter_data->user_data[i]->selected;
837 return CopiedFilterData;
840 /************************************************************************
844 ************************************************************************/
848 FilterRec *filter_rec,
849 FilterData *filter_data )
853 XmManagerWidget mgr = (XmManagerWidget)filter_rec->file_window;
854 int num_children = mgr->composite.num_children;
855 Pixel background_color;
856 Pixel foreground_color;
857 Pixel pixmap_background;
858 Pixel pixmap_foreground;
864 XtWidgetGeometry desired, preferred;
866 PixmapData *pixmapData;
868 filter_rec->cancel = 0x0;
869 if( filter_rec->previous_filter_data )
870 FreeValues( filter_rec->previous_filter_data );
871 filter_rec->previous_filter_data = CopyFilterData( filter_data );
873 XmTextFieldSetString (filter_rec->fileNameFilter, filter_data->filter);
875 if(XmToggleButtonGadgetGetState (*showHiddenMenu))
876 filter_data->show_hidden = True;
878 filter_data->show_hidden = False;
880 if(filter_data->match_flag)
881 XtSetArg (args[0], XmNmenuHistory, filter_rec->hidArray[HIDDEN]);
883 XtSetArg (args[0], XmNmenuHistory, filter_rec->hidArray[SHOWN]);
884 XtSetValues(filter_rec->hidden, args, 1);
886 XtSetArg (args[0], XmNbackground, &background_color);
887 XtSetArg (args[1], XmNforeground, &foreground_color);
888 XtSetArg (args[2], XmNtopShadowColor, &pixmap_background);
889 XtSetArg (args[3], XmNbottomShadowColor, &pixmap_foreground);
890 XtGetValues((Widget)mgr, args, 4);
892 for (i = 0, x = 5, count = 0; i < filter_data->count; i++)
896 user_data = filter_data->user_data[i];
898 if (ptr = (char *)DtDtsDataTypeToAttributeValue(user_data->filetype,
902 icon_label = XmStringCreateLocalized(ptr);
903 DtDtsFreeAttributeValue(ptr);
907 icon_label = XmStringCreateLocalized(user_data->filetype);
910 pixmapData = _DtRetrievePixmapData(user_data->filetype,
913 filter_rec->file_window,
917 XtSetArg (args[n], XmNstring, icon_label); n++;
919 XtSetArg (args[n], XmNimageName, pixmapData->iconFileName);
921 XtSetArg (args[n], XmNimageName, NULL); n++;
922 XtSetArg (args[n], XmNunderline, False); n++;
924 XtSetArg (args[n], XmNpixmapPosition, XmPIXMAP_TOP); n++;
925 XtSetArg (args[n], XmNbehavior, XmICON_BUTTON); n++;
926 XtSetArg (args[n], XmNfillMode, XmFILL_PARENT); n++;
928 XtSetArg (args[n], XmNforeground, foreground_color); n++;
929 XtSetArg (args[n], XmNarmColor, white_pixel); n++;
930 if (background_color == white_pixel)
932 XtSetArg (args[n], XmNbackground, white_pixel); n++;
933 XtSetArg (args[n], XmNpixmapBackground, white_pixel); n++;
934 XtSetArg (args[n], XmNpixmapForeground, black_pixel); n++;
936 else if (background_color == black_pixel)
938 XtSetArg (args[n], XmNbackground, black_pixel); n++;
939 XtSetArg (args[n], XmNpixmapBackground, white_pixel); n++;
940 XtSetArg (args[n], XmNpixmapForeground, black_pixel); n++;
944 XtSetArg (args[n], XmNbackground, background_color); n++;
945 XtSetArg (args[n], XmNpixmapBackground, pixmap_background); n++;
946 XtSetArg (args[n], XmNpixmapForeground, pixmap_foreground); n++;
949 if (i - count < num_children)
951 icon_widget = mgr->composite.children[i - count];
952 XtSetArg (args[n], XmNx, x); n++;
953 XtSetArg (args[n], XmNy, 5); n++;
954 XtSetArg (args[n], XmNuserData, user_data); n++;
955 XtSetValues(icon_widget, args, n);
956 XtRemoveAllCallbacks (icon_widget, XmNcallback);
961 XtSetArg (args[n], XmNx, x); n++;
962 XtSetArg (args[n], XmNy, 5); n++;
963 XtSetArg (args[n], XmNshadowThickness, 2); n++;
964 XtSetArg (args[n], XmNfontList, user_font); n++;
965 if(keybdFocusPolicy == XmEXPLICIT)
967 XtSetArg (args[n], XmNtraversalOn, True); n++;
971 XtSetArg (args[n], XmNtraversalOn, False); n++;
972 XtSetArg (args[n], XmNhighlightThickness, 0); n++;
974 XtSetArg (args[n], XmNborderType, DtNON_RECTANGLE); n++;
975 if (mgr->composite.num_children == 0)
977 XtSetArg (args[n], XmNuserData, user_data); n++;
978 icon_widget= _DtCreateIcon ((Widget)mgr, "icon", args, n);
982 icon_widget = _DtDuplicateIcon((Widget)mgr,
983 mgr->composite.children[0],
984 (XmString)args[0].value, (String)args[1].value,
985 (XtPointer)user_data, (Boolean)args[2].value);
987 XtSetArg (args[n], XmNx, x); n++;
988 XtSetArg (args[n], XmNy, 5); n++;
989 XtSetValues(icon_widget, args, n);
991 XtAddCallback(icon_widget, XmNhelpCallback,
992 (XtCallbackProc)HelpRequestCB, NULL);
994 XtAddCallback (icon_widget, XmNcallback, NewFileTypeSelected,
995 (XtPointer)filter_rec);
997 _DtCheckAndFreePixmapData(user_data->filetype,
998 filter_rec->file_window,
999 (DtIconGadget) icon_widget,
1002 XtManageChild(icon_widget);
1003 x += 5 + icon_widget->core.width;
1004 if (icon_widget->core.height > max)
1005 max = icon_widget->core.height;
1007 XmStringFree(icon_label);
1010 for (i = 0, count = 0; i < filter_data->count; i++)
1013 user_data = filter_data->user_data[i];
1015 icon_widget = mgr->composite.children[i - count];
1017 if(filter_data->user_data[i]->selected == True)
1020 /* Draw the selected icon as selected */
1021 if (background_color == white_pixel)
1023 XtSetArg (args[n], XmNbackground, black_pixel); n++;
1024 XtSetArg (args[n], XmNforeground, white_pixel); n++;
1028 XtSetArg (args[n], XmNbackground, white_pixel); n++;
1029 XtSetArg (args[n], XmNforeground, black_pixel); n++;
1032 XtSetArg (args[n], XmNpixmapBackground, white_pixel); n++;
1033 XtSetArg (args[n], XmNpixmapForeground, black_pixel); n++;
1034 XtSetArg (args[n], XmNarmColor, white_pixel); n++;
1035 XtSetValues(icon_widget, args, n);
1040 /* Unmanage any icons left over */
1041 while (i < num_children)
1043 XtUnmanageChild(mgr->composite.children[i]);
1047 /* Line up the titles in all of the icons */
1048 num_children = mgr->composite.num_children;
1049 for (i = 0; i < num_children; i++)
1051 if (XtIsManaged(mgr->composite.children[i]))
1053 if (mgr->composite.children[i]->core.height != max)
1056 XtSetArg(args[n], XmNy,
1057 5 + (max - mgr->composite.children[i]->core.height)); n++;
1058 XtSetValues(mgr->composite.children[i], args, n);
1063 /* Set the height of the scrolled window */
1064 desired.x = filter_rec->scrolled_window->core.x;
1065 desired.y = filter_rec->scrolled_window->core.y;
1066 desired.width = filter_rec->scrolled_window->core.width;
1067 desired.request_mode = (CWWidth);
1068 XtQueryGeometry(filter_rec->scrolled_window, &desired, &preferred);
1070 if (preferred.request_mode & CWWidth)
1072 XtSetArg(args[n], XmNwidth, (XtArgVal) preferred.width);
1075 if (preferred.request_mode & CWHeight)
1077 XtSetArg(args[n], XmNheight, (XtArgVal) preferred.height);
1080 XtSetValues(filter_rec->scrolled_window, args, n);
1087 /************************************************************************
1089 * WriteResourceValues
1091 ************************************************************************/
1094 WriteResourceValues(
1099 FilterData * filter_data = (FilterData *) values->data;
1100 FilterRec * filter_rec;
1104 /* If the dialog is currently displayed, update the geometry */
1105 /* fields to their current values. */
1107 if (filter_data->displayed == True)
1109 _DtGenericUpdateWindowPosition(values);
1110 filter_rec = (FilterRec *) _DtGetDialogInstance (values);
1113 _DtDialogPutResources (fd, name_list, FILE_FILTER, values->data,
1114 resources, filterClass->resource_count);
1120 /************************************************************************
1124 ************************************************************************/
1128 FilterData *filter_data )
1132 for( i = 0; i < filter_data->count; i++)
1134 if(filter_data->user_data[i]->filetype)
1135 XtFree ((char *)filter_data->user_data[i]->filetype);
1136 XtFree ((char *)filter_data->user_data[i]);
1138 XtFree ((char *)filter_data->user_data);
1139 XtFree ((char *) filter_data->filter);
1140 XtFree ((char *) filter_data->filetypesFiltered);
1141 XtFree ((char *) filter_data);
1146 /************************************************************************
1150 ************************************************************************/
1155 XtPointer client_data,
1156 XtPointer call_data )
1158 FilterRec * filter_rec = (FilterRec *) client_data;
1159 DialogData * dialog_data;
1160 FilterData * filter_data;
1165 /* Get the instance and data for the dialog */
1167 dialog_data = _DtGetInstanceData ((XtPointer)filter_rec);
1168 filter_data = (FilterData *) dialog_data->data;
1170 filter_data->show_hidden = False;
1172 XtSetArg (args[0], XmNmenuHistory, filter_rec->hidArray[HIDDEN]);
1173 XtSetValues(filter_rec->hidden, args, 1);
1174 filter_data->match_flag = True;
1176 XmToggleButtonGadgetSetState(*showHiddenMenu, False, False);
1178 XtFree( filter_data->filter );
1179 filter_data->filter = XtNewString(".*");
1181 filter_data->filetypesFilteredCount = 3;
1182 XtFree( filter_data->filetypesFiltered );
1183 filter_data->filetypesFiltered = XtNewString( DEFAULT_FILTER );
1185 filter_data->count = ReadInFiletypes(filter_data);
1187 /* Display the new type */
1188 SetValues (filter_rec, filter_data);
1191 /************************************************************************
1195 ************************************************************************/
1200 XtPointer client_data,
1201 XtPointer call_data )
1203 FilterRec * filter_rec = (FilterRec *) client_data;
1205 filter_rec->cancel = 0x1;
1208 /************************************************************************
1211 * This is a callback function called when the (Ok) button
1212 * is pressed. It saves the new file filter data internally and
1213 * then calls the encapsulations callback function. It then closes
1216 ************************************************************************/
1221 XtPointer client_data,
1222 XtPointer call_data )
1224 FilterRec * filter_rec = (FilterRec *) ((FilterApply *)client_data)->filter_rec;
1225 DialogData * dialog_data;
1226 Widget close = filter_rec->close;
1228 if(RecheckFlag(NULL,w))
1230 else if(RecheckFlag(NULL,close))
1233 ApplyCallback(w, client_data, call_data);
1234 dialog_data = _DtGetInstanceData ((XtPointer)filter_rec);
1235 ResetFlag(NULL,close);
1236 XtCallCallbacks(filter_rec->close, XmNactivateCallback,
1237 (XtPointer)dialog_data);
1241 /************************************************************************
1244 * This is a callback function called when the (Apply) button
1245 * is pressed. It saves the new file filter data internally and
1246 * then calls the encapsulations callback function.
1248 ************************************************************************/
1253 XtPointer client_data,
1254 XtPointer call_data )
1256 FilterRec * filter_rec;
1257 DialogData * dialog_data;
1258 FilterData * filter_data;
1259 FilterData * new_filter_data;
1260 XmManagerWidget mgr;
1266 filter_rec = (FilterRec *) ((FilterApply *) client_data)->filter_rec;
1267 dialog_data = _DtGetInstanceData ((XtPointer)filter_rec);
1268 filter_data = (FilterData *) dialog_data->data;
1269 new_filter_data = (FilterData *) XtMalloc (sizeof (FilterData));
1270 mgr = (XmManagerWidget)filter_rec->file_window;
1271 num_children = mgr->composite.num_children;
1273 GetFilterValues (filter_rec, new_filter_data);
1274 FreeValues (filter_data);
1275 dialog_data->data = (XtPointer) new_filter_data;
1277 if( filter_rec->previous_filter_data )
1278 FreeValues( filter_rec->previous_filter_data );
1279 filter_rec->previous_filter_data = CopyFilterData( new_filter_data );
1281 /* Need to update 'userData' for each of the icons */
1282 for (i = 0, count = 0; i < num_children &&
1283 i + count < new_filter_data->count; i++)
1285 XtSetArg (args[0], XmNuserData, new_filter_data->user_data[i + count]);
1286 XtSetValues(mgr->composite.children[i], args, 1);
1288 (*(((FilterApply *)client_data)->callback)) (w, ((FilterApply *)client_data)->client_data, NULL);
1293 /************************************************************************
1296 * Update the current file filter values within the data structure
1297 * from the current toggle button values.
1299 ************************************************************************/
1303 FilterRec *filter_rec,
1304 FilterData *filter_data )
1309 DialogData * dialog_data;
1310 FilterData * old_filter_data;
1312 filter_data->displayed = True;
1314 filter_data->filter = XmTextFieldGetString (filter_rec->fileNameFilter);
1316 XmToggleButtonGadgetSetState(*showHiddenMenu, False, False);
1317 filter_data->show_hidden = False;
1319 XtSetArg (args[0], XmNmenuHistory, &menuHistory);
1320 XtGetValues (filter_rec->hidden, args, 1);
1322 if(menuHistory == filter_rec->hidArray[HIDDEN])
1323 filter_data->match_flag = True;
1325 filter_data->match_flag = False;
1327 filter_data->filetypesFiltered = NULL;
1328 filter_data->filetypesFilteredCount = 0;
1329 dialog_data = _DtGetInstanceData ((XtPointer)filter_rec);
1330 if(dialog_data != NULL)
1332 old_filter_data = (FilterData *) dialog_data->data;
1333 filter_data->count = old_filter_data->count;
1334 filter_data->user_data = (FTData **) XtMalloc(sizeof(FTData *) *
1335 filter_data->count);
1337 for( i = 0; i < filter_data->count; i++)
1339 /* Copy current value from the old dialog values */
1340 filter_data->user_data[i] = (FTData *)XtMalloc(sizeof(FTData));
1341 filter_data->user_data[i]->filetype =
1342 XtNewString(old_filter_data->user_data[i]->filetype);
1343 filter_data->user_data[i]->index =
1344 old_filter_data->user_data[i]->index;
1345 filter_data->user_data[i]->selected =
1346 old_filter_data->user_data[i]->selected;
1348 if((filter_data->user_data[i]->selected == True &&
1349 filter_data->match_flag) ||
1350 (filter_data->user_data[i]->selected == False &&
1351 !filter_data->match_flag))
1353 if(filter_data->filetypesFiltered == NULL)
1355 filter_data->filetypesFiltered =
1356 XtNewString(filter_data->user_data[i]->filetype);
1360 filter_data->filetypesFiltered = (char *)XtRealloc(
1361 (char *)filter_data->filetypesFiltered,
1362 strlen(filter_data->filetypesFiltered) +
1363 strlen(filter_data->user_data[i]->filetype) + 2);
1365 strcat(filter_data->filetypesFiltered, ",");
1366 strcat(filter_data->filetypesFiltered,
1367 filter_data->user_data[i]->filetype);
1369 filter_data->filetypesFilteredCount++;
1382 XtPointer client_data,
1386 FilterData *filter_data;
1387 FileMgrData *file_mgr_data;
1388 FileMgrRec *file_mgr_rec;
1389 FilterRec *filter_rec;
1390 DialogData *dialog_data;
1394 if ((XtArgVal)client_data == FM_POPUP)
1397 mbar = (Widget)XmGetPostedFromWidget(XtParent(w));
1398 XmUpdateDisplay (w);
1400 XtSetArg(args[0], XmNuserData, &file_mgr_rec);
1401 XtGetValues(mbar, args, 1);
1403 dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec);
1404 file_mgr_data = (FileMgrData *) dialog_data->data;
1406 filter_data = (FilterData *)(file_mgr_data->filter_active->data);
1407 if (file_mgr_data->show_hid_enabled)
1409 filter_data->show_hidden = False;
1410 file_mgr_data->show_hid_enabled = False;
1414 filter_data->show_hidden = True;
1415 file_mgr_data->show_hid_enabled = True;
1418 filter_rec = (FilterRec *)_DtGetDialogInstance( file_mgr_data->filter_edit );
1420 /* Refilter the contents of the current directory */
1422 FileMgrRedisplayFiles (file_mgr_rec, file_mgr_data, False);
1429 FilterData *filter_data)
1436 char *filtered_types, *file_type;
1439 if (filter_data->user_data)
1441 for(i=0; i<filter_data->count; i++)
1443 XtFree(filter_data->user_data[i]->filetype);
1444 XtFree((char *)filter_data->user_data[i]);
1446 XtFree((char *)filter_data->user_data);
1447 filter_data->user_data = NULL;
1448 filter_data->count = 0;
1451 file_types = (char **) DtDtsDataTypeNames();
1453 while(file_types[i])
1455 /* filter out invisible types and actions */
1456 if((_DtCheckForDataTypeProperty(file_types[i], "invisible")) ||
1457 (DtDtsDataTypeIsAction(file_types[i])))
1463 if (count == count_size)
1467 filter_data->user_data =
1468 (FTData **) XtRealloc ((char *)filter_data->user_data,
1469 sizeof (FTData *) * count_size);
1472 user_data = (FTData *)XtMalloc(sizeof(FTData));
1473 user_data->index = count;
1474 user_data->selected = False;
1475 user_data->filetype = XtNewString(file_types[i]);
1477 filter_data->user_data[count] = user_data;
1482 DtDtsFreeDataTypeNames(file_types);
1484 qsort( filter_data->user_data, count, sizeof( FTData *), (int (*)())FileTypeAscending );
1486 filtered_types = filter_data->filetypesFiltered;
1487 for(i = 0; i < filter_data->filetypesFilteredCount; i++)
1489 file_type = filtered_types;
1490 filtered_types = DtStrchr(filtered_types, ',');
1492 if(filter_data->filetypesFilteredCount - 1 != i)
1493 *filtered_types = '\0';
1495 for(j = 0; j < count; j++)
1497 if(strcmp(file_type, filter_data->user_data[j]->filetype) == 0)
1499 filter_data->user_data[j]->selected = True;
1504 if(filter_data->filetypesFilteredCount - 1 != i)
1506 *filtered_types = ',';
1510 if(!filter_data->match_flag)
1512 for(j = 0; j < count; j++)
1514 if(filter_data->user_data[j]->selected == True)
1515 filter_data->user_data[j]->selected = False;
1517 filter_data->user_data[j]->selected = True;
1526 * Whenever the database files are reread, we must update the filter
1527 * values, since the indices of the filetypes may have changed.
1531 UpdateFilterAfterDBReread (
1532 DialogData * dialog_data )
1537 XmManagerWidget mgr;
1539 FilterData * new_filter_data;
1540 FilterData * filter_data;
1541 FilterRec * filter_rec;
1544 filter_data = (FilterData *) dialog_data->data;
1545 new_filter_data = (FilterData *) XtMalloc (sizeof (FilterData));
1547 if (filter_rec = (FilterRec *) _DtGetDialogInstance(dialog_data))
1549 /* Dialog is posted */
1550 result = GetFilterValues (filter_rec, new_filter_data);
1553 XtFree(new_filter_data->filetypesFiltered);
1554 new_filter_data->filetypesFiltered =
1555 XtNewString(filter_data->filetypesFiltered);
1556 new_filter_data->filetypesFilteredCount =
1557 filter_data->filetypesFilteredCount;
1558 FreeValues (filter_data);
1559 dialog_data->data = (XtPointer) new_filter_data;
1560 filter_data = new_filter_data;
1564 /* Reload the filetype information */
1565 filter_data->count = ReadInFiletypes(filter_data);
1567 if (filter_rec && result)
1569 /* Need to update 'userData' for each of the icons */
1570 mgr = (XmManagerWidget)filter_rec->file_window;
1571 num_children = mgr->composite.num_children;
1572 for (i = 0, count = 0; i < num_children &&
1573 i + count < filter_data->count; i++)
1575 XtSetArg (args[0], XmNuserData, new_filter_data->user_data[i]);
1576 XtSetValues(mgr->composite.children[i], args, 1);
1578 /* Display the new type */
1579 SetValues (filter_rec, filter_data);
1586 XtPointer client_data,
1587 XtPointer call_data )
1590 FilterRec * filter_rec = (FilterRec *) client_data;
1591 DialogData * dialog_data;
1592 FilterData * filter_data;
1594 XmString label_string;
1596 /* Get the instance and data for the dialog */
1597 dialog_data = _DtGetInstanceData ((XtPointer)filter_rec);
1598 filter_data = (FilterData *) dialog_data->data;
1600 XtSetArg (args[0], XmNmenuHistory, &menuHistory);
1601 XtGetValues (filter_rec->hidden, args, 1);
1603 if(menuHistory == filter_rec->hidArray[HIDDEN])
1605 filter_data->match_flag = True;
1606 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(13,26,
1607 "Also hide (Optional): ")));
1611 filter_data->match_flag = False;
1612 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(13,29,
1613 "Also show (Optional): ")));
1615 XtSetArg (args[0], XmNlabelString, label_string);
1616 XtSetValues( filter_rec->label, args, 1 );
1618 XmStringFree( label_string );
1619 XmUpdateDisplay( filter_rec->label );
1627 return strcmp( (*t1)->filetype, (*t2)->filetype );
1635 Cardinal *num_params )
1637 FilterRec * filterRec;
1639 sscanf( params[0], "%p", (void **) &filterRec );
1640 SelectAllFileTypes( w, (XtPointer)filterRec, NULL );
1649 Cardinal *num_params )
1651 FilterRec * filterRec;
1653 sscanf( params[0], "%p", (void **) &filterRec );
1654 UnselectAllFileTypes( w, (XtPointer)filterRec, NULL );