|
|
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.