1 /* Reference Manager      */
2 /* by Harald M. Stauss    */
3 /* Main Module            */
4 /* Last change 30.04.2003 */
5 
6 #include <Xm/MainW.h>
7 #include <Xm/RowColumn.h>
8 #include <Xm/CascadeB.h>
9 #include <Xm/SeparatoG.h>
10 #include <Xm/PushBG.h>
11 #include <Xm/ToggleBG.h>
12 #include <Xm/List.h>
13 #include <Xm/FileSB.h>
14 #include <Xm/Label.h>
15 #include <Xm/MessageB.h>
16 #include <Xm/Text.h>
17 #include <X11/Xmu/Editres.h>
18 #include <stdio.h>
19 
20 #include "nrutil.c"
21 #include "sort.c"
22 #include "mybiblio.h"
23 
24 #define VERSION "BibTeX Manager, Ver. 1.7"
25 
26 /*   G l o b a l   V a r i a b e l s                           */
27 /* key: pointer to an array of unsigned long                   */
28 /*      index of key = number of element in Widget liste       */
29 /*      value of key = index to citation in CLASS BIBLIO b     */
30 /*      element 0 in key gives the number of elements in key   */
31 
32 #define N_INPUT_FILTER 5   /* number of input filters */
33 
34 /* Structure for menu system */
35 typedef struct {
36   Widget f_menu;
37   Widget f_new;
38   Widget f_load;
39   Widget f_save;
40   Widget f_print;
41   Widget f_quit;
42 } f_menu;
43 
44 typedef struct {
45   Widget e_menu;
46   Widget e_add;
47   Widget e_edit;
48   Widget e_delete;
49   Widget e_reduce;
50 } e_menu;
51 
52 typedef struct {
53   Widget s_menu;
54   Widget s_searchall;
55   Widget s_and;
56   Widget s_or;
57   Widget s_not;
58   Widget s_showall;
59   Widget s_case;
60 } s_menu;
61 
62 typedef struct {
63   f_menu file;
64   e_menu edit;
65   s_menu search;
66 } main_menu;
67 
68 
69 XtAppContext  app;
70 MYBIBLIO      b;
71 unsigned long *key;
72 char          *database;
73 Widget        toplevel;
74 Widget        liste;
75 Widget        message;
76 main_menu     mymenu;
77 
78 int
main(int argc,char * argv[])79 main(int argc, char *argv[])
80 {
81   Widget        main_w, menubar, PullDown;
82 
83   void file_cb(Widget, XtPointer, XtPointer);
84   void edit_cb(Widget, XtPointer, XtPointer);
85   void search_cb(Widget, XtPointer, XtPointer);
86   void set_message(unsigned long);
87 
88   /* toplevel */
89   toplevel = XtVaAppInitialize (&app, "XmBibTeX", NULL, 0,
90 				&argc, argv, NULL, NULL);
91   XtVaSetValues(toplevel,
92 		XmNtitle, VERSION,
93 		NULL);
94 
95   XtAddEventHandler(toplevel, (EventMask)0, True,
96 		    _XEditResCheckMessages, NULL);
97   /* mainwindow */
98   main_w=XtVaCreateManagedWidget("main_w", xmMainWindowWidgetClass, toplevel,
99 				 XmNheight, 400,
100 				 XmNwidth, 600,
101 				 NULL);
102   liste=XtVaCreateManagedWidget("reflist", xmListWidgetClass, main_w,
103 				XmNvisibleItemCount, 10,
104 				NULL);
105 
106 
107   /* messagearea */
108   message = XtVaCreateManagedWidget("message", xmLabelWidgetClass, main_w,
109 				    XmNalignment, XmALIGNMENT_BEGINNING,
110 				    XmNlabelString, XmStringCreateLocalized(" "),
111 				    NULL);
112   XtVaSetValues(main_w, XmNmessageWindow, message, NULL);
113   set_message(0);
114 
115   /* menusystem */
116   menubar = XmCreateMenuBar(main_w, "menubar", NULL, 0);
117   /*   F i l e m e n u   */;
118   PullDown=XmCreatePulldownMenu(menubar, "FilePullDown", NULL,0);
119   mymenu.file.f_menu=XtVaCreateManagedWidget("File",
120 					     xmCascadeButtonWidgetClass, menubar,
121 					     XmNlabelString, XmStringCreateLocalized("File"),
122 					     XmNmnemonic, 'F',
123 					     XmNsubMenuId, PullDown,
124 					     NULL);
125   mymenu.file.f_new=XtVaCreateManagedWidget("New",
126 					    xmPushButtonGadgetClass, PullDown,
127 					    XmNmnemonic, 'N',
128 					    NULL);
129   XtAddCallback(mymenu.file.f_new, XmNactivateCallback, file_cb, (XtPointer)0);
130   mymenu.file.f_load=XtVaCreateManagedWidget("Load",
131 					     xmPushButtonGadgetClass, PullDown,
132 					     XmNmnemonic, 'L',
133 					     NULL);
134   XtAddCallback(mymenu.file.f_load, XmNactivateCallback, file_cb, (XtPointer)1);
135   mymenu.file.f_save=XtVaCreateManagedWidget("Save",
136 					     xmPushButtonGadgetClass, PullDown,
137 					     XmNmnemonic, 'S',
138 					     NULL);
139   XtAddCallback(mymenu.file.f_save, XmNactivateCallback, file_cb, (XtPointer)2);
140   XtVaCreateManagedWidget("separator", xmSeparatorGadgetClass, PullDown, NULL);
141   mymenu.file.f_print=XtVaCreateManagedWidget("Print",
142 					      xmPushButtonGadgetClass, PullDown,
143 					      XmNmnemonic, 'P',
144 					      NULL);
145   XtAddCallback(mymenu.file.f_print, XmNactivateCallback, file_cb, (XtPointer)3);
146   XtVaCreateManagedWidget("separator", xmSeparatorGadgetClass, PullDown, NULL);
147   mymenu.file.f_quit=XtVaCreateManagedWidget("Quit",
148 					     xmPushButtonGadgetClass, PullDown,
149 					     XmNmnemonic, 'Q',
150 					     NULL);
151   XtAddCallback(mymenu.file.f_quit, XmNactivateCallback, file_cb, (XtPointer)4);
152   /*   E d i t m e n u   */;
153   PullDown=XmCreatePulldownMenu(menubar, "EditPullDown", NULL,0);
154   mymenu.edit.e_menu=XtVaCreateManagedWidget("Edit",
155 					     xmCascadeButtonWidgetClass, menubar,
156 					     XmNlabelString, XmStringCreateLocalized("Edit"),
157 					     XmNmnemonic, 'E',
158 					     XmNsubMenuId, PullDown,
159 					     NULL);
160   mymenu.edit.e_add=XtVaCreateManagedWidget("Add reference",
161 					    xmPushButtonGadgetClass, PullDown,
162 					    XmNmnemonic, 'A',
163 					    NULL);
164   XtAddCallback(mymenu.edit.e_add, XmNactivateCallback, edit_cb, (XtPointer)0);
165   mymenu.edit.e_edit=XtVaCreateManagedWidget("Edit reference",
166 					     xmPushButtonGadgetClass, PullDown,
167 					     XmNmnemonic, 'E',
168 					     NULL);
169   XtAddCallback(mymenu.edit.e_edit, XmNactivateCallback, edit_cb, (XtPointer)1);
170   mymenu.edit.e_delete=XtVaCreateManagedWidget("Delete reference",
171 					       xmPushButtonGadgetClass, PullDown,
172 					       XmNmnemonic, 'D',
173 					       NULL);
174   XtAddCallback(mymenu.edit.e_delete, XmNactivateCallback, edit_cb, (XtPointer)2);
175   XtVaCreateManagedWidget("separator", xmSeparatorGadgetClass, PullDown, NULL);
176   mymenu.edit.e_reduce=XtVaCreateManagedWidget("Reduce to listed references",
177 					       xmPushButtonGadgetClass, PullDown,
178 					       XmNmnemonic, 'R',
179 					       NULL);
180   XtAddCallback(mymenu.edit.e_reduce, XmNactivateCallback, edit_cb, (XtPointer)3);
181   /*   S e a r c h m e n u   */;
182   PullDown=XmCreatePulldownMenu(menubar, "SearchPullDown", NULL,0);
183   mymenu.search.s_menu=XtVaCreateManagedWidget("Search",
184 					       xmCascadeButtonWidgetClass, menubar,
185 					       XmNlabelString, XmStringCreateLocalized("Search"),
186 					       XmNmnemonic, 'S',
187 					       XmNsubMenuId, PullDown,
188 					       NULL);
189   mymenu.search.s_searchall=XtVaCreateManagedWidget("Search in all fields",
190 						    xmPushButtonGadgetClass, PullDown,
191 						    XmNmnemonic, 'S',
192 						    NULL);
193   XtAddCallback(mymenu.search.s_searchall, XmNactivateCallback, search_cb, (XtPointer)0);
194   XtVaCreateManagedWidget("separator", xmSeparatorGadgetClass, PullDown, NULL);
195   mymenu.search.s_and=XtVaCreateManagedWidget("AND",
196 					      xmPushButtonGadgetClass, PullDown,
197 					      XmNmnemonic, 'A',
198 					      NULL);
199   XtAddCallback(mymenu.search.s_and, XmNactivateCallback, search_cb, (XtPointer)1);
200   mymenu.search.s_or=XtVaCreateManagedWidget("OR",
201 					     xmPushButtonGadgetClass, PullDown,
202 					     XmNmnemonic, 'O',
203 					     NULL);
204   XtAddCallback(mymenu.search.s_or, XmNactivateCallback, search_cb, (XtPointer)2);
205   mymenu.search.s_not=XtVaCreateManagedWidget("NOT",
206 					      xmPushButtonGadgetClass, PullDown,
207 					      XmNmnemonic, 'N',
208 					      NULL);
209   XtAddCallback(mymenu.search.s_not, XmNactivateCallback, search_cb, (XtPointer)3);
210   XtVaCreateManagedWidget("separator", xmSeparatorGadgetClass, PullDown, NULL);
211   mymenu.search.s_showall=XtVaCreateManagedWidget("View all references",
212 						  xmPushButtonGadgetClass, PullDown,
213 						  XmNmnemonic, 'V',
214 						  NULL);
215   XtAddCallback(mymenu.search.s_showall, XmNactivateCallback, search_cb, (XtPointer)4);
216   XtVaCreateManagedWidget("separator", xmSeparatorGadgetClass, PullDown, NULL);
217   mymenu.search.s_case=XtVaCreateManagedWidget("Case sensitive",
218 					       xmToggleButtonGadgetClass, PullDown,
219 					       XmNmnemonic, 'C',
220 					       NULL);
221   XtAddCallback(mymenu.search.s_case, XmNvalueChangedCallback, search_cb, (XtPointer)5);
222 
223   XtSetSensitive(mymenu.file.f_new,False);
224   XtSetSensitive(mymenu.file.f_save,False);
225   XtSetSensitive(mymenu.file.f_print,False);
226   XtSetSensitive(mymenu.edit.e_edit,False);
227   XtSetSensitive(mymenu.edit.e_delete,False);
228   XtSetSensitive(mymenu.edit.e_reduce,False);
229   XtSetSensitive(mymenu.search.s_searchall,False);
230   XtSetSensitive(mymenu.search.s_and,False);
231   XtSetSensitive(mymenu.search.s_or,False);
232   XtSetSensitive(mymenu.search.s_not,False);
233   XtSetSensitive(mymenu.search.s_showall,False);
234   XtSetSensitive(mymenu.search.s_case,False);
235 
236   XtManageChild(menubar);
237   XmMainWindowSetAreas(main_w, menubar, NULL, NULL, NULL, liste);
238 
239   /* setup arrays */
240   database=new char[255];
241   key=new unsigned long[1];
242   key[0]=0;
243 
244   XtRealizeWidget (toplevel);
245   XtAppMainLoop (app);
246 }
247 
248 
249 /*   C a l l b a c k   F u n c t i o n s   */
250 
file_cb(Widget widget,XtPointer client_data,XtPointer call_data)251 void file_cb(Widget widget, XtPointer client_data, XtPointer call_data)
252 {
253   extern void load_cb(Widget, XtPointer, XtPointer);
254   extern void ftype_cb(Widget, XtPointer, XtPointer);
255   extern void save_cb(Widget, XtPointer, XtPointer);
256   extern void print_cb(Widget, XtPointer, XtPointer);
257   void fsb_cancel(Widget, XtPointer, XtPointer);
258   void set_message(unsigned long);
259 
260   static Widget fsb_load, ftype, fsb_save, fsb_print;
261   XmStringTable str_list;
262 
263   switch((intptr_t)client_data) {
264   case 0:    // .................................new;
265     XmListDeleteAllItems(liste);
266     key=(unsigned long *)realloc(key, sizeof(unsigned long));
267     key[0]=0;
268     b.~MYBIBLIO();
269     b=*(new MYBIBLIO());
270     XtVaSetValues(toplevel,
271 		  XmNtitle, VERSION,
272 		  NULL);
273     set_message(0);
274     XtSetSensitive(mymenu.file.f_new,False);
275     XtSetSensitive(mymenu.file.f_save,False);
276     XtSetSensitive(mymenu.file.f_print,False);
277     XtSetSensitive(mymenu.edit.e_edit,False);
278     XtSetSensitive(mymenu.edit.e_delete,False);
279     XtSetSensitive(mymenu.edit.e_reduce,False);
280     XtSetSensitive(mymenu.search.s_searchall,False);
281     XtSetSensitive(mymenu.search.s_and,False);
282     XtSetSensitive(mymenu.search.s_or,False);
283     XtSetSensitive(mymenu.search.s_not,False);
284     XtSetSensitive(mymenu.search.s_showall,False);
285     XtSetSensitive(mymenu.search.s_case,False);
286     break;
287   case 1:    // ..................................load;
288     if (!fsb_load) {
289       fsb_load=XmCreateFileSelectionDialog(toplevel, "filesb", NULL, 0);
290       XtAddCallback(fsb_load,XmNokCallback, load_cb, NULL);
291       XtAddCallback(fsb_load,XmNcancelCallback, fsb_cancel, NULL);
292       str_list=(XmStringTable) XtMalloc(N_INPUT_FILTER*sizeof(XmString));
293       str_list[0]=XmStringCreateLocalized("BibTeX");
294       str_list[1]=XmStringCreateLocalized("Medline Ovid");
295       str_list[2]=XmStringCreateLocalized("Medline Spirs");
296       str_list[3]=XmStringCreateLocalized("Medline PubMed");
297       str_list[4]=XmStringCreateLocalized("Inspec");
298       ftype=XmCreateScrolledList(fsb_load, "filetype", NULL, 0);
299       XtVaSetValues(ftype,
300 		    XmNselectionPolicy, XmSINGLE_SELECT,
301 		    XmNvisibleItemCount, 3,
302 		    XmNitemCount, N_INPUT_FILTER,
303 		    XmNitems, str_list,
304 		    NULL);
305       XtAddCallback(ftype, XmNsingleSelectionCallback, ftype_cb, NULL);
306       XmListSelectPos(ftype, 1, True);
307       XtFree((char *)str_list);
308     }
309     XtManageChild(ftype);
310     XtManageChild(fsb_load);
311     XtPopup (XtParent(fsb_load), XtGrabNone);
312     break;
313   case 2:    // ..................................save;
314     if (!fsb_save) {
315       fsb_save=XmCreateFileSelectionDialog(toplevel, "filesb", NULL, 0);
316       XtAddCallback(fsb_save,XmNokCallback, save_cb, NULL);
317       XtAddCallback(fsb_save,XmNcancelCallback, fsb_cancel, NULL);
318       XtVaSetValues(XtParent(fsb_save),
319 		    XmNtitle, "Save Database",
320 		    NULL);
321     }
322     XtManageChild(fsb_save);
323     break;
324   case 3:    // ...................................print;
325     if (!fsb_print) {
326       fsb_print=XmCreateFileSelectionDialog(toplevel, "filesb", NULL, 0);
327       XtAddCallback(fsb_print,XmNokCallback, print_cb, NULL);
328       XtAddCallback(fsb_print,XmNcancelCallback, fsb_cancel, NULL);
329       XtVaSetValues(XtParent(fsb_print),
330 		    XmNtitle, "Save LaTeX",
331 		    NULL);
332     }
333     XtManageChild(fsb_print);
334     break;
335   case 4:    // ...................................quit;
336     delete[]key;
337     delete[]database;
338     XtDestroyWidget(toplevel);
339     exit(0);
340     break;
341   }
342 }
343 
ftype_cb(Widget widget,XtPointer client_data,XtPointer call_data)344 void ftype_cb(Widget widget, XtPointer client_data, XtPointer call_data) {
345   XmListCallbackStruct *cbs=(XmListCallbackStruct *) call_data;
346   Widget fsbox=XtParent(XtParent(widget));
347   char *choice, tit[80];
348 
349   XmStringGetLtoR(cbs->item, XmFONTLIST_DEFAULT_TAG, &choice);
350   XtVaSetValues(fsbox,
351 		XmNuserData, cbs->item_position,
352 		NULL);
353   strcpy(tit,"Load "); strcat(tit, choice);
354   XtVaSetValues(XtParent(fsbox),
355 		XmNtitle, tit,
356 		NULL);
357 }
358 
359 
fsb_cancel(Widget widget,XtPointer client_data,XtPointer call_data)360 void fsb_cancel(Widget widget, XtPointer client_data, XtPointer call_data) {
361   XtUnmanageChild(widget);
362 }
363 
edit_cb(Widget widget,XtPointer client_data,XtPointer call_data)364 void edit_cb(Widget widget, XtPointer client_data, XtPointer call_data)
365 {
366   unsigned long listid, n, nk;
367   short         islisted;
368   int           *pos_list, pos_cnt;
369   int           rc, i;
370   char          *ref;
371   XmStringTable str_list;
372 
373   extern int    c_refform(short, short);
374   unsigned long find_freekey(unsigned long);
375   void          set_message(unsigned long);
376 
377   ref    =new char[100];
378   str_list=(XmStringTable) XtMalloc(sizeof(XmString));
379 
380   switch((intptr_t)client_data) {
381   case 0:  // ................................add new reference
382     b.ClearDummy();
383     b.d->doctype=(char *)realloc(b.d->doctype, sizeof("article")+1);
384     strcpy(b.d->doctype, "article");
385     b.d->id=find_freekey(b.last);
386     if (c_refform(0,0)) {
387       b.add_citation();
388       key[0]++;
389       key=(unsigned long *)realloc(key,(key[0]+1)*sizeof(unsigned long));
390       key[key[0]]=b.last-1;
391       b.FromDummy(key[key[0]]);
392       sprintf(ref,"%u %.15s %.30s %.15s %.4s",
393 	      b.c[key[key[0]]]->id,
394 	      b.c[key[key[0]]]->author,
395 	      b.c[key[key[0]]]->title,
396 	      b.c[key[key[0]]]->journal,
397 	      b.c[key[key[0]]]->year);
398       str_list[0]=XmStringCreateLocalized(ref);
399       XmListAddItems(liste,str_list,1,0);
400       set_message(b.last);
401       if (b.last>0) {
402 	XtSetSensitive(mymenu.file.f_new,True);
403 	XtSetSensitive(mymenu.file.f_save,True);
404 	XtSetSensitive(mymenu.file.f_print,True);
405 	XtSetSensitive(mymenu.edit.e_edit,True);
406 	XtSetSensitive(mymenu.edit.e_delete,True);
407 	XtSetSensitive(mymenu.edit.e_reduce,True);
408 	XtSetSensitive(mymenu.search.s_searchall,True);
409 	XtSetSensitive(mymenu.search.s_and,True);
410 	XtSetSensitive(mymenu.search.s_or,True);
411 	XtSetSensitive(mymenu.search.s_not,True);
412 	XtSetSensitive(mymenu.search.s_showall,True);
413 	XtSetSensitive(mymenu.search.s_case,True);
414       }
415     }
416     break;
417   case 1:  // ................................edit reference
418     if(XmListGetSelectedPos(liste,&pos_list,&pos_cnt) && pos_cnt>0) {
419       listid=pos_list[0];
420       XtFree((char *)pos_list);
421       b.ToDummy(key[listid]);
422       if (c_refform(b.DocTypeN(key[listid]),1)) {
423 	b.FromDummy(key[listid]);
424 	sprintf(ref,"%u %.15s %.30s %.15s %.4s",
425 	    b.c[key[listid]]->id,
426 	    b.c[key[listid]]->author,
427 	    b.c[key[listid]]->title,
428 	    b.c[key[listid]]->journal,
429 	    b.c[key[listid]]->year);
430 	str_list[0]=XmStringCreateLocalized(ref);
431 	XmListReplaceItemsPos(liste,str_list,1,listid);
432       }
433     }
434     break;
435   case 2:  // ................................delete reference
436     if(XmListGetSelectedPos(liste,&pos_list,&pos_cnt) && pos_cnt>0) {
437       listid=pos_list[0];
438       XtFree((char *)pos_list);
439       b.del_citation(key[listid]);
440       for (n=listid; n<key[0]; n++) key[n]=key[n+1]-1;
441       key[0]--;
442       key=(unsigned long *)realloc(key,(key[0]+1)*sizeof(unsigned long));
443       XmListDeletePos(liste,listid);
444       set_message(key[0]);
445       if (b.last==0) {
446 	XtSetSensitive(mymenu.file.f_new,False);
447 	XtSetSensitive(mymenu.file.f_save,False);
448 	XtSetSensitive(mymenu.file.f_print,False);
449 	XtSetSensitive(mymenu.edit.e_edit,False);
450 	XtSetSensitive(mymenu.edit.e_delete,False);
451 	XtSetSensitive(mymenu.edit.e_reduce,False);
452 	XtSetSensitive(mymenu.search.s_searchall,False);
453 	XtSetSensitive(mymenu.search.s_and,False);
454 	XtSetSensitive(mymenu.search.s_or,False);
455 	XtSetSensitive(mymenu.search.s_not,False);
456 	XtSetSensitive(mymenu.search.s_showall,False);
457 	XtSetSensitive(mymenu.search.s_case,False);
458       }
459     }
460     break;
461   case 3:  // ................................reduce to listed references
462     for (n=0; n<b.last; n++) {
463       // ...................................... already selected ? ;
464       islisted=0;
465       for (nk=1; nk<=key[0]; nk++) if (n==key[nk]) islisted=1;
466       // ...................................... if not than delete;
467       if(!islisted) {
468 	b.del_citation(n);
469 	for (nk=1; nk<=key[0]; nk++)
470 	  if (key[nk]>n) key[nk]--;
471 	n--;
472        }
473     }
474 
475     break;
476   }
477 
478   XtFree((char *)str_list);
479   delete[]ref;
480 }
481 
find_freekey(unsigned long limit)482 unsigned long find_freekey(unsigned long limit) {
483   unsigned long i, n, erste;
484   float         *id;
485   char          text[100];
486 
487   if (b.last>0) {
488     if (limit>b.last) limit=b.last;
489     id=new float[limit+1];
490 
491     for(i=0; i<limit; i++) id[i]=b.c[i]->id;
492     sort(limit,id-1);
493 
494     n=(unsigned long)id[0]; erste=0;
495     for(i=0; i<limit; i++) {
496       if(id[i]>n) {
497 	erste=n;
498 	i=limit;
499       }
500       n++;
501     }
502 
503     if (erste==0) erste=(unsigned long)id[limit-1]+1;
504     delete[]id;
505   }
506   else
507     erste=1;
508   return erste;
509 }
510 
set_message(unsigned long nref)511 void set_message(unsigned long nref) {
512   char text[100];
513   sprintf(text,"number of references: %u", nref);
514   XtVaSetValues(message,
515 		XmNlabelString, XmStringCreateLocalized(text),
516 		NULL);
517 }
518 
search_cb(Widget widget,XtPointer client_data,XtPointer call_data)519 void search_cb(Widget widget, XtPointer client_data, XtPointer call_data)
520 {
521   unsigned long n, nk;
522   short         hinzu;
523   int           i;
524   static  int cis=1; // case insensitive
525   unsigned long *gefunden;
526   XmStringTable str_list;
527   char          *ref;
528   Arg           args[5];
529   Widget        mbox, rowcol, w;
530 
531   extern int  c_refform(short, short);
532   extern char *mystrstr(const char *s1, const char *s2, short c);
533   extern void searchall_cb(Widget widget, XtPointer client_data, XtPointer call_data);
534          void set_message(unsigned long);
535 	 void satext_cb(Widget widget, XtPointer client_data, XtPointer call_data);
536 	 void satoggle_cb(Widget widget, XtPointer client_data, XtPointer call_data);
537 
538 
539   gefunden   = new unsigned long[b.last+1];
540   gefunden[0]= 0;
541   ref        = new char[100];
542 
543   switch((intptr_t)client_data) {
544   case 0:    // ................................. search in all fields;
545     i=0;
546     XtSetArg(args[i], XmNtitle, "Search all fields"); i++;
547     XtSetArg(args[i], XmNautoUnmanage, False); i++;
548     XtSetArg(args[i], XmNmessageString,
549 	     XmStringCreateLocalized("Search in all fields for:")); i++;
550     mbox=XmCreateMessageDialog(liste, "mbox", args, i);
551     XtUnmanageChild(XmMessageBoxGetChild(mbox, XmDIALOG_HELP_BUTTON));
552     XtAddCallback(mbox, XmNokCallback, searchall_cb, (XtPointer)cis);
553     XtAddCallback(mbox, XmNcancelCallback, fsb_cancel,  NULL);
554     rowcol=XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, mbox,
555 			    XmNradioBehavior, True,
556 			    NULL);
557     w=XtVaCreateManagedWidget("text", xmTextWidgetClass, rowcol,
558 			    NULL);
559     XtAddCallback(w, XmNvalueChangedCallback, satext_cb, NULL);
560     w=XtVaCreateManagedWidget("and", xmToggleButtonGadgetClass, rowcol,
561 			      XmNset, True,
562 			      NULL);
563     b.d->id=1;
564     XtAddCallback(w, XmNvalueChangedCallback, satoggle_cb, (XtPointer)1);
565     w=XtVaCreateManagedWidget("or ", xmToggleButtonGadgetClass, rowcol,
566 			    NULL);
567     XtAddCallback(w, XmNvalueChangedCallback, satoggle_cb, (XtPointer)2);
568     w=XtVaCreateManagedWidget("not", xmToggleButtonGadgetClass, rowcol,
569 			    NULL);
570     XtAddCallback(w, XmNvalueChangedCallback, satoggle_cb, (XtPointer)3);
571     XtManageChild(rowcol);
572     XtManageChild(mbox);
573     break;
574   case 1:    // ................................. AND;
575     b.ClearDummy();
576     b.d->id=0;
577     if (c_refform(0,2)) {
578       for (n=1; n<=key[0]; n++) {
579 	hinzu=1;
580 	if (b.d->id)
581 	  if (b.c[key[n]]->id != b.d->id) hinzu=0;
582 	if (strcmp(b.d->doctype,""))
583 	  if (!b.c[key[n]]->doctype) hinzu=0;
584 	  else if (!mystrstr(b.c[key[n]]->doctype,b.d->doctype, cis)) hinzu=0;
585 	if (strcmp(b.d->keyword,""))
586 	  if (!b.c[key[n]]->keyword) hinzu=0;
587 	  else if (!mystrstr(b.c[key[n]]->keyword,b.d->keyword, cis)) hinzu=0;
588 	if (strcmp(b.d->abstract,""))
589 	  if (!b.c[key[n]]->abstract) hinzu=0;
590 	  else if (!mystrstr(b.c[key[n]]->abstract,b.d->abstract, cis)) hinzu=0;
591 	if (strcmp(b.d->address,""))
592 	  if (!b.c[key[n]]->address) hinzu=0;
593 	  else if (!mystrstr(b.c[key[n]]->address,b.d->address, cis)) hinzu=0;
594 	if (strcmp(b.d->annote,""))
595 	  if (!b.c[key[n]]->annote) hinzu=0;
596 	  else if (!mystrstr(b.c[key[n]]->annote,b.d->annote, cis)) hinzu=0;
597 	if (strcmp(b.d->author,""))
598 	  if (!b.c[key[n]]->author) hinzu=0;
599 	  else if (!mystrstr(b.c[key[n]]->author,b.d->author, cis)) hinzu=0;
600 	if (strcmp(b.d->booktitle,""))
601 	  if (!b.c[key[n]]->booktitle) hinzu=0;
602 	  else if (!mystrstr(b.c[key[n]]->booktitle,b.d->booktitle, cis)) hinzu=0;
603 	if (strcmp(b.d->chapter,""))
604 	  if (!b.c[key[n]]->chapter) hinzu=0;
605 	  else if (!mystrstr(b.c[key[n]]->chapter,b.d->chapter, cis)) hinzu=0;
606 	if (strcmp(b.d->comment,""))
607 	  if (!b.c[key[n]]->comment) hinzu=0;
608 	  else if (!mystrstr(b.c[key[n]]->comment,b.d->comment, cis)) hinzu=0;
609 	if (strcmp(b.d->crossref,""))
610 	  if (!b.c[key[n]]->crossref) hinzu=0;
611 	  else if (!mystrstr(b.c[key[n]]->crossref,b.d->crossref, cis)) hinzu=0;
612 	if (strcmp(b.d->edition,""))
613 	  if (!b.c[key[n]]->edition) hinzu=0;
614 	  else if (!mystrstr(b.c[key[n]]->edition,b.d->edition, cis)) hinzu=0;
615 	if (strcmp(b.d->editor,""))
616 	  if (!b.c[key[n]]->editor) hinzu=0;
617 	  else if (!mystrstr(b.c[key[n]]->editor,b.d->editor, cis)) hinzu=0;
618 	if (strcmp(b.d->howpublished,""))
619 	  if (!b.c[key[n]]->howpublished) hinzu=0;
620 	  else if (!mystrstr(b.c[key[n]]->howpublished,b.d->howpublished, cis)) hinzu=0;
621 	if (strcmp(b.d->institution,""))
622 	  if (!b.c[key[n]]->institution) hinzu=0;
623 	  else if (!mystrstr(b.c[key[n]]->institution,b.d->institution, cis)) hinzu=0;
624 	if (strcmp(b.d->journal,""))
625 	  if (!b.c[key[n]]->journal) hinzu=0;
626 	  else if (!mystrstr(b.c[key[n]]->journal,b.d->journal, cis)) hinzu=0;
627 	if (strcmp(b.d->key,""))
628 	  if (!b.c[key[n]]->key) hinzu=0;
629 	  else if (!mystrstr(b.c[key[n]]->key,b.d->key, cis)) hinzu=0;
630 	if (strcmp(b.d->month,""))
631 	  if (!b.c[key[n]]->month) hinzu=0;
632 	  else if (!mystrstr(b.c[key[n]]->month,b.d->month, cis)) hinzu=0;
633 	if (strcmp(b.d->note,""))
634 	  if (!b.c[key[n]]->note) hinzu=0;
635 	  else if (!mystrstr(b.c[key[n]]->note,b.d->note, cis)) hinzu=0;
636 	if (strcmp(b.d->number,""))
637 	  if (!b.c[key[n]]->number) hinzu=0;
638 	  else if (!mystrstr(b.c[key[n]]->number,b.d->number, cis)) hinzu=0;
639 	if (strcmp(b.d->organization,""))
640 	  if (!b.c[key[n]]->organization) hinzu=0;
641 	  else if (!mystrstr(b.c[key[n]]->organization,b.d->organization, cis)) hinzu=0;
642 	if (strcmp(b.d->pages,""))
643 	  if (!b.c[key[n]]->pages) hinzu=0;
644 	  else if (!mystrstr(b.c[key[n]]->pages,b.d->pages, cis)) hinzu=0;
645 	if (strcmp(b.d->publisher,""))
646 	  if (!b.c[key[n]]->publisher) hinzu=0;
647 	  else if (!mystrstr(b.c[key[n]]->publisher,b.d->publisher, cis)) hinzu=0;
648 	if (strcmp(b.d->reprint,""))
649 	  if (!b.c[key[n]]->reprint) hinzu=0;
650 	  else if (strcmp(b.c[key[n]]->reprint,b.d->reprint)) hinzu=0;
651 	if (strcmp(b.d->school,""))
652 	  if (!b.c[key[n]]->school) hinzu=0;
653 	  else if (!mystrstr(b.c[key[n]]->school,b.d->school, cis)) hinzu=0;
654 	if (strcmp(b.d->series,""))
655 	  if (!b.c[key[n]]->series) hinzu=0;
656 	  else if (!mystrstr(b.c[key[n]]->series,b.d->series, cis)) hinzu=0;
657 	if (strcmp(b.d->title,""))
658 	  if (!b.c[key[n]]->title) hinzu=0;
659 	  else if (!mystrstr(b.c[key[n]]->title,b.d->title, cis)) hinzu=0;
660 	if (strcmp(b.d->type,""))
661 	  if (!b.c[key[n]]->type) hinzu=0;
662 	  else if (!mystrstr(b.c[key[n]]->type,b.d->type, cis)) hinzu=0;
663 	if (strcmp(b.d->volume,""))
664 	  if (!b.c[key[n]]->volume) hinzu=0;
665 	  else if (!mystrstr(b.c[key[n]]->volume,b.d->volume, cis)) hinzu=0;
666 	if (strcmp(b.d->year,""))
667 	  if (!b.c[key[n]]->year) hinzu=0;
668 	  else if (!mystrstr(b.c[key[n]]->year,b.d->year, cis)) hinzu=0;
669 	if (hinzu) {
670 	  gefunden[0]++;
671 	  gefunden[gefunden[0]]=key[n];
672 	}
673       } /* endfor */
674       // ........................................ Liste neu aufbauen;
675       str_list=(XmStringTable) XtMalloc(gefunden[0]*sizeof(XmString));
676       key=(unsigned long *)realloc(key,(gefunden[0]+1)*sizeof(unsigned long));
677       key[0]=gefunden[0];
678       for(n=1; n<=gefunden[0]; n++) {
679 	key[n]=gefunden[n];
680 	sprintf(ref,"%u %.15s %.30s %.15s %.4s",
681 		b.c[gefunden[n]]->id,
682 		b.c[gefunden[n]]->author,
683 		b.c[gefunden[n]]->title,
684 		b.c[gefunden[n]]->journal,
685 		b.c[gefunden[n]]->year);
686 	str_list[n-1]=XmStringCreateLocalized(ref);
687       }
688       XmListDeleteAllItems(liste);
689       XtVaSetValues(liste,
690 		    XmNitems, str_list,
691 		    XmNitemCount, gefunden[0],
692 		    NULL);
693       set_message(gefunden[0]);
694       XtFree((char *)str_list);
695 
696     } /* endif */
697     break;
698   case 2:    // ................................. OR;
699     b.ClearDummy();
700     b.d->id=0;
701     if (c_refform(0,2)) {
702       for (n=0; n<b.last; n++) {
703 	// ...................................... already selected ? ;
704 	hinzu=0;
705 	for (nk=1; nk<=key[0]; nk++) if (n==key[nk]) hinzu=1;
706 	// ...................................... if not than check;
707 	if(!hinzu) {
708 	  hinzu=1;
709 	  if (b.d->id)
710 	    if (b.c[n]->id != b.d->id) hinzu=0;
711 	  if (strcmp(b.d->doctype,""))
712 	    if (!b.c[n]->doctype) hinzu=0;
713 	    else if (!mystrstr(b.c[n]->doctype,b.d->doctype, cis)) hinzu=0;
714 	  if (strcmp(b.d->keyword,""))
715 	    if (!b.c[n]->keyword) hinzu=0;
716 	    else if (!mystrstr(b.c[n]->keyword,b.d->keyword, cis)) hinzu=0;
717 	  if (strcmp(b.d->abstract,""))
718 	    if (!b.c[n]->abstract) hinzu=0;
719 	    else if (!mystrstr(b.c[n]->abstract,b.d->abstract, cis)) hinzu=0;
720 	  if (strcmp(b.d->address,""))
721 	    if (!b.c[n]->address) hinzu=0;
722 	    else if (!mystrstr(b.c[n]->address,b.d->address, cis)) hinzu=0;
723 	  if (strcmp(b.d->annote,""))
724 	    if (!b.c[n]->annote) hinzu=0;
725 	    else if (!mystrstr(b.c[n]->annote,b.d->annote, cis)) hinzu=0;
726 	  if (strcmp(b.d->author,""))
727 	    if (!b.c[n]->author) hinzu=0;
728 	    else if (!mystrstr(b.c[n]->author,b.d->author, cis)) hinzu=0;
729 	  if (strcmp(b.d->booktitle,""))
730 	    if (!b.c[n]->booktitle) hinzu=0;
731 	    else if (!mystrstr(b.c[n]->booktitle,b.d->booktitle, cis)) hinzu=0;
732 	  if (strcmp(b.d->chapter,""))
733 	    if (!b.c[n]->chapter) hinzu=0;
734 	    else if (!mystrstr(b.c[n]->chapter,b.d->chapter, cis)) hinzu=0;
735 	  if (strcmp(b.d->comment,""))
736 	    if (!b.c[n]->comment) hinzu=0;
737 	    else if (!mystrstr(b.c[n]->comment,b.d->comment, cis)) hinzu=0;
738 	  if (strcmp(b.d->crossref,""))
739 	    if (!b.c[n]->crossref) hinzu=0;
740 	    else if (!mystrstr(b.c[n]->crossref,b.d->crossref, cis)) hinzu=0;
741 	  if (strcmp(b.d->edition,""))
742 	    if (!b.c[n]->edition) hinzu=0;
743 	    else if (!mystrstr(b.c[n]->edition,b.d->edition, cis)) hinzu=0;
744 	  if (strcmp(b.d->editor,""))
745 	    if (!b.c[n]->editor) hinzu=0;
746 	    else if (!mystrstr(b.c[n]->editor,b.d->editor, cis)) hinzu=0;
747 	  if (strcmp(b.d->howpublished,""))
748 	    if (!b.c[n]->howpublished) hinzu=0;
749 	    else if (!mystrstr(b.c[n]->howpublished,b.d->howpublished, cis)) hinzu=0;
750 	  if (strcmp(b.d->institution,""))
751 	    if (!b.c[n]->institution) hinzu=0;
752 	    else if (!mystrstr(b.c[n]->institution,b.d->institution, cis)) hinzu=0;
753 	  if (strcmp(b.d->journal,""))
754 	    if (!b.c[n]->journal) hinzu=0;
755 	    else if (!mystrstr(b.c[n]->journal,b.d->journal, cis)) hinzu=0;
756 	  if (strcmp(b.d->key,""))
757 	    if (!b.c[n]->key) hinzu=0;
758 	    else if (!mystrstr(b.c[n]->key,b.d->key, cis)) hinzu=0;
759 	  if (strcmp(b.d->month,""))
760 	    if (!b.c[n]->month) hinzu=0;
761 	    else if (!mystrstr(b.c[n]->month,b.d->month, cis)) hinzu=0;
762 	  if (strcmp(b.d->note,""))
763 	    if (!b.c[n]->note) hinzu=0;
764 	    else if (!mystrstr(b.c[n]->note,b.d->note, cis)) hinzu=0;
765 	  if (strcmp(b.d->number,""))
766 	    if (!b.c[n]->number) hinzu=0;
767 	    else if (!mystrstr(b.c[n]->number,b.d->number, cis)) hinzu=0;
768 	  if (strcmp(b.d->organization,""))
769 	    if (!b.c[n]->organization) hinzu=0;
770 	    else if (!mystrstr(b.c[n]->organization,b.d->organization, cis)) hinzu=0;
771 	  if (strcmp(b.d->pages,""))
772 	    if (!b.c[n]->pages) hinzu=0;
773 	    else if (!mystrstr(b.c[n]->pages,b.d->pages, cis)) hinzu=0;
774 	  if (strcmp(b.d->publisher,""))
775 	    if (!b.c[n]->publisher) hinzu=0;
776 	    else if (!mystrstr(b.c[n]->publisher,b.d->publisher, cis)) hinzu=0;
777 	  if (strcmp(b.d->reprint,""))
778 	    if (!b.c[n]->reprint) hinzu=0;
779 	    else if (strcmp(b.c[n]->reprint,b.d->reprint)) hinzu=0;
780 	  if (strcmp(b.d->school,""))
781 	    if (!b.c[n]->school) hinzu=0;
782 	    else if (!mystrstr(b.c[n]->school,b.d->school, cis)) hinzu=0;
783 	  if (strcmp(b.d->series,""))
784 	    if (!b.c[n]->series) hinzu=0;
785 	    else if (!mystrstr(b.c[n]->series,b.d->series, cis)) hinzu=0;
786 	  if (strcmp(b.d->title,""))
787 	    if (!b.c[n]->title) hinzu=0;
788 	    else if (!mystrstr(b.c[n]->title,b.d->title, cis)) hinzu=0;
789 	  if (strcmp(b.d->type,""))
790 	    if (!b.c[n]->type) hinzu=0;
791 	    else if (!mystrstr(b.c[n]->type,b.d->type, cis)) hinzu=0;
792 	  if (strcmp(b.d->volume,""))
793 	    if (!b.c[n]->volume) hinzu=0;
794 	    else if (!mystrstr(b.c[n]->volume,b.d->volume, cis)) hinzu=0;
795 	  if (strcmp(b.d->year,""))
796 	    if (!b.c[n]->year) hinzu=0;
797 	    else if (!mystrstr(b.c[n]->year,b.d->year, cis)) hinzu=0;
798 	}
799 
800 	if (hinzu) {
801 	  gefunden[0]++;
802 	  gefunden[gefunden[0]]=n;
803 	}
804       } /* endfor */
805       // ........................................ Liste neu aufbauen;
806       str_list=(XmStringTable) XtMalloc(gefunden[0]*sizeof(XmString));
807       key=(unsigned long *)realloc(key,(gefunden[0]+1)*sizeof(unsigned long));
808       key[0]=gefunden[0];
809       for(n=1; n<=gefunden[0]; n++) {
810 	key[n]=gefunden[n];
811 	sprintf(ref,"%u %.15s %.30s %.15s %.4s",
812 		b.c[gefunden[n]]->id,
813 		b.c[gefunden[n]]->author,
814 		b.c[gefunden[n]]->title,
815 		b.c[gefunden[n]]->journal,
816 		b.c[gefunden[n]]->year);
817 	str_list[n-1]=XmStringCreateLocalized(ref);
818       }
819       XmListDeleteAllItems(liste);
820       XtVaSetValues(liste,
821 		    XmNitems, str_list,
822 		    XmNitemCount, gefunden[0],
823 		    NULL);
824       set_message(gefunden[0]);
825       XtFree((char *)str_list);
826 
827     } /* endif */
828     break;
829   case 3:    // ................................. NOT;
830     b.ClearDummy();
831     b.d->id=0;
832     if (c_refform(0,2)) {
833       for (n=1; n<=key[0]; n++) {
834 	hinzu=1;
835 	if (b.d->id)
836 	  if (b.c[key[n]]->id == b.d->id) hinzu=0;
837 	if (strcmp(b.d->doctype,""))
838 	  if (!b.c[key[n]]->doctype) hinzu=1;
839 	  else if (mystrstr(b.c[key[n]]->doctype,b.d->doctype, cis)) hinzu=0;
840 	if (strcmp(b.d->keyword,""))
841 	  if (!b.c[key[n]]->keyword) hinzu=1;
842 	  else if (mystrstr(b.c[key[n]]->keyword,b.d->keyword, cis)) hinzu=0;
843 	if (strcmp(b.d->abstract,""))
844 	  if (!b.c[key[n]]->abstract) hinzu=1;
845 	  else if (mystrstr(b.c[key[n]]->abstract,b.d->abstract, cis)) hinzu=0;
846 	if (strcmp(b.d->address,""))
847 	  if (!b.c[key[n]]->address) hinzu=1;
848 	  else if (mystrstr(b.c[key[n]]->address,b.d->address, cis)) hinzu=0;
849 	if (strcmp(b.d->annote,""))
850 	  if (!b.c[key[n]]->annote) hinzu=1;
851 	  else if (mystrstr(b.c[key[n]]->annote,b.d->annote, cis)) hinzu=0;
852 	if (strcmp(b.d->author,""))
853 	  if (!b.c[key[n]]->author) hinzu=1;
854 	  else if (mystrstr(b.c[key[n]]->author,b.d->author, cis)) hinzu=0;
855 	if (strcmp(b.d->booktitle,""))
856 	  if (!b.c[key[n]]->booktitle) hinzu=1;
857 	  else if (mystrstr(b.c[key[n]]->booktitle,b.d->booktitle, cis)) hinzu=0;
858 	if (strcmp(b.d->chapter,""))
859 	  if (!b.c[key[n]]->chapter) hinzu=1;
860 	  else if (mystrstr(b.c[key[n]]->chapter,b.d->chapter, cis)) hinzu=0;
861 	if (strcmp(b.d->comment,""))
862 	  if (!b.c[key[n]]->comment) hinzu=1;
863 	  else if (mystrstr(b.c[key[n]]->comment,b.d->comment, cis)) hinzu=0;
864 	if (strcmp(b.d->crossref,""))
865 	  if (!b.c[key[n]]->crossref) hinzu=1;
866 	  else if (mystrstr(b.c[key[n]]->crossref,b.d->crossref, cis)) hinzu=0;
867 	if (strcmp(b.d->edition,""))
868 	  if (!b.c[key[n]]->edition) hinzu=1;
869 	  else if (mystrstr(b.c[key[n]]->edition,b.d->edition, cis)) hinzu=0;
870 	if (strcmp(b.d->editor,""))
871 	  if (!b.c[key[n]]->editor) hinzu=1;
872 	  else if (mystrstr(b.c[key[n]]->editor,b.d->editor, cis)) hinzu=0;
873 	if (strcmp(b.d->howpublished,""))
874 	  if (!b.c[key[n]]->howpublished) hinzu=1;
875 	  else if (mystrstr(b.c[key[n]]->howpublished,b.d->howpublished, cis)) hinzu=0;
876 	if (strcmp(b.d->institution,""))
877 	  if (!b.c[key[n]]->institution) hinzu=1;
878 	  else if (mystrstr(b.c[key[n]]->institution,b.d->institution, cis)) hinzu=0;
879 	if (strcmp(b.d->journal,""))
880 	  if (!b.c[key[n]]->journal) hinzu=1;
881 	  else if (mystrstr(b.c[key[n]]->journal,b.d->journal, cis)) hinzu=0;
882 	if (strcmp(b.d->key,""))
883 	  if (!b.c[key[n]]->key) hinzu=1;
884 	  else if (mystrstr(b.c[key[n]]->key,b.d->key, cis)) hinzu=0;
885 	if (strcmp(b.d->month,""))
886 	  if (!b.c[key[n]]->month) hinzu=1;
887 	  else if (mystrstr(b.c[key[n]]->month,b.d->month, cis)) hinzu=0;
888 	if (strcmp(b.d->note,""))
889 	  if (!b.c[key[n]]->note) hinzu=1;
890 	  else if (mystrstr(b.c[key[n]]->note,b.d->note, cis)) hinzu=0;
891 	if (strcmp(b.d->number,""))
892 	  if (!b.c[key[n]]->number) hinzu=1;
893 	  else if (mystrstr(b.c[key[n]]->number,b.d->number, cis)) hinzu=0;
894 	if (strcmp(b.d->organization,""))
895 	  if (!b.c[key[n]]->organization) hinzu=1;
896 	  else if (mystrstr(b.c[key[n]]->organization,b.d->organization, cis)) hinzu=0;
897 	if (strcmp(b.d->pages,""))
898 	  if (!b.c[key[n]]->pages) hinzu=1;
899 	  else if (mystrstr(b.c[key[n]]->pages,b.d->pages, cis)) hinzu=0;
900 	if (strcmp(b.d->publisher,""))
901 	  if (!b.c[key[n]]->publisher) hinzu=1;
902 	  else if (mystrstr(b.c[key[n]]->publisher,b.d->publisher, cis)) hinzu=0;
903 	if (strcmp(b.d->reprint,""))
904 	  if (!b.c[key[n]]->reprint) hinzu=1;
905 	  else if (!strcmp(b.c[key[n]]->reprint,b.d->reprint)) hinzu=0;
906 	if (strcmp(b.d->school,""))
907 	  if (!b.c[key[n]]->school) hinzu=1;
908 	  else if (mystrstr(b.c[key[n]]->school,b.d->school, cis)) hinzu=0;
909 	if (strcmp(b.d->series,""))
910 	  if (!b.c[key[n]]->series) hinzu=1;
911 	  else if (mystrstr(b.c[key[n]]->series,b.d->series, cis)) hinzu=0;
912 	if (strcmp(b.d->title,""))
913 	  if (!b.c[key[n]]->title) hinzu=1;
914 	  else if (mystrstr(b.c[key[n]]->title,b.d->title, cis)) hinzu=0;
915 	if (strcmp(b.d->type,""))
916 	  if (!b.c[key[n]]->type) hinzu=1;
917 	  else if (mystrstr(b.c[key[n]]->type,b.d->type, cis)) hinzu=0;
918 	if (strcmp(b.d->volume,""))
919 	  if (!b.c[key[n]]->volume) hinzu=1;
920 	  else if (mystrstr(b.c[key[n]]->volume,b.d->volume, cis)) hinzu=0;
921 	if (strcmp(b.d->year,""))
922 	  if (!b.c[key[n]]->year) hinzu=1;
923 	  else if (mystrstr(b.c[key[n]]->year,b.d->year, cis)) hinzu=0;
924 	if (hinzu) {
925 	  gefunden[0]++;
926 	  gefunden[gefunden[0]]=key[n];
927 	}
928       } /* endfor */
929       // ........................................ Liste neu aufbauen;
930       str_list=(XmStringTable) XtMalloc(gefunden[0]*sizeof(XmString));
931       key=(unsigned long *)realloc(key,(gefunden[0]+1)*sizeof(unsigned long));
932       key[0]=gefunden[0];
933       for(n=1; n<=gefunden[0]; n++) {
934 	key[n]=gefunden[n];
935 	sprintf(ref,"%u %.15s %.30s %.15s %.4s",
936 		b.c[gefunden[n]]->id,
937 		b.c[gefunden[n]]->author,
938 		b.c[gefunden[n]]->title,
939 		b.c[gefunden[n]]->journal,
940 		b.c[gefunden[n]]->year);
941 	str_list[n-1]=XmStringCreateLocalized(ref);
942       }
943       XmListDeleteAllItems(liste);
944       XtVaSetValues(liste,
945 		    XmNitems, str_list,
946 		    XmNitemCount, gefunden[0],
947 		    NULL);
948       set_message(gefunden[0]);
949       XtFree((char *)str_list);
950 
951     } /* endif */
952 
953     break;
954   case 4:    // ................................. view all;
955       str_list=(XmStringTable) XtMalloc(b.last*sizeof(XmString));
956       key=(unsigned long *)realloc(key,(b.last+1)*sizeof(unsigned long));
957       key[0]=b.last;
958       for(n=0; n<b.last; n++) {
959 	key[n+1]=n;
960 	sprintf(ref,"%u %.15s %.30s %.15s %.4s",
961 		b.c[n]->id,
962 		b.c[n]->author,
963 		b.c[n]->title,
964 		b.c[n]->journal,
965 		b.c[n]->year);
966 	str_list[n]=XmStringCreateLocalized(ref);
967       }
968       XmListDeleteAllItems(liste);
969       XtVaSetValues(liste,
970 		    XmNitems, str_list,
971 		    XmNitemCount, b.last,
972 		    NULL);
973       set_message(b.last);
974       XtFree((char *)str_list);
975     break;
976   case 5:    // ................................ case insensitive ?;
977     if (cis) cis=0; else cis=1;
978     break;
979   }
980   delete[]gefunden; delete[]ref;
981 }
982 
983 
satext_cb(Widget widget,XtPointer client_data,XtPointer call_data)984 void satext_cb(Widget widget, XtPointer client_data, XtPointer call_data) {
985   char *text;
986 
987   if (text = XmTextGetString(widget)) {
988     b.d->keyword=(char *)realloc(b.d->keyword, strlen(text)+1);
989     strcpy(b.d->keyword, text);
990     XtFree(text);
991   }
992 
993 }
994 
satoggle_cb(Widget widget,XtPointer client_data,XtPointer call_data)995 void satoggle_cb(Widget widget, XtPointer client_data, XtPointer call_data) {
996   if (XmToggleButtonGadgetGetState(widget))
997       b.d->id=(unsigned long) client_data;
998 }
999