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