This page was created by the IDL library routine mk_html_help2.

Last modified: Thu Aug 6 12:53:14 2020.


Directory Listing of Routines


Routine Descriptions

CDF_VERSION_TEST

[Next Routine] [List of Routines]
 Procedure: 
     cdf_version_test
 
 Purpose:
     Check that the patched version the CDF library (3.4+) is installed
     
 Note: 
     The crash due to an unpatched CDF library is usually due to a 
     change in the number of arguments of the function CDF_EPOCH_COMPARE. 
     The change was introduced in version 3.4 of the CDF library:
        http://cdaweb.sci.gsfc.nasa.gov/pub/software/cdf/dist/cdf35_0_2/idl/CDF_EPOCH_COMPARE.txt
 
 
 $LastChangedBy: egrimes $
 $LastChangedDate: 2014-10-31 09:11:43 -0700 (Fri, 31 Oct 2014) $
 $LastChangedRevision: 16091 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/cdf_version_test.pro $

(See spedas_gui/utilities/cdf_version_test.pro)


CENTERTLB

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       CENTERTLB

 PURPOSE:

       This is a utility routine to position a widget program
       on the display at an arbitrary location. By default the
       widget is centered on the display.

 AUTHOR:

       FANNING SOFTWARE CONSULTING
       David Fanning, Ph.D.
       1645 Sheely Drive
       Fort Collins, CO 80526 USA
       Phone: 970-221-0438
       E-mail: davidf@dfanning.com
       Coyote's Guide to IDL Programming: http://www.dfanning.com

 CATEGORY:

       Utilities

 CALLING SEQUENCE:

       CenterTLB, tlb, [x, y, /NOCENTER, /DEVICE]

 REQUIRED INPUTS:

       tlb: The top-level base identifier of the widget program. This must
       be a valid widget ID.

 OPTIONAL INPUTS:

       x:  Set this equal to a normalized position for the center
       of the widget as measured from the left-hand side of the screen.
       The default value is 0.5 (the center)  Setting this equal to 1.0
       places the widget at the far right-hand side of the screen.

       y:  Set this equal to a normalized position for the center
       of the widget as measured from the bottom of the screen.
       The default value is 0.5 (the center) Setting this equal to 1.0
       places the widget at the top of the screen.

 KEYWORDS:

      DEVICE:  Normally, the x and y parameters are specified in normalized
      coordinates. If this keyword is set, they are taken to be in DEVICE
      coordinates.

      NOCENTER:  By default, the center of the widget is positioned at the
      location specified by the x and y parameters.  If NOCENTER is set
      to a non-zero value, then the upper left corner of the widget
      is postioned at the specifed location.

 PROCEDURE:

       The program should be called after all the widgets have
       been created, but just before the widget hierarchy is realized.
       It uses the top-level base geometry along with the display size
       to calculate offsets for the top-level base that will center the
       top-level base on the display.

 COMMENT:
       Regardless of the values set for x, y and NOCENTER, the widget
       is not permitted to run off the display.

 MODIFICATION HISTORY:

       Written by:  Dick Jackson, 12 Dec 98.
       Modified to use device-independent Get_Screen_Size
            function. 31 Jan 2000. DWF.
       Added x, y, NOCENTER and run-off protection. 26 Jan 2001. BT.
       Added a maximum value of 1280 for X screen size. This helps
            center the widget on a single monitor when using dual
            monitor settings with some graphics cards. 3 Feb 2003. DWF.
       Added DEVICE keyword. 4 January 2006. DWF.

(See spedas_gui/utilities/centertlb.pro)


COLORBAR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
   COLORBAR

 PURPOSE:

       The purpose of this routine is to add a color bar to the current
       graphics window.

 AUTHOR:

   FANNING SOFTWARE CONSULTING
   David Fanning, Ph.D.
   1645 Sheely Drive
   Fort Collins, CO 80526 USA
   Phone: 970-221-0438
   E-mail: davidf@dfanning.com
   Coyote's Guide to IDL Programming: http://www.dfanning.com/

 CATEGORY:

       Graphics, Widgets.

 CALLING SEQUENCE:

       COLORBAR

 INPUTS:

       None.

 KEYWORD PARAMETERS:

       BOTTOM:       The lowest color index of the colors to be loaded in
                     the bar.

       CHARSIZE:     The character size of the color bar annotations. Default is 1.0.

       COLOR:        The color index of the bar outline and characters. Default
                     is !P.Color..

       DIVISIONS:     The number of divisions to divide the bar into. There will
                     be (divisions + 1) annotations. The default is 6.

       FONT:         Sets the font of the annotation. Hershey: -1, Hardware:0, True-Type: 1.

       FORMAT:       The format of the bar annotations. Default is '(I5)'.

       INVERTCOLORS: Setting this keyword inverts the colors in the color bar.

       MAXRANGE:     The maximum data value for the bar annotation. Default is
                     NCOLORS.

       MINRANGE:     The minimum data value for the bar annotation. Default is 0.

       MINOR:        The number of minor tick divisions. Default is 2.

       NCOLORS:      This is the number of colors in the color bar.

       POSITION:     A four-element array of normalized coordinates in the same
                     form as the POSITION keyword on a plot. Default is
                     [0.88, 0.10, 0.95, 0.90] for a vertical bar and
                     [0.10, 0.88, 0.90, 0.95] for a horizontal bar.
;
       RANGE:        A two-element vector of the form [min, max]. Provides an
                     alternative way of setting the MINRANGE and MAXRANGE keywords.

       RIGHT:        This puts the labels on the right-hand side of a vertical
                     color bar. It applies only to vertical color bars.

       TICKNAMES:    A string array of names or values for the tick marks.

       TITLE:        This is title for the color bar. The default is to have
                     no title.

       TOP:          This puts the labels on top of the bar rather than under it.
                     The keyword only applies if a horizontal color bar is rendered.

       VERTICAL:     Setting this keyword give a vertical color bar. The default
                     is a horizontal color bar.

 COMMON BLOCKS:

       None.

 SIDE EFFECTS:

       Color bar is drawn in the current graphics window.

 RESTRICTIONS:

       The number of colors available on the display device (not the
       PostScript device) is used unless the NCOLORS keyword is used.

 EXAMPLE:

       To display a horizontal color bar above a contour plot, type:

       LOADCT, 5, NCOLORS=100
       CONTOUR, DIST(31,41), POSITION=[0.15, 0.15, 0.95, 0.75], $
          C_COLORS=INDGEN(25)*4, NLEVELS=25
       COLORBAR, NCOLORS=100, POSITION=[0.15, 0.85, 0.95, 0.90]

 MODIFICATION HISTORY:

       Written by: David W. Fanning, 10 JUNE 96.
       10/27/96: Added the ability to send output to PostScript. DWF
       11/4/96: Substantially rewritten to go to screen or PostScript
           file without having to know much about the PostScript device
           or even what the current graphics device is. DWF
       1/27/97: Added the RIGHT and TOP keywords. Also modified the
            way the TITLE keyword works. DWF
       7/15/97: Fixed a problem some machines have with plots that have
            no valid data range in them. DWF
       12/5/98: Fixed a problem in how the colorbar image is created that
            seemed to tickle a bug in some versions of IDL. DWF.
       1/12/99: Fixed a problem caused by RSI fixing a bug in IDL 5.2. Sigh... DWF.
       3/30/99: Modified a few of the defaults. DWF.
       3/30/99: Used NORMAL rather than DEVICE coords for positioning bar. DWF.
       3/30/99: Added the RANGE keyword. DWF.
       3/30/99: Added FONT keyword. DWF
       5/6/99: Many modifications to defaults. DWF.
       5/6/99: Removed PSCOLOR keyword. DWF.
       5/6/99: Improved error handling on position coordinates. DWF.
       5/6/99. Added MINOR keyword. DWF.
       5/6/99: Set Device, Decomposed=0 if necessary. DWF.
       2/9/99: Fixed a problem caused by setting BOTTOM keyword, but not NCOLORS. DWF.
       8/17/99. Fixed a problem with ambiguous MIN and MINOR keywords. DWF
       8/25/99. I think I *finally* got the BOTTOM/NCOLORS thing sorted out. :-( DWF.
       10/10/99. Modified the program so that current plot and map coordinates are
            saved and restored after the colorbar is drawn. DWF.
       3/18/00. Moved a block of code to prevent a problem with color decomposition. DWF.
       4/28/00. Made !P.Font default value for FONT keyword. DWF.
       9/26/00. Made the code more general for scalable pixel devices. DWF.
       1/16/01. Added INVERTCOLORS keyword. DWF.
       5/11/04. Added TICKNAME keyword. DWF.

(See spedas_gui/utilities/colorbar.pro)


ERROR_MESSAGE

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
    ERROR_MESSAGE

 PURPOSE:

    The purpose of this function  is to have a device-independent
    error messaging function. The error message is reported
    to the user by using DIALOG_MESSAGE if widgets are
    supported and MESSAGE otherwise.

    In general, the ERROR_MESSAGE function is not called directly.
    Rather, it is used in a CATCH error handler. Errors are thrown
    to ERROR_MESSAGE with the MESSAGE command. A typical CATCH error
    handler is shown below.

       Catch, theError
       IF theError NE 0 THEN BEGIN
          Catch, /Cancel
          ok = Error_Message(/Traceback, /Error)
          RETURN
       ENDIF

    Error messages would get into the ERROR_MESSAGE function by
    throwing an error with the MESSAGE command, like this:

       IF test NE 1 THEN Message, 'The test failed.'

 AUTHOR:

   FANNING SOFTWARE CONSULTING
   David Fanning, Ph.D.
   1645 Sheely Drive
   Fort Collins, CO 80526 USA
   Phone: 970-221-0438
   E-mail: davidf@dfanning.com
   Coyote's Guide to IDL Programming: http://www.dfanning.com/

 CATEGORY:

    Utility.

 CALLING SEQUENCE:

    ok = Error_Message(the_Error_Message)

 INPUTS:

    the_Error_Message: This is a string argument containing the error
       message you want reported. If undefined, this variable is set
       to the string in the !Error_State.Msg system variable.

 KEYWORDS:

    ERROR: Set this keyword to cause Dialog_Message to use the ERROR
       reporting dialog. Note that a bug in IDL causes the ERROR dialog
       to be used whether this keyword is set to 0 or 1!

    INFORMATIONAL: Set this keyword to cause Dialog_Message to use the
       INFORMATION dialog instead of the WARNING dialog. Note that a bug
       in IDL causes the ERROR dialog to be used if this keyword is set to 0!

    TITLE: Set this keyword to the title of the DIALOG_MESSAGE window. By
       default the keyword is set to 'System Error' unless !ERROR_STATE.NAME
       equals "IDL_M_USER_ERR", in which case it is set to "Trapped Error'.

    TRACEBACK: Setting this keyword results in an error traceback
       being printed to standard output with the PRINT command. Set to
       1 (ON) by default. Use TRACEBACK=0 to turn this functionality off.
     

 OUTPUTS:

    Currently the only output from the function is the string "OK".

 RESTRICTIONS:

    The WARNING Dialog_Message dialog is used by default.

 EXAMPLE:

    To handle an undefined variable error:

    IF N_Elements(variable) EQ 0 THEN $
       ok = Error_Message('Variable is undefined', /Traceback)

  NOTES: This version has a systen variable called !GUIDEBUG that has been added for usage with 
     the SPEDAS GUI, it is used to disable windowing with this error routine.  If !GUIDEBUG = 1 
     this routine will only print to command line.  To set GUIDEBUG call: defsysv,'!GUIDEBUG',1

 MODIFICATION HISTORY:

    Written by: David W. Fanning, 27 April 1999.
    Added the calling routine's name in the message and NoName keyword. 31 Jan 2000. DWF.
    Added _Extra keyword. 10 February 2000. DWF.
    Forgot to add _Extra everywhere. Fixed for MAIN errors. 8 AUG 2000. DWF.
    Adding call routine's name to Traceback Report. 8 AUG 2000. DWF.
    Added ERROR, INFORMATIONAL, and TITLE keywords. 19 SEP 2002. DWF.
    Removed the requirement that you use the NONAME keyword with the MESSAGE
      command when generating user-trapped errors. 19 SEP 2002. DWF.
    Added distinctions between trapped errors (errors generated with the
      MESSAGE command) and IDL system errors. Note that if you call ERROR_MESSAGE
      directly, then the state of the !ERROR_STATE.NAME variable is set
      to the *last* error generated. It is better to access ERROR_MESSAGE
      indirectly in a Catch error handler from the MESSAGE command. 19 SEP 2002. DWF.
    Change on 19 SEP 2002 to eliminate NONAME requirement did not apply to object methods.
      Fixed program to also handle messages from object methods. 30 JULY 2003. DWF.
    Removed obsolete STR_SEP and replaced with STRSPLIT. 27 Oct 2004. DWF.
    Made a traceback the default case without setting TRACEBACK keyword. 19 Nov 2004. DWF.
    
    Added !GUIDEBUG keyword support.  Patrick Cruce 2008-09-17 

(See spedas_gui/utilities/error_message.pro)


FORMATANNOTATION

[Previous Routine] [Next Routine] [List of Routines]
FUNCTION:
  formatannotation

PURPOSE:
  This routine is used as a callback for axis labeling by IDLgrAxis
  Because it is a callback routine, IDL requires it to have this specific form.
  It is probably useful as a general purpose formatting routine, as well.
   
Inputs:
Axis:Required by IDL, but ignored
Index: Required by IDL, but ignored
Value: Required The value to be formatted.
Data:  Keyword,Required
  The data struct holds the important information and has the following format:
  data = {timeAxis:0B,  $ ;Should we format as time data?
        formatid:0L,  $ ;Precision of returned value in sig figs 
        scaling:0B,   $ ;0:Linear,1:Log10,2:LogN
        exponent:0B,  $ ;(REQUIRED for non-time data)0:Auto-Format(see description),1:Numerical(double),2:Sci-Notation(1.2x10^3)
        range:[0D,0D],$ ; The range field is optional.  If it is present in the struct, value will be interpreted a multiplier over the specified range.(generally this is used if the data is being stored as a proportion)
        noformatcodes:0b,$ ; Optional, set to 1 to disable IDL formatting codes like !U
        maxexplen:0L,$ ; Optional, if present and not equal -1 then exponents will be formatted to this length
        negexp:0B} ; Optional, if present 1 indicates presence of a negative exponent on axis (only considered if maxexplen is also set and not -1)
Auto-Format:
If the number being formatted is too large or small to be displayed with the requested number of
  significant figures then the number will be automatically displayed in scientific notation
  (e.g. for 3 sig. figs '1234.5' will be shown as '1.23x10^3' and '.00012345' will be shown as '1.23x10^-4') 
Values in log_10() space will be displayed as '10^1.2'
Values in ln() space will be displayes as 'e^1.2'
Integer formatting is not effected.

Formatting Codes:
Formatting codes are utilized to create superscripts and unicode characters that are displayd
by IDLgraxis:
  !z(00d7): Unicode multiplication symbol
  !U      : Superscripts the following substring  

Example:
  print,formatannotation(0,0,1,data={timeaxis:0,formatid:7,scaling:0,exponent:0})
  1.000000
  print,formatannotation(0,0,.5,data={timeaxis:1,formatid:12,scaling:0,range:[time_double('2007-03-23'),time_double('2007-03-24')]})
  082/12:00:00.000
  print,formatannotation(0,0,4,data={timeaxis:0,formatid:5,scaling:2,exponent:0})
  e!U4.0000
  print,formatannotation(0,0,.25,data={timeaxis:0,formatid:5,scaling:1,range:[1,2],exponent:0})
  10!U1.2500
  print,formatannotation(0,0,1234,data={timeaxis:0,formatid:7,scaling:0,exponent:2})
  1.234000!z(00d7)10!U3
  
$LastChangedBy: egrimes $
$LastChangedDate: 2014-06-05 10:01:44 -0700 (Thu, 05 Jun 2014) $
$LastChangedRevision: 15308 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/formatannotation.pro $

(See spedas_gui/utilities/formatannotation.pro)


FSC_COLOR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       FSC_COLOR

 PURPOSE:

       The purpose of this function is to obtain drawing colors
       by name and in a device/decomposition independent way. The
       color names and values may be read in as a file, or 88
       color names and values are supplied from the program. These
       were obtained from the file rgb.txt, found on most X-Window
       distributions. Representative colors were chose from across
       the color spectrum. To see a list of colors available, type:
       Print, FSC_Color(/Names), Format='(6A15)'.

 AUTHOR:

       FANNING SOFTWARE CONSULTING:
       David Fanning, Ph.D.
       1645 Sheely Drive
       Fort Collins, CO 80526 USA
       Phone: 970-221-0438
       E-mail: davidf@dfanning.com
       Coyote's Guide to IDL Programming: http://www.dfanning.com

 CATEGORY:

       Graphics, Color Specification.

 CALLING SEQUENCE:

       color = FSC_COLOR(theColor, theColorIndex)

 NORMAL CALLING SEQUENCE FOR DEVICE-INDEPENDENT COLOR:

       If you write your graphics code *exactly* as it is written below, then
       the same code will work in all graphics devices I have tested.
       These include the PRINTER, PS, and Z devices, as well as X, WIN, and MAC.

       In practice, graphics code is seldom written like this. (For a variety of
       reasons, but laziness is high on the list.) So I have made the
       program reasonably tolerant of poor programming practices. I just
       point this out as a place you might return to before you write me
       a nice note saying my program "doesn't work". :-)

       axisColor = FSC_COLOR("Green", !D.Table_Size-2)
       backColor = FSC_COLOR("Charcoal", !D.Table_Size-3)
       dataColor = FSC_COLOR("Yellow", !D.Table_Size-4)
       thisDevice = !D.Name
       Set_Plot, 'toWhateverYourDeviceIsGoingToBe', /Copy
       Device, .... ; Whatever you need here to set things up properly.
       IF (!D.Flags AND 256) EQ 0 THEN $
         POLYFILL, [0,1,1,0,0], [0,0,1,1,0], /Normal, Color=backColor
       Plot, Findgen(11), Color=axisColor, Background=backColor, /NoData, $
          NoErase= ((!D.Flags AND 256) EQ 0)
       OPlot, Findgen(11), Color=dataColor
       Device, .... ; Whatever you need here to wrap things up properly.
       Set_Plot, thisDevice

 OPTIONAL INPUT PARAMETERS:

       theColor: A string with the "name" of the color. To see a list
           of the color names available set the NAMES keyword. This may
           also be a vector of color names. Colors available are these:

                Almond   Antique White      Aquamarine           Beige          Bisque           Black
                  Blue     Blue Violet           Brown       Burlywood        Charcoal      Chartreuse
             Chocolate           Coral        Cornsilk            Cyan  Dark Goldenrod       Dark Gray
            Dark Green      Dark Khaki     Dark Orchid     Dark Salmon       Deep Pink     Dodger Blue
             Firebrick    Forest Green            Gold       Goldenrod            Gray           Green
          Green Yellow        Honeydew        Hot Pink      Indian Red           Ivory           Khaki
              Lavender      Lawn Green     Light Coral      Light Cyan      Light Gray    Light Salmon
          Light Yellow      Lime Green           Linen         Magenta          Maroon     Medium Gray
         Medium Orchid        Moccasin            Navy           Olive      Olive Drab          Orange
            Orange Red          Orchid  Pale Goldenrod      Pale Green          Papaya            Peru
                  Pink            Plum     Powder Blue          Purple             Red            Rose
            Rosy Brown      Royal Blue    Saddle Brown          Salmon     Sandy Brown       Sea Green
              Seashell          Sienna        Sky Blue      Slate Gray            Snow    Spring Green
            Steel Blue             Tan         Thistle          Tomato       Turquoise          Violet
            Violet Red           Wheat           White          Yellow

           Also, these system color names are available in IDL 5.6 and higher: Frame, Text, Active,
           Shadow, Highlight, Edge, Selected, Face.

           The color WHITE is used if this parameter is absent or a color name is mis-spelled. To see a list
           of the color names available in the program, type this:

              Print, FSC_COLOR(/Names), Format='(6A15)'

       theColorIndex: The color table index (or vector of indices the same length
           as the color name vector) where the specified color is loaded. The color table
           index parameter should always be used if you wish to obtain a color value in a
           color-decomposition-independent way in your code. See the NORMAL CALLING
           SEQUENCE for details. If theColor is a vector, and theColorIndex is a scalar,
           then the colors will be loaded starting at theColorIndex.

 RETURN VALUE:

       The value that is returned by FSC_COLOR depends upon the keywords
       used to call it, on the version of IDL you are using,and on the depth
       of the display device when the program is invoked. In general,
       the return value will be either a color index number where the specified
       color is loaded by the program, or a 24-bit color value that can be
       decomposed into the specified color on true-color systems. (Or a vector
       of such numbers.)

       If you are running IDL 5.2 or higher, the program will determine which
       return value to use, based on the color decomposition state at the time
       the program is called. If you are running a version of IDL before IDL 5.2,
       then the program will return the color index number. This behavior can
       be overruled in all versions of IDL by setting the DECOMPOSED keyword.
       If this keyword is 0, the program always returns a color index number. If
       the keyword is 1, the program always returns a 24-bit color value.

       If the TRIPLE keyword is set, the program always returns the color triple,
       no matter what the current decomposition state or the value of the DECOMPOSED
       keyword. Normally, the color triple is returned as a 1 by 3 column vector.
       This is appropriate for loading into a color index with TVLCT:

          IDL> TVLCT, FSC_Color('Yellow', /Triple), !P.Color

       But sometimes (e.g, in object graphics applications) you want the color
       returned as a row vector. In this case, you should set the ROW keyword
       as well as the TRIPLE keyword:

          viewobj= Obj_New('IDLgrView', Color=FSC_Color('charcoal', /Triple, /Row))

       If the ALLCOLORS keyword is used, then instead of a single value, modified
       as described above, then all the color values are returned in an array. In
       other words, the return value will be either an NCOLORS-element vector of color
       table index numbers, an NCOLORS-element vector of 24-bit color values, or
       an NCOLORS-by-3 array of color triples.

       If the NAMES keyword is set, the program returns a vector of
       color names known to the program.

       If the color index parameter is not used, and a 24-bit value is not being
       returned, then colorIndex is typically set to !D.Table_Size-1. However,
       this behavior is changed on 8-bit devices (e.g., the PostScript device,
       or the Z-graphics buffer) and on 24-bit devices that are *not* using
       decomposed color. On these devices, the colors are loaded at an
       offset of !D.Table_Size - ncolors - 2, and the color index parameter reflects
       the actual index of the color where it will be loaded. This makes it possible
       to use a formulation as below:

          Plot, data, Color=FSC_Color('Dodger Blue')

       on 24-bit displays *and* in PostScript output! Note that if you specify a color
       index (the safest thing to do), then it will always be honored.

 INPUT KEYWORD PARAMETERS:

       ALLCOLORS: Set this keyword to return indices, or 24-bit values, or color
              triples, for all the known colors, instead of for a single color.

       DECOMPOSED: Set this keyword to 0 or 1 to force the return value to be
              a color table index or a 24-bit color value, respectively.

       FILENAME: The string name of an ASCII file that can be opened to read in
              color values and color names. There should be one color per row
              in the file. Please be sure there are no blank lines in the file.
              The format of each row should be:

                  redValue  greenValue  blueValue  colorName

              Color values should be between 0 and 255. Any kind of white-space
              separation (blank characters, commas, or tabs) are allowed. The color
              name should be a string, but it should NOT be in quotes. A typical
              entry into the file would look like this:

                  255   255   0   Yellow

       NAMES: If this keyword is set, the return value of the function is
              a ncolors-element string array containing the names of the colors.
              These names would be appropriate, for example, in building
              a list widget with the names of the colors. If the NAMES
              keyword is set, the COLOR and INDEX parameters are ignored.

                 listID = Widget_List(baseID, Value=GetColor(/Names), YSize=16)

       ROW:   If this keyword is set, the return value of the function when the TRIPLE
              keyword is set is returned as a row vector, rather than as the default
              column vector. This is required, for example, when you are trying to
              use the return value to set the color for object graphics objects. This
              keyword is completely ignored, except when used in combination with the
              TRIPLE keyword.

       SELECTCOLOR: Set this keyword if you would like to select the color name with
              the PICKCOLORNAME program. Selecting this keyword automaticallys sets
              the INDEX positional parameter. If this keyword is used, any keywords
              appropriate for PICKCOLORNAME can also be used. If this keyword is used,
              the first positional parameter can be either a color name or the color
              table index number. The program will figure out what you want.

       TRIPLE: Setting this keyword will force the return value of the function to
              *always* be a color triple, regardless of color decomposition state or
              visual depth of the machine. The value will be a three-element column
              vector unless the ROW keyword is also set.

       In addition, any keyword parameter appropriate for PICKCOLORNAME can be used.
       These include BOTTOM, COLUMNS, GROUP_LEADER, INDEX, and TITLE.

 OUTPUT KEYWORD PARAMETERS:

       CANCEL: This keyword is always set to 0, unless that SELECTCOLOR keyword is used.
              Then it will correspond to the value of the CANCEL output keyword in PICKCOLORNAME.

       COLORSTRUCTURE: This output keyword (if set to a named variable) will return a
              structure in which the fields will be the known color names (without spaces)
              and the values of the fields will be either color table index numbers or
              24-bit color values. If you have specified a vector of color names, then
              this will be a structure containing just those color names as fields.

       NCOLORS: The number of colors recognized by the program. It will be 88 by default.

 COMMON BLOCKS:
       None.

 SIDE EFFECTS:
       None.

 ADDITIONAL PROGRAMS REQUIRED:

   PICKCOLORNAME: This file can be found in the Coyote Library:

             http://www.dfanning.com/programs/pickcolorname.pro

 EXAMPLE:

       To get drawing colors in a device-decomposed independent way:

           axisColor = FSC_COLOR("Green", !D.Table_Size-2)
           backColor = FSC_COLOR("Charcoal", !D.Table_Size-3)
           dataColor = FSC_COLOR("Yellow", !D.Table_Size-4)
           Plot, Findgen(11), Color=axisColor, Background=backColor, /NoData
           OPlot, Findgen(11), Color=dataColor

       To set the viewport color in object graphics:

           theView = Obj_New('IDLgrView', Color=FSC_Color('Charcoal', /Triple))

       To change the viewport color later:

           theView->SetProperty, Color=FSC_Color('Antique White', /Triple)

       To load the drawing colors "red", "green", and "yellow" at indices 100-102, type this:

           IDL> TVLCT, FSC_Color(["red", "green", and "yellow"], /Triple), 100

 MODIFICATION HISTORY:
       Written by: David W. Fanning, 19 October 2000. Based on previous
          GetColor program.
       Fixed a problem with loading colors with TVLCT on a PRINTER device. 13 Mar 2001. DWF.
       Added the ROW keyword. 30 March 2001. DWF.
       Added the PICKCOLORNAME code to the file, since I keep forgetting to
          give it to people. 15 August 2001. DWF.
       Added ability to specify color names and indices as vectors. 5 Nov 2002. DWF.
       Fixed a problem with the TRIPLE keyword when specifying a vector of color names. 14 Feb 2003. DWF.
       Fixed a small problem with the starting index when specifying ALLCOLORS. 24 March 2003. DWF.
       Added system color names. 23 Jan 2004. DWF
       Added work-around for WHERE function "feature" when theColor is a one-element array. 22 July 2004. DWF.
       Added support for 8-bit graphics devices when color index is not specified. 25 August 2004. DWF.
       Fixed a small problem with creating color structure when ALLCOLORS keyword is set. 26 August 2004. DWF.
       Extended the color index fix for 8-bit graphics devices on 25 August 2004 to
         24-bit devices running with color decomposition OFF. I've concluded most of
         the people using IDL don't have any idea how color works, so I am trying to
         make it VERY simple, and yet still maintain the power of this program. So now,
         in general, for most simple plots, you don't have to use the colorindex parameter
         and you still have a very good chance of getting what you expect in a device-independent
         manner. Of course, it would be *nice* if you could use that 24-bit display you paid
         all that money for, but I understand your reluctance. :-)   11 October 2004. DWF.
       Have renamed the first positional parameter so that this variable doesn't change
         while the program is running. 7 December 2004. DWF.
       Fixed an error I introduced on 7 December 2004. Sigh... 7 January 2005. DWF.

