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