Annotation of researchv9/X11/src/X.V11R1/clients/xmh/pick.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char rcs_id[] = "$Header: pick.c,v 1.11 87/09/11 08:18:17 toddb Exp $";
                      3: #endif lint
                      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 RIGHTS,
                     16:  * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT
                     17:  * SET FORTH ABOVE.
                     18:  *
                     19:  *
                     20:  * Permission to use, copy, modify, and distribute this software and its
                     21:  * documentation for any purpose and without fee is hereby granted, provided
                     22:  * that the above copyright notice appear in all copies and that both that
                     23:  * copyright notice and this permission notice appear in supporting documentation,
                     24:  * and that the name of Digital Equipment Corporation not be used in advertising
                     25:  * or publicity pertaining to distribution of the software without specific, 
                     26:  * written prior permission.
                     27:  */
                     28: 
                     29: /* pick.c -- handle a pick subwindow. */
                     30: 
                     31: #include "xmh.h"
                     32: #include "Form.h"
                     33: 
                     34: #define WTlabel                0
                     35: #define WTbutton       1
                     36: #define WTtextentry    2
                     37: 
                     38: #define        RTfrom          0
                     39: #define        RTto            1
                     40: #define        RTcc            2
                     41: #define RTdate         3
                     42: #define        RTsubject       4
                     43: #define        RTsearch        5
                     44: #define        RTother         6
                     45: #define        RTignore        7
                     46: 
                     47: #define FIRSTROWTYPE           RTfrom
                     48: #define LASTUSEFULROWTYPE      RTother
                     49: #define NUMROWTYPE             (RTignore+1)
                     50: 
                     51: static int stdwidth = -1;      /* Width to make text fields, and other
                     52:                                   things that want to be the same width as
                     53:                                   text fields. */
                     54: 
                     55: static char *TypeName[NUMROWTYPE];
                     56: 
                     57: typedef struct {
                     58:    short       type;           /* Encode what type of window this is. */
                     59:    Window      window;         /* The window id itself. */
                     60:    struct _RowListRec *row;    /* Which row this window is in. */
                     61:    short       hilite;         /* Whether to hilight (if button subwindow) */
                     62:    char                *ptr;           /* Data (if text subwindow) */
                     63: } FormEntryRec, *FormEntryPtr;
                     64: 
                     65: typedef struct _RowListRec {
                     66:    short       type;           /* Encode what type of list this is. */
                     67:    Window      window;         /* Window containing this row */
                     68:    short       numwindows;     /* How many windows in this list. */
                     69:    FormEntryPtr *wlist;                /* List of windows. */
                     70:    struct _GroupRec *group;    /* Which group this is in. */
                     71: } RowListRec, *RowListPtr;
                     72: 
                     73: typedef struct _GroupRec {
                     74:    short        numrows;       /* How many rows of window. */
                     75:    Window      window;         /* Window containing this group */
                     76:    RowListPtr  *rlist;         /* List of window rows. */
                     77:    struct _FormBoxRec *form;   /* Which form this is in. */
                     78: } GroupRec, *GroupPtr;
                     79: 
                     80: typedef struct _FormBoxRec {
                     81:    Window outer;       /* Outer window (contains scrollbars if any) */
                     82:    Window inner;       /* Inner window (contains master form) */
                     83:    short numgroups;    /* How many groups of form entries we have. */
                     84:    GroupPtr *glist;    /* List of form groups. */
                     85:    struct _PickRec *pick; /* Which pick this is in. */
                     86: } FormBoxRec, *FormBoxPtr;
                     87: 
                     88: typedef struct _PickRec {
                     89:    Scrn scrn;                  /* Scrn containing this pick. */
                     90:    Window label;               /* Window with label for this pick. */
                     91:    Toc toc;                    /* Toc for folder being scanned. */
                     92:    FormBoxPtr general;         /* Form for general info about this pick. */
                     93:    FormBoxPtr details;         /* Form for details about this pick. */
                     94:    Window errorwindow;         /* Pop-up error window. */
                     95: } PickRec;
                     96: 
                     97: 
                     98: InitPick()
                     99: {
                    100:     TypeName[RTfrom]   = "From:";
                    101:     TypeName[RTto]     = "To:";
                    102:     TypeName[RTcc]     = "Cc:";
                    103:     TypeName[RTdate]   = "Date:";
                    104:     TypeName[RTsubject] = "Subject:";
                    105:     TypeName[RTsearch] = "Search:";
                    106:     TypeName[RTother]  = NULL;
                    107: }
                    108: 
                    109: static PickFlipColors(window)
                    110: Window window;
                    111: {
                    112:     static Arg arglist[] = {
                    113:        {XtNforeground, NULL},
                    114:        {XtNbackground, NULL},
                    115:     };
                    116:     XtArgVal temp;
                    117:     XtCommandGetValues(DISPLAY window, arglist, XtNumber(arglist));
                    118:     temp = arglist[0].value;
                    119:     arglist[0].value = arglist[1].value;
                    120:     arglist[1].value = temp;
                    121:     XtCommandSetValues(DISPLAY window, arglist, XtNumber(arglist));
                    122: }
                    123: 
                    124: 
                    125: static PrepareToUpdate(form)
                    126:   FormBoxPtr form;
                    127: {
                    128:     XtFormDoLayout(DISPLAY form->inner, FALSE);
                    129: }
                    130: 
                    131: static ExecuteUpdate(form)
                    132:   FormBoxPtr form;
                    133: {
                    134:     XtFormDoLayout(DISPLAY form->inner, TRUE);
                    135: }
                    136: 
                    137: static FormEntryPtr CreateEntry(window, type)
                    138:   Window window;
                    139:   int type;
                    140: {
                    141:     FormEntryPtr entry;
                    142:     entry = (FormEntryPtr) XtMalloc(sizeof(FormEntryRec));
                    143:     entry->row = NULL;
                    144:     entry->window = window;
                    145:     entry->type = type;
                    146:     return entry;
                    147: }
                    148: 
                    149: 
                    150: static void AddLabel(row, text, usestd)
                    151:   RowListPtr row;
                    152:   char *text;
                    153:   int usestd;
                    154: {
                    155:     Window window;
                    156:     static Arg arglist[] = {
                    157:        {XtNlabel, NULL},
                    158:        {XtNborderWidth, (XtArgVal) 0},
                    159:        {XtNjustify, (XtArgVal) XtjustifyRight},
                    160:        {XtNwidth, (XtArgVal) NULL}
                    161:     };
                    162:     arglist[0].value = (XtArgVal) text;
                    163:     arglist[XtNumber(arglist) - 1].value = (XtArgVal) stdwidth;
                    164:     window = XtLabelCreate(DISPLAY row->window, arglist,
                    165:                           usestd ? XtNumber(arglist) : XtNumber(arglist) - 1);
                    166:     AddWindow(row, CreateEntry(window, WTlabel));
                    167: }
                    168: 
                    169: 
                    170: static void AddButton(row, text, func, hilite)
                    171:   RowListPtr row;
                    172:   char *text;
                    173:   int (*func)();
                    174:   int hilite;
                    175: {
                    176:     FormEntryPtr entry;
                    177:     static Arg arglist[] = {
                    178:        {XtNlabel, NULL},
                    179:        {XtNfunction, NULL},
                    180:        {XtNparameter, NULL}
                    181:     };
                    182:     entry = CreateEntry((Window) 0, WTbutton);
                    183:     arglist[0].value = (XtArgVal)text;
                    184:     arglist[1].value = (XtArgVal)func;
                    185:     arglist[2].value = (XtArgVal)entry;
                    186:     entry->window = XtCommandCreate(DISPLAY  row->window,
                    187:                                    arglist, XtNumber(arglist));
                    188:     entry->hilite = hilite;
                    189:     if (hilite) PickFlipColors(entry->window);
                    190:     AddWindow(row, entry);
                    191: }
                    192: 
                    193: 
                    194: static void AddTextEntry(row, str)
                    195:   RowListPtr row;
                    196:   char *str;
                    197: {
                    198:     static Arg arglist[] = {
                    199:        {XtNstring, (XtArgVal) NULL},
                    200:        {XtNwidth, (XtArgVal) NULL},
                    201:        {XtNlength, (XtArgVal) 300},
                    202:        {XtNtextOptions, (XtArgVal)(resizeWidth | resizeHeight)},
                    203:        {XtNeditType, (XtArgVal)XttextEdit},
                    204:     };
                    205:     char *ptr;
                    206:     FormEntryPtr entry;
                    207:     ptr = XtMalloc(310);
                    208:     arglist[0].value = (XtArgVal) ptr;
                    209:     arglist[1].value = (XtArgVal) stdwidth;
                    210:     (void) strcpy(ptr, str);
                    211:     entry = CreateEntry(XtTextStringCreate(DISPLAY row->window, arglist,
                    212:                                           XtNumber(arglist)),
                    213:                        WTtextentry);
                    214:     entry->ptr = ptr;
                    215:     AddWindow(row, entry);
                    216: }
                    217: 
                    218: 
                    219: static void ChangeTextEntry(entry, str)
                    220: FormEntryPtr entry;
                    221: char *str;
                    222: {
                    223:     static Arg arglist[] = {
                    224:        {XtNtextSource, (XtArgVal) NULL}
                    225:     };
                    226:     XtTextSource *source;
                    227:     if (strcmp(str, entry->ptr) == 0) return;
                    228:     XtTextGetValues(DISPLAY entry->window, arglist, XtNumber(arglist));
                    229:     source = (XtTextSource *) arglist[0].value;
                    230:     XtStringSourceDestroy(source);
                    231:     (void) strcpy(entry->ptr, str);
                    232:     source = (XtTextSource *)
                    233:        XtStringSourceCreate(entry->ptr, 300, XttextEdit);
                    234:     XtTextNewSource(DISPLAY entry->window, source, (XtTextPosition) 0);
                    235: }
                    236: 
                    237: 
                    238: static ExecYesNo(entry)
                    239:   FormEntryPtr entry;
                    240: {
                    241:     RowListPtr row = entry->row;
                    242:     int i;
                    243:     if (!entry->hilite) {
                    244:        entry->hilite = TRUE;
                    245:        PickFlipColors(entry->window);
                    246:        for (i = 0; i < row->numwindows; i++)
                    247:            if (entry == row->wlist[i])
                    248:                break;
                    249:        if (i > 0 && row->wlist[i-1]->type == WTbutton)
                    250:            i--;
                    251:        else
                    252:            i++;
                    253:        entry = row->wlist[i];
                    254:        entry->hilite = FALSE;
                    255:        PickFlipColors(entry->window);
                    256:     }
                    257: }
                    258: 
                    259: 
                    260: 
                    261: 
                    262: static ExecRowOr(entry)
                    263:   FormEntryPtr entry;
                    264: {
                    265:     RowListPtr row = entry->row;
                    266:     FormBoxPtr form = row->group->form;
                    267:     PrepareToUpdate(form);
                    268:     DeleteWindow(entry);
                    269:     AddLabel(row, "or", FALSE);
                    270:     AddTextEntry(row, "");
                    271:     AddButton(row, "Or", ExecRowOr, FALSE);
                    272:     ExecuteUpdate(form);
                    273: }
                    274:     
                    275: 
                    276: static ExecGroupOr(entry)
                    277:   FormEntryPtr entry;
                    278: {
                    279:     FormBoxPtr form = entry->row->group->form;
                    280:     QXUnmapWindow(theDisplay, form->inner);
                    281:     PrepareToUpdate(form);
                    282:     AddDetailGroup(form);
                    283:     ExecuteUpdate(form);
                    284:     QXMapWindow(theDisplay, form->inner);
                    285: }
                    286: 
                    287: static char **argv;
                    288: static int argvsize;
                    289: 
                    290: 
                    291: static AppendArgv(ptr)
                    292:   char *ptr;
                    293: {
                    294:     argvsize++;
                    295:     argv = ResizeArgv(argv, argvsize);
                    296:     argv[argvsize - 1] = MallocACopy(ptr);
                    297: }
                    298: 
                    299: static EraseLast()
                    300: {
                    301:     argvsize--;
                    302:     XtFree((char *) argv[argvsize]);
                    303:     argv[argvsize] = 0;
                    304: }
                    305: 
                    306: 
                    307: 
                    308: static ParseRow(row)
                    309:   RowListPtr row;
                    310: {
                    311:     int     result = FALSE;
                    312:     int i;
                    313:     FormEntryPtr entry;
                    314:     char   str[1000];
                    315:     if (row->type > LASTUSEFULROWTYPE)
                    316:        return FALSE;
                    317:     for (i = 3; i < row->numwindows; i += 2) {
                    318:        entry = row->wlist[i];
                    319:        if (*(entry->ptr)) {
                    320:            if (!result) {
                    321:                result = TRUE;
                    322:                if (row->wlist[1]->hilite)
                    323:                    AppendArgv("-not");
                    324:                AppendArgv("-lbrace");
                    325:            }
                    326:            switch (row->type) {
                    327:                case RTfrom: 
                    328:                    AppendArgv("-from");
                    329:                    break;
                    330:                case RTto: 
                    331:                    AppendArgv("-to");
                    332:                    break;
                    333:                case RTcc: 
                    334:                    AppendArgv("-cc");
                    335:                    break;
                    336:                case RTdate: 
                    337:                    AppendArgv("-date");
                    338:                    break;
                    339:                case RTsubject: 
                    340:                    AppendArgv("-subject");
                    341:                    break;
                    342:                case RTsearch: 
                    343:                    AppendArgv("-search");
                    344:                    break;
                    345:                case RTother: 
                    346:                    AppendArgv(sprintf(str, "--%s", row->wlist[2]->ptr));
                    347:                    break;
                    348:            }
                    349:            AppendArgv(entry->ptr);
                    350:            AppendArgv("-or");
                    351:        }
                    352:     }
                    353:     if (result) {
                    354:        EraseLast();
                    355:        AppendArgv("-rbrace");
                    356:        AppendArgv("-and");
                    357:     }
                    358:     return result;
                    359: }
                    360:            
                    361: 
                    362: static ParseGroup(group)
                    363:   GroupPtr group;
                    364: {
                    365:     int found = FALSE;
                    366:     int i;
                    367:     for (i=0 ; i<group->numrows ; i++)
                    368:        found |= ParseRow(group->rlist[i]);
                    369:     if (found) {
                    370:        EraseLast();
                    371:        AppendArgv("-rbrace");
                    372:        AppendArgv("-or");
                    373:        AppendArgv("-lbrace");
                    374:     }
                    375:     return found;
                    376: }
                    377: 
                    378: 
                    379: 
                    380: static void DestroyErrorWindow(pick)
                    381: Pick pick;
                    382: {
                    383:     if (pick->errorwindow) {
                    384:        (void) XtSendDestroyNotify(DISPLAY pick->errorwindow);
                    385:        QXDestroyWindow(theDisplay, pick->errorwindow);
                    386:        pick->errorwindow = NULL;
                    387:     }
                    388: }
                    389: 
                    390: static void MakeErrorWindow(pick, str)
                    391: Pick pick;
                    392: char *str;
                    393: {
                    394:     DestroyErrorWindow(pick);
                    395:     pick->errorwindow = XtDialogCreate(DISPLAY pick->scrn->window, str,
                    396:                                       (char *)NULL, (ArgList)NULL, 0);
                    397:     XtDialogAddButton(DISPLAY pick->errorwindow, "OK", DestroyErrorWindow,
                    398:                      (caddr_t)pick);
                    399:     CenterWindow(pick->scrn->window, pick->errorwindow);
                    400:     QXMapWindow(theDisplay, pick->errorwindow);
                    401: }
                    402: 
                    403: 
                    404: 
                    405: static ExecOK(entry)
                    406:   FormEntryPtr entry;
                    407: {
                    408:     Pick pick = entry->row->group->form->pick;
                    409:     Toc toc = pick->toc;
                    410:     FormBoxPtr details = pick->details;
                    411:     FormBoxPtr general = pick->general;
                    412:     GroupPtr group = general->glist[0];
                    413:     RowListPtr row0 = group->rlist[0];
                    414:     RowListPtr row1 = group->rlist[1];
                    415:     RowListPtr row2 = group->rlist[2];
                    416:     char *fromseq = row0->wlist[3]->ptr;
                    417:     char *toseq = row0->wlist[1]->ptr;
                    418:     char *fromdate = row1->wlist[1]->ptr;
                    419:     char *todate = row1->wlist[3]->ptr;
                    420:     char *datefield = row1->wlist[5]->ptr;
                    421:     short removeoldmsgs = row2->wlist[1]->hilite;
                    422:     char str[1000];
                    423:     int i, found;
                    424: 
                    425:     DestroyErrorWindow(pick);
                    426:     if (strcmp(toseq, "all") == 0) {
                    427:        MakeErrorWindow(pick, "Can't create a sequence called \"all\".");
                    428:        return;
                    429:     }
                    430:     if (TocGetSeqNamed(toc, fromseq) == NULL) {
                    431:        (void) sprintf(str, "Sequence \"%s\" doesn't exist!", fromseq);
                    432:        MakeErrorWindow(pick, str);
                    433:        return;
                    434:     }
                    435:     argv = MakeArgv(1);
                    436:     argvsize = 0;
                    437:     AppendArgv("pick");
                    438:     AppendArgv(sprintf(str, "+%s", TocGetFolderName(toc)));
                    439:     AppendArgv(fromseq);
                    440:     AppendArgv("-sequence");
                    441:     AppendArgv(toseq);
                    442:     if (removeoldmsgs)
                    443:        AppendArgv("-zero");
                    444:     else
                    445:        AppendArgv("-nozero");
                    446:     if (*datefield) {
                    447:        AppendArgv("-datefield");
                    448:        AppendArgv(datefield);
                    449:     }
                    450:     if (*fromdate) {
                    451:        AppendArgv("-after");
                    452:        AppendArgv(fromdate);
                    453:        AppendArgv("-and");
                    454:     }
                    455:     if (*todate) {
                    456:        AppendArgv("-before");
                    457:        AppendArgv(todate);
                    458:        AppendArgv("-and");
                    459:     }
                    460:     found = FALSE;
                    461:     AppendArgv("-lbrace");
                    462:     AppendArgv("-lbrace");
                    463:     for (i=0 ; i<details->numgroups ; i++)
                    464:        found |= ParseGroup(details->glist[i]);
                    465:     EraseLast();
                    466:     EraseLast();
                    467:     if (found) AppendArgv("-rbrace");
                    468:     else if (*fromdate || *todate) EraseLast();
                    469:     if (debug) {
                    470:        for (i=0 ; i<argvsize ; i++)
                    471:            (void) fprintf(stderr, "%s ", argv[i]);
                    472:        (void) fprintf(stderr, "\n");
                    473:     }
                    474:     (void) DoCommand(argv, (char *) NULL, "/dev/null");
                    475:     TocReloadSeqLists(toc);
                    476:     TocChangeViewedSeq(toc, TocGetSeqNamed(toc, toseq));
                    477:     DestroyScrn(pick->scrn);
                    478:     for (i=0 ; i<argvsize ; i++) XtFree((char *) argv[i]);
                    479:     XtFree((char *) argv);
                    480: }
                    481: 
                    482: 
                    483: 
                    484: static ExecCancel(entry)
                    485:   FormEntryPtr entry;
                    486: {
                    487:     Pick pick = entry->row->group->form->pick;
                    488:     Scrn scrn = pick->scrn;
                    489:     (void) DestroyScrn(scrn);
                    490: #ifdef X10
                    491:     {
                    492:        XEvent event;
                    493:        event.type = LeaveWindow;
                    494:        event.window = entry->window;
                    495:        XtDispatchEvent(DISPLAY &event);
                    496:     }
                    497: #endif
                    498: }
                    499: 
                    500: 
                    501: 
                    502: static AddWindow(row, entry)
                    503:   RowListPtr row;
                    504:   FormEntryPtr entry;
                    505: {
                    506:     static Arg arglist[] = {
                    507:        {XtNfromHoriz, (XtArgVal)NULL},
                    508:        {XtNresizable, (XtArgVal)TRUE},
                    509:        {XtNtop, (XtArgVal) XtChainTop},
                    510:        {XtNleft, (XtArgVal) XtChainLeft},
                    511:        {XtNbottom, (XtArgVal) XtChainTop},
                    512:        {XtNright, (XtArgVal) XtChainLeft},
                    513:     };
                    514: 
                    515:     row->numwindows++;
                    516:     row->wlist = (FormEntryPtr *)
                    517:        XtRealloc((char *) row->wlist,
                    518:                  (unsigned) row->numwindows * sizeof(FormEntryPtr));
                    519:     row->wlist[row->numwindows - 1] = entry;
                    520:     entry->row = row;
                    521:     if (row->numwindows > 1)
                    522:        arglist[0].value = (XtArgVal) row->wlist[row->numwindows - 2]->window;
                    523:     else
                    524:        arglist[0].value = (XtArgVal) NULL;
                    525:     XtFormAddWidget(DISPLAY row->window,
                    526:                    entry->window, arglist, XtNumber(arglist));
                    527: }
                    528:     
                    529: 
                    530: static DeleteWindow(entry)
                    531:   FormEntryPtr entry;
                    532: {
                    533:     RowListPtr row = entry->row;
                    534:     int i;
                    535:     QXDestroyWindow(theDisplay, entry->window);
                    536:     (void) XtSendDestroyNotify(DISPLAY entry->window);
                    537:     if (entry->type == WTtextentry)
                    538:        XtFree((char *) entry->ptr);
                    539:     for (i = 0; i < row->numwindows; i++)
                    540:        if (row->wlist[i] == entry)
                    541:            break;
                    542:     row->numwindows--;
                    543:     for (; i < row->numwindows; i++)
                    544:        row->wlist[i] = row->wlist[i + 1];
                    545: }
                    546: 
                    547: 
                    548: /* Figure out how wide text fields and labels should be so that they'll all
                    549:    line up correctly, and be big enough to hold everything, but not too big. */
                    550: 
                    551: static void FindStdWidth()
                    552: {
                    553:     stdwidth = 100;            /* %%% HACK! */
                    554: }
                    555: 
                    556: 
                    557: static RowListPtr AddRow(group, type)
                    558:   GroupPtr group;
                    559:   int type;
                    560: {
                    561:     static Arg arglist1[] = {
                    562:        {XtNborderWidth, (XtArgVal) 0},
                    563:     };
                    564:     static Arg arglist2[] = {
                    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:     RowListPtr row;
                    573:     group->numrows++;
                    574:     group->rlist = (RowListPtr *)
                    575:        XtRealloc((char *) group->rlist,
                    576:                  (unsigned) group->numrows * sizeof(RowListPtr));
                    577:     group->rlist[group->numrows - 1] = row =
                    578:        (RowListPtr) XtMalloc(sizeof(RowListRec));
                    579:     row->type = type;
                    580:     row->numwindows = 0;
                    581:     row->wlist = (FormEntryPtr *) XtMalloc(1);
                    582:     row->group = group;
                    583:     row->window = XtFormCreate(DISPLAY group->window,
                    584:                               arglist1, XtNumber(arglist1));
                    585:     if (group->numrows > 1)
                    586:        arglist2[0].value = (XtArgVal)group->rlist[group->numrows - 2]->window;
                    587:     else
                    588:        arglist2[0].value = (XtArgVal) NULL;
                    589:     XtFormAddWidget(DISPLAY group->window,
                    590:                    row->window, arglist2, XtNumber(arglist2));
                    591:     if (type == RTignore) return row;
                    592:     AddButton(row, "Pick", ExecYesNo, TRUE);
                    593:     AddButton(row, "Skip", ExecYesNo, FALSE);
                    594:     if (TypeName[type])
                    595:        AddLabel(row, TypeName[type], TRUE);
                    596:     else
                    597:        AddTextEntry(row, "");
                    598:     AddTextEntry(row, "");
                    599:     AddButton(row, "Or", ExecRowOr, FALSE);
                    600:     return row;
                    601: }
                    602: 
                    603: 
                    604: static GroupPtr AddGroup(form)
                    605:   FormBoxPtr form;
                    606: {
                    607:     static Arg arglist1[] = {
                    608:        {XtNborderWidth, (XtArgVal) 0},
                    609:     };
                    610:     static Arg arglist2[] = {
                    611:        {XtNfromVert, (XtArgVal) NULL},
                    612:        {XtNresizable, (XtArgVal) TRUE},
                    613:        {XtNtop, (XtArgVal) XtChainTop},
                    614:        {XtNleft, (XtArgVal) XtChainLeft},
                    615:        {XtNbottom, (XtArgVal) XtChainTop},
                    616:        {XtNright, (XtArgVal) XtChainLeft}
                    617:     };
                    618:     GroupPtr group;
                    619:     form->numgroups++;
                    620:     form->glist = (GroupPtr *)
                    621:        XtRealloc((char *) form->glist,
                    622:                  (unsigned) form->numgroups * sizeof(GroupPtr));
                    623:     form->glist[form->numgroups - 1] = group =
                    624:        (GroupPtr) XtMalloc(sizeof(GroupRec));
                    625:     group->numrows = 0;
                    626:     group->form = form;
                    627:     group->rlist = (RowListPtr *) XtMalloc(1);
                    628:     group->window = XtFormCreate(DISPLAY form->inner,
                    629:                                 arglist1, XtNumber(arglist1));
                    630:     if (form->numgroups > 1)
                    631:        arglist2[0].value = (XtArgVal)form->glist[form->numgroups - 2]->window;
                    632:     else
                    633:        arglist2[0].value = (XtArgVal)NULL;
                    634:     XtFormAddWidget(DISPLAY form->inner,
                    635:                    group->window, arglist2, XtNumber(arglist2));
                    636:     return group;
                    637: }
                    638: 
                    639: 
                    640: 
                    641: static AddDetailGroup(form)
                    642:   FormBoxPtr form;
                    643: {
                    644:     GroupPtr group;
                    645:     RowListPtr row;
                    646:     int     type;
                    647:     if (form->numgroups > 0) {
                    648:        group = form->glist[form->numgroups - 1];
                    649:        row = group->rlist[group->numrows - 1];
                    650:        DeleteWindow(row->wlist[0]);
                    651:        AddLabel(row, "- or -", FALSE);
                    652:     }
                    653:     group = AddGroup(form);
                    654:     for (type = FIRSTROWTYPE; type <= LASTUSEFULROWTYPE; type++)
                    655:        (void) AddRow(group, type);
                    656:     row =  AddRow(group, RTignore);
                    657:     AddButton(row, "- Or -", ExecGroupOr, FALSE);
                    658: }
                    659: 
                    660: 
                    661: static AddGeneralGroup(form)
                    662:   FormBoxPtr form;
                    663: {
                    664:     GroupPtr group;
                    665:     RowListPtr row;
                    666:     group = AddGroup(form);
                    667:     row =  AddRow(group, RTignore);
                    668:     AddLabel(row, "Creating sequence:", FALSE);
                    669:     AddTextEntry(row, "");
                    670:     AddLabel(row, "with msgs from sequence:", FALSE);
                    671:     AddTextEntry(row, "");
                    672:     row =  AddRow(group, RTignore);
                    673:     AddLabel(row, "Date range:", FALSE);
                    674:     AddTextEntry(row, "");
                    675:     AddLabel(row, " - ", FALSE);
                    676:     AddTextEntry(row, "");
                    677:     AddLabel(row, "Date field:", FALSE);
                    678:     AddTextEntry(row, "");
                    679:     row =  AddRow(group, RTignore);
                    680:     AddLabel(row, "Clear old entries from sequence?", FALSE);
                    681:     AddButton(row, "Yes", ExecYesNo, TRUE);
                    682:     AddButton(row, "No", ExecYesNo, FALSE);
                    683:     row =  AddRow(group, RTignore);
                    684:     AddButton(row, "OK", ExecOK, FALSE);
                    685:     AddButton(row, "Cancel", ExecCancel, FALSE);
                    686: }
                    687: 
                    688: 
                    689: static void InitGeneral(pick, fromseq, toseq)
                    690: Pick pick;
                    691: char *fromseq, *toseq;
                    692: {
                    693:     RowListPtr row;
                    694:     row = pick->general->glist[0]->rlist[0];
                    695:     ChangeTextEntry(row->wlist[1], toseq);
                    696:     ChangeTextEntry(row->wlist[3], fromseq);
                    697: }
                    698: 
                    699: 
                    700: static void CleanForm(form)
                    701: FormBoxPtr form;
                    702: {
                    703:     int i, j, k;
                    704:     GroupPtr group;
                    705:     RowListPtr row;
                    706:     FormEntryPtr entry;
                    707:     for (i=0 ; i<form->numgroups ; i++) {
                    708:        group = form->glist[i];
                    709:        for (j=0 ; j<group->numrows ; j++) {
                    710:            row = group->rlist[j];
                    711:            for (k=0 ; k<row->numwindows ; k++) {
                    712:                entry = row->wlist[k];
                    713:                if (entry->type == WTtextentry)
                    714:                    ChangeTextEntry(entry, "");
                    715:            }
                    716:        }
                    717:     }
                    718: }
                    719: 
                    720: 
                    721: static FormBoxPtr MakeAForm(pick, position)
                    722: Pick pick;
                    723: int position;
                    724: {
                    725:     static Arg arglist1[] = {
                    726:        {XtNname, (XtArgVal) "pick"},
                    727:        {XtNallowHoriz, (XtArgVal)TRUE},
                    728:        {XtNallowVert, (XtArgVal)TRUE},
                    729:     };
                    730:     static Arg arglist2[] = {
                    731:        {XtNborderWidth, (XtArgVal) 0}
                    732:     };
                    733:     FormBoxPtr result;
                    734:     result = (FormBoxPtr) XtMalloc(sizeof(FormBoxRec));
                    735:     result->outer = XtScrolledWindowCreate(DISPLAY pick->scrn->window,
                    736:                                           arglist1, XtNumber(arglist1));
                    737:     result->inner = XtFormCreate(DISPLAY
                    738:                                 XtScrolledWindowGetFrame(DISPLAY
                    739:                                                          result->outer),
                    740:                                 arglist2, XtNumber(arglist2));
                    741:     XtScrolledWindowSetChild(DISPLAY result->outer, result->inner);
                    742:     XtVPanedWindowAddPane(DISPLAY pick->scrn->window, result->outer, position,
                    743:                          50, 1500, TRUE);
                    744:     result->pick = pick;
                    745:     result->numgroups = 0;
                    746:     result->glist = (GroupPtr *) XtMalloc(1);
                    747:     return result;
                    748: }
                    749: 
                    750: 
                    751: 
                    752: AddPick(scrn, toc, fromseq, toseq)
                    753:   Scrn scrn;
                    754:   Toc toc;
                    755:   char *fromseq, *toseq;
                    756: {
                    757:     Pick pick;
                    758:     FormBoxPtr general, details;
                    759:     char str[100];
                    760:     int width, height, scrnwidth, scrnheight;
                    761: 
                    762:     if (scrn->pick) {
                    763:        pick = scrn->pick;
                    764:        CleanForm(pick->details);
                    765:        CleanForm(pick->general);
                    766:     } else {
                    767:        pick = scrn->pick = (Pick) XtMalloc(sizeof(PickRec));
                    768:        pick->scrn = scrn;
                    769:        pick->errorwindow = NULL;
                    770: 
                    771:        pick->label = CreateTitleBar(scrn, 0);
                    772: 
                    773:        pick->details = details = MakeAForm(pick, 1);
                    774:        pick->general = general = MakeAForm(pick, 2);
                    775:        FindStdWidth();
                    776: 
                    777:        PrepareToUpdate(details);
                    778:        AddDetailGroup(details);
                    779:        ExecuteUpdate(details);
                    780:        PrepareToUpdate(general);
                    781:        AddGeneralGroup(general);
                    782:        ExecuteUpdate(general);
                    783:        GetWindowSize(general->inner, &width, &height);
                    784:        GetWindowSize(scrn->window, &scrnwidth, &scrnheight);
                    785:        if (width > scrnwidth)
                    786:            height += XtScrollMgrGetThickness(DISPLAY general->outer);
                    787:        XtVPanedSetMinMax(DISPLAY scrn->window,
                    788:                          general->outer, height, height);
                    789:        XtVPanedSetMinMax(DISPLAY scrn->window,
                    790:                          general->outer, 10, 10000);
                    791:     }
                    792:     pick->toc = toc;
                    793:     InitGeneral(pick, fromseq, toseq);
                    794:     (void) sprintf(str, "Pick: %s", TocGetFolderName(toc));
                    795:     ChangeLabel(pick->label, str);
                    796:     QXStoreName(theDisplay, scrn->window, str);
                    797: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.