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