(See spedas_gui/utilities/fsc_color.pro)


FSC_FIELD

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
   FSC_FIELD

 PURPOSE:

   The purpose of this compound widget is to provide an alternative
   to the CW_FIELD widget offered in the IDL distribution. One weakness
   of the CW_FIELD compound widget is that the text widgets do not
   look editable to the users on Windows platforms. This program
   corrects that deficiency and adds some features that I think
   will be helpful. For example, you can now assign an event handler
   to the compound widget, ask for positive numbers only, and limit
   the number of digits in a number, or the number of digits to the
   right of a decimal point. The program is written as a widget object,
   which allows the user to call object methods directly, affording
   even more flexibility in use. This program replaces the earlier
   programs FSC_INPUTFIELD and COYOTE_FIELD.

   The program consists of a label widget next to a one-line text widget.
   The "value" of the compound widget is shown in the text widget. If the
   value is a number, it will not be possible (generally) to type
   alphanumeric values in the text widget. String values behave like
   strings in any one-line text widget.

 AUTHOR:

   FANNING SOFTWARE CONSULTING
   David Fanning, Ph.D.
   1645 Sheely Drive
   Fort Collins, CO 80526 USA
   Phone: 970-221-0438
   E-mail: davidf@dfanning.com
   Coyote's Guide to IDL Programming: http://www.dfanning.com/

 CATEGORY:

   General programming.

 TYPICAL CALLING SEQUENCE:

   fieldID = FSC_FIELD(parent, Title="X Size:", Value=256, Object=fieldObject, Digits=3)

 INPUT PARAMETERS:

   parent -- The parent widget ID of the compound widget. Required.

 INPUT KEYWORDS:

   COLUMN        Set this keyword to have the Label widget above the Text widget.
                 The default is to have the Label widget in a row with the Text widget.

   CR_ONLY       Set this keyword if you only want Carriage Return events returned to
                 your event handler. If this keyword is not set, all events are returned.
                 Setting this keyword has no effect unless either the EVENT_PRO or
                 EVENT_FUNC keyword is used.

   DECIMAL       Set this keyword to the number of digits to the right of the decimal
                 point in floating point or double precision numbers. Ignored for STRING values.

   DIGITS        Set this keyword to the number of digits permitted in integer numbers.

   EVENT_FUNC    Set this keyword to the name of an event handler function. If this
                 keyword is undefined and the Event_Pro keyword is undefined,
                 all compound widget events are handled internally and not
                 passed on to the parent widget.

   EVENT_PRO     Set this keyword to the name of an event handler procedure. If this
                 keyword is undefined and the Event_Func keyword is undefined,
                 all compound widget events are handled internally and not
                 passed on to the parent widget.

   FIELDFONT     The font name for the text in the text widget.

   FRAME         Set this keyword to put a frame around the compound widget.

   FOCUS_EVENTS  Set this keyword to enable event generation for keyboard focus
                 events. Ignored unless EVENT_FUNC or EVENT_PRO keywords are specified.

   HIGHLIGHT     Set this keyword to highlight the existing text if the widget gain
                 the keyboard focus. This keyword MUST be set for tabbing to work naturally
                 in IDL 6.2 and higher.

   LABEL_LEFT    Set this keyword to align the text on the label to the left.

   LABEL_RIGHT   Set this keyword to align the text on the label to the right.

   LABELFONT     The font name for the text in the label widget.

   LABELSIZE     The X screen size of the label widget.

   NAME          A string containing the name of the object. The default is ''.

   NOEDIT        Set this keyword to allow no user editing of the input text widget.

   NONSENSITIVE  Set this keyword to make the input text widget non-sensitive.

   POSITIVE      Set this keyword if you want only positive numbers allowed.

   SCR_XSIZE     The X screen size of the compound widget.

   SCR_YSIZE     The Y screen size of the compound widget.

   TITLE         The string text placed on the label widget.

   UNDEFINED     Set this keyword to the value to use for "undefined" values. If
                 not set, then !Value.F_NAN is used for numerical fields and a
                 NULL string is used for string fields. This applies to values
                 obtained with the GET_VALUE method or the GET_VALUE function.

   UVALUE        A user value for any purpose.

   VALUE         The "value" of the compound widget. Any type of integer, floating, or string
                 variable is allowed. The data "type" is determined automatically from the
                 value supplied with this keyword. Be sure you set the type appropriately for
                 your intended use of the value.

   XSIZE         The X size of the text widget in the usual character units.

 OUTPUT KEYWORDS:

   OBJECT        Set this keyword to a named variable to receive the compound widget's
                 object reference. This is required if you wish to call methods on the object.
                 Note that the object reference is also available in the event structure
                 generated by the widget object. Note that the object reference will be
                 necessary if you want to get or set values in the compound widget.

 COMMON BLOCKS:

   None.

 RESTRICTIONS:

   Requires DBLTOSTR from the Coyote Library:
      http://www.dfanning.com/programs/dbltostr.pro

 EVENT STRUCTURE:

   All events are handled internally unless either the Event_Pro or Event_Func
   keywords are used to assign an event handler to the compound widget. By
   default all events generated by the text widget are passed to the assigned
   event handler. If you wish to receive only Carriage Return events, set the
   CR_Only keyword.

   event = { FSC_FIELD_EVENT, $   ; The name of the event structure.
             ID: 0L, $            ; The ID of the compound widget's top-level base.
             TOP: 0L, $           ; The widget ID of the top-level base of the hierarchy.
             HANDLER: 0L, $       ; The event handler ID. Filled out by IDL.
             OBJECT: Obj_New(), $ ; The "self" object reference. Provided so you can call methods.
             VALUE: Ptr_New(), $  ; A pointer to the widget value.
             TYPE:""              ; A string indicating the type of data in the VALUE field.
           }

   Note that if the field is "empty", the VALUE will be a pointer
   to an undefined variable. You should check this value before you
   use it. You code will look something like this:

     IF N_Elements(*event.value) EQ 0 THEN $
         Print, 'Current Value UNDEFINED.' ELSE $
         Print, 'Current Value: ', *event.value

 GETTING and SETTING VALUES:

   Almost all the properties of the widget can be obtained or set via
   the object's GetProperty and SetProperty methods (described below).
   Traditional compound widgets have the ability to get and set the "value"
   of the compound widget identifier (e.g., fieldID in the calling
   sequence above). Unfortunately, it is impossible to retreive a variable
   in this way when the variable is undefined. In practical terms, this
   means that the undefined variable must be set to *something*. You can
   determine what that something is with the UNDEFINED keyword, or I will set
   it to !VALUES.F_NAN for numerical fields and to the null string for string
   fields. In any case, you will have to check for undefined variables before
   you try to do something with the value. For a numerical field, the code
   might look something like this:

      fieldID = FSC_FIELD(parent, Title="X Size:", Value=256, Object=fieldObject, Digits=3)
      currentValue = fieldObject->Get_Value()
      IF Finite(currentValue) EQ 0 THEN Print, 'Value is Undefined' ELSE Print, currentValue

   Additional examples are provided in the numerical example fields in Example Program below.

   Setting the value of the compound widget is the same as calling the Set_Value
   method on the object reference. In other words, these two statements are equivalent.

        fieldObject->Set_Value, 45.4
        Widget_Control, fieldID, Set_Value=45.4

   The data type of the value is determined from the value itself. Be sure you set it appropriately.

 OBJECT PROCEDURE METHODS:

   GetProperty -- This method allows various properties of the widget to be
       returned via output keywords. The keywords that are available are:

       CR_Only -- A flag, if set, means only report carriage return events.
       DataType -- The data type of the field variable.
       Decimal -- Set this keyword to the number of digits to the right of the decimal
              point in FLOATVALUE and DOUBLEVALUE numbers.
       Digits -- Set this keyword to the number of digits permitted in INTERGERVALUE and LONGVALUE numbers.
       Event_Func -- The name of the event handler function.
       Event_Pro -- The name of the event handler function.
       Has_Focus -- Set to 1 if the text widget currently has the keyboard focus.
       Highlight -- The highlight flag.
       NoEdit -- The NoEdit flag.
       NonSensitive -- The NonSensitive flag.
       Undefined -- The "value" of any undefined value.
       UValue -- The user value assigned to the compound widget.
       Value -- The "value" of the compound widget.
     Name -- A scalar string name of the object.

   Resize -- This method allows you to resize the compound widget's text field.
        The value parameter is an X screen size for the entire widget. The text
        widget is sized by using the value obtained from this value minus the
        X screen size of the label widget.

          objectRef->Resize, screen_xsize_value

   Set_Value -- This method allows you to set the "value" of the field. It takes
       one positional parameter, which is the value.

          objectRef->Set_Value, 5

   SetProperty -- This method allows various properties of the widget to be
       set via input keywords. The keywords that are available are:

       CR_Only -- Set this keyword if you only want Carriage Return events.
       Decimal -- Set this keyword to the number of digits to the right of the decimal
              point in FLOAT and DOUBLE numbers.
       Digits -- Set this keyword to the number of digits permitted in INTERGER and LONG numbers.
       Event_Func -- Set this keyword to the name of an Event Function.
       Event_Pro -- Set this keyword to the name of an Event Procedure.
       Highlight -- Set this keyword to highlight the existing text
                    when the widget gets the keyboard focus
       LabelSize --  The X screen size of the Label Widget.
       Name -- A scalar string name of the object. (default = '')
       NoEdit -- Set this keyword to make the text widget uneditable
       NonSensitive -- Set this keyword to make the widget nonsensitive
       Scr_XSize -- The X screen size of the text widget.
       Scr_YSize -- The Y screen size of the text widget.
       Title -- The text to go on the Label Widget.
       UValue -- A user value for any purpose.
       Value -- The "value" of the compound widget.
       XSize -- The X size of the Text Widget.

   SetTabNext -- This method allows you to specify which field to go to when a TAB character
      is typed in the text widget. See the Example program below for an example of how to
      use this method.

 OBJECT FUNCTIONS METHODS:

      Get_Value -- Returns the "value" of the field. No parameters. Will be undefined
          if a "number" field is blank. Should be checked before using:

          IF N_Elements(objectRef->Get_Value()) NE 0 THEN Print, Value is: ', objectRef->Get_Value()

      GetID -- Returns the widget identifier of the compound widget's top-level base.
         (The first child of the parent widget.) No parameters.

      GetLabelSize -- Returns the X screen size of the label widget. No parameters.

      GetTextID -- Returns the widget identifier of the compound widget's text widget.
         No parameters.

      GetTextSize -- Returns the X screen size of the text widget. No parameters.

 PRIVATE OBJECT METHODS:

   Although there is really no such thing as a "private" method in IDL's
   object implementation, some methods are used internally and not meant to
   be acessed publicly. Here are a few of those methods. I list them because
   it may be these private methods are ones you wish to override in subclassed
   objects.

      MoveTab -- This method moves the focus to the widget identified in the "next" field,
        which must be set with the SetTabNext method. No parameters. Called automatically
        when a TAB character is typed in the text widget.

      Text_Events -- The main event handler method for the compound widget. All
        text widget events are processed here.

      ReturnValue -- This function method accepts a string input value and converts
        it to the type of data requested by the user.

      Validate -- This function method examines all text input and removes unwanted
        characters, depending upon the requested data type for the field. It makes it
        impossible, for example, to type alphanumeric characters in an INTEGER field.

 EXAMPLE:

   An example program is provided at the end of the FSC_FIELD code. To run it,
   type these commands:

      IDL> .Compile FSC_Field
      IDL> Example

 MODIFICATION HISTORY:

   Written by: David W. Fanning, 18 October 2000. Based heavily on an earlier
      FSC_INPUTFIELD program and new ideas about the best way to write
      widget objects.
   Added LABEL_LEFT, LABEL_RIGHT, and UNDEFINED keywords. 29 Dec 2000. DWF.
   Modified the way the value is returned in the GET_VALUE method and the
      GET_VALUE function. Modified Example program to demonstrate. 30 Dec 2000. DWF.
   Added NOEDIT and NONSENSITIVE keywords, with corresponding SETEDIT and SETSENNSITIVE
      methods. 19 Jan 2001. DWF.
   Actually followed through with the changes I _said_" I made 29 Dec 2000. (Don't ask....) 13 June 2001. DWF.
   Added GetTextSize and GetLabelSize methods for obtaining the X screen
      size of the text and label widgets, respectively. 21 July 2001. DWF.
   Fixed a problem in SetProperty method where I was setting self.xsize, which doesn't exist. 24 April 2002. DWF.
   Small modification to the SetEdit method. 6 August 2003. DWF.
   Added Highlight keyword. Ported Focus_Events keyword from
      fsc_inputfield.pro. Updated documentation. 17 November
      2004. DWF and Benjamin Hornberger
   Added Has_Focus keyword to the GetProperty method. 18 November
      2004. Benjamin Hornberger
   Fixed bug in GetProperty method (set value to *self.undefined if
      *self.value is undefined. 24 Feb 2004. Benjamin Hornberger
   Modified FOCUS_EVENTS keyword handling so that *all* focus events are now
      passed to specified event handlers. Check event.select to see if the
      widget is gaining or losing focus. 10 August 2005. DWF.
   Added new tabbing functionality, introduced in IDL 6.2. To use tabbing
      functionality natually, the HIGHTLIGHT keywords must be set.
      See included EXAMPLE program for details. 10 August 2005. DWF.
   Added functionality to covert double precision values to strings properly. 30 Nov 2005. DWF.

(See spedas_gui/utilities/fsc_field.pro)


GETCTPATH

[Previous Routine] [Next Routine] [List of Routines]

NAME: getctpath

PURPOSE:
  gets the path of the color table on the file system 

CALLING SEQUENCE:
   getctpath,color_table_path

OUTPUT:
   color_table_path:  the path to the color table


$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/getctpath.pro $

(See spedas_gui/utilities/getctpath.pro)


GETHELPPATH

[Previous Routine] [Next Routine] [List of Routines]

NAME: gethelppath

PURPOSE:
  gets the path of the help directory in a cross platform way

CALLING SEQUENCE:
   gethelppath,path

OUTPUT:
   path:  the path to the resource directory


$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/gethelppath.pro $

(See spedas_gui/utilities/gethelppath.pro)


GETPLUGINPATH

[Previous Routine] [Next Routine] [List of Routines]

NAME: getpluginpath

PURPOSE:
  gets the path of the plugins directory in a cross platform way

CALLING SEQUENCE:
   getpluginpath,path

OUTPUT:
   path:  the path to the plugins directory


$LastChangedBy: egrimes $
$LastChangedDate: 2015-01-09 09:30:19 -0800 (Fri, 09 Jan 2015) $
$LastChangedRevision: 16608 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/getpluginpath.pro $

(See spedas_gui/utilities/getpluginpath.pro)


GETRESOURCEPATH

[Previous Routine] [Next Routine] [List of Routines]

NAME: getresourcepath

PURPOSE:
  gets the path of the resource directory in a cross platform way

CALLING SEQUENCE:
   getresourcepath,path

OUTPUT:
   path:  the path to the resource directory


$LastChangedBy: nikos $
$LastChangedDate: 2015-06-25 11:06:01 -0700 (Thu, 25 Jun 2015) $
$LastChangedRevision: 17971 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/getresourcepath.pro $

(See spedas_gui/utilities/getresourcepath.pro)


GET_INTRO_DIR

[Previous Routine] [Next Routine] [List of Routines]
 Call this function to return the absolute file path to the
 <b>introduction</b> directory (used to store files for the
 <i>Introduction to IDL</i> class) on your computer.
 <p>

 This routine replaces SET_TRAINING_DIRECTORY, which is now obsolete.
 <p>

 @pre This file must reside in the same directory as the course files.
 @returns The path to the directory where the course files reside.
 @examples
 <pre>
 IDL> dir = get_intro_dir()
 IDL> print, filepath('hello.pro', root=dir)
 /home/mpiper/IDL/introduction/hello.pro
 </pre>
 @uses SOURCEROOT or SOURCEPATH
 @requires IDL 5.2
 @author Mark Piper, RSI, 2005

(See spedas_gui/utilities/get_intro_dir.pro)


GET_MAX_MEMBLOCK.PRO

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 get_max_memblock.pro
 
PURPOSE:
 Returns size of largest contiguous block of memory available to IDL in
 megabytes.
 
 This function is intended to be used as a guide to determine how much data
 can be stored in a single operation without IDL returning an "Unable to 
 allocate memory" error.  The block size returned is not necessarily the
 largest block in RAM.  It might be partially or completely located in virtual
 memory/disk swap space, in which case performance might suffer if that block
 is used.
 
 Note that the returned value is only a snapshot in time.  Since other things
 can be going on with the OS and other applications, the size of the largest
 free memory block can increase or decrease in the time between calling this
 function and attempting to fill that block with data.  It is up to the
 programmer to decide what percentage of the returned value is safe to use.  
 
CALLING SEQUENCE:
 maxBlockSize = get_max_memblock()
 
INPUT:
 None

OUTPUT:
 Size of largest contiguous memory block available to IDL in megabytes.
 

(See spedas_gui/utilities/get_max_memblock.pro)


GET_MAX_MEMBLOCK2.PRO

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 get_max_memblock2.pro
 
PURPOSE:
 Returns size of largest contiguous block of memory available to IDL in
 megabytes.
 
 This function is intended to be used as a guide to determine how much data
 can be stored in a single operation without IDL returning an "Unable to 
 allocate memory" error.  The block size returned is not necessarily the
 largest block in RAM.  It might be partially or completely located in virtual
 memory/disk swap space, in which case performance might suffer if that block
 is used.
 
 Note that the returned value is only a snapshot in time.  Since other things
 can be going on with the OS and other applications, the size of the largest
 free memory block can increase or decrease in the time between calling this
 function and attempting to fill that block with data.  It is up to the
 programmer to decide what percentage of the returned value is safe to use.  
 
CALLING SEQUENCE:
 maxBlockSize = get_max_memblock()
 
INPUT:
 None
KEYWORDS:
 maxblock_in = the size of the initial value of the max blocksize in
               bytes, the default is 12 Gigabytes worth. Note that a
               long64 integer is needed if the value is larger than 2
               gBytes.
OUTPUT:
 Size of largest contiguous memory block available to IDL in
 megabytes.
Modification HISTORY:
 jmm, 3-feb-2009, hacked get_max_memblock--changed method to bisection
 

(See spedas_gui/utilities/get_max_memblock2.pro)


LOADDATA

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       LOADDATA

 PURPOSE:

       The purpose of this function is to read a selection of standard
       data sets that are found in the normal IDL distribution in the
       subdirectory $IDL_DIR/examples/data. At least 17 data sets are
       available in all categories of data. The user selects one of the
       possible data sets with the mouse.

 CATEGORY:

       File I/O.

 AUTHOR:

   FANNING SOFTWARE CONSULTING
   David Fanning, Ph.D.
   1645 Sheely Drive
   Fort Collins, CO 80526 USA
   Phone: 970-221-0438
   E-mail: davidf@dfanning.com
   Coyote's Guide to IDL Programming: http://www.dfanning.com/

 CALLING SEQUENCE:

       If calling from the IDL command line:

          data = LoadData()

       If calling from within a widget program:

          data = LoadData(Cancel=cancelled, Group_Leader=event.top)

       If you know which data set you want, you can load it directly:

          data = LoadData(7)

 OPTIONAL INPUTS:

       selection : The number of the data selection. Values start at 1,
           and go up to the number of data sets available (currently 17).

 KEYWORD PARAMETERS:

       CANCEL : An output keyword that is 1 of the use clicked the CANCEL
           button and 0 otherwise.

              data = Loaddata(Cancel=cancelled)
              IF cancelled THEN RETURN

        GROUP_LEADER: The group leader of the widget. This keyword
           is required if you wish LOADDATA to be a modal widget program.
           (Which you *always* do when calling it from a widget program.)

        IMAGES: Set this keyword if you only want to select 2D image
           data sets. Note that the selection number does *not* change
           just because fewer data sets are available in the selection
           widget.

 COMMON BLOCKS:
       None.

 SIDE EFFECTS:
       None.

 RESTRICTIONS:
       None.

 EXAMPLE:

       To load the world elevation data set:

       image = LoadData(7)

 MODIFICATION HISTORY:

       Written by:  David W. Fanning, 5 March 1999.
       Added some additonal random data capability. 29 April 99. DWF
       Added IMAGES keyword. 31 March 2000. DWF.
       Fixed a problem with the CANCEL button. 25 Oct 2002. DWF.
       Added new JPEG, DICOM, TIFF, and PGN images. 30 Oct 2002. DWF.
       Modified old program units to work with IDL strict arrays. 29 June 2003. DWF

(See spedas_gui/utilities/loaddata.pro)


LOAD_DATA

[Previous Routine] [Next Routine] [List of Routines]
 A program for loading data files used in the ITT VIS course
 <i>Introduction to IDL</i>.

 @param name {in}{required}{type=string} The name of a dataset, entered
  as a string.
 @keyword list {optional}{type=boolean} Set this keyword to return a list
  of available datasets.
 @returns A requested dataset.
 @examples
 <pre>
 IDL> dem = load_data('lvdem')
 IDL> isurface, dem
 </pre>
 @pre This file must be in the same directory as the course files.
 @uses READ_ASOS, GET_INTRO_DIR
 @requires IDL 5.3
 @author Mike Galloy and Mark Piper, RSI, 2003
 @history
  2004-08, MP: Uses SOURCEROOT instead of SET_TRAINING_DIRECTORY
  2005-10, MP: Added 'ladem' and 'laimage'
  2005-10, MP: Replaced SOURCEROOT and <i>!training</i> with
               GET_INTRO_DIR function

(See spedas_gui/utilities/load_data.pro)


MAKECOLORTABLE

[Previous Routine] [Next Routine] [List of Routines]

NAME: makecolortable

PURPOSE:
  makes the color table file for the spedas gui 

CALLING SEQUENCE:
   makecolortable

EFFECTS:
  overwrites the file spedas/spd_ui/utilities/spd_gui_colors.tbl

$LastChangedBy: nikos $
$LastChangedDate: 2016-10-18 16:31:28 -0700 (Tue, 18 Oct 2016) $
$LastChangedRevision: 22141 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/makecolortable.pro $

(See spedas_gui/utilities/makecolortable.pro)


NUM_TO_STR_PAD

[Previous Routine] [Next Routine] [List of Routines]
Procedure: num_to_str_pad
                
Purpose:
  This is a very basic operation that gets repeated a lot in date file output.
  This takes a number as input and pads zeros on the front so that the number outputs
  at fixed field width.
  
Inputs:
  val:  The number to be converted
  len: The final length requested
  
Keywords:
  pad:  Select a character other than '0' with which to pad
  integral: Normally, if val is a floating point type, if will add a .00, If this keyword is set, forces no decimal points.
  
Notes:
  1. For a while I resisted putting this in the distribution as it seemed too specific an operation,
  but at the point when I was considering implementing this routine for a 4th time in a separate
  namespace, I just decided to go ahead and add this instead.
  
  2. There is no error checking to determine if the input is wider than 'len'
  
  3. Currently floating point inputs will produce unreliable results.

Example:

  date_str = num_to_str_pad(year,4)+num_to_str_pad(mon,2)+num_to_str_pad(day,2)

 $LastChangedBy: nikos $
 $LastChangedDate: 2016-10-19 15:27:17 -0700 (Wed, 19 Oct 2016) $
 $LastChangedRevision: 22151 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/num_to_str_pad.pro $

(See spedas_gui/utilities/num_to_str_pad.pro)


OPEN_SPEDAS_DOCUMENT

[Previous Routine] [Next Routine] [List of Routines]
PRO:
  open_spedas_document

PURPOSE:

 opens a spedas document

Inputs:
  info: info struct from main gui event handler
  filename:name of the file
  nodelete:indicates that preexisting data should not be deleted during read
  
Outputs:
  statuscode: negative value indicates failure, 0 indicates success
  statusmsg: a message to be returned in the event of an error


$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/open_spedas_document.pro $

(See spedas_gui/utilities/open_spedas_document.pro)


OPEN_SPEDAS_TEMPLATE

[Previous Routine] [Next Routine] [List of Routines]
PRO:
  open_spedas_template

PURPOSE:

 opens a spedas template

Inputs:
  filename:name of the file
  
Outputs:
  statuscode: negative value indicates failure, 0 indicates success
  statusmsg: a message to be returned in the event of an error
  template: the template object


$LastChangedBy: egrimes $
$LastChangedDate: 2015-04-09 11:52:06 -0700 (Thu, 09 Apr 2015) $
$LastChangedRevision: 17264 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/open_spedas_template.pro $

(See spedas_gui/utilities/open_spedas_template.pro)


PICKCOLOR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       PICKCOLOR

 PURPOSE:

       A modal dialog widget allowing the user to select
       the RGB color triple specifying a color. The return
       value of the function is the color triple specifying the
       color or the "name" of the color if the NAME keyword is set.

 AUTHOR:
       FANNING SOFTWARE CONSULTING:
       David Fanning, Ph.D.
       1645 Sheely Drive
       Fort Collins, CO 80526 USA
       Phone: 970-221-0438
       E-mail: davidf@dfanning.com
       Coyote's Guide to IDL Programming: http://www.dfanning.com

 NOTE: This software has been heavily modified for usage by the SPEDAS GUI.  Please direct any errors to the SPEDAS software team 
 team and we will contact David Fanning, as necessary.

 CATEGORY:

       Graphics, Color Specification. See related program FSC_COLOR.

 CALLING SEQUENCE:

       color = PickColor(colorindex)

 RETURN VALUE:

       The return value of the function is a 1-by-3 array containing
       the values of the color triple that specifies the selected color.
       The color can be loaded, for example, in any color index:

           color = PickColor(240)
           TVLCT, color, 240

       The return value is the original color triple if the user
       selects the CANCEL button.

       IF the NAMES keyword is set, the return value of the function is
       the "name" of the selected color. This would be appropriate for
       passing to the FSC_COLOR program, for example.

 OPTIONAL INPUT POSITIONAL PARAMETERS:

       COLORINDEX: The color index of the color to be changed. If not
              specified the color index !D.Table_Size - 2 is used.
              The Current Color and the Color Sliders are set to the
              values of the color at this color index.

 OPTIONAL INPUT KEYWORD PARAMETERS:

       GROUP_LEADER: The group leader for this widget program. This
              keyword is required for MODAL operation. If not supplied
              the program is a BLOCKING widget. Be adviced, however, that
              the program will NOT work if called from a blocking widget
              program, unless a GROUP_LEADER is supplied.

       NAMES: Set this keyword to return the "name" of the selected color
              rather than its color triple.

       STARTINDEX: 88 pre-determined colors are loaded The STARTINDEX
              is the index in the color table where these 88 colors will
              be loaded. By default, it is !D.Table_Size - 89.

       TITLE: The title on the program's top-level base. By default the
              title is "Pick a Color".

 OPTIONAL INPUT KEYWORD PARAMETERS:

       CANCEL: A keyword that is set to 1 if the CANCEL button is selected
              and to 0 otherwise.

 COMMON BLOCKS:

       None.

 MODIFICATION HISTORY:
       Written by: David Fanning, 28 Oct 99.
       Added NAME keyword. 18 March 2000, DWF.
       Fixed a small bug when choosing a colorindex less than !D.Table_Size-17. 20 April 2000. DWF.
       Added actual color names to label when NAMES keyword selected. 12 May 2000. DWF.
       Modified to use 88 colors and FSC_COLOR instead of 16 colors and GETCOLOR. 4 Dec 2000. DWF.
       Now drawing small box around each color. 13 March 2003. DWF.
       Added CURRENTCOLOR keyword. 3 July 2003. DWF.
       Switched to object graphics, eliminated side-effects. 25 Jan 2011 pcruce.        

(See spedas_gui/utilities/pickcolor.pro)


PICKCOLORNAME

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       PICKCOLORNAME

 PURPOSE:

       The purpose of this program is to provide a blocking
       or modal widget interface for selecting a color "name".
       The program uses colors familiar to the FSC_COLOR program,
       and is often used to select a color name for passing to FSC_COLOR.

 AUTHOR:

       FANNING SOFTWARE CONSULTING:
       David Fanning, Ph.D.
       1645 Sheely Drive
       Fort Collins, CO 80526 USA
       Phone: 970-221-0438
       E-mail: davidf@dfanning.com
       Coyote's Guide to IDL Programming: http://www.dfanning.com

 CATEGORY:

       Graphics, Color Specification.

 CALLING SEQUENCE:

       colorName = PickColorName(startColorName)

 OPTIONAL INPUT PARAMETERS:

       startColorName: A string with the "name" of the color. Colors available are these:

                Almond   Antique White      Aquamarine           Beige          Bisque           Black
                  Blue     Blue Violet           Brown       Burlywood        Charcoal      Chartreuse
             Chocolate           Coral        Cornsilk            Cyan  Dark Goldenrod       Dark Gray
            Dark Green      Dark Khaki     Dark Orchid     Dark Salmon       Deep Pink     Dodger Blue
             Firebrick    Forest Green            Gold       Goldenrod            Gray           Green
          Green Yellow        Honeydew        Hot Pink      Indian Red           Ivory           Khaki
              Lavender      Lawn Green     Light Coral      Light Cyan      Light Gray    Light Salmon
          Light Yellow      Lime Green           Linen         Magenta          Maroon     Medium Gray
         Medium Orchid        Moccasin            Navy           Olive      Olive Drab          Orange
            Orange Red          Orchid  Pale Goldenrod      Pale Green          Papaya            Peru
                  Pink            Plum     Powder Blue          Purple             Red            Rose
            Rosy Brown      Royal Blue    Saddle Brown          Salmon     Sandy Brown       Sea Green
              Seashell          Sienna        Sky Blue      Slate Gray            Snow    Spring Green
            Steel Blue             Tan         Thistle          Tomato       Turquoise          Violet
            Violet Red           Wheat           White          Yellow


       The color WHITE is used if this parameter is absent.

 INPUT KEYWORD PARAMETERS:

       BOTTOM: The colors used in the program must be loaded somewhere
           in the color table. This keyword indicates where the colors
           start loading. By default BOTTOM is set equal to !D.Table_Size-NCOLORS-1.

       COLUMNS: Set this keyword to the number of columns the colors should
           be arranged in.

       FILENAME: The string name of an ASCII file that can be opened to read in
           color values and color names. There should be one color per row
           in the file. Please be sure there are no blank lines in the file.
           The format of each row should be:

              redValue  greenValue  blueValue  colorName

           Color values should be between 0 and 255. Any kind of white-space
           separation (blank characters, commas, or tabs) are allowed. The color
           name should be a string, but it should NOT be in quotes. A typical
           entry into the file would look like this:

               255   255   0   Yellow

       GROUP_LEADER: This identifies a group leader if the program is called
           from within a widget program. Note that this keyword MUST be provided
           if you want to guarantee modal widget functionality. (If you don't know
           what this means, believe me, you WANT to use this keyword, always.)

       INDEX: This keyword identifies a color table index where the selected color
           is to be loaded when the program exits. The default behavior is to restore
           the input color table and NOT load a color.

       TITLE: This keyword accepts a string value for the window title. The default
           is "Select a Color".

 OUTPUT KEYWORD PARAMETERS:

       CANCEL: On exit, this keyword value is set to 0 if the user selected
           the ACCEPT button. IF the user selected the CANCEL button, or
           closed the window in any other way, this keyword value is set to 1.

 COMMON BLOCKS:

       None.

 SIDE EFFECTS:

       Colors are loaded in the current color table. The input color table
       is restored when the program exits. This will only be noticable on
       8-bit displays. The startColorName is returned if the user cancels
       or destroys the widget before a selection is made. Users should
       check the CANCEL flag before using the returned color.

 EXAMPLE:

       To call the program from the IDL comamnd line:

         IDL> color = PickColorName("red") & Print, color

       To call the program from within a widget program:

         color = PickColorName("red", Group_Leader=event.top) & Print, color

 MODIFICATION HISTORY:

       Written by: David Fanning, 31 August 2000.
       Modified program to read colors from a file and to use more
         colors on 24-bit platforms. 16 October 2000. DWF.
       Added the COLUMNS keyword. 16 October 2000. DWF.
       Fixed a small problem with mapping a modal widget. 2 Jan 2001. DWF
       Now drawing small box around each color. 13 March 2003. DWF.

(See spedas_gui/utilities/pickcolorname.pro)


PROGRESSBAR__DEFINE

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       PROGRESSBAR__DEFINE

 PURPOSE:

       Creates a simple progress bar for indicating the progess of a looping
       operation in IDL.

 AUTHOR:

       FANNING SOFTWARE CONSULTING
       David Fanning, Ph.D.
       1645 Sheely Drive
       Fort Collins, CO 80526 USA
       Phone: 970-221-0438
       E-mail: davidf@dfanning.com
       Coyote's Guide to IDL Programming: http://www.dfanning.com

 CATEGORY:

       Utilities

 CALLING SEQUENCE:

       progressBar = Obj_New("PROGRESSBAR")

 ARGUMENTS:

       None.

 KEYWORDS:

       BACKGROUND:    The name of the background color of the progress bar. By default, "black".

       COLOR:         The name of the color for the progress bar. By default: "red".

       Possible color names are those defined by FSC_COLOR:

                Almond   Antique White      Aquamarine           Beige          Bisque           Black
                  Blue     Blue Violet           Brown       Burlywood        Charcoal      Chartreuse
             Chocolate           Coral        Cornsilk            Cyan  Dark Goldenrod       Dark Gray
            Dark Green      Dark Khaki     Dark Orchid     Dark Salmon       Deep Pink     Dodger Blue
             Firebrick    Forest Green            Gold       Goldenrod            Gray           Green
          Green Yellow        Honeydew        Hot Pink      Indian Red           Ivory           Khaki
              Lavender      Lawn Green     Light Coral      Light Cyan      Light Gray    Light Salmon
          Light Yellow      Lime Green           Linen         Magenta          Maroon     Medium Gray
         Medium Orchid        Moccasin            Navy           Olive      Olive Drab          Orange
            Orange Red          Orchid  Pale Goldenrod      Pale Green          Papaya            Peru
                  Pink            Plum     Powder Blue          Purple             Red            Rose
            Rosy Brown      Royal Blue    Saddle Brown          Salmon     Sandy Brown       Sea Green
              Seashell          Sienna        Sky Blue      Slate Gray            Snow    Spring Green
            Steel Blue             Tan         Thistle          Tomato       Turquoise          Violet
            Violet Red           Wheat           White          Yellow

       FAST_LOOP:     Set this keyword if what you are doing in the loop doesn't involve
                      any color operations and you want the progress bar to update as fast
                      as possible. With this keyword set, the program will eliminate extra
                      calls to FSC_COLOR, which can be slow if you are calling it, say,
                      10,000 times!

       GROUP_LEADER:  The group leader for the progress bar.

       NOCANCEL:      Set this keyword to eliminate the CANCEL button from the progres bar.

       PERCENT:       The initial percent on the progress bar. Used only if the START keyword is
                      also set.

       START:         Set this keyword if you wish to call the START method immediately upon initialization.

       TEXT:          The textual message that goes above the progress bar. By default:
                      "Operation in progress..."

       TITLE:         The title of the progress bar window. By default: "Progress Bar".

       XSIZE:         The X size of the progress bar itself. By default, 150 pixels.

       YSIZE:         The Y size of the progress bar itself. By default, 10 pixels.


 PROCEDURE:

       The user is responsible for starting, updating, checking for CANCEL events, and
       destroying the progress indicator. The sequence of commands might look
       like this:

          progressBar = Obj_New("PROGRESSBAR")
          progressBar -> Start
          FOR j=0,9 DO BEGIN
             IF progressBar -> CheckCancel() THEN BEGIN
                ok = Dialog_Message('The user cancelled operation.')
                RETURN
             ENDIF
             Wait, 0.5  ; Would probably be doing something ELSE here!
             progressBar -> Update, (j+1)*10
          ENDFOR
          progressBar -> Destroy

       See the example program at the end of this file for a working example of code.

 METHODS:

       CHECKCANCEL: This function method returns a 1 if the user has clicked
           the CANCEL button. Otherwise, it returns a 0.

          cancelled = progressBar -> CheckCancel()
          IF cancelled THEN progressBar->Destroy

       DESTROY: Destroys the progress bar widgets as well as the object.

          progressBar -> Destroy

       GETPROPERTY: Gets certain properties of the object.

          progressBar -> GetProperty, Color=currentColor

       SETPROPERTY: Allows the user to set certain properties of the object.

          progressBar -> SetProperty, Color='green'

       START: Puts the progress bar on the display and enables it to receive events.

          progressBar -> Start

       UPDATE: Updates the progress bar. Requires on argument, a number between 0
          and 100 that indicates the percent of progress bar that should be filled
          with a color. Can optional specify TEXT that is displayed above the progress
          bar.

          progressBar -> Update, 50
          progressBar -> Update, 50, Text='Operation 50% completed...'

 EXAMPLE:

       See the example program at the bottom of this file.

 RESTRICTIONS:

       Note that the progress bar cannot be run as a MODAL widget program and
       still capture CANCEL button events. Thus, the user *may* be able to generate events
       in the calling program while this progress bar is in operation.

 DEPENDENCIES:

       This program requires FSC_COLOR from the Coyote Library:

          http://www.dfanning.com/programs/fsc_color.pro

 MODIFICATION HISTORY:

       Written by:  David W. Fanning, 19 September 2002.
       Added TEXT keyword to Update method. 12 Nov 2002. DWF.
       Added FAST_LOOP keyword. 19 Dec 2002. DWF.
       Fixed a problem in where I was checking for CANCEL button event. 2 April 2003. DWF.
       Removed the XMANAGER call in the START method, since it wasn't needed. 7 October 2003. DWF.
       General maintenance updates. Added START keyword to INIT method to allow immediate
          starting upon initialization. Added better error handling and checking. 10 October 2003. DWF.
       Added ACCEPT button and CheckButton method. Modified Example program to demonstrate new
          functionality. 1 December 2003. DWF.
       Added XOFFSET and YOFFSET keywords. 4 March 2004. DWF.
       Removed obsolete STR_SEP and replaced with STRSPLIT. 27 Oct 2004. DWF.
       Added keyword keyword TITLE to Update method. 23 Feb 2005. Benjamin Hornberger
       Added BACKGROUND keyword. 22 Dec 2006. DWF.
       Added RETAIN=1 keyword to Widget_Draw command. 9 Dec 2007. DWF.

(See spedas_gui/utilities/progressbar__define.pro)


SAVEAS_ASCII.PRO

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 saveas_ascii.pro

PURPOSE:
 Saves SPEDAS Loaded Data variables in ASCII format.

INPUT & KEYWORDS:
  loadedData:  SPEDAS GUI loaded data object
  timefmt: Index specifying which format to use for time quantities.
           (passed to formatannotation.pro)
  fmt_code: Index specifying which format to use for data.
;           (passed to formatannotation.pro)
  timeStringFmt: String specifying a custom time format.
                 See TFORMAT keyword for time_string.pro for usage.
                 This keyword will override TIMEFMT.
  local_time: Flag to use local time instead of UTC, only valid if
              used with TIMESTRINGFMT

OTHER:
 Documentation for this procedure is incomplete.

(See spedas_gui/utilities/saveas_ascii.pro)


SAVE_DOCUMENT

[Previous Routine] [Next Routine] [List of Routines]
PRO:
  save_document

PURPOSE:

 saves a spedas document

Inputs:
  windowstorage: windowstorage object storing the draw tree to be save
  filename:name of the file

Outputs:
  statuscode: negative value indicates failure, 0 indicates success
  statusmsg: a message to be returned in the event of an error


$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/save_document.pro $

(See spedas_gui/utilities/save_document.pro)


SAVE_SPEDAS_TEMPLATE

[Previous Routine] [Next Routine] [List of Routines]
PRO:
  save_spedas_template

PURPOSE:

 saves a spedas template

Inputs:
  template:the template object to be saved
  filename:name of the file
  
Outputs:
  statuscode: negative value indicates failure, 0 indicates success
  statusmsg: a message to be returned in the event of an error


$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/save_spedas_template.pro $

(See spedas_gui/utilities/save_spedas_template.pro)


SOURCEPATH

[Previous Routine] [Next Routine] [List of Routines]
 This procedure returns the directory path associated with
 the routine calling this function.  This is useful for
 building applications that need to bootstrap resource and
 configuration files when the installation directory may not
 be known until run time.  Use this function in conjunction
 with FILEPATH to build platform-independent file path strings
 to your resources. <br>
 For example, <pre>
   b = WIDGET_BUTTON(tlb, /BITMAP, $
     VALUE=FILEPATH('up.bmp', ROOT = SourcePath(), SUBDIR = ['resource'])</pre>
 This will search for a file named "up.bmp" in the subdirectory named
 "resource" below the directory in which is located the source code
 (or SAVE file) for the routine containing the above statement.

 @Keyword
   Base_Name {out}{optional}{type=string}
       Set this keyword to a named variable to retrieve the
       base file name of the routine's source.

 @Returns
   The return value is the root directory path to
   the calling routine's source file or SAVE file.

 @Examples <pre>
   Create a file myapp.pro with the contents and run it.
     PRO MYAPP
     PRINT, SourcePath()
     END
   The printed output will be the full path to the
   directory in which abc.pro was created, regardless of
   IDL's current working directory.</pre>

 @History
   03/18/2005  JLP, RSI - Original version

(See spedas_gui/utilities/sourcepath.pro)


SOURCEROOT

[Previous Routine] [Next Routine] [List of Routines]
 The SOURCEROOT function, in combination with
 FILEPATH, allows a program to locate other
 files within a routine source file's related
 directory tree.
 <p>

 For example, an IDL routine file named
 C:\myapp\abc.pro calls SOURCEROOT as in
 <p>
 <pre>
    PRO ABC
    PRINT, SOURCEROOT()
    END
 </pre>
 the resulting output will be the string "C:\myapp".
 <p>

 If data associated with the application are in
 C:\myapp\mydata, a data file in this directory
 can be located via
 <p>
 <pre>
    IDL> datafile = FilePath('data.dat',$
    IDL>   ROOT=SourceRoot(), $
    IDL>   SUBDIR=['data'])
 </pre>
 The programmer can distribute the application
 to another user who may install the original directory tree
 into "D:\app".
 No code modifications would be required for this
 user to successfully locate the data.dat file.
 <p>

 If the routine ABC were compiled and saved to
 an IDL SAVE file and distributed, the SOURCEROOT
 function will return the path to the SAVE file
 instead.

 @author Jim Pendleton

(See spedas_gui/utilities/sourceroot.pro)


SPD_ADDSLASH

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_addslash
 
PURPOSE:
 Adds a trailing slash to a string, (usually a directory name) if it
 does not already have one. This is used to insure that local and
 remote directory names passed into load programs have the trailing
 slash. Note that even for windows, a '/' works, no need to use '\'
 
CALLING SEQUENCE:
 dirslash = spd_addslash(dir)
 
INPUT:
 dir = A string, usually a directory name.
 
OUTPUT:
 dirslash = dir+'/', if there is no slash, otherwise dir is unchanged
 
HISTORY:
 2012-08-15, jmm, jimm@ssl.berkeley.edu

 $LastChangedBy: nikos $
 $LastChangedDate: 2016-10-06 15:10:51 -0700 (Thu, 06 Oct 2016) $
 $LastChangedRevision: 22057 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_addslash.pro $

(See spedas_gui/utilities/spd_addslash.pro)


SPD_ARRANGE_PLOTS

[Previous Routine] [Next Routine] [List of Routines]
 NAME: ARRANGE_PLOTS

 PURPOSE:  Returns normal coordinates of plot position box, suitable for
          passing to PLOT, when you want to put many plots on one
          page. Differs from setting !p.multi, because plots can be
          put against one another with no space between. You can
          specify the outer margins through keywords, as well as the
          gaps between plots. By default, the margins are 0.1 left,
          0.05 right, 0.1 bottom, 0.07 top, and there is no gap
          between plots in either direction.
 
 INPUTS: 

 KEYWORD PARAMETERS: 
                     NX - the number of plots in the x direction

                     NY - the number of plots in the y direction

                     NPLOTS - the total number of plots

                     X0MARGIN, Y0MARGIN,
                      X1MARGIN, Y1MARGIN - the plot margins, in
                      normalized coordinates.

                     SQUARE - if set, the resulting plots are
                              square. The larger dimension is shrunk to
                              make squares.
 OUTPUTS: 
          x0, y0, x1, y1: These are named variables in which the
          left, lower, right, and upper boundaries, respectively of
          each plot are returned.



 EXAMPLE: 
   arrange_plots, x0, y0, x1, y1, nx=3
   erase
   for i=0,2 do plot,my_data,position=[x0[i],y0[i],x1[i],y1[i]],/noerase
          


 MODIFICATION HISTORY:
 Original from Li-Jen Chen at GSFC (forked for SPEDAS, 3/15/2016)

(See spedas_gui/utilities/spd_arrange_plots.pro)


SPD_BSHOCK

[Previous Routine] [Next Routine] [List of Routines]
ro spd_bshock,xsh,ysh ,ysh_west=ysh_west,short=short,xsh_max=xsh_max


gse or gsm does not matter because bow shock is  assumed  to be
                     ;rotationally symmetric

 This subroutine calculates the bow shock (X,Y) locations based on
 the Fairfield model (JGR, 1971 Vol 76 Oct-Dec p.6700). It outputs the location of the bow
 shock down to a very large distance (xmp_max=-300 Re)
 Aberration of 4 degrees is assumed
 Modification: calculates ysh for given xsh and returns only abs(ysh)
               Note, this provides flexibility with xsh_max
 $LastChangedBy: jimm $
 $LastChangedDate: 2015-07-24 12:07:30 -0700 (Fri, 24 Jul 2015) $
 $LastChangedRevision: 18247 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_bshock.pro $

(See spedas_gui/utilities/spd_bshock.pro)


SPD_CDF_COMPRESS

[Previous Routine] [Next Routine] [List of Routines]
PROCEDURE:
  spd_cdf_compress

PURPOSE:
  Compresses a cdf file using the CDF utility cdfconvert

PARAMETERS:
  file_in: (string) Input cdf file. Full path.

KEYWORDS:
  file_out: (string) Output cdf file. Full path. Optional if replace=1. 
  replace: if set, replace original file (file_out is ignored)
  cdfconvert: (string) Full path to cdfconvert executable
  cdfparams: (string) Parameters for cdfconvert
  cdf_tmp_dir: (string) Directory for temp files
  cdf_compress_error: (string) Returns error

OUTPUT:
  A compressed cdf file

NOTES:
  The default (optimal) options used with cdfconvert are available only with CDF 3.6.1 and later.
  
EXAMPLE:
  spd_cdf_compress, '/data/tha_l2_fgm_20110101_v01.cdf', file_out='/data/tha_l2_fgm_20110101_v01_temp.cdf', replace=1, cdf_compress_error=cdf_compress_error
  
  on windows:
  spd_cdf_compress, 'c:\temp\in.cdf', file_out='c:\temp\out.cdf', cdfconvert='C:\CDF_Distribution\cdf36_3-dist\bin\cdfconvert.exe', replace=1, $
         cdf_tmp_dir='c:\temp\', cdf_compress_error=cdf_compress_error

$LastChangedBy: nikos $
$LastChangedDate: 2017-07-13 10:45:04 -0700 (Thu, 13 Jul 2017) $
$LastChangedRevision: 23605 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_cdf_compress.pro $

(See spedas_gui/utilities/spd_cdf_compress.pro)


SPD_CHECK_TVAR (FUNCTION)

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
     spd_check_tvar (FUNCTION)

 PURPOSE:
     This routine check whether the given tplot variable TVAR exists in the
     memory. If not, return 0. Otherwise, then check whether it contains data
     of the current date. If yes, return 1. If not, return 0.

 ARGUMENTS:
     tvar: (INPUT, REQUIRED) The name of a tplot variable to be checked.

 KEYWORDS:
     None.

 HISTORY:
     2009-05-10: written by Jianbao Tao, in CU/LASP.

 $LastChangedBy: nikos $
 $LastChangedDate: 2016-10-06 15:10:51 -0700 (Thu, 06 Oct 2016) $
 $LastChangedRevision: 22057 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_check_tvar.pro $

(See spedas_gui/utilities/spd_check_tvar.pro)


SPD_FIND_FILE

[Previous Routine] [Next Routine] [List of Routines]
Procedure:
  spd_find_file

Purpose:
  Check for the existence of a file in the current path.

Calling Sequence:
  bool = spd_find_file(file_name)

Input:
  name: (string) Name of file including type appendix

Output:
  Return Value: (bool) true if one or more copies of the file found in your path, false if not

Notes:


$LastChangedBy: pcruce $
$LastChangedDate: 2015-01-12 12:57:20 -0800 (Mon, 12 Jan 2015) $
$LastChangedRevision: 16646 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_find_file.pro $

(See spedas_gui/utilities/spd_find_file.pro)


SPD_GRAPHICS_CONFIG

[Previous Routine] [Next Routine] [List of Routines]
  PRO spd_graphics_config

  This routine does just the graphics configuration for SPEDAS plug-ins.  It can be called from routines that
  need to have a guaranteed graphics configuration without forcing the rest of the plug-in initialization
  to be run.  This is done to avoid overwriting settings that may have been set by users later in their
  session.
  
  Keywords:
   colortable: overwrite the default colortable initialization

 $LastChangedBy: egrimes $
 $LastChangedDate: 2019-01-16 13:34:22 -0800 (Wed, 16 Jan 2019) $
 $LastChangedRevision: 26470 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_graphics_config.pro $

(See spedas_gui/utilities/spd_graphics_config.pro)


SPD_MPAUSE

[Previous Routine] [Next Routine] [List of Routines]
ro spd_mpause,xmp,ymp,ymp_west=ymp_west,short=short,xmp_max=xmp_max
gse or gsm does not matter because mpause assumed 
                     ;rotationally symmetric

 This subroutine calculates the magnetopause (X,Y) locations based on
 the Fairfield model (JGR, 1971). It outputs the location of the ma-
 gnetopause down to a very large distance (xmp_max=-300 Re)
 Aberation of 4 degrees is assumed
 $LastChangedBy: jimm $
 $LastChangedDate: 2015-07-24 12:07:30 -0700 (Fri, 24 Jul 2015) $
 $LastChangedRevision: 18247 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_mpause.pro $

(See spedas_gui/utilities/spd_mpause.pro)


SPD_NEW_COORDS

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_new_coords
 
PURPOSE:
 sets coordinate systems in the dlimits structure of input
 tplot variables from the CDF attributes, or alternatively, input
 keywords
 
CALLING SEQUENCE:
 spd_new_coords,vars,coords_in=coords_in
 
INPUT:
 vars = variable names
 
OUTPUT:
 none explicit, the dlimits structure of the variables are changed
 
KEYWORDS:
 coords_in = if set, then the coords for all vars will be set to this
             value (this is a scalar input)
             
HISTORY:
 12-feb-2008, jmm, jimm@ssl.berkeley.edu
 
$LastChangedBy: nikos $
$LastChangedDate: 2016-10-07 12:19:00 -0700 (Fri, 07 Oct 2016) $
$LastChangedRevision: 22071 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_new_coords.pro $

(See spedas_gui/utilities/spd_new_coords.pro)


SPD_NEW_UNITS

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_new_units
 
PURPOSE:
 sets units in the dlimits structure of input tplot variables from
 the CDF attributes, or alternatively, input keywords
 
CALLING SEQUENCE:
 spd_new_units,vars,units_in=units_in
 
INPUT:
 vars = variable names
 
OUTPUT:
 none explicit, the dlimits structure of the variables are changed
 
KEYWORDS:
 units_in = if set, then the units for all vars will be set to this
            value (this is a scalar input)
            
HISTORY:
 12-feb-2008, jmm, jimm@ssl.berkeley.edu
 
$LastChangedBy: nikos $
$LastChangedDate: 2016-10-07 12:01:16 -0700 (Fri, 07 Oct 2016) $
$LastChangedRevision: 22068 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_new_units.pro $

(See spedas_gui/utilities/spd_new_units.pro)


SPD_SMOOTH_TIME

[Previous Routine] [Next Routine] [List of Routines]
 PROCEDURE:
         spd_smooth_time

 PURPOSE:
         Smooths a tplot variable in time using a simple boxcar average
         This routine is essentially just a wrapper around the IDL smooth
         function that allows the /NAN keyword, unlike tsmooth_in_time

 KEYWORDS:
        newname: name of the tplot variable to store the data in; default is input_name+"_smth"
        nan: ignore NaNs in the input (treat as missing data)



$LastChangedBy: egrimes $
$LastChangedDate: 2017-07-27 09:01:57 -0700 (Thu, 27 Jul 2017) $
$LastChangedRevision: 23712 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_smooth_time.pro $

(See spedas_gui/utilities/spd_smooth_time.pro)


SPD_STRING_REPLACEN

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_string_replacen

PURPOSE:
 Find and replace for strings.
 
KEYWORDS:
 inString {in} {type=string}
            input string.
 findString {in} {type=string}
            find string. It can be a regular expression.
 replaceString {in} {type=string}
            replace string.

HISTORY:

$LastChangedBy:  $
$LastChangedDate:$
$LastChangedRevision:  $
$URL: $

(See spedas_gui/utilities/spd_string_replacen.pro)


SPD_STR_SPLIT

[Previous Routine] [Next Routine] [List of Routines]
Procedure:
  spd_str_split

Purpose:
  Splits strings and arrays of strings.
  Returns a string or an array of strings.

Calling Sequence:
  result = spd_str_split(str, pattern, /extract)

Input:
  str: (string) A string to be splitted
  pattern: (optional string) A patern to find and split (usually a single character).
                   If not given,
                   If the /extract keyword is used, the patern is not included in the result.


Output:
  Return Value: (string) An array of strings

Notes:
  Use spd_str_split instead of the IDL strsplit to split string arrays in SPEDAS.
  In IDL 8.x the strsplit function, when applied to an array of strings returns a LIST.
  LIST is a new type of variable that was introduced in IDL 8.0.
  SPEDAS has to be compatible with IDL 6.4 and IDL 7.x, so it cannot use LIST variables.

$LastChangedBy: nikos $
$LastChangedDate: 2016-04-25 10:54:54 -0700 (Mon, 25 Apr 2016) $
$LastChangedRevision: 20909 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_str_split.pro $

(See spedas_gui/utilities/spd_str_split.pro)


SPD_TPLOT_TRANGE

[Previous Routine] [Next Routine] [List of Routines]
Function:
  spd_tplot_trange

Purpose:
  Return the full or current tplot time range without
  unnecessary calls to other time procedures.

Calling Sequence:
  trange = spd_tplot_trange( [/current] )

Input:
  current:  Flag to return currently plotted time range.

Output:
  return value:  Two element double-prec. time range as stored by tplot.

Notes:
  This routine should not modify any variables in the tplot common block.


$LastChangedBy: aaflores $
$LastChangedDate: 2015-02-20 13:46:54 -0800 (Fri, 20 Feb 2015) $
$LastChangedRevision: 17020 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_tplot_trange.pro $

(See spedas_gui/utilities/spd_tplot_trange.pro)


SPD_UI_CALENDAR.PRO

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_calendar.pro

PURPOSE:
 Calendar selection widget for the GUI

CALLING SEQUENCE:
 spd_ui_calendar,title, otime, gui_id, startyear

INPUT:
 title: Title of the calendar window
 otime: Time object
 gui_id: Widget ID of the widget that called the calendar
 startyear: Start year in 'Year' list
 
 
HISTORY:

 $LastChangedBy: $
 $LastChangedDate: $
 $LastChangedRevision: $
 $URL: $

(See spedas_gui/utilities/spd_ui_calendar.pro)


SPD_UI_CALL_PLUGIN

[Previous Routine] [Next Routine] [List of Routines]
Procedure:
  spd_ui_call_plugin

Purpose:
  Opens specified GUI plugin window.

Calling Sequence:
  spd_ui_call_plugin, event, info

Input:
  event: event structure from plugin menu
  info: Main storage structure from GUI

Output:
  none

Notes:


$LastChangedBy: nikos $
$LastChangedDate: 2014-07-25 10:45:13 -0700 (Fri, 25 Jul 2014) $
$LastChangedRevision: 15610 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_call_plugin.pro $

(See spedas_gui/utilities/spd_ui_call_plugin.pro)


SPD_UI_CHECK_OVERLAP

[Previous Routine] [Next Routine] [List of Routines]
NAME:
  spd_ui_check_overlap

PURPOSE:
  Determins if any panels on the current
   page are overlapping.
  Prints message notifying user of those panels.

CALLING SEQUENCE:
  bool = spd_ui_check_overlap( panels, cwindow )

INPUT:
  panels: Array of current panel objects
  cwindow: Current window(page) object

OUTPUT:
  1 if overlaps are found, 0 otherwise

HISTORY:


(See spedas_gui/utilities/spd_ui_check_overlap.pro)


SPD_UI_CHECK_OVERWRITE_DATA

[Previous Routine] [Next Routine] [List of Routines]
 Name:
    spd_ui_check_overwrite_data

 Purpose:
    Used to check if data is already loaded in the GUI and queries the 
    user to see if they want to overwrite data if it is already loaded.

    This code was originally repeated in basically every load routine, so the
    purpose for this routine is to avoid repeated code
    
 Input:
    new_var: the new variable 
    loadedData: the loadedData object
    gui_id: widget ID of the parent widget
    statusBar: status bar object
    historyWin: history window object
    overwrite_selection: user's selection for the current query 
    overwrite_count: tracking the number of overwrites for saving/replaying SPEDAS documents
    
 Keywords:
    replay: set by the calling routine if the user is replaying a SPEDAS document
    overwrite_selections: an array containing the user's selections
    
    
;$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_check_overwrite_data.pro $

(See spedas_gui/utilities/spd_ui_check_overwrite_data.pro)


SPD_UI_CLEANUP_TPLOT

[Previous Routine] [Next Routine] [List of Routines]

NAME: spd_ui_cleanup_tplot

PURPOSE:
  Abstracts the oft-repeated operation which identifies new tplot variables,
  and identifies variables that should be deleted 

CALLING SEQUENCE:
   tnames_before = tnames('*',create_time=cn_before)
   thm_load_state ;some operation
   spd_ui_cleanup_tplot,tnames_before,create_time_before=cn_before,del_vars=del_vars,new_vars=new_vars

Inputs:
  tnames_before: a list of tplot names from before the operation in question
  
Keywords:
  create_time_before(optional,input): This is an array of the create times associated with tnames_before
                                      This argument is only required if you want the list of new_vars
  new_vars(output):  This will output an array of new tplot variable names, if create_time_before was specified                                      
  del_vars(output):  This will output an array of tplot variable names to delete.

Note:  
  The list of new variables and delete variables is generally not the same. Delete variables contains only names
  that did not exist before the operation, whereas new variables may contain names that pre-existed but were overwritten

$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_cleanup_tplot.pro $

(See spedas_gui/utilities/spd_ui_cleanup_tplot.pro)


SPD_UI_COMBOBOX

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
   SPD_UI_COMBOBOX

 PURPOSE:
   IDL combobox doesn't actually support null strings('') as entries
   in the combobox. Entering a null string will generate an error that halts
   execution.  This is a simple wrapper compound widget to fix this problem
   by making the box appear empty when it is not.

 CALLING SEQUENCE:
   Result = SPD_UI_COMBOBOX
 
 KEYWORD PARAMETERS:
  Exactly the same as normal combobox
 EVENT STRUCTURE:
  The same as normal combobox, with the exception that the
  event structure is called 'SPD_UI_COMBOBOX'

(See spedas_gui/utilities/spd_ui_combobox.pro)


SPD_UI_DATA_MINMAX

[Previous Routine] [Next Routine] [List of Routines]
NAME:
  spd_ui_data_minmax

PURPOSE:
  Returns a two-element array containing the mininum and maximum values
  contained in the loadedData quantity specified by the NAME positional
  parameter.

CALLING SEQUENCE:
  minmax = spd_ui_data_minmax(loadedData, options)

INPUT:
  loadedData: The loadedData object.
  name: The name of the variable (a string).
  
KEYWORDS:
  none

OUTPUT:
  [minRange, maxRange]: A two-element array containing the mininum and maximum
                        values of the quantity specified by the NAME parameter.

(See spedas_gui/utilities/spd_ui_data_minmax.pro)


SPD_UI_DIALOG_PICKFILE_SAVE_WRAPPER

[Previous Routine] [Next Routine] [List of Routines]

  Name: SPD_UI_DIALOG_PICKFILE_SAVE_WRAPPER
  
  Purpose: Wrapper for the IDL routine dialog_pickfile. Checks for invalid characters in the filename.
  
  Inputs: Any keywords that need to be passed on to dialog_pickfile (see note 1 below for special cases)

  Output: Filename ('' if dialog is cancelled)
  
  NOTE: 
  1. This routine should not be used if the multiple_files keyword is being passed to dialog_pickfile
        as ';' will be flagged as invalid if used to separate file names.
  2. This routine doesn't check for all characters that can cause problems on windows. A large number of cases
    are already screened by dialog_pickfile on windows (cases that cause no problems on linux).
  
  
$LastChangedBy: egrimes $
$LastChangedDate: 2014-07-10 15:57:22 -0700 (Thu, 10 Jul 2014) $
$LastChangedRevision: 15553 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_dialog_pickfile_save_wrapper.pro $

(See spedas_gui/utilities/spd_ui_dialog_pickfile_save_wrapper.pro)


SPD_UI_DO_NUDGE

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_do_nudge

PURPOSE:
 Abstracted nudge data operation


CALLING SEQUENCE:
 spd_ui_do_nudge,

INPUT:
  gui_id = widget id of the widget that called this program
  info = the info structure of the Main GUI
OUTPUT:
  fail=fail
HISTORY:
$LastChangedBy: aaflores $
$LastChangedDate: 2015-04-29 13:24:31 -0700 (Wed, 29 Apr 2015) $
$LastChangedRevision: 17451 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_do_nudge.pro $

(See spedas_gui/utilities/spd_ui_do_nudge.pro)


SPD_UI_FIX_PERFORMANCE

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_fix_performance

PURPOSE:
 This fixes issue IDL-68782:
 in Linux, some drawing operations are very slow for IDL 8.3
 another solution would be win = obj_new("idlgrwindow", LINE_QUALITY=0)
 it might be useful for windows, too

HISTORY:

$LastChangedBy: $
$LastChangedDate: $
$LastChangedRevision: $
$URL: $

(See spedas_gui/utilities/spd_ui_fix_performance.pro)


SPD_UI_GETLENGTHVARS

[Previous Routine] [Next Routine] [List of Routines]
FUNCTION:
  spd_ui_getlengthvars

PURPOSE:

  helper function for formatannotation
   
Inputs:

Example:

$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_getlengthvars.pro $

(See spedas_gui/utilities/spd_ui_getlengthvars.pro)


SPD_UI_GET_COMBOBOX_SELECT

[Previous Routine] [Next Routine] [List of Routines]
 Purpose:
   Return the index of specified combobox widget's current selection.

 Arguments:
   BASE:  Widget ID of base existing above the combobox in the widget heirarchy
   UNAME: Uname of the combobox widget
 
 Return Value:
   Index of the specified combobox widget's current selection.
 
 Usage:
   idx = spd_ui_get_combobox_select(top_base, 'my_combobox')
 
 Notes:


(See spedas_gui/utilities/spd_ui_get_combobox_select.pro)


SPD_UI_GET_PANELS

[Previous Routine] [Next Routine] [List of Routines]
NAME:
  spd_ui_get_panels

PURPOSE:
  Generic GUI function for returning the panel names and panel objects given a window

CALLING SEQUENCE:
  panel_names = spd_ui_get_panels(window, panelObjs = panelObjs)

INPUT:
  window: current active window, see the following example:
  
EXAMPLE:
  window = windowStorage->getActive()
  panel_names = spd_ui_get_panels(window, panelObjs=panelObjs)

OUTPUT:
  names of the panels on the current page, or a single element array 
  with 'No Panels' if there aren't any panels on the current page

$LastChangedBy: egrimes $
$LastChangedDate: 2014-07-24 12:19:29 -0700 (Thu, 24 Jul 2014) $
$LastChangedRevision: 15603 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_get_panels.pro $

(See spedas_gui/utilities/spd_ui_get_panels.pro)


SPD_UI_INTERPOLATE

[Previous Routine] [Next Routine] [List of Routines]
NAME:
  spd_ui_interpolate

PURPOSE:
  Interpolates over x-axis of active data and adds new data to
  loaded data object.  Intended to be called from spd_ui_dproc.

CALLING SEQUENCE:
  spd_ui_interpolate, result, loadedData, historywin, statusbar

INPUT:
  loadedData: Loaded data object.
  historywin: History window reference.
  statusbar: Status bar reference.
  guiid: If set and valid, will make user queries part of GUI widget hierarchy.
  result: Anonymous structure returned by spd_ui_interpol_options:
          {
           num: Number of points for the result when not matching.
           cad: Cadence of the result when using that option
           match: Flag indicating to interpolate to another variable's abcissa.
           matchto: Group name of variable to match to.
           extrap: Flags for extrapolation type: [none, last value, NaN]
           suffix: Suffix to create new data group with.
           limit: Flag indicating time limits.
           trange: Time range array containing desired time limits.
           type: Flags for interpolation type: [linear,quadratic,lsquadratic,spline]
           ntype: Flag to use number or cadence (0,1 respectively)
           ok: (not used) Indicates spd_ui_interpol_options was successful
           }

HISTORY:

(See spedas_gui/utilities/spd_ui_interpolate.pro)


SPD_UI_LOGIN_WIDGET

[Previous Routine] [Next Routine] [List of Routines]
 FUNCTION:
         spd_ui_login_widget
         
 PURPOSE:
         Prompt the user for their login information
 
 KEYWORDS:
         title: title of the login window
         group_leader: widget ID of the leader widget
         note: add a note to the bottom of the widget
 
 OUTPUT:
         Returns a structure containing the username, password, 
         and a tag 'save' that specifies whether the user wants 
         to save the login information
 
 NOTES:
         Written by Doug Lindholm at LASP, forked for SPEDAS on 8/20/2015. 
         Minor modifications by Aaron Flores @ IGPP
         3/15/2016: updated to accept 'note' keyword - allows for 
           adding a note to the bottom of the widget
         
$LastChangedBy: egrimes $
$LastChangedDate: 2017-02-15 15:48:51 -0800 (Wed, 15 Feb 2017) $
$LastChangedRevision: 22793 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_login_widget.pro $

(See spedas_gui/utilities/spd_ui_login_widget.pro)


SPD_UI_MATCH_BACKGROUND

[Previous Routine] [Next Routine] [List of Routines]
A procedure to match the background color of a bitmap to that of the OS GUI.
Will be used to match icon backgrounds

INPUT
bitmap_array : three dimensional byte array representing an RGB bitmap image; read_bmp(<img>,/rgb)
topbase : the top base widget of window housing the bitmap/widget

(See spedas_gui/utilities/spd_ui_match_background.pro)


SPD_UI_MESSAGE

[Previous Routine] [Next Routine] [List of Routines]
Procedure:
  spd_ui_message

Purpose:
  Output messages to the history window, status bar, and/or dialog message pop-up.
 
Calling sequence:
  spd_ui_message, message [,sb=sb] [,hw=hw] [,dialog=dialog]
 
Inputs:
  message: output message string
  sb: GUI status bar object reference (optional)
  hw: GUI history window object reference (optional) 
  dialog: flag to pop-up dialog message (optional) 
 
Notes: 
  _extra can be used to pass keywords to:
     -history window
     -dialog_message

$LastChangedBy: aaflores $
$LastChangedDate: 2014-02-14 12:17:24 -0800 (Fri, 14 Feb 2014) $
$LastChangedRevision: 14382 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_message.pro $

(See spedas_gui/utilities/spd_ui_message.pro)


SPD_UI_MULTICHOICE_HISTORY

[Previous Routine] [Next Routine] [List of Routines]
 This program creates a string for the history array when multiple
 datatypes, spacecraft or stations are chosen, for use in the
 spedas_w_event routine
$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_multichoice_history.pro $

(See spedas_gui/utilities/spd_ui_multichoice_history.pro)


SPD_UI_OPEN_URL

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_open_url

PURPOSE:
 Open an url in the default web browser.
 If a browser executable is specified in the Configuration Settings, then prefer that.
 On UNIX platforms, the script tries to find an appropriate browser.


CALLING SEQUENCE:
 spd_ui_open_url, url

INPUT:
    url : string, the full url, for example http://spedas.org

$LastChangedBy:        $
$LastChangedDate:      $
$LastChangedRevision:    $
$URL:    $

(See spedas_gui/utilities/spd_ui_open_url.pro)


SPD_UI_PART_GETSPEC_REPLAY

[Previous Routine] [Next Routine] [List of Routines]
 Purpose: Wrapper to thm_part_products, to be called during replay by spd_ui_call_sequence  Modularizes
 some operations. 
 
 Inputs:    probe,$
            dtype,$
            trange, $
            start_angle,$
            suffix,$ 
            outputs, $
            phi,$
            theta,$
            pitch,$
            gyro, $
            energy,$
            regrid, $
            fac_type,$
            sst_cal, $
            sst_method_clean, $
            statusbar,$
            historyWin,$
            loadedData
 


Version:
 $LastChangedBy: jimm $
 $LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
 $LastChangedRevision: 14326 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_part_getspec_replay.pro $

(See spedas_gui/utilities/spd_ui_part_getspec_replay.pro)


SPD_UI_PLUGIN_MENU

[Previous Routine] [Next Routine] [List of Routines]
Procedure:
  spd_ui_plugin_menu


Purpose:
  Builds GUI plugin menu.


Calling Sequence:
  spd_ui_plugin_menu, menu_id [,plugin_menu_items]


Input:
  menu_id: Widget ID of the parent menu into which plugin buttons will be placed.
  plugin_menu_items: an array of structures containing the plugin menu items; loaded via pluginManager->getPluginMenus()
  uname: (optional) Specified uname of widget buttons (default='GUI_PLUGIN')


Output:


Notes:



$LastChangedBy: aaflores $
$LastChangedDate: 2015-04-24 18:45:02 -0700 (Fri, 24 Apr 2015) $
$LastChangedRevision: 17429 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_plugin_menu.pro $

(See spedas_gui/utilities/spd_ui_plugin_menu.pro)


SPD_UI_PLUGIN_REPLAY

[Previous Routine] [Next Routine] [List of Routines]
Procedure:
  spd_ui_plugin_replay

Purpose:
  Replays data modification operations performed by GUI plugins when loading GUI documents.

Calling Sequence:
  spd_ui_plugin_replay, procedure, parameters, loaded_data, history_window, status_bar

Input:
  procedure: (string) name of plugin routine to be called
  parameters: (stuct/int) Anonymous struct conforming to keywords for named routine
                          or 0 if no keywords specified.
  loaded_data: (obj) reference to loaded_data object
  history_window: (obj) reference to history window object
  status_bar: (obj) reference to status bar object

Output:
  none

Notes:


$LastChangedBy: egrimes $
$LastChangedDate: 2014-05-05 13:39:26 -0700 (Mon, 05 May 2014) $
$LastChangedRevision: 15050 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_plugin_replay.pro $

(See spedas_gui/utilities/spd_ui_plugin_replay.pro)


SPD_UI_PROMPT_WIDGET.PRO

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_prompt_widget.pro

PURPOSE:
  Simple standardized popup, for yes/no,yes_to_all,no_to_all,cancel
  Like dialog_message, but allows additional options, and automatically logs/prompts

CALLING SEQUENCE:
  result = spd_ui_prompt_widget(parent,statusbar,historywin,"Continue?")

INPUT:
  parent: Widget Id of parent widget(Note that if parent is invalid, it will block until a response is received. See documentation for XMANAGER:NO_BLOCK keyword)
  statusBar: The statusbar object to which output should be sent, if unavailable pass null object(obj_new())
  historywin:  The historywin object to which output should be sent if unavailable pass null object(obj_new())
  promptText=promptText: The text of the prompt to be displayed to the user.
  no=no :Include "No" Button
  yes=yes: Include "Yes" Button
  allno=allno: Include "No To All" button.
  allyes=allyes: Include "Yes To All" button.
  cancel=cancel: Include "Cancel" button.
  ok=ok: Include "Ok" button.
  maxwidth=maxwidth: Control the width at which the prompt starts wrapping prompt text.
  defaultValue=defaultValue: Set to string to return as default. (Occurs during error or close by clicking "X")
                    Normally default is value of right-most button.
  title=title:  Set window title to string.

  traceback=traceback: Do a trace to calling location

  frame_attr=frame_attr: Control the window appearance via TLB_FRAME_ATTR.  Values:
  1 Base cannot be resized, minimized, or maximized.
  2 Suppress display of system menu.
  4 Suppress title bar.
  8 Base cannot be closed.
  16 Base cannot be moved.
  For multiple effects add values together.
  There are differences between Linux and Windows, so test before using. TLB_FRAME_ATTR=8 seems to work everywhere.

OUTPUT:
 Returns an all lower case string with the response text:
 "no","yes","yestoall","notoall","cancel","ok"


NOTES:
  1. If no button keywords are set, "ok" is used.
  2. Based heavily on deprecated gui load subroutine: spd_ui_load_clob_prompt:
  3. If a parent widget is unavailable, statusbar, or historywin unavailable, you can pass null values
    result = spd_ui_prompt_widget(0l,obj_new(),obj_new(),prompt="Continue?")
    This call will interact with other widgets in a way that is similar to a call to error_message


HISTORY:
$LastChangedBy: aaflores $
$LastChangedDate: 2015-03-12 17:12:52 -0700 (Thu, 12 Mar 2015) $
$LastChangedRevision: 17128 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_prompt_widget.pro $

(See spedas_gui/utilities/spd_ui_prompt_widget.pro)


SPD_UI_PWRSPC

[Previous Routine] [Next Routine] [List of Routines]
NAME:
  spd_ui_pwrspc

PURPOSE:
  Creates power spectra from GUI variables that are active in the Process Data
  window and loads the spectra into the loadedData object.  Directly calls
  PWRSPC and DPWRSPC to create the spectra.  Intended to be called from
  SPD_UI_DPROC.

CALLING SEQUENCE:
  spd_ui_pwrspc, options,invars, loadedData, historyWin, statusBar,guiID

INPUT:
  options: Structure that is output from SPD_UI_PWRSPC_OPTIONS containing
           keyword options for PWRSPC and DPWRSPC.
  loadedData: The loadedData object.
  historyWin: The history window object.
  statusBar: The status bar object for the Data Processing window.
  guiid:  The widget id for the GUI so that it can display prompts with the correct layering.
  
KEYWORDS:
  

OUTPUT:
  none

(See spedas_gui/utilities/spd_ui_pwrspc.pro)


SPD_UI_RUN_CALC

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_run_calc

PURPOSE:
 Function that interprets program for spd_ui_calculate

CALLING SEQUENCE:
 spd_ui_run_calc,programtext,loadeddata,historywin,statusbar,error=error

INPUT:
 programText: array of strings, text of program
 loadeddata: the loaded data object
 historywin: the historywin object
 statusbar: the statusbar object

OUTPUT:
 error=error: set to named variable, will be 0 on success, will be set to error struct returned by calc.pro on failure

HISTORY:
$LastChangedBy: pcruce $
$LastChangedDate: 2014-05-27 16:29:10 -0700 (Tue, 27 May 2014) $
$LastChangedRevision: 15236 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_run_calc.pro $

(See spedas_gui/utilities/spd_ui_run_calc.pro)


SPD_UI_SBAR_HWIN_UPDATE

[Previous Routine] [Next Routine] [List of Routines]
 Name
     spd_ui_sbar_hwin_update
     
 Purpose:
     Wrapper routine for updating the status bar and history window objects
     also handles dialog messages from error handlers

 Arguments:
     state: state structure from the top level widget, contains the history window and status bar objects
     message: string or array of strings to write to the history window and status bar objects
     /nohistoryWin: flag to turn off updating the history window object
     /nostatusBar: flag to turn off updating the status bar object
     /error: flag indicating an error sent us here
     err_msgbox_title: title to be displayed in the error msgbox
 
$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_sbar_hwin_update.pro $

(See spedas_gui/utilities/spd_ui_sbar_hwin_update.pro)


SPD_UI_SET_CURSOR

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_set_cursor

PURPOSE:
  Replaces the cursor on non-windows machines
    
CALLING SEQUENCE:
 spd_ui_set_cursor,win
 
INPUT:
 win: an IDLgrWindow

OUTPUT:
 
HISTORY:
$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_set_cursor.pro $

(See spedas_gui/utilities/spd_ui_set_cursor.pro)


SPD_UI_SPDF_REPLAY

[Previous Routine] [Next Routine] [List of Routines]

  spdfcdawebchooser GUI load code is structured in such a way that it would be very difficult to abstract.
  Instead just rewriting the load process in a way that isn't so dependent on pseudo-globals(via state)
  and gui elements, this way we can replay the data without needing the UI to be instantiated.

  In the future, we may want to consider replacing the cdawebchooser GUI code with this.
  as I'm forking a little bit here.
  
$LastChangedBy: nikos $
$LastChangedDate: 2018-02-27 16:20:33 -0800 (Tue, 27 Feb 2018) $
$LastChangedRevision: 24791 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_spdf_replay.pro $

(See spedas_gui/utilities/spd_ui_spdf_replay.pro)


SPD_UI_SPINNER

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
   SPD_UI_SPINNER

 PURPOSE:
   A compound 'spinner' widget for editing numerical values.
   Consists of up and down buttons and a text field for display
   and direct editing.

 CALLING SEQUENCE:
   Result = SPINNER(parent)

 KEYWORD PARAMETERS:
    VALUE: Initial value (float/double)
    INCREMENT: Numerical ammount spinner value is incremented/decremented
    LABEL: String to be used as the widget's label
    UNITS: String containing the units to appear to the right of the value
    SPIN_TIME: Delay before 'spinning' when clicking up/down buttons
    XLABELSIZE: Size of the text label in points
    getXLabelSize: Set to a named variable to pass back the length of the
                   spinner's label in points
    TEXT_BOX_SIZE: Size of the text box in # of characters
    TOOLTIP: String to be used at the buttons' tooltip
    MAX_VALUE: The maximum allowed value for the spinner (optional)
    MIN_VALUE: The minimum allowed value for the spinner (optional)

 EVENT STRUCTURE:
   When the field is modified (either directly) or by the
   up/down buttons, the following event is returned:
       {ID: id, TOP: top, HANDLER: handler, VALUE: value, VALID: valid}

   VALUE: formatted, double precision number from widget's text field;
          value is NaN when the text widget contains an unrecognizable
          or unconvertable number
   VALID: 0 if value is not a recogizable/convertable number, or if buttons
         attempt to go outside min/max range, 1 otherwise


 GETTING/SETTINGS VALUES
   Using get_value from widget_control will return the same as the VALUE
    field in the event structure.
   The set_value procedure expects numerical input (e.g. doubles, floats, ints).
   Use spd_ui_spinner_set_max_value/spd_ui_spinner_set_min_value to change max_value, min_value.
   spd_ui_spinner_get_max_value/spd_ui_spinner_get_min_value return MAX_VALUE, MIN_VALUE

 NOTES:
 (lphilpott 06/10/11)
 Setting the max_value and min_value will restrict the use of the up and down buttons
 to reach values outside that range.
 They do not impact on values that are typed into the text field (these
 should be handled by the calling function) or any values simply passed to the set_value procedure.
 (lphilpott 06/15/11)
 Use of VALID: VALID=0 if the event is not valid. This includes non-recognizable
 numbers but ALSO cases where the user tries to go outside the allowed min-max range using up and down buttons.
 If the user clicks the up/down button and reaches the limit, the value returned is the limit value and valid=0.
 If the user enters a non numerical value the value returned is NAN and valid=0
 This allows the calling procedure to issue messages to the user such as invalid entry based on both VALUE and VALID.
 Note: valid = 0 only if the starting value of the spinner is at the bounds. If the user holds down the buttons and reaches
 the bounds valid = 1. This avoids problems where existing code processes events only if event.valid = 1.

 I have not used max and min to restrict values typed into the field due to the difficulty of knowing when the user
 has finished typing - do not want to reset the value while the user is still entering it.

 When using a spinner cases where the user types in a value outside the allowed range need to be handled, also
 invalid entries. If necessary warning messages should be issued to user when they use the up/down buttons and have
 reached the allowed limits.


 Added get and set procedures for min and max designed to be called externally, eg. spd_ui_spinner_set_max_value
 Idea is to allow max and min to be set in case they need to be changed after spinner is created (e.g for range spinners where allowed values
 depend on whether scaling is linear or log)

HISTORY:

$LastChangedBy:  $
$LastChangedDate:  $
$LastChangedRevision:  $
$URL: $

(See spedas_gui/utilities/spd_ui_spinner.pro)


SPD_UI_SPLASH_WIDGET

[Previous Routine] [Next Routine] [List of Routines]
NAME:
         spd_ui_splash_widget

PURPOSE:
         Widget for the SPEDAS GUI splash screen

OUTPUT:
         ID of the widget, so it can be destroyed by the GUI 
         on load

$LastChangedBy: egrimes $
$LastChangedDate: 2015-07-20 14:44:54 -0700 (Mon, 20 Jul 2015) $
$LastChangedRevision: 18181 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_splash_widget.pro $

(See spedas_gui/utilities/spd_ui_splash_widget.pro)


SPD_UI_TIMEFIX

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_timefix
PURPOSE:
 Will fix an input time string of yyyy-mm-dd hh:mm:ss.xxxx if there
 is only 1 digit in the day or hour or second, etc.
 Will also return an error message, if the months, days, hours,
 seconds are not valid.
 2011-07-20, added comment to test post-commit emails, jmm
 2011-11-04, added comment to test post-commit emails, jmm
$LastChangedBy: egrimes $
$LastChangedDate: 2015-03-12 11:46:50 -0700 (Thu, 12 Mar 2015) $
$LastChangedRevision: 17121 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_timefix.pro $
unction spd_ui_timefix, time_in, progobj = progobj, _extra = _extra

(See spedas_gui/utilities/spd_ui_timefix.pro)


SPD_UI_TIME_WIDGET.PRO

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_time_widget.pro

PURPOSE:
 Compound widget used to generate standardized time selection ui,
  for all tabs in the load data window.

CALLING SEQUENCE:
 widgetid = spd_ui_time_widget(parent,statusBar,historyWin,timeRangeObj=timeRangeObj,uvalue=uvalue,uname=uname, oneday=oneday)

INPUT:
 parent: ID of base in which compound widget will sit
 statusBar: statusBar Object for reporting errors and user info
 historywin: historywin object for reporting errors and user info
 timeRangeObj: a spd_ui_time_range storing the range that will be used.
               If provided, the compound widget will mutate this object
 uvalue:  Assign a user value to this widget
 uname: assign a user name to this widget
 oneday: flag to determine whether the range is fixed to one day
 startyear: optional keyword to change the start year for the calendar widget
            default start year is 2000

OUTPUT:
 This widget's id
 
NOTES:
1. Returns events of the form:
      return_struct = {time_widget,id:0l,top:0l,handler:0l,timerange:obj_new(),error:0}

2. Can use get_value and set_value keywords with widget control, to return the time range object
  that this compound widget mutates.

HISTORY:

 $LastChangedBy: jimmpc1 $
 $LastChangedDate: 2019-03-21 14:07:02 -0700 (Thu, 21 Mar 2019) $
 $LastChangedRevision: 26875 $
 $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_time_widget.pro $

(See spedas_gui/utilities/spd_ui_time_widget.pro)


SPD_UI_TRACK_ONE

[Previous Routine] [Next Routine] [List of Routines]
Procedure:
  spd_ui_track_one

Purpose:
  Switches on single-panel tracking by setting the appropriate flags
  in the GUI's main storage structure.  This is a temporary solution
  until the tracking options can be re-worked. 

Calling Sequence:
  spd_ui_track_one, info_struct

Input:
  info_struct:  The GUI's main storage structure.

Output:
  none

Notes:
  Moved from call sequence object.
    5/5/2014: Changed input argument from pointer to the main GUI's info struct to the actual struct. 

$LastChangedBy:  $
$LastChangedDate:  $
$LastChangedRevision:  $
$URL:  $

(See spedas_gui/utilities/spd_ui_track_one.pro)


SPD_UI_UPDATE_PROGRESS

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_update_progress
PURPOSE:
 Write a string into the progress widget for the THEMIS GUI
CALLING SEQUENCE:
 spd_ui_update_progress, gui_id, input_string
INPUT:
 gui_id = the widget_id for the GUI
 input_string = a string to be displayed
OUTPUT:
 None
KEYWORDS:
 message_wid = id for any other message widgets that you might like
                to display the messages
HISTORY:
 jmm, 9-may-2007, jimm@ssl.berkeley.edu
 jmm, 5-mar-2008, added multiple lines, and the ability to show in
                  multiple message widgets.
$LastChangedBy: nikos $
$LastChangedDate: 2014-06-17 11:59:06 -0700 (Tue, 17 Jun 2014) $
$LastChangedRevision: 15392 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_update_progress.pro $

(See spedas_gui/utilities/spd_ui_update_progress.pro)


SPD_UI_USINGEXPONENT

[Previous Routine] [Next Routine] [List of Routines]
FUNCTION:
  spd_ui_usingexponent

PURPOSE:

  Used to determine if any of a set of inputs will be put into exponential notation
   
Inputs:
The data struct is an input to format annotation
data.exponent values:
0: autoformat
1: decimal
2: scientific
3: base^x



4: hexadecimal

Outputs:
Determine format type:

(See spedas_gui/utilities/spd_ui_usingexponent.pro)


SPD_UI_VALIDATE_FILE

[Previous Routine] [Next Routine] [List of Routines]
PRO:
  spd_ui_validate_file

PURPOSE:

  Verifies file read/write permissions and file availability

Inputs:
  filename:name of the file

Outputs:
  statuscode: negative value indicates failure, 0 indicates success
  statusmsg: a message to be returned in the event of an error

Keywords:
  write: validate for save

$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_validate_file.pro $

(See spedas_gui/utilities/spd_ui_validate_file.pro)


SPD_UI_WAVELET

[Previous Routine] [Next Routine] [List of Routines]
NAME:
 spd_ui_wavelet
PURPOSE:
 wavelet transform of the input tplot variables, fist calls split_vec
 to split up any multi-component vectors.
CALLING SEQUENCE:
 spd_ui_wavelet, vnames, new_names, polar=polar,_extra=_extra
INPUT:
 vnames = the tplot variable names to transform
OUTPUT:
 new_names = new variable names generated by the process
KEYWORDS:
 polar = if set, passes the /polar keyword into the split_vec
         procedure, new variable names for 3-d data will be polar,
         and not '_x','_y','_z'
 gui_id = the main GUI widget ID, for messages
 messw_id = the dproc widget id, for messages
 temp_names = the names of temporary variables create by the process
              so that they can be reliably removed
 maxpoints = the maximum number of time samples in the original data
             (default = 2^15 if not set)
HISTORY:
 12-mar-2007, jmm, jimm@ssl.berkeley.edu
 5-jun-2007, jmm, no longer handles history
 7-may-2008, W. Michael Feuerstein, Test for >= 2 finite points.
 11-may-2009,prc(pcruce@igpp.ucla.edu) added keyword to return the  
             names of temporary variables created in process

$LastChangedBy: nikos $
$LastChangedDate: 2016-03-07 10:51:31 -0800 (Mon, 07 Mar 2016) $
$LastChangedRevision: 20343 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_wavelet.pro $

(See spedas_gui/utilities/spd_ui_wavelet.pro)


SPD_UI_WV_MEMORY_TEST

[Previous Routine] [Next Routine] [List of Routines]
NAME:
spd_ui_wv_memory_test
PURPOSE: 
Estimate of memory used by a wavelet transform. The estimated memory
use is 36.26*n_elements(transformed_data.y). The factor of 36 comes
from testing different transforms for different types of data, for
fgm (FGH and FGS) data, 2009-01-14, for ESA L2 density data
2007-07-07, and for GMAG data for both of those days. Note that this
is currently only useful for default inputs.
INPUT: 
 t = the time array
OUTPUT: 
 jv = the number of wavelets to eventually be used, jv must be GT 1
      for the wavelet2 routine to work.
 prange = the default period range of the output, 
          nyquist period, 5% of time period]
 info_txt = Informational test array, with memory sizes, and jv value
HISTORY:
 10-jun-2009, jmm, added jv output to test for a reasonable number of
 wavelets later.
 19-Jan-2015, jmm, Changed the name and separated into a new file
 6-feb-2015, jmm, Added frange output, for the default frequency range
$LastChangedBy: jimm $
$LastChangedDate: 2015-02-09 13:28:13 -0800 (Mon, 09 Feb 2015) $
$LastChangedRevision: 16922 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_ui_wv_memory_test.pro $

(See spedas_gui/utilities/spd_ui_wv_memory_test.pro)


SPD_UNIQ

[Previous Routine] [Next Routine] [List of Routines]
Procedure:
  spd_uniq

Purpose:
  Implement most common usage of IDL uniq() function

Calling Sequence:
  output = spd_uniq(array)

Input:
  array: An array

Return Value:
  Sorted, unique values from input

Notes:
  


$LastChangedBy: aaflores $
$LastChangedDate: 2015-08-06 20:01:43 -0700 (Thu, 06 Aug 2015) $
$LastChangedRevision: 18419 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/spd_uniq.pro $

(See spedas_gui/utilities/spd_uniq.pro)


STRINGISNUM

[Previous Routine] [Next Routine] [List of Routines]
Function: stringIsNum

Purpose: Determines if a given string is a number or not.

Inputs: str : the string to be checked

Output: Returns 1 if yes, or if no


EXAMPLES:
 if stringIsNum(s) then print, strtrim(double(s),2)
 
  % Compiled module: STRINGISNUM.
SPEDAS> print,stringisnum('hello')
       0
SPEDAS> print,stringisnum('1.234')
       1
SPEDAS> print,stringisnum('1.234e4')
       1
SPEDAS> print,stringisnum('1B')
       1
SPEDAS> print,stringisnum(' 1 ')
       1
SPEDAS> print,stringisnum(' 1Hello ')
       0
SPEDAS> print,stringisnum(' 1D ')
       1
SPEDAS> print,stringisnum(' Hello ')
       0
       
  Notes: String must be only a numerical string and leading or trailing whitespace
         if true is to be returned.  Strings that include other non-numerical characters
         will return false even if they have numerical sub-strings.



$LastChangedBy: jimm $
$LastChangedDate: 2014-02-11 10:54:32 -0800 (Tue, 11 Feb 2014) $
$LastChangedRevision: 14326 $
$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_4_0/spedas_gui/utilities/stringisnum.pro $

(See spedas_gui/utilities/stringisnum.pro)


TEST_LEAP_YR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
       test_leap_yr
 CALLING SEQUENCE:
       lyr=test_leap_yr(iyr,modays=modays)
 PURPOSE:
       Determines whether a given year is a leap year, and
       returns the number of days in every month
 INPUT:
       iyr = The year, as an integer
 OUTPUT:
       lyr= 1 if iyr is a leap year and 0 if not
 KEYWORDS:
       modays= the number of days in each month
       modays= [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] for
       a leap yr, [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] otherwise
 HISTORY:
       Written 19-OCt-93 by JM
       Rewritten, 9-jul-2007, jmm

(See spedas_gui/utilities/spd_ui_timefix.pro)


TVIMAGE

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
     TVIMAGE

 PURPOSE:
     This purpose of TVIMAGE is to enable the TV command in IDL
     to be a completely device-independent and color-decomposition-
     state independent command. On 24-bit displays color decomposition
     is always turned off for 8-bit images and on for 24-bit images.
     The color decomposition state is restored for those versions of
     IDL that support it (> 5.2). Moreover, TVIMAGE adds features
     that TV lacks. For example, images can be positioned in windows
     using the POSITION keyword like other IDL graphics commands.
     TVIMAGE also supports the !P.MULTI system variable, unlike the
     TV command. TVIMAGE was written to work especially well in
     resizeable graphics windows. Note that if you wish to preserve
     the aspect ratio of images in resizeable windows, you should set
     the KEEP_ASPECT_RATIO keyword, described below. TVIMAGE works
     equally well on the display, in the PostScript device, and in
     the Printer and Z-Graphics Buffer devices. The TRUE keyword is
     set automatically to the correct value for 24-bit images, so you
     don't need to specify it when using TVIMAGE.

 AUTHOR:
       FANNING SOFTWARE CONSULTING:
       David Fanning, Ph.D.
       1645 Sheely Drive
       Fort Collins, CO 80526 USA
       Phone: 970-221-0438
       E-mail: davidf@dfanning.com
       Coyote's Guide to IDL Programming: http://www.dfanning.com/

 CATEGORY:
     Graphics display.

 CALLING SEQUENCE:

     TVIMAGE, image

 INPUTS:
     image:    A 2D or 3D image array. It should be byte data.

       x  :    The X position of the lower-left corner of the image.
               This parameter is only recognized if the TV keyword is set.
               If the Y position is not used, X is taken to be the image
               "position" in the window. See the TV command documenation
               for details.

       y  :    The Y position of the lower-left corner of the image.
               This parameter is only recognized if the TV keyword is set.

 KEYWORD PARAMETERS:

     BACKGROUND:   This keyword specifies the background color. Note that
               the keyword ONLY has effect if the ERASE keyword is also
               set or !P.MULTI is set to multiple plots and TVIMAGE is
               used to place the *first* plot.

     ERASE:    If this keyword is set an ERASE command is issued
               before the image is displayed. Note that the ERASE
               command puts the image on a new page in PostScript
               output.

     _EXTRA:   This keyword picks up any TV keywords you wish to use.

     HALF_HALF: If set, will tell CONGRID to extrapolate a *half* row
               and column on either side, rather than the default of
               one full row/column at the ends of the array.  If you
               are interpolating images with few rows, then the
               output will be more consistent with this technique.
               This keyword is intended as a replacement for
               MINUS_ONE, and both keywords probably should not be
               used in the same call to CONGRID.

     KEEP_ASPECT_RATIO: Normally, the image will be resized to fit the
               specified position in the window. If you prefer, you can
               force the image to maintain its aspect ratio in the window
               (although not its natural size) by setting this keyword.
               The image width is fitted first. If, after setting the
               image width, the image height is too big for the window,
               then the image height is fitted into the window. The
               appropriate values of the POSITION keyword are honored
               during this fitting process. Once a fit is made, the
               POSITION coordiates are re-calculated to center the image
               in the window. You can recover these new position coordinates
               as the output from the POSITION keyword.

     MARGIN:   A single value, expressed as a normalized coordinate, that
               can easily be used to calculate a position in the window.
               The margin is used to calculate a POSITION that gives
               the image an equal margin around the edge of the window.
               The margin must be a number in the range 0.0 to 0.333. This
               keyword is ignored if the POSITION or OVERPLOT keywords are
               used. It is also ignormed when TVImage is executed in a
               multi-plot window, EXCEPT if it's value is zero. In this
               special case, the image will be drawn into its position in
               the multi-plot window with no margins whatsoever. (The
               default is to have a slight margin about the image to separate
               it from other images or graphics.


     MINUS_ONE: The value of this keyword is passed along to the CONGRID
               command. It prevents CONGRID from adding an extra row and
               column to the resulting array, which can be a problem with
               small image arrays.

     NOINTERPOLATION: Setting this keyword disables the default bilinear
               interpolation done to the image when it is resized. Nearest
               neighbor interpolation is done instead. This is preferred
               when you do not wish to change the pixel values of the image.
               This keyword must be set, for example, when you are displaying
               GIF files that come with their own non-IDL color table vectors.

     NORMAL:   Setting this keyword means image position coordinates x and y
               are interpreted as being in normalized coordinates. This keyword
               is only valid if the TV keyword is set.

     OVERPLOT: Setting this keyword causes the POSITION keyword to be ignored
               and the image is positioned in the location established by the
               last graphics command. For example:

                    Plot, Findgen(11), Position=[0.1, 0.3, 0.8, 0.95]
                    TVImage, image, /Overplot

     POSITION: The location of the image in the output window. This is
               a four-element floating array of normalized coordinates of
               the type given by !P.POSITION or the POSITION keyword to
               other IDL graphics commands. The form is [x0, y0, x1, y1].
               The default is [0.0, 0.0, 1.0, 1.0]. Note that this can
               be an output parameter if the KEEP_ASPECT_RATIO keyword is
               used.

     TV:       Setting this keyword makes the TVIMAGE command work much
               like the TV command, although better. That is to say, it
               will still set the correct DECOMPOSED state depending upon
               the kind of image to be displayed (8-bit or 24-bit). It will
               also allow the image to be "positioned" in the window by
               specifying the coordinates of the lower-left corner of the
               image. The NORMAL keyword is activated when the TV keyword
               is set, which will indicate that the position coordinates
               are given in normalized coordinates rather than device
               coordinates.

               Setting this keyword will ensure that the keywords
               KEEP_ASPECT_RATIO, MARGIN, MINUS_ONE, MULTI, and POSITION
               are ignored.

 OUTPUTS:
     None.

 SIDE EFFECTS:
     Unless the KEEP_ASPECT_RATIO keyword is set, the displayed image
     may not have the same aspect ratio as the input data set.

 RESTRICTIONS:
     If the POSITION keyword and the KEEP_ASPECT_RATIO keyword are
     used together, there is an excellent chance the POSITION
     parameters will change. If the POSITION is passed in as a
     variable, the new positions will be returned in the same variable
     as an output parameter.

     If a 24-bit image is displayed on an 8-bit display, the
     24-bit image must be converted to an 8-bit image and the
     appropriate color table vectors. This is done with the COLOR_QUAN
     function. The TVIMAGE command will load the color table vectors
     and set the NOINTERPOLATION keyword if this is done. Note that the
     resulting color table vectors are normally incompatible with other
     IDL-supplied color tables. Hence, other graphics windows open at
     the time the image is display are likely to look strange.

 EXAMPLE:
     To display an image with a contour plot on top of it, type:

        filename = FILEPATH(SUBDIR=['examples','data'], 'worldelv.dat')
        image = BYTARR(360,360)
        OPENR, lun, filename, /GET_LUN
        READU, lun, image
        FREE_LUN, lun

        TVIMAGE, image, POSITION=thisPosition, /KEEP_ASPECT_RATIO
        CONTOUR, image, POSITION=thisPosition, /NOERASE, XSTYLE=1, $
            YSTYLE=1, XRANGE=[0,360], YRANGE=[0,360], NLEVELS=10

     To display four images in a window without spacing between them:

     !P.Multi=[0,2,2]
     TVImage, image, Margin=0
     TVImage, image, Margin=0
     TVImage, image, Margin=0
     TVImage, image, Margin=0
     !P.Multi = 0

 MODIFICATION HISTORY:
      Written by:     David Fanning, 20 NOV 1996.
      Fixed a small bug with the resizing of the image. 17 Feb 1997. DWF.
      Removed BOTTOM and NCOLORS keywords. This reflects my growing belief
         that this program should act more like TV and less like a "color
         aware" application. I leave "color awareness" to the program
         using TVIMAGE. Added 24-bit image capability. 15 April 1997. DWF.
      Fixed a small bug that prevented this program from working in the
          Z-buffer. 17 April 1997. DWF.
      Fixed a subtle bug that caused me to think I was going crazy!
          Lession learned: Be sure you know the *current* graphics
          window! 17 April 1997. DWF.
      Added support for the PRINTER device. 25 June 1997. DWF.
      Extensive modifications. 27 Oct 1997. DWF
          1) Removed PRINTER support, which didn't work as expected.
          2) Modified Keep_Aspect_Ratio code to work with POSITION keyword.
          3) Added check for window-able devices (!D.Flags AND 256).
          4) Modified PostScript color handling.
      Craig Markwart points out that Congrid adds an extra row and column
          onto an array. When viewing small images (e.g., 20x20) this can be
          a problem. Added a Minus_One keyword whose value can be passed
          along to the Congrid keyword of the same name. 28 Oct 1997. DWF
      Changed default POSITION to fill entire window. 30 July 1998. DWF.
      Made sure color decomposition is OFF for 2D images. 6 Aug 1998. DWF.
      Added limited PRINTER portrait mode support. The correct aspect ratio
          of the image is always maintained when outputting to the
          PRINTER device and POSITION coordinates are ignored. 6 Aug 1998. DWF
      Removed 6 August 98 fixes (Device, Decomposed=0) after realizing that
          they interfere with operation in the Z-graphics buffer. 9 Oct 1998. DWF
      Added a MARGIN keyword. 18 Oct 1998. DWF.
      Re-established Device, Decomposed=0 keyword for devices that
         support it. 18 Oct 1998. DWF.
      Added support for the !P.Multi system variable. 3 March 99. DWF
      Added DEVICE, DECOMPOSED=1 command for all 24-bit images. 2 April 99. DWF.
      Added ability to preserve DECOMPOSED state for IDL 5.2 and higher. 4 April 99. DWF.
      Added TV keyword to allow TVIMAGE to work like the TV command. 11 May 99. DWF.
      Added the OVERPLOT keyword to allow plotting on POSITION coordinates
         estabished by the preceding graphics command. 11 Oct 99. DWF.
      Added automatic recognition of !P.Multi. Setting MULTI keyword is no
         longer required. 18 Nov 99. DWF.
      Added NOINTERPOLATION keyword so that nearest neighbor interpolation
         is performed rather than bilinear. 3 Dec 99. DWF
      Changed ON_ERROR condition from 1 to 2. 19 Dec 99. DWF.
      Added Craig Markwardt's CMCongrid program and removed RSI's. 24 Feb 2000. DWF.
      Added HALF_HALF keyword to support CMCONGRID. 24 Feb 2000. DWF.
      Fixed a small problem with image start position by adding ROUND function. 19 March 2000. DWF.
      Updated the PRINTER device code to take advantage of available keywords. 2 April 2000. DWF.
      Reorganized the code to handle 24-bit images on 8-bit displays better. 2 April 2000. DWF.
      Added BACKGROUND keyword. 20 April 2000. DWF.
      Fixed a small problem in where the ERASE was occuring. 6 May 2000. DWF.
      Rearranged the PLOT part of code to occur before decomposition state
         is changed to fix Background color bug in multiple plots. 23 Sept 2000. DWF.
      Removed MULTI keyword, which is no longer needed. 23 Sept 2000. DWF.
      Fixed a small problem with handling images that are slices from 3D image cubes. 5 Oct 2000. DWF.
      Added fix for brain-dead Macs from Ben Tupper that restores Macs ability to
         display images. 8 June 2001. DWF.
      Fixed small problem with multiple plots and map projections. 29 June 2003. DWF.
      Converted all array subscripts to square brackets. 29 June 2003. DWF.
      Removed obsolete STR_SEP and replaced with STRSPLIT. 27 Oct 2004. DWF.
      Small modification at suggestion of Karsten Rodenacker to increase size of
         images in !P.MULTI mode. 8 December 2004. DWF.
      Minor modifications on Karsten Rodenacker's own account concerning margination
         and TV behaviour. 8 December 2004. KaRo

