home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 10712 < prev    next >
Internet Message Format  |  1994-06-19  |  69KB

  1. Path: wupost!howland.reston.ans.net!gatech!news-feed-1.peachnet.edu!news.duke.edu!solaris.cc.vt.edu!uunet!tsw!not-for-mail
  2. From: dean%tsw@uunet.UU.NET (Dean Collins)
  3. Newsgroups: alt.sources
  4. Subject: X Problem Tracking System (14/16)
  5. Followup-To: alt.sources.d
  6. Date: 18 Jun 1994 12:23:25 -0700
  7. Organization: Zombie Software
  8. Lines: 2164
  9. Distribution: world
  10. Message-ID: <2tvhjd$2uo@hal.sea.tsw.com>
  11. References: <2tvhif$q4k@hal.sea.tsw.com>
  12. Reply-To: dean@halcyon.com
  13. NNTP-Posting-Host: hal.sea.tsw.com
  14.  
  15. Archive-name: pts/part14
  16. Submitted-by: dean@halcyon.com (Dean Collins)
  17. Version: 1.05
  18.  
  19. #! /bin/sh
  20. # This is a shell archive.  Remove anything before this line, then unpack
  21. # it by saving it into a file and typing "sh file".  To overwrite existing
  22. # files, type "sh file -c".  You can also feed this as standard input via
  23. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  24. # will see the following message at the end:
  25. #        "End of archive 14 (of 16)."
  26. # Contents:  pts-1.05/xpts/misc.c
  27. # Wrapped by dean@hal on Sat Jun 18 12:08:20 1994
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'pts-1.05/xpts/misc.c' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'pts-1.05/xpts/misc.c'\"
  31. else
  32. echo shar: Extracting \"'pts-1.05/xpts/misc.c'\" \(64402 characters\)
  33. sed "s/^X//" >'pts-1.05/xpts/misc.c' <<'END_OF_FILE'
  34. X/*
  35. X * misc.c -- Miscellaneous functions for the X user interface
  36. X *             to the Problem Tracking System (PTS) database.
  37. X * Dean Collins 
  38. X *
  39. X * created:        Wed Aug  5 09:31:11 PDT 1992
  40. X * Version 1.0:        Sat Jan  9 10:44:49 PST 1993
  41. X * Version 1.01:    Wed Mar  7 00:00:00 PST 1993
  42. X * Version 1.03:    Fri Nov 26 16:13:59 PST 1993
  43. X * Version 1.03b:    Sat Feb 12 17:23:17 PST 1994
  44. X * Version 1.04:    Mon Mar  7 18:07:14 PST 1994
  45. X *
  46. X * Modified: Dean Collins Sat Feb 12 17:16:41 1994
  47. X * Modification inspired by Jaap Haalboom (haalboom@prl.philips.nl).
  48. X * Added Xlibint.h include for _XExtension.  Added for all architectures,
  49. X * not just __hppa.
  50. X *
  51. X * Modified: Dean Collins Mon Mar  7 18:03:35 PST 1994
  52. X * Modification inspired by Ove Hansen.
  53. X * Added USESYSDEFERR to ignore my not-so-portable error handler
  54. X * Define this if you're getting compiler errors for the function
  55. X * XPrintDefaultError(). 
  56. X *
  57. X * Modified: Dean Collins Fri May 06 19:47:40 1994
  58. X * Relocated the inclusion of <X11/Xlibint.h> so that it's after
  59. X * <X11/Intrinsic.h>, which was causing grief.
  60. X */
  61. X
  62. X/*
  63. X * Copyright (c) 1992,1993,1994 Dean Collins.
  64. X * Copyright (c) 1992 University of Idaho, Moscow, Idaho.
  65. X * 
  66. X * Permission to use, copy, modify, and distribute this software and its
  67. X * documentation free of charge for any purpose is hereby granted without
  68. X * fee, provided that the above copyright notices appear in all copies and
  69. X * that both those copyright notices and this permission notice appear in
  70. X * supporting documentation, and that neither the name of the University of
  71. X * Idaho nor the name of Dean Collins be used in advertising or publicity
  72. X * pertaining to distribution of the software without specific, written
  73. X * prior permission from both parties.  Neither The University of Idaho
  74. X * nor Dean Collins make any representations about the suitability of
  75. X * this software for any purpose.  It is provided "as is" without express
  76. X * or implied warranty.
  77. X * 
  78. X * THE UNIVERSITY OF IDAHO AND DEAN COLLINS DISCLAIM ALL WARRANTIES WITH
  79. X * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
  80. X * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL THE UNIVERSITY OF IDAHO
  81. X * OR DEAN COLLINS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
  82. X * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  83. X * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
  84. X * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
  85. X * THIS SOFTWARE.
  86. X */
  87. X
  88. X#include <stdlib.h>        /* General C utilities header file */
  89. X#include <stdio.h>        /* Standard input/output utilities hdr. file */
  90. X#include <errno.h>        /* Error utilities header file */
  91. X
  92. X#include <X11/Intrinsic.h>    /* Include standard Toolkit Header file */
  93. X#include <X11/StringDefs.h>    /* Include StringDefs header file */
  94. X#include <X11/Shell.h>        /* Include the Shell header file for popups */
  95. X
  96. X#ifndef NOEXTVAR
  97. X#include <X11/Xlibint.h>    /* Include internal support routines hdr. file*/
  98. X#endif /*NOEXTVAR*/
  99. X
  100. X#include <X11/Xaw/AsciiText.h>    /* Include the ascii Text widget hdr. file */
  101. X#include <X11/Xaw/Box.h>    /* Include the Box widget header file */
  102. X#include <X11/Xaw/Command.h>    /* Include the Command widget header file */
  103. X#include <X11/Xaw/Dialog.h>    /* Include the Dialog widget header file */
  104. X#include <X11/Xaw/Form.h>    /* Include the Form widget header file */
  105. X#include <X11/Xaw/List.h>    /* Include the List widget header file */
  106. X#include <X11/Xaw/Paned.h>    /* Include the Paned widget header file */
  107. X#include <X11/Xaw/Scrollbar.h>    /* Include the Scrollbar widget header file */
  108. X#include <X11/Xaw/Viewport.h>    /* Include the Viewport widget header file */
  109. X
  110. X#include <X11/Xaw/Cardinals.h>    /* Definitions of ZERO, ONE, etc... */
  111. X
  112. X#include <X11/Xmu/Error.h>    /* Error handler functions */
  113. X
  114. X#include "zdbm.h"        /* Zombie Database Manager header file */
  115. X#include "cloud.h"        /* Nebulous Cloud header file */
  116. X#include "clouderror.h"        /* Nebulous Cloud error rtn. header file */
  117. X#include "xpts.h"        /* Xpts header file */
  118. X
  119. X
  120. Xextern bool NoQuit;    /* True if user started PTS in "no-quit" mode, */
  121. X            /* false otherwise. */
  122. X
  123. X      /* The current problem record.  This ideally would
  124. X       * be part of a new widget.  The widget would have the
  125. X       * resources listed in ProblemType.  It would have functions
  126. X       * to display, read and write the problem.
  127. X       * Next version, maybe...
  128. X       */
  129. Xextern problem_record * ProblemRecord ;
  130. X
  131. X      /* The current list of problem summaries.  Similar
  132. X       * comment to that above.
  133. X       */
  134. Xextern String *SummaryItems ;
  135. X
  136. X        /* The problem types tree. */
  137. Xextern ProblemTree *ProbTree ;
  138. X
  139. X        /* Information about the user. */
  140. Xextern UserInfo UserInfoRec ;
  141. X
  142. X        /* The path for the problem types tree. */
  143. Xextern char Path[] ;
  144. X
  145. Xextern char Node[] ;
  146. Xextern char ProblemText[] ;
  147. X
  148. Xextern String *ProblemItems ;
  149. X
  150. X/* The following string will be displayed by the "About PTS" button
  151. X * on the Main Menu: 
  152. X */
  153. Xextern const char PTSInfoText[] ;
  154. X
  155. Xextern Summary *CloudUnSummaries ;
  156. Xextern Summary *CloudSummaries ;
  157. X
  158. Xextern Widget GlobalNewProblemButton ;
  159. Xextern Widget GlobalPreviousButton ;
  160. Xextern Widget GlobalMainMenuWidget ;
  161. X
  162. Xextern int WarningFlag ;
  163. X
  164. X#ifndef NOSIGNALS
  165. Xextern SigType SigRec ;
  166. X#endif
  167. X
  168. X/******************** MODULES *************************************/
  169. X
  170. X/*
  171. X______________________________________________________________________
  172. XChangeList()
  173. X
  174. XFUNCTION DESCRIPTION:
  175. X
  176. X     This function will allow the user to select a sub-type of the current
  177. Xproblem type.  Selecting a sub-type which contains no further sub-types
  178. Xcauses a list of problem summaries for that sub-type to be displayed.
  179. XThere are two ways to call this function.  First, you can specify
  180. Xa complete problem type.  Second, you can specify an incomplete problem
  181. Xtype and indicate the child of that type you have selected.
  182. X______________________________________________________________________
  183. XREVISION HISTORY:
  184. X     Author:  Dean Collins            Date:  2/20/92
  185. X     Version 1.0 finalized: Dean Collins    Date: 1/9/93
  186. X______________________________________________________________________
  187. X*/
  188. X
  189. X
  190. Xvoid
  191. XChangeList(String    type, 
  192. X           int        item,
  193. X           int        flag,
  194. X           XtPointer    client_data)
  195. X
  196. X     /* Interface description:
  197. X         INPUT:
  198. X          type        - The specified problem type to display, OR
  199. X                             the parent of the problem type to display.
  200. X          item        - The index of the selected child of the
  201. X                             specified problem type if flag=INC_TYPE, OR 
  202. X                             NULL otherwise.
  203. X          flag        - Equal to ABS_TYPE if type is the
  204. X                             complete problem type to display, OR
  205. X                             equal to INC_TYPE if type is the parent of
  206. X                             the problem to display and item is the
  207. X                             index of the selected child of this type, OR
  208. X                             equal to PREV_TYPE if item is a child
  209. X                             of the desired problem type path.
  210. X          client_data    - This is an array of pointers to widgets.
  211. X                             It is defined in the following manner:
  212. X
  213. X                                 client_data[0] = list widget
  214. X                                 client_data[1] = dialog widget
  215. X                                 client_data[2] = parent widget
  216. X                                 client_data[3] = quitButton widget
  217. X                                 client_data[4] = previousButton widget
  218. X                                client_data[5] = newProblem widget
  219. X                 client_data[6] = pickProblem popup widget
  220. X
  221. X         OUTPUT:
  222. X          None.
  223. X         RETURN VALUE:
  224. X          None.
  225. X     */
  226. X      
  227. X{
  228. X     /* Internal variables: */
  229. X
  230. X          /* Major */
  231. X   Widget list ;
  232. X   Widget dialog ;
  233. X   Widget parent ;
  234. X   Widget quitButton ;
  235. X   Widget previousButton ;
  236. X   Widget newProblem ;
  237. X   Widget pickProblem ;
  238. X   Widget panes ;
  239. X   XtPointer *ptrlist ;
  240. X   XtPointer *ptrlist2 ;
  241. X
  242. X          /* Minor */
  243. X   Arg args[3] ;
  244. X   int status=0;
  245. X   char OldPath[DBPATHLEN+1] ;
  246. X   Dimension width=0, height=0 ;
  247. X   Dimension pwidth=0, pheight=0 ;
  248. X   Dimension border ;
  249. X   static int insummaries=FALSE ;  /* Whether we're currently in the problem
  250. X                    * summaries list or not. 
  251. X                    */
  252. X     
  253. X
  254. X   /*----------------- Start of ChangeList() routine ------------------*/
  255. X#ifdef DEBUG
  256. X   printf("XPTS(misc.c): Entering ChangeList()\n") ;
  257. X#endif
  258. X
  259. X        /* Make local widgets for each of the items in client_data */
  260. X   ptrlist2 = (XtPointer *)client_data ;
  261. X   list           = (Widget) (ptrlist2[0]) ;
  262. X   dialog       = (Widget) (ptrlist2[1]) ;
  263. X   parent       = (Widget) (ptrlist2[2]) ;
  264. X   quitButton       = (Widget) (ptrlist2[3]) ;
  265. X   previousButton  = (Widget) (ptrlist2[4]) ;
  266. X   newProblem       = (Widget) (ptrlist2[5]) ;
  267. X   pickProblem       = (Widget) (ptrlist2[6]) ;
  268. X
  269. X   panes = XtParent(XtParent(list)) ;
  270. X
  271. X#ifdef STUPIDXSERVER 
  272. X     /* The list widget keeps getting mangled, so lets unmanage it
  273. X      * for the time being.  Once everything is ready, manage it again.
  274. X      * This problem needs to be tracked down.  (XtUnmangleChild() ! :-)
  275. X      */
  276. X   XtUnmanageChild(list) ;
  277. X#endif
  278. X
  279. X
  280. X   AllocProblemItems() ; /* Allocate ProblemItems strings */
  281. X
  282. X#ifdef DEBUG
  283. X   printf("XPTS(misc.c): Calling FormatProblemTypes with Path=%s\n",Path) ;
  284. X#endif
  285. X   /* Attempt to change to the new problem time. */
  286. X/*CLD*/   status = FormatProblemTypes(ProbTree,Path,item,flag,ProblemItems) ;
  287. X
  288. X#ifdef DEBUG
  289. X   printf("XPTS(misc.c): Returned from FormatProblemTypes()...Path=%s\n",Path) ;
  290. X   printf("XPTS(misc.c): FormatProblemTypes status is %d\n", status) ;
  291. X   printf("XPTS(misc.c): ChangeList(): Removing extra ProblemItems strings\n") ;
  292. X#endif
  293. X   FreeItems(ProblemItems, MAXBRANCHES) ;/* Remove unused ProblemItems strings*/
  294. X
  295. X
  296. X
  297. X     /* If the problem type doesn't exist in the problem tree,
  298. X      *   then call ErrorPopup() with an appropriate error message,
  299. X      *   and return.
  300. X      */
  301. X   if (status < 0)      /* Error in problem-type path */
  302. X   {   /* Might be an error, might be a summary selection.
  303. X        * Call ReadProblem to decide.  If it returns NULL there
  304. X        * was an error.
  305. X        * Make a copy of Path, since ReadProblem will probably mess it up.
  306. X        */
  307. X#ifdef DEBUG
  308. X      printf("XPTS(misc.c): FormatProblemTypes() returned an error,\t(OK, if already at a leaf).\n") ;
  309. X#endif
  310. X      strcpy(OldPath, Path) ; /* Save the Path */
  311. X#ifdef DEBUG
  312. X      printf("XPTS(misc.c): Calling ReadProblem() in cloud...\n") ;
  313. X#endif
  314. X/*CLD*/      ProblemRecord=ReadProblem(ProbTree, Path, item, CloudSummaries) ;
  315. X#ifdef DEBUG
  316. X      printf("XPTS(misc.c): Returned from ReadProblem()...ProblemRecord=%p\n",
  317. X             ProblemRecord) ;
  318. X#endif
  319. X
  320. X      if (ProblemRecord == NULL)
  321. X      {  
  322. X#ifdef DEBUG
  323. X         printf("XPTS(misc.c): ReadProblem() returned a NULL\n") ;
  324. X#endif
  325. X         ErrorPopup("error",pickProblem,"Problem nonexistent!\n") ;
  326. X         strcpy(Path, OldPath) ; /* Restore the Path */
  327. X         XtManageChild(list) ;
  328. X         return ;
  329. X      }
  330. X      else
  331. X      {  strcpy(Path, OldPath) ; /* Restore the Path */
  332. X     /* Call ViewProblemActivate() with ANYPROB and item */
  333. X         ptrlist = (XtPointer *) XtCalloc(2, sizeof(XtPointer)) ;
  334. X         ptrlist[0] = (XtPointer) pickProblem ;
  335. X         ptrlist[1] = (XtPointer) ANYPROB ;
  336. X#ifdef DEBUG
  337. X         printf("XPTS(misc.c): Calling ViewProblemActivate()...\n"
  338. X        "\tptrlist=%p,ptrlist[0]=%p,ptrlist[1]=%p,list=%p,Path=%p\n",
  339. X        ptrlist,ptrlist[0],ptrlist[1],list,Path) ;
  340. X#endif
  341. X         ViewProblemActivate(list, (XtPointer)ptrlist, (XtPointer)item) ;
  342. X      }
  343. X
  344. X   } 
  345. X
  346. X
  347. X
  348. X    /**** NOT  A  LEAF ****/
  349. X
  350. X   if (status > 0)    /* Child types exist, returned in ProblemItems */
  351. X   {
  352. X     /* If the problem type specified is NOT a leaf, 
  353. X      *   Generate a printable list of problem types.
  354. X      *   Change the list widget's text.
  355. X      *   Change the list to be two column.
  356. X      *   Get rid of the newProblem button, if present.
  357. X      *   Change the dialog widget's text to be the new problem type.
  358. X      */
  359. X
  360. X      XtSetArg(args[0], XtNdefaultColumns, TWO) ;
  361. X      XtSetValues(list, args, ONE) ; 
  362. X
  363. X      if (insummaries)   /* Halve height & width of popup */
  364. X      {  insummaries=FALSE ;
  365. X         XtUnmanageChild(panes) ;
  366. X         XtSetArg(args[0], XtNwidth, &width) ;
  367. X         XtSetArg(args[1], XtNheight, &height) ;
  368. X         XtGetValues(pickProblem, args, TWO) ;
  369. X#ifdef DEBUG
  370. X         printf("XPTS(misc.c): width=%d, height=%d.  Halving popup size...\n",
  371. X        (int)width, (int)height) ;
  372. X#endif
  373. X     width=width/2 ;  height=height/2 ;
  374. X     XawPanedAllowResize(XtParent(list), True) ;
  375. X         XtSetArg(args[0], XtNwidth, width) ;
  376. X         XtSetArg(args[1], XtNheight, height) ;
  377. X         XtSetValues(pickProblem, args, TWO) ;
  378. X
  379. X        /* Shrink panes */
  380. X         XtSetArg(args[0], XtNborderWidth, &border) ;
  381. X         XtGetValues(panes, args, ONE) ;
  382. X     pwidth  = width  - 2 * border ; 
  383. X     pheight = height - 2 * border ; 
  384. X         XtSetArg(args[0], XtNwidth, pwidth) ;
  385. X         XtSetArg(args[1], XtNheight, pheight) ;
  386. X#ifdef DEBUG
  387. X         printf("XPTS(misc.c): "
  388. X        "Setting -- panewidth=%d, paneheight=%d. (border=%d)\n",
  389. X        (int)pwidth, (int)pheight, (int)border) ;
  390. X#endif
  391. X         XtSetValues(panes, args, TWO) ;
  392. X         XtSetArg(args[0], XtNwidth, &pwidth) ;
  393. X         XtSetArg(args[1], XtNheight, &pheight) ;
  394. X         XtGetValues(panes, args, TWO) ;
  395. X#ifdef DEBUG
  396. X         printf("XPTS(misc.c): Result  -- panewidth=%d, paneheight=%d\n",
  397. X        (int)pwidth, (int)pheight) ;
  398. X         if (pwidth > width || pheight > height)
  399. X            printf("XPTS(misc.c): Paned widget resize failure.  Darn.\n") ;
  400. X#endif
  401. X      }
  402. X
  403. X      XawListChange(list, ProblemItems, ZERO, ZERO, TRUE) ;
  404. X      XtSetSensitive(list, True) ;
  405. X      XtUnmanageChild(newProblem) ;
  406. X   }
  407. X
  408. X
  409. X
  410. X    /**** IS  A  LEAF ****/
  411. X
  412. X   if (status == 0)    /* No child types, only summaries exist */
  413. X   {
  414. X     /* If the problem type specified IS a leaf,
  415. X      *   Read the problem summaries for the problem type
  416. X      *         from the database.
  417. X      *   Change the list widget's text.
  418. X      *   Change the list to be one column only.
  419. X      *   Add the newProblem button to the button box.
  420. X      */
  421. X      if (!insummaries) 
  422. X         XtUnmanageChild(panes) ;
  423. X
  424. X      XtSetArg(args[0], XtNdefaultColumns, ONE) ;
  425. X      XtSetValues(list, args, ONE) ; 
  426. X
  427. X      if (!insummaries)   /* Double the height & width for the summaries list*/
  428. X      {  insummaries=TRUE ;
  429. X         XtSetArg(args[0], XtNwidth, &width) ;
  430. X         XtSetArg(args[1], XtNheight, &height) ;
  431. X         XtGetValues(pickProblem, args, TWO) ;
  432. X#ifdef DEBUG
  433. X         printf("XPTS(misc.c): width=%d, height=%d.  Doubling popup size...\n",
  434. X        (int)width, (int)height) ;
  435. X#endif
  436. X         width=width*2 ;  height=height*2 ;
  437. X     XawPanedAllowResize(XtParent(list), True) ;
  438. X         XtSetArg(args[0], XtNwidth, width) ;
  439. X         XtSetArg(args[1], XtNheight, height) ;
  440. X#ifdef DEBUG
  441. X   printf("ChangeList() pickProblem=%p\n", (XtPointer)pickProblem) ;
  442. X#endif
  443. X         XtSetValues(pickProblem, args, TWO) ;
  444. X
  445. X                /* Stretch panes */
  446. X         XtSetArg(args[0], XtNborderWidth, &border) ;
  447. X         XtGetValues(panes, args, ONE) ;
  448. X         pwidth  = width  - 2 * border ;
  449. X         pheight = height - 2 * border ;
  450. X         XtSetArg(args[0], XtNwidth, pwidth) ;
  451. X         XtSetArg(args[1], XtNheight, pheight) ;
  452. X#ifdef DEBUG
  453. X         printf("XPTS(misc.c): "
  454. X                "Setting -- panewidth=%d, paneheight=%d. (border=%d)\n",
  455. X                (int)pwidth, (int)pheight, (int)border) ;
  456. X#endif
  457. X         XtSetValues(panes, args, TWO) ;
  458. X         XtSetArg(args[0], XtNwidth, &pwidth) ;
  459. X         XtSetArg(args[1], XtNheight, &pheight) ;
  460. X         XtGetValues(panes, args, TWO) ;
  461. X#ifdef DEBUG
  462. X         printf("XPTS(misc.c): Result  -- panewidth=%d, paneheight=%d\n",
  463. X                (int)pwidth, (int)pheight) ;
  464. X         if (pwidth != width-2*border || pheight != height-2*border)
  465. X            printf("XPTS(misc.c): Paned widget resize failure.  Darn.\n") ;
  466. X#endif
  467. X      }
  468. X
  469. X      ReadList(pickProblem, pickProblem) ; /* Fill in the summaries list. */
  470. X      XtManageChild(newProblem) ;
  471. X   }
  472. X   
  473. X
  474. X
  475. X     /* If the problem type is ROOTSTR, the problem tree root, 
  476. X      *   unrealize the previousButton widget and
  477. X      *   realize the quitButton widget.
  478. X      * else
  479. X      *   unrealize the quitButton widget and
  480. X      *   realize the previousButton widget.
  481. X      */
  482. X#ifdef DEBUG
  483. X   printf("XPTS(misc.c): ChangeList(): "
  484. X          "About to compare ROOTSTR (%s) to Path (%s)...\n",
  485. X       ROOTSTR, Path) ;
  486. X#endif
  487. X/*   if (strcmp(ROOTSTR, Path) == 0)*/
  488. X/*CLD*/   if (strcmp(FixPath(Path), "") == 0) /*FixPath because ROOT = ROOT/ */
  489. X   {  XtManageChild(quitButton) ;
  490. X      XtUnmanageChild(previousButton) ;
  491. X   }
  492. X   else
  493. X   {  XtManageChild(previousButton) ;
  494. X      XtUnmanageChild(quitButton) ;
  495. X   }
  496. X
  497. X#ifdef STUPIDXSERVER 
  498. X   XtManageChild(list) ;
  499. X#endif
  500. X
  501. X
  502. X   XtManageChild(panes) ;
  503. X
  504. X#ifdef DEBUG
  505. X   printf("XPTS(misc.c): Leaving ChangeList()\n") ;
  506. X#endif
  507. X
  508. X}  /*--------------------- End of ChangeList() ------------------------*/
  509. X
  510. X
  511. X/*
  512. X______________________________________________________________________
  513. XDoDeleteProblem()
  514. X
  515. XFUNCTION DESCRIPTION:
  516. X     This function is called when the user has indicated that they
  517. Xdo want to delete a problem.
  518. X______________________________________________________________________
  519. XREVISION HISTORY:
  520. X     Author:  Dean Collins            Date:  6/23/92
  521. X     Version 1.0 finalized: Dean Collins    Date: 1/9/93
  522. X______________________________________________________________________
  523. X*/
  524. X
  525. X
  526. X
  527. Xvoid
  528. XDoDeleteProblem(Widget        w,
  529. X        XtPointer    client_data,
  530. X        XtPointer    call_data)
  531. X
  532. X     /* Interface description:
  533. X         INPUT:
  534. X          w           - The widget for which this callback is registered.
  535. X          client_data - Specifies arbitrary client-supplied data
  536. X                        that the widget w should pass back to the
  537. X                        client when the widget executes the client's
  538. X                        callback procedure.  In this callback,
  539. X                        this is the problem viewer popup widget.
  540. X          call_data   - Specifies any callback-specific data the widget w
  541. X                        wants to pass to the client.
  542. X         OUTPUT:
  543. X           None.
  544. X         RETURN VALUE:
  545. X          None.
  546. X     */
  547. X
  548. X{
  549. X     /* Internal variables: */
  550. X          /* Major */
  551. X   Widget warning ;
  552. X   Widget probViewer ;
  553. X   Widget list ;
  554. X          /* Minor */
  555. X   char errorstr[MAXERROR] ;
  556. X
  557. X
  558. X   /*------------- Start of DoDeleteProblem() routine --------------*/
  559. X#ifdef DEBUG
  560. X   printf("XPTS(misc.c): Entering DoDeleteProblem()\n") ;
  561. X#endif
  562. X
  563. X     /* Make sure only sysops are executing this function. */
  564. X   if (!IsSysop(&UserInfoRec))
  565. X   { 
  566. X#ifdef DEBUG
  567. X        fprintf(stderr,
  568. X         "XPTS(DoDeleteProblem()): Illegal access to DoDeleteProblem() "
  569. X     "by non-sysop.\n") ;
  570. X#endif
  571. X     return ;
  572. X   }
  573. X
  574. X     /* Get values for the warning and list widgets. */
  575. X   probViewer = (Widget)client_data ;
  576. X   warning = XtNameToWidget(probViewer, "warning") ;
  577. X   list = XtNameToWidget(XtParent(probViewer), "*list") ;
  578. X
  579. X#ifdef DEBUG
  580. X   printf("XPTS(DoDeleteProblem()): probViewer=%p, parent=%p, warning=%p,\n"
  581. X          "                         list=%p.",
  582. X          probViewer, XtParent(probViewer), warning, list) ;
  583. X#endif
  584. X
  585. X     /* Are there any reopen requests for this problem? 
  586. X      * if so, call SuperWarningPopup().
  587. X      */
  588. X   if (IsReopened(Path, ProblemRecord) > 0)
  589. X   {  sprintf(errorstr,
  590. X             "WARNING: This problem has reopen requests.  Deleteing this\n"
  591. X             "problem will delete the reopen requests as well.  You should\n"
  592. X             "probably accept or deny each reopen request before deleting.\n") ;
  593. X#ifdef DEBUG
  594. X      printf("XPTS(misc.c): Calling SuperWarningPopup!\n") ;
  595. X#endif
  596. X      XtSetSensitive(probViewer, False) ;
  597. X      XFlush(XtDisplay(probViewer)) ;
  598. X      SuperWarningPopup("warning", warning, errorstr) ;
  599. X      XtSetSensitive(probViewer, True) ;
  600. X      if (!WarningFlag) return ;
  601. X#ifdef DEBUG
  602. X      printf("XPTS(misc.c): SuperWarningPopup returned True! Continuing...\n") ;
  603. X#endif
  604. X   }
  605. X
  606. X     /* Delete the problem. */
  607. X/*CLD*/   if (DeleteProblem(ProbTree, Path, ProblemRecord) == (int)NULL)
  608. X   {  /* An error occured */
  609. X      sprintf(errorstr,
  610. X                "Error deleting problem!\n\nPossible error cause:\n%s\n",
  611. X/*CLD*/         CloudStrerror()) ;
  612. X      ErrorPopup("error", warning, errorstr) ;
  613. X      return ;
  614. X   }
  615. X
  616. X        /* Update the list of summaries for the parent popup.
  617. X         * This might be the pickProblem popup or the unsolvedPopup popup.
  618. X         */
  619. X   ReadList(XtParent(probViewer), probViewer) ;
  620. X
  621. X
  622. X     /* Destroy the problem viewer widget.  Realize it's parent,
  623. X      * the problem tree navigation widget.
  624. X      */
  625. X
  626. X#ifdef DEBUG
  627. X   printf("XPTS(DoDeleteProblem()): setting the parent to be sensitive again.\n") ;
  628. X#endif
  629. X   XtSetSensitive(XtParent(probViewer), True) ;
  630. X
  631. X#ifdef DEBUG
  632. X   printf("XPTS(DoDeleteProblem()): Destroying the warning popup '%s'...\n"
  633. X      "                         warning popup window-ID=%d\n",
  634. X          XtName(warning), XtWindow(warning)) ;
  635. X#endif
  636. X/*   XtDestroyWidget(warning) ;Don't do, since destroying probViewer will
  637. X *                             also destroy the warning popup
  638. X */
  639. X
  640. X#ifdef DEBUG
  641. X   printf("XPTS(DoDeleteProblem()): probViewer=%p, parent=%p.\n",
  642. X          probViewer, XtParent(probViewer)) ;
  643. X   printf("XPTS(misc.c): Destroying the problem viewer "
  644. X          "for the deleted problem, '%s'...\n", XtName(probViewer)) ;
  645. X#endif
  646. X   XtDestroyWidget(probViewer) ;
  647. X
  648. X
  649. X#ifdef DEBUG
  650. X   printf("XPTS(misc.c): Leaving DoDeleteProblem()\n") ;
  651. X#endif
  652. X
  653. X}  /*------------ End of DoDeleteProblem() --------------------*/
  654. X
  655. X
  656. X/*
  657. X______________________________________________________________________
  658. XDoMoveProblem1()
  659. X
  660. XFUNCTION DESCRIPTION:
  661. X     This function is called when the user has indicated what problem
  662. Xtype to move the problem to.
  663. X______________________________________________________________________
  664. XREVISION HISTORY:
  665. X     Author:  Dean Collins            Date:  6/23/92
  666. X     Version 1.0 finalized: Dean Collins    Date: 1/9/93
  667. X______________________________________________________________________
  668. X*/
  669. X
  670. X
  671. Xvoid
  672. XDoMoveProblem1(Widget    w,
  673. X              XtPointer  client_data,
  674. X              XtPointer  call_data)
  675. X
  676. X     /* Interface description:
  677. X         INPUT:
  678. X          w           - The widget for which this callback is registered.
  679. X          client_data - Specifies arbitrary client-supplied data
  680. X                        that the widget w should pass back to the
  681. X                        client when the widget executes the client's
  682. X                        callback procedure.  In this callback,
  683. X                        this is the parent widget.
  684. X          call_data   - Specifies any callback-specific data the widget w
  685. X                        wants to pass to the client.
  686. X         OUTPUT:
  687. X           None.
  688. X         RETURN VALUE:
  689. X          None.
  690. X     */
  691. X
  692. X{
  693. X     /* Internal variables: */
  694. X          /* Major */
  695. X          /* Minor */
  696. X          /* NONE */
  697. X
  698. X
  699. X   /*------------------ Start of DoMoveProblem1() routine -------------------*/
  700. X#ifdef DEBUG
  701. X   printf("XPTS(misc.c): Entering DoMoveProblem1()\n") ;
  702. X#endif
  703. X
  704. X     /* Make sure only sysops are executing this function. */
  705. X   if (!IsSysop(&UserInfoRec))
  706. X   { 
  707. X#ifdef DEBUG
  708. X        fprintf(stderr,
  709. X        "XPTS(misc.c): Illegal access to DoMoveProblem1() by non-sysop.\n") ;
  710. X#endif
  711. X     return ;
  712. X   }
  713. X
  714. X     /* Display a warning using WarningPopup(). */
  715. X
  716. X     /* If the user responds to the warning with "continue",
  717. X      * use DoMoveProblem2() to move the problem from one place in
  718. X      * the database to another.
  719. X      */
  720. X/* for now, don't do the warning...cut to the chase. */
  721. XDoMoveProblem2(w, client_data, call_data) ;
  722. X
  723. X#ifdef DEBUG
  724. X   printf("XPTS(misc.c): Leaving DoMoveProblem1()\n") ;
  725. X#endif
  726. X}  /*----------------- End of DoMoveProblem1() -------------------------*/
  727. X
  728. X
  729. X/*
  730. X______________________________________________________________________
  731. XDoMoveProblem2()
  732. X
  733. XFUNCTION DESCRIPTION:
  734. X     This function moves a problem from one type to another.
  735. X______________________________________________________________________
  736. XREVISION HISTORY:
  737. X     Author:  Dean Collins            Date:  6/23/92
  738. X     Version 1.0 finalized: Dean Collins    Date: 1/9/93
  739. X______________________________________________________________________
  740. X*/
  741. X
  742. X
  743. X
  744. Xvoid
  745. XDoMoveProblem2(Widget     w,
  746. X              XtPointer  client_data,
  747. X              XtPointer  call_data)
  748. X
  749. X     /* Interface description:
  750. X         INPUT:
  751. X          w           - The widget for which this callback is registered.
  752. X          client_data - Specifies arbitrary client-supplied data
  753. X                        that the widget w should pass back to the
  754. X                        client when the widget executes the client's
  755. X                        callback procedure.  In this callback,
  756. X                        this is an array of pointers to widgets,
  757. X            defined like this:
  758. X                client_data[0] = move problem popup widget
  759. X                client_data[1] = dialog widget containing
  760. X                                                 new problem type.
  761. X
  762. X          call_data   - Specifies any callback-specific data the widget w
  763. X                        wants to pass to the client.
  764. X         OUTPUT:
  765. X           None.
  766. X         RETURN VALUE:
  767. X          None.
  768. X     */
  769. X
  770. X{
  771. X     /* Internal variables: */
  772. X          /* Major */
  773. X   XtPointer *ptrlist ;
  774. X   XtPointer *ptrlist2 ;
  775. X   Widget parent ;
  776. X   Widget probViewer ;
  777. X
  778. X          /* Minor */
  779. X   String newtype ;
  780. X   Arg args[5] ;
  781. X   char errorstr[MAXERROR] ;
  782. X
  783. X
  784. X   /*--------------- Start of DoMoveProblem2() routine ----------------*/
  785. X#ifdef DEBUG
  786. X   printf("XPTS(misc.c): Entering DoMoveProblem2()\n") ;
  787. X#endif
  788. X
  789. X     /* Make sure only sysops are executing this function. */
  790. X   if (!IsSysop(&UserInfoRec))
  791. X   { 
  792. X#ifdef DEBUG
  793. X        fprintf(stderr,
  794. X        "XPTS(misc.c): Illegal access to DoMoveProblem2() by non-sysop.\n") ;
  795. X#endif
  796. X     return ;
  797. X   }
  798. X
  799. X   if (ProblemRecord == NULL)
  800. X   {
  801. X#ifdef DEBUG
  802. X      printf("XPTS(select.c): ProblemRecord is null !!!  Returning.\n");
  803. X#endif
  804. X      return ;
  805. X   }
  806. X
  807. X
  808. X   ptrlist = (XtPointer *)client_data ;
  809. X   newtype = XawDialogGetValueString((Widget)(ptrlist[1])) ;
  810. X   parent = (Widget) (ptrlist[0]) ;
  811. X   probViewer = XtParent(parent) ;
  812. X
  813. X#ifdef DEBUG
  814. X      printf("XPTS(misc.c): DoMoveProblem2():  Moving problem to type %s\n", newtype) ;
  815. X#endif
  816. X
  817. X     /* Use MoveProblem to move the problem from one place in
  818. X      * the database to another.
  819. X      */
  820. X/*CLD*/   if (MoveProblem(ProbTree, Path, ProblemRecord, newtype) == (int)NULL)
  821. X   {
  822. X     /* If an error occurs, use ErrorPopup() to show a message
  823. X      * and quit.
  824. X      */
  825. X      sprintf(errorstr, "Error moving problem!\n\nPossible error cause:\n%s\n",
  826. X/*CLD*/         CloudStrerror()) ;
  827. X      ErrorPopup("error", parent, errorstr) ;
  828. X      return ;
  829. X   }
  830. X
  831. X     /* Update the screen.  */
  832. X
  833. X     /* Change problem viewer "Problem Type" dialog box
  834. X      * to reflect the new problem type.
  835. X      */
  836. X
  837. X     /* Get rid of the "move problem" popup.  */
  838. X   ptrlist2 = (XtPointer *) XtCalloc(2, sizeof(XtPointer)) ;
  839. X   ptrlist2[0] = ptrlist[0] ;
  840. X   ptrlist2[1] = NULL ;
  841. X   DestroyPopup(w, (XtPointer)ptrlist2, (XtPointer)NULL) ;
  842. X
  843. X
  844. X     /* Update the list of summaries for the parent popup.
  845. X      * This might be the pickProblem popup or the unsolvedPopup popup.
  846. X      */
  847. X   ReadList(XtParent(probViewer), probViewer) ;
  848. X
  849. X     /* Destroy the problem viewer widget.  Realize it's parent,
  850. X      * the problem tree navigation widget.
  851. X      */
  852. X
  853. X#ifdef DEBUG
  854. X   printf("XPTS(DoMoveProblem()): setting the parent to be sensitive again.\n"
  855. X) ;
  856. X#endif
  857. X   XtSetSensitive(XtParent(probViewer), True) ;
  858. X
  859. X#ifdef DEBUG
  860. X   printf("XPTS(misc.c): Destroying the problem viewer "
  861. X          "for the moved problem, '%s'...\n", XtName(probViewer)) ;
  862. X#endif
  863. X   XtDestroyWidget(probViewer) ;
  864. X
  865. X
  866. X#ifdef DEBUG
  867. X   printf("XPTS(misc.c): Leaving DoMoveProblem2()\n") ;
  868. X#endif
  869. X}  /*--------------------- End of DoMoveProblem2() -------------------*/
  870. X
  871. X
  872. X/*
  873. X______________________________________________________________________
  874. XGotoProblemType()
  875. X
  876. XFUNCTION DESCRIPTION:
  877. X
  878. X     This function will change the list widget so that it represents the
  879. Xspecified problem type.  (This function is not implemented.)
  880. X______________________________________________________________________
  881. XREVISION HISTORY:
  882. X     Author:  Dean Collins            Date:  2/25/92
  883. X______________________________________________________________________
  884. X*/
  885. X
  886. X
  887. Xvoid
  888. XGotoProblemType(Widget          w,
  889. X                XtPointer       client_data,
  890. X                XtPointer       call_data)
  891. X
  892. X     /* Interface description:
  893. X         INPUT:
  894. X          w              - The widget for which this callback is registered.
  895. X          client_data    - Specifies arbitrary client-supplied data
  896. X                           that the widget w should pass back to the
  897. X                           client when the widget executes the client's
  898. X                           callback procedure.  In this callback, 
  899. X                           this is information to be passed to
  900. X                           ChangeList().
  901. X          call_data      - Specifies any callback-specific data the widget w
  902. X                           wants to pass to the client.  In this callback,
  903. X                           this is a pointer to a record containing
  904. X                           information about the list selection.
  905. X         OUTPUT:
  906. X          None.
  907. X         RETURN VALUE:
  908. X          None.
  909. X     */
  910. X      
  911. X{
  912. X     /* Internal variables: */
  913. X          /* Major */
  914. X          /* NONE */
  915. X          /* Minor */
  916. X          /* NONE */
  917. X
  918. X
  919. X
  920. X   /*----------------- Start of GotoProblemType() routine ------------------*/
  921. X#ifdef DEBUG
  922. X   printf("XPTS(misc.c): Entering gotoProblemType()\n") ;
  923. X#endif
  924. X
  925. X     /* Convert what the user has entered into the dialog box
  926. X      * into a problem type string.
  927. X      *   Ideally, this would:
  928. X      *   1. convert to lower-case.
  929. X      *   2. interpret ".." as super-type.
  930. X      *   3. ignore ".".
  931. X      *   4. interpret problem-type paths not beginning with "/"
  932. X      *         to be relative to current problem path.
  933. X      *   5. (what else?)
  934. X      *    For this version, only 1 & 4 are to be implemented.
  935. X      */
  936. X
  937. X     /* If the input path begins with "/", send this path 
  938. X      * to ChangeList().
  939. X      */
  940. X
  941. X     /* If the input path doesn't begin with "/", append
  942. X      * it to the current path and send this to ChangeList().
  943. X      */
  944. X
  945. X#ifdef DEBUG
  946. X   printf("XPTS(misc.c): Leaving GotoProblemType()\n") ;
  947. X#endif
  948. X
  949. X}  /*--------------------- End of GotoProblemType() ------------------------*/
  950. X
  951. X
  952. X/*
  953. X______________________________________________________________________
  954. XSyntax()
  955. X
  956. XFUNCTION DESCRIPTION:
  957. X
  958. X     This function prints an error message indicating there was a syntax
  959. Xerror on the command-line and exits the application.
  960. X______________________________________________________________________
  961. XREVISION HISTORY:
  962. X     Author:  Dean Collins            Date:  2/20/92
  963. X     Version 1.0 finalized: Dean Collins    Date: 1/9/93
  964. X______________________________________________________________________
  965. X*/
  966. X
  967. X
  968. Xvoid
  969. XSyntax(XtAppContext   app_con,
  970. X       char           *call)
  971. X
  972. X     /* Interface description:
  973. X         INPUT:
  974. X          app_con    - The application context
  975. X          call       - The name of the program, from the command line
  976. X         OUTPUT:
  977. X          None.
  978. X         RETURN VALUE:
  979. X          None. (exits application with a value of 1.)
  980. X     */
  981. X      
  982. X{
  983. X     /* Internal variables: */
  984. X          /* Major */
  985. X          /* NONE  */      
  986. X          /* Minor */
  987. X          /* NONE  */
  988. X
  989. X   /*---------------------- Start of Syntax() routine -----------------------*/
  990. X#ifdef DEBUG
  991. X   printf("XPTS(misc.c): Entering Syntax()\n") ;
  992. X#endif
  993. X
  994. X     /* Destroy the X application context, which will close any and all
  995. X      * windows using XtDestroyApplicationContext().
  996. X      */
  997. X   XtDestroyApplicationContext(app_con) ;
  998. X
  999. X     /* Print an error message indicating there was a syntax error on 
  1000. X      * the command-line.
  1001. X      */
  1002. X    fprintf(stderr, "Usage: %s [-noquit]\n", call) ;
  1003. X    fprintf(stderr,
  1004. X    "     (Standard X Toolkit options are acceptable, also.)\n") ;
  1005. X
  1006. X     /* exit the application with a non-zero value, indicating 
  1007. X      * there was an error.
  1008. X      */
  1009. X   exit(1) ;
  1010. X
  1011. X}  /*-------------------------- End of Syntax() -----------------------------*/
  1012. X
  1013. X
  1014. X/*
  1015. X______________________________________________________________________
  1016. XNoOp()
  1017. X
  1018. XFUNCTION DESCRIPTION:
  1019. X
  1020. X     This function does nothing, but it does it well.
  1021. X______________________________________________________________________
  1022. XREVISION HISTORY:
  1023. X     Author:  Dean Collins            Date:  10/29/92
  1024. X     Version 1.0 finalized: Dean Collins    Date: 1/9/93
  1025. X______________________________________________________________________
  1026. X*/
  1027. X
  1028. X
  1029. XXtActionProc
  1030. XNoOp(void)
  1031. X
  1032. X     /* Interface description:
  1033. X         INPUT:
  1034. X          None.
  1035. X         OUTPUT:
  1036. X          None.
  1037. X         RETURN VALUE:
  1038. X          None.
  1039. X     */
  1040. X
  1041. X{
  1042. X     /* Internal variables: */
  1043. X          /* Major */
  1044. X      /* NONE  */
  1045. X          /* Minor */
  1046. X      /* NONE  */
  1047. X
  1048. X   /*----------------- Start of NoOp() routine ------------------*/
  1049. X
  1050. X#ifdef DEBUG
  1051. X   printf ("NoOp() called\n") ;
  1052. X#endif
  1053. X
  1054. X   return;
  1055. X
  1056. X}  /*--------------------- End of NoOp() ------------------------*/
  1057. X
  1058. X
  1059. X/*
  1060. X______________________________________________________________________
  1061. XAllocProblemItems()
  1062. X
  1063. XFUNCTION DESCRIPTION:
  1064. X
  1065. X     This function allocates Strings for the ProblemItems array.
  1066. X______________________________________________________________________
  1067. XREVISION HISTORY:
  1068. X     Author:  Dean Collins            Date:  11/14/92
  1069. X     Version 1.0 finalized: Dean Collins    Date:  1/9/93
  1070. X______________________________________________________________________
  1071. X*/
  1072. X
  1073. X
  1074. Xvoid
  1075. XAllocProblemItems(void)
  1076. X
  1077. X     /* Interface description:
  1078. X         INPUT:
  1079. X          None.
  1080. X         OUTPUT:
  1081. X          None.
  1082. X         RETURN VALUE:
  1083. X          None.
  1084. X     */
  1085. X
  1086. X{
  1087. X     /* Internal variables: */
  1088. X          /* Major */
  1089. X          /* NONE  */
  1090. X          /* Minor */
  1091. X   int i ;
  1092. X
  1093. X   /*-------------- Start of AllocProblemItems() routine ---------------*/
  1094. X
  1095. X#ifdef DEBUG
  1096. X   printf("XPTS(misc.c): AllocProblemItems(): Allocating ProblemItems strings.\n") ;
  1097. X#endif
  1098. X
  1099. X   if (ProblemItems == NULL)
  1100. X   {  /* Allocate the needed number of strings for ProblemItems */
  1101. X      ProblemItems = (String *)XtCalloc(MAXBRANCHES, sizeof(String)) ;
  1102. X      for (i=0; i<MAXBRANCHES; ++i)
  1103. X      {  ProblemItems[i]=(String)XtMalloc(DBPATHLEN) ;
  1104. X         ProblemItems[i][0]='\0' ;
  1105. X      }
  1106. X   }
  1107. X   else for (i=0; i<MAXBRANCHES; ++i)  /* Allocate any needed strings */
  1108. X   {  if (ProblemItems[i] == NULL)
  1109. X         ProblemItems[i]=(String)XtMalloc(DBPATHLEN) ;
  1110. X      ProblemItems[i][0]='\0' ;
  1111. X   }
  1112. X
  1113. X#ifdef DEBUG
  1114. X   printf("XPTS(popup.c): AllocProblemItems(): Done allocating ProblemItems strings.\n") ;
  1115. X#endif
  1116. X} /*-------------- End of AllocProblemItems() routine ---------------*/
  1117. X
  1118. X
  1119. X/*
  1120. X______________________________________________________________________
  1121. XFreeItems()
  1122. X
  1123. XFUNCTION DESCRIPTION:
  1124. X
  1125. X     This function Frees items from an array of Strings that are
  1126. Xempty.
  1127. X______________________________________________________________________
  1128. XREVISION HISTORY:
  1129. X     Author:  Dean Collins            Date:  11/14/92
  1130. X     Version 1.0 finalized: Dean Collins    Date:  1/9/93
  1131. X______________________________________________________________________
  1132. X*/
  1133. X
  1134. X
  1135. Xvoid
  1136. XFreeItems(char **Items, int MaxItems)
  1137. X
  1138. X     /* Interface description:
  1139. X         INPUT:
  1140. X          Items        - Array of strings to free.
  1141. X      MaxItems    - Maximum number of strings to free.
  1142. X         OUTPUT:
  1143. X          None.
  1144. X         RETURN VALUE:
  1145. X          None.
  1146. X     */
  1147. X
  1148. X{
  1149. X     /* Internal variables: */
  1150. X          /* Major */
  1151. X          /* NONE  */
  1152. X          /* Minor */
  1153. X   int i ;
  1154. X
  1155. X   /*----------------- Start of FreeItems() routine ------------------*/
  1156. X
  1157. X#ifdef DEBUG
  1158. X   printf("XPTS(misc.c): FreeItems(): Removing extra Items strings with XtFree().\n") ;
  1159. X#endif
  1160. X
  1161. X   /* Remove extra Items strings with XtFree().*/
  1162. X   if (Items != NULL)
  1163. X      for (i=0; i<MaxItems; ++i)
  1164. X      {  if (Items[i] != NULL)
  1165. X            if (Items[i][0] == '\0')
  1166. X            {  XtFree(Items[i]) ;
  1167. X               Items[i]=NULL ;
  1168. X            }
  1169. X      }
  1170. X
  1171. X#ifdef DEBUG
  1172. X   printf("XPTS(misc.c): FreeItems(): Done removing extra Items strings with XtFree().\n") ;
  1173. X
  1174. X   for (i=0; Items[i] != NULL; ++i)
  1175. X   { printf("XPTS(misc.c): Items[%d]=%p\n",i, Items[i]) ;
  1176. X      printf("XPTS(misc.c): Items[%d]='%s'\n", i, Items[i]) ;
  1177. X   }
  1178. X   printf("XPTS(misc.c): Items[%d] is NULL\n", i) ;
  1179. X
  1180. X#endif
  1181. X
  1182. X}  /*--------------------- End of FreeItems() ------------------------*/
  1183. X
  1184. X
  1185. X/*
  1186. X______________________________________________________________________
  1187. XAppMainLoop()
  1188. X
  1189. XFUNCTION DESCRIPTION:
  1190. X
  1191. X     This function is the X application main loop, and is patterned
  1192. Xafter XtAppMainLoop().  It is used to aid debugging efforts, since
  1193. Xit's difficult do some (debugging) things once you call XtAppMainLoop().
  1194. X______________________________________________________________________
  1195. XREVISION HISTORY:
  1196. X     Author:  Dean Collins            Date:  11/16/92
  1197. X     Version 1.0 finalized: Dean Collins    Date:  1/9/93
  1198. X______________________________________________________________________
  1199. X*/
  1200. X
  1201. X
  1202. Xvoid
  1203. XAppMainLoop(XtAppContext app_con)
  1204. X
  1205. X     /* Interface description:
  1206. X         INPUT:
  1207. X          app_con    - The application context structure.
  1208. X         OUTPUT:
  1209. X          None.
  1210. X         RETURN VALUE:
  1211. X          None.
  1212. X     */
  1213. X
  1214. X{
  1215. X     /* Internal variables: */
  1216. X          /* Major */
  1217. X   XEvent event ;
  1218. X   Arg args[5] ;
  1219. X
  1220. X          /* Minor */
  1221. X   String tmpstr ;
  1222. X   int lasttype=0 ; 
  1223. X
  1224. X
  1225. X   /*----------------- Start of AppMainLoop() routine ------------------*/
  1226. X
  1227. X   forever()
  1228. X   {  
  1229. X      XtAppNextEvent(app_con, &event) ;
  1230. X
  1231. X/* This spews like crazy. */
  1232. X/*
  1233. X#ifdef DEBUG
  1234. X      if (lasttype != event.type)
  1235. X      {  lasttype=event.type ;
  1236. X         printf("XPTS(AppMainLoop()) -- Event: <%d> ", event.type) ;
  1237. X         printf("\n") ;
  1238. X      }
  1239. X#endif
  1240. X*/
  1241. X
  1242. X#ifndef NOSIGNALS
  1243. X      if (SigRec.count) DoSignal(SigRec.signal) ;/* Deal with pending signals*/
  1244. X#endif
  1245. X
  1246. X      XtDispatchEvent(&event) ;
  1247. X
  1248. X#ifndef NOSIGNALS
  1249. X      if (SigRec.count) DoSignal(SigRec.signal) ;/* Deal with pending signals*/
  1250. X#endif
  1251. X   }
  1252. X}  /*--------------------- End of AppMainLoop() ------------------------*/
  1253. X
  1254. X
  1255. X/*
  1256. X______________________________________________________________________
  1257. XPrintNewProblemLabel()
  1258. X
  1259. XFUNCTION DESCRIPTION:
  1260. X
  1261. X    This function is used for debugging.  It prints the label
  1262. Xassociated with the "New Problem" button, if defined.
  1263. X______________________________________________________________________
  1264. XREVISION HISTORY:
  1265. X     Author:  Dean Collins            Date:  11/20/92
  1266. X     Version 1.0 finalized: Dean Collins    Date:  1/9/93
  1267. X______________________________________________________________________
  1268. X*/
  1269. X
  1270. X
  1271. Xvoid
  1272. XPrintNewProblemLabel(void)
  1273. X
  1274. X     /* Interface description:
  1275. X         INPUT:
  1276. X          None.
  1277. X         OUTPUT:
  1278. X          None.
  1279. X         RETURN VALUE:
  1280. X          None.
  1281. X     */
  1282. X
  1283. X{
  1284. X     /* Internal variables: */
  1285. X          /* Major */
  1286. X   String tmpstr ;
  1287. X   Arg args[5] ;
  1288. X
  1289. X          /* Minor */
  1290. X   int i ;
  1291. X
  1292. X
  1293. X   /*------------ Start of PrintNewProblemLabel() routine -------------*/
  1294. X
  1295. X   if (GlobalNewProblemButton != NULL)
  1296. X     if (XtIsWidget(GlobalNewProblemButton))
  1297. X      {  XtSetArg(args[0], XtNlabel, &tmpstr) ;
  1298. X         XtGetValues(GlobalNewProblemButton, args, ONE) ;
  1299. X         printf("-- label = `%s' ", tmpstr) ;
  1300. X      }
  1301. X
  1302. X}  /*---------------- End of PrintNewProblemLabel() -------------------*/
  1303. X
  1304. X
  1305. X/*
  1306. X______________________________________________________________________
  1307. XLockedProblem()
  1308. X
  1309. XFUNCTION DESCRIPTION:
  1310. X
  1311. X        This function will set or reset the flag indicating that there
  1312. Xis a locked problem, or query the current state of the flag.
  1313. X______________________________________________________________________
  1314. XREVISION HISTORY:
  1315. X     Author:  Dean Collins            Date:  11/21/92
  1316. X     Version 1.0 finalized: Dean Collins    Date:  1/9/93
  1317. X______________________________________________________________________
  1318. X*/
  1319. X
  1320. X
  1321. Xint
  1322. XLockedProblem(int newflag)
  1323. X     /* Interface description:
  1324. X         INPUT:
  1325. X      newflag    - The new value of the flag, TRUE or FALSE, or
  1326. X              QUERY, to just return the current flag.
  1327. X         OUTPUT:
  1328. X          None.
  1329. X         RETURN VALUE:
  1330. X          int        - True if the flag is true, false if it is false.
  1331. X     */
  1332. X
  1333. X{
  1334. X     /* Internal variables: */
  1335. X          /* Major */
  1336. X   static int flag=FALSE;
  1337. X          /* Minor */
  1338. X   int tmpflag ;
  1339. X
  1340. X   /*----------------- Start of LockedProblem() routine ------------------*/
  1341. X#  ifdef DEBUG
  1342. X   printf("XPTS(misc.c): LockedProblem() -- flag = %d; newflag = %d\n", flag, newflag) ;
  1343. X#  endif /*DEBUG*/
  1344. X
  1345. X   if (newflag == QUERY) return(flag) ;
  1346. X
  1347. X   tmpflag=flag ;
  1348. X   flag=newflag ;
  1349. X   return(tmpflag) ;
  1350. X
  1351. X}  /*--------------------- End of LockedProblem() ------------------------*/
  1352. X
  1353. X
  1354. X/*
  1355. X______________________________________________________________________
  1356. XPTS_XIOErrorHandler()
  1357. X
  1358. XFUNCTION DESCRIPTION:
  1359. X
  1360. X        This function handles fatal IO errors for X.
  1361. X______________________________________________________________________
  1362. XREVISION HISTORY:
  1363. X     Author:  X Library authors            Date:  1989
  1364. X
  1365. X     Revised:  Dean Collins            Date:  11/28/92
  1366. X    Added call to ShutDownDB().
  1367. X    Changed to modern ANSI function declaration.
  1368. X
  1369. X     Version 1.0 finalized:  Dean Collins    Date:  1/9/93
  1370. X______________________________________________________________________
  1371. X*/
  1372. X
  1373. X
  1374. Xint
  1375. XPTS_XIOErrorHandler(Display *display)
  1376. X
  1377. X     /* Interface description:
  1378. X         INPUT:
  1379. X          display    - The X display pointer.
  1380. X         OUTPUT:
  1381. X          None.
  1382. X         RETURN VALUE:
  1383. X          None.
  1384. X     */
  1385. X
  1386. X{ 
  1387. X     /* Internal variables: */
  1388. X          /* Major */
  1389. X   char msg[80] ;
  1390. X          /* Minor */
  1391. X          /* NONE  */
  1392. X
  1393. X   /*-------------- Start of PTS_XIOErrorHandler() routine ---------------*/
  1394. X
  1395. X#  ifdef DEBUG
  1396. X   fprintf(stderr, "XPTS(misc.c): Entering PTS_XIOErrorHandler()...\n") ;
  1397. X#endif
  1398. X
  1399. X   fprintf(stderr, "Fatal IO error detected!\n"
  1400. X      "XPTS is unlocking any locked problems and exiting immediatly...\n") ;
  1401. X   
  1402. X
  1403. X     /* Unlock any locked problems... */
  1404. X
  1405. X   ShutDownDB(FALSE) ;
  1406. X
  1407. X
  1408. X     /* Print error message */
  1409. X   fprintf (stderr, "XIO:  fatal IO error %d (%s) on X server \"%s\"\r\n",
  1410. X           errno, strerror(errno), DisplayString (display));
  1411. X   fprintf (stderr, "      after %lu requests (%lu known processed) "
  1412. X            "with %d events remaining.\r\n",
  1413. X            NextRequest(display) - 1, LastKnownRequestProcessed(display),
  1414. X        QLength(display));
  1415. X
  1416. X   if (errno == EPIPE)
  1417. X   {
  1418. X      fprintf (stderr, "      The connection was probably broken by a server "
  1419. X                  "shutdown or KillClient.\r\n");
  1420. X   }
  1421. X
  1422. X#  ifdef DEBUG
  1423. X   fprintf(stderr, "XPTS(misc.c): Leaving PTS_XIOErrorHandler().\n") ;
  1424. X#endif
  1425. X
  1426. X   exit (1);
  1427. X
  1428. X}  /*------------------ End of PTS_XIOErrorHandler() ---------------------*/
  1429. X
  1430. X
  1431. X/*
  1432. X______________________________________________________________________
  1433. XPTS_XErrorHandler()
  1434. X
  1435. XFUNCTION DESCRIPTION:
  1436. X
  1437. X        This function handles fatal X errors.
  1438. X______________________________________________________________________
  1439. XUNIT TESTING:
  1440. X     This function will be tested by using a combination of white-box and
  1441. Xblack-box tests.
  1442. X______________________________________________________________________
  1443. XREVISION HISTORY:
  1444. X     Author:  X Library authors            Date:  1989
  1445. X
  1446. X     Revised:  Dean Collins            Date:  11/28/92
  1447. X        Added call to ShutDownDB().
  1448. X    Changed to modern ANSI function declaration.
  1449. X     Revised:  Dean Collins            Date:  3/7/94
  1450. X    Added USESYSDEFERR.  See comment for XPrintDefaultError().
  1451. X
  1452. X     Version 1.0  finalized:  Dean Collins    Date:  1/9/93
  1453. X     Version 1.04 finalized:  Dean Collins    Date:  3/7/94
  1454. X______________________________________________________________________
  1455. X*/
  1456. X
  1457. X
  1458. Xint
  1459. XPTS_XErrorHandler(Display    *dpy,
  1460. X          XErrorEvent    *event) 
  1461. X
  1462. X     /* Interface description:
  1463. X         INPUT:
  1464. X      dpy        - The X display pointer.
  1465. X      event        - The X error event record.
  1466. X         OUTPUT:
  1467. X          None.
  1468. X         RETURN VALUE:
  1469. X          None.
  1470. X     */
  1471. X
  1472. X{
  1473. X     /* Internal variables: */
  1474. X          /* Major */
  1475. X          /* NONE  */
  1476. X          /* Minor */
  1477. X          /* NONE  */
  1478. X
  1479. X   /*-------------- Start of PTS_XErrorHandler() routine ---------------*/
  1480. X
  1481. X#   ifdef DEBUG
  1482. X    fprintf(stderr, "XPTS(misc.c): Entering PTS_XErrorHandler()...\n") ;
  1483. X#   endif
  1484. X
  1485. X     /* Use XPrintDefaultError() or XmuPrintDefaultErrorMessage() to print
  1486. X      * the error message.
  1487. X      */
  1488. X#ifndef USESYSDEFERR
  1489. X    if (XPrintDefaultError (dpy, event, stderr) == 0) return 0;
  1490. X#else
  1491. X    if (XmuPrintDefaultErrorMessage (dpy, event, stderr) == 0) return 0;
  1492. X#endif /*USESYSDEFERR*/
  1493. X
  1494. X     /* OK, Here's my other change... Call ShutDownDB() before exiting.
  1495. X      * This is the whole reason for having this otherwise duplicate code.
  1496. X      */
  1497. X   fprintf(stderr, "X error detected!\n"
  1498. X      "XPTS is unlocking any locked problems and exiting immediatly...\n") ;
  1499. X
  1500. X    ShutDownDB(FALSE) ;
  1501. X
  1502. X    exit(1);
  1503. X
  1504. X}  /*------------------ End of PTS_XErrorHandler() ---------------------*/
  1505. X
  1506. X
  1507. X/*
  1508. X______________________________________________________________________
  1509. XXPrintDefaultError()
  1510. X
  1511. XFUNCTION DESCRIPTION:
  1512. X
  1513. X        This function prints an error message for a fatal X error.
  1514. X______________________________________________________________________
  1515. XREVISION HISTORY:
  1516. X     Author:  X Library authors        Date:  1989
  1517. X
  1518. X     Revised:  Dean Collins          Date:  11/28/92
  1519. X    Changed function declaration to ANSI syntax.  
  1520. X     Revised:  Dean Collins          Date:  12/6/92
  1521. X    Added BadGC hack to ignore mysterious protocol error.  (yuck.)
  1522. X    (Somebody please figure out what is causing this...)
  1523. X     Revised:  Dean Collins        Date:  3/7/93
  1524. X    Changed from ignoring BadGC to printing a special message.
  1525. X    Please help me track down this problem!
  1526. X     Revised:  Dean Collins        Date:  3/7/94
  1527. X    Added USESYSDEFERR flag for systems where this function
  1528. X    breaks (it uses variables that are not necessarily available
  1529. X    on all systems unless they have "true" X11R4/5 from MIT.)
  1530. X    If they're using a vendor's version it may well break,
  1531. X    so just call the default error handler instead.
  1532. X    No catching of BadGC, however, if this is done.
  1533. X
  1534. X     Version 1.0  finalized:  Dean Collins    Date:  1/9/93
  1535. X     Version 1.01 finalized:  Dean Collins    Date:  3/7/93
  1536. X     Version 1.04 finalized:  Dean Collins    Date:  3/7/94 (a whole year?!)
  1537. X______________________________________________________________________
  1538. X*/
  1539. X
  1540. X
  1541. Xint
  1542. XXPrintDefaultError(Display *dpy,
  1543. X           XErrorEvent *event,
  1544. X           FILE *fp)
  1545. X
  1546. X     /* Interface description:
  1547. X         INPUT:
  1548. X      dpy        - The X display pointer.
  1549. X      event        - The X error event structure.
  1550. X      fp        - The file to print the error message to.
  1551. X         OUTPUT:
  1552. X          None.
  1553. X         RETURN VALUE:
  1554. X          None.
  1555. X     */
  1556. X
  1557. X{
  1558. X     /* Internal variables: */
  1559. X          /* Major */
  1560. X    char buffer[BUFSIZ];
  1561. X    char mesg[BUFSIZ];
  1562. X    char number[32];
  1563. X    char *mtype = "XlibMessage";
  1564. X#ifndef NOEXTVAR
  1565. X    register _XExtension *ext = (_XExtension *)NULL; 
  1566. X#endif
  1567. X
  1568. X          /* Minor */
  1569. X          /* NONE  */
  1570. X
  1571. X
  1572. X   /*-------------- Start of XPrintDefaultError() routine ---------------*/
  1573. X
  1574. X#ifdef USESYSDEFERR
  1575. X    XmuPrintDefaultErrorMessage (dpy, event, fp) ;
  1576. X#else
  1577. X
  1578. X/* Borrowed, verbatum, from R4 Xlib _PrintDefaultError() function. All I 
  1579. X * changed (originally) was the declaration, which is now modern ANSI.
  1580. X * I've added some #ifdefs and a variable initialization.
  1581. X *
  1582. X * _XExtension is private to the library, so this routine may break.
  1583. X * If it does, eliminate all references to _XExtension and the variable 'ext'
  1584. X * by definining NOEXTVAR.
  1585. X */
  1586. X
  1587. X    buffer[0] = '\0'; /* Added DC, 5/6/94*/
  1588. X    XGetErrorText(dpy, event->error_code, buffer, BUFSIZ);
  1589. X    XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
  1590. X    (void) fprintf(fp, "%s:  %s\n  ", mesg, buffer);
  1591. X    XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d",
  1592. X        mesg, BUFSIZ);
  1593. X    (void) fprintf(fp, mesg, event->request_code);
  1594. X    if (event->request_code < 128) {
  1595. X        sprintf(number, "%d", event->request_code);
  1596. X        XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ);
  1597. X    }
  1598. X      else {
  1599. X#ifndef NOEXTVAR
  1600. X        for (ext = dpy->ext_procs;
  1601. X             ext && (ext->codes.major_opcode != event->request_code);
  1602. X             ext = ext->next)
  1603. X          ;
  1604. X        if (ext)
  1605. X            strcpy(buffer, ext->name);
  1606. X        else
  1607. X            buffer[0] = '\0';
  1608. X
  1609. X#endif /*NOEXTVAR*/
  1610. X    }
  1611. X    (void) fprintf(fp, " (%s)\n  ", buffer);
  1612. X    XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
  1613. X        mesg, BUFSIZ);
  1614. X    (void) fprintf(fp, mesg, event->minor_code);
  1615. X#ifndef NOEXTVAR
  1616. X    if (ext) {
  1617. X        sprintf(mesg, "%s.%d", ext->name, event->minor_code);
  1618. X        XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ);
  1619. X        (void) fprintf(fp, " (%s)", buffer);
  1620. X    }
  1621. X#endif
  1622. X    fputs("\n  ", fp);
  1623. X    XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
  1624. X        mesg, BUFSIZ);
  1625. X    (void) fprintf(fp, mesg, event->resourceid);
  1626. X    fputs("\n  ", fp);
  1627. X    XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d",
  1628. X        mesg, BUFSIZ);
  1629. X    (void) fprintf(fp, mesg, event->serial);
  1630. X    fputs("\n  ", fp);
  1631. X    XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
  1632. X        mesg, BUFSIZ);
  1633. X    (void) fprintf(fp, mesg, dpy->request);
  1634. X    fputs("\n", fp);
  1635. X    if (event->error_code == BadImplementation) return 0;
  1636. X
  1637. X    if (event->error_code == BadGC)    /* Does this still happen??? */ 
  1638. X    {    fputs("\nNOTICE: You have uncovered the mysterious BadGC error.\n",fp) ;
  1639. X    fputs("Please send a description of EXACTLY what you were doing\n",fp);
  1640. X    fputs("when this occured to \"dean@halcyon.com\".  Include all\n",fp);
  1641. X    fputs("error information possible.  You assistance in tracking\n",fp) ;
  1642. X    fputs("down this error will be greatly appreciated.\n",fp) ;
  1643. X    }
  1644. X
  1645. X#endif /*USESYSDEFERR*/
  1646. X
  1647. X    return 1;
  1648. X
  1649. X
  1650. X}  /*------------------ End of XPrintDefaultError() ---------------------*/
  1651. X
  1652. X
  1653. X/*
  1654. X______________________________________________________________________
  1655. XReadList()
  1656. X
  1657. XFUNCTION DESCRIPTION:
  1658. X
  1659. X        This function reads a list of summaries and fills in the list
  1660. Xfor the problem selection or the unsolved problems windows.
  1661. X______________________________________________________________________
  1662. XREVISION HISTORY:
  1663. X     Author:  Dean Collins            Date:  11/29/92
  1664. X     Version 1.0 finalized:  Dean Collins    Date:  1/9/93
  1665. X______________________________________________________________________
  1666. X*/
  1667. X
  1668. Xint
  1669. XReadList(Widget popup,
  1670. X         Widget probViewer)
  1671. X
  1672. X     /* Interface description:
  1673. X         INPUT:
  1674. X      popup        - The popup that contains the list to update.
  1675. X      probViewer    - The parent widget of any error message popups.
  1676. X         OUTPUT:
  1677. X          None.
  1678. X         RETURN VALUE:
  1679. X          int        - 0 means success, non-zero means error.
  1680. X     */
  1681. X
  1682. X{
  1683. X     /* Internal variables: */
  1684. X          /* Major */
  1685. X   static String EmptySummariesList[] = { EMPTY_SUMMARIES, NULL } ;
  1686. X   static String EmptyUnsolvedList[]  = { EMPTY_UNSOLVED,  NULL } ;
  1687. X   Widget list=NULL ;
  1688. X   Widget parent=NULL ;
  1689. X   static String *UnsolvedList=NULL ;
  1690. X   char errorstr[MAXERROR] ;
  1691. X   String *NewList=NULL ;
  1692. X   Widget warning=NULL ;
  1693. X
  1694. X          /* Minor */
  1695. X   int i ;
  1696. X   int flag ;
  1697. X   Arg args[5] ;
  1698. X
  1699. X
  1700. X   /*----------------- Start of ReadList() routine ------------------*/
  1701. X
  1702. X     /* Assign local list widget a value */
  1703. X   list = XtNameToWidget(popup, "*list") ;
  1704. X
  1705. X
  1706. X     /* Re-read the problem summaries for the current problem type,
  1707. X      * using ChangeList, giving it the current problem type as
  1708. X      * argument one, and an XtPointer array as argument two,
  1709. X      * where the array contains the list, dialog and parent widgets.
  1710. X      */
  1711. X#ifdef DEBUG
  1712. X   printf("XPTS(misc.c): Updating popup's summary list...\n") ;
  1713. X   printf("XPTS(misc.c): popup's name='%s'\n",
  1714. X          XtName(popup)) ;
  1715. X#endif
  1716. X
  1717. X
  1718. X                /* IS POPUP pickProblem? */
  1719. X   if (strcmp(XtName(popup), "pickProblem") == 0)
  1720. X   {
  1721. X     /**** Popup is pickProblem popup ****/
  1722. X
  1723. X#ifdef DEBUG
  1724. X      
  1725. X      printf("XPTS(misc.c): Calling ReadSummaries()...") ;
  1726. X#endif
  1727. X     /* Have to store the new list in NewList and not directly in
  1728. X      * SummaryItems since the list widget requires that its list resource
  1729. X      * only be changed through XawListChange() or XtSetValues(),
  1730. X      * and it must exist unchanged otherwise.
  1731. X      */
  1732. X/*CLD*/ CloudSummaries = ReadSummaries(ProbTree, Path, &NewList) ;
  1733. X#ifdef DEBUG
  1734. X      printf("XPTS(misc.c): Returned from ReadSummaries()...\n") ;
  1735. X#endif
  1736. X
  1737. X#ifdef DEBUG
  1738. X      if (NewList != NULL)
  1739. X      {  for (i=0; NewList[i] != NULL; ++i)
  1740. X         {  printf("XPTS(misc.c): NewList[%d]=%p\n",i, NewList[i]) ;
  1741. X            printf("XPTS(misc.c): NewList[%d]='%s'\n", i, NewList[i]) ;
  1742. X         }
  1743. X         printf("XPTS(misc.c): NewList[%d] is NULL\n", i) ;
  1744. X      } else printf("XPTS(misc.c): NewList is NULL\n") ;
  1745. X#endif
  1746. X
  1747. X      flag=0 ;
  1748. X      if (NewList == NULL) flag=1 ;
  1749. X      else if ((int) (NewList[0]) == (int)NULL) flag=1 ;
  1750. X
  1751. X      if (flag)
  1752. X      {  /* NO PROBLEMS! */
  1753. X         /* if an empty list was returned, set the value of list to
  1754. X          * be EmptySummariesList.
  1755. X          */
  1756. X
  1757. X#ifdef DEBUG
  1758. X         printf("XPTS(misc.c): Setting list to be EMPTY_SUMMARIES.\n") ;
  1759. X#endif
  1760. X
  1761. X
  1762. X         XawListChange(list, EmptySummariesList, ONE, ZERO, TRUE) ;
  1763. X         XtSetSensitive(list, False) ;
  1764. X      }
  1765. X      else
  1766. X      {
  1767. X         /* if an empty list was not returned, set the value of list to
  1768. X          * be NewList.
  1769. X          */
  1770. X         XawListChange(list, NewList, ZERO, ZERO, TRUE);
  1771. X         XtSetSensitive(list, True) ;
  1772. X      }
  1773. X      if (SummaryItems) FreeList(SummaryItems) ;
  1774. X      SummaryItems=NewList ;
  1775. X   }
  1776. X
  1777. X
  1778. X
  1779. X   else  /**** Popup is unsolvedPopup ****/
  1780. X   {
  1781. X
  1782. X#ifdef DEBUG
  1783. X      printf("XPTS(misc.c): Updating UnsolvedList...\n") ;
  1784. X#endif
  1785. X     /* Set the value of list to be the list of unsolved problem summaries. */
  1786. X
  1787. X     /* Have to store the new list in NewList and not directly in
  1788. X      * SummaryItems since the list widget requires that its list resource
  1789. X      * only be changed through XawListChange() or XtSetValues(),
  1790. X      * and it must exist unchanged otherwise.
  1791. X      */
  1792. X/*CLD*/   CloudUnSummaries = ReadUnsolvedSummaries(ProbTree, &NewList) ;
  1793. X/* <= means error, 0 means none, positive is ptr to linked list. */
  1794. X#ifdef DEBUG
  1795. X      printf("XPTS(misc.c): CloudUnSummaries = %p\n", CloudUnSummaries) ;
  1796. X#endif
  1797. X
  1798. X      if ((int)CloudUnSummaries < 0)
  1799. X      {
  1800. X         sprintf(errorstr, "Error reading problem summaries!\n\n"
  1801. X                "Possible error cause:\n%s\n",
  1802. X/*CLD*/         CloudStrerror()) ;
  1803. X         ErrorPopup("error", probViewer, errorstr) ;
  1804. X         return (-1) ;
  1805. X      }
  1806. X
  1807. X#ifdef DEBUG
  1808. X      if (NewList != NULL)
  1809. X      {  for (i=0; NewList[i] != NULL; ++i)
  1810. X         {  printf("XPTS(misc.c): NewList[%d]=%p\n",i, NewList[i]) ;
  1811. X            printf("XPTS(misc.c): NewList[%d]='%s'\n", i, NewList[i]) ;
  1812. X         }
  1813. X         printf("XPTS(misc.c): NewList[%d] is NULL\n", i) ;
  1814. X      } else printf("XPTS(misc.c): NewList is NULL\n") ;
  1815. X#endif
  1816. X
  1817. X      flag=0 ;
  1818. X      if (NewList == NULL) flag=1 ;
  1819. X      else if ((int) (NewList[0]) == (int)NULL) flag=1 ;
  1820. X
  1821. X      if (flag)
  1822. X      {  /* NO UNSOLVED PROBLEMS!  EXCELLENT! */
  1823. X         /* if an empty list was returned, set the value of list to
  1824. X          * be EmptyUnsolvedList.
  1825. X          */
  1826. X         XawListChange(list, EmptyUnsolvedList, ZERO, ZERO, TRUE) ;
  1827. X         XtSetSensitive(list, False) ;
  1828. X      }
  1829. X      else
  1830. X      {  /* if an empty list was not returned, set the value of list to
  1831. X          * be NewList.
  1832. X          */
  1833. X         XawListChange(list, NewList, ZERO, ZERO, TRUE) ;
  1834. X         XtSetSensitive(list, True) ;
  1835. X      }
  1836. X      if (UnsolvedList) FreeList(UnsolvedList) ;
  1837. X      UnsolvedList=NewList ;
  1838. X
  1839. X   }
  1840. X
  1841. X   return (0) ;
  1842. X
  1843. X}  /*--------------------- End of ReadList() ------------------------*/
  1844. X
  1845. X
  1846. X/*
  1847. X______________________________________________________________________
  1848. XShutDownDB()
  1849. X
  1850. XFUNCTION DESCRIPTION:
  1851. X
  1852. X        This function unlocks any currently locked problems.
  1853. X______________________________________________________________________
  1854. XREVISION HISTORY:
  1855. X     Author:  Dean Collins            Date:  11/21/92
  1856. X     Version 1.0 finalized:  Dean Collins    Date:  1/9/93
  1857. X______________________________________________________________________
  1858. X*/
  1859. X
  1860. X
  1861. Xvoid
  1862. XShutDownDB(int AllowPopups)
  1863. X
  1864. X     /* Interface description:
  1865. X         INPUT:
  1866. X          AllowPopups        - Flag for whether to warn/inform with popups.
  1867. X         OUTPUT:
  1868. X          None.
  1869. X         RETURN VALUE:
  1870. X          None.
  1871. X     */
  1872. X
  1873. X{
  1874. X     /* Internal variables: */
  1875. X          /* Major */
  1876. X          /* NONE  */
  1877. X          /* Minor */
  1878. X          /* NONE  */
  1879. X
  1880. X   /*----------------- Start of ShutDownDB() routine ------------------*/
  1881. X
  1882. X#  ifdef DEBUG
  1883. X   printf("XPTS(misc.c): ShutDownDB() is making sure the database "
  1884. X          "is shut down nicely...\n") ;
  1885. X   printf("XPTS(misc.c): LockedProblem() returns: %d\n",
  1886. X      LockedProblem(QUERY)) ;
  1887. X#  endif
  1888. X
  1889. X
  1890. X   if (LockedProblem(FALSE))
  1891. X   {
  1892. X#     ifdef DEBUG
  1893. X      printf("XPTS(misc.c): Calling UnlockProblem()...\n") ;
  1894. X#     endif
  1895. X        /* Unlock the problem with UnlockProblem() since we're done
  1896. X         * editing it.
  1897. X         */
  1898. X/*CLD*/ if (UnlockProblem(Path, ProblemRecord) == (int)NULL)
  1899. X      {
  1900. X         /* An error occured; call ErrorPopup if allowed */
  1901. X
  1902. X         if (AllowPopups) 
  1903. X         {  char errorstr[MAXERROR] ;
  1904. X            sprintf(errorstr, "Error unlocking problem!\n"
  1905. X                              "\nPossible error cause:\n%s\n",
  1906. X/*CLD*/                       CloudStrerror()) ;
  1907. X            ErrorPopup("error", GlobalMainMenuWidget, errorstr) ;
  1908. X            return ;
  1909. X         }
  1910. X         else fprintf(stderr, "xpts: Error unlocking problem!\n") ;
  1911. X         return ;
  1912. X      }
  1913. X#     ifdef DEBUG
  1914. X      printf("XPTS(misc.c): Returned without an error from UnlockProblem().\n") ;
  1915. X#     endif
  1916. X   }
  1917. X#  ifdef DEBUG
  1918. X   printf("XPTS(misc.c): LockedProblem() was FALSE.\n") ;
  1919. X#  endif
  1920. X
  1921. X}  /*--------------------- End of ShutDownDB() ------------------------*/
  1922. X
  1923. X
  1924. X
  1925. X/*
  1926. X______________________________________________________________________
  1927. XSuperWarningPopup()
  1928. X
  1929. XFUNCTION DESCRIPTION:
  1930. X
  1931. X        This function prompts the user for a True/False selection.
  1932. X______________________________________________________________________
  1933. XREVISION HISTORY:
  1934. X     Author:  Dean Collins            Date:  11/15/92
  1935. X     Version 1.0 finalized:  Dean Collins    Date:  1/9/93
  1936. X______________________________________________________________________
  1937. X*/
  1938. X
  1939. X
  1940. Xint
  1941. XSuperWarningPopup(String     name,
  1942. X                  Widget      parent,
  1943. X                  String      message)
  1944. X
  1945. X     /* Interface description:
  1946. X         INPUT:
  1947. X          name           - The resource name of the popup.
  1948. X          parent         - The parent of the popup widget.
  1949. X          message        - The specific error message to display.
  1950. X         OUTPUT:
  1951. X          None.
  1952. X         RETURN VALUE:
  1953. X          int         - True/False user selection.
  1954. X     */
  1955. X
  1956. X{
  1957. X     /* Internal variables: */
  1958. X          /* Major */
  1959. X   char btnname[80] ;
  1960. X   Widget warningPopup=NULL ;
  1961. X   Widget quitButton=NULL ;
  1962. X   Widget continueButton=NULL ;
  1963. X   XtPointer *ptrlist=NULL ;
  1964. X   XEvent event ;
  1965. X   XtAppContext app_con ;
  1966. X
  1967. X          /* Minor */
  1968. X   int done=0 ;
  1969. X   int ToggledSensitive=FALSE ;
  1970. X
  1971. X   /*-------------- Start of SuperWarningPopup() routine ---------------*/
  1972. X
  1973. X#ifdef DEBUG
  1974. X   printf("XPTS(misc.c): Entering SuperWarningPopup.\n") ;
  1975. X#endif
  1976. X
  1977. X
  1978. X   if (XtIsSensitive(parent) == True)
  1979. X   {  XtSetSensitive(parent,False) ;
  1980. X      ToggledSensitive=TRUE ;
  1981. X#ifdef DEBUG
  1982. X      printf ("XPTS(misc.c): Parent was sensitive.\n") ;
  1983. X#endif
  1984. X   }
  1985. X#ifdef DEBUG
  1986. X   else
  1987. X      printf ("XPTS(misc.c): Parent was insensitive.\n") ;
  1988. X#endif
  1989. X
  1990. X     /* Use an ErrorPopup widget to start with, even though it's not
  1991. X      * REALLY an error.
  1992. X      */
  1993. X   ErrorPopup(name, parent, message) ;
  1994. X
  1995. X    /* Have the quit button also call SuperWarningFalse()  */
  1996. X   sprintf(btnname, "*%s*quitButton", name) ;
  1997. X#ifdef DEBUG
  1998. X   printf("XPTS(signal.c): SuperWarningPopup() converting name '%s' to widget...\n", btnname) ;
  1999. X#endif
  2000. X   quitButton = XtNameToWidget(parent, btnname) ;
  2001. X   XtAddCallback(quitButton, XtNcallback, (XtCallbackProc)SuperWarningFalse,
  2002. X                 parent) ;
  2003. X
  2004. X    /* Have the continue button also call SuperWarningTrue()  */
  2005. X   continueButton = XtCreateManagedWidget("continueButton", commandWidgetClass,
  2006. X                                          XtParent(quitButton), NULL, ZERO) ;
  2007. X   XtAddCallback(continueButton, XtNcallback, (XtCallbackProc)SuperWarningTrue,
  2008. X         parent) ;
  2009. X   
  2010. X   warningPopup = XtNameToWidget(parent, name) ;
  2011. X   ptrlist = (XtPointer *) XtCalloc(2, sizeof(XtPointer)) ;
  2012. X   ptrlist[0] = (XtPointer) warningPopup;
  2013. X   if (ToggledSensitive == TRUE)
  2014. X        ptrlist[1] = (XtPointer) parent ;
  2015. X   else ptrlist[1] = NULL ;
  2016. X#ifdef DEBUG
  2017. X   printf("XPTS(popup.c): ptrlist[1]=%p\n", ptrlist[1]) ;
  2018. X#endif
  2019. X   XtAddCallback(continueButton, XtNcallback, DestroyPopup, (XtPointer)ptrlist);
  2020. X
  2021. X
  2022. X     /* Loop, watching for the DestroyNotify event */
  2023. X   app_con = XtWidgetToApplicationContext(warningPopup) ;
  2024. X   while (!done)
  2025. X   {  XtAppNextEvent(app_con, &event) ;
  2026. X      if (event.type == DestroyNotify)
  2027. X      {
  2028. X#ifdef DEBUG
  2029. X         printf("XPTS(signal.c): Found a 'DestroyNotify' event.\n") ;
  2030. X#endif
  2031. X         done=1 ;
  2032. X      }
  2033. X      XtDispatchEvent(&event) ;
  2034. X   }
  2035. X
  2036. X#ifdef DEBUG
  2037. X   printf("XPTS(signal.c): Leaving SuperWarningPopup.\n") ;
  2038. X#endif
  2039. X
  2040. X   return (WarningFlag) ;
  2041. X
  2042. X}  /*------------------ End of SuperWarningPopup() ---------------------*/
  2043. X
  2044. X
  2045. X/*
  2046. X______________________________________________________________________
  2047. XSuperWarningTrue()
  2048. X
  2049. XFUNCTION DESCRIPTION:
  2050. X
  2051. X        This function is called if the user selects the continue button
  2052. Xfor the warning popup.
  2053. X______________________________________________________________________
  2054. XREVISION HISTORY:
  2055. X     Author:  Dean Collins            Date:  11/15/92
  2056. X     Version 1.0 finalized:  Dean Collins    Date:  1/9/93
  2057. X______________________________________________________________________
  2058. X*/
  2059. X
  2060. X
  2061. Xint
  2062. XSuperWarningTrue(   Widget        w,
  2063. X                 XtPointer        client_data,
  2064. X                 XtPointer        call_data)
  2065. X                           
  2066. X     /* Interface description:
  2067. X         INPUT:
  2068. X          w              - The widget for which this callback is registered.
  2069. X          client_data    - Specifies arbitrary client-supplied data
  2070. X                           that the widget w should pass back to the
  2071. X                           client when the widget executes the client's
  2072. X                           callback procedure.  In this callback,
  2073. X                           this is ignored.
  2074. X          call_data      - Specifies any callback-specific data the widget w
  2075. X                           wants to pass to the client.
  2076. X         OUTPUT:
  2077. X          None.
  2078. X         RETURN VALUE:
  2079. X          None.
  2080. X     */
  2081. X
  2082. X{
  2083. X     /* Internal variables: */
  2084. X          /* Major */
  2085. X          /* NONE  */
  2086. X          /* Minor */
  2087. X          /* NONE  */
  2088. X
  2089. X   /*-------------- Start of SuperWarningTrue() routine ---------------*/
  2090. X
  2091. X#ifdef DEBUG
  2092. X   printf("XPTS(signal.c): Called SuperWarningTrue!!!!!\n") ;
  2093. X#endif
  2094. X   return(WarningFlag=TRUE) ;
  2095. X
  2096. X}  /*------------------ End of SuperWarningTrue() ---------------------*/
  2097. X
  2098. X
  2099. X/*
  2100. X______________________________________________________________________
  2101. XSuperWarningFalse()
  2102. X
  2103. XFUNCTION DESCRIPTION:
  2104. X
  2105. X        This function is called if the user selects the quit button
  2106. Xfor the warning popup.
  2107. X______________________________________________________________________
  2108. XREVISION HISTORY:
  2109. X     Author:  Dean Collins            Date:  11/15/92
  2110. X     Version 1.0 finalized:  Dean Collins    Date:  1/9/93
  2111. X______________________________________________________________________
  2112. X*/
  2113. X
  2114. X
  2115. Xint
  2116. XSuperWarningFalse(   Widget        w,
  2117. X                 XtPointer        client_data,
  2118. X                 XtPointer        call_data)
  2119. X
  2120. X     /* Interface description:
  2121. X         INPUT:
  2122. X          w              - The widget for which this callback is registered.
  2123. X          client_data    - Specifies arbitrary client-supplied data
  2124. X                           that the widget w should pass back to the
  2125. X                           client when the widget executes the client's
  2126. X                           callback procedure.  In this callback,
  2127. X                           this is ignored.
  2128. X          call_data      - Specifies any callback-specific data the widget w
  2129. X                           wants to pass to the client.
  2130. X         OUTPUT:
  2131. X          None.
  2132. X         RETURN VALUE:
  2133. X          None.
  2134. X     */
  2135. X
  2136. X{
  2137. X
  2138. X     /* Internal variables: */
  2139. X          /* Major */
  2140. X          /* NONE  */
  2141. X          /* Minor */
  2142. X          /* NONE  */
  2143. X
  2144. X   /*-------------- Start of SuperWarningFalse() routine ---------------*/
  2145. X
  2146. X#ifdef DEBUG
  2147. X   printf("XPTS(signal.c): Called SuperWarningFalse!!!!!\n") ;
  2148. X#endif
  2149. X   return(WarningFlag=FALSE) ;
  2150. X
  2151. X}  /*------------------ End of SuperWarningFalse() ---------------------*/
  2152. X
  2153. X/* end of misc.c */
  2154. END_OF_FILE
  2155. if test 64402 -ne `wc -c <'pts-1.05/xpts/misc.c'`; then
  2156.     echo shar: \"'pts-1.05/xpts/misc.c'\" unpacked with wrong size!
  2157. fi
  2158. # end of 'pts-1.05/xpts/misc.c'
  2159. fi
  2160. echo shar: End of archive 14 \(of 16\).
  2161. cp /dev/null ark14isdone
  2162. MISSING=""
  2163. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
  2164.     if test ! -f ark${I}isdone ; then
  2165.     MISSING="${MISSING} ${I}"
  2166.     fi
  2167. done
  2168. if test "${MISSING}" = "" ; then
  2169.     echo You have unpacked all 16 archives.
  2170.     echo "\nNow execute the command 'touch pts-1.05/xpts/xpts.help' and \nread the INSTALL document.\n"
  2171.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2172. else
  2173.     echo You still need to unpack the following archives:
  2174.     echo "        " ${MISSING}
  2175. fi
  2176. ##  End of shell archive.
  2177. exit 0
  2178.