|
|
1.1 ! root 1: #ifndef lint ! 2: static char rcs_id[] = "$Header: tocfuncs.c,v 1.13 87/09/11 08:18:56 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: /* tocfuncs.c -- handle things in the toc window. */ ! 30: ! 31: #include "xmh.h" ! 32: ! 33: ! 34: void ExecNextView(scrn) ! 35: Scrn scrn; ! 36: { ! 37: Toc toc = scrn->toc; ! 38: MsgList mlist; ! 39: FateType fate; ! 40: Msg msg; ! 41: if (toc == NULL) return; ! 42: mlist = TocCurMsgList(toc); ! 43: if (mlist->nummsgs) ! 44: msg = mlist->msglist[0]; ! 45: else { ! 46: msg = TocGetCurMsg(toc); ! 47: if (msg && msg == scrn->msg) msg = TocMsgAfter(toc, msg); ! 48: if (msg) fate = MsgGetFate(msg, (Toc *)NULL); ! 49: while (msg && ((SkipDeleted && fate == Fdelete) ! 50: || (SkipMoved && fate == Fmove) ! 51: || (SkipCopied && fate == Fcopy))) { ! 52: msg = TocMsgAfter(toc, msg); ! 53: if (msg) fate = MsgGetFate(msg, (Toc *)NULL); ! 54: } ! 55: } ! 56: if (msg) { ! 57: if (!MsgSetScrn(msg, scrn)) { ! 58: TocUnsetSelection(toc); ! 59: TocSetCurMsg(toc, msg); ! 60: } ! 61: } ! 62: FreeMsgList(mlist); ! 63: } ! 64: ! 65: ! 66: ! 67: void ExecPrevView(scrn) ! 68: Scrn scrn; ! 69: { ! 70: Toc toc = scrn->toc; ! 71: MsgList mlist; ! 72: FateType fate; ! 73: Msg msg; ! 74: if (toc == NULL) return; ! 75: mlist = TocCurMsgList(toc); ! 76: if (mlist->nummsgs) ! 77: msg = mlist->msglist[mlist->nummsgs - 1]; ! 78: else { ! 79: msg = TocGetCurMsg(toc); ! 80: if (msg && msg == scrn->msg) msg = TocMsgBefore(toc, msg); ! 81: if (msg) fate = MsgGetFate(msg, (Toc *)NULL); ! 82: while (msg && ((SkipDeleted && fate == Fdelete) ! 83: || (SkipMoved && fate == Fmove) ! 84: || (SkipCopied && fate == Fcopy))) { ! 85: msg = TocMsgBefore(toc, msg); ! 86: if (msg) fate = MsgGetFate(msg, (Toc *)NULL); ! 87: } ! 88: } ! 89: if (msg) { ! 90: if (!MsgSetScrn(msg, scrn)) { ! 91: TocUnsetSelection(toc); ! 92: TocSetCurMsg(toc, msg); ! 93: } ! 94: } ! 95: FreeMsgList(mlist); ! 96: } ! 97: ! 98: ! 99: ! 100: void ExecViewNew(scrn) ! 101: Scrn scrn; ! 102: { ! 103: Toc toc = scrn->toc; ! 104: Scrn vscrn; ! 105: MsgList mlist; ! 106: if (toc == NULL) return; ! 107: mlist = CurMsgListOrCurMsg(toc); ! 108: if (mlist->nummsgs) { ! 109: vscrn = NewViewScrn(); ! 110: (void) MsgSetScrn(mlist->msglist[0], vscrn); ! 111: MapScrn(vscrn); ! 112: } ! 113: FreeMsgList(mlist); ! 114: } ! 115: ! 116: ! 117: ! 118: void ExecTocForward(scrn) ! 119: Scrn scrn; ! 120: { ! 121: Toc toc = scrn->toc; ! 122: MsgList mlist; ! 123: if (toc == NULL) return; ! 124: mlist = CurMsgListOrCurMsg(toc); ! 125: if (mlist->nummsgs) ! 126: CreateForward(mlist); ! 127: FreeMsgList(mlist); ! 128: } ! 129: ! 130: ! 131: void ExecTocUseAsComposition(scrn) ! 132: Scrn scrn; ! 133: { ! 134: Toc toc = scrn->toc; ! 135: Scrn vscrn; ! 136: MsgList mlist; ! 137: Msg msg; ! 138: if (toc == NULL) return; ! 139: mlist = CurMsgListOrCurMsg(toc); ! 140: if (mlist->nummsgs) { ! 141: vscrn = NewCompScrn(); ! 142: if (DraftsFolder == toc) { ! 143: msg = mlist->msglist[0]; ! 144: } else { ! 145: msg = TocMakeNewMsg(DraftsFolder); ! 146: MsgLoadCopy(msg, mlist->msglist[0]); ! 147: MsgSetTemporary(msg); ! 148: } ! 149: (void)MsgSetScrnForComp(msg, vscrn); ! 150: MapScrn(vscrn); ! 151: } ! 152: FreeMsgList(mlist); ! 153: } ! 154: ! 155: ! 156: ! 157: /* Utility: change the fate of a set of messages. */ ! 158: ! 159: static MarkMessages(scrn, fate, skip) ! 160: Scrn scrn; ! 161: FateType fate; ! 162: int skip; ! 163: { ! 164: Toc toc = scrn->toc; ! 165: Toc desttoc; ! 166: int i; ! 167: MsgList mlist; ! 168: Msg msg; ! 169: if (toc == NULL) return; ! 170: if (fate == Fcopy || fate == Fmove) ! 171: desttoc = SelectedToc(scrn); ! 172: else ! 173: desttoc = NULL; ! 174: if (desttoc == toc) ! 175: Feep(); ! 176: else { ! 177: mlist = TocCurMsgList(toc); ! 178: if (mlist->nummsgs == 0) { ! 179: msg = TocGetCurMsg(toc); ! 180: if (msg) { ! 181: MsgSetFate(msg, fate, desttoc); ! 182: if (skip) ! 183: ExecNextView(scrn); ! 184: } ! 185: } else { ! 186: for (i = 0; i < mlist->nummsgs; i++) ! 187: MsgSetFate(mlist->msglist[i], fate, desttoc); ! 188: } ! 189: FreeMsgList(mlist); ! 190: } ! 191: } ! 192: ! 193: ! 194: ! 195: void ExecMarkDelete(scrn) ! 196: Scrn scrn; ! 197: { ! 198: MarkMessages(scrn, Fdelete, SkipDeleted); ! 199: } ! 200: ! 201: ! 202: ! 203: void ExecMarkCopy(scrn) ! 204: Scrn scrn; ! 205: { ! 206: MarkMessages(scrn, Fcopy, SkipCopied); ! 207: } ! 208: ! 209: ! 210: void ExecMarkMove(scrn) ! 211: Scrn scrn; ! 212: { ! 213: MarkMessages(scrn, Fmove, SkipMoved); ! 214: } ! 215: ! 216: ! 217: void ExecMarkUnmarked(scrn) ! 218: Scrn scrn; ! 219: { ! 220: MarkMessages(scrn, Fignore, FALSE); ! 221: } ! 222: ! 223: ! 224: void ExecCommitChanges(scrn) ! 225: Scrn scrn; ! 226: { ! 227: if (scrn->toc == NULL) return; ! 228: TocCommitChanges(scrn->toc); ! 229: } ! 230: ! 231: ! 232: void ExecPrintMessages(scrn) ! 233: Scrn scrn; ! 234: { ! 235: Toc toc = scrn->toc; ! 236: MsgList mlist; ! 237: char str[200]; ! 238: int i; ! 239: if (toc == NULL) return; ! 240: mlist = CurMsgListOrCurMsg(toc); ! 241: for (i = 0; i < mlist->nummsgs; i++) { ! 242: (void) sprintf(str, "%s %s", defPrintCommand, ! 243: MsgFileName(mlist->msglist[i])); ! 244: (void) system(str); ! 245: } ! 246: FreeMsgList(mlist); ! 247: } ! 248: ! 249: ! 250: ! 251: void ExecPack(scrn) ! 252: Scrn scrn; ! 253: { ! 254: Toc toc = scrn->toc; ! 255: char **argv, str[100]; ! 256: if (toc == NULL) return; ! 257: if (TocConfirmCataclysm(toc)) return; ! 258: argv = MakeArgv(4); ! 259: argv[0] = "folder"; ! 260: (void) sprintf(str, "+%s", TocGetFolderName(toc)); ! 261: argv[1] = str; ! 262: argv[2] = "-pack"; ! 263: argv[3] = "-fast"; ! 264: DoCommand(argv, (char *) NULL, "/dev/null"); ! 265: XtFree((char *) argv); ! 266: TocForceRescan(toc); ! 267: } ! 268: ! 269: ! 270: ! 271: void ExecSort(scrn) ! 272: Scrn scrn; ! 273: { ! 274: Toc toc = scrn->toc; ! 275: char **argv, str[100]; ! 276: if (toc == NULL) return; ! 277: if (TocConfirmCataclysm(toc)) return; ! 278: argv = MakeArgv(3); ! 279: argv[0] = "sortm"; ! 280: (void) sprintf(str, "+%s", TocGetFolderName(toc)); ! 281: argv[1] = str; ! 282: argv[2] = "-noverbose"; ! 283: DoCommand(argv, (char *) NULL, "/dev/null"); ! 284: XtFree((char *) argv); ! 285: TocForceRescan(toc); ! 286: } ! 287: ! 288: ! 289: ! 290: ! 291: void ExecForceRescan(scrn) ! 292: Scrn scrn; ! 293: { ! 294: Toc toc = scrn->toc; ! 295: if (toc == NULL) return; ! 296: TocForceRescan(toc); ! 297: } ! 298: ! 299: ! 300: ! 301: /* Incorporate new mail. */ ! 302: ! 303: void ExecIncorporate(scrn) ! 304: Scrn scrn; ! 305: { ! 306: if (scrn->toc == NULL) return; ! 307: TocIncorporate(scrn->toc); ! 308: TocCheckForNewMail(); ! 309: } ! 310: ! 311: ! 312: void ExecTocReply(scrn) ! 313: Scrn scrn; ! 314: { ! 315: Toc toc = scrn->toc; ! 316: Scrn nscrn; ! 317: MsgList mlist; ! 318: Msg msg; ! 319: if (toc == NULL) return; ! 320: mlist = CurMsgListOrCurMsg(toc); ! 321: if (mlist->nummsgs) { ! 322: nscrn = NewCompScrn(); ! 323: msg = TocMakeNewMsg(DraftsFolder); ! 324: MsgSetTemporary(msg); ! 325: MsgLoadReply(msg, mlist->msglist[0]); ! 326: (void)MsgSetScrnForComp(msg, nscrn); ! 327: MapScrn(nscrn); ! 328: } ! 329: FreeMsgList(mlist); ! 330: } ! 331: ! 332: ! 333: void ExecPick(scrn) ! 334: Scrn scrn; ! 335: { ! 336: Toc toc = scrn->toc; ! 337: Scrn nscrn; ! 338: char *toseq; ! 339: if (toc == NULL) return; ! 340: if (scrn->curseq) ! 341: toseq = BBoxNameOfButton(scrn->curseq); ! 342: else toseq = "temp"; ! 343: if (strcmp(toseq, "all") == 0) ! 344: toseq = "temp"; ! 345: nscrn = CreateNewScrn(STpick); ! 346: AddPick(nscrn, toc, TocViewedSequence(toc)->name, toseq); ! 347: MapScrn(nscrn); ! 348: } ! 349: ! 350: ! 351: void ExecOpenSeq(scrn) ! 352: Scrn scrn; ! 353: { ! 354: Toc toc = scrn->toc; ! 355: if (toc == NULL) return; ! 356: TocChangeViewedSeq(toc, TocGetSeqNamed(toc, ! 357: BBoxNameOfButton(scrn->curseq))); ! 358: } ! 359: ! 360: ! 361: ! 362: typedef enum {ADD, REMOVE, DELETE} TwiddleOperation; ! 363: ! 364: static TwiddleSequence(scrn, op) ! 365: Scrn scrn; ! 366: TwiddleOperation op; ! 367: { ! 368: Toc toc = scrn->toc; ! 369: char **argv, plus[100], str[100], *seqname; ! 370: int i; ! 371: MsgList mlist; ! 372: if (toc == NULL || scrn->curseq == NULL) return; ! 373: seqname = BBoxNameOfButton(scrn->curseq); ! 374: if (strcmp(seqname, "all") == 0) { ! 375: Feep(); ! 376: return; ! 377: } ! 378: if (op == DELETE) ! 379: mlist = MakeNullMsgList(); ! 380: else { ! 381: mlist = CurMsgListOrCurMsg(toc); ! 382: if (mlist->nummsgs == 0) { ! 383: FreeMsgList(mlist); ! 384: Feep(); ! 385: return; ! 386: } ! 387: } ! 388: argv = MakeArgv(6 + mlist->nummsgs); ! 389: argv[0] = "mark"; ! 390: (void) sprintf(plus, "+%s", TocGetFolderName(toc)); ! 391: argv[1] = plus; ! 392: argv[2] = "-sequence"; ! 393: argv[3] = seqname; ! 394: switch (op) { ! 395: case ADD: ! 396: argv[4] = "-add"; ! 397: argv[5] = "-nozero"; ! 398: break; ! 399: case REMOVE: ! 400: argv[4] = "-delete"; ! 401: argv[5] = "-nozero"; ! 402: break; ! 403: case DELETE: ! 404: argv[4] = "-delete"; ! 405: argv[5] = "all"; ! 406: break; ! 407: } ! 408: for (i = 0; i < mlist->nummsgs; i++) { ! 409: (void) sprintf(str, "%d", MsgGetId(mlist->msglist[i])); ! 410: argv[6 + i] = MallocACopy(str); ! 411: } ! 412: DoCommand(argv, (char *) NULL, "/dev/null"); ! 413: for (i = 0; i < mlist->nummsgs; i++) ! 414: free((char *) argv[6 + i]); ! 415: free((char *) argv); ! 416: FreeMsgList(mlist); ! 417: TocReloadSeqLists(toc); ! 418: } ! 419: ! 420: ! 421: ! 422: ! 423: void ExecAddToSeq(scrn) ! 424: Scrn scrn; ! 425: { ! 426: TwiddleSequence(scrn, ADD); ! 427: } ! 428: ! 429: ! 430: ! 431: void ExecRemoveFromSeq(scrn) ! 432: Scrn scrn; ! 433: { ! 434: TwiddleSequence(scrn, REMOVE); ! 435: } ! 436: ! 437: ! 438: ! 439: void ExecDeleteSeq(scrn) ! 440: Scrn scrn; ! 441: { ! 442: TwiddleSequence(scrn, DELETE); ! 443: } ! 444: ! 445: ! 446: XtEventReturnCode HandleTocButtons(event, scrn) ! 447: XEvent *event; ! 448: Scrn scrn; ! 449: { ! 450: DoubleClickProc = ExecNextView; ! 451: DoubleClickParam = (caddr_t)scrn; ! 452: return XteventHandled; ! 453: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.