home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Graphics / Graphics.zip / xfitsvew.zip / XFITSview / menu_ugc.c < prev    next >
C/C++ Source or Header  |  1997-06-20  |  19KB  |  566 lines

  1. /* menu routines for XFITSview */
  2. /*-----------------------------------------------------------------------
  3. *  Copyright (C) 1996,1997
  4. *  Associated Universities, Inc. Washington DC, USA.
  5. *  This program is free software; you can redistribute it and/or
  6. *  modify it under the terms of the GNU General Public License as
  7. *  published by the Free Software Foundation; either version 2 of
  8. *  the License, or (at your option) any later version.
  9. *
  10. *  This program is distributed in the hope that it will be useful,
  11. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. *  GNU General Public License for more details.
  14. *-----------------------------------------------------------------------*/
  15. #include <Xm/Xm.h> 
  16. #include <Xm/DrawingA.h> 
  17. #include <Xm/MainW.h> 
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <Xm/Separator.h>
  21. #include <Xm/Form.h>
  22. #include <Xm/PushB.h>
  23. #include <Xm/FileSB.h>
  24. #include <Xm/CascadeB.h>
  25. #include <Xm/RowColumn.h>
  26. #include <Xm/Label.h>
  27. #include <Xm/ToggleB.h>
  28. #include "xfitsview.h"
  29. #include "imagedisp.h"
  30. #include "FITS2Pix.h"
  31. #include "infobox.h"
  32. #include "moviebox.h"
  33. #include "blinkbox.h"
  34. #include "optionbox.h"
  35. #include "markpos.h"
  36. #include "lookpos.h"
  37. #include "color.h"
  38. #include "textfile.h"
  39. #include "scrolltext.h"
  40. #include "help.h"
  41. #include "logger.h"
  42. #include "messagebox.h"
  43.  
  44. /* global widget arrays for menu items */
  45. Widget Zoom_w[7] = {0, 0, 0, 0, 0, 0, 0};
  46. Widget File_w[5] = {0, 0, 0, 0,0};
  47.  
  48. /* internal prototypes */
  49. void QuitCB (Widget w, XtPointer clientData, XtPointer callData);
  50. void OpenCB (Widget w, XtPointer clientData, XtPointer callData);
  51. void PreviewCB (Widget w, XtPointer clientData, XtPointer callData);
  52. void FileCancelCB (Widget filebox, XtPointer clientData, XtPointer callData);
  53. void FileOKCB (Widget filebox, XtPointer clientData, XtPointer callData);
  54. void SaveAsCB (Widget w, XtPointer clientData, XtPointer callData);
  55.  
  56. Widget MakeMainMenu (Widget mainWindow, XtPointer image, XtPointer IDdata)
  57. /* routine to create main menu bar */
  58. {
  59.     Widget menu, pulldown, w;
  60.     ImageDisplay *IDDATA = (ImageDisplay*) IDdata;
  61.  
  62. /* add menu items */
  63.     menu = XmCreateMenuBar (mainWindow, "menuBar", NULL, 0);
  64.  
  65. /* "File" */
  66.     pulldown = XmCreatePulldownMenu (menu, "File", IDdata, 0);
  67.     w = XtVaCreateManagedWidget ("File", xmCascadeButtonWidgetClass,
  68.                  menu, XmNsubMenuId, pulldown, 
  69.                  XmNmnemonic, 'F',
  70.                  NULL);
  71.    /* "Open" */
  72.     File_w[0] = XtVaCreateManagedWidget ("Open", xmPushButtonWidgetClass,
  73.                    pulldown,
  74.                    XmNmnemonic, 'O',
  75.                    NULL);
  76.     /*    XtSetArg (File_w[0], XmNmnemonic, 'O');*/
  77.     XtAddCallback (File_w[0], XmNactivateCallback, OpenCB, IDdata);
  78.  
  79.    /* "Preview" */
  80.     File_w[1] = XtVaCreateManagedWidget ("Preview", xmPushButtonWidgetClass,
  81.                    pulldown,
  82.                    XmNmnemonic, 'P',
  83.                    NULL);
  84.     XtAddCallback (File_w[1], XmNactivateCallback, PreviewCB, IDdata);
  85.  
  86.    /* "Save as" */
  87.     File_w[2] = XtVaCreateManagedWidget ("Save As", xmPushButtonWidgetClass,
  88.                    pulldown,
  89.                    XmNmnemonic, 'S',
  90.                    NULL);
  91.     XtAddCallback (File_w[2], XmNactivateCallback, SaveAsCB, IDdata);
  92.  
  93.    /* "Source info" */
  94.     File_w[3] = XtVaCreateManagedWidget ("Source Info", xmPushButtonWidgetClass,
  95.                    pulldown,
  96.                    XmNmnemonic, 'I',
  97.                    NULL);
  98.     XtAddCallback (File_w[3], XmNactivateCallback, InfoBoxCB, IDdata);
  99.    /* "Position logging" */
  100.     File_w[4] = XtVaCreateManagedWidget ("Start Position Logging", 
  101.                    xmPushButtonWidgetClass,
  102.                    pulldown,
  103.                    XmNmnemonic, 'L',
  104.                    NULL);
  105.     XtAddCallback (File_w[4], XmNactivateCallback, LoggerCB, IDdata);
  106.     /* help */
  107.     w = XtVaCreateManagedWidget ("Help", xmPushButtonWidgetClass,
  108.                    pulldown,
  109.                    XmNmnemonic, 'H',
  110.                    NULL);
  111.     XtAddCallback (w, XmNactivateCallback, HelpFileCB, IDdata);
  112.    /* separator */
  113.     w = XtCreateManagedWidget ("sep", xmSeparatorWidgetClass,
  114.                    pulldown, NULL, 0);
  115.    /* "quit" */
  116.     w = XtVaCreateManagedWidget ("Quit", xmPushButtonWidgetClass,
  117.                    pulldown,
  118.                    XmNmnemonic, 'Q',
  119.                    NULL);
  120.     XtAddCallback (w, XmNactivateCallback, QuitCB, IDdata);
  121.  
  122. /* "Options" */
  123.     pulldown = XmCreatePulldownMenu (menu, "options", IDdata, 0);
  124.     w = XtVaCreateManagedWidget ("Options", xmCascadeButtonWidgetClass,
  125.                  menu, XmNsubMenuId, pulldown, 
  126.                  XmNmnemonic, 'O',
  127.                  NULL);
  128.     w = XtVaCreateManagedWidget ("Set Options", xmPushButtonWidgetClass,
  129.                  pulldown, 
  130.                  XmNmnemonic, 'S',
  131.                  NULL);
  132.     XtAddCallback (w, XmNactivateCallback, OptionBoxCB, IDdata);
  133.     w = XtVaCreateManagedWidget ("Help", xmPushButtonWidgetClass,
  134.                  pulldown, 
  135.                  XmNmnemonic, 'H',
  136.                  NULL);
  137.     XtAddCallback (w, XmNactivateCallback, HelpOptionsCB, IDdata);
  138.  
  139. /* "Zoom" */
  140.     pulldown = XmCreatePulldownMenu (menu, "zoom", IDdata, 0); 
  141.     w = XtVaCreateManagedWidget ("Zoom", xmCascadeButtonWidgetClass,
  142.                  menu, XmNsubMenuId, pulldown, 
  143.                  XmNmnemonic, 'Z',
  144.                  NULL);
  145.    /* "Zoom 25%" */
  146.     Zoom_w[0] = XtVaCreateManagedWidget ("25%", xmPushButtonWidgetClass,
  147.                    pulldown, 
  148.                    XmNmnemonic, '%',
  149.                    NULL);
  150.     XtAddCallback (Zoom_w[0], XmNactivateCallback, Zoom25CB, IDdata);
  151.    /* "Zoom 50%" */
  152.     Zoom_w[1] = XtVaCreateManagedWidget ("50%", xmPushButtonWidgetClass,
  153.                    pulldown, 
  154.                    XmNmnemonic, '5',
  155.                    NULL);
  156.     XtAddCallback (Zoom_w[1], XmNactivateCallback, Zoom50CB, IDdata);
  157.    /* "Zoom 100%" */
  158.     Zoom_w[2] = XtVaCreateManagedWidget ("100% <=", xmPushButtonWidgetClass,
  159.                    pulldown, 
  160.                    XmNmnemonic, '1',
  161.                    NULL);
  162.     XtAddCallback (Zoom_w[2], XmNactivateCallback, Zoom100CB, IDdata);
  163.    /* "Zoom 200%" */
  164.     Zoom_w[3] = XtVaCreateManagedWidget ("200%", xmPushButtonWidgetClass,
  165.                    pulldown, 
  166.                    XmNmnemonic, '2',
  167.                    NULL);
  168.     XtAddCallback (Zoom_w[3], XmNactivateCallback, Zoom200CB, IDdata);
  169.    /* "Zoom 400%" */
  170.     Zoom_w[4] = XtVaCreateManagedWidget ("400%", xmPushButtonWidgetClass,
  171.                    pulldown, 
  172.                    XmNmnemonic, '4',
  173.                    NULL);
  174.     XtAddCallback (Zoom_w[4], XmNactivateCallback, Zoom400CB, IDdata);
  175.    /* "Zoom 800%" */
  176.     Zoom_w[5] = XtVaCreateManagedWidget ("800%", xmPushButtonWidgetClass,
  177.                    pulldown, 
  178.                    XmNmnemonic, '8',
  179.                    NULL);
  180.     XtAddCallback (Zoom_w[5], XmNactivateCallback, Zoom800CB, IDdata);
  181.    /* "Zoom 1600%" */
  182.     Zoom_w[6] = XtVaCreateManagedWidget ("1600%", xmPushButtonWidgetClass,
  183.                    pulldown, 
  184.                    XmNmnemonic, '6',
  185.                    NULL);
  186.     XtAddCallback (Zoom_w[6], XmNactivateCallback, Zoom1600CB, IDdata);
  187.     w = XtVaCreateManagedWidget ("Help", xmPushButtonWidgetClass,
  188.                    pulldown, 
  189.                    XmNmnemonic, 'H',
  190.                    NULL);
  191.     XtAddCallback (w, XmNactivateCallback, HelpZoomCB, IDdata);
  192.  
  193. /* "Position" */
  194.     pulldown = XmCreatePulldownMenu (menu, "position", IDdata, 0);
  195.     w = XtVaCreateManagedWidget ("Position", xmCascadeButtonWidgetClass,
  196.                  menu, XmNsubMenuId, pulldown, 
  197.                  XmNmnemonic, 'P',
  198.                  NULL);
  199.    /* "Set Equinox" */
  200.     w = XtVaCreateManagedWidget ("Set Equinox", xmPushButtonWidgetClass,
  201.                  pulldown, 
  202.                  XmNmnemonic, 'S',
  203.                  NULL);
  204.     XtAddCallback (w, XmNactivateCallback, SetEquCB, IDdata);
  205.    /* "Mark Position" */
  206.     w = XtVaCreateManagedWidget ("Mark Position", xmPushButtonWidgetClass,
  207.                  pulldown, 
  208.                  XmNmnemonic, 'M',
  209.                  NULL);
  210.     XtAddCallback (w, XmNactivateCallback, MarkPosCB, IDdata);
  211.    /* "Lookup Position" */
  212.     w = XtVaCreateManagedWidget ("Lookup Position", xmPushButtonWidgetClass,
  213.                  pulldown, 
  214.                  XmNmnemonic, 'L',
  215.                  NULL);
  216.     XtAddCallback (w, XmNactivateCallback, LookPosCB, IDdata);
  217.     /* "Lookup Position" */
  218.      w = XtVaCreateManagedWidget ("Fit Position", xmPushButtonWidgetClass,
  219.                   pulldown, 
  220.                  XmNmnemonic, 'F',
  221.                  NULL);
  222.      XtAddCallback (w, XmNactivateCallback, FitPosCB, IDdata);
  223.     w = XtVaCreateManagedWidget ("Help", xmPushButtonWidgetClass,
  224.                  pulldown, 
  225.                  XmNmnemonic, 'H',
  226.                  NULL);
  227.     XtAddCallback (w, XmNactivateCallback, HelpPositionCB, IDdata);
  228.  
  229. /* "Blink" */
  230.     pulldown = XmCreatePulldownMenu (menu, "blink", IDdata, 0);
  231.     w = XtVaCreateManagedWidget ("Blink", xmCascadeButtonWidgetClass,
  232.                  menu, XmNsubMenuId, pulldown, 
  233.                  XmNmnemonic, 'B',
  234.                  NULL);
  235.     w = XtVaCreateManagedWidget ("Swap Blink and Current", 
  236.                  xmPushButtonWidgetClass,
  237.                  pulldown, 
  238.                  XmNmnemonic, 'S',
  239.                  NULL);
  240.     XtAddCallback (w, XmNactivateCallback, BlinkSwapCB, IDdata);
  241.     w = XtVaCreateManagedWidget ("Blink Images", xmPushButtonWidgetClass,
  242.                  pulldown, 
  243.                  XmNmnemonic, 'B',
  244.                  NULL);
  245.     XtAddCallback (w, XmNactivateCallback, BlinkBlinkCB, IDdata);
  246.     w = XtVaCreateManagedWidget ("Help", xmPushButtonWidgetClass,
  247.                  pulldown, 
  248.                  XmNmnemonic, 'H',
  249.                  NULL);
  250.     XtAddCallback (w, XmNactivateCallback, HelpBlinkCB, IDdata);
  251.  
  252.  
  253. /* "Movie" */
  254.     pulldown = XmCreatePulldownMenu (menu, "movie", IDdata, 0);
  255.     w = XtVaCreateManagedWidget ("Movie", xmCascadeButtonWidgetClass,
  256.                  menu, XmNsubMenuId, pulldown, 
  257.                  XmNmnemonic, 'M',
  258.                  NULL);
  259.     w = XtVaCreateManagedWidget ("Movie control", xmPushButtonWidgetClass,
  260.                  pulldown, 
  261.                  XmNmnemonic, 'M',
  262.                  NULL);
  263.     XtAddCallback (w, XmNactivateCallback, MovieBoxCB, IDdata);
  264.     w = XtVaCreateManagedWidget ("Help", xmPushButtonWidgetClass,
  265.                  pulldown, 
  266.                  XmNmnemonic, 'H',
  267.                  NULL);
  268.     XtAddCallback (w, XmNactivateCallback, HelpMovieCB, IDdata);
  269.  
  270. /* "Colorize" */
  271.     pulldown = XmCreatePulldownMenu (menu, "colorize", IDdata, 0);
  272.     w = XtVaCreateManagedWidget ("Colorize", xmCascadeButtonWidgetClass,
  273.                  menu, XmNsubMenuId, pulldown, 
  274.                  XmNmnemonic, 'C',
  275.                  NULL);
  276.    /* "Color Contour" */
  277.     w = XtVaCreateManagedWidget ("Color Contour", xmPushButtonWidgetClass,
  278.                  pulldown,
  279.                  XmNmnemonic, 'C',
  280.                  NULL);
  281.     XtAddCallback (w, XmNactivateCallback, ColContourCB, IDdata);
  282.  
  283.    /* "Pseudo Flame" */
  284.     w = XtVaCreateManagedWidget ("Pseudo Flame", xmPushButtonWidgetClass,
  285.                  pulldown, 
  286.                  XmNmnemonic, 'P',
  287.                  NULL);
  288.     XtAddCallback (w, XmNactivateCallback, PhlameCB, IDdata);
  289.  
  290.    /* "Grayscale" */
  291.     w = XtVaCreateManagedWidget ("Grayscale", xmPushButtonWidgetClass,
  292.                  pulldown, 
  293.                  XmNmnemonic, 'G',
  294.                  NULL);
  295.     XtAddCallback (w, XmNactivateCallback, GrayscaleCB, IDdata);
  296.  
  297.    /* "Reverse colors" */
  298.     w = XtVaCreateManagedWidget ("Reverse colors", xmPushButtonWidgetClass,
  299.                  pulldown, 
  300.                  XmNmnemonic, 'v',
  301.                  NULL);
  302.     XtAddCallback (w, XmNactivateCallback, ReverseColCB, IDdata) ;
  303.  
  304.    /* "Reset" */
  305.     w = XtVaCreateManagedWidget ("Reset", xmPushButtonWidgetClass,
  306.                  pulldown, 
  307.                  XmNmnemonic, 'R',
  308.                  NULL);
  309.     XtAddCallback (w, XmNactivateCallback, ResetColCB, IDdata);
  310.     w = XtVaCreateManagedWidget ("Help", xmPushButtonWidgetClass,
  311.                                  pulldown, 
  312.                  XmNmnemonic, 'H',
  313.                  NULL);
  314.     XtAddCallback (w, XmNactivateCallback, HelpColorizeCB, IDdata);
  315.  
  316.  
  317. /* "Help" */
  318.     pulldown = XmCreatePulldownMenu (menu, "help", IDdata, 0);
  319.     w = XtVaCreateManagedWidget ("Help", xmCascadeButtonWidgetClass,
  320.                  menu, XmNsubMenuId, pulldown, 
  321.                  XmNmnemonic, 'H',
  322.                  NULL);
  323.     w = XtVaCreateManagedWidget ("About XFITSview", xmPushButtonWidgetClass,
  324.                  pulldown, 
  325.                  XmNmnemonic, 'A',
  326.                  NULL);
  327.     XtAddCallback (w, XmNactivateCallback, HelpAboutCB, IDdata);
  328.     w = XtVaCreateManagedWidget ("Help me", xmPushButtonWidgetClass,
  329.                  pulldown, 
  330.                  XmNmnemonic, 'H',
  331.                  NULL);
  332.     XtAddCallback (w, XmNactivateCallback, HelpFullCB, IDdata);
  333.  
  334.     XtManageChild (menu);
  335.     return (menu);
  336. } /* end of MakeMainMenu */
  337.  
  338. /* callback functions */
  339. void QuitCB (Widget w, XtPointer clientData, XtPointer callData)
  340. /* bail out */
  341. {
  342. /* turn off logging if necessary */
  343.   if (doLog) LoggerCB (w, clientData, callData);
  344.  
  345. /* terminate program */
  346.   exit (0);
  347. } /* end QuitCB */
  348.  
  349. void FileOKCB (Widget filebox, XtPointer clientData, XtPointer callData)
  350. /* loads selected FITS file into the ImageData attached to the display */
  351. /* resets display when image is read */
  352. {
  353.   char *filename, *directory;
  354.   XmFileSelectionBoxCallbackStruct *cbs;
  355.   ImageDisplay  *IDdata;
  356.  
  357.   cbs = (XmFileSelectionBoxCallbackStruct *) callData;
  358.   IDdata = (ImageDisplay *)clientData;
  359.  
  360. /* get file name */
  361.  if (!XmStringGetLtoR (cbs->value, XmSTRING_DEFAULT_CHARSET, &filename))
  362.    return; /* error */
  363. /* read FITS file to pixmap */
  364.   StringFill (image[CurImag].FileName, filename);
  365. /* read FITS file to PixMap */
  366.   if (FITS2Pix (&image[CurImag], IDdata, 1))
  367.     {
  368.       /* error */
  369.       sprintf (szErrMess, "Error reading FITS file = %s", filename);
  370.       MessageShow (szErrMess);
  371.   }
  372.  
  373. /* get directory name */
  374.  if (!XmStringGetLtoR (cbs->dir, XmSTRING_DEFAULT_CHARSET, &directory))
  375.    return; /* error */
  376.   if (!FITS_dir) FITS_dir = MakeString(" ");
  377.   StringFill (FITS_dir, directory);
  378.   XtFree(filename);
  379.   XtFree(directory);
  380.  
  381. /* Shazam disappear and die */
  382.   /* let it hang around */
  383. /*  XtUnmanageChild (filebox); */
  384. /*  XtPopdown (XtParent (filebox)); */
  385. /*  XtDestroyWidget(filebox); */
  386.  
  387. /* reset display */
  388.   ResetDisplay(IDdata);
  389.  
  390. } /* end FileOKCB */
  391.  
  392. void FileCancelCB (Widget filebox, XtPointer clientData, XtPointer callData)
  393. /* cancel file selection dialog box */
  394. {
  395. /* Shazam disappear and die */
  396.   XtUnmanageChild (filebox); 
  397.   XtPopdown (XtParent (filebox)); 
  398.   XtDestroyWidget(filebox); 
  399. } /* end FileCancelCB */
  400.  
  401. void OpenCB (Widget w, XtPointer clientData, XtPointer callData)
  402. /* Load new FITS file */
  403. {
  404.   Widget       filebox;
  405.   ImageDisplay *IDdata;
  406.   XmString     wierdstring = NULL;
  407.   Arg          wargs[5]; 
  408.  
  409.   IDdata = (ImageDisplay *)clientData;
  410. /* sometimes c is too stupid to live */
  411.   filebox = (Widget) XmCreateFileSelectionDialog (w, "file_open", NULL, 0);
  412.   XtAddCallback (filebox, XmNokCallback, FileOKCB, clientData);
  413.   XtAddCallback (filebox, XmNcancelCallback, FileCancelCB, clientData);
  414.   XtAddCallback (filebox, XmNhelpCallback, HelpBrowserCB, clientData);
  415.  
  416. /* set directory if it is defined */
  417.   if (FITS_dir) {
  418.     wierdstring = XmStringCreateSimple (FITS_dir->sp);
  419.     XtSetArg (wargs[0], XmNdirectory, wierdstring);
  420.     XtSetValues (filebox, wargs, 1);
  421.     if (wierdstring) XmStringFree(wierdstring); wierdstring = NULL;
  422.   }
  423. /* Shazam appear: */
  424.   XtManageChild (filebox);
  425.   XtPopup (XtParent (filebox), XtGrabNone);
  426. /* all the action is in the callback routine */
  427. } /* end OpenCB */
  428.  
  429. void PreviewCB (Widget w, XtPointer clientData, XtPointer callData)
  430. /* show test or FITS header in scroll box */
  431. {
  432.   ImageDisplay *IDdata;
  433.   TextFilePtr TFilePtr;
  434.  
  435.   IDdata = (ImageDisplay *)clientData;
  436.  
  437. /* make dummy text file */
  438.   TFilePtr = TextFileMake (IDdata->shell, NULL, NULL);
  439.  
  440. /* set directory if known*/
  441.   if (FITS_dir)
  442.     {if(TFilePtr->directory) free(TFilePtr->directory);
  443.      TFilePtr->directory = (char*)malloc(FITS_dir->length+1);
  444.      strcpy (TFilePtr->directory, FITS_dir->sp);}
  445.  
  446. /* ask which file and copy to ScrollText */
  447.   TextFileFind (1, TFilePtr, ScrollTextCopy, (TextFileProc)TextFileKill);
  448. } /* end PreviewCB */
  449.  
  450. /* set Zoom menu labels to indicate which zoom is on */
  451. /* number is the menu item number 0 = 25% to 6=1600% */
  452. void MenuMarkZoom (int number)
  453. {
  454.   XmString  wierdstring;
  455.   int       loop;
  456.   char      *clear[] = 
  457.     {"25%", "50%", "100%", "200%", "400%", "800%", "1600%"};
  458.   char      *set[] = 
  459.     {"25% <=", "50% <=", "100% <=", "200% <=", "400% <=", "800% <=", 
  460.        "1600% <="};
  461.  
  462. /* sanity checks */
  463.   if ((number<0) || (number>6)) return;
  464.   if (!Zoom_w[0]) return;
  465.  
  466. /* clear all first */
  467.   for (loop=0; loop<7; loop++)
  468.     {
  469.       wierdstring = XmStringCreateSimple (clear[loop]);
  470.       XtVaSetValues(Zoom_w[loop], 
  471.             XmNlabelString,  wierdstring,
  472.             NULL);
  473.       if (wierdstring) XmStringFree(wierdstring); wierdstring = NULL;
  474.     }
  475. /* set the specified one */
  476.   wierdstring = XmStringCreateSimple (set[number]);
  477.   XtVaSetValues(Zoom_w[number], 
  478.         XmNlabelString,  wierdstring,
  479.         NULL);
  480.   if (wierdstring) XmStringFree(wierdstring); wierdstring = NULL;
  481. } /* end MenuMarkZoom */
  482.  
  483. /* set position logging menu label to indicate if hitting it will */
  484. /* start or stop position logging, 1 = turn on, 2 = turn off */
  485. void MenuMarkLogger (int onoff)
  486. {
  487.   XmString  wierdstring;
  488.  
  489.   if (onoff==1) /* turn on */
  490.     wierdstring = XmStringCreateSimple ("Start Position Logging");
  491.   else if (onoff==2) /* turn off */
  492.     wierdstring = XmStringCreateSimple ("Stop Position Logging");
  493.   else /* can't deal with this */
  494.     return;
  495.  
  496.   XtVaSetValues(File_w[4], XmNlabelString,  wierdstring, NULL);
  497.   if (wierdstring) XmStringFree(wierdstring);
  498. } /* end MenuMarkLogger */
  499.  
  500. void CopyOKCB (Widget filebox, XtPointer clientData, XtPointer callData)
  501. /* Copy current displayed FITS file to specified name */
  502. {
  503.   char *filename;
  504.   XmFileSelectionBoxCallbackStruct *cbs;
  505.   ImageDisplay  *IDdata;
  506.   FStrng *FileName;
  507.  
  508.   cbs = (XmFileSelectionBoxCallbackStruct *) callData;
  509.   IDdata = (ImageDisplay *)clientData;
  510.  
  511. /* get file name */
  512.  if (!XmStringGetLtoR (cbs->value, XmFONTLIST_DEFAULT_TAG, &filename))
  513.    return; /* error */
  514.   FileName = MakeString (filename);
  515. /* copy current file to output */
  516.   if (!DeepCopyFITSfile (image[CurImag].FileName, FileName))
  517.     {
  518.       /* error */
  519.       sprintf (szErrMess, "Error copying FITS file %s", 
  520.            image[CurImag].FileName->sp);
  521.       MessageShow (szErrMess);
  522.       sprintf (szErrMess, "to %s", filename);
  523.       MessageShow (szErrMess);
  524.   }
  525.   KillString (FileName);
  526.   XtFree(filename);
  527.  
  528. /* Shazam disappear and die */
  529.   XtUnmanageChild (filebox); 
  530.   XtPopdown (XtParent (filebox)); 
  531.   XtDestroyWidget(filebox); 
  532.  
  533. /* reset display */
  534.   ResetDisplay(IDdata);
  535.  
  536. } /* end CopyOKCB */
  537.  
  538. void SaveAsCB (Widget w, XtPointer clientData, XtPointer callData)
  539. /* save copy of FITS file*/
  540. {
  541.   Widget       filebox;
  542.   ImageDisplay *IDdata;
  543.   XmString     wierdstring;
  544.   Arg          wargs[5]; 
  545.  
  546.   IDdata = (ImageDisplay *)clientData;
  547.  
  548.   filebox = (Widget) XmCreateFileSelectionDialog (w, "save_as", NULL, 0);
  549.   XtAddCallback (filebox, XmNokCallback, CopyOKCB, clientData);
  550.   XtAddCallback (filebox, XmNcancelCallback, FileCancelCB, clientData);
  551.   XtAddCallback (filebox, XmNhelpCallback, HelpBrowserCB, clientData);
  552.  
  553. /* set directory if it is defined */
  554.   if (FITS_dir) {
  555.     wierdstring = XmStringLtoRCreate (FITS_dir->sp, 
  556.                       XmSTRING_DEFAULT_CHARSET);
  557.     XtSetArg (wargs[0], XmNdirectory, wierdstring);
  558.     XtSetValues (filebox, wargs, 1);
  559.     XmStringFree(wierdstring);
  560.   }
  561. /* Shazam appear: */
  562.   XtManageChild (filebox);
  563.   XtPopup (XtParent (filebox), XtGrabNone);
  564. /* all the action is in the callback routine */
  565. } /* end SaveAsCB */
  566.