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