home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume16 / pan / part02 < prev    next >
Encoding:
Text File  |  1992-03-06  |  30.8 KB  |  981 lines

  1. Newsgroups: comp.sources.x
  2. Path: uunet!think.com!mips!msi!dcmartin
  3. From: jeff@rd1.interlan.com (Jeff Bailey)
  4. Subject: v16i138: pan - Post A Note (for Open Windows), Part02/06
  5. Message-ID: <1992Mar6.200325.8171@msi.com>
  6. Originator: dcmartin@fascet
  7. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  8. Organization: Molecular Simulations, Inc.
  9. References: <csx-16i137-pan@uunet.UU.NET>
  10. Date: Fri, 6 Mar 1992 20:03:25 GMT
  11. Approved: dcmartin@msi.com
  12.  
  13. Submitted-by: jeff@rd1.interlan.com (Jeff Bailey)
  14. Posting-number: Volume 16, Issue 138
  15. Archive-name: pan/part02
  16.  
  17.  
  18. ---- Cut Here and feed the following to sh ----
  19. #!/bin/sh
  20. # This is part 02 of a multipart archive
  21. # ============= menu.c ==============
  22. if test -f 'menu.c' -a X"$1" != X"-c"; then
  23.     echo 'x - skipping menu.c (File already exists)'
  24. else
  25. echo 'x - extracting menu.c (Text)'
  26. sed 's/^X//' << 'SHAR_EOF' > 'menu.c' &&
  27. /*
  28. Post A Note V2.4
  29. Copyright (c) 1992, Jeffrey W. Bailey
  30. All rights reserved.
  31. X
  32. Permission is granted to distribute this program in exact, complete
  33. source form, which includes this copyright notice, as long as no fee
  34. other than media and distribution cost is charged.
  35. X
  36. This program may not be used in whole, or in part, in any other manner
  37. without prior written permission from the author.
  38. X
  39. This program may not be distributed in modified form without prior
  40. written permission from the author.  In other words, patches may be
  41. distributed, but modified source may not be distributed.
  42. X
  43. If there are any questions, comments or suggestions, the author may be
  44. contacted at:
  45. X
  46. X    jeff@rd1.interlan.com
  47. X
  48. X    or
  49. X
  50. X    Jeffrey Bailey
  51. X    Racal-Datacom, Inc.
  52. X    Mail Stop E-110
  53. X    1601 N. Harrison Parkway
  54. X    Sunrise, FL  33323-2899
  55. */
  56. X
  57. #include "pan.h"
  58. X
  59. extern char *malloc();
  60. extern char *getenv();
  61. X
  62. extern int errno;
  63. extern char *sys_errlist[];
  64. X
  65. /*
  66. X    Routine to dynamically create a menu of all currently hidden notes
  67. X    for the expose from list menu.
  68. */
  69. Menu gen_exposemenu(mitem, op)
  70. X    Menu_item mitem;
  71. X    Menu_generate op;
  72. X    {
  73. X    int  cols;
  74. X    int  count = 0;
  75. X    int  i;
  76. X    static Menu menu = NULL;
  77. X    Menu_item mi;
  78. X    char *cp;
  79. X    char *text;
  80. X    struct Note *np;
  81. X    struct SubDir *sp;
  82. X    char buf[2 * MAXTITLELEN];
  83. X    char title[2 * MAXTITLELEN];
  84. X
  85. X    if(op == MENU_DISPLAY)
  86. X        {
  87. X        text = (char *)xv_get(mitem, MENU_STRING);
  88. X        if(menu != NULL)
  89. X            {
  90. X            for(i = xv_get(menu, MENU_NITEMS); i > 0; i--)
  91. X                {
  92. X                xv_set(menu, MENU_REMOVE, i, NULL);
  93. X                xv_destroy(xv_get(menu, MENU_NTH_ITEM, i));
  94. X                }
  95. X            xv_set(menu, MENU_NCOLS, 1, NULL);
  96. X            }
  97. X        else
  98. X            {
  99. X            menu = xv_create(NULL, MENU, NULL);
  100. X            }
  101. X        sp = (struct SubDir *)LLM_first(&subdir_rt);
  102. X        while(sp != NULL)
  103. X            {
  104. X            if(strcmp(sp->subdir, text) == 0) break;
  105. X            sp = (struct SubDir *)LLM_next(&subdir_rt);
  106. X            }
  107. X        np = (struct Note *)LLM_first(&sp->note_rt);
  108. X        /* find first note not visible */
  109. X        while(np != NULL && np->state == Visible)
  110. X            {
  111. X            np = (struct Note *)LLM_next(&sp->note_rt);
  112. X            }
  113. X        if(np != NULL)
  114. X            {
  115. X            cp = malloc(strlen(CHOICE_ALL) + 1);
  116. X            strcpy(cp, CHOICE_ALL);
  117. X            mi = xv_create(NULL, MENUITEM,
  118. X                MENU_STRING, cp,
  119. X                MENU_NOTIFY_PROC, exposemenu,
  120. X                MENU_CLIENT_DATA, 0xFFFFFFFF,
  121. X                MENU_RELEASE,
  122. X                MENU_RELEASE_IMAGE,
  123. X                NULL);
  124. X            xv_set(menu, MENU_APPEND_ITEM, mi, NULL);
  125. X            count++;
  126. X            }
  127. X        while(np != NULL)
  128. X            {
  129. X            if(np->state != Visible)
  130. X                {
  131. X                *title = 0;
  132. X                strcpy(buf, np->ntitle);
  133. X                if(strlen(buf)) sprintf(title, "%-20.20s", buf);
  134. X                if(strlen(title) == 0) strcpy(title, NOTITLE);
  135. X                cp = malloc(strlen(title) + 1);
  136. X                strcpy(cp, title);
  137. X                mi = xv_create(NULL, MENUITEM,
  138. X                    MENU_STRING, cp,
  139. X                    MENU_NOTIFY_PROC, exposemenu,
  140. X                    MENU_CLIENT_DATA, np,
  141. X                    MENU_RELEASE,
  142. X                    MENU_RELEASE_IMAGE,
  143. X                    NULL);
  144. X                xv_set(menu, MENU_APPEND_ITEM, mi, NULL);
  145. X                count++;
  146. X                }
  147. X            np = (struct Note *)LLM_next(&sp->note_rt);
  148. X            }
  149. X        if(count == 0)
  150. X            {
  151. X            mi = xv_create(NULL, MENUITEM,
  152. X                MENU_STRING, "No hidden notes",
  153. X                MENU_NOTIFY_PROC, exposemenu,
  154. X                MENU_CLIENT_DATA, NULL,
  155. X                MENU_RELEASE,
  156. X                NULL);
  157. X            xv_set(menu, MENU_APPEND_ITEM, mi, NULL);
  158. X            }
  159. X        else
  160. X            {
  161. X            cols = count / COL_ROLLOVER;
  162. X            if(cols == 0) cols = 1;
  163. X            if(cols == 1 && count > COL_ROLLOVER) cols = 2;
  164. X            if(cols > COL_MAXCOL) cols = COL_MAXCOL;
  165. X            xv_set(menu, MENU_NCOLS, cols, NULL);
  166. X            }
  167. X        }
  168. X    return(menu);
  169. X    }
  170. X
  171. /*
  172. X    Handles the Action menu choices.
  173. */
  174. actionmenu(menu, mitem)
  175. X    Menu menu;
  176. X    Menu_item mitem;
  177. X    {
  178. X    Display *dpy;
  179. X    Xv_Screen screen;
  180. X    int  screen_num;
  181. X    int  screen_height;
  182. X    int  screen_width;
  183. X    char *cp;
  184. X    int  pid;
  185. X    Rect rect;
  186. X    Panel folder_panel;
  187. X    char *text;
  188. X    Menu_item pullright;
  189. X    Menu mpullright;
  190. X    char *ptext;
  191. X    struct stat st;
  192. X    struct Note *np;
  193. X    char fname [MAXBUFLEN];
  194. X    char envtitle [MAXTITLELEN + 1 + 15];
  195. X    char envfname [MAXBUFLEN];
  196. X
  197. X    if(strcmp((text = (char *)xv_get(mitem, MENU_STRING)), CHOICE_QUIT) == 0)
  198. X        {
  199. X        cleanup(0);
  200. X        }
  201. X    if(strcmp(text, CHOICE_FOLDER) == 0)
  202. X        {
  203. X        dpy = (Display *) xv_get(main_frame, XV_DISPLAY);
  204. X        screen = (Xv_Screen) xv_get(main_frame, XV_SCREEN);
  205. X        screen_num = xv_get(screen, SCREEN_NUMBER);
  206. X        screen_height = DisplayHeight(dpy, screen_num);
  207. X        screen_width = DisplayWidth(dpy, screen_num);
  208. X        frame_get_rect(main_frame, &rect);
  209. X        rect.r_left += FLDRSPACING;
  210. X        if((rect.r_left + FLDRWIDTH) > (screen_width - FLDRSPACING))
  211. X            rect.r_left = screen_width - FLDRWIDTH - FLDRSPACING;
  212. X        if((rect.r_top + rect.r_height + 2 * FLDRSPACING + FLDRHEIGHT) < 
  213. X           screen_height)
  214. X            rect.r_top += (rect.r_height + FLDRSPACING);
  215. X        else
  216. X            rect.r_top -= (FLDRHEIGHT + 2 * FLDRSPACING);
  217. X        folder_frame = xv_create(main_frame, FRAME_CMD,
  218. X                               XV_LABEL, "Create Folder",
  219. X                               XV_X, rect.r_left,
  220. X                               XV_Y, rect.r_top,
  221. X                               XV_WIDTH, FLDRWIDTH,
  222. X                               XV_HEIGHT, FLDRHEIGHT,
  223. X                               FRAME_NO_CONFIRM, TRUE,
  224. X                               FRAME_DONE_PROC, folderdone,
  225. X                               NULL);
  226. X        if(folder_frame == NULL)
  227. X            {
  228. X            notice_prompt(main_frame, NULL,
  229. X                NOTICE_MESSAGE_STRINGS,
  230. X                    "Unable to create sub-frame (internal error)",
  231. X                    NULL,
  232. X                NOTICE_BUTTON_YES, "Acknowledge",
  233. X                NOTICE_NO_BEEPING, noticenobeep,
  234. X                NULL);
  235. X            return;
  236. X            }
  237. X        xv_set(folder_frame, XV_SHOW, TRUE, NULL);
  238. X
  239. X        folder_panel = (Panel) xv_get(folder_frame, FRAME_CMD_PANEL);
  240. X        xv_set(folder_panel, WIN_RETAINED, FALSE, NULL);
  241. X
  242. X        folder_item =  xv_create(folder_panel, PANEL_TEXT,
  243. X                     PANEL_LABEL_STRING, "New Folder:",
  244. X                     PANEL_VALUE, "",
  245. X                     PANEL_VALUE_DISPLAY_LENGTH, MAXSUBDIR,
  246. X                     PANEL_VALUE_STORED_LENGTH, MAXSUBDIR,
  247. X                     PANEL_NOTIFY_PROC, newfolder,
  248. X                     NULL);
  249. X        (void) xv_create(folder_panel, PANEL_BUTTON,
  250. X                         XV_X, 150,
  251. X                         XV_Y, 30,
  252. X                         PANEL_LABEL_STRING, "Apply",
  253. X                         PANEL_NOTIFY_PROC, newfolder,
  254. X                         NULL);
  255. X        window_fit_height(folder_panel);
  256. X        (void) xv_set(folder_mitem, MENU_INACTIVE, TRUE, NULL);
  257. X        }
  258. X    /* Figure out if we have a print item by climbing the hierarchy */
  259. X    mpullright = NULL;
  260. X    pullright = (Menu_item) xv_get(menu, MENU_PARENT);
  261. X    if(pullright != NULL)
  262. X        mpullright = (Menu_item) xv_get(pullright, MENU_PARENT);
  263. X    if(mpullright != NULL)
  264. X        pullright = (Menu_item) xv_get(mpullright, MENU_PARENT);
  265. X    if(pullright != NULL)
  266. X        {
  267. X        ptext = (char *)xv_get(pullright, MENU_STRING);
  268. X        if(strcmp(ptext, CHOICE_PRINT) == 0)
  269. X            {
  270. X            np = (struct Note *)xv_get(mitem, MENU_CLIENT_DATA);
  271. X            if(np == NULL)
  272. X                {
  273. X                notice_prompt(main_frame, NULL,
  274. X                    NOTICE_MESSAGE_STRINGS,
  275. X                        "No notes to print",
  276. X                        NULL,
  277. X                    NOTICE_BUTTON_YES, "Acknowledge",
  278. X                    NOTICE_NO_BEEPING, noticenobeep,
  279. X                    NULL);
  280. X                return;
  281. X                }
  282. X            makename(fname, np);
  283. X            if(stat(fname, &st) < 0)
  284. X                {
  285. X                notice_prompt(main_frame, NULL,
  286. X                    NOTICE_MESSAGE_STRINGS,
  287. X                        "The selected note is not accessible (no contents)",
  288. X                        fname,
  289. X                        sys_errlist[errno],
  290. X                        NULL,
  291. X                    NOTICE_BUTTON_YES, "Acknowledge",
  292. X                    NOTICE_NO_BEEPING, noticenobeep,
  293. X                    NULL);
  294. X                return;
  295. X                }
  296. X            switch(pid = fork())
  297. X                {
  298. X                case -1 :
  299. X                    notice_prompt(main_frame, NULL,
  300. X                        NOTICE_MESSAGE_STRINGS,
  301. X                            "Couldn't fork a new process (internal error)",
  302. X                            sys_errlist[errno],
  303. X                            NULL,
  304. X                        NOTICE_BUTTON_YES, "Acknowledge",
  305. X                        NOTICE_NO_BEEPING, noticenobeep,
  306. X                        NULL);
  307. X                    return;
  308. X                    break;
  309. X                case  0 :
  310. X                    cp = defaults_get_string(resources[RES_PCOMMAND].a,
  311. X                         resources[RES_PCOMMAND].b, RESDEF_PCOMMAND);
  312. X                    sprintf(envtitle, "NOTETITLE=%s", np->ntitle);
  313. X                    sprintf(envfname, "FILE=%s", fname);
  314. X                    putenv(envtitle);
  315. X                    putenv(envfname);
  316. X                    execl("/bin/sh", "sh", "-c", cp, NULL);
  317. X                    _exit(0);
  318. X                    break;
  319. X                default :
  320. X                    (void) notify_set_wait3_func(main_frame, 
  321. X                        child_death, pid);
  322. X                    break;
  323. X                }
  324. X            }
  325. X        }
  326. X    }
  327. X
  328. /*
  329. X    Routine to dynamically create a menu of all notes
  330. X    for the action print note menu.
  331. */
  332. Menu gen_prtmenu(mitem, op)
  333. X    Menu_item mitem;
  334. X    Menu_generate op;
  335. X    {
  336. X    int  cols;
  337. X    int  count = 0;
  338. X    int  i;
  339. X    static Menu menu = NULL;
  340. X    Menu_item mi;
  341. X    char *cp;
  342. X    char *text;
  343. X    struct Note *np;
  344. X    struct SubDir *sp;
  345. X    char buf[2 * MAXTITLELEN];
  346. X    char title[2 * MAXTITLELEN];
  347. X
  348. X    if(op == MENU_DISPLAY)
  349. X        {
  350. X        text = (char *)xv_get(mitem, MENU_STRING);
  351. X        if(menu != NULL)
  352. X            {
  353. X            for(i = xv_get(menu, MENU_NITEMS); i > 0; i--)
  354. X                {
  355. X                xv_set(menu, MENU_REMOVE, i, NULL);
  356. X                xv_destroy(xv_get(menu, MENU_NTH_ITEM, i));
  357. X                }
  358. X            xv_set(menu, MENU_NCOLS, 1, NULL);
  359. X            }
  360. X        else
  361. X            {
  362. X            menu = xv_create(NULL, MENU, NULL);
  363. X            }
  364. X        sp = (struct SubDir *)LLM_first(&subdir_rt);
  365. X        while(sp != NULL)
  366. X            {
  367. X            if(strcmp(sp->subdir, text) == 0) break;
  368. X            sp = (struct SubDir *)LLM_next(&subdir_rt);
  369. X            }
  370. X        np = (struct Note *)LLM_first(&sp->note_rt);
  371. X        while(np != NULL)
  372. X            {
  373. X            *title = 0;
  374. X            strcpy(buf, np->ntitle);
  375. X            if(strlen(buf)) sprintf(title, "%-20.20s", buf);
  376. X            if(strlen(title) == 0) strcpy(title, NOTITLE);
  377. X            cp = malloc(strlen(title) + 1);
  378. X            strcpy(cp, title);
  379. X            mi = xv_create(NULL, MENUITEM,
  380. X                MENU_STRING, cp,
  381. X                MENU_NOTIFY_PROC, actionmenu,
  382. X                MENU_CLIENT_DATA, np,
  383. X                MENU_RELEASE,
  384. X                MENU_RELEASE_IMAGE,
  385. X                NULL);
  386. X            xv_set(menu, MENU_APPEND_ITEM, mi, NULL);
  387. X            count++;
  388. X            np = (struct Note *)LLM_next(&sp->note_rt);
  389. X            }
  390. X        if(count == 0)
  391. X            {
  392. X            mi = xv_create(NULL, MENUITEM,
  393. X                MENU_STRING, "No notes to print",
  394. X                MENU_NOTIFY_PROC, actionmenu,
  395. X                MENU_CLIENT_DATA, NULL,
  396. X                MENU_RELEASE,
  397. X                NULL);
  398. X            xv_set(menu, MENU_APPEND_ITEM, mi, NULL);
  399. X            }
  400. X        else
  401. X            {
  402. X            cols = count / COL_ROLLOVER;
  403. X            if(cols == 0) cols = 1;
  404. X            if(cols == 1 && count > COL_ROLLOVER) cols = 2;
  405. X            if(cols > COL_MAXCOL) cols = COL_MAXCOL;
  406. X            xv_set(menu, MENU_NCOLS, cols, NULL);
  407. X            }
  408. X        }
  409. X    return(menu);
  410. X    }
  411. SHAR_EOF
  412. chmod 0644 menu.c ||
  413. echo 'restore of menu.c failed'
  414. Wc_c="`wc -c < 'menu.c'`"
  415. test 12600 -eq "$Wc_c" ||
  416.     echo 'menu.c: original size 12600, current size' "$Wc_c"
  417. fi
  418. # ============= misc.c ==============
  419. if test -f 'misc.c' -a X"$1" != X"-c"; then
  420.     echo 'x - skipping misc.c (File already exists)'
  421. else
  422. echo 'x - extracting misc.c (Text)'
  423. sed 's/^X//' << 'SHAR_EOF' > 'misc.c' &&
  424. /*
  425. Post A Note V2.4
  426. Copyright (c) 1992, Jeffrey W. Bailey
  427. All rights reserved.
  428. X
  429. Permission is granted to distribute this program in exact, complete
  430. source form, which includes this copyright notice, as long as no fee
  431. other than media and distribution cost is charged.
  432. X
  433. This program may not be used in whole, or in part, in any other manner
  434. without prior written permission from the author.
  435. X
  436. This program may not be distributed in modified form without prior
  437. written permission from the author.  In other words, patches may be
  438. distributed, but modified source may not be distributed.
  439. X
  440. If there are any questions, comments or suggestions, the author may be
  441. contacted at:
  442. X
  443. X    jeff@rd1.interlan.com
  444. X
  445. X    or
  446. X
  447. X    Jeffrey Bailey
  448. X    Racal-Datacom, Inc.
  449. X    Mail Stop E-110
  450. X    1601 N. Harrison Parkway
  451. X    Sunrise, FL  33323-2899
  452. */
  453. X
  454. #include "pan.h"
  455. X
  456. extern char *malloc();
  457. extern char *getenv();
  458. X
  459. extern int errno;
  460. extern char *sys_errlist[];
  461. X
  462. char *add_sorted(nr, title)
  463. X    struct LLM_root *nr;
  464. X    char *title;
  465. X    {
  466. X    struct Note *np;
  467. X
  468. X    np = (struct Note *)LLM_first(nr);
  469. X    if(np == NULL)
  470. X        {
  471. X        return(LLM_add(nr));
  472. X        }
  473. X    while(np != NULL && strcmp(title, np->ntitle) >= 0)
  474. X        {
  475. X        np = (struct Note *)LLM_next(nr);
  476. X        }
  477. X    if(np == NULL)
  478. X        {
  479. X        return(LLM_add(nr));
  480. X        }
  481. X    return(LLM_insert(nr, np));
  482. X    }
  483. X
  484. /* adjust nodes position in list since the title may have changed */
  485. adjust_sorted(np)
  486. X    struct Note *np;
  487. X    {
  488. X    struct LLM_root *nr;
  489. X    struct Note *tp;
  490. X
  491. X    nr = &np->sp->note_rt;
  492. X    LLM_unlink(nr, np);
  493. X    tp = (struct Note *)LLM_first(nr);
  494. X    while(tp != NULL && strcmp(np->ntitle, tp->ntitle) >= 0)
  495. X        {
  496. X        tp = (struct Note *)LLM_next(nr);
  497. X        }
  498. X    LLM_link(nr, tp, np);
  499. X    }
  500. SHAR_EOF
  501. chmod 0644 misc.c ||
  502. echo 'restore of misc.c failed'
  503. Wc_c="`wc -c < 'misc.c'`"
  504. test 1777 -eq "$Wc_c" ||
  505.     echo 'misc.c: original size 1777, current size' "$Wc_c"
  506. fi
  507. # ============= move.c ==============
  508. if test -f 'move.c' -a X"$1" != X"-c"; then
  509.     echo 'x - skipping move.c (File already exists)'
  510. else
  511. echo 'x - extracting move.c (Text)'
  512. sed 's/^X//' << 'SHAR_EOF' > 'move.c' &&
  513. /*
  514. Post A Note V2.4
  515. Copyright (c) 1992, Jeffrey W. Bailey
  516. All rights reserved.
  517. X
  518. Permission is granted to distribute this program in exact, complete
  519. source form, which includes this copyright notice, as long as no fee
  520. other than media and distribution cost is charged.
  521. X
  522. This program may not be used in whole, or in part, in any other manner
  523. without prior written permission from the author.
  524. X
  525. This program may not be distributed in modified form without prior
  526. written permission from the author.  In other words, patches may be
  527. distributed, but modified source may not be distributed.
  528. X
  529. If there are any questions, comments or suggestions, the author may be
  530. contacted at:
  531. X
  532. X    jeff@rd1.interlan.com
  533. X
  534. X    or
  535. X
  536. X    Jeffrey Bailey
  537. X    Racal-Datacom, Inc.
  538. X    Mail Stop E-110
  539. X    1601 N. Harrison Parkway
  540. X    Sunrise, FL  33323-2899
  541. */
  542. X
  543. #include "pan.h"
  544. X
  545. extern char *malloc();
  546. extern char *getenv();
  547. X
  548. extern int errno;
  549. extern char *sys_errlist[];
  550. X
  551. int applymove();
  552. int movedone();
  553. int chosesrc();
  554. X
  555. Panel_item srclist, dstlist, notelist;
  556. X
  557. movenote(menu, mitem)
  558. X    Menu menu;
  559. X    Menu_item mitem;
  560. X    {
  561. X    int  row;
  562. X    struct SubDir *sp;
  563. X    struct Note *np;
  564. X    Display *dpy;
  565. X    Xv_Screen screen;
  566. X    int  screen_num;
  567. X    int  screen_height;
  568. X    int  screen_width;
  569. X    Rect rect;
  570. X    char buf[MAXTITLELEN + 1];
  571. X
  572. X    move_mitem = mitem;
  573. X    dpy = (Display *) xv_get(main_frame, XV_DISPLAY);
  574. X    screen = (Xv_Screen) xv_get(main_frame, XV_SCREEN);
  575. X    screen_num = xv_get(screen, SCREEN_NUMBER);
  576. X    screen_height = DisplayHeight(dpy, screen_num);
  577. X    screen_width = DisplayWidth(dpy, screen_num);
  578. X    frame_get_rect(main_frame, &rect);
  579. X    rect.r_left += MOVESPACING;
  580. X    if((rect.r_left + MOVEWIDTH) > (screen_width - MOVESPACING))
  581. X        rect.r_left = screen_width - MOVEWIDTH - MOVESPACING;
  582. X    if((rect.r_top + rect.r_height + 2 * MOVESPACING + MOVEHEIGHT) < 
  583. X       screen_height)
  584. X        rect.r_top += (rect.r_height + MOVESPACING);
  585. X    else
  586. X        rect.r_top -= (MOVEHEIGHT + 2 * MOVESPACING);
  587. X    move_frame = xv_create(main_frame, FRAME_CMD,
  588. X                           XV_LABEL, "Move Notes",
  589. X                           XV_X, rect.r_left,
  590. X                           XV_Y, rect.r_top,
  591. X                           XV_WIDTH, MOVEWIDTH,
  592. X                           XV_HEIGHT, MOVEHEIGHT,
  593. X                           FRAME_NO_CONFIRM, TRUE,
  594. X                           FRAME_DONE_PROC, movedone,
  595. X                           NULL);
  596. X    if(move_frame == NULL)
  597. X        {
  598. X        notice_prompt(main_frame, NULL,
  599. X            NOTICE_MESSAGE_STRINGS,
  600. X                "Unable to create sub-frame (internal error)",
  601. X                NULL,
  602. X            NOTICE_BUTTON_YES, "Acknowledge",
  603. X            NOTICE_NO_BEEPING, noticenobeep,
  604. X            NULL);
  605. X        return;
  606. X        }
  607. X    xv_set(move_frame, XV_SHOW, TRUE, NULL);
  608. X    move_panel = (Panel) xv_get(move_frame, FRAME_CMD_PANEL);
  609. X    xv_set(move_panel, WIN_RETAINED, FALSE, NULL);
  610. X
  611. X    (void) xv_create(move_panel, PANEL_MESSAGE,
  612. X        XV_X, xv_col(move_panel, 0),
  613. X        XV_Y, xv_row(move_panel, 0),
  614. X        PANEL_LABEL_STRING, "Source Folder",
  615. X        NULL);
  616. X    (void) xv_create(move_panel, PANEL_MESSAGE,
  617. X        XV_X, xv_col(move_panel, 20),
  618. X        XV_Y, xv_row(move_panel, 0),
  619. X        PANEL_LABEL_STRING, "Destination Folder",
  620. X        NULL);
  621. X    (void) xv_create(move_panel, PANEL_MESSAGE,
  622. X        XV_X, xv_col(move_panel, 45),
  623. X        XV_Y, xv_row(move_panel, 0),
  624. X        PANEL_LABEL_STRING, "Notes To Move",
  625. X        NULL);
  626. X
  627. X    srclist = xv_create(move_panel, PANEL_LIST,
  628. X        XV_X, xv_col(move_panel, 0),
  629. X        XV_Y, xv_row(move_panel, 1),
  630. X        PANEL_LIST_DISPLAY_ROWS, 7,
  631. X        PANEL_LIST_WIDTH, xv_col(move_panel, 15),
  632. X        PANEL_CHOOSE_ONE, TRUE,
  633. X        PANEL_NOTIFY_PROC, chosesrc,
  634. X        NULL);
  635. X    dstlist = xv_create(move_panel, PANEL_LIST,
  636. X        XV_X, xv_col(move_panel, 20),
  637. X        XV_Y, xv_row(move_panel, 1),
  638. X        PANEL_LIST_DISPLAY_ROWS, 7,
  639. X        PANEL_LIST_WIDTH, xv_col(move_panel, 15),
  640. X        PANEL_CHOOSE_ONE, TRUE,
  641. X        NULL);
  642. X
  643. X    row = 0;
  644. X    sp = (struct SubDir *) LLM_first(&subdir_rt);
  645. X    while(sp != NULL)
  646. X        {
  647. X        xv_set(srclist,
  648. X            PANEL_LIST_INSERT, row,
  649. X            PANEL_LIST_STRING, row, sp->subdir, 
  650. X            PANEL_LIST_CLIENT_DATA, row, sp, 
  651. X            NULL);
  652. X        xv_set(dstlist,
  653. X            PANEL_LIST_INSERT, row,
  654. X            PANEL_LIST_STRING, row, sp->subdir, 
  655. X            PANEL_LIST_CLIENT_DATA, row, sp, 
  656. X            NULL);
  657. X        sp = (struct SubDir *) LLM_next(&subdir_rt);
  658. X        row++;
  659. X        }
  660. X
  661. X    notelist = xv_create(move_panel, PANEL_LIST,
  662. X        XV_X, xv_col(move_panel, 45),
  663. X        XV_Y, xv_row(move_panel, 1),
  664. X        PANEL_LIST_DISPLAY_ROWS, 7,
  665. X        PANEL_LIST_WIDTH, xv_col(move_panel, 20),
  666. X        PANEL_CHOOSE_ONE, FALSE,
  667. X        NULL);
  668. X
  669. X    (void) xv_create(move_panel, PANEL_BUTTON,
  670. X                     XV_X, MOVEWIDTH / 2 - 30,
  671. X                     XV_Y, MOVEHEIGHT - 30,
  672. X                     PANEL_LABEL_STRING, "Apply",
  673. X                     PANEL_NOTIFY_PROC, applymove,
  674. X                     NULL);
  675. X    window_fit_height(move_panel);
  676. X    row = 0;
  677. X    sp = (struct SubDir *) LLM_first(&subdir_rt);
  678. X    np = (struct Note *)LLM_first(&sp->note_rt);
  679. X    while(np != NULL)
  680. X        {
  681. X        strcpy(buf, np->ntitle);
  682. X        if(strlen(buf) == 0) strcpy(buf, NOTITLE);
  683. X        xv_set(notelist,
  684. X            PANEL_LIST_INSERT, row,
  685. X            PANEL_LIST_STRING, row, buf,
  686. X            PANEL_LIST_CLIENT_DATA, row, np, 
  687. X            PANEL_LIST_SELECT, row, FALSE,
  688. X            NULL);
  689. X        np = (struct Note *)LLM_next(&sp->note_rt);
  690. X        row++;
  691. X        }
  692. X    (void) xv_set(move_mitem, MENU_INACTIVE, TRUE, NULL);
  693. X    move_up = 1;
  694. X    }
  695. X
  696. movedone()
  697. X    {
  698. X    xv_destroy_safe(move_frame);
  699. X    (void) xv_set(move_mitem, MENU_INACTIVE, FALSE, NULL);
  700. X    move_up = 0;
  701. X    }
  702. X
  703. applymove(item, event)
  704. X    Panel_item item;
  705. X    Event *event;
  706. X    {
  707. X    int  i;
  708. X    int  row;
  709. X    struct Note *np;
  710. X    struct Note *tn;
  711. X    struct SubDir *sp;
  712. X    char src[MAXSUBDIR + 1];
  713. X    char dst[MAXSUBDIR + 1];
  714. X    char buf[MAXBUFLEN];
  715. X    char buf2[MAXBUFLEN];
  716. X
  717. X    *src = 0;
  718. X    *dst = 0;
  719. X
  720. X    /* get src dir */
  721. X    row = xv_get(srclist, PANEL_LIST_NROWS);
  722. X    for(i = 0; i < row; i++)
  723. X        {
  724. X        if(xv_get(srclist, PANEL_LIST_SELECTED, i))
  725. X            {
  726. X            sp = (struct SubDir *) xv_get(srclist, PANEL_LIST_CLIENT_DATA, i);
  727. X            strcpy(src, sp->subdir);
  728. X            }
  729. X        }
  730. X
  731. X    /* get dst dir, sp points to new SubDir struct */
  732. X    row = xv_get(dstlist, PANEL_LIST_NROWS);
  733. X    for(i = 0; i < row; i++)
  734. X        {
  735. X        if(xv_get(dstlist, PANEL_LIST_SELECTED, i))
  736. X            {
  737. X            sp = (struct SubDir *) xv_get(dstlist, PANEL_LIST_CLIENT_DATA, i);
  738. X            strcpy(dst, sp->subdir);
  739. X            }
  740. X        }
  741. X
  742. X    trim(src);
  743. X    trim(dst);
  744. X    if(strcmp(src, dst) == 0)
  745. X        {
  746. X        notice_prompt(main_frame, NULL,
  747. X            NOTICE_MESSAGE_STRINGS,
  748. X                "Source and destination folders cannot be the same",
  749. X                NULL,
  750. X            NOTICE_BUTTON_YES, "Acknowledge",
  751. X            NOTICE_NO_BEEPING, noticenobeep,
  752. X            NULL);
  753. X        if(xv_get(move_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  754. X            {
  755. X            xv_destroy_safe(move_frame);
  756. X            (void) xv_set(move_mitem, MENU_INACTIVE, FALSE, NULL);
  757. X            move_up = 0;
  758. X            }
  759. X        return;
  760. X        }
  761. X
  762. X    row = xv_get(notelist, PANEL_LIST_NROWS);
  763. X    for(i = 0; i < row; i++)
  764. X        {
  765. X        if(xv_get(notelist, PANEL_LIST_SELECTED, i))
  766. X            {
  767. X            np = (struct Note *) xv_get(notelist, PANEL_LIST_CLIENT_DATA, i);
  768. X            sprintf(buf, "%s/%s", src, np->basename);
  769. X            sprintf(buf2, "%s/%s", dst, np->basename);
  770. X            if(rename(buf, buf2) < 0)
  771. X                {
  772. X                notice_prompt(main_frame, NULL,
  773. X                    NOTICE_MESSAGE_STRINGS,
  774. X                        "Note move failed",
  775. X                        sys_errlist[errno],
  776. X                        NULL,
  777. X                    NOTICE_BUTTON_YES, "Acknowledge",
  778. X                    NOTICE_NO_BEEPING, noticenobeep,
  779. X                    NULL);
  780. X                if(xv_get(move_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  781. X                    {
  782. X                    xv_destroy_safe(move_frame);
  783. X                    (void) xv_set(move_mitem, MENU_INACTIVE, FALSE, NULL);
  784. X                    move_up = 0;
  785. X                    }
  786. X                return;
  787. X                }
  788. X            sprintf(buf, "%s/%s.info", src, np->basename);
  789. X            sprintf(buf2, "%s/%s.info", dst, np->basename);
  790. X            if(rename(buf, buf2) < 0)
  791. X                {
  792. X                notice_prompt(main_frame, NULL,
  793. X                    NOTICE_MESSAGE_STRINGS,
  794. X                        "Note move failed",
  795. X                        sys_errlist[errno],
  796. X                        NULL,
  797. X                    NOTICE_BUTTON_YES, "Acknowledge",
  798. X                    NOTICE_NO_BEEPING, noticenobeep,
  799. X                    NULL);
  800. X                if(xv_get(move_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  801. X                    {
  802. X                    xv_destroy_safe(move_frame);
  803. X                    (void) xv_set(move_mitem, MENU_INACTIVE, FALSE, NULL);
  804. X                    move_up = 0;
  805. X                    }
  806. X                return;
  807. X                }
  808. X            tn = (struct Note *) add_sorted(&sp->note_rt, np->ntitle);
  809. X            if(tn == NULL)
  810. X                {
  811. X                notice_prompt(main_frame, NULL,
  812. X                    NOTICE_MESSAGE_STRINGS,
  813. X                        "Note move failed - Memory allocation failure",
  814. X                        sys_errlist[errno],
  815. X                        NULL,
  816. X                    NOTICE_BUTTON_YES, "Acknowledge",
  817. X                    NOTICE_NO_BEEPING, noticenobeep,
  818. X                    NULL);
  819. X                /* Best attempt to fix things */
  820. X                (void) rename(buf2, buf);
  821. X                sprintf(buf, "%s/%s", src, np->basename);
  822. X                sprintf(buf2, "%s/%s", dst, np->basename);
  823. X                (void) rename(buf2, buf);
  824. X                if(xv_get(move_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  825. X                    {
  826. X                    xv_destroy_safe(move_frame);
  827. X                    (void) xv_set(move_mitem, MENU_INACTIVE, FALSE, NULL);
  828. X                    move_up = 0;
  829. X                    }
  830. X                return;
  831. X                }
  832. X            memcpy((char *)tn, (char *)np, sizeof(struct Note));
  833. X            LLM_delete(&(np->sp->note_rt), np);
  834. X            tn->sp = sp;
  835. X            if(tn->mapped)
  836. X                {
  837. X                xv_set(tn->title, PANEL_CLIENT_DATA, tn, NULL);
  838. X                xv_set(tn->hide, PANEL_CLIENT_DATA, tn, NULL);
  839. X                xv_set(tn->destroy, PANEL_CLIENT_DATA, tn, NULL);
  840. X                }
  841. X            }
  842. X        }
  843. X
  844. X    xv_set(notelist, XV_SHOW, FALSE, NULL);
  845. X    for(i = row - 1; i >= 0; i--)
  846. X        {
  847. X        if(xv_get(notelist, PANEL_LIST_SELECTED, i))
  848. X            {
  849. X            xv_set(notelist, PANEL_LIST_DELETE, i, NULL);
  850. X            }
  851. X        }
  852. X    xv_set(notelist, XV_SHOW, TRUE, NULL);
  853. X
  854. X    if(xv_get(move_frame, FRAME_CMD_PUSHPIN_IN) == FALSE)
  855. X        {
  856. X        xv_destroy_safe(move_frame);
  857. X        (void) xv_set(move_mitem, MENU_INACTIVE, FALSE, NULL);
  858. X        move_up = 0;
  859. X        }
  860. X    refresh_popups();
  861. X    }
  862. X
  863. chosesrc(item, string, client_data, op, event)
  864. X    Panel_item item;
  865. X    char *string;
  866. X    char *client_data;
  867. X    Panel_list_op op;
  868. X    Event *event;
  869. X    {
  870. X    int  i;
  871. X    int  row;
  872. X    struct SubDir *sp;
  873. X    struct Note *np;
  874. X    char buf[MAXTITLELEN + 1];
  875. X
  876. X    if(op == PANEL_LIST_OP_SELECT)
  877. X        {
  878. X        xv_set(notelist, XV_SHOW, FALSE, NULL);
  879. X        row = xv_get(notelist, PANEL_LIST_NROWS);
  880. X        for(i = row - 1; i >= 0; i--)
  881. X            xv_set(notelist, PANEL_LIST_DELETE, i, NULL);
  882. X        sp = (struct SubDir *)client_data;
  883. X        row = 0;
  884. X        np = (struct Note *)LLM_first(&sp->note_rt);
  885. X        while(np != NULL)
  886. X            {
  887. X            strcpy(buf, np->ntitle);
  888. X            if(strlen(buf) == 0) strcpy(buf, NOTITLE);
  889. X            xv_set(notelist,
  890. X                PANEL_LIST_INSERT, row,
  891. X                PANEL_LIST_STRING, row, buf,
  892. X                PANEL_LIST_CLIENT_DATA, row, np, 
  893. X                PANEL_LIST_SELECT, row, FALSE,
  894. X                NULL);
  895. X            np = (struct Note *)LLM_next(&sp->note_rt);
  896. X            row++;
  897. X            }
  898. X        xv_set(notelist, XV_SHOW, TRUE, NULL);
  899. X        }
  900. X    }
  901. X
  902. refresh_move()
  903. X    {
  904. X    int  row, i;
  905. X    struct SubDir *sp;
  906. X    struct Note *np;
  907. X    char buf[MAXTITLELEN + 1];
  908. X
  909. X    if(!move_up) return;
  910. X
  911. X    xv_set(srclist, XV_SHOW, FALSE, NULL);
  912. X    xv_set(dstlist, XV_SHOW, FALSE, NULL);
  913. X    xv_set(notelist, XV_SHOW, FALSE, NULL);
  914. X
  915. X    row = xv_get(srclist, PANEL_LIST_NROWS);
  916. X    for(i = row - 1; i >= 0; i--)
  917. X        xv_set(srclist, PANEL_LIST_DELETE, i, NULL);
  918. X
  919. X    row = xv_get(dstlist, PANEL_LIST_NROWS);
  920. X    for(i = row - 1; i >= 0; i--)
  921. X        xv_set(dstlist, PANEL_LIST_DELETE, i, NULL);
  922. X
  923. X    row = xv_get(notelist, PANEL_LIST_NROWS);
  924. X    for(i = row - 1; i >= 0; i--)
  925. X        xv_set(notelist, PANEL_LIST_DELETE, i, NULL);
  926. X
  927. X    row = 0;
  928. X    sp = (struct SubDir *) LLM_first(&subdir_rt);
  929. X    while(sp != NULL)
  930. X        {
  931. X        xv_set(srclist,
  932. X            PANEL_LIST_INSERT, row,
  933. X            PANEL_LIST_STRING, row, sp->subdir, 
  934. X            PANEL_LIST_CLIENT_DATA, row, sp, 
  935. X            NULL);
  936. X        xv_set(dstlist,
  937. X            PANEL_LIST_INSERT, row,
  938. X            PANEL_LIST_STRING, row, sp->subdir, 
  939. X            PANEL_LIST_CLIENT_DATA, row, sp, 
  940. X            NULL);
  941. X        sp = (struct SubDir *) LLM_next(&subdir_rt);
  942. X        row++;
  943. X        }
  944. X
  945. X    row = 0;
  946. X    sp = (struct SubDir *) LLM_first(&subdir_rt);
  947. X    np = (struct Note *)LLM_first(&sp->note_rt);
  948. X    while(np != NULL)
  949. X        {
  950. X        strcpy(buf, np->ntitle);
  951. X        if(strlen(buf) == 0) strcpy(buf, NOTITLE);
  952. X        xv_set(notelist,
  953. X            PANEL_LIST_INSERT, row,
  954. X            PANEL_LIST_STRING, row, buf,
  955. X            PANEL_LIST_CLIENT_DATA, row, np, 
  956. X            PANEL_LIST_SELECT, row, FALSE,
  957. X            NULL);
  958. X        np = (struct Note *)LLM_next(&sp->note_rt);
  959. X        row++;
  960. X        }
  961. X
  962. X    xv_set(srclist, XV_SHOW, TRUE, NULL);
  963. X    xv_set(dstlist, XV_SHOW, TRUE, NULL);
  964. X    xv_set(notelist, XV_SHOW, TRUE, NULL);
  965. X    }
  966. SHAR_EOF
  967. chmod 0644 move.c ||
  968. echo 'restore of move.c failed'
  969. Wc_c="`wc -c < 'move.c'`"
  970. test 14223 -eq "$Wc_c" ||
  971.     echo 'move.c: original size 14223, current size' "$Wc_c"
  972. fi
  973. true || echo 'restore of note.c failed'
  974. echo End of part 2, continue with part 3
  975. exit 0
  976. -- 
  977. --
  978. Molecular Simulations, Inc.            mail: dcmartin@msi.com
  979. 796 N. Pastoria Avenue                uucp: uunet!dcmartin
  980. Sunnyvale, California 94086            at&t: 408/522-9236
  981.