pick.c revision 66d665a3
11.6Swiz/*
21.2Stls * $XConsortium: pick.c,v 2.45 91/07/17 21:26:54 converse Exp $
31.1Sjtc *
41.1Sjtc *
51.1Sjtc *			  COPYRIGHT 1987
61.1Sjtc *		   DIGITAL EQUIPMENT CORPORATION
71.1Sjtc *		       MAYNARD, MASSACHUSETTS
81.1Sjtc *			ALL RIGHTS RESERVED.
91.1Sjtc *
101.1Sjtc * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
111.5Shubertf * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
121.5Shubertf * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR
131.1Sjtc * ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
141.1Sjtc *
151.1Sjtc * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
161.1Sjtc * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
171.1Sjtc * ADDITION TO THAT SET FORTH ABOVE.
181.6Swiz *
191.1Sjtc * Permission to use, copy, modify, and distribute this software and its
201.1Sjtc * documentation for any purpose and without fee is hereby granted, provided
211.1Sjtc * that the above copyright notice appear in all copies and that both that
221.1Sjtc * copyright notice and this permission notice appear in supporting
231.1Sjtc * documentation, and that the name of Digital Equipment Corporation not be
241.1Sjtc * used in advertising or publicity pertaining to distribution of the software
251.1Sjtc * without specific, written prior permission.
261.1Sjtc */
271.1Sjtc/* $XFree86: xc/programs/xmh/pick.c,v 1.2 2001/08/01 00:45:06 tsi Exp $ */
281.1Sjtc
291.1Sjtc/* pick.c -- handle a pick subwidget. */
301.1Sjtc
311.1Sjtc#include "xmh.h"
321.1Sjtc
331.1Sjtc#define WTlabel		labelWidgetClass
341.1Sjtc#define WTbutton	commandWidgetClass
351.1Sjtc#define WTtextentry	asciiTextWidgetClass
361.1Sjtc
371.1Sjtc#define	RTfrom		0
381.1Sjtc#define	RTto		1
391.1Sjtc#define	RTcc		2
401.1Sjtc#define RTdate		3
411.1Sjtc#define	RTsubject	4
421.1Sjtc#define	RTsearch	5
431.1Sjtc#define	RTother		6
441.1Sjtc#define	RTignore	7
451.1Sjtc
461.1Sjtc#define FIRSTROWTYPE		RTfrom
471.1Sjtc#define LASTUSEFULROWTYPE	RTother
481.1Sjtc#define NUMROWTYPE		(RTignore+1)
491.1Sjtc
501.1Sjtcstatic int stdwidth = -1;	/* Width to make text fields, and other
511.1Sjtc				   things that want to be the same width as
521.1Sjtc				   text fields. */
531.1Sjtc
541.1Sjtcstatic const char *TypeName[NUMROWTYPE];
551.1Sjtcstatic short true_data = 1;	/* radio data */
561.1Sjtcstatic short false_data = 0;	/* radio data */
571.1Sjtc
581.1Sjtctypedef struct {
591.1Sjtc   WidgetClass	type;		/* Encode what type of Widget this is. */
601.1Sjtc   Widget 	widget;		/* The widget id itself. */
611.1Sjtc   struct _RowListRec *row;	/* Which row this widget is in. */
621.1Sjtc} FormEntryRec, *FormEntry;
631.1Sjtc
641.1Sjtctypedef struct _RowListRec {
651.1Sjtc   short	type;		/* Encode what type of list this is. */
661.1Sjtc   Widget	widget;		/* Widget containing this row */
671.1Sjtc   short	numwidgets;	/* How many widgets in this list. */
681.1Sjtc   FormEntry 	*wlist;		/* List of widgets. */
691.1Sjtc   struct _GroupRec *group;	/* Which group this is in. */
701.1Sjtc} RowListRec, *RowList;
711.1Sjtc
721.1Sjtctypedef struct _GroupRec {
731.1Sjtc   short	 numrows;	/* How many rows of widget. */
741.1Sjtc   Widget	widget;		/* Widget containing this group */
751.1Sjtc   RowList	*rlist;		/* List of widget rows. */
761.1Sjtc   struct _FormBoxRec *form;	/* Which form this is in. */
771.1Sjtc} GroupRec, *Group;
781.1Sjtc
791.1Sjtctypedef struct _FormBoxRec {
801.1Sjtc   Widget outer;	/* Outer widget (contains scrollbars if any) */
811.1Sjtc   Widget inner;	/* Inner widget (contains master form) */
821.1Sjtc   short numgroups;	/* How many groups of form entries we have. */
831.1Sjtc   Group *glist;	/* List of form groups. */
841.1Sjtc   struct _PickRec *pick; /* Which pick this is in. */
851.1Sjtc} FormBoxRec, *FormBox;
861.1Sjtc
871.1Sjtctypedef struct _PickRec {
881.1Sjtc   Scrn scrn;			/* Scrn containing this pick. */
891.1Sjtc   Widget label;		/* Widget with label for this pick. */
901.1Sjtc   Toc toc;			/* Toc for folder being scanned. */
911.1Sjtc   FormBox general;		/* Form for general info about this pick. */
921.1Sjtc   FormBox details;		/* Form for details about this pick. */
931.1Sjtc} PickRec;
941.1Sjtc
951.1Sjtc
961.1Sjtcstatic FormEntry CreateWidget(RowList, WidgetClass, ArgList, Cardinal);
971.1Sjtcstatic void DeleteWidget(FormEntry);
981.1Sjtcstatic void AddDetailGroup(FormBox);
991.1Sjtc
1001.1Sjtcvoid InitPick(void)
1011.1Sjtc{
1021.1Sjtc    TypeName[RTfrom]	= "From:";
1031.1Sjtc    TypeName[RTto]	= "To:";
1041.1Sjtc    TypeName[RTcc]	= "Cc:";
1051.1Sjtc    TypeName[RTdate]	= "Date:";
1061.1Sjtc    TypeName[RTsubject] = "Subject:";
1071.1Sjtc    TypeName[RTsearch]	= "Search:";
1081.1Sjtc    TypeName[RTother]	= NULL;
1091.1Sjtc
1101.1Sjtc    /* Translations which will prevent the Search and Replace functionality
1111.1Sjtc     * of the Text widget in text fields of pick and popups.  The toc's
1121.1Sjtc     * Search and Replace functionality is removed in the app defaults file.
1131.1Sjtc     */
1141.1Sjtc    NoTextSearchAndReplace = XtParseTranslationTable
1151.1Sjtc	("Ctrl<Key>R: no-op(RingBell)\n\
1161.1Sjtc          Ctrl<Key>S: no-op(RingBell)\n");
1171.1Sjtc}
1181.1Sjtc
1191.1Sjtc
1201.1Sjtcstatic void PrepareToUpdate(FormBox form)
1211.1Sjtc{
1221.1Sjtc    XawFormDoLayout(form->inner, FALSE);
1231.1Sjtc}
1241.1Sjtc
1251.1Sjtcstatic void ExecuteUpdate(FormBox form)
1261.1Sjtc{
1271.1Sjtc    XawFormDoLayout(form->inner, TRUE);
1281.1Sjtc    XtManageChild(form->inner);
1291.1Sjtc    XtManageChild(form->outer);
1301.1Sjtc}
1311.1Sjtc
1321.5Shubertfstatic void AddLabel(RowList row, const char *text, int usestd)
1331.5Shubertf{
1341.5Shubertf    static Arg arglist[] = {
1351.5Shubertf	{XtNlabel, (XtArgVal)NULL},
1361.1Sjtc	{XtNborderWidth, (XtArgVal) 0},
1371.1Sjtc	{XtNjustify, (XtArgVal) XtJustifyRight},
1381.1Sjtc	{XtNwidth, (XtArgVal) NULL}
1391.1Sjtc    };
1401.1Sjtc
1411.1Sjtc    arglist[0].value = (XtArgVal) text;
1421.1Sjtc    arglist[XtNumber(arglist) - 1].value = (XtArgVal) stdwidth;
1431.1Sjtc    (void) CreateWidget(row, WTlabel, arglist,
1441.1Sjtc			usestd ? XtNumber(arglist) : XtNumber(arglist) - 1);
1451.1Sjtc}
1461.1Sjtc
1471.1Sjtc
1481.1Sjtcstatic void AddButton(RowList row, const char *text, void (*func)(XMH_CB_ARGS))
1491.1Sjtc{
1501.1Sjtc    FormEntry entry;
1511.1Sjtc    static Arg args[] = {
1521.1Sjtc	{XtNlabel, (XtArgVal)NULL},
1531.1Sjtc    };
1541.1Sjtc
1551.5Shubertf    args[0].value = (XtArgVal)text;
1561.5Shubertf    entry = CreateWidget( row, WTbutton, args, XtNumber(args) );
1571.1Sjtc    XtAddCallback( entry->widget, XtNcallback, func, (XtPointer)entry );
1581.1Sjtc}
1591.1Sjtc
1601.1Sjtc
1611.1Sjtcstatic void AddToggle(
1621.1Sjtc    RowList	row,
1631.1Sjtc    const char	*text,
1641.1Sjtc    int		initial_state,
1651.1Sjtc    Widget	radio_group,
1661.1Sjtc    XtPointer	radio_data)
1671.1Sjtc{
1681.1Sjtc    FormEntry	entry;
1691.1Sjtc    Arg		args[4];
1701.1Sjtc    int		n = 0;
1711.1Sjtc    XtTranslations	translations;
1721.1Sjtc
1731.1Sjtc    XtSetArg(args[n], XtNlabel, text);			n++;
1741.1Sjtc    XtSetArg(args[n], XtNstate, initial_state);		n++;
1751.1Sjtc    XtSetArg(args[n], XtNradioGroup, radio_group);	n++;
1761.1Sjtc    XtSetArg(args[n], XtNradioData, radio_data);	n++;
1771.1Sjtc    entry = CreateWidget(row, toggleWidgetClass, args, (Cardinal)n);
1781.1Sjtc    translations = XtParseTranslationTable("<Btn1Down>,<Btn1Up>:set()\n");
1791.1Sjtc    XtOverrideTranslations(entry->widget, translations);
1801.1Sjtc}
1811.1Sjtc
1821.5Shubertf
1831.5Shubertfstatic void AddTextEntry(RowList row, const char *str)
1841.5Shubertf{
1851.5Shubertf    FormEntry	entry;
1861.5Shubertf    static Arg arglist[] = {
1871.5Shubertf	{XtNstring, (XtArgVal) NULL},
1881.5Shubertf	{XtNwidth, (XtArgVal) NULL},
1891.5Shubertf	{XtNlength, (XtArgVal) 300},
1901.5Shubertf	{XtNresize, (XtArgVal) XawtextResizeBoth},
1911.5Shubertf	{XtNeditType, (XtArgVal)XawtextEdit},
1921.5Shubertf    };
1931.5Shubertf    arglist[0].value = (XtArgVal) str;
1941.5Shubertf    arglist[1].value = (XtArgVal) stdwidth;
1951.5Shubertf    entry = CreateWidget( row, WTtextentry, arglist, XtNumber(arglist) );
1961.5Shubertf    XtOverrideTranslations(entry->widget, NoTextSearchAndReplace);
1971.5Shubertf}
1981.5Shubertf
1991.5Shubertf
2001.5Shubertfstatic void ChangeTextEntry(FormEntry entry, const char *str)
2011.5Shubertf{
2021.5Shubertf    Arg arglist[1];
2031.5Shubertf    char *ptr;
2041.5Shubertf
2051.5Shubertf    XtSetArg(arglist[0], XtNstring, &ptr);
2061.5Shubertf    XtGetValues(entry->widget, arglist, (Cardinal) 1);
2071.5Shubertf    if (strcmp(str, ptr) == 0)
2081.5Shubertf        return;
2091.5Shubertf
2101.5Shubertf    XtSetArg(arglist[0], XtNstring, str);
2111.5Shubertf    XtSetValues(entry->widget, arglist, (Cardinal) 1);
2121.5Shubertf}
2131.5Shubertf
2141.5Shubertf/* ARGSUSED */
2151.5Shubertfstatic void ExecRowOr(
2161.5Shubertf    Widget w,			/* unused */
2171.5Shubertf    XtPointer closure,		/* FormEntry */
2181.5Shubertf    XtPointer call_data)	/* unused */
2191.5Shubertf{
2201.5Shubertf    FormEntry entry = (FormEntry)closure;
2211.5Shubertf    RowList row = entry->row;
2221.5Shubertf    FormBox form = row->group->form;
2231.5Shubertf    PrepareToUpdate(form);
2241.5Shubertf    DeleteWidget(entry);
2251.5Shubertf    AddLabel(row, "or", FALSE);
2261.5Shubertf    AddTextEntry(row, "");
2271.5Shubertf    AddButton(row, "Or", ExecRowOr);
2281.5Shubertf    ExecuteUpdate(form);
2291.5Shubertf}
2301.5Shubertf
2311.5Shubertf
2321.5Shubertf/* ARGSUSED */
2331.5Shubertfstatic void ExecGroupOr(
2341.5Shubertf    Widget w,			/* unused */
2351.5Shubertf    XtPointer closure,		/* FormEntry */
2361.5Shubertf    XtPointer call_data)	/* unused */
2371.5Shubertf{
2381.5Shubertf    FormBox form = ((FormEntry)closure)->row->group->form;
2391.5Shubertf/* %%%    XUnmapWindow(theDisplay, XtWindow(form->inner)); */
2401.5Shubertf    PrepareToUpdate(form);
2411.5Shubertf    AddDetailGroup(form);
2421.5Shubertf    ExecuteUpdate(form);
2431.5Shubertf/* %%%    XtMapWidget(form->inner); */
2441.5Shubertf}
2451.1Sjtc
2461.1Sjtcstatic char **argv;
2471.1Sjtcstatic int argvsize;
2481.1Sjtc
2491.1Sjtc
2501.1Sjtcstatic void AppendArgv(const char *ptr)
2511.1Sjtc{
2521.1Sjtc    argvsize++;
2531.1Sjtc    argv = ResizeArgv(argv, argvsize);
2541.1Sjtc    argv[argvsize - 1] = XtNewString(ptr);
2551.1Sjtc}
2561.1Sjtc
2571.1Sjtcstatic void EraseLast(void)
2581.1Sjtc{
2591.1Sjtc    argvsize--;
2601.1Sjtc    XtFree((char *) argv[argvsize]);
2611.1Sjtc    argv[argvsize] = NULL;
2621.1Sjtc}
2631.1Sjtc
2641.5Shubertf
2651.5Shubertf
2661.1Sjtcstatic Boolean ParseRow(RowList row)
2671.1Sjtc{
2681.1Sjtc    int		result = FALSE;
2691.1Sjtc    int		i;
2701.1Sjtc    FormEntry	entry;
2711.1Sjtc    char	str[1000];
2721.1Sjtc    Arg	  	args[4];
2731.1Sjtc    char	*ptr;
2741.1Sjtc    char	*other;
2751.1Sjtc
2761.1Sjtc    if (row->type > LASTUSEFULROWTYPE)
2771.1Sjtc	return FALSE;
2781.1Sjtc
2791.1Sjtc    for (i = 3; i < row->numwidgets; i += 2) {
2801.1Sjtc	entry = row->wlist[i];
2811.1Sjtc	XtSetArg(args[0], XtNstring, &ptr);
2821.1Sjtc	XtGetValues(entry->widget, args, (Cardinal) 1);
2831.1Sjtc	if (ptr && *ptr) {
2841.1Sjtc	    if (!result) {
2851.1Sjtc		result = TRUE;
2861.1Sjtc		if (! (*((short *)
2871.1Sjtc			 (XawToggleGetCurrent(row->wlist[0]->widget)))))
2881.1Sjtc		    AppendArgv("-not");
2891.1Sjtc		AppendArgv("-lbrace");
2901.1Sjtc	    }
2911.1Sjtc	    switch (row->type) {
2921.1Sjtc		case RTfrom:
2931.1Sjtc		    AppendArgv("-from");
2941.1Sjtc		    break;
2951.1Sjtc		case RTto:
2961.1Sjtc		    AppendArgv("-to");
2971.1Sjtc		    break;
2981.1Sjtc		case RTcc:
2991.1Sjtc		    AppendArgv("-cc");
3001.1Sjtc		    break;
3011.1Sjtc		case RTdate:
3021.3Sthorpej		    AppendArgv("-date");
3031.1Sjtc		    break;
3041.1Sjtc		case RTsubject:
3051.1Sjtc		    AppendArgv("-subject");
3061.1Sjtc		    break;
3071.3Sthorpej		case RTsearch:
3081.1Sjtc		    AppendArgv("-search");
3091.1Sjtc		    break;
3101.1Sjtc		case RTother:
3111.1Sjtc		    XtSetArg(args[0], XtNstring, &other);
3121.1Sjtc		    XtGetValues(row->wlist[2]->widget, args, (Cardinal) 1);
3131.1Sjtc		    snprintf(str, sizeof(str), "--%s", other);
3141.1Sjtc		    AppendArgv(str);
3151.1Sjtc		    break;
3161.1Sjtc	    }
3171.1Sjtc	    AppendArgv(ptr);
3181.1Sjtc	    AppendArgv("-or");
3191.1Sjtc	}
3201.1Sjtc    }
3211.1Sjtc    if (result) {
3221.1Sjtc	EraseLast();
3231.1Sjtc	AppendArgv("-rbrace");
3241.1Sjtc	AppendArgv("-and");
3251.1Sjtc    }
3261.1Sjtc    return result;
3271.1Sjtc}
3281.1Sjtc
3291.1Sjtc
3301.1Sjtcstatic Boolean ParseGroup(Group group)
3311.1Sjtc{
3321.1Sjtc    int found = FALSE;
3331.1Sjtc    int i;
3341.1Sjtc    for (i=0 ; i<group->numrows ; i++)
3351.1Sjtc	found |= ParseRow(group->rlist[i]);
3361.1Sjtc    if (found) {
3371.1Sjtc	EraseLast();
3381.1Sjtc	AppendArgv("-rbrace");
3391.1Sjtc	AppendArgv("-or");
3401.1Sjtc	AppendArgv("-lbrace");
3411.1Sjtc    }
3421.1Sjtc    return found;
3431.1Sjtc}
3441.1Sjtc
3451.1Sjtc/* ARGSUSED */
3461.1Sjtcstatic void ExecOK(
3471.1Sjtc    Widget w,			/* unused */
3481.1Sjtc    XtPointer closure,		/* FormEntry */
3491.1Sjtc    XtPointer call_data)	/* unused */
3501.1Sjtc{
3511.1Sjtc    Pick pick = ((FormEntry)closure)->row->group->form->pick;
3521.1Sjtc    Toc toc = pick->toc;
3531.1Sjtc    FormBox details = pick->details;
3541.1Sjtc    FormBox general = pick->general;
3551.1Sjtc    Group group = general->glist[0];
3561.1Sjtc    RowList row0 = group->rlist[0];
3571.1Sjtc    RowList row1 = group->rlist[1];
3581.1Sjtc    RowList row2 = group->rlist[2];
3591.4Schristos    char *fromseq;
3601.1Sjtc    char *toseq;
3611.1Sjtc    char *datefield;
3621.1Sjtc    char *fromdate;
3631.1Sjtc    char *todate;
3641.1Sjtc    short removeoldmsgs =
3651.1Sjtc	*((short*)XawToggleGetCurrent(row2->wlist[1]->widget));
3661.1Sjtc    int i, found;
3671.1Sjtc    char *folderpath;
3681.1Sjtc    int cmd_status;
3691.1Sjtc    Arg args[5];
3701.1Sjtc
3711.1Sjtc    XtSetArg(args[0], XtNstring, &toseq);
3721.1Sjtc    XtGetValues(row0->wlist[1]->widget, args, (Cardinal) 1);
3731.1Sjtc    if (strcmp(toseq, "all") == 0) {
3741.1Sjtc	PopupError(pick->scrn->parent,
3751.1Sjtc		   "Can't create a sequence called \"all\".");
3761.1Sjtc	return;
3771.1Sjtc    }
3781.1Sjtc    XtSetArg(args[0], XtNstring, &fromseq);
3791.1Sjtc    XtGetValues(row0->wlist[3]->widget, args, (Cardinal) 1);
3801.1Sjtc    if (TocGetSeqNamed(toc, fromseq) == NULL) {
3811.1Sjtc	char str[200];
3821.1Sjtc	snprintf(str, sizeof(str), "Sequence \"%s\" doesn't exist!", fromseq);
3831.1Sjtc	PopupError(pick->scrn->parent, str);
3841.1Sjtc	return;
3851.1Sjtc    }
3861.1Sjtc
3871.1Sjtc    argv = MakeArgv(1);
3881.1Sjtc    argvsize = 0;
3891.1Sjtc    AppendArgv("pick");
3901.1Sjtc    AppendArgv(folderpath = TocMakeFolderName(toc));
3911.1Sjtc    XtFree(folderpath);
3921.1Sjtc    AppendArgv(fromseq);
3931.1Sjtc    AppendArgv("-sequence");
3941.1Sjtc    AppendArgv(toseq);
3951.1Sjtc    if (removeoldmsgs)
3961.1Sjtc	AppendArgv("-zero");
3971.1Sjtc    else
3981.1Sjtc	AppendArgv("-nozero");
3991.1Sjtc    XtSetArg(args[0], XtNstring, &datefield);
4001.1Sjtc    XtGetValues(row1->wlist[5]->widget, args, (Cardinal) 1);
4011.1Sjtc    if (*datefield) {
4021.1Sjtc	AppendArgv("-datefield");
4031.1Sjtc	AppendArgv(datefield);
4041.1Sjtc    }
4051.1Sjtc    XtSetArg(args[0], XtNstring, &fromdate);
4061.1Sjtc    XtGetValues(row1->wlist[1]->widget, args, (Cardinal) 1);
4071.1Sjtc    if (*fromdate) {
4081.1Sjtc	AppendArgv("-after");
4091.1Sjtc	AppendArgv(fromdate);
4101.1Sjtc	AppendArgv("-and");
4111.1Sjtc    }
4121.1Sjtc    XtSetArg(args[0], XtNstring, &todate);
4131.1Sjtc    XtGetValues(row1->wlist[3]->widget, args, (Cardinal) 1);
4141.1Sjtc    if (*todate) {
4151.1Sjtc	AppendArgv("-before");
4161.1Sjtc	AppendArgv(todate);
4171.1Sjtc	AppendArgv("-and");
4181.1Sjtc    }
4191.1Sjtc    found = FALSE;
4201.1Sjtc    AppendArgv("-lbrace");
4211.1Sjtc    AppendArgv("-lbrace");
4221.1Sjtc    for (i=0 ; i<details->numgroups ; i++)
4231.1Sjtc	found |= ParseGroup(details->glist[i]);
4241.1Sjtc    EraseLast();
4251.1Sjtc    EraseLast();
4261.1Sjtc    if (found) AppendArgv("-rbrace");
4271.1Sjtc    else if (*fromdate || *todate) EraseLast();
4281.1Sjtc    if (app_resources.debug) {
4291.1Sjtc	for (i=0 ; i<argvsize ; i++)
4301.1Sjtc	    (void) fprintf(stderr, "%s ", argv[i]);
4311.1Sjtc	(void) fprintf(stderr, "\n");
4321.1Sjtc    }
4331.1Sjtc    if (app_resources.block_events_on_busy) ShowBusyCursor();
4341.1Sjtc
4351.1Sjtc    cmd_status = DoCommand(argv, (char*)NULL, (char*)NULL);
4361.1Sjtc    TocReloadSeqLists(toc);
4371.1Sjtc    TocChangeViewedSeq(toc, TocGetSeqNamed(toc, toseq));
4381.1Sjtc
4391.1Sjtc    if (app_resources.block_events_on_busy) UnshowBusyCursor();
4401.1Sjtc    if (cmd_status == 0 /*succeeded*/) DestroyScrn(pick->scrn);
4411.1Sjtc    for (i=0 ; i<argvsize ; i++) XtFree((char *) argv[i]);
4421.1Sjtc    XtFree((char *) argv);
4431.1Sjtc}
4441.1Sjtc
4451.1Sjtc
4461.1Sjtc/* ARGSUSED */
4471.1Sjtcstatic void ExecCancel(
4481.1Sjtc    Widget w,			/* unused */
4491.1Sjtc    XtPointer closure,		/* FormEntry */
4501.1Sjtc    XtPointer call_data)	/* unused */
4511.1Sjtc{
4521.1Sjtc    Pick pick = ((FormEntry)closure)->row->group->form->pick;
4531.1Sjtc    Scrn scrn = pick->scrn;
4541.1Sjtc    (void) DestroyScrn(scrn);
4551.1Sjtc}
4561.1Sjtc
4571.1Sjtc
4581.1Sjtcstatic FormEntry CreateWidget(
4591.1Sjtc    RowList row,
4601.1Sjtc    WidgetClass class,
4611.1Sjtc    ArgList args,
4621.1Sjtc    Cardinal num_args)
4631.1Sjtc{
4641.1Sjtc    static Arg arglist[] = {
4651.1Sjtc	{XtNfromHoriz, (XtArgVal)NULL},
4661.1Sjtc	{XtNresizable, (XtArgVal)TRUE},
4671.1Sjtc	{XtNtop, (XtArgVal) XtChainTop},
4681.1Sjtc	{XtNleft, (XtArgVal) XtChainLeft},
4691.1Sjtc	{XtNbottom, (XtArgVal) XtChainTop},
4701.1Sjtc	{XtNright, (XtArgVal) XtChainLeft},
4711.1Sjtc    };
4721.1Sjtc    ArgList merged_args;
4731.1Sjtc    FormEntry entry;
4741.1Sjtc
4751.1Sjtc    row->numwidgets++;
4761.1Sjtc    row->wlist = XtReallocArray(row->wlist, row->numwidgets, sizeof(FormEntry));
4771.1Sjtc    entry = XtNew(FormEntryRec);
4781.1Sjtc    entry->row = row;
4791.1Sjtc    entry->type = class;
4801.1Sjtc    row->wlist[row->numwidgets - 1] = entry;
4811.1Sjtc    if (row->numwidgets > 1)
4821.1Sjtc	arglist[0].value = (XtArgVal) row->wlist[row->numwidgets - 2]->widget;
4831.1Sjtc    else
4841.1Sjtc	arglist[0].value = (XtArgVal) NULL;
4851.1Sjtc
4861.1Sjtc    merged_args = XtMergeArgLists(args, num_args, arglist, XtNumber(arglist) );
4871.1Sjtc
4881.1Sjtc    entry->widget = XtCreateManagedWidget( (String) NULL, class, row->widget,
4891.1Sjtc					   merged_args,
4901.1Sjtc					   num_args + XtNumber(arglist) );
4911.1Sjtc
4921.1Sjtc    XtFree((char *) merged_args);
4931.1Sjtc    return entry;
4941.1Sjtc}
4951.1Sjtc
4961.1Sjtc
4971.5Shubertfstatic void
4981.1SjtcDeleteWidget(FormEntry entry)
4991.1Sjtc{
5001.1Sjtc    RowList row = entry->row;
5011.1Sjtc    int i;
5021.1Sjtc    XtDestroyWidget(entry->widget);
5031.5Shubertf    for (i = 0; i < row->numwidgets; i++)
5041.1Sjtc	if (row->wlist[i] == entry)
5051.5Shubertf	    break;
5061.5Shubertf    row->numwidgets--;
5071.1Sjtc    for (; i < row->numwidgets; i++)
5081.1Sjtc	row->wlist[i] = row->wlist[i + 1];
5091.1Sjtc}
5101.1Sjtc
5111.1Sjtc
5121.1Sjtc/* Figure out how wide text fields and labels should be so that they'll all
5131.5Shubertf   line up correctly, and be big enough to hold everything, but not too big. */
5141.1Sjtc
5151.5Shubertfstatic void FindStdWidth(void)
5161.1Sjtc{
5171.5Shubertf    stdwidth = 100;		/* %%% HACK! */
5181.1Sjtc}
5191.1Sjtc
5201.1Sjtc
5211.5Shubertfstatic RowList AddRow(Group group, int type)
5221.1Sjtc{
5231.1Sjtc    static Arg arglist[] = {
5241.1Sjtc	{XtNborderWidth, (XtArgVal) 0},
5251.5Shubertf	{XtNfromVert, (XtArgVal) NULL},
5261.1Sjtc	{XtNresizable, (XtArgVal) TRUE},
5271.1Sjtc	{XtNtop, (XtArgVal) XtChainTop},
5281.1Sjtc	{XtNleft, (XtArgVal) XtChainLeft},
5291.1Sjtc	{XtNbottom, (XtArgVal) XtChainTop},
5301.1Sjtc	{XtNright, (XtArgVal) XtChainLeft}
5311.1Sjtc    };
5321.1Sjtc    RowList row;
5331.1Sjtc    group->numrows++;
5341.1Sjtc    group->rlist = XtReallocArray(group->rlist, group->numrows, sizeof(RowList));
5351.1Sjtc    group->rlist[group->numrows - 1] = row = XtNew(RowListRec);
5361.1Sjtc    row->type = type;
5371.1Sjtc    row->numwidgets = 0;
5381.1Sjtc    row->wlist = (FormEntry *) NULL;
5391.1Sjtc    row->group = group;
5401.1Sjtc    if (group->numrows > 1)
5411.1Sjtc	arglist[1].value = (XtArgVal)group->rlist[group->numrows - 2]->widget;
5421.5Shubertf    else
5431.1Sjtc	arglist[1].value = (XtArgVal) NULL;
5441.1Sjtc    row->widget = XtCreateWidget("rowform", formWidgetClass, group->widget,
5451.1Sjtc				  arglist, XtNumber(arglist) );
5461.1Sjtc    if (type == RTignore) return row;
5471.1Sjtc    AddToggle(row, "Pick", TRUE, (Widget)NULL, (XtPointer)(&true_data));
5481.1Sjtc    AddToggle(row, "Skip", FALSE, row->wlist[row->numwidgets - 1]->widget,
5491.5Shubertf	      (XtPointer)(&false_data));
5501.5Shubertf    if (TypeName[type])
5511.5Shubertf	AddLabel(row, TypeName[type], TRUE);
5521.5Shubertf    else
5531.1Sjtc	AddTextEntry(row, "");
5541.1Sjtc    AddTextEntry(row, "");
555    AddButton(row, "Or", ExecRowOr);
556    XtManageChild(row->widget);
557    return row;
558}
559
560
561static Group AddGroup(FormBox form)
562{
563    static Arg arglist[] = {
564	{XtNborderWidth, (XtArgVal) 0},
565	{XtNfromVert, (XtArgVal) NULL},
566	{XtNresizable, (XtArgVal) TRUE},
567	{XtNtop, (XtArgVal) XtChainTop},
568	{XtNleft, (XtArgVal) XtChainLeft},
569	{XtNbottom, (XtArgVal) XtChainTop},
570	{XtNright, (XtArgVal) XtChainLeft}
571    };
572    Group group;
573    form->numgroups++;
574    form->glist = XtReallocArray(form->glist, form->numgroups, sizeof(Group));
575    form->glist[form->numgroups - 1] = group =
576	(Group) XtMalloc((Cardinal) sizeof(GroupRec));
577    group->numrows = 0;
578    group->form = form;
579    group->rlist = (RowList *) NULL;
580    if (form->numgroups > 1)
581	arglist[1].value = (XtArgVal)form->glist[form->numgroups - 2]->widget;
582    else
583	arglist[1].value = (XtArgVal)NULL;
584    group->widget = XtCreateWidget("groupform", formWidgetClass, form->inner,
585				    arglist, XtNumber(arglist) );
586    return group;
587}
588
589
590
591static void
592AddDetailGroup(FormBox form)
593{
594    Group group;
595    RowList row;
596    int     type;
597
598    if (form->numgroups > 0) {
599	group = form->glist[form->numgroups - 1];
600	row = group->rlist[group->numrows - 1];
601	DeleteWidget(row->wlist[0]);
602	AddLabel(row, "- or -", FALSE);
603    }
604    group = AddGroup(form);
605    for (type = FIRSTROWTYPE; type <= LASTUSEFULROWTYPE; type++)
606	(void) AddRow(group, type);
607    row =  AddRow(group, RTignore);
608    AddButton(row, "- Or -", ExecGroupOr);
609    XtManageChild(row->widget);
610    if (XtIsRealized(XtParent(group->widget)))
611	XtRealizeWidget(group->widget);
612    XtManageChild(group->widget);
613}
614
615
616static void AddGeneralGroup(FormBox form)
617{
618    Group group;
619    RowList row;
620    Widget widgetList[4];
621    group = AddGroup(form);
622    row =  AddRow(group, RTignore);
623    widgetList[0] = row->widget;
624    AddLabel(row, "Creating sequence:", FALSE);
625    AddTextEntry(row, "");
626    AddLabel(row, "with msgs from sequence:", FALSE);
627    AddTextEntry(row, "");
628    row =  AddRow(group, RTignore);
629    widgetList[1] = row->widget;
630    AddLabel(row, "Date range:", FALSE);
631    AddTextEntry(row, "");
632    AddLabel(row, " - ", FALSE);
633    AddTextEntry(row, "");
634    AddLabel(row, "Date field:", FALSE);
635    AddTextEntry(row, "");
636    row =  AddRow(group, RTignore);
637    widgetList[2] = row->widget;
638    AddLabel(row, "Clear old entries from sequence?", FALSE);
639    AddToggle(row, "Yes", TRUE, (Widget) NULL, (XtPointer)(&true_data));
640    AddToggle(row, "No", FALSE, row->wlist[row->numwidgets - 1]->widget,
641	      (XtPointer)(&false_data));
642    row =  AddRow(group, RTignore);
643    widgetList[3] = row->widget;
644    AddButton(row, "OK", ExecOK);
645    AddButton(row, "Cancel", ExecCancel);
646    XtManageChildren(widgetList, XtNumber(widgetList));
647    XtManageChild(group->widget);
648}
649
650
651static void InitGeneral(Pick pick, const char *fromseq, const char *toseq)
652{
653    RowList row;
654    row = pick->general->glist[0]->rlist[0];
655    ChangeTextEntry(row->wlist[1], toseq);
656    ChangeTextEntry(row->wlist[3], fromseq);
657}
658
659
660static void CleanForm(FormBox form)
661{
662    int i, j, k;
663    Group group;
664    RowList row;
665    FormEntry entry;
666    for (i=0 ; i<form->numgroups ; i++) {
667	group = form->glist[i];
668	for (j=0 ; j<group->numrows ; j++) {
669	    row = group->rlist[j];
670	    for (k=0 ; k<row->numwidgets ; k++) {
671		entry = row->wlist[k];
672		if (entry->type == WTtextentry)
673		    ChangeTextEntry(entry, "");
674	    }
675	}
676    }
677}
678
679
680static FormBox MakeAForm(Pick pick)
681{
682    static Arg arglist1[] = {
683	{XtNallowHoriz, (XtArgVal)TRUE},
684	{XtNallowVert, (XtArgVal)TRUE},
685/* %%%	{XtNallowResize, (XtArgVal)TRUE}, */
686	{XtNmin, (XtArgVal)50},
687	{XtNmax, (XtArgVal)1500}
688    };
689    static Arg arglist2[] = {
690	{XtNborderWidth, (XtArgVal) 0}
691    };
692    FormBox result;
693    result = (FormBox) XtMalloc((Cardinal) sizeof(FormBoxRec));
694    result->outer = XtCreateWidget( "pick", viewportWidgetClass,
695				    pick->scrn->widget,
696				    arglist1, XtNumber(arglist1) );
697    result->inner = XtCreateWidget( "form", formWidgetClass, result->outer,
698				    arglist2, XtNumber(arglist2) );
699    result->pick = pick;
700    result->numgroups = 0;
701    result->glist = (Group *) NULL;
702    return result;
703}
704
705
706void AddPick(Scrn scrn, Toc toc, const char *fromseq, const char *toseq)
707{
708    Pick pick;
709    FormBox general, details;
710    char str[100];
711#ifdef notdef
712    int height;
713#endif /* notdef */
714
715    if (scrn->pick) {
716	pick = scrn->pick;
717	CleanForm(pick->details);
718	CleanForm(pick->general);
719    } else {
720	pick = scrn->pick = (Pick) XtMalloc((Cardinal) sizeof(PickRec));
721	pick->scrn = scrn;
722	pick->label = CreateTitleBar(scrn, "pickTitlebar");
723	pick->details = details = MakeAForm(pick);
724	pick->general = general = MakeAForm(pick);
725	FindStdWidth();
726	XawPanedSetRefigureMode(scrn->widget, False);
727	PrepareToUpdate(details);
728	AddDetailGroup(details);
729	ExecuteUpdate(details);
730	PrepareToUpdate(general);
731	AddGeneralGroup(general);
732	ExecuteUpdate(general);
733#ifdef notdef
734	height = general->inner->core.height;
735	if (general->inner->core.width > scrn->widget->core.width)
736	    height += XtScrollMgrGetThickness(general->outer);
737	XawPanedSetMinMax(scrn->widget, general->outer, height, height);
738	XawPanedSetMinMax(scrn->widget, general->outer, 10, 10000);
739#endif /* notdef */
740	XawPanedSetRefigureMode(scrn->widget, True);
741    }
742    pick->toc = toc;
743    InitGeneral(pick, fromseq, toseq);
744    snprintf(str, sizeof(str), "Pick: %s", TocName(toc));
745    ChangeLabel(pick->label, str);
746    StoreWindowName(scrn, str);
747}
748