(See spedas_gui/utilities/tvimage.pro)


TVREAD

[Previous Routine] [List of Routines]
 NAME:
       TVREAD

 PURPOSE:

       To get accurate screen dumps with the IDL command TVRD on 24-bit
       PC and Macintosh computers, you have to be sure to set color
       decomposition on. This program adds that capability automatically.
       In addition, the program will optionally write BMP, GIF, JPEG,
       PICT, PNG, and TIFF color image files of the screen dump.

 AUTHOR:

       FANNING SOFTWARE CONSULTING
       David Fanning, Ph.D.
       1645 Sheely Drive
       Fort Collins, CO 80526 USA
       Phone: 970-221-0438
       E-mail: davidf@dfanning.com
       Coyote's Guide to IDL Programming: http://www.dfanning.com

 CATEGORY:

       Graphics

 CALLING SEQUENCE:

       image = TVREAD(xstart, ystart, ncols, nrows)

       The returned image will be a 2D image on 8-bit systems and
       a 24-bit pixel interleaved true-color image on 24-bit systems.
       A -1 will be returned if a file output keyword is used (e.g., JPEG, TIFF, etc.).

 OPTIONAL INPUTS:

       XSTART -- The starting column index.  By default, 0.

       YSTART -- The starting row index. By default, 0.

       NCOLS -- The number of columns to read. By default, !D.X_Size - XSTART

       NROWS -- The number of rows to read. By default, !D.Y_Size - YSTART.

 KEYWORD PARAMETERS:

       BMP -- Set this keyword to write the screen dump as a color BMP file.

       CANCEL -- An output keyword set to 1 if the user cancels out of a
          filename dialog. Set to 0 otherwise.

       COLORS -- If a 24-bit image has to be quantized, this will set the number
          of colors in the output image. Set to 256 by default. Applies to BMP,
          GIF, PICT, and PNG formats written from 24-bit displays.(See the
          COLOR_QUAN documentation for details.)

       CUBE -- If this keyword is set to a value between 2 and 6 the color
          quantization will use a cubic method of quantization. Applies to BMP,
          GIF, PICT, and PNG formats written from 24-bit displays.(See the
          COLOR_QUAN documentation for details.)

       DITHER -- If this keyword is set the quantized image will be dithered.
          Applies to BMP, GIF, PICT, and PNG formats written from 24-bit displays.
          (See the COLOR_QUAN documentation for details.)

       FILENAME -- The base name of the output file. (No file extensions;
           they will be added automatically.) This name may be changed by the user.

              image = TVREAD(Filename='myfile', /JPEG)

           No file will be written unless a file output keyword is used
           (e.g., JPEG, TIFF, etc.) in the call. By default the FILENAME is
           set to "idl". The file extension will be set automatically to match
           the type of file created.

       GIF -- Set this keyword to write the screen dump as a color GIF file.

       JPEG -- Set this keyword to write the screen dump as a color JPEG file.

       NODIALOG -- Set this keyword if you wish to avoid the DIALOG_PICKFILE
           dialog that asks you to name the output file. This keyword should be
           set, for example, if you are processing screens in batch mode.

       ORDER -- Set this keyword to determine the image order for reading the
           display. Corresponds to !Order and set to such as the default.

       PICT -- Set this keyword to write the screen dump as a color PICT file.

       PNG -- Set this keyword to write the screen dump as a color PNG file.

       TIFF -- Set this keyword to write the screen dump as a color TIFF file.

       TRUE -- Set this keyword to the type of interleaving you want. 1 = Pixel
           interleaved, 2 = row interleaved, 3 = band interleaved.

       QUALITY -- This keyword sets the amount of compression for JPEG images.
           It should be set to a value between 0 and 100. It is set to 75 by default.
           (See the WRITE_JPEG documentation for details.)

       WID -- The index number of the window to read from. The current graphics window
           (!D.Window) is selected by default. An error is issued if no windows are
           currently open on a device that supports windows.

       _EXTRA -- Any keywords that are appropriate for the WRITE_*** routines are
           also accepted via keyword inheritance.

 COMMON BLOCKS:

       None

 RESTRICTIONS:   Requires IDL 5.2 and higher.

 MODIFICATION HISTORY:

       Written by David W. Fanning, 9 AUG 2000.
       Added changes to make the program more device independent. 16 SEP 2000. DWF.
       Removed GIF file support for IDL 5.4 and above. 18 JAN 2001. DWF.
       Added NODIALOG keyword. 28 MAR 2001. DWF.
       Added an output CANCEL keyword. 29 AUG 2001. DWF.
       Added ERROR_MESSAGE code to file. 17 DEC 2001. DWF.
       Added ORDER keyword. 25 March 2002. DWF.
       Now create 24-bit PNG files if reading from a 24-bit display. 11 May 2002. DWF.
       Now create 24-bit BMP files if reading from a 24-bit display. 23 May 2002. DWF.
       Removed obsolete STR_SEP and replaced with STRSPLIT. 27 Oct 2004. DWF.

(See spedas_gui/utilities/tvread.pro)