home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume18 / bibview / part14 < prev    next >
Encoding:
Text File  |  1992-08-26  |  50.2 KB  |  1,649 lines

  1. Path: uunet!paladin.american.edu!gatech!swrinde!mips!msi!dcmartin
  2. From: liebla@informatik.tu-muenchen.de (Armin Liebl)
  3. Newsgroups: comp.sources.x
  4. Subject: v18i112: bibview - BibTeX GUI, Part14/20
  5. Message-ID: <1992Aug27.161729.25905@msi.com>
  6. Date: 27 Aug 92 16:17:29 GMT
  7. References: <csx-18i099-bibview@uunet.UU.NET>
  8. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  9. Organization: Molecular Simulations, Inc.
  10. Lines: 1635
  11. Approved: dcmartin@msi.com
  12. Originator: dcmartin@fascet
  13.  
  14. Submitted-by: Armin Liebl <liebla@informatik.tu-muenchen.de>
  15. Posting-number: Volume 18, Issue 112
  16. Archive-name: bibview/part14
  17.  
  18. #!/bin/sh
  19. # this is part.14 (part 14 of a multipart archive)
  20. # do not concatenate these parts, unpack them in order with /bin/sh
  21. # file flexsrc/b.y continued
  22. #
  23. if test ! -r _shar_seq_.tmp; then
  24.     echo 'Please unpack part 1 first!'
  25.     exit 1
  26. fi
  27. (read Scheck
  28.  if test "$Scheck" != 14; then
  29.     echo Please unpack part "$Scheck" next!
  30.     exit 1
  31.  else
  32.     exit 0
  33.  fi
  34. ) < _shar_seq_.tmp || exit 1
  35. if test ! -f _shar_wnt_.tmp; then
  36.     echo 'x - still skipping flexsrc/b.y'
  37. else
  38. echo 'x - continuing file flexsrc/b.y'
  39. sed 's/^X//' << 'SHAR_EOF' >> 'flexsrc/b.y' &&
  40. {
  41. X UserFld *h;
  42. X String newType;
  43. X long pos;
  44. X
  45. X fseek(datei, 0L, SEEK_END); 
  46. X fprintf(datei,"\n");
  47. X pos = ftell(datei);
  48. X newType = glbNewString(glbTypeToName(card->cardtype));
  49. X fprintf(datei,"@%s{%s",newType, card->mainkey);
  50. X pos = ftell(datei);
  51. X fprintf(datei,",\n");
  52. X if (!StringIsPeteEmpty(card->address)) {
  53. X   pos = WriteLineToFile(datei,"ADDRESS",card->address);    
  54. X } 
  55. X if (!StringIsPeteEmpty(card->annote)) {
  56. X   pos = WriteLineToFile(datei,"ANNOTE",card->annote);    
  57. X } 
  58. X if (!StringIsPeteEmpty(card->author)) {
  59. X   pos = WriteLineToFile(datei,"AUTHOR",card->author);    
  60. X } 
  61. X if (!StringIsPeteEmpty(card->booktitle)) {
  62. X   pos = WriteLineToFile(datei,"BOOKTITLE",card->booktitle);    
  63. X } 
  64. X if (!StringIsPeteEmpty(card->chapter)) {
  65. X   pos = WriteLineToFile(datei,"CHAPTER",card->chapter);    
  66. X } 
  67. X if (!StringIsPeteEmpty(card->crossref)) {
  68. X   pos = WriteLineToFile(datei,"CROSSREF",card->crossref);    
  69. X } 
  70. X if (!StringIsPeteEmpty(card->edition)) {
  71. X   pos = WriteLineToFile(datei,"EDITION",card->edition);    
  72. X } 
  73. X if (!StringIsPeteEmpty(card->editor)) {
  74. X   pos = WriteLineToFile(datei,"EDITOR",card->editor);    
  75. X } 
  76. X if (!StringIsPeteEmpty(card->howpublished)) {
  77. X   pos = WriteLineToFile(datei,"HOWPUBLISHED",card->howpublished);    
  78. X } 
  79. X if (!StringIsPeteEmpty(card->institution)) {
  80. X   pos = WriteLineToFile(datei,"INSTITUTION",card->institution);    
  81. X } 
  82. X if (!StringIsPeteEmpty(card->journal)) {
  83. X   pos = WriteLineToFile(datei,"JOURNAL",card->journal);    
  84. X } 
  85. X if (!StringIsPeteEmpty(card->key)) {
  86. X   pos = WriteLineToFile(datei,"KEY",card->key);    
  87. X } 
  88. X if (!StringIsPeteEmpty(card->month)) {
  89. X   pos = WriteLineToFile(datei,"MONTH",card->month);    
  90. X } 
  91. X if (!StringIsPeteEmpty(card->note)) {
  92. X   pos = WriteLineToFile(datei,"NOTE",card->note);    
  93. X } 
  94. X if (!StringIsPeteEmpty(card->number)) {
  95. X   pos = WriteLineToFile(datei,"NUMBER",card->number);    
  96. X } 
  97. X if (!StringIsPeteEmpty(card->organization)) {
  98. X   pos = WriteLineToFile(datei,"ORGANIZATION",card->organization);    
  99. X } 
  100. X if (!StringIsPeteEmpty(card->pages)) {
  101. X   pos = WriteLineToFile(datei,"PAGES",card->pages);    
  102. X } 
  103. X if (!StringIsPeteEmpty(card->publisher)) {
  104. X   pos = WriteLineToFile(datei,"PUBLISHER",card->publisher);    
  105. X } 
  106. X if (!StringIsPeteEmpty(card->school)) {
  107. X   pos = WriteLineToFile(datei,"SCHOOL",card->school);    
  108. X } 
  109. X if (!StringIsPeteEmpty(card->series)) {
  110. X   pos = WriteLineToFile(datei,"SERIES",card->series);    
  111. X } 
  112. X if (!StringIsPeteEmpty(card->title)) {
  113. X   pos = WriteLineToFile(datei,"TITLE",card->title);    
  114. X } 
  115. X if (!StringIsPeteEmpty(card->type)) {
  116. X   pos = WriteLineToFile(datei,"TYPE",card->type);    
  117. X } 
  118. X if (!StringIsPeteEmpty(card->volume)) {
  119. X   pos = WriteLineToFile(datei,"VOLUME",card->volume);    
  120. X } 
  121. X if (!StringIsPeteEmpty(card->year)) {
  122. X   pos = WriteLineToFile(datei,"YEAR",card->year);    
  123. X } 
  124. X if (!StringIsPeteEmpty(card->category)) {
  125. X   pos = WriteLineToFile(datei,"CATEGORY",card->category);    
  126. X } 
  127. X h = card->ufield; 
  128. X while (h) {
  129. X   pos = WriteLineToFile(datei,h->fldName,h->fldData);    
  130. X   h = h->next;
  131. X }   
  132. X fseek(datei, pos, SEEK_SET);
  133. X fprintf(datei,"\n}\n\n");
  134. }
  135. X
  136. X
  137. X
  138. static int StringIsPeteEmpty(char *text)
  139. {
  140. X if (text == NULL || *text == '\0') return 1;
  141. X return 0;
  142. }
  143. X
  144. X
  145. X
  146. yyerror(char *s)
  147. {
  148. X
  149. X fputs(s, stderr);
  150. X putc('\n', stderr);
  151. }
  152. X
  153. #ifdef BIFMAIN
  154. X
  155. int main(int argc, char *argv[])
  156. {
  157. X Bib bp;
  158. X int erg, b1, i;
  159. X Errcode err;
  160. X
  161. #ifdef YYDEBUG
  162. X       extern int yydebug;
  163. X
  164. X       yydebug = 1;
  165. #endif
  166. X
  167. X strcpy(bp.filepath, argv[1]);
  168. X dbtGetFreeTreeIdx(&b1);
  169. X bp.treeIdx = b1;
  170. X err = bifFileRead(&bp);
  171. X err = bifFileWrite(&bp);
  172. }
  173. X
  174. #endif
  175. SHAR_EOF
  176. echo 'File flexsrc/b.y is complete' &&
  177. chmod 0640 flexsrc/b.y ||
  178. echo 'restore of flexsrc/b.y failed'
  179. Wc_c="`wc -c < 'flexsrc/b.y'`"
  180. test 29693 -eq "$Wc_c" ||
  181.     echo 'flexsrc/b.y: original size 29693, current size' "$Wc_c"
  182. rm -f _shar_wnt_.tmp
  183. fi
  184. # ============= flexsrc/cm ==============
  185. if test -f 'flexsrc/cm' -a X"$1" != X"-c"; then
  186.     echo 'x - skipping flexsrc/cm (File already exists)'
  187.     rm -f _shar_wnt_.tmp
  188. else
  189. > _shar_wnt_.tmp
  190. echo 'x - extracting flexsrc/cm (Text)'
  191. sed 's/^X//' << 'SHAR_EOF' > 'flexsrc/cm' &&
  192. yacc -dlv b.y
  193. mv y.tab.h b.tab.h
  194. mv y.tab.c bib_file.c
  195. flex -iv b.l
  196. mv lex.yy.c bib_flex.c
  197. SHAR_EOF
  198. chmod 0740 flexsrc/cm ||
  199. echo 'restore of flexsrc/cm failed'
  200. Wc_c="`wc -c < 'flexsrc/cm'`"
  201. test 91 -eq "$Wc_c" ||
  202.     echo 'flexsrc/cm: original size 91, current size' "$Wc_c"
  203. rm -f _shar_wnt_.tmp
  204. fi
  205. # ============= globdata.c ==============
  206. if test -f 'globdata.c' -a X"$1" != X"-c"; then
  207.     echo 'x - skipping globdata.c (File already exists)'
  208.     rm -f _shar_wnt_.tmp
  209. else
  210. > _shar_wnt_.tmp
  211. echo 'x - extracting globdata.c (Text)'
  212. sed 's/^X//' << 'SHAR_EOF' > 'globdata.c' &&
  213. /*********************************************************************/
  214. /*  bibView: Administration of bibTex-Databases                      */
  215. /*           (Verwaltung von bibTeX-Literaturdatenbanken)            */
  216. /*                                                                   */
  217. /*  Module:  globdata.c                                              */
  218. /*                                                                   */
  219. /*             Handling of global data                               */
  220. /*             - List of bibdata                                     */
  221. /*                                                                   */
  222. /*  Author:  Holger Martin,  martinh@informatik.tu-muenchen.de       */
  223. /*           Peter M. Urban, urban@informatik.tu-muenchen.de         */
  224. /*                                                                   */
  225. /*  History:                                                         */
  226. /*    12.05.91  PMU  created                                         */
  227. /*    05.26.92       Version 1.0 released                            */
  228. /*                                                                   */
  229. /*  Copyright 1992 TU MUENCHEN                                       */
  230. /*    See ./Copyright for complete rights and liability information. */
  231. /*                                                                   */
  232. /*********************************************************************/
  233. X
  234. #include <stdio.h>
  235. #include <X11/Intrinsic.h>
  236. #include <X11/StringDefs.h>
  237. #include "bibview.h"
  238. X
  239. X
  240. /* macros and definitions */
  241. /* ---------------------- */
  242. X
  243. /* list type for opened bibliographies */
  244. typedef struct bl {
  245. X   Bib bib;
  246. X   struct bl *prev,
  247. X         *next;
  248. } BibEl, *BibList;
  249. X
  250. /* CardEl and CardList are part of Bib in bibview.h */
  251. X
  252. X
  253. /* local function prototypes */
  254. /* ------------------------- */
  255. static BibList FindBibListEl (BibPtr bp);
  256. static CardList FindCardListEl (BibPtr bp, CardPtr cp);
  257. X
  258. X
  259. /* external global variables */
  260. /* ------------------------- */
  261. X
  262. X
  263. /* exported global variables */
  264. /* ---------------------- */
  265. X
  266. X
  267. /* local global variables */
  268. /* ------------------------- */
  269. X
  270. /* names for card types */
  271. static String cardNames[] = {
  272. X   "article",
  273. X   "book",
  274. X   "booklet",
  275. X   "conference",
  276. X   "inbook",
  277. X   "incollection",
  278. X   "inproceedings",
  279. X   "manual",
  280. X   "mastersthesis",
  281. X   "misc",
  282. X   "phdthesis",
  283. X   "proceedings",
  284. X   "techreport",
  285. X   "unpublished",
  286. X   "userdefined"
  287. };
  288. X
  289. /* list of opened bibliographies */
  290. static BibList bibList = NULL;
  291. X
  292. X
  293. X
  294. /*********************************************************************/
  295. /* strupr:                                                           */
  296. /*    Convert characters 'a'..'z' to 'A'..'Z'                        */
  297. /*********************************************************************/
  298. char *
  299. strupr (char *s)
  300. {
  301. char *p = s;
  302. X
  303. X   while (*p) {
  304. X      if (*p >= 'a' && *p <= 'z')
  305. X     *p = *p - 32;
  306. X      p++;
  307. X   }
  308. X
  309. X   return(s);
  310. }
  311. X
  312. X
  313. /*********************************************************************/
  314. /* glbNewString:                                                     */
  315. /*    Copy an instance of a String                                   */
  316. /*********************************************************************/
  317. String
  318. glbNewString (String s)
  319. {
  320. String str;
  321. X
  322. X   if (s == NULL)
  323. X      return(NULL);
  324. X
  325. X   if ((str = (char *)malloc(strlen(s)+1)) == NULL)
  326. X      return(NULL);
  327. X
  328. X   strcpy(str, s);
  329. X   return(str);
  330. }
  331. X
  332. X
  333. /*********************************************************************/
  334. /* glbTrimString:                                                    */
  335. /*    Remove whitespace before and after string                      */
  336. /*********************************************************************/
  337. String
  338. glbTrimString (String s)
  339. {
  340. String p;
  341. X
  342. X   while (*s == ' ' || *s == '\t') {
  343. X      p = s;
  344. X      while (*p) {
  345. X     *p = *(p+1);
  346. X     p++;
  347. X      }
  348. X   }
  349. X
  350. X   p = s+strlen(s)-1;
  351. X   while (*p == ' ' || *p == '\t')
  352. X      *p-- = '\0';
  353. X   return(s);
  354. }
  355. X
  356. X
  357. /*********************************************************************/
  358. /* glbIsStringEmpty:                                                 */
  359. /*    Check for empty string                                         */
  360. /*********************************************************************/
  361. Boolean
  362. glbIsStringEmpty (String s)
  363. {
  364. X   if (s == NULL || *s == '\0') 
  365. X      return(TRUE);
  366. X
  367. X   while (*s) {
  368. X      if (*s != ' ' || *s != '\t') 
  369. X          return(FALSE);
  370. X      s++;
  371. X   }
  372. X
  373. X   return(TRUE);
  374. }
  375. X
  376. X
  377. /*********************************************************************/
  378. /* glbTypeToName:                                                    */
  379. /*    Return String name of card type                                */
  380. /*********************************************************************/
  381. String
  382. glbTypeToName (CardType type)
  383. {
  384. X   return(cardNames[type]);
  385. }
  386. X
  387. X
  388. /*********************************************************************/
  389. /* glbNameToType:                                                    */
  390. /*    Return card type corresponding to name                         */
  391. /*********************************************************************/
  392. CardType
  393. glbNameToType (String name)
  394. {
  395. int i = 0;
  396. X
  397. X   for (i = 0; i < MAX_BIBTEX_TYPES; i++) {
  398. X      if (strcmp(name, cardNames[i]) == 0)
  399. X         return((CardType)i);
  400. X   }
  401. X   return(illegal);
  402. }
  403. X
  404. X
  405. /*********************************************************************/
  406. /* glbNewBibListEl:                                                  */
  407. /*    Create new bliography list element                             */
  408. /*********************************************************************/
  409. Errcode
  410. glbNewBibListEl (BibPtr *bp)
  411. {
  412. BibList bl, p;
  413. Errcode status;
  414. X   /* malloc new list entry */
  415. X   if ((bl = (BibList)XtMalloc(sizeof(BibEl))) == NULL) {
  416. X      *bp = NULL;
  417. X      return(ERR_NOMALLOC);
  418. X   }
  419. X
  420. X
  421. X   /* initialize required data */
  422. X   if ((status = dbtGetFreeTreeIdx(&bl->bib.treeIdx)) != OK) {
  423. X
  424. X      free(bl);
  425. X      return(status);
  426. X   }
  427. X   bl->bib.changed = FALSE;
  428. X   bl->bib.filename[0] = '\0';
  429. X   bl->bib.filepath[0] = '\0';
  430. X   bl->bib.tempfile = NULL;
  431. X   bl->bib.macrofile = NULL;
  432. X   bl->bib.bw = NULL;
  433. X   bl->bib.lw = NULL;
  434. X   bl->bib.mw = NULL;
  435. X   bl->bib.cl = NULL;
  436. X   bl->bib.noOfCardWins = 0;
  437. X   bl->bib.nextCardPos = 0;
  438. X
  439. X   /* if list is empty, start new list */
  440. X   if (bibList == NULL) {
  441. X      bl->next = bl->prev = NULL;
  442. X      bibList = bl;
  443. X      *bp = &bl->bib;
  444. X      return(OK);
  445. X   }
  446. X
  447. X   p = bibList;
  448. X   while (p->next != NULL)    /* find last element in list */
  449. X      p = p->next;
  450. X
  451. X   bl->prev = p;        /* append new win to list */
  452. X   bl->next = NULL;
  453. X   p->next = bl;
  454. X
  455. X   *bp = &bl->bib;
  456. X   return(OK);
  457. }
  458. X
  459. X
  460. /*********************************************************************/
  461. /* glbDelBibListEl:                                                  */
  462. /*    Delete bibliography list element                               */
  463. /*********************************************************************/
  464. Errcode
  465. glbDelBibListEl (BibPtr bp)
  466. {
  467. BibList bn;    /* node of card to delete */
  468. X
  469. X   /* check if card is really in list */
  470. X   if ((bn = FindBibListEl(bp)) == NULL)
  471. X      return(ERR_NOBIB);
  472. X   if (bp->tempfile != NULL)
  473. X      {unlink(bp->tempfile);
  474. X       free(bp->tempfile);
  475. X       }
  476. X   if (bp->macrofile != NULL)
  477. X      {unlink(bp->macrofile);
  478. X       free(bp->macrofile);
  479. X       }
  480. X   /* is it root of list? */
  481. X   if (bn == bibList) {
  482. X      bibList->prev = NULL;
  483. X      bibList = bn->next;
  484. X   }
  485. X   else {
  486. X      bn->prev->next = bn->next;
  487. X      if (bn->next != NULL)
  488. X         bn->next->prev = bn->prev;
  489. X   }
  490. X   free(bn); /* all other frees must be done before */
  491. X   return(OK);
  492. }
  493. X
  494. X
  495. /*********************************************************************/
  496. /* glbFirstBibListEl:                                                */
  497. /*    Get element in root of list                                    */
  498. /*********************************************************************/
  499. BibPtr
  500. glbFirstBibListEl (void)
  501. {
  502. X   if (bibList != NULL)
  503. X      return(&bibList->bib);
  504. X   return(NULL);
  505. }
  506. X
  507. X
  508. /*********************************************************************/
  509. /* glbPrevBibListEl:                                                 */
  510. /*    Get element previous to bp in list of bibs                     */
  511. /*********************************************************************/
  512. BibPtr
  513. glbPrevBibListEl (BibPtr bp)
  514. {
  515. BibList bl;
  516. X
  517. X   if ((bl = FindBibListEl(bp)) == NULL)
  518. X      return(NULL);
  519. X   return(&bl->prev->bib);
  520. }
  521. X
  522. X
  523. /*********************************************************************/
  524. /* glbNextBibListEl:                                                 */
  525. /*    Get element after to bp in list of bibs                        */
  526. /*********************************************************************/
  527. BibPtr
  528. glbNextBibListEl (BibPtr bp)
  529. {
  530. BibList bl;
  531. X
  532. X   if ((bl = FindBibListEl(bp)) == NULL)
  533. X      return(NULL);
  534. X   return(&bl->next->bib);
  535. }
  536. X
  537. X
  538. /*********************************************************************/
  539. /* glbLastBibListEl:                                                 */
  540. /*    Get last element in list of bibs                               */
  541. /*********************************************************************/
  542. BibPtr
  543. glbLastBibListEl (void)
  544. {
  545. BibList bl = bibList;
  546. X
  547. X   if (bibList != NULL) {
  548. X      while (bl->next != NULL)
  549. X     bl = bl->next;
  550. X      return(&bl->bib);
  551. X   }
  552. X   else
  553. X      return(NULL);
  554. }
  555. X
  556. X
  557. /*********************************************************************/
  558. /* glbIsBibListEl:                                                   */
  559. /*    Test whether bib is really an element of bib list              */
  560. /*********************************************************************/
  561. Boolean
  562. glbIsBibListEl (BibPtr bp)
  563. {
  564. X   if (FindBibListEl(bp) != NULL)
  565. X      return(TRUE);
  566. X   return(FALSE);
  567. }
  568. X
  569. X
  570. /*********************************************************************/
  571. /* FindBibListEl:                                                    */
  572. /*    Find bib bp in list of bibs                                    */
  573. /*********************************************************************/
  574. static BibList
  575. FindBibListEl (BibPtr bp)
  576. {
  577. BibList p;
  578. X
  579. X   p = bibList;
  580. X   while (p != NULL) {
  581. X      if (&p->bib == bp)
  582. X     return(p);
  583. X      p = p->next;
  584. X   }
  585. X   return(NULL);
  586. }
  587. X
  588. X
  589. /*********************************************************************/
  590. /* glbNewCardListEl:                                                 */
  591. /*    Create new bibliography card list element                      */
  592. /*********************************************************************/
  593. Errcode
  594. glbNewCardListEl (BibPtr bp, CardPtr *cp, CardDataPtr cd)
  595. {
  596. CardList cl, p;
  597. Errcode status;
  598. X
  599. X   /* malloc new list entry */
  600. X   if ((cl = (CardList)malloc(sizeof(CardEl))) == NULL) {
  601. X      *cp = NULL;
  602. X      return(ERR_NOMALLOC);
  603. X   }
  604. X
  605. X   /* initialize required data */
  606. X   cl->card.bp = bp;
  607. X   cl->card.cd = NULL;
  608. X   if ((status = CopyCard(&cl->card.cd, cd)) != DBT_OK) {
  609. X      free(cl);
  610. X      return(status);
  611. X   }
  612. X   cl->card.cw = NULL;
  613. X   cl->card.changed = FALSE;
  614. X   cl->card.extended = FALSE;
  615. X
  616. X   /* if list is empty, start new list */
  617. X   if (bp->cl == NULL) {
  618. X      cl->next = cl->prev = NULL;
  619. X      bp->cl = cl;
  620. X      *cp = &cl->card;
  621. X      return(OK);
  622. X   }
  623. X
  624. X   p = bp->cl;
  625. X   while (p->next != NULL)    /* find last element in list */
  626. X      p = p->next;
  627. X
  628. X   cl->prev = p;        /* append new win to list */
  629. X   cl->next = NULL;
  630. X   p->next = cl;
  631. X
  632. X   *cp = &cl->card;
  633. X   return(OK);
  634. }
  635. X
  636. X
  637. /*********************************************************************/
  638. /* glbDelCardListEl:                                                 */
  639. /*    Delete bibliography card list element                          */
  640. /*********************************************************************/
  641. Errcode
  642. glbDelCardListEl (BibPtr bp, CardPtr cp)
  643. {
  644. CardList cn;    /* node of card to delete */
  645. X
  646. X   /* check if card is really in list */
  647. X   if ((cn = FindCardListEl(bp, cp)) == NULL)
  648. X      return(ERR_NOCARD);
  649. X
  650. X   /* is it root of list? */
  651. X   if (cn == bp->cl) {
  652. X      bp->cl->prev = NULL;
  653. X      bp->cl = cn->next;
  654. X   }
  655. X   else {
  656. X      cn->prev->next = cn->next;
  657. X      if (cn->next != NULL)
  658. X         cn->next->prev = cn->prev;
  659. X   }
  660. X   free(cn); /* all other frees must be done before */
  661. X   return(OK);
  662. }
  663. X
  664. X
  665. /*********************************************************************/
  666. /* glbFirstCardListEl:                                               */
  667. /*    Get element in root of list                                    */
  668. /*********************************************************************/
  669. CardPtr
  670. glbFirstCardListEl (BibPtr bp)
  671. {
  672. X   if (bp->cl != NULL)
  673. X      return(&bp->cl->card);
  674. X   return(NULL);
  675. }
  676. X
  677. X
  678. /*********************************************************************/
  679. /* glbPrevCardListEl:                                                */
  680. /*    Get element previous to cp in list of cards                    */
  681. /*********************************************************************/
  682. CardPtr
  683. glbPrevCardListEl (BibPtr bp, CardPtr cp)
  684. {
  685. CardList cl;
  686. X
  687. X   if ((cl = FindCardListEl(bp, cp)) == NULL)
  688. X      return(NULL);
  689. X   return(&cl->prev->card);
  690. }
  691. X
  692. X
  693. /*********************************************************************/
  694. /* glbNextCardListEl:                                                */
  695. /*    Get element after to cp in list of cards                       */
  696. /*********************************************************************/
  697. CardPtr
  698. glbNextCardListEl (BibPtr bp, CardPtr cp)
  699. {
  700. CardList cl;
  701. X
  702. X   if ((cl = FindCardListEl(bp, cp)) == NULL)
  703. X      return(NULL);
  704. X   return(&cl->next->card);
  705. }
  706. X
  707. X
  708. /*********************************************************************/
  709. /* glbLastCardListEl:                                                */
  710. /*    Get last element in list of cards                              */
  711. /*********************************************************************/
  712. CardPtr
  713. glbLastCardListEl (BibPtr bp)
  714. {
  715. CardList cl = bp->cl;
  716. X
  717. X   if (cl != NULL) {
  718. X      while (cl->next != NULL)
  719. X     cl = cl->next;
  720. X      return(&cl->card);
  721. X   }
  722. X   else
  723. X      return(NULL);
  724. }
  725. X
  726. X
  727. /*********************************************************************/
  728. /* glbIsCardListEl:                                                  */
  729. /*    Test whether card is really an element of card list            */
  730. /*********************************************************************/
  731. Boolean
  732. glbIsCardListEl (BibPtr bp, CardPtr cp)
  733. {
  734. X   if (FindCardListEl(bp, cp) != NULL)
  735. X      return(TRUE);
  736. X   return(FALSE);
  737. }
  738. X
  739. X
  740. /*********************************************************************/
  741. /* glbFindCard:                                                      */
  742. /*    Search for card in list of opened card windows                 */
  743. /*********************************************************************/
  744. CardPtr
  745. glbFindCard (BibPtr bp, CardDataPtr cd)
  746. {
  747. CardPtr cp = NULL;
  748. X
  749. X   if ((cp = glbFirstCardListEl(bp)) == NULL)
  750. X      return(NULL);
  751. X
  752. X   while (cp != NULL) {
  753. X      if (strcmp(cd->mainkey, cp->cd->mainkey) == 0)
  754. X     return(cp);
  755. X      cp = glbNextCardListEl(bp, cp);
  756. X   }
  757. X   return(NULL);
  758. }
  759. X
  760. X
  761. /*********************************************************************/
  762. /* FindCardListEl:                                                   */
  763. /*    Find card cp in list of cards of bp                            */
  764. /*********************************************************************/
  765. static CardList
  766. FindCardListEl (BibPtr bp, CardPtr cp)
  767. {
  768. CardList p;
  769. X
  770. X   p = bp->cl;
  771. X   while (p != NULL) {
  772. X      if (&p->card == cp)
  773. X     return(p);
  774. X      p = p->next;
  775. X   }
  776. X   return(NULL);
  777. }
  778. X
  779. X
  780. X
  781. X
  782. SHAR_EOF
  783. chmod 0644 globdata.c ||
  784. echo 'restore of globdata.c failed'
  785. Wc_c="`wc -c < 'globdata.c'`"
  786. test 15414 -eq "$Wc_c" ||
  787.     echo 'globdata.c: original size 15414, current size' "$Wc_c"
  788. rm -f _shar_wnt_.tmp
  789. fi
  790. # ============= gui_bibl.c ==============
  791. if test -f 'gui_bibl.c' -a X"$1" != X"-c"; then
  792.     echo 'x - skipping gui_bibl.c (File already exists)'
  793.     rm -f _shar_wnt_.tmp
  794. else
  795. > _shar_wnt_.tmp
  796. echo 'x - extracting gui_bibl.c (Text)'
  797. sed 's/^X//' << 'SHAR_EOF' > 'gui_bibl.c' &&
  798. /*********************************************************************/
  799. /*  bibView: Administration of bibTex-Databases                      */
  800. /*           (Verwaltung von bibTeX-Literaturdatenbanken)            */
  801. /*                                                                   */
  802. /*  Module:  gui_bibl.c                                              */
  803. /*                                                                   */
  804. /*             GUI: Bibliography Window                              */
  805. /*             - Menu functions New                                  */
  806. /*                                                                   */
  807. /*  Author:  Holger Martin,  martinh@informatik.tu-muenchen.de       */
  808. /*           Peter M. Urban, urban@informatik.tu-muenchen.de         */
  809. /*                                                                   */
  810. /*  History:                                                         */
  811. /*    12.05.91  PMU  created                                         */
  812. /*    05.26.92       Version 1.0 released                            */
  813. /*                                                                   */
  814. /*  Copyright 1992 TU MUENCHEN                                       */
  815. /*    See ./Copyright for complete rights and liability information. */
  816. /*                                                                   */
  817. /*********************************************************************/
  818. X
  819. #include <stdio.h>
  820. #include <X11/Intrinsic.h>
  821. #include <X11/Shell.h>
  822. #include <X11/StringDefs.h>
  823. #include <X11/Xaw/Form.h>
  824. #include <X11/Xaw/Paned.h>
  825. #include <X11/Xaw/Box.h>
  826. #include <X11/Xaw/Command.h>
  827. #include <X11/Xaw/MenuButton.h>
  828. #include <X11/Xaw/SimpleMenu.h>
  829. #include <X11/Xaw/SmeBSB.h>
  830. #include <X11/Xaw/SmeLine.h>
  831. #include "bibview.h"
  832. X
  833. X
  834. /* macros and definitions */
  835. /* ---------------------- */
  836. X
  837. /* structure for pulldown menu items */
  838. typedef struct {
  839. X   String name;        /* Xt name (instance) of item */
  840. X   XtCallbackProc cb;    /* associated callback function */
  841. } MenuEntry;
  842. X
  843. X
  844. /* local function prototypes */
  845. /* ------------------------- */
  846. static Errcode calcNextBibWinPos (int n, Position *x, Position *y);
  847. static Errcode calcNextBibIconPos (int curIcon, Position *x, Position *y);
  848. static void createMenu (String menuName, MenuEntry item[], Widget parent, Widget *menu, BibPtr bp);
  849. X
  850. /* external global variables */
  851. /* ------------------------- */
  852. extern Widget topLevel, desktop;
  853. extern Pixmap bvIconPixmap;
  854. X
  855. X
  856. /* exported global variables */
  857. /* ---------------------- */
  858. X
  859. X
  860. /* local global variables */
  861. /* ------------------------- */
  862. X
  863. /* names for pulldown menu entries */
  864. static MenuEntry newEntry[] = {
  865. X   { "line1", NULL },
  866. X   { "item2",  ccdNewCardCmd },
  867. X   { "item3",  ccdNewCardCmd },
  868. X   { "item5",  ccdNewCardCmd },
  869. X   { "item6",  ccdNewCardCmd },
  870. X   { "item1",  ccdNewCardCmd },
  871. X   { "item4",  ccdNewCardCmd },
  872. X   { "item7",  ccdNewCardCmd },
  873. X   { "item12", ccdNewCardCmd },
  874. X   { "item13", ccdNewCardCmd },
  875. X   { "item9",  ccdNewCardCmd },
  876. X   { "item11", ccdNewCardCmd },
  877. X   { "item8",  ccdNewCardCmd },
  878. X   { "item14", ccdNewCardCmd },
  879. X   { "line2",  NULL },
  880. X   { "item10", ccdNewCardCmd },
  881. X   { NULL, NULL }
  882. };
  883. X
  884. static MenuEntry windowEntry[] = {
  885. X   { "line1", NULL },
  886. X   { "item1",  gucCascadeCmd },
  887. X   { NULL, NULL }
  888. };
  889. X
  890. static int noOfBibWins = 0;
  891. static int nextBibPos = 0;
  892. X
  893. X
  894. X
  895. /*********************************************************************/
  896. /* gubOpenBibWin:                                                    */
  897. /*    Creates an instance of a bibliography window                   */
  898. /*********************************************************************/
  899. int
  900. gubOpenBibWin (BibPtr bp)
  901. {
  902. Position x, y;
  903. Dimension dwidth, dheight;
  904. BibWinPtr bw;
  905. BibPtr lastBib;
  906. int status;
  907. X
  908. X   /* allocate memory for new element of window list */
  909. X   if ((bw = (BibWinPtr) malloc(sizeof(BibWin))) == NULL) {
  910. X      /* error-handling is done in control modules */
  911. X      return(ERR_NOMALLOC);
  912. X   }
  913. X
  914. X   /* allocate memory for label of new shell */
  915. X   if ((bw->shellName = 
  916. X      (String) calloc(strlen(PROGNAME)+strlen(bp->filename)+4, 
  917. X              sizeof(char))) == NULL) {
  918. X      return(ERR_NOMALLOC);
  919. X   }
  920. X
  921. X   bp->bw = bw;
  922. X   sprintf(bw->shellName, "%s: %s", PROGNAME, bp->filename);
  923. X
  924. X   /* create popup shell for new file */
  925. X   bw->bibShell = XtVaCreatePopupShell("bibShell",
  926. X          topLevelShellWidgetClass, desktop, 
  927. /*            XtNtransient, TRUE,
  928. X          XtNwindowGroup, XtWindow(topLevel), */
  929. X          XtNtitle, bw->shellName, 
  930. X          XtNiconPixmap, bvIconPixmap,
  931. X          XtNiconName, bp->filename, NULL);
  932. X   bw->bibWin = XtVaCreateManagedWidget("bibWin",
  933. X          panedWidgetClass, bw->bibShell, NULL);
  934. X
  935. X   /* create command buttons */
  936. X   bw->cmdBox = XtVaCreateManagedWidget("commandBox", 
  937. X          boxWidgetClass, bw->bibWin, NULL);
  938. X   bw->new = XtVaCreateManagedWidget("new", 
  939. X           menuButtonWidgetClass, bw->cmdBox, NULL);  
  940. X   bw->search = XtVaCreateManagedWidget("search", 
  941. X              commandWidgetClass, bw->cmdBox, NULL);
  942. X   bw->list = XtVaCreateManagedWidget("list", 
  943. X            commandWidgetClass, bw->cmdBox, NULL);
  944. X   bw->macro = XtVaCreateManagedWidget("macro", 
  945. X            commandWidgetClass, bw->cmdBox, NULL);
  946. X   bw->print = XtVaCreateManagedWidget("print", 
  947. X             commandWidgetClass, bw->cmdBox, NULL);
  948. X   bw->save = XtVaCreateManagedWidget("save", 
  949. X            commandWidgetClass, bw->cmdBox, NULL);
  950. X   bw->close = XtVaCreateManagedWidget("close", 
  951. X             commandWidgetClass, bw->cmdBox, NULL);
  952. X   bw->window = XtVaCreateManagedWidget("window", 
  953. X             menuButtonWidgetClass, bw->cmdBox, NULL); 
  954. X
  955. X   /* make pulldownmenus for command boxes */
  956. X   createMenu("newMenu", newEntry, bw->new, &bw->newMenu, bp);
  957. X   createMenu("windowMenu", windowEntry, bw->window, &bw->windowMenu, bp); 
  958. X
  959. X   XtAddCallback(bw->search, XtNcallback, csrSearchCmd, (XtPointer)bp);
  960. X   XtAddCallback(bw->print, XtNcallback, cprPrintCmd, (XtPointer)bp);
  961. X   XtAddCallback(bw->list, XtNcallback, csrListCmd, (XtPointer)bp);
  962. X   XtAddCallback(bw->macro, XtNcallback, cseMacrosCmd, (XtPointer)bp);
  963. X   XtAddCallback(bw->save, XtNcallback, csaSaveCmd, (XtPointer)bp);
  964. X   XtAddCallback(bw->close, XtNcallback, csaCloseCmd, (XtPointer)bp);
  965. X
  966. X   /* create bibliography window desktop */
  967. X   bw->bibdesk = XtVaCreateManagedWidget("bibdesk",
  968. X                   formWidgetClass, bw->bibWin, NULL); 
  969. X
  970. X   /* Position window near main desktop */
  971. X   noOfBibWins++;
  972. X   calcNextBibWinPos(nextBibPos, &bw->winX, &bw->winY);
  973. X   XtVaSetValues(bw->bibShell,
  974. X         XtNx, bw->winX,
  975. X         XtNy, bw->winY, NULL);
  976. X   nextBibPos++;
  977. X
  978. X   /* if option on, set icon position on desktop */
  979. X   if (cotIconizeOnDesktop()) {
  980. X      calcNextBibIconPos(noOfBibWins, &bw->iconX, &bw->iconY);
  981. X      XtVaSetValues(bw->bibShell,
  982. X            XtNiconX, bw->iconX,
  983. X            XtNiconY, bw->iconY, NULL);
  984. X   }
  985. X
  986. X   XtPopup(bw->bibShell, XtGrabNone);
  987. X   return(OK);
  988. }
  989. X
  990. X
  991. /*********************************************************************/
  992. /* gubNoOfOpenBibs:                                                  */
  993. /*    Returns number of opened bibliogarohies                        */
  994. /*********************************************************************/
  995. int
  996. gubNoOfOpenBibs (void)
  997. {
  998. X   return(noOfBibWins);
  999. }
  1000. X
  1001. X
  1002. /*********************************************************************/
  1003. /* gubCloseBibWinCmd:                                                */
  1004. /*    Callback for close bibwin command                              */
  1005. /*********************************************************************/
  1006. void
  1007. gubCloseBibWinCmd (Widget w, XtPointer clientData, XtPointer callData)
  1008. {
  1009. BibPtr bp = (BibPtr)clientData;
  1010. Errcode status;
  1011. X
  1012. X   if ((status = gubCloseBibWin(bp)) != OK) {
  1013. X      guwError(status);
  1014. X   }
  1015. }
  1016. X
  1017. X
  1018. /*********************************************************************/
  1019. /* gubCloseBibWin:                                                   */
  1020. /*    Close a bibliography window                                    */
  1021. /*********************************************************************/
  1022. Errcode
  1023. gubCloseBibWin (BibPtr bp)
  1024. {
  1025. CardPtr cp;
  1026. Errcode status;
  1027. X
  1028. X   /* close all opened card windows */
  1029. X   while ((cp = glbFirstCardListEl(bp)) != NULL) {
  1030. X      if ((status = gucCloseCardWin(cp)) != OK) {
  1031. X         guwError(status);
  1032. X      }
  1033. X   }
  1034. X
  1035. X   /* close possibly opened list window */
  1036. X   if (bp->lw != NULL) {
  1037. X      if ((status = gulCloseListWin(bp)) != OK) {
  1038. X         guwError(status);
  1039. X      }
  1040. X   }
  1041. X
  1042. X   /* close possibly opened macro window */
  1043. X   if (bp->mw != NULL) {
  1044. X      if ((status = gueCloseMacroWin(bp)) != OK) {
  1045. X         guwError(status);
  1046. X      }
  1047. X   }
  1048. X
  1049. X   /* close this bibliography window */
  1050. X   XtPopdown(bp->bw->bibShell); 
  1051. X   noOfBibWins--;
  1052. X   if (glbLastBibListEl() == bp)
  1053. X      nextBibPos -= 1;
  1054. X   free(bp->bw->shellName);
  1055. X   free(bp->bw);
  1056. X   glbDelBibListEl(bp);
  1057. X   if (glbFirstBibListEl() == NULL)
  1058. X      nextBibPos = 0;
  1059. X
  1060. X   return(OK);
  1061. }
  1062. X
  1063. X
  1064. /*********************************************************************/
  1065. /* gubCascadeCmd:                                                    */
  1066. /*    Callback for Cascade-Function                                  */
  1067. /*********************************************************************/
  1068. void
  1069. gubCascadeCmd (Widget w, XtPointer clientData, XtPointer callData)
  1070. {
  1071. Errcode status;
  1072. X
  1073. X   if ((status = gubCascade()) != OK) {
  1074. X      guwWarning(status);
  1075. X   }
  1076. }
  1077. X
  1078. X
  1079. /*********************************************************************/
  1080. /* gubCascade:                                                       */
  1081. /*    Layout the bibliography windows                                */
  1082. /*********************************************************************/
  1083. Errcode
  1084. gubCascade (void)
  1085. {
  1086. X   gubSetWindowCoords(FALSE);
  1087. X   if (cotIconizeOnDesktop())
  1088. X      gubSetIconCoords(FALSE);
  1089. X   return(OK);
  1090. }
  1091. X
  1092. X
  1093. /*********************************************************************/
  1094. /* gubSetWindowCoords:                                               */
  1095. /*    Set positions of bibliography windows                          */
  1096. /*********************************************************************/
  1097. Errcode
  1098. gubSetWindowCoords (Boolean calcOnly)
  1099. {
  1100. BibPtr bp, last_bp;
  1101. Errcode status;
  1102. int i;
  1103. X   if ((bp = glbFirstBibListEl()) == NULL)
  1104. X      return(OK);
  1105. X   for (i = 0; i < noOfBibWins; i++) {
  1106. X      calcNextBibWinPos(i, &bp->bw->winX, &bp->bw->winY);
  1107. X      if (!calcOnly) {
  1108. X         XtVaSetValues(bp->bw->bibShell,
  1109. X                       XtNx, bp->bw->winX,
  1110. X               XtNy, bp->bw->winY, NULL);
  1111. X     if (XtIsRealized(bp->bw->bibShell)) {
  1112. X            XRaiseWindow(XtDisplay(bp->bw->bibShell),
  1113. X                 XtWindow(bp->bw->bibShell));
  1114. X     }
  1115. X      }
  1116. X      bp = glbNextBibListEl(bp);
  1117. X   } /* endfor */
  1118. X
  1119. X   bp = glbFirstBibListEl();
  1120. X   for (i = 0; i < noOfBibWins; i++) {
  1121. X      if ((status = gucCascade(bp)) != OK)
  1122. X         guwWarning(status);
  1123. X      if ((status = gueCascade(bp)) != OK)
  1124. X         guwWarning(status);
  1125. X      if ((status = gulCascade(bp)) != OK)
  1126. X         guwWarning(status);
  1127. X      bp = glbNextBibListEl(bp);
  1128. X   } /* endfor */
  1129. X
  1130. X   return(OK);
  1131. }
  1132. X
  1133. X
  1134. /*********************************************************************/
  1135. /* gubSetIconCoords:                                                 */
  1136. /*    Set positions of bibliography windows icons                    */
  1137. /*********************************************************************/
  1138. Errcode
  1139. gubSetIconCoords (Boolean calcOnly)
  1140. {
  1141. BibPtr bp;
  1142. int curIcon = 0;
  1143. X   if ((bp = glbFirstBibListEl()) != NULL) {
  1144. X      calcNextBibIconPos(curIcon, &bp->bw->iconX, &bp->bw->iconY);
  1145. X      if (!calcOnly) {
  1146. X         XtVaSetValues(bp->bw->bibShell,
  1147. X               XtNiconX, bp->bw->iconX,
  1148. X               XtNiconY, bp->bw->iconY, NULL);
  1149. X      }
  1150. X
  1151. X      while ((bp = glbNextBibListEl(bp)) != NULL) {
  1152. X         curIcon++;
  1153. X         calcNextBibIconPos(curIcon, &bp->bw->iconX, &bp->bw->iconY);
  1154. X         if (!calcOnly) {
  1155. X            XtVaSetValues(bp->bw->bibShell,
  1156. X                  XtNiconX, bp->bw->iconX,
  1157. X                  XtNiconY, bp->bw->iconY, NULL);
  1158. X         }
  1159. X      }  /* endwhile */
  1160. X   } /* endif */
  1161. X
  1162. X   return(OK);
  1163. }
  1164. X
  1165. X
  1166. /*********************************************************************/
  1167. /* gubUnsetIconCoords:                                               */
  1168. /*    Set positions of bibliography windows icons                    */
  1169. /*********************************************************************/
  1170. Errcode
  1171. gubUnsetIconCoords (Boolean calcOnly)
  1172. {
  1173. BibPtr bp;
  1174. X   if ((bp = glbFirstBibListEl()) != NULL) {
  1175. X      bp->bw->iconX = bp->bw->iconY = -1;
  1176. X      if (!calcOnly) {
  1177. X         XtVaSetValues(bp->bw->bibShell,
  1178. X               XtNiconX, bp->bw->iconX,
  1179. X               XtNiconY, bp->bw->iconY, NULL);
  1180. X      }
  1181. X
  1182. X      while ((bp = glbNextBibListEl(bp)) != NULL) {
  1183. X         bp->bw->iconX = bp->bw->iconY = -1;
  1184. X         if (!calcOnly) {
  1185. X            XtVaSetValues(bp->bw->bibShell,
  1186. X                  XtNiconX, bp->bw->iconX,
  1187. X                  XtNiconY, bp->bw->iconY, NULL);
  1188. X         }
  1189. X      }  /* endwhile */
  1190. X   } /* endif */
  1191. X
  1192. X   return(OK);
  1193. }
  1194. X
  1195. X
  1196. /*********************************************************************/
  1197. /* gubSetSensitive:                                                  */
  1198. /*    Set the sensitivity state of one or all bibl windows           */
  1199. /*********************************************************************/
  1200. void
  1201. gubSetSensitive (BibPtr bib, Boolean sensitive)
  1202. {
  1203. CardPtr card;
  1204. X
  1205. X   if (bib == NULL) { /* set all bib windows and subs to sensitive? */
  1206. X      bib = glbFirstBibListEl();
  1207. X      while (bib != NULL) {
  1208. X     if (bib->bw != NULL) {
  1209. X        XtSetSensitive(bib->bw->bibWin, sensitive);
  1210. X        if (bib->lw != NULL) /* handle list window */
  1211. X           XtSetSensitive(bib->lw->lstWin, sensitive);
  1212. X        card = glbFirstCardListEl(bib); /* handle all cards */
  1213. X        while (card != NULL) {
  1214. X           if (card->cw != NULL)
  1215. X          XtSetSensitive(card->cw->cardWin, sensitive);
  1216. X           card = glbNextCardListEl(bib, card);
  1217. X        }
  1218. X     }
  1219. X     bib = glbNextBibListEl(bib);
  1220. X      }
  1221. X   }
  1222. X   else { /* set only one bib win and subs to sensitive */
  1223. X      if (glbIsBibListEl(bib) && bib->bw != NULL) {
  1224. X         XtSetSensitive(bib->bw->bibWin, sensitive);
  1225. X     if (bib->lw != NULL) /* handle list window */
  1226. X        XtSetSensitive(bib->lw->lstWin, sensitive);
  1227. X     card = glbFirstCardListEl(bib); /* handle all cards */
  1228. X     while (card != NULL) {
  1229. X        if (card->cw != NULL)
  1230. X           XtSetSensitive(card->cw->cardWin, sensitive);
  1231. X        card = glbNextCardListEl(bib, card);
  1232. X     } /* endwhile */
  1233. X      } /* endif */
  1234. X   } /* endelse */
  1235. }
  1236. X
  1237. X
  1238. /*********************************************************************/
  1239. /* LOCAL FUNCTIONS                                                   */
  1240. /*********************************************************************/
  1241. X
  1242. /*********************************************************************/
  1243. /* calcNextBibWinPos:                                                */
  1244. /*    Calculate coords of next bibliography window                   */
  1245. /*********************************************************************/
  1246. static Errcode
  1247. calcNextBibWinPos (int n, Position *x, Position *y)
  1248. {
  1249. Dimension dwidth, dheight, twidth = BIBWIN_MARGIN;
  1250. BibPtr bp;
  1251. int i;
  1252. X
  1253. X   /* calc width of all previous bibwins */
  1254. X   if ((bp = glbFirstBibListEl()) == NULL)
  1255. X      return(OK);
  1256. X   for (i = 0; i < n; i++) {
  1257. X      XtVaGetValues(bp->bw->bibWin,
  1258. X            XtNwidth, &dwidth, NULL);
  1259. X      twidth += dwidth + BIBWIN_MARGIN;
  1260. X      bp = glbNextBibListEl(bp);
  1261. X   }
  1262. X
  1263. X   XtVaGetValues(desktop,
  1264. X         XtNwidth, &dwidth,
  1265. X         XtNheight, &dheight, NULL);
  1266. X   XtTranslateCoords(desktop,
  1267. X             (Position)twidth,
  1268. X             (Position)dheight - BIBWIN_MARGIN,
  1269. X             x, y);
  1270. X   return(OK);
  1271. }
  1272. X
  1273. X
  1274. /*********************************************************************/
  1275. /* calcNextBibIconPos:                                               */
  1276. /*    Calculate coords of next bibliography window icon              */
  1277. /*********************************************************************/
  1278. static Errcode
  1279. calcNextBibIconPos (int curIcon, Position *x, Position *y)
  1280. {
  1281. Position curX, curY;
  1282. Dimension dwidth, dheight;
  1283. X
  1284. X   if (curIcon == 0) { /* position 1st bibwin */
  1285. X      curX = 1;
  1286. X      curY = BV_ICON_MARGIN;
  1287. X      XtTranslateCoords(desktop,
  1288. X               curX, curY,
  1289. X               x, y);
  1290. X   }
  1291. X   else {  /* position icon after curIcon */
  1292. X      curX = curIcon * (BV_ICON_MARGIN + BV_ICON_WIDTH);
  1293. X      curY = BV_ICON_MARGIN;
  1294. X      XtTranslateCoords(desktop,
  1295. X               curX, curY,
  1296. X               x, y);
  1297. X   }
  1298. }
  1299. X
  1300. X
  1301. /*********************************************************************/
  1302. /* createMenu:                                                       */
  1303. /*    Build pulldown menus in a bibliography window                  */
  1304. /*********************************************************************/
  1305. static void
  1306. createMenu (String menuName, MenuEntry item[], Widget parent, Widget *menu, BibPtr bp)
  1307. {
  1308. static Widget w;
  1309. int i = 0;
  1310. String iname;
  1311. X
  1312. X   *menu = XtVaCreatePopupShell(menuName, 
  1313. X             simpleMenuWidgetClass, parent, NULL);
  1314. X   i = 0;
  1315. X   while ((iname = item[i].name) != NULL) { 
  1316. X      if (strncmp("line", iname, 4) == 0)   /* use a line pane */
  1317. X         w = XtVaCreateManagedWidget(iname,
  1318. X               smeLineObjectClass, *menu, NULL);
  1319. X      else {
  1320. X         w = XtVaCreateManagedWidget(iname, 
  1321. X           smeBSBObjectClass, *menu, NULL);
  1322. X         XtAddCallback(w, XtNcallback, item[i].cb, (XtPointer)bp);
  1323. X      }
  1324. X      i++;
  1325. X   }
  1326. }
  1327. X
  1328. X
  1329. X
  1330. X
  1331. SHAR_EOF
  1332. chmod 0644 gui_bibl.c ||
  1333. echo 'restore of gui_bibl.c failed'
  1334. Wc_c="`wc -c < 'gui_bibl.c'`"
  1335. test 17139 -eq "$Wc_c" ||
  1336.     echo 'gui_bibl.c: original size 17139, current size' "$Wc_c"
  1337. rm -f _shar_wnt_.tmp
  1338. fi
  1339. # ============= gui_card.c ==============
  1340. if test -f 'gui_card.c' -a X"$1" != X"-c"; then
  1341.     echo 'x - skipping gui_card.c (File already exists)'
  1342.     rm -f _shar_wnt_.tmp
  1343. else
  1344. > _shar_wnt_.tmp
  1345. echo 'x - extracting gui_card.c (Text)'
  1346. sed 's/^X//' << 'SHAR_EOF' > 'gui_card.c' &&
  1347. /*********************************************************************/
  1348. /*  bibView: Administration of bibTex-Databases                      */
  1349. /*           (Verwaltung von bibTeX-Literaturdatenbanken)            */
  1350. /*                                                                   */
  1351. /*  Module:  gui_card.c                                              */
  1352. /*                                                                   */
  1353. /*             GUI: Card Windows                                     */
  1354. /*             -                                                     */
  1355. /*                                                                   */
  1356. /*  Author:  Holger Martin,  martinh@informatik.tu-muenchen.de       */
  1357. /*           Peter M. Urban, urban@informatik.tu-muenchen.de         */
  1358. /*                                                                   */
  1359. /*  History:                                                         */
  1360. /*    12.19.91  PMU  created                                         */
  1361. /*    05.26.92       Version 1.0 released                            */
  1362. /*                                                                   */
  1363. /*  Copyright 1992 TU MUENCHEN                                       */
  1364. /*    See ./Copyright for complete rights and liability information. */
  1365. /*                                                                   */
  1366. /*********************************************************************/
  1367. X
  1368. #include <stdio.h>
  1369. #include <X11/Intrinsic.h>
  1370. #include <X11/Shell.h>
  1371. #include <X11/StringDefs.h>
  1372. #include <X11/Xaw/Form.h>
  1373. #include <X11/Xaw/Paned.h>
  1374. #include <X11/Xaw/Box.h>
  1375. #include <X11/Xaw/Command.h>
  1376. #include <X11/Xaw/MenuButton.h>
  1377. #include <X11/Xaw/SimpleMenu.h>
  1378. #include <X11/Xaw/SmeBSB.h>
  1379. #include <X11/Xaw/SmeLine.h>
  1380. #include <X11/Xaw/Text.h>
  1381. #include <X11/Xaw/AsciiText.h>
  1382. #include <X11/Xaw/Viewport.h>
  1383. #include "bibview.h"
  1384. X
  1385. X
  1386. /* macros and definitions */
  1387. /* ---------------------- */
  1388. X
  1389. /* function to create widgets for card window */
  1390. typedef void (*CreateWidgetFuncPtr)(BibPtr bp, CardPtr cp);
  1391. X
  1392. /* function to save data from card window */
  1393. typedef Errcode (*SaveWidgetFuncPtr)(CardPtr cp);
  1394. X
  1395. /* structure for pulldown menu items */
  1396. typedef struct {
  1397. X   String name;        /* Xt name (instance) of item */
  1398. X   XtCallbackProc cb;    /* associated callback function */
  1399. } MenuEntry;
  1400. X
  1401. X
  1402. /* local function prototypes */
  1403. /* ------------------------- */
  1404. static Errcode calcNextCardWinPos (Widget desk, int n, Position *x, Position *y);
  1405. static Errcode calcNextCardIconPos (Widget desk, int curIcon, Position *x, Position *y);
  1406. static void createMenu (String menuName, MenuEntry item[], Widget parent, Widget *menu);
  1407. static void createStdWidgetFlds (BibPtr bp, CardPtr cp);
  1408. static void CreateArticleWidgets (BibPtr bp, CardPtr cp);
  1409. static void CreateBookWidgets (BibPtr bp, CardPtr cp);
  1410. static void CreateBookletWidgets (BibPtr bp, CardPtr cp);
  1411. static void CreateConferenceWidgets (BibPtr bp, CardPtr cp);
  1412. static void CreateInbookWidgets (BibPtr bp, CardPtr cp);
  1413. static void CreateIncollectionWidgets (BibPtr bp, CardPtr cp);
  1414. static void CreateInproceedingsWidgets (BibPtr bp, CardPtr cp);
  1415. static void CreateManualWidgets (BibPtr bp, CardPtr cp);
  1416. static void CreateMasterthesisWidgets (BibPtr bp, CardPtr cp);
  1417. static void CreateMiscWidgets (BibPtr bp, CardPtr cp);
  1418. static void CreatePhdthesisWidgets (BibPtr bp, CardPtr cp);
  1419. static void CreateProceedingsWidgets (BibPtr bp, CardPtr cp);
  1420. static void CreateTechreportWidgets (BibPtr bp, CardPtr cp);
  1421. static void CreateUnpublishedWidgets (BibPtr bp, CardPtr cp);
  1422. static void CreateDummyWidgets (BibPtr bp, CardPtr cp);
  1423. static Errcode saveStdWidgetFlds (CardPtr cp);
  1424. static Errcode SaveArticleWidgets (CardPtr cp);
  1425. static Errcode SaveBookWidgets (CardPtr cp);
  1426. static Errcode SaveBookletWidgets (CardPtr cp);
  1427. static Errcode SaveConferenceWidgets (CardPtr cp);
  1428. static Errcode SaveInbookWidgets (CardPtr cp);
  1429. static Errcode SaveIncollectionWidgets (CardPtr cp);
  1430. static Errcode SaveInproceedingsWidgets (CardPtr cp);
  1431. static Errcode SaveManualWidgets (CardPtr cp);
  1432. static Errcode SaveMasterthesisWidgets (CardPtr cp);
  1433. static Errcode SaveMiscWidgets (CardPtr cp);
  1434. static Errcode SavePhdthesisWidgets (CardPtr cp);
  1435. static Errcode SaveProceedingsWidgets (CardPtr cp);
  1436. static Errcode SaveTechreportWidgets (CardPtr cp);
  1437. static Errcode SaveUnpublishedWidgets (CardPtr cp);
  1438. static Errcode SaveDummyWidgets (CardPtr cp);
  1439. X
  1440. X
  1441. X
  1442. /* external global variables */
  1443. /* ------------------------- */
  1444. extern Widget topLevel, desktop;
  1445. extern Pixmap crdIconPixmap;
  1446. extern UserDefFld userDefFlds[];
  1447. X
  1448. X
  1449. /* exported global variables */
  1450. /* ---------------------- */
  1451. X
  1452. X
  1453. /* local global variables */
  1454. /* ------------------------- */
  1455. X
  1456. /* pointers to strings of widget names for each card type */
  1457. static char *cardWidgetName[] = {
  1458. X   "article",
  1459. X   "book",
  1460. X   "booklet",
  1461. X   "conference",
  1462. X   "inbook",
  1463. X   "incollection",
  1464. X   "inproceedings",
  1465. X   "manual",
  1466. X   "mastersthesis",
  1467. X   "misc",
  1468. X   "phdthesis",
  1469. X   "proceedings",
  1470. X   "techreport",
  1471. X   "unpublished"
  1472. };
  1473. X
  1474. /* pointers to functions for creating widgets in card windows */
  1475. static CreateWidgetFuncPtr createWidgetFunc[] = {
  1476. X   CreateArticleWidgets,
  1477. X   CreateBookWidgets,
  1478. X   CreateBookletWidgets,
  1479. X   CreateConferenceWidgets,
  1480. X   CreateInbookWidgets,
  1481. X   CreateIncollectionWidgets,
  1482. X   CreateInproceedingsWidgets,
  1483. X   CreateManualWidgets,
  1484. X   CreateMasterthesisWidgets,
  1485. X   CreateMiscWidgets,
  1486. X   CreatePhdthesisWidgets,
  1487. X   CreateProceedingsWidgets,
  1488. X   CreateTechreportWidgets,
  1489. X   CreateUnpublishedWidgets
  1490. };
  1491. X
  1492. /* pointers to functions for saving data from widgets */
  1493. static SaveWidgetFuncPtr saveWidgetFunc[] = {
  1494. X   SaveArticleWidgets,
  1495. X   SaveBookWidgets,
  1496. X   SaveBookletWidgets,
  1497. X   SaveConferenceWidgets,
  1498. X   SaveInbookWidgets,
  1499. X   SaveIncollectionWidgets,
  1500. X   SaveInproceedingsWidgets,
  1501. X   SaveManualWidgets,
  1502. X   SaveMasterthesisWidgets,
  1503. X   SaveMiscWidgets,
  1504. X   SavePhdthesisWidgets,
  1505. X   SaveProceedingsWidgets,
  1506. X   SaveTechreportWidgets,
  1507. X   SaveUnpublishedWidgets
  1508. };
  1509. X
  1510. X
  1511. X
  1512. /*********************************************************************/
  1513. /* gucOpenCardWin:                                                   */
  1514. /*    Creates an instance of a bibliography window                   */
  1515. /*********************************************************************/
  1516. Errcode
  1517. gucOpenCardWin (BibPtr bp, CardPtr cp, Boolean isNew)
  1518. {
  1519. CardPtr lastCard;
  1520. CardWinPtr cw;
  1521. int status;
  1522. X
  1523. X   /* allocate memory for new element of window list */
  1524. X   if ((cw = (CardWinPtr) calloc(1, sizeof(CardWin))) == NULL) {
  1525. X      /* error-handling is done in control modules */
  1526. X      return(ERR_NOMALLOC);
  1527. X   }
  1528. X
  1529. X   /* allocate memory for text buffers of card widget */
  1530. X   /* not needed: handled by widget */
  1531. X
  1532. X   /* build label of new shell */
  1533. X   if ((cw->shellName = (String)calloc(strlen(bp->filename) +
  1534. X                                   strlen(glbTypeToName(cp->cd->cardtype))+4,
  1535. X                                   sizeof(char))) == NULL) {
  1536. X      free(cw);
  1537. X      return(ERR_NOMALLOC);
  1538. X   }
  1539. X   sprintf(cw->shellName, "%s: %s", bp->filename, 
  1540. X                    glbTypeToName(cp->cd->cardtype));
  1541. X
  1542. X   /* create popup shell for new file */
  1543. X   cw->cardShell = XtVaCreatePopupShell("cardShell",
  1544. X                     topLevelShellWidgetClass, topLevel,
  1545. X                     XtNtransientFor, bp->bw->bibShell,
  1546. X                     XtNwindowGroup, XtWindow(bp->bw->bibShell), 
  1547. X                     XtNtitle, cw->shellName,
  1548. X                     XtNiconPixmap, crdIconPixmap,
  1549. X                     XtNiconName, cp->cd->key, NULL);
  1550. X
  1551. X   /* create widgets for card */
  1552. X   cw->cardWin = XtVaCreateManagedWidget("cardWin",
  1553. X           panedWidgetClass, cw->cardShell, NULL);
  1554. X   cw->cmdBox = XtVaCreateManagedWidget("commandBox", 
  1555. X          boxWidgetClass, cw->cardWin, NULL);
  1556. X   cw->userDef = XtVaCreateManagedWidget("userDef", 
  1557. X               commandWidgetClass, cw->cmdBox, NULL);
  1558. X   cw->annote = XtVaCreateManagedWidget("annote", 
  1559. X               commandWidgetClass, cw->cmdBox, NULL);
  1560. X   cw->delete = XtVaCreateManagedWidget("delete", 
  1561. X              commandWidgetClass, cw->cmdBox, NULL);
  1562. X   cw->change = XtVaCreateManagedWidget("save", 
  1563. X               commandWidgetClass, cw->cmdBox, NULL);
  1564. X   cw->copy = XtVaCreateManagedWidget("copy", 
  1565. X            commandWidgetClass, cw->cmdBox, NULL);
  1566. X   cw->close = XtVaCreateManagedWidget("quit", 
  1567. X             commandWidgetClass, cw->cmdBox, NULL);
  1568. X
  1569. X   XtAddCallback(cw->close, XtNcallback, ccdCloseCardCmd, (XtPointer)cp);
  1570. X   XtAddCallback(cw->userDef, XtNcallback, ccdUserdataCmd, (XtPointer)cp);
  1571. X   XtAddCallback(cw->delete, XtNcallback, ccdDeleteCardCmd, (XtPointer)cp);
  1572. X   XtAddCallback(cw->annote, XtNcallback, ccdAnnoteCardCmd, (XtPointer)cp);
  1573. X   if (isNew)
  1574. X      XtAddCallback(cw->change, XtNcallback, ccdSaveCardCmd, (XtPointer)cp);
  1575. X   else
  1576. X      XtAddCallback(cw->change, XtNcallback, ccdChangeCardCmd, (XtPointer)cp);
  1577. X   XtAddCallback(cw->copy, XtNcallback, ccdCopyCardCmd, (XtPointer)cp);
  1578. X
  1579. X   /* create card window desktop */
  1580. X   cw->cardDesk = XtVaCreateManagedWidget("carddesk", 
  1581. X                formWidgetClass, cw->cardWin, NULL);
  1582. X   cw->cardFlds = XtVaCreateManagedWidget(cardWidgetName[cp->cd->cardtype], 
  1583. X                formWidgetClass, cw->cardDesk, NULL);
  1584. X
  1585. X   /* set card pointer to new struct, new window created */
  1586. X   cp->cw = cw;
  1587. X   bp->noOfCardWins++;
  1588. X
  1589. X   /* Position window near bibliography desktop */
  1590. X   calcNextCardWinPos(bp->bw->bibdesk, bp->nextCardPos, &cw->winX, &cw->winY);
  1591. X   XtVaSetValues(cw->cardShell,
  1592. X                 XtNx, cw->winX,
  1593. X                 XtNy, cw->winY, NULL);
  1594. X
  1595. X   /* if option on, set icon position on desktop */
  1596. X   if (cotIconizeOnDesktop()) {
  1597. X      calcNextCardIconPos(bp->bw->bibdesk, bp->noOfCardWins, &cw->iconX, &cw->iconY);
  1598. X      XtVaSetValues(cw->cardShell,
  1599. X                    XtNiconX, cw->iconX,
  1600. X                    XtNiconY, cw->iconY, NULL);
  1601. X   }
  1602. X   bp->nextCardPos++;
  1603. X
  1604. X   /* build only widgets for specific card type */
  1605. X   createStdWidgetFlds(bp, cp);
  1606. X   (createWidgetFunc[cp->cd->cardtype])(bp, cp);
  1607. X
  1608. X   XtPopup(cw->cardShell, XtGrabNone);
  1609. X   return(OK);
  1610. }
  1611. X
  1612. X
  1613. /*********************************************************************/
  1614. /* gucStdFldsChanged:                                                */
  1615. /*    Returns true, if user made changes to standard bibTeX fields   */
  1616. /*********************************************************************/
  1617. #define WidgetChanged(w) (XawAsciiSourceChanged(XawTextGetSource(w)))
  1618. Boolean
  1619. gucStdFldsChanged (CardPtr cp)
  1620. {
  1621. CardWidgetsPtr cwp = &cp->cw->ct.cw;    /* ptr to widget ids */
  1622. X
  1623. X   if (cwp->address && WidgetChanged(cwp->address)) 
  1624. X       return(TRUE);
  1625. X   else if (cwp->annote && (cp->cd->annoteChanged==TRUE))
  1626. X      return(TRUE);
  1627. X   else if (cwp->author && WidgetChanged(cwp->author)) 
  1628. X      return(TRUE);
  1629. X   else if (cwp->booktitle && WidgetChanged(cwp->booktitle)) 
  1630. X      return(TRUE);
  1631. X   else if (cwp->chapter && WidgetChanged(cwp->chapter)) 
  1632. X      return(TRUE);
  1633. SHAR_EOF
  1634. true || echo 'restore of gui_card.c failed'
  1635. fi
  1636. echo 'End of  part 14'
  1637. echo 'File gui_card.c is continued in part 15'
  1638. echo 15 > _shar_seq_.tmp
  1639. exit 0
  1640. -- 
  1641. Senior Systems Scientist        mail: dcmartin@msi.com
  1642. Molecular Simulations, Inc.        uucp: uunet!dcmartin
  1643. 796 North Pastoria Avenue        at&t: 408/522-9236
  1644. Sunnyvale, California 94086        fax: 408/732-0831
  1645.