home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume21 / pan / part04 < prev    next >
Encoding:
Text File  |  1993-11-08  |  32.1 KB  |  1,103 lines

  1. Newsgroups: comp.sources.x
  2. From: jeff@tasslehoff.interlan.com (Jeff Bailey)
  3. Subject: v21i040:  pan - A post a note program, Part04/06
  4. Message-ID: <1993Nov9.000720.10909@sparky.sterling.com>
  5. X-Md4-Signature: cf18115bf31bd56190d9c563fdfe2c70
  6. Sender: chris@sparky.sterling.com (Chris Olson)
  7. Organization: Sterling Software
  8. Date: Tue, 9 Nov 1993 00:07:20 GMT
  9. Approved: chris@sterling.com
  10.  
  11. Submitted-by: jeff@tasslehoff.interlan.com (Jeff Bailey)
  12. Posting-number: Volume 21, Issue 40
  13. Archive-name: pan/part04
  14. Environment: X11, OpenLook, XView
  15. Supersedes: pan: Volume 16, Issue 137-142
  16.  
  17. ---- Cut Here and feed the following to sh ----
  18. #!/bin/sh
  19. # This is part 04 of a multipart archive
  20. # ============= pan3.0/rmfolder.c ==============
  21. if test ! -d 'pan3.0'; then
  22.     echo 'x - creating directory pan3.0'
  23.     mkdir 'pan3.0'
  24. fi
  25. if test -f 'pan3.0/rmfolder.c' -a X"$1" != X"-c"; then
  26.     echo 'x - skipping pan3.0/rmfolder.c (File already exists)'
  27. else
  28. echo 'x - extracting pan3.0/rmfolder.c (Text)'
  29. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/rmfolder.c' &&
  30. X/*
  31. XPost A Note V3.0
  32. XCopyright (c) 1993, Jeffrey W. Bailey
  33. XAll rights reserved.
  34. X
  35. XPermission is granted to distribute this program in exact, complete
  36. Xsource form, which includes this copyright notice, as long as no fee
  37. Xother than media and distribution cost is charged.
  38. X
  39. XThis program may not be used in whole, or in part, in any other manner
  40. Xwithout prior written permission from the author.
  41. X
  42. XThis program may not be distributed in modified form without prior
  43. Xwritten permission from the author.  In other words, patches may be
  44. Xdistributed, but modified source may not be distributed.
  45. X
  46. XIf there are any questions, comments or suggestions, the author may be
  47. Xcontacted at:
  48. X
  49. X    jeff@rd1.interlan.com
  50. X
  51. X    or
  52. X
  53. X    Jeffrey Bailey
  54. X    Racal-Datacom, Inc.
  55. X    Mail Stop E-110
  56. X    1601 N. Harrison Parkway
  57. X    Sunrise, FL  33323-2899
  58. X*/
  59. X
  60. X#include "pan.h"
  61. X#include <X11/X.h>
  62. X#include <X11/Xutil.h>
  63. X
  64. Xextern int errno;
  65. Xextern char *sys_errlist[];
  66. X
  67. Xint applydestroy(), destroydone();
  68. XPanel_item fldrlist;
  69. X
  70. Xint rf_resize_proc();
  71. X
  72. Xdestroyfolder(menu, mitem)
  73. X    Menu menu;
  74. X    Menu_item mitem;
  75. X    {
  76. X    Rect rect, *prect;
  77. X    struct SubDir *sp;
  78. X    int  x, y;
  79. X    int  row;
  80. X    Panel destroy_panel;
  81. X    static XClassHint chint;
  82. X
  83. X    w_popupxy(&x, &y, DESTROYWIDTH, DESTROYHEIGHT, DESTROYSPACING);
  84. X    destroy_mitem = mitem;
  85. X    destroy_frame = xv_create(main_frame, FRAME_CMD,
  86. X                           XV_LABEL, "Destroy Folder",
  87. X                           XV_X, x,
  88. X                           XV_Y, y,
  89. X                           FRAME_NO_CONFIRM, TRUE,
  90. X                           FRAME_DONE_PROC, destroydone,
  91. X                           WIN_EVENT_PROC, rf_resize_proc,
  92. X                           WIN_CONSUME_EVENTS,
  93. X                               WIN_RESIZE,
  94. X                               NULL,
  95. X                           NULL);
  96. X    if(destroy_frame == NULL)
  97. X        {
  98. X        notice_prompt(main_frame, NULL,
  99. X            NOTICE_MESSAGE_STRINGS,
  100. X                "Unable to create sub-frame (internal error)",
  101. X                NULL,
  102. X            NOTICE_BUTTON_YES, "Acknowledge",
  103. X            NOTICE_NO_BEEPING, noticenobeep,
  104. X            NULL);
  105. X        return;
  106. X        }
  107. X
  108. X    /* Set up the X class since xview doesn't */
  109. X    chint.res_name = "pan";
  110. X    chint.res_class = "Pan";
  111. X    XSetClassHint((Display *)xv_get(destroy_frame, XV_DISPLAY),
  112. X        xv_get(destroy_frame, XV_XID), &chint);
  113. X
  114. X    destroy_panel = (Panel) xv_get(destroy_frame, FRAME_CMD_PANEL);
  115. X    xv_set(destroy_panel, WIN_RETAINED, FALSE, NULL);
  116. X
  117. X    (void) xv_create(destroy_panel, PANEL_MESSAGE,
  118. X        XV_X, xv_col(destroy_panel, 0),
  119. X        XV_Y, xv_row(destroy_panel, 0),
  120. X        PANEL_LABEL_STRING, "Destroy Folder",
  121. X        NULL);
  122. X    fldrlist = xv_create(destroy_panel, PANEL_LIST,
  123. X        XV_X, xv_col(destroy_panel, 0),
  124. X        XV_Y, xv_row(destroy_panel, 1),
  125. X        PANEL_LIST_DISPLAY_ROWS, 7,
  126. X        PANEL_CHOOSE_ONE, TRUE,
  127. X        PANEL_READ_ONLY, TRUE,
  128. X        NULL);
  129. X    row = 0;
  130. X    sp = (struct SubDir *) LLM_first(&subdir_rt);
  131. X    while(sp != NULL)
  132. X        {
  133. X        xv_set(fldrlist,
  134. X            PANEL_LIST_INSERT, row,
  135. X            PANEL_LIST_STRING, row, sp->subdir, 
  136. X            PANEL_LIST_CLIENT_DATA, row, sp, 
  137. X            NULL);
  138. X        sp = (struct SubDir *) LLM_next(&subdir_rt);
  139. X        row++;
  140. X        }
  141. X
  142. X    prect = (Rect *) xv_get(fldrlist, PANEL_ITEM_RECT);
  143. X
  144. X    destroy_item =  xv_create(destroy_panel, PANEL_BUTTON,
  145. X                 XV_Y, prect->r_top + prect->r_height + 20,
  146. X                 PANEL_LABEL_STRING, "Apply",
  147. X                 PANEL_NOTIFY_PROC, applydestroy,
  148. X                 NULL);
  149. X
  150. X    window_fit(destroy_panel);
  151. X    window_fit(destroy_frame);
  152. X
  153. X    xv_set(destroy_frame, XV_SHOW, TRUE, NULL);
  154. X
  155. X    frame_get_rect(destroy_frame, &rect);
  156. X    prect = (Rect *) xv_get(destroy_item, PANEL_ITEM_RECT);
  157. X    xv_set(destroy_item,
  158. X        XV_X, ((rect.r_width / 2) - (prect->r_width / 2)),
  159. X        NULL);
  160. X    xv_set(fldrlist, PANEL_LIST_WIDTH, rect.r_width - SCROLLWIDTH, NULL);
  161. X
  162. X    (void) xv_set(mitem, MENU_INACTIVE, TRUE, NULL);
  163. X    destroy_up = 1;
  164. X    }
  165. X
  166. Xdestroydone()
  167. X    {
  168. X    xv_destroy_safe(destroy_frame);
  169. X    (void) xv_set(destroy_mitem, MENU_INACTIVE, FALSE, NULL);
  170. X    destroy_up = 0;
  171. X    }
  172. X
  173. Xapplydestroy(item, event)
  174. X    Panel_item item;
  175. X    Event *event;
  176. X    {
  177. X    Menu_item mitem;
  178. X    struct SubDir *sp;
  179. X    struct Note *np;
  180. X    int  i, row;
  181. X    DIR *dp;
  182. X    struct dirent *ent;
  183. X    char buf[MAXBUFLEN];
  184. X
  185. X    row = xv_get(fldrlist, PANEL_LIST_NROWS);
  186. X    for(i = 0; i < row; i++)
  187. X        {
  188. X        if(xv_get(fldrlist, PANEL_LIST_SELECTED, i))
  189. X            {
  190. X            sp = (struct SubDir *) xv_get(fldrlist, PANEL_LIST_CLIENT_DATA, i);
  191. X            }
  192. X        }
  193. X
  194. X#ifdef CONFIDENT
  195. X    if(confirmdestroy)
  196. X        {
  197. X#endif
  198. X        if(notice_prompt(destroy_frame, NULL,
  199. X                     NOTICE_MESSAGE_STRINGS, "Really destroy this folder?",
  200. X                         sp->subdir,
  201. X                         "(This action will destroy all notes in the folder)",
  202. X                         NULL,
  203. X                     NOTICE_BUTTON_YES, "Yes",
  204. X                     NOTICE_BUTTON_NO, "No",
  205. X                     NOTICE_NO_BEEPING, noticenobeep,
  206. X                     NULL) == NOTICE_NO)
  207. X            {
  208. X            if(xv_get(destroy_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  209. X                {
  210. X                xv_destroy_safe(destroy_frame);
  211. X                (void) xv_set(destroy_mitem, MENU_INACTIVE, FALSE, NULL);
  212. X                destroy_up = 0;
  213. X                }
  214. X            return;
  215. X            }
  216. X#ifdef CONFIDENT
  217. X        }
  218. X#endif
  219. X
  220. X    np = (struct Note *) LLM_first(&sp->note_rt);
  221. X    while(np != NULL)
  222. X        {
  223. X        if(np->mapped)
  224. X            {
  225. X            textsw_reset(np->textsw, 0, 0);
  226. X            put_win(np);
  227. X            np->mapped = 0;
  228. X            }
  229. X        np = (struct Note *) LLM_next(&sp->note_rt);
  230. X        }
  231. X
  232. X    dp = opendir(sp->subdir);
  233. X    if(dp == NULL)
  234. X        {
  235. X        notice_prompt(main_frame, NULL,
  236. X            NOTICE_MESSAGE_STRINGS,
  237. X                "Couldn't read directory",
  238. X                sp->subdir,
  239. X                sys_errlist[errno],
  240. X                NULL,
  241. X            NOTICE_BUTTON_YES, "Acknowledge",
  242. X            NOTICE_NO_BEEPING, noticenobeep,
  243. X            NULL);
  244. X        if(xv_get(destroy_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  245. X            {
  246. X            xv_destroy_safe(destroy_frame);
  247. X            (void) xv_set(destroy_mitem, MENU_INACTIVE, FALSE, NULL);
  248. X            destroy_up = 0;
  249. X            }
  250. X        return;
  251. X        }
  252. X    while((ent = readdir(dp)) != NULL)
  253. X        {
  254. X        if(strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..") != 0)
  255. X            {
  256. X            sprintf(buf, "%s/%s", sp->subdir, ent->d_name);
  257. X            unlink(buf);
  258. X            }
  259. X        }
  260. X    closedir(dp);
  261. X    if(rmdir(sp->subdir) < 0)
  262. X        {
  263. X        notice_prompt(main_frame, NULL,
  264. X            NOTICE_MESSAGE_STRINGS,
  265. X                "Couldn't remove directory",
  266. X                sp->subdir,
  267. X                sys_errlist[errno],
  268. X                NULL,
  269. X            NOTICE_BUTTON_YES, "Acknowledge",
  270. X            NOTICE_NO_BEEPING, noticenobeep,
  271. X            NULL);
  272. X        }
  273. X
  274. X    mitem = xv_find(main_newnote, MENUITEM, MENU_STRING, sp->subdir, NULL);
  275. X    if(mitem != NULL)
  276. X        {
  277. X        (void) xv_set(main_newnote, MENU_REMOVE_ITEM, mitem, NULL);
  278. X        xv_destroy_safe(mitem);
  279. X        }
  280. X    mitem = xv_find(main_expose, MENUITEM, MENU_STRING, sp->subdir, NULL);
  281. X    if(mitem != NULL)
  282. X        {
  283. X        (void) xv_set(main_expose, MENU_REMOVE_ITEM, mitem, NULL);
  284. X        xv_destroy_safe(mitem);
  285. X        }
  286. X    mitem = xv_find(main_print, MENUITEM, MENU_STRING, sp->subdir, NULL);
  287. X    if(mitem != NULL)
  288. X        {
  289. X        (void) xv_set(main_print, MENU_REMOVE_ITEM, mitem, NULL);
  290. X        xv_destroy_safe(mitem);
  291. X        }
  292. X
  293. X    LLM_free(&sp->note_rt);
  294. X    LLM_delete(&subdir_rt, (char *)sp);
  295. X
  296. X    refresh_popups();
  297. X    if(xv_get(destroy_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  298. X        {
  299. X        xv_destroy_safe(destroy_frame);
  300. X        (void) xv_set(destroy_mitem, MENU_INACTIVE, FALSE, NULL);
  301. X        destroy_up = 0;
  302. X        }
  303. X    }
  304. X
  305. Xrefresh_destroy()
  306. X    {
  307. X    int  row, i;
  308. X    struct SubDir *sp;
  309. X
  310. X    if(!destroy_up) return;
  311. X
  312. X    xv_set(fldrlist, XV_SHOW, FALSE, NULL);
  313. X
  314. X    row = xv_get(fldrlist, PANEL_LIST_NROWS);
  315. X    for(i = row - 1; i >= 0; i--)
  316. X        xv_set(fldrlist, PANEL_LIST_DELETE, i, NULL);
  317. X
  318. X    row = 0;
  319. X    sp = (struct SubDir *) LLM_first(&subdir_rt);
  320. X    while(sp != NULL)
  321. X        {
  322. X        xv_set(fldrlist,
  323. X            PANEL_LIST_INSERT, row,
  324. X            PANEL_LIST_STRING, row, sp->subdir, 
  325. X            PANEL_LIST_CLIENT_DATA, row, sp, 
  326. X            NULL);
  327. X        sp = (struct SubDir *) LLM_next(&subdir_rt);
  328. X        row++;
  329. X        }
  330. X
  331. X    xv_set(fldrlist, XV_SHOW, TRUE, NULL);
  332. X    }
  333. X
  334. X/*
  335. X    Center the button here even though we don't allow a resize because of
  336. X    the intermittent failure of frame_get_rect() immediately after frame
  337. X    creation.  Also adjust the list size.
  338. X*/
  339. Xrf_resize_proc(frame, event, arg)
  340. X    Frame frame;
  341. X    Event *event;
  342. X    Notify_arg arg;
  343. X    {
  344. X    Rect rect, *dprect, *prect;
  345. X    if(event_id(event) != WIN_RESIZE) return;
  346. X    frame_get_rect(frame, &rect);
  347. X    rect.r_height -= (topmargin + bottommargin); /* correct for wm title bar */
  348. X    rect.r_width -= (leftmargin + rightmargin);
  349. X    prect = (Rect *) xv_get(fldrlist, PANEL_ITEM_RECT);
  350. X    dprect = (Rect *) xv_get(destroy_item, PANEL_ITEM_RECT);
  351. X    xv_set(destroy_item,
  352. X                 XV_Y, prect->r_top + prect->r_height + 20,
  353. X                 XV_X, rect.r_width / 2 - dprect->r_width / 2,
  354. X                 NULL);
  355. X    xv_set(fldrlist, PANEL_LIST_WIDTH, rect.r_width - SCROLLWIDTH, NULL);
  356. X    }
  357. SHAR_EOF
  358. chmod 0644 pan3.0/rmfolder.c ||
  359. echo 'restore of pan3.0/rmfolder.c failed'
  360. Wc_c="`wc -c < 'pan3.0/rmfolder.c'`"
  361. test 9620 -eq "$Wc_c" ||
  362.     echo 'pan3.0/rmfolder.c: original size 9620, current size' "$Wc_c"
  363. fi
  364. # ============= pan3.0/COPYRIGHT ==============
  365. if test -f 'pan3.0/COPYRIGHT' -a X"$1" != X"-c"; then
  366.     echo 'x - skipping pan3.0/COPYRIGHT (File already exists)'
  367. else
  368. echo 'x - extracting pan3.0/COPYRIGHT (Text)'
  369. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/COPYRIGHT' &&
  370. XPost A Note V3.0b
  371. XCopyright (c) 1993, Jeffrey W. Bailey
  372. XAll rights reserved.
  373. X
  374. XPermission is granted to distribute this program in exact, complete
  375. Xsource form, which includes this copyright notice, as long as no fee
  376. Xother than media and distribution cost is charged.
  377. X
  378. XThis program may not be used in whole, or in part, in any other manner
  379. Xwithout prior written permission from the author.
  380. X
  381. XThis program may not be distributed in modified form without prior
  382. Xwritten permission from the author.  In other words, patches may be
  383. Xdistributed, but modified source may not be distributed.
  384. X
  385. XIf there are any questions, comments or suggestions, the author may be
  386. Xcontacted at:
  387. X
  388. X    jeff@rd1.interlan.com
  389. X
  390. X    or
  391. X
  392. X    Jeffrey Bailey
  393. X    Racal-Datacom, Inc.
  394. X    Mail Stop E-110
  395. X    1601 N. Harrison Parkway
  396. X    Sunrise, FL  33323-2899
  397. SHAR_EOF
  398. chmod 0644 pan3.0/COPYRIGHT ||
  399. echo 'restore of pan3.0/COPYRIGHT failed'
  400. Wc_c="`wc -c < 'pan3.0/COPYRIGHT'`"
  401. test 823 -eq "$Wc_c" ||
  402.     echo 'pan3.0/COPYRIGHT: original size 823, current size' "$Wc_c"
  403. fi
  404. # ============= pan3.0/panmain.icon ==============
  405. if test -f 'pan3.0/panmain.icon' -a X"$1" != X"-c"; then
  406.     echo 'x - skipping pan3.0/panmain.icon (File already exists)'
  407. else
  408. echo 'x - extracting pan3.0/panmain.icon (Text)'
  409. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/panmain.icon' &&
  410. X/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
  411. X */
  412. X    0x0000,    0x0000,    0x0000,    0x0000,
  413. X    0x0000,    0x0000,    0x0000,    0x0000,
  414. X    0x0000,    0x0000,    0x0000,    0x0000,
  415. X    0x0000,    0x0000,    0x0000,    0x0000,
  416. X    0x0000,    0x0000,    0x0000,    0x0000,
  417. X    0x0000,    0x0000,    0x0000,    0x0000,
  418. X    0x0000,    0x0000,    0x0000,    0x0000,
  419. X    0x1FFF,    0xFFF0,    0x7FFF,    0xFFF8,
  420. X    0x2000,    0x0008,    0x8000,    0x0004,
  421. X    0x5200,    0x9105,    0x5441,    0x2202,
  422. X    0x5AF4,    0xDFB5,    0x70D9,    0xBF6A,
  423. X    0x57D8,    0xBB75,    0x5579,    0x76FA,
  424. X    0x5298,    0x9FA5,    0x55D1,    0x3F52,
  425. X    0x2000,    0x0008,    0x8000,    0x0004,
  426. X    0x1FFF,    0xFFF0,    0x7FFF,    0xFFF8,
  427. X    0x0000,    0x0000,    0x0000,    0x0000,
  428. X    0x0000,    0x0000,    0x0000,    0x0000,
  429. X    0x0000,    0x0000,    0x0000,    0x0000,
  430. X    0x1FFF,    0xFFFF,    0xF81F,    0xFFF0,
  431. X    0x2000,    0x0000,    0x0420,    0x0008,
  432. X    0x5C00,    0x0122,    0x024C,    0x2804,
  433. X    0x597F,    0x59BF,    0x6A4C,    0xF3F4,
  434. X    0x50AD,    0xF976,    0xFA53,    0x2AD4,
  435. X    0x5D77,    0xD13F,    0x5A53,    0xFBD4,
  436. X    0x2020,    0x0000,    0x0420,    0x0008,
  437. X    0x1FFF,    0xFFFF,    0xF81F,    0xFFF0,
  438. X    0x0000,    0x0000,    0x0000,    0x0000,
  439. X    0x0000,    0x0000,    0x0000,    0x0000,
  440. X    0x0000,    0x0000,    0x0000,    0x0000,
  441. X    0x0000,    0x0000,    0x0000,    0x0000,
  442. X    0x0000,    0x0000,    0x0000,    0x0000,
  443. X    0x0000,    0x0000,    0x0000,    0x0000,
  444. X    0x0C00,    0x4000,    0x0000,    0x0000,
  445. X    0x09ED,    0xF800,    0x0000,    0x0000,
  446. X    0x07AA,    0x5000,    0x0000,    0x0000,
  447. X    0x1D6B,    0xD9FF,    0xFFFF,    0xFFF0,
  448. X    0x0000,    0x0000,    0x0000,    0x0000,
  449. X    0x0000,    0x0000,    0x0000,    0x0000,
  450. X    0x0000,    0x0000,    0x0000,    0x0000,
  451. X    0x0000,    0x0000,    0x0000,    0x0000,
  452. X    0x0000,    0x0000,    0x0000,    0x0000,
  453. X    0x0000,    0x0000,    0x0000,    0x0000,
  454. X    0x0000,    0x0000,    0x0000,    0x0000,
  455. X    0x0000,    0x0000,    0x0000,    0x0000,
  456. X    0x0000,    0x0000,    0x0000,    0x0000,
  457. X    0x0000,    0x0000,    0x0000,    0x0000,
  458. X    0x0000,    0x0000,    0x0000,    0x0000,
  459. X    0x0000,    0x0000,    0x0000,    0x0000,
  460. X    0x0000,    0x0000,    0x0000,    0x0000,
  461. X    0x0000,    0x0000,    0x0000,    0x0000,
  462. X    0x0000,    0x0000,    0x0000,    0x0000,
  463. X    0x0000,    0x0000,    0x0000,    0x0000,
  464. X    0x0000,    0x0000,    0x0000,    0x0000,
  465. X    0x0000,    0x0000,    0x0000,    0x0000,
  466. X    0x0000,    0x0000,    0x0000,    0x0000,
  467. X    0x0000,    0x0000,    0x0000,    0x0000,
  468. X    0x0000,    0x0000,    0x0000,    0x0000,
  469. X    0x0000,    0x0000,    0x0000,    0x0000,
  470. X    0x0000,    0x0000,    0x0000,    0x0000,
  471. X    0x0000,    0x0000,    0x0000,    0x0000,
  472. X    0x0000,    0x0000,    0x0000,    0x0000,
  473. X    0x0000,    0x0000,    0x0000,    0x0000,
  474. X    0x0000,    0x0000,    0x0000,    0x0000,
  475. X    0x0000,    0x0000,    0x0000,    0x0000,
  476. SHAR_EOF
  477. chmod 0644 pan3.0/panmain.icon ||
  478. echo 'restore of pan3.0/panmain.icon failed'
  479. Wc_c="`wc -c < 'pan3.0/panmain.icon'`"
  480. test 2190 -eq "$Wc_c" ||
  481.     echo 'pan3.0/panmain.icon: original size 2190, current size' "$Wc_c"
  482. fi
  483. # ============= pan3.0/MANIFEST ==============
  484. if test -f 'pan3.0/MANIFEST' -a X"$1" != X"-c"; then
  485.     echo 'x - skipping pan3.0/MANIFEST (File already exists)'
  486. else
  487. echo 'x - extracting pan3.0/MANIFEST (Text)'
  488. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/MANIFEST' &&
  489. XCOPYRIGHT
  490. XImakefile
  491. XMANIFEST
  492. XMakefile
  493. XMakefile.std
  494. XREADME
  495. Xcontrol.c
  496. Xdnd.c
  497. Xevent.c
  498. Xfolder.c
  499. Xhidexp.c
  500. Xllm.c
  501. Xmenu.c
  502. Xmisc.c
  503. Xmove.c
  504. Xnote.c
  505. Xnoteaction.c
  506. Xpan.c
  507. Xpan.h
  508. Xpan.icon
  509. Xpan.man
  510. Xpan.mask.icon
  511. Xpancmd
  512. Xpanlog
  513. Xpanmain.icon
  514. Xpanmain.mask.icon
  515. Xparser.c
  516. Xrmfolder.c
  517. Xsearch.c
  518. Xupdate.c
  519. Xwin.c
  520. Xwork.c
  521. SHAR_EOF
  522. chmod 0644 pan3.0/MANIFEST ||
  523. echo 'restore of pan3.0/MANIFEST failed'
  524. Wc_c="`wc -c < 'pan3.0/MANIFEST'`"
  525. test 286 -eq "$Wc_c" ||
  526.     echo 'pan3.0/MANIFEST: original size 286, current size' "$Wc_c"
  527. fi
  528. # ============= pan3.0/note.c ==============
  529. if test -f 'pan3.0/note.c' -a X"$1" != X"-c"; then
  530.     echo 'x - skipping pan3.0/note.c (File already exists)'
  531. else
  532. echo 'x - extracting pan3.0/note.c (Text)'
  533. sed 's/^X//' << 'SHAR_EOF' > 'pan3.0/note.c' &&
  534. X/*
  535. XPost A Note V3.0
  536. XCopyright (c) 1993, Jeffrey W. Bailey
  537. XAll rights reserved.
  538. X
  539. XPermission is granted to distribute this program in exact, complete
  540. Xsource form, which includes this copyright notice, as long as no fee
  541. Xother than media and distribution cost is charged.
  542. X
  543. XThis program may not be used in whole, or in part, in any other manner
  544. Xwithout prior written permission from the author.
  545. X
  546. XThis program may not be distributed in modified form without prior
  547. Xwritten permission from the author.  In other words, patches may be
  548. Xdistributed, but modified source may not be distributed.
  549. X
  550. XIf there are any questions, comments or suggestions, the author may be
  551. Xcontacted at:
  552. X
  553. X    jeff@rd1.interlan.com
  554. X
  555. X    or
  556. X
  557. X    Jeffrey Bailey
  558. X    Racal-Datacom, Inc.
  559. X    Mail Stop E-110
  560. X    1601 N. Harrison Parkway
  561. X    Sunrise, FL  33323-2899
  562. X*/
  563. X
  564. X#include "pan.h"
  565. X
  566. X#include <xview/font.h>
  567. X
  568. X#ifdef PAN_DND
  569. X#include <xview/dragdrop.h>
  570. X#endif
  571. X
  572. X#include <X11/X.h>
  573. X#include <X11/Xutil.h>
  574. X
  575. Xextern int errno;
  576. Xextern char *sys_errlist[];
  577. X
  578. Xextern FILE *errfp;
  579. X
  580. X/*
  581. X    Routine called when new note button is selected
  582. X*/
  583. Xnewnote(menu, mitem)
  584. X    Menu menu;
  585. X    Menu_item mitem;
  586. X    {
  587. X    struct SubDir *sp;
  588. X    char *text;
  589. X
  590. X    text = (char *) xv_get(mitem, MENU_STRING);
  591. X    sp = (struct SubDir *)LLM_first(&subdir_rt);
  592. X    while(sp != NULL)
  593. X        {
  594. X        if(strcmp(text, sp->subdir) == 0) break;
  595. X        sp = (struct SubDir *)LLM_next(&subdir_rt);
  596. X        }
  597. X
  598. X    if(sp == NULL)
  599. X        {
  600. X        notice_prompt(main_frame, NULL,
  601. X            NOTICE_MESSAGE_STRINGS,
  602. X                "Internal failure - couldn't find subdir entry",
  603. X                NULL,
  604. X            NOTICE_BUTTON_YES, "Acknowledge",
  605. X            NOTICE_NO_BEEPING, noticenobeep,
  606. X            NULL);
  607. X        return;
  608. X        }
  609. X
  610. X    w_newnote(sp, Visible, NULL, NULL, NULL, ERRONDISPLAY);
  611. X    }
  612. X
  613. X/*
  614. X    Does the grunt work of setting up internals for the frame for
  615. X    restorenotes().  Only maps visible notes.
  616. X*/
  617. Xsetnote(np)
  618. X    struct Note *np;
  619. X    {
  620. X    int  rl, rt, rw, rh;
  621. X    FILE *fp;
  622. X    char fname[MAXBUFLEN];
  623. X    char att[20];
  624. X    char title[MAXTITLELEN + 1];
  625. X    char cdate[100];
  626. X
  627. X    makeinfoname(fname, np);
  628. X    np->rect.r_left = 0;
  629. X    np->rect.r_top = 0;
  630. X    np->rect.r_width = DEFWIDTH;
  631. X    np->rect.r_height = DEFHEIGHT;
  632. X    fp = fopen(fname, "r");
  633. X    if(fp != NULL)
  634. X        {
  635. X        np->state = Visible;
  636. X
  637. X        fgets(title, sizeof(title), fp);
  638. X        (void) sscanf(title, "%d %d %d %d %7s", &rl,
  639. X            &rt, &rw, &rh, att);
  640. X        np->rect.r_left = rl;
  641. X        np->rect.r_top = rt;
  642. X        np->rect.r_width = rw;
  643. X        np->rect.r_height = rh;
  644. X        *title = 0;
  645. X        fgets(title, sizeof(title), fp);
  646. X        trim(title);
  647. X        *cdate = 0;
  648. X        if(fgets(cdate, sizeof(cdate), fp) != NULL)
  649. X            np->crttime = atoi(cdate);
  650. X
  651. X
  652. X        strcpy(np->ntitle, title);
  653. X
  654. X        if(strncmp(att, "HIDDEN", 6) == 0)
  655. X            np->state = Hidden;
  656. X        if(strncmp(att, "VISIBLE", 7) == 0)
  657. X            np->state = Visible;
  658. X
  659. X        if(np->state != Hidden)
  660. X            {
  661. X            if(!buildnote(np, 1, FALSE))
  662. X                {
  663. X                (void) fclose(fp);
  664. X                return;
  665. X                }
  666. X            xv_set(np->title, PANEL_VALUE, np->ntitle, NULL);
  667. X            set_frame_title(np, np->ntitle);
  668. X            reseticon(np);
  669. X            }
  670. X        else np->mapped = 0;
  671. X
  672. X        (void) fclose(fp);
  673. X        }
  674. X    else
  675. X        {
  676. X        notice_prompt(main_frame, NULL,
  677. X            NOTICE_MESSAGE_STRINGS,
  678. X                "Couldn't open note geometry file",
  679. X                fname,
  680. X                sys_errlist[errno],
  681. X                NULL,
  682. X            NOTICE_BUTTON_YES, "Acknowledge",
  683. X            NOTICE_NO_BEEPING, noticenobeep,
  684. X            NULL);
  685. X        if(!buildnote(np, 1, TRUE)) return;
  686. X        np->state = Visible;
  687. X        }
  688. X    }
  689. X
  690. X/*
  691. X    Creates the actual Xview frame and items for a note.  Called by newnote()
  692. X    and restorenotes().
  693. X*/
  694. Xbuildnote(np, display, adjust)
  695. X    struct Note *np;
  696. X    int  display;
  697. X    int  adjust;
  698. X    {
  699. X    static Xv_Font ft;
  700. X    static int foundfont = 0;
  701. X    Rect *rect;
  702. X    int  x, hx, y;
  703. X    Server_image image, image2;
  704. X    static XClassHint chint;
  705. X    struct tm *tmptr;
  706. X    char title[MAXTITLELEN + 1];
  707. X    char fname[MAXBUFLEN];
  708. X    char buf [30];
  709. X
  710. X    strcpy(title, NOTITLE);
  711. X
  712. X    if(get_win(np))
  713. X        {
  714. X        /* if size not specifically set, make sure panel items visible */
  715. X        if(adjust)
  716. X            {
  717. X#ifndef PAN_DND
  718. X            rect = (Rect *) xv_get(np->cdate, PANEL_ITEM_RECT);
  719. X            hx = rect->r_left + rect->r_width + DEFPANELSPACING;
  720. X#else
  721. X            rect = (Rect *) xv_get(np->drag_tgt, PANEL_ITEM_RECT);
  722. X            hx = rect->r_left + rect->r_width + 2 * DEFPANELSPACING;
  723. X#endif
  724. X            rect = (Rect *) xv_get(np->ctime, PANEL_ITEM_RECT);
  725. X            x = rect->r_left + rect->r_width + DEFPANELSPACING;
  726. X            if(hx > x) x = hx;
  727. X            np->rect.r_width = x;
  728. X            }
  729. X        frame_set_rect(np->frame, &np->rect);
  730. X
  731. X        if(np->crttime != 0)
  732. X            {
  733. X            tmptr = localtime(&np->crttime);
  734. X            sprintf(buf, "Created: %02d/%02d/%02d", tmptr->tm_mon + 1,
  735. X                tmptr->tm_mday, tmptr->tm_year);
  736. X            }
  737. X        else strcpy(buf, "No create time");
  738. X        xv_set(np->cdate, PANEL_LABEL_STRING, buf, NULL);
  739. X
  740. X        if(np->crttime != 0)
  741. X            {
  742. X            tmptr = localtime(&np->crttime);
  743. X            sprintf(buf, "Time:    %02d:%02d:%02d", tmptr->tm_hour,
  744. X                tmptr->tm_min, tmptr->tm_sec);
  745. X            }
  746. X        else *buf = 0;
  747. X        xv_set(np->ctime, PANEL_LABEL_STRING, buf, NULL);
  748. X
  749. X        makename(fname, np);
  750. X        xv_set(np->textsw, TEXTSW_FILE, fname, TEXTSW_FIRST, 0, NULL);
  751. X        xv_set(np->frame, XV_LABEL, title, NULL);
  752. X
  753. X        xv_set(np->panel, PANEL_CARET_ITEM, np->title, NULL);
  754. X
  755. X        xv_set(np->title, PANEL_CLIENT_DATA, np, NULL);
  756. X        xv_set(np->hide, PANEL_CLIENT_DATA, np, NULL);
  757. X        xv_set(np->actionmenu, MENU_CLIENT_DATA, np, NULL);
  758. X
  759. X        xv_set(np->frame, XV_SHOW, TRUE, NULL);
  760. X        np->mapped = 1;
  761. X        return(1);
  762. X        }
  763. X
  764. X    np->frame = xv_create(main_frame, FRAME,
  765. X                              XV_LABEL, title,
  766. X                              FRAME_DONE_PROC, dismissed,
  767. X                              NULL);
  768. X    if(np->frame == NULL)
  769. X        {
  770. X        if(display)
  771. X            {
  772. X            notice_prompt(main_frame, NULL,
  773. X                NOTICE_MESSAGE_STRINGS,
  774. X                    "Couldn't create a new frame (internal error)",
  775. X                    NULL,
  776. X                NOTICE_BUTTON_YES, "Acknowledge",
  777. X                NOTICE_NO_BEEPING, noticenobeep,
  778. X                NULL);
  779. X            }
  780. X        else
  781. X            {
  782. X            fprintf(errfp,
  783. X                "%s:  Couldn't create a new frame (internal error)\n",
  784. X                myname);
  785. X            }
  786. X        return(0);
  787. X        }
  788. X
  789. X    /* Set up the X class since xview doesn't */
  790. X    chint.res_name = "pannote";
  791. X    chint.res_class = "PanNote";
  792. X    XSetClassHint((Display *)xv_get(np->frame, XV_DISPLAY),
  793. X        xv_get(np->frame, XV_XID), &chint);
  794. X
  795. X    xv_set(np->frame, WIN_EVENT_PROC, frameexit, WIN_CONSUME_EVENTS,
  796. X        LOC_WINEXIT, NULL,
  797. X        NULL);
  798. X
  799. X    np->panel = (Panel) xv_create(np->frame, PANEL,
  800. X                     WIN_RETAINED, FALSE, 
  801. X                     NULL);
  802. X
  803. X    if(np->panel == NULL)
  804. X        {
  805. X        xv_destroy_safe(np->frame);
  806. X        return(0);
  807. X        }
  808. X
  809. X    np->title = xv_create(np->panel, PANEL_TEXT,
  810. X                     PANEL_LABEL_STRING, "Title:",
  811. X                     PANEL_VALUE, "",
  812. X                     PANEL_VALUE_DISPLAY_LENGTH, MAXTITLEDISLEN + 1,
  813. X                     PANEL_VALUE_STORED_LENGTH, MAXTITLELEN,
  814. X                     PANEL_NOTIFY_PROC, newtitle,
  815. X                     PANEL_CLIENT_DATA, np,
  816. X                     XV_X, xv_col(np->panel, 0),
  817. X                     XV_Y, xv_row(np->panel, 0),
  818. X                     NULL);
  819. X    if(np->title == NULL)
  820. X        {
  821. X        xv_destroy_safe(np->frame);
  822. X        return(0);
  823. X        }
  824. X    rect = (Rect *) xv_get(np->title, PANEL_ITEM_RECT);
  825. X    hx = rect->r_left + rect->r_width + DEFPANELSPACING;
  826. X
  827. X    if(np->crttime != 0)
  828. X        {
  829. X        tmptr = localtime(&np->crttime);
  830. X        sprintf(buf, "Created: %02d/%02d/%02d", tmptr->tm_mon + 1,
  831. X            tmptr->tm_mday, tmptr->tm_year);
  832. X        }
  833. X    else
  834. X       {
  835. X       strcpy(buf, "No create time");
  836. X       }
  837. X    np->cdate = xv_create(np->panel, PANEL_MESSAGE,
  838. X                 PANEL_LABEL_STRING, buf,
  839. X                 XV_X, hx,
  840. X                 XV_Y, xv_row(np->panel, 0),
  841. X                 NULL);
  842. X
  843. X#ifdef PAN_DND
  844. X    rect = (Rect *) xv_get(np->cdate, PANEL_ITEM_RECT);
  845. X    x = rect->r_left + rect->r_width + 2 * DEFPANELSPACING;
  846. X    np->drag_obj = xv_create(np->panel, DRAGDROP,
  847. X                 NULL);
  848. X    np->drag_tgt = xv_create(np->panel, PANEL_DROP_TARGET,
  849. X                 XV_X, x,
  850. X                 XV_Y, xv_row(np->panel, 0),
  851. X                 PANEL_DROP_DND, np->drag_obj,
  852. X                 PANEL_NOTIFY_PROC, drag_proc,
  853. X                 PANEL_DROP_FULL,   TRUE,
  854. X                 NULL);
  855. X    np->got_itms = 0;
  856. X#endif
  857. X
  858. X    np->hide = xv_create(np->panel, PANEL_BUTTON,
  859. X                     PANEL_NEXT_ROW, -1,
  860. X                     PANEL_LABEL_STRING, "Hide",
  861. X                     PANEL_NOTIFY_PROC, hidenote, 
  862. X                     PANEL_CLIENT_DATA, np,
  863. X                     XV_X, xv_col(np->panel, 0),
  864. X                     XV_Y, xv_row(np->panel, 1),
  865. X                     NULL);
  866. X    if(np->hide == NULL)
  867. X        {
  868. X        xv_destroy_safe(np->frame);
  869. X        return(0);
  870. X        }
  871. X    rect = (Rect *) xv_get(np->hide, PANEL_ITEM_RECT);
  872. X    x = rect->r_left + rect->r_width + DEFPANELSPACING;
  873. X    y = rect->r_top;
  874. X
  875. X    np->actionmenu = (Menu) xv_create(NULL, MENU,
  876. X                     MENU_NOTIFY_PROC, noteaction,
  877. X                     MENU_CLIENT_DATA, np,
  878. X                     MENU_STRINGS, "Print", widthtext, "Destroy", NULL,
  879. X                     NULL);
  880. X    np->action = (Panel_item) xv_create(np->panel, PANEL_BUTTON,
  881. X                     PANEL_LABEL_STRING, "Action",
  882. X                     PANEL_ITEM_MENU, np->actionmenu,
  883. X                     XV_X, x,
  884. X                     XV_Y, y,
  885. X                     NULL);
  886. X    if(np->action == NULL)
  887. X        {
  888. X        xv_destroy_safe(np->frame);
  889. X        return(0);
  890. X        }
  891. X    rect = (Rect *) xv_get(np->action, PANEL_ITEM_RECT);
  892. X    x = rect->r_left + rect->r_width + DEFPANELSPACING;
  893. X    if(x > hx)
  894. X        {
  895. X        hx = x;
  896. X        xv_set(np->cdate, XV_X, hx, NULL);
  897. X        rect = (Rect *) xv_get(np->cdate, PANEL_ITEM_RECT);
  898. X        x = rect->r_left + rect->r_width + 2 * DEFPANELSPACING;
  899. X#ifndef PAN_DND
  900. X        xv_set(np->drag_tgt, XV_X, x, NULL);
  901. X#endif
  902. X        }
  903. X
  904. X    if(np->crttime != 0)
  905. X        {
  906. X        tmptr = localtime(&np->crttime);
  907. X        sprintf(buf, "Time:    %02d:%02d:%02d", tmptr->tm_hour,
  908. X            tmptr->tm_min, tmptr->tm_sec);
  909. X        }
  910. X    else *buf = 0;
  911. X    np->ctime = xv_create(np->panel, PANEL_MESSAGE,
  912. X             PANEL_LABEL_STRING, buf,
  913. X             XV_X, hx,
  914. X             XV_Y, y,
  915. X             NULL);
  916. X
  917. X    window_fit_height(np->panel);
  918. X
  919. X    np->textsw = xv_create(np->frame, TEXTSW,
  920. X                     NULL);
  921. X    if(np->textsw == NULL)
  922. X        {
  923. X        xv_destroy_safe(np->frame);
  924. X        return(0);
  925. X        }
  926. X
  927. X    /* User defined textsw font processing */
  928. X    if(*textfont)
  929. X        {
  930. X        if(foundfont == 0)
  931. X            {
  932. X            ft = xv_find(main_frame, FONT, FONT_NAME, textfont, NULL);
  933. X            if(ft)
  934. X                foundfont = 1;
  935. X            else
  936. X                foundfont = -1;
  937. X            }
  938. X        if(foundfont == 1)
  939. X            {
  940. X            xv_set(np->textsw, TEXTSW_FONT, ft, NULL);
  941. X            }
  942. X        }
  943. X
  944. X
  945. X    xv_set(xv_get(np->textsw, OPENWIN_NTH_VIEW, 0), 
  946. X        WIN_EVENT_PROC, dragdrop,
  947. X        WIN_CONSUME_EVENTS,
  948. X            ACTION_DRAG_LOAD|ACTION_GO_PAGE_FORWARD|ACTION_GO_PAGE_BACKWARD,
  949. X            KBD_DONE,
  950. X            NULL,
  951. X        WIN_RETAINED, FALSE,
  952. X        NULL);
  953. X
  954. X    window_fit(np->textsw);
  955. X    window_fit(np->frame);
  956. X
  957. X    /* if size not specifically set, make sure panel items visible */
  958. X    if(adjust)
  959. X        {
  960. X#ifndef PAN_DND
  961. X        rect = (Rect *) xv_get(np->cdate, PANEL_ITEM_RECT);
  962. X        hx = rect->r_left + rect->r_width + DEFPANELSPACING;
  963. X#else
  964. X        rect = (Rect *) xv_get(np->drag_tgt, PANEL_ITEM_RECT);
  965. X        hx = rect->r_left + rect->r_width + 2 * DEFPANELSPACING;
  966. X#endif
  967. X        rect = (Rect *) xv_get(np->ctime, PANEL_ITEM_RECT);
  968. X        x = rect->r_left + rect->r_width + DEFPANELSPACING;
  969. X        if(hx > x) x = hx;
  970. X        np->rect.r_width = x;
  971. X        }
  972. X
  973. X    frame_set_rect(np->frame, &np->rect);
  974. X
  975. X    image = xv_create(NULL, SERVER_IMAGE, XV_WIDTH, 64, XV_HEIGHT, 64,
  976. X                      SERVER_IMAGE_BITS, myicon, NULL);
  977. X    if(image == NULL)
  978. X        {
  979. X        xv_destroy_safe(np->frame);
  980. X        return(0);
  981. X        }
  982. X    image2 = xv_create(NULL, SERVER_IMAGE, XV_WIDTH, 64, XV_HEIGHT, 64,
  983. X                      SERVER_IMAGE_BITS, myiconmask, NULL);
  984. X    if(image2 == NULL)
  985. X        {
  986. X        xv_destroy_safe(np->frame);
  987. X        return(0);
  988. X        }
  989. X    np->icon = xv_create(NULL, ICON,
  990. X                     ICON_IMAGE, image,
  991. X                     ICON_MASK_IMAGE, image2,
  992. X                     ICON_LABEL, title,
  993. X                     ICON_TRANSPARENT, icontransparent,
  994. X                     NULL);
  995. X    if(np->icon == NULL)
  996. X        {
  997. X        xv_destroy_safe(np->frame);
  998. X        return(0);
  999. X        }
  1000. X    xv_set(np->frame, FRAME_ICON, np->icon, NULL);
  1001. X
  1002. X    makename(fname, np);
  1003. X    xv_set(np->textsw, TEXTSW_FILE, fname, TEXTSW_FIRST, 0, NULL);
  1004. X    xv_set(np->frame, XV_SHOW, TRUE, NULL);
  1005. X    np->mapped = 1;
  1006. X
  1007. X    return(1);
  1008. X    }
  1009. X
  1010. X/*
  1011. X    Sets the icon label of a note to its title.
  1012. X*/
  1013. Xreseticon(np)
  1014. X    struct Note *np;
  1015. X    {
  1016. X    char title[MAXTITLELEN + 1];
  1017. X
  1018. X    *title = 0;
  1019. X    strcpy(title, np->ntitle);
  1020. X    if(strlen(title) == 0) strcpy(title, NOTITLE);
  1021. X
  1022. X    xv_set(np->icon, ICON_LABEL, title, NULL);
  1023. X    }
  1024. X
  1025. X/*
  1026. X   Called when the user enters a new title for a note.
  1027. X*/
  1028. Xnewtitle(item, event)
  1029. X    Panel_item item;
  1030. X    Event *event;
  1031. X    {
  1032. X    Xv_Window window;
  1033. X    struct Note *np;
  1034. X    char title[MAXTITLELEN + 1];
  1035. X    char ntitle[MAXBUFLEN];
  1036. X
  1037. X    np = (struct Note *)xv_get(item, PANEL_CLIENT_DATA);
  1038. X
  1039. X    strcpy(title, (char *) xv_get(np->title, PANEL_VALUE));
  1040. X    trim(title);
  1041. X    if(strlen(title))
  1042. X        {
  1043. X        strcpy(ntitle, title);
  1044. X        }
  1045. X    else
  1046. X        {
  1047. X        strcpy(ntitle, NOTITLE);
  1048. X        }
  1049. X    set_frame_title(np, ntitle);
  1050. X    strcpy(np->ntitle, ntitle);
  1051. X    reseticon(np);
  1052. X    adjust_sorted(np);
  1053. X
  1054. X    xv_set(item, PANEL_INACTIVE, TRUE, NULL);
  1055. X    window = (Xv_Window) xv_get(np->textsw, OPENWIN_NTH_VIEW, 0);
  1056. X    win_set_kbd_focus(window, xv_get(window, XV_XID));
  1057. X    xv_set(item, PANEL_INACTIVE, FALSE, NULL);
  1058. X    updateinfo(np, FORCE);
  1059. X    refresh_popups();
  1060. X    return((int)PANEL_NONE);
  1061. X    }
  1062. X
  1063. Xset_frame_title(np, title)
  1064. X    struct Note *np;
  1065. X    char *title;
  1066. X    {
  1067. X    char t_title[MAXTITLELEN + 1];
  1068. X
  1069. X    if(fintitle)
  1070. X        {
  1071. X        sprintf(t_title, "(%s) %s", np->sp->subdir, title);
  1072. X        xv_set(np->frame, XV_LABEL, t_title, NULL);
  1073. X        }
  1074. X    else
  1075. X        xv_set(np->frame, XV_LABEL, title, NULL);
  1076. X    }
  1077. SHAR_EOF
  1078. chmod 0644 pan3.0/note.c ||
  1079. echo 'restore of pan3.0/note.c failed'
  1080. Wc_c="`wc -c < 'pan3.0/note.c'`"
  1081. test 15182 -eq "$Wc_c" ||
  1082.     echo 'pan3.0/note.c: original size 15182, current size' "$Wc_c"
  1083. fi
  1084. true || echo 'restore of pan3.0/pan.c failed'
  1085. echo End of part 4, continue with part 5
  1086. exit 0
  1087.  
  1088. --
  1089. Jeffrey Bailey
  1090. Racal-Datacom, Inc.
  1091. Mail Stop E-110
  1092. 1601 N. Harrison Parkway                  INET : jeff@rd1.interlan.com
  1093. Sunrise, FL 33323-2899                    UUCP : ...uflorida!novavax!rd1!jeff
  1094.  
  1095. exit 0 # Just in case...
  1096. -- 
  1097.   // chris@Sterling.COM           | Send comp.sources.x submissions to:
  1098. \X/  Amiga - The only way to fly! |    sources-x@sterling.com
  1099.  "It's intuitively obvious to the |
  1100.   most casual observer..."        | GCS d+/-- p+ c++ l+ m+ s++/+ g+ w+ t+ r+ x+
  1101.