pick.c revision d859ff80
1/*
2 * $XConsortium: pick.c,v 2.45 91/07/17 21:26:54 converse Exp $
3 *
4 *
5 *			  COPYRIGHT 1987
6 *		   DIGITAL EQUIPMENT CORPORATION
7 *		       MAYNARD, MASSACHUSETTS
8 *			ALL RIGHTS RESERVED.
9 *
10 * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
11 * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
12 * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR
13 * ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
14 *
15 * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
16 * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
17 * ADDITION TO THAT SET FORTH ABOVE.
18 *
19 * Permission to use, copy, modify, and distribute this software and its
20 * documentation for any purpose and without fee is hereby granted, provided
21 * that the above copyright notice appear in all copies and that both that
22 * copyright notice and this permission notice appear in supporting
23 * documentation, and that the name of Digital Equipment Corporation not be
24 * used in advertising or publicity pertaining to distribution of the software
25 * without specific, written prior permission.
26 */
27/* $XFree86: xc/programs/xmh/pick.c,v 1.2 2001/08/01 00:45:06 tsi Exp $ */
28
29/* pick.c -- handle a pick subwidget. */
30
31#include "xmh.h"
32
33#define WTlabel		labelWidgetClass
34#define WTbutton	commandWidgetClass
35#define WTtextentry	asciiTextWidgetClass
36
37#define	RTfrom		0
38#define	RTto		1
39#define	RTcc		2
40#define RTdate		3
41#define	RTsubject	4
42#define	RTsearch	5
43#define	RTother		6
44#define	RTignore	7
45
46#define FIRSTROWTYPE		RTfrom
47#define LASTUSEFULROWTYPE	RTother
48#define NUMROWTYPE		(RTignore+1)
49
50static int stdwidth = -1;	/* Width to make text fields, and other
51				   things that want to be the same width as
52				   text fields. */
53
54static char *TypeName[NUMROWTYPE];
55static short true_data = 1;	/* radio data */
56static short false_data = 0;	/* radio data */
57
58typedef struct {
59   WidgetClass	type;		/* Encode what type of Widget this is. */
60   Widget 	widget;		/* The widget id itself. */
61   struct _RowListRec *row;	/* Which row this widget is in. */
62} FormEntryRec, *FormEntry;
63
64typedef struct _RowListRec {
65   short	type;		/* Encode what type of list this is. */
66   Widget	widget;		/* Widget containing this row */
67   short	numwidgets;	/* How many widgets in this list. */
68   FormEntry 	*wlist;		/* List of widgets. */
69   struct _GroupRec *group;	/* Which group this is in. */
70} RowListRec, *RowList;
71
72typedef struct _GroupRec {
73   short	 numrows;	/* How many rows of widget. */
74   Widget	widget;		/* Widget containing this group */
75   RowList	*rlist;		/* List of widget rows. */
76   struct _FormBoxRec *form;	/* Which form this is in. */
77} GroupRec, *Group;
78
79typedef struct _FormBoxRec {
80   Widget outer;	/* Outer widget (contains scrollbars if any) */
81   Widget inner;	/* Inner widget (contains master form) */
82   short numgroups;	/* How many groups of form entries we have. */
83   Group *glist;	/* List of form groups. */
84   struct _PickRec *pick; /* Which pick this is in. */
85} FormBoxRec, *FormBox;
86
87typedef struct _PickRec {
88   Scrn scrn;			/* Scrn containing this pick. */
89   Widget label;		/* Widget with label for this pick. */
90   Toc toc;			/* Toc for folder being scanned. */
91   FormBox general;		/* Form for general info about this pick. */
92   FormBox details;		/* Form for details about this pick. */
93} PickRec;
94
95
96static FormEntry CreateWidget(RowList, WidgetClass, ArgList, Cardinal);
97static void DeleteWidget(FormEntry);
98static void AddDetailGroup(FormBox);
99
100void InitPick(void)
101{
102    TypeName[RTfrom]	= "From:";
103    TypeName[RTto]	= "To:";
104    TypeName[RTcc]	= "Cc:";
105    TypeName[RTdate]	= "Date:";
106    TypeName[RTsubject] = "Subject:";
107    TypeName[RTsearch]	= "Search:";
108    TypeName[RTother]	= NULL;
109
110    /* Translations which will prevent the Search and Replace functionality
111     * of the Text widget in text fields of pick and popups.  The toc's
112     * Search and Replace functionality is removed in the app defaults file.
113     */
114    NoTextSearchAndReplace = XtParseTranslationTable
115	("Ctrl<Key>R: no-op(RingBell)\n\
116          Ctrl<Key>S: no-op(RingBell)\n");
117}
118
119
120static void PrepareToUpdate(FormBox form)
121{
122    XawFormDoLayout(form->inner, FALSE);
123}
124
125static void ExecuteUpdate(FormBox form)
126{
127    XawFormDoLayout(form->inner, TRUE);
128    XtManageChild(form->inner);
129    XtManageChild(form->outer);
130}
131
132static void AddLabel(RowList row, char *text, int usestd)
133{
134    static Arg arglist[] = {
135	{XtNlabel, (XtArgVal)NULL},
136	{XtNborderWidth, (XtArgVal) 0},
137	{XtNjustify, (XtArgVal) XtJustifyRight},
138	{XtNwidth, (XtArgVal) NULL}
139    };
140
141    arglist[0].value = (XtArgVal) text;
142    arglist[XtNumber(arglist) - 1].value = (XtArgVal) stdwidth;
143    (void) CreateWidget(row, WTlabel, arglist,
144			usestd ? XtNumber(arglist) : XtNumber(arglist) - 1);
145}
146
147
148static void AddButton(RowList row, char *text, void (*func)(XMH_CB_ARGS))
149{
150    FormEntry entry;
151    static Arg args[] = {
152	{XtNlabel, (XtArgVal)NULL},
153    };
154
155    args[0].value = (XtArgVal)text;
156    entry = CreateWidget( row, WTbutton, args, XtNumber(args) );
157    XtAddCallback( entry->widget, XtNcallback, func, (XtPointer)entry );
158}
159
160
161static void AddToggle(
162    RowList	row,
163    char	*text,
164    int		initial_state,
165    Widget	radio_group,
166    XtPointer	radio_data)
167{
168    FormEntry	entry;
169    Arg		args[4];
170    int		n = 0;
171    XtTranslations	translations;
172
173    XtSetArg(args[n], XtNlabel, text);			n++;
174    XtSetArg(args[n], XtNstate, initial_state);		n++;
175    XtSetArg(args[n], XtNradioGroup, radio_group);	n++;
176    XtSetArg(args[n], XtNradioData, radio_data);	n++;
177    entry = CreateWidget(row, toggleWidgetClass, args, (Cardinal)n);
178    translations = XtParseTranslationTable("<Btn1Down>,<Btn1Up>:set()\n");
179    XtOverrideTranslations(entry->widget, translations);
180}
181
182
183static void AddTextEntry(RowList row, char *str)
184{
185    FormEntry	entry;
186    static Arg arglist[] = {
187	{XtNstring, (XtArgVal) NULL},
188	{XtNwidth, (XtArgVal) NULL},
189	{XtNlength, (XtArgVal) 300},
190	{XtNresize, (XtArgVal) XawtextResizeBoth},
191	{XtNeditType, (XtArgVal)XawtextEdit},
192    };
193    arglist[0].value = (XtArgVal) str;
194    arglist[1].value = (XtArgVal) stdwidth;
195    entry = CreateWidget( row, WTtextentry, arglist, XtNumber(arglist) );
196    XtOverrideTranslations(entry->widget, NoTextSearchAndReplace);
197}
198
199
200static void ChangeTextEntry(FormEntry entry, char *str)
201{
202    Arg arglist[1];
203    char *ptr;
204
205    XtSetArg(arglist[0], XtNstring, &ptr);
206    XtGetValues(entry->widget, arglist, (Cardinal) 1);
207    if (strcmp(str, ptr) == 0)
208        return;
209
210    XtSetArg(arglist[0], XtNstring, str);
211    XtSetValues(entry->widget, arglist, (Cardinal) 1);
212}
213
214/* ARGSUSED */
215static void ExecRowOr(
216    Widget w,			/* unused */
217    XtPointer closure,		/* FormEntry */
218    XtPointer call_data)	/* unused */
219{
220    FormEntry entry = (FormEntry)closure;
221    RowList row = entry->row;
222    FormBox form = row->group->form;
223    PrepareToUpdate(form);
224    DeleteWidget(entry);
225    AddLabel(row, "or", FALSE);
226    AddTextEntry(row, "");
227    AddButton(row, "Or", ExecRowOr);
228    ExecuteUpdate(form);
229}
230
231
232/* ARGSUSED */
233static void ExecGroupOr(
234    Widget w,			/* unused */
235    XtPointer closure,		/* FormEntry */
236    XtPointer call_data)	/* unused */
237{
238    FormBox form = ((FormEntry)closure)->row->group->form;
239/* %%%    XUnmapWindow(theDisplay, XtWindow(form->inner)); */
240    PrepareToUpdate(form);
241    AddDetailGroup(form);
242    ExecuteUpdate(form);
243/* %%%    XtMapWidget(form->inner); */
244}
245
246static char **argv;
247static int argvsize;
248
249
250static void AppendArgv(char *ptr)
251{
252    argvsize++;
253    argv = ResizeArgv(argv, argvsize);
254    argv[argvsize - 1] = XtNewString(ptr);
255}
256
257static void EraseLast(void)
258{
259    argvsize--;
260    XtFree((char *) argv[argvsize]);
261    argv[argvsize] = NULL;
262}
263
264
265
266static Boolean ParseRow(RowList row)
267{
268    int		result = FALSE;
269    int		i;
270    FormEntry	entry;
271    char	str[1000];
272    Arg	  	args[4];
273    char	*ptr;
274    char	*other;
275
276    if (row->type > LASTUSEFULROWTYPE)
277	return FALSE;
278
279    for (i = 3; i < row->numwidgets; i += 2) {
280	entry = row->wlist[i];
281	XtSetArg(args[0], XtNstring, &ptr);
282	XtGetValues(entry->widget, args, (Cardinal) 1);
283	if (ptr && *ptr) {
284	    if (!result) {
285		result = TRUE;
286		if (! (*((short *)
287			 (XawToggleGetCurrent(row->wlist[0]->widget)))))
288		    AppendArgv("-not");
289		AppendArgv("-lbrace");
290	    }
291	    switch (row->type) {
292		case RTfrom:
293		    AppendArgv("-from");
294		    break;
295		case RTto:
296		    AppendArgv("-to");
297		    break;
298		case RTcc:
299		    AppendArgv("-cc");
300		    break;
301		case RTdate:
302		    AppendArgv("-date");
303		    break;
304		case RTsubject:
305		    AppendArgv("-subject");
306		    break;
307		case RTsearch:
308		    AppendArgv("-search");
309		    break;
310		case RTother:
311		    XtSetArg(args[0], XtNstring, &other);
312		    XtGetValues(row->wlist[2]->widget, args, (Cardinal) 1);
313		    (void) sprintf(str, "--%s", other);
314		    AppendArgv(str);
315		    break;
316	    }
317	    AppendArgv(ptr);
318	    AppendArgv("-or");
319	}
320    }
321    if (result) {
322	EraseLast();
323	AppendArgv("-rbrace");
324	AppendArgv("-and");
325    }
326    return result;
327}
328
329
330static Boolean ParseGroup(Group group)
331{
332    int found = FALSE;
333    int i;
334    for (i=0 ; i<group->numrows ; i++)
335	found |= ParseRow(group->rlist[i]);
336    if (found) {
337	EraseLast();
338	AppendArgv("-rbrace");
339	AppendArgv("-or");
340	AppendArgv("-lbrace");
341    }
342    return found;
343}
344
345/* ARGSUSED */
346static void ExecOK(
347    Widget w,			/* unused */
348    XtPointer closure,		/* FormEntry */
349    XtPointer call_data)	/* unused */
350{
351    Pick pick = ((FormEntry)closure)->row->group->form->pick;
352    Toc toc = pick->toc;
353    FormBox details = pick->details;
354    FormBox general = pick->general;
355    Group group = general->glist[0];
356    RowList row0 = group->rlist[0];
357    RowList row1 = group->rlist[1];
358    RowList row2 = group->rlist[2];
359    char *fromseq;
360    char *toseq;
361    char *datefield;
362    char *fromdate;
363    char *todate;
364    short removeoldmsgs =
365	*((short*)XawToggleGetCurrent(row2->wlist[1]->widget));
366    int i, found;
367    char *folderpath;
368    int cmd_status;
369    Arg args[5];
370
371    XtSetArg(args[0], XtNstring, &toseq);
372    XtGetValues(row0->wlist[1]->widget, args, (Cardinal) 1);
373    if (strcmp(toseq, "all") == 0) {
374	PopupError(pick->scrn->parent,
375		   "Can't create a sequence called \"all\".");
376	return;
377    }
378    XtSetArg(args[0], XtNstring, &fromseq);
379    XtGetValues(row0->wlist[3]->widget, args, (Cardinal) 1);
380    if (TocGetSeqNamed(toc, fromseq) == NULL) {
381	char str[200];
382	(void) sprintf(str, "Sequence \"%s\" doesn't exist!", fromseq);
383	PopupError(pick->scrn->parent, str);
384	return;
385    }
386
387    argv = MakeArgv(1);
388    argvsize = 0;
389    AppendArgv("pick");
390    AppendArgv(folderpath = TocMakeFolderName(toc));
391    XtFree(folderpath);
392    AppendArgv(fromseq);
393    AppendArgv("-sequence");
394    AppendArgv(toseq);
395    if (removeoldmsgs)
396	AppendArgv("-zero");
397    else
398	AppendArgv("-nozero");
399    XtSetArg(args[0], XtNstring, &datefield);
400    XtGetValues(row1->wlist[5]->widget, args, (Cardinal) 1);
401    if (*datefield) {
402	AppendArgv("-datefield");
403	AppendArgv(datefield);
404    }
405    XtSetArg(args[0], XtNstring, &fromdate);
406    XtGetValues(row1->wlist[1]->widget, args, (Cardinal) 1);
407    if (*fromdate) {
408	AppendArgv("-after");
409	AppendArgv(fromdate);
410	AppendArgv("-and");
411    }
412    XtSetArg(args[0], XtNstring, &todate);
413    XtGetValues(row1->wlist[3]->widget, args, (Cardinal) 1);
414    if (*todate) {
415	AppendArgv("-before");
416	AppendArgv(todate);
417	AppendArgv("-and");
418    }
419    found = FALSE;
420    AppendArgv("-lbrace");
421    AppendArgv("-lbrace");
422    for (i=0 ; i<details->numgroups ; i++)
423	found |= ParseGroup(details->glist[i]);
424    EraseLast();
425    EraseLast();
426    if (found) AppendArgv("-rbrace");
427    else if (*fromdate || *todate) EraseLast();
428    if (app_resources.debug) {
429	for (i=0 ; i<argvsize ; i++)
430	    (void) fprintf(stderr, "%s ", argv[i]);
431	(void) fprintf(stderr, "\n");
432    }
433    if (app_resources.block_events_on_busy) ShowBusyCursor();
434
435    cmd_status = DoCommand(argv, (char*)NULL, (char*)NULL);
436    TocReloadSeqLists(toc);
437    TocChangeViewedSeq(toc, TocGetSeqNamed(toc, toseq));
438
439    if (app_resources.block_events_on_busy) UnshowBusyCursor();
440    if (cmd_status == 0 /*succeeded*/) DestroyScrn(pick->scrn);
441    for (i=0 ; i<argvsize ; i++) XtFree((char *) argv[i]);
442    XtFree((char *) argv);
443}
444
445
446/* ARGSUSED */
447static void ExecCancel(
448    Widget w,			/* unused */
449    XtPointer closure,		/* FormEntry */
450    XtPointer call_data)	/* unused */
451{
452    Pick pick = ((FormEntry)closure)->row->group->form->pick;
453    Scrn scrn = pick->scrn;
454    (void) DestroyScrn(scrn);
455}
456
457
458static FormEntry CreateWidget(
459    RowList row,
460    WidgetClass class,
461    ArgList args,
462    Cardinal num_args)
463{
464    static Arg arglist[] = {
465	{XtNfromHoriz, (XtArgVal)NULL},
466	{XtNresizable, (XtArgVal)TRUE},
467	{XtNtop, (XtArgVal) XtChainTop},
468	{XtNleft, (XtArgVal) XtChainLeft},
469	{XtNbottom, (XtArgVal) XtChainTop},
470	{XtNright, (XtArgVal) XtChainLeft},
471    };
472    ArgList merged_args;
473    FormEntry entry;
474
475    row->numwidgets++;
476    row->wlist = (FormEntry *)
477	XtRealloc((char *) row->wlist,
478		  (unsigned) row->numwidgets * sizeof(FormEntry));
479    entry = XtNew(FormEntryRec);
480    entry->row = row;
481    entry->type = class;
482    row->wlist[row->numwidgets - 1] = entry;
483    if (row->numwidgets > 1)
484	arglist[0].value = (XtArgVal) row->wlist[row->numwidgets - 2]->widget;
485    else
486	arglist[0].value = (XtArgVal) NULL;
487
488    merged_args = XtMergeArgLists(args, num_args, arglist, XtNumber(arglist) );
489
490    entry->widget = XtCreateManagedWidget( (String) NULL, class, row->widget,
491					   merged_args,
492					   num_args + XtNumber(arglist) );
493
494    XtFree((char *) merged_args);
495    return entry;
496}
497
498
499static void
500DeleteWidget(FormEntry entry)
501{
502    RowList row = entry->row;
503    int i;
504    XtDestroyWidget(entry->widget);
505    for (i = 0; i < row->numwidgets; i++)
506	if (row->wlist[i] == entry)
507	    break;
508    row->numwidgets--;
509    for (; i < row->numwidgets; i++)
510	row->wlist[i] = row->wlist[i + 1];
511}
512
513
514/* Figure out how wide text fields and labels should be so that they'll all
515   line up correctly, and be big enough to hold everything, but not too big. */
516
517static void FindStdWidth(void)
518{
519    stdwidth = 100;		/* %%% HACK! */
520}
521
522
523static RowList AddRow(Group group, int type)
524{
525    static Arg arglist[] = {
526	{XtNborderWidth, (XtArgVal) 0},
527	{XtNfromVert, (XtArgVal) NULL},
528	{XtNresizable, (XtArgVal) TRUE},
529	{XtNtop, (XtArgVal) XtChainTop},
530	{XtNleft, (XtArgVal) XtChainLeft},
531	{XtNbottom, (XtArgVal) XtChainTop},
532	{XtNright, (XtArgVal) XtChainLeft}
533    };
534    RowList row;
535    group->numrows++;
536    group->rlist = (RowList *)
537	XtRealloc((char *) group->rlist,
538		  (unsigned) group->numrows * sizeof(RowList));
539    group->rlist[group->numrows - 1] = row = XtNew(RowListRec);
540    row->type = type;
541    row->numwidgets = 0;
542    row->wlist = (FormEntry *) NULL;
543    row->group = group;
544    if (group->numrows > 1)
545	arglist[1].value = (XtArgVal)group->rlist[group->numrows - 2]->widget;
546    else
547	arglist[1].value = (XtArgVal) NULL;
548    row->widget = XtCreateWidget("rowform", formWidgetClass, group->widget,
549				  arglist, XtNumber(arglist) );
550    if (type == RTignore) return row;
551    AddToggle(row, "Pick", TRUE, (Widget)NULL, (XtPointer)(&true_data));
552    AddToggle(row, "Skip", FALSE, row->wlist[row->numwidgets - 1]->widget,
553	      (XtPointer)(&false_data));
554    if (TypeName[type])
555	AddLabel(row, TypeName[type], TRUE);
556    else
557	AddTextEntry(row, "");
558    AddTextEntry(row, "");
559    AddButton(row, "Or", ExecRowOr);
560    XtManageChild(row->widget);
561    return row;
562}
563
564
565static Group AddGroup(FormBox form)
566{
567    static Arg arglist[] = {
568	{XtNborderWidth, (XtArgVal) 0},
569	{XtNfromVert, (XtArgVal) NULL},
570	{XtNresizable, (XtArgVal) TRUE},
571	{XtNtop, (XtArgVal) XtChainTop},
572	{XtNleft, (XtArgVal) XtChainLeft},
573	{XtNbottom, (XtArgVal) XtChainTop},
574	{XtNright, (XtArgVal) XtChainLeft}
575    };
576    Group group;
577    form->numgroups++;
578    form->glist = (Group *)
579	XtRealloc((char *) form->glist,
580		  (unsigned) form->numgroups * sizeof(Group));
581    form->glist[form->numgroups - 1] = group =
582	(Group) XtMalloc((Cardinal) sizeof(GroupRec));
583    group->numrows = 0;
584    group->form = form;
585    group->rlist = (RowList *) NULL;
586    if (form->numgroups > 1)
587	arglist[1].value = (XtArgVal)form->glist[form->numgroups - 2]->widget;
588    else
589	arglist[1].value = (XtArgVal)NULL;
590    group->widget = XtCreateWidget("groupform", formWidgetClass, form->inner,
591				    arglist, XtNumber(arglist) );
592    return group;
593}
594
595
596
597static void
598AddDetailGroup(FormBox form)
599{
600    Group group;
601    RowList row;
602    int     type;
603
604    if (form->numgroups > 0) {
605	group = form->glist[form->numgroups - 1];
606	row = group->rlist[group->numrows - 1];
607	DeleteWidget(row->wlist[0]);
608	AddLabel(row, "- or -", FALSE);
609    }
610    group = AddGroup(form);
611    for (type = FIRSTROWTYPE; type <= LASTUSEFULROWTYPE; type++)
612	(void) AddRow(group, type);
613    row =  AddRow(group, RTignore);
614    AddButton(row, "- Or -", ExecGroupOr);
615    XtManageChild(row->widget);
616    if (XtIsRealized(XtParent(group->widget)))
617	XtRealizeWidget(group->widget);
618    XtManageChild(group->widget);
619}
620
621
622static void AddGeneralGroup(FormBox form)
623{
624    Group group;
625    RowList row;
626    Widget widgetList[4];
627    group = AddGroup(form);
628    row =  AddRow(group, RTignore);
629    widgetList[0] = row->widget;
630    AddLabel(row, "Creating sequence:", FALSE);
631    AddTextEntry(row, "");
632    AddLabel(row, "with msgs from sequence:", FALSE);
633    AddTextEntry(row, "");
634    row =  AddRow(group, RTignore);
635    widgetList[1] = row->widget;
636    AddLabel(row, "Date range:", FALSE);
637    AddTextEntry(row, "");
638    AddLabel(row, " - ", FALSE);
639    AddTextEntry(row, "");
640    AddLabel(row, "Date field:", FALSE);
641    AddTextEntry(row, "");
642    row =  AddRow(group, RTignore);
643    widgetList[2] = row->widget;
644    AddLabel(row, "Clear old entries from sequence?", FALSE);
645    AddToggle(row, "Yes", TRUE, (Widget) NULL, (XtPointer)(&true_data));
646    AddToggle(row, "No", FALSE, row->wlist[row->numwidgets - 1]->widget,
647	      (XtPointer)(&false_data));
648    row =  AddRow(group, RTignore);
649    widgetList[3] = row->widget;
650    AddButton(row, "OK", ExecOK);
651    AddButton(row, "Cancel", ExecCancel);
652    XtManageChildren(widgetList, XtNumber(widgetList));
653    XtManageChild(group->widget);
654}
655
656
657static void InitGeneral(Pick pick, char *fromseq, char *toseq)
658{
659    RowList row;
660    row = pick->general->glist[0]->rlist[0];
661    ChangeTextEntry(row->wlist[1], toseq);
662    ChangeTextEntry(row->wlist[3], fromseq);
663}
664
665
666static void CleanForm(FormBox form)
667{
668    int i, j, k;
669    Group group;
670    RowList row;
671    FormEntry entry;
672    for (i=0 ; i<form->numgroups ; i++) {
673	group = form->glist[i];
674	for (j=0 ; j<group->numrows ; j++) {
675	    row = group->rlist[j];
676	    for (k=0 ; k<row->numwidgets ; k++) {
677		entry = row->wlist[k];
678		if (entry->type == WTtextentry)
679		    ChangeTextEntry(entry, "");
680	    }
681	}
682    }
683}
684
685
686static FormBox MakeAForm(Pick pick)
687{
688    static Arg arglist1[] = {
689	{XtNallowHoriz, (XtArgVal)TRUE},
690	{XtNallowVert, (XtArgVal)TRUE},
691/* %%%	{XtNallowResize, (XtArgVal)TRUE}, */
692	{XtNmin, (XtArgVal)50},
693	{XtNmax, (XtArgVal)1500}
694    };
695    static Arg arglist2[] = {
696	{XtNborderWidth, (XtArgVal) 0}
697    };
698    FormBox result;
699    result = (FormBox) XtMalloc((Cardinal) sizeof(FormBoxRec));
700    result->outer = XtCreateWidget( "pick", viewportWidgetClass,
701				    pick->scrn->widget,
702				    arglist1, XtNumber(arglist1) );
703    result->inner = XtCreateWidget( "form", formWidgetClass, result->outer,
704				    arglist2, XtNumber(arglist2) );
705    result->pick = pick;
706    result->numgroups = 0;
707    result->glist = (Group *) NULL;
708    return result;
709}
710
711
712void AddPick(Scrn scrn, Toc toc, char *fromseq, char *toseq)
713{
714    Pick pick;
715    FormBox general, details;
716    char str[100];
717#ifdef notdef
718    int height;
719#endif /* notdef */
720
721    if (scrn->pick) {
722	pick = scrn->pick;
723	CleanForm(pick->details);
724	CleanForm(pick->general);
725    } else {
726	pick = scrn->pick = (Pick) XtMalloc((Cardinal) sizeof(PickRec));
727	pick->scrn = scrn;
728	pick->label = CreateTitleBar(scrn, "pickTitlebar");
729	pick->details = details = MakeAForm(pick);
730	pick->general = general = MakeAForm(pick);
731	FindStdWidth();
732	XawPanedSetRefigureMode(scrn->widget, False);
733	PrepareToUpdate(details);
734	AddDetailGroup(details);
735	ExecuteUpdate(details);
736	PrepareToUpdate(general);
737	AddGeneralGroup(general);
738	ExecuteUpdate(general);
739#ifdef notdef
740	height = general->inner->core.height;
741	if (general->inner->core.width > scrn->widget->core.width)
742	    height += XtScrollMgrGetThickness(general->outer);
743	XawPanedSetMinMax(scrn->widget, general->outer, height, height);
744	XawPanedSetMinMax(scrn->widget, general->outer, 10, 10000);
745#endif /* notdef */
746	XawPanedSetRefigureMode(scrn->widget, True);
747    }
748    pick->toc = toc;
749    InitGeneral(pick, fromseq, toseq);
750    (void) sprintf(str, "Pick: %s", TocName(toc));
751    ChangeLabel(pick->label, str);
752    StoreWindowName(scrn, str);
753}
754