home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Graphics / Graphics.zip / xfitsvew.zip / XFITSview / optionbox.c < prev    next >
C/C++ Source or Header  |  1998-04-02  |  13KB  |  405 lines

  1. /* Option dialog box  for XFITSview */
  2. /*-----------------------------------------------------------------------
  3. *  Copyright (C) 1996
  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/DialogS.h> 
  17. #include <Xm/MainW.h> 
  18. #include <Xm/Scale.h>
  19. #include <Xm/Form.h>
  20. #include <Xm/PushB.h>
  21. #include <Xm/Label.h>
  22. #include <Xm/ToggleB.h>
  23. #include <Xm/RowColumn.h>
  24. #include <Xm/Separator.h>
  25. #include <Xm/MessageB.h>
  26. #include <Xm/TextF.h>
  27. #include <Xm/Text.h>
  28. #include "imagedisp.h"
  29. #include "messagebox.h"
  30. #include "FITS2Pix.h"
  31.  
  32. /* is the option box active? */
  33. int OptionBoxActive = 0;
  34.  
  35. /* global structure for things to talk to each other */
  36. typedef struct {
  37.   ImageDisplay *BoxData;
  38.   Widget dialog, data1, data2; /* box, min, max */
  39.   Widget plane; /* Plane Number */
  40. } OptionBoxStuff;
  41. OptionBoxStuff dia;
  42.  
  43. void ReadMinCB (Widget w, XtPointer clientData, XtPointer callData)
  44. /* get minimum pixel value */
  45. {
  46.   ImageDisplay *IDdata = (ImageDisplay *)clientData;
  47.   char     *value=NULL;
  48.   float    temp;
  49.  
  50. /* read value */
  51.   value = XmTextGetString (w);
  52.   if (!value) /* error */
  53.     {MessageShow ("Error reading minimum pixel value");
  54.      return;}
  55.   if (!sscanf (value, "%e", &temp))
  56.    { /* error */
  57.      MessageShow ("Error reading minimum pixel value");
  58.      if (value) XtFree(value);
  59.      return;}
  60.   if (value) XtFree(value);
  61.  
  62. /* OK, save */
  63.   image[CurImag].PixRange[0] = temp;
  64.  
  65. } /* end ReadMinCB */
  66.  
  67. void ReadMaxCB (Widget w, XtPointer clientData, XtPointer callData)
  68. /* get maximum pixel value */
  69. {
  70.   ImageDisplay *IDdata = (ImageDisplay *)clientData;
  71.   char     *value;
  72.   float    temp;
  73.  
  74. /* read value */
  75.   value = XmTextGetString (w);
  76.   if (!value) /* error */
  77.     {MessageShow ("Error reading maximum pixel value");
  78.      return;}
  79.   if (!sscanf (value, "%e", &temp))
  80.    { /* error */
  81.      MessageShow ("Error reading maximum pixel value");
  82.      if (value) XtFree(value);
  83.      return;}
  84.   if (value) XtFree(value);
  85.  
  86. /* OK, save */
  87.   image[CurImag].PixRange[1] = temp;
  88.  
  89. } /* end ReadMaxCB */
  90.  
  91. void ReadPlaneCB (Widget w, XtPointer clientData, XtPointer callData)
  92. /* read Plane number */
  93. {
  94.   ImageDisplay *IDdata = (ImageDisplay *)clientData;
  95.   char     *value;
  96.   int      itemp;
  97.  
  98. /* read value */
  99.   value = XmTextGetString (w);
  100.   if (!value) /* error */
  101.     {MessageShow ("Error reading plane number");
  102.      return;}
  103.   if (!sscanf (value, "%d", &itemp))
  104.    { /* error */
  105.      MessageShow ("Error reading plane number");
  106.      if (value) XtFree(value);
  107.      return;}
  108.   if (value) XtFree(value);
  109.  
  110. /* internally 0 rel; externally 1 rel */
  111.   itemp--;
  112.  
  113. /* check value */
  114.   if ((image[CurImag].valid) && 
  115.       ((itemp<0) || (itemp>=image[CurImag].iNumPlanes)))
  116.     { /* error */
  117.       MessageShow ("Error: plane number out of range");
  118.       return;}
  119.  
  120. /* OK, save value */
  121.   image[CurImag].PlaneNo = itemp;
  122.  
  123. } /* end ReadPlaneCB */
  124.  
  125. void MapFnCB (Widget w, int which, XmToggleButtonCallbackStruct *state)
  126. /* Set mapping function type; which =0=>linear, 1=>nonlinear, 2=>hist. eq. */
  127. {
  128.   if (state->set) image[CurImag].iNonlinear = which;
  129. } /* end MapFnCB */
  130.  
  131. /* button callbacks */
  132. void OptOKButCB (Widget w, XtPointer clientData, XtPointer callData)
  133. /* OK button hit */
  134. {
  135.   ReadMinCB (dia.data1, (XtPointer)dia.BoxData, NULL);
  136.   ReadMaxCB (dia.data2, (XtPointer)dia.BoxData, NULL);
  137.   ReadPlaneCB (dia.plane, (XtPointer)dia.BoxData, NULL);
  138.   XtDestroyWidget (dia.dialog);
  139.   OptionBoxActive = 0; /* mark as inactive */
  140. } /* end OptOKButCB */
  141.  
  142. void OptCancelButCB (Widget w, XtPointer clientData, XtPointer callData)
  143. /* Cancel button hit */
  144. {
  145.   XtDestroyWidget (dia.dialog);
  146.   OptionBoxActive = 0; /* mark as inactive */
  147. } /* end OptCancelButCB */
  148.  
  149. void OptReloadButCB (Widget w, XtPointer clientData, XtPointer callData)
  150. /* Reload button hit */
  151. {
  152.   int scrollx, scrolly;
  153.   ReadMinCB (dia.data1, (XtPointer)dia.BoxData, NULL);
  154.   ReadMaxCB (dia.data2, (XtPointer)dia.BoxData, NULL);
  155.   ReadPlaneCB (dia.plane, (XtPointer)dia.BoxData, NULL);
  156.  
  157. /* reload current file */
  158.   if (!image[CurImag].valid) return;  /* tests for valid image */
  159.   if (!image[CurImag].FileName) return;  /* tests for valid name */
  160.   if (!image[CurImag].FileName->sp) return;
  161.   if (!image[CurImag].FileName->length) return;
  162.  
  163. /* save old scroll */
  164.   scrollx = dia.BoxData->scrollx;
  165.   scrolly = dia.BoxData->scrolly; 
  166.  
  167.   if (FITS2Pix (&image[CurImag], dia.BoxData, 1))
  168.     {/* error */
  169.       sprintf (szErrMess, "Error reading FITS file = %s", 
  170.         image[CurImag].FileName->sp);
  171.       MessageShow(szErrMess);
  172.     }
  173.  
  174. /* reset scroll */
  175.   dia.BoxData->scrollx = scrollx;
  176.   dia.BoxData->scrolly = scrolly; 
  177.  
  178. /* reset display */
  179.   PaintImage(dia.BoxData);
  180.  
  181. } /* end OptReloadButCB */
  182.  
  183. void OptionBoxCB (Widget parent, XtPointer clientData, XtPointer callData)
  184. /* create dialog box for Options */
  185. {
  186.   Widget form, label1, label2, label3;
  187.   Widget pixran1, pixran2, planelab, radio, sep;
  188.   Widget OKbutton, CancelButton, ReloadButton;
  189.   XmString     label = NULL, minpix = NULL, maxpix = NULL, pixran = NULL;
  190.   XmString     linear = NULL, nonlinear = NULL, histEq=NULL;
  191.   XmString     plalab = NULL, PixelStr = NULL;
  192.   char         valuestr[30];
  193.   ImageDisplay *IDdata = (ImageDisplay*)clientData;
  194.   int          start;
  195.   short        xpos, ypos;
  196. #define OPTIONBOX_WIDTH 160
  197.  
  198.  
  199. /* register IDdata */
  200.   dia.BoxData = IDdata;
  201.  
  202.   /* don't make another one */
  203.   if (OptionBoxActive) {
  204.     if (XtIsRealized (dia.dialog))
  205.     XMapRaised (XtDisplay(dia.dialog), XtWindow(dia.dialog));
  206.     return;
  207.   }
  208.  
  209.   label = XmStringCreateSimple ("Options panel");
  210.   minpix = XmStringCreateSimple ("Minimum pixel value");
  211.   maxpix = XmStringCreateSimple ("Maximum pixel value");
  212.   pixran = XmStringCreateSimple ("Pixel range in plane");
  213.   linear = XmStringCreateSimple ("linear");
  214.   nonlinear = XmStringCreateSimple ("nonlinear");
  215.   histEq = XmStringCreateSimple ("Histogram Equalization");
  216. /* mark as active */
  217.   OptionBoxActive = 1;
  218.  
  219.   dia.dialog = XtVaCreatePopupShell ("OptionBox", xmDialogShellWidgetClass, 
  220.                  IDdata->shell, 
  221.                  XmNautoUnmanage, False,
  222.                  XmNwidth,     OPTIONBOX_WIDTH,
  223.                  XmNheight,    310,
  224.                  XmNdeleteResponse, XmDESTROY,
  225.                  NULL);
  226.  
  227. /* make Form widget to stick things on */
  228.   form = XtVaCreateManagedWidget ("OptionForm", xmFormWidgetClass,
  229.                   dia.dialog,
  230.                   XmNautoUnmanage, False,
  231.                   XmNwidth,     OPTIONBOX_WIDTH,
  232.                   XmNheight,    310,
  233.                   XmNx,           0,
  234.                   XmNy,           0,
  235.                   NULL);
  236.  
  237. /* info label widgets */
  238.   label1 = XtVaCreateManagedWidget ("Label1", xmLabelWidgetClass, 
  239.                     form, 
  240.                     XmNwidth,           OPTIONBOX_WIDTH,
  241.                     XmNlabelString,   label,
  242.                     XmNtopAttachment, XmATTACH_FORM,
  243.                     XmNleftAttachment,  XmATTACH_FORM,
  244.                     NULL);
  245.  
  246. /* actual pixel range in plane */
  247.   pixran1 = XtVaCreateManagedWidget ("PixelRange1", xmLabelWidgetClass,
  248.                     form,
  249.                     XmNwidth,           OPTIONBOX_WIDTH,
  250.                     XmNlabelString,   pixran,
  251.                     XmNtopAttachment, XmATTACH_WIDGET,
  252.                     XmNtopWidget,     label1,
  253.                     XmNleftAttachment,  XmATTACH_FORM,
  254.                     NULL);
  255.  
  256.   sprintf (valuestr, "%g %g", image[CurImag].data_min, 
  257.        image[CurImag].data_max);
  258.   PixelStr = XmStringCreateSimple (valuestr);
  259.   pixran2 = XtVaCreateManagedWidget ("PixelRange2", xmLabelWidgetClass, 
  260.                     form, 
  261.                     XmNwidth,           OPTIONBOX_WIDTH,
  262.                     XmNlabelString,   PixelStr,
  263.                     XmNtopAttachment, XmATTACH_WIDGET,
  264.                     XmNtopWidget,     pixran1,
  265.                     XmNleftAttachment,  XmATTACH_FORM,
  266.                     NULL);
  267. /* minimum pixrange */
  268.   label2 = XtVaCreateManagedWidget ("OptionLabel2", xmLabelWidgetClass,
  269.                     form,
  270.                     XmNwidth,           OPTIONBOX_WIDTH,
  271.                     XmNlabelString,   minpix,
  272.                     XmNtopAttachment, XmATTACH_WIDGET,
  273.                     XmNtopWidget,     pixran2,
  274.                     XmNleftAttachment,  XmATTACH_FORM,
  275.                     NULL);
  276.  
  277.   sprintf (valuestr, "%f", image[CurImag].PixRange[0]);
  278.   dia.data1 = XtVaCreateManagedWidget ("OptionData1", xmTextFieldWidgetClass, 
  279.                     form, 
  280.                     XmNwidth,           OPTIONBOX_WIDTH,
  281.                     XmNvalue,   valuestr,
  282.                     XmNtopAttachment, XmATTACH_WIDGET,
  283.                     XmNtopWidget,     label2,
  284.                     XmNleftAttachment,  XmATTACH_FORM,
  285.                     NULL);
  286.  
  287. /* maximum pixrange */
  288.   label3 = XtVaCreateManagedWidget ("OptionLabel3", xmLabelWidgetClass,
  289.                     form,
  290.                     XmNwidth,           OPTIONBOX_WIDTH,
  291.                     XmNlabelString,   maxpix,
  292.                     XmNtopAttachment, XmATTACH_WIDGET,
  293.                     XmNtopWidget,     dia.data1,
  294.                     XmNleftAttachment,  XmATTACH_FORM,
  295.                     NULL);
  296.  
  297.   sprintf (valuestr, "%f", image[CurImag].PixRange[1]);
  298.   dia.data2 = XtVaCreateManagedWidget ("OptionData2", xmTextFieldWidgetClass, 
  299.                     form, 
  300.                     XmNwidth,           OPTIONBOX_WIDTH,
  301.                     XmNvalue,   valuestr,
  302.                     XmNtopAttachment, XmATTACH_WIDGET,
  303.                     XmNtopWidget,     label3,
  304.                     XmNleftAttachment,  XmATTACH_FORM,
  305.                     NULL);
  306.  
  307. /* Plane number */
  308.   sprintf (valuestr, "Plane no. (1 - %d)", image[CurImag].iNumPlanes);
  309.   plalab = XmStringCreateSimple (valuestr);
  310.   planelab = XtVaCreateManagedWidget ("OptionLabel3", xmLabelWidgetClass,
  311.                     form,
  312.                     XmNwidth,           OPTIONBOX_WIDTH,
  313.                     XmNlabelString,   plalab,
  314.                     XmNtopAttachment, XmATTACH_WIDGET,
  315.                     XmNtopWidget,     dia.data2,
  316.                     XmNleftAttachment,  XmATTACH_FORM,
  317.                     NULL);
  318.  
  319.   sprintf (valuestr, "%d", image[CurImag].PlaneNo+1);
  320.   dia.plane = XtVaCreateManagedWidget ("OptionData2", xmTextFieldWidgetClass, 
  321.                     form, 
  322.                     XmNwidth,           OPTIONBOX_WIDTH,
  323.                     XmNvalue,   valuestr,
  324.                     XmNtopAttachment, XmATTACH_WIDGET,
  325.                     XmNtopWidget,     planelab,
  326.                     XmNleftAttachment,  XmATTACH_FORM,
  327.                     NULL);
  328. /* separator */
  329.     sep = XtVaCreateManagedWidget ("sep", xmSeparatorWidgetClass,
  330.                    form, 
  331.                    XmNwidth,           OPTIONBOX_WIDTH,
  332.                    XmNtopAttachment, XmATTACH_WIDGET,
  333.                    XmNtopWidget,     dia.plane,
  334.                    XmNleftAttachment,  XmATTACH_FORM,
  335.                    NULL);
  336. /* linear/nonlinear/histogram eq. radio buttons */
  337.   start = image[CurImag].iNonlinear;
  338.   radio = XmVaCreateSimpleRadioBox(form, "Mapping_type", start, 
  339.                    (XtCallbackProc)MapFnCB,
  340.                    XmNwidth,           OPTIONBOX_WIDTH,
  341.                    XmNtopAttachment, XmATTACH_WIDGET,
  342.                    XmNtopWidget,     sep,
  343.                    XmNleftAttachment,  XmATTACH_FORM,
  344.                    XmVaRADIOBUTTON, linear, NULL, NULL, NULL,
  345.                    XmVaRADIOBUTTON, nonlinear, NULL,NULL,NULL,
  346.                    XmVaRADIOBUTTON, histEq, NULL,NULL,NULL,
  347.                    NULL);
  348.   XtManageChild(radio);
  349.  
  350. /* OK button */
  351.   OKbutton = XtVaCreateManagedWidget (" OK ", xmPushButtonWidgetClass, 
  352.                     form, 
  353.                     XmNbottomAttachment, XmATTACH_FORM,
  354.                     XmNleftAttachment,  XmATTACH_FORM,
  355.                     NULL);
  356.   XtAddCallback (OKbutton, XmNactivateCallback, OptOKButCB, (XtPointer)IDdata);
  357.  
  358. /* Cancel button */
  359.   CancelButton = XtVaCreateManagedWidget ("Cancel", xmPushButtonWidgetClass, 
  360.                     form, 
  361.                     XmNbottomAttachment, XmATTACH_FORM,
  362.                     XmNleftAttachment, XmATTACH_WIDGET,
  363.                     XmNleftWidget,     OKbutton,
  364.                     NULL);
  365.   XtAddCallback (CancelButton, XmNactivateCallback, OptCancelButCB, 
  366.          (XtPointer)IDdata);
  367.  
  368. /* Reload button */
  369.   ReloadButton = XtVaCreateManagedWidget ("Reload", xmPushButtonWidgetClass, 
  370.                     form, 
  371.                     XmNbottomAttachment, XmATTACH_FORM,
  372.                     XmNrightAttachment, XmATTACH_FORM,
  373.                     XmNleftAttachment, XmATTACH_WIDGET,
  374.                     XmNleftWidget,     CancelButton,
  375.                     NULL);
  376.   XtAddCallback (ReloadButton, XmNactivateCallback, OptReloadButCB, 
  377.          (XtPointer)IDdata);
  378.  
  379.   if (label) XmStringFree(label);
  380.   if (minpix) XmStringFree(minpix);
  381.   if (maxpix) XmStringFree(maxpix);
  382.   if (pixran) XmStringFree(pixran);
  383.   if (linear) XmStringFree(linear);
  384.   if (nonlinear) XmStringFree(nonlinear);
  385.   if (histEq) XmStringFree(histEq);
  386.   if (plalab) XmStringFree(plalab);
  387.   if (PixelStr) XmStringFree(PixelStr);
  388.  
  389. /* set it up */
  390.   XtManageChild (dia.dialog);
  391.  
  392. /* put it some place reasonable */
  393. /*  where is parent? */
  394.      XtVaGetValues (IDdata->shell,
  395.             XmNx, &xpos,
  396.             XmNy, &ypos,
  397.             NULL);
  398.   ypos += 170;
  399.   xpos -= 10;
  400.   if (xpos<0) xpos = 0;
  401.   XMoveWindow (XtDisplay(IDdata->shell), XtWindow(dia.dialog), 
  402.            xpos, ypos);
  403. } /* end OptionBox */
  404.  
  405.