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