Metropoli BBS
VIEWER: wbdialog.c MODE: TEXT (ASCII)
/***************************************************************************
 *		  Copyright (C) 1994  Charles P. Peterson                  *
 *	     4007 Enchanted Sun, San Antonio, Texas 78244-1254             *
 *              Email: Charles_P_Peterson@fcircus.sat.tx.us                *
 *                                                                         *
 *		  This is free software with NO WARRANTY.                  *
 *	      See gfft.c, or run program itself, for details.              *
 *		      Support is available for a fee.                      *
 ***************************************************************************
 *
 * Program:     gfft--General FFT analysis
 * File:        wbdialog.c
 * Purpose:     workbench GUI dialog
 * Author:      Charles Peterson (CPP)
 * History:     19-Nov-1993 CPP; Created.
 *              4-Aug-94 CPP (1.04); Filenames may contain spaces
 *              5-Aug-94 CPP (1.05); Make append apply to name shown
 *              5-Aug-94 CPP (1.10); Minor interface improvements
 *              31-Aug-94 CPP (1.13); Fix display of pre-set LogX and LogY
 *              14-Dec-94 CPP (1.17); Fix display of gadgets w. >4 colors
 *               5-Jan-95 CPP (1.18); Use system default font if possible
 *              20-Jan-1994 CPP (1.23); Use icon tooltypes
 *              26-Jan-95 CPP (1.26); Allow largest possible font size
 *              27-Jan-95 CPP (1.27); Report window open failure
 *              28-Jan-95 CPP (1.28); Nag requester
 *              28-Jan-95 CPP (1.29); Labeled radio buttons
 *              28-Jan-95 CPP (1.30); Tall buttons for emphasis
 *               6-Feb-95 CPP (1.31); Progress Requester
 *
 * Comments:    Workbench GUI.  Amiga Dependent!
 *              We must exit from here on all fatal errors!
 *              (Note: might have been started from CLI.  In that case,
 *               don't expect to find any workbench message or icons.
 *               Read and write files and options might already have been
 *               selected through CLI arguments or commands.)
 */

#ifdef AMIGA  /* This module is AMIGA dependent */

#include <stdio.h>     /* sprintf() */
#include <string.h>

/* #define ONLY_OK_TALL */

/*
 * Amiga includes
 */
#include <exec/types.h>
#include <workbench/workbench.h>
#include <intuition/intuition.h>
#include <clib/intuition_protos.h>
#include <clib/exec_protos.h>
#include <dos.h> /* chkabort() */

/*
 * GFFT includes
 */
#include "gfft.h"
#include "settings.h"  /* for testing */
#include "wbench.h"
#include "format.h"

/*
 * special global variables defined here
 */
struct Window *dialog_window_p = NULL;
struct Gadget *message_gadgetp;

/*
 * Semi-global variables
 */
extern LONG num_files;
extern LONG file_index;
extern double LoopTimeElapsed;
extern int Tooltype_Errors;

/*
 * Strings from messages[.c|.h]
 */
extern const char NameAuthor[];
extern const char VersionData[];
extern const char Copyright[];
extern char *Please_Select_Read_File_S;
extern char *Set_Parameters_Then_Ok_S;
extern char *Attempting_to_Perform_FFT_S;
extern char *Set_Sampling_Rate_S;
extern char *Verify_Sampling_Rate_S;
extern char *Dialog_Window_Title;

/*
 * From wbtools
 */
extern BOOLEAN Old_Intuition;
extern short Screen_Font_Height;
extern short Font_Height;
extern short Font_Width;

/*
 * From Amiga Hardware Reference Manual
 */
#define RAW_HELP_KEY 0x5f

/*
 * Window definitions
 */
#define FONT_SIZE 8

#define MAX_TEXT_COLS 75  /* This turns out to be the max we can get with screen width = 640 */

#define BUTTON_ROWS 9       /* This allows a small console window beneath window when height = 200 */

#define SELECT_READ_FILE 1
#define SELECT_PARAMETERS 2
#define PERFORMING_FFT 3
#define REMEMBER_MESSAGE 4
#define SET_RATE 5
#define VERIFY_RATE 6

/*
 * Static variables for this file
 */
static struct Gadget *octave_2_gadgetp, *octave_3_gadgetp;
static struct Gadget *octave_4_gadgetp, *octave_5_gadgetp;
static struct Gadget *octave_6_gadgetp, *octave_7_gadgetp;
static struct Gadget *octave_low_gadgetp, *octave_hi_gadgetp;
static struct Gadget *ok_gadgetp, *CLI_gadgetp, *next_gadgetp;
static struct Gadget *copyright_gadgetp, *select_read_gadgetp;
static struct Gadget *read_file_gadgetp, *con_read_gadgetp;
static struct Gadget *one_shot_gadgetp, *repeat_only_gadgetp;
static struct Gadget *channel_gadgetp, *rate_gadgetp, *bins_gadgetp;
static struct Gadget *bins_max_gadgetp, *overlap_gadgetp, *pad_gadgetp;
static struct Gadget *interleave_gadgetp, *no_interleave_gadgetp;
static struct Gadget *rectangle_gadgetp, *welch_gadgetp, *parzen_gadgetp;
static struct Gadget *b_h_74db_gadgetp, *triangle_gadgetp;
static struct Gadget *b_h_92db_gadgetp;
static struct Gadget *hamming_gadgetp, *combine_plots_gadgetp;
static struct Gadget *hann_gadgetp, *pink_gadgetp, *def_write_gadgetp;
static struct Gadget *write_file_gadgetp, *cancel_write_gadgetp;
static struct Gadget *low_f_gadgetp, *high_f_gadgetp, *time_segs_gadgetp;
static struct Gadget *plot_gadgetp, *log_x_gadgetp, *log_y_gadgetp;
static struct Gadget *amplitude_gadgetp, *power_gadgetp, *db_gadgetp;
static struct Gadget *mean_gadgetp, *smoothing_gadgetp, *help_gadgetp;
static struct Gadget *no_smoothing_gadgetp, *sq_smoothing_gadgetp;
static struct Gadget *re_plot_gadgetp, *re_output_gadgetp;
static struct Gadget *time3d_gadgetp, *cut_plots_gadgetp;
static struct Gadget *append_gadgetp, *cal_gadgetp;
static struct Gadget *spectrum_select_gadgetp;

static struct Requester *progress_rp = NULL;
static struct Requester *reout_progress_rp = NULL;

APTR *last_address = NULL;

#define DONT_KNOW -1
static ULONG bins_used = DONT_KNOW;
static wb_append_on = FALSE;

BOOLEAN Tooltype_Errors_Reported = FALSE;

/*
 * local functions
 */
static void message__set (int message_number);
static void octave_buttons__set (void);
static void fdep_buttons__enable (void);
static void window_buttons__set (void);
static void read_parameters__set (void);
static void rate_gadget__update (void);
static void amplitude__set (void);
static void bins_gadget__update (BOOLEAN force_update);
static void bins_string__set (char *buffer);
static void high_f_gadget__update (void);
static void low_f_gadget__update (void);
static void do_help (struct Gadget *gadgetp);
static char *wb_set_append (char *arguments);
static char *wb_no_set_append (char *arguments);

int workbench_dialog (void)
{
    int next_action = WORKBENCH_MODE;
    struct IntuiMessage *message;
    APTR *address = NULL;
    ULONG class = NULL;
    UWORD qualifier = NULL;
    UWORD code = NULL;
    APTR next_address = NULL;
    ULONG next_class = NULL;
    UWORD next_code = NULL;
    UWORD next_qualifier = NULL;
    BOOLEAN last_plot;
    char channel_string[20];
    char rate_string[32];
    char bins_string[20];
    char low_f_string[32];
    char high_f_string[32];
    char smoothing_string[20];
    char copyright_string[132];
    int copyright_indent;
    int copyright_delta;
    int last_command_mode = CommandMode;
    APTR string_gadget_being_set = NULL;
    double s_rate = (Rate == AUTO_RATE) ? FileRate : Rate;

    last_plot = Plot;
    Plot = ANY_PLOT;


    if (dialog_window_p == NULL)
    {
	open_libraries ();
	setup_window_defaults (BUTTON_ROWS);
	gadget__begin (NULL);  /* Ensure requester mode off */

	/*
	 * Define the Gadgets
	 */


	/* Top Row */

	strcpy (copyright_string, NameAuthor);
	strcat (copyright_string, VersionData);
	strcat (copyright_string, " "); /* One space */
	strcat (copyright_string, Copyright);
	copyright_delta = MAX_TEXT_COLS - strlen (copyright_string);
	if (1 & copyright_delta)
	{
	    strcpy (copyright_string, NameAuthor);
	    strcat (copyright_string, VersionData);
	    strcat (copyright_string, "  "); /* Two spaces */
	    strcat (copyright_string, Copyright);
	}
	copyright_delta = MAX_TEXT_COLS - strlen (copyright_string);
	copyright_indent = copyright_delta / 2;

	copyright_gadgetp = action_button__new (copyright_string,
						     copyright_indent, 0);

	copyright_gadgetp->UserData = "Workbench Copyright";

	/* Second Row */

	help_gadgetp = action_button__new ("Help", 0, 1);
	help_gadgetp->UserData = "Workbench Help";

	read_file_gadgetp = string_gadget__new ("Sample File:", ReadName,
						MAX_PATH, 49, 6, 1);
	read_file_gadgetp->UserData = "Workbench Sample-File";

	select_read_gadgetp = action_button__new ("Select", 57, 1);
	select_read_gadgetp->UserData = "Workbench Sample-Select";

	con_read_gadgetp = action_button__new ("con:", 65, 1);
	con_read_gadgetp->UserData = "Workbench Sample-Con:";

	next_gadgetp = action_button__new ("Next", 71, 1);
	next_gadgetp->UserData = "Workbench Next";
	if (num_files <= 0 ||
	    num_files <= file_index + 1)
	{
	    next_gadgetp->Flags |= GADGDISABLED;
	}



	/* Third Row */

	octave_low_gadgetp = labeled_radio_button__new 
	  ("Octave:", "Low", 0, 2);
	octave_2_gadgetp = radio_button__new ("2", 14, 2);
	octave_3_gadgetp = radio_button__new ("3", 17, 2);
	octave_4_gadgetp = radio_button__new ("4", 20, 2);
	octave_5_gadgetp = radio_button__new ("5", 23, 2);
	octave_6_gadgetp = radio_button__new ("6", 26, 2);
	octave_7_gadgetp = radio_button__new ("7", 29, 2);
	octave_hi_gadgetp = radio_button__new ("Hi", 32, 2);

	octave_low_gadgetp->UserData = "Workbench Octave-Low";
	octave_2_gadgetp->UserData = "Workbench Octave-2";
	octave_3_gadgetp->UserData = "Workbench Octave-3";
	octave_4_gadgetp->UserData = "Workbench Octave-4";
	octave_5_gadgetp->UserData = "Workbench Octave-5";
	octave_6_gadgetp->UserData = "Workbench Octave-6";
	octave_7_gadgetp->UserData = "Workbench Octave-7";
	octave_hi_gadgetp->UserData = "Workbench Octave-Hi";

	one_shot_gadgetp = radio_button__new ("One-Shot Only", 37, 2);
	one_shot_gadgetp->UserData = "Workbench One-Shot-Only";

	repeat_only_gadgetp = radio_button__new ("Repeat O", 52, 2);
	repeat_only_gadgetp->UserData = "Workbench Repeat-Only";

	sprintf (channel_string,"%d",Channel);
	channel_gadgetp = string_gadget__new ("Channel:", channel_string,
					      2, 13, 62, 2);
	channel_gadgetp->UserData = "Workbench Channel";

	/* Fourth Row */

	
	if (s_rate != AUTO_RATE && s_rate != INVALID_RATE)
	{
	    sprintf (rate_string, "%g", s_rate);
	}
	else
	{
	    rate_string[0] = '\0';
	}
	rate_gadgetp = string_gadget__new ("S Rate:", rate_string,
					   30, 20, 0, 3);
	rate_gadgetp->UserData = "Workbench Rate";

	bins_string__set (bins_string);
	bins_gadgetp = string_gadget__new ("Bins:", bins_string,
					   12, 16, 22, 3);
	bins_gadgetp->UserData = "Workbench Bins";

	bins_max_gadgetp = radio_button__new ("MAX", 40, 3);
	bins_max_gadgetp->UserData = "Workbench Bins-Max";

	overlap_gadgetp = radio_button__new ("Overlap", 46, 3);
	overlap_gadgetp->UserData = "Workbench Overlap";

	cal_gadgetp = action_button__new ("Cal & Mag", 56, 3);
	cal_gadgetp->UserData = "Workbench Cal-&-Mag";

	time3d_gadgetp = action_button__new ("3D-Time", 68, 3);
	time3d_gadgetp->UserData = "Workbench 3D-Time";


	/* Fifth Row */

	rectangle_gadgetp = labeled_radio_button__new 
	  ("Window:", "Rectangle ", 0, 4);
	triangle_gadgetp = radio_button__new ("Triangle", 21, 4);
	parzen_gadgetp = radio_button__new ("Parzen", 31, 4);
	welch_gadgetp = radio_button__new ("Welch", 39, 4);
	hann_gadgetp = radio_button__new ("Hann", 46, 4);
	hamming_gadgetp = radio_button__new ("Hamming", 52, 4);
	b_h_74db_gadgetp = radio_button__new ("B-H 74dB", 61, 4);
	b_h_92db_gadgetp = radio_button__new ("92dB", 71, 4);

	rectangle_gadgetp->UserData = "Workbench Rectangle";
	triangle_gadgetp->UserData = "Workbench Triangle";
	parzen_gadgetp->UserData = "Workbench Parzen";
	welch_gadgetp->UserData = "Workbench Welch";
	hann_gadgetp->UserData = "Workbench Hann";
	hamming_gadgetp->UserData = "Workbench Hamming";
	b_h_74db_gadgetp->UserData = "Workbench 74dB-Blackman-Harris";
	b_h_92db_gadgetp->UserData = "Workbench 92dB-Blackman-Harris";


	/* Sixth Row */


	if (LowFrequency != LOWEST_FREQUENCY)
	{
	    sprintf (low_f_string, "%g", LowFrequency);
	}
	else
	{
	    low_f_string[0] = '\0';
	}
	low_f_gadgetp = string_gadget__new ("Low Freq:", low_f_string,
					    30, 22, 0, 5);
	low_f_gadgetp->UserData = "Workbench Low-Frequency";

	if (HighFrequency != DBL_MAX)
	{
	    sprintf (high_f_string, "%g", HighFrequency);
	}
	else
	{
	    if (s_rate != AUTO_RATE && s_rate != INVALID_RATE)
	    {
		sprintf (high_f_string, "%g", s_rate / 2);
	    }
	    else
	    {
		high_f_string[0] = '\0';
	    }
	}
	high_f_gadgetp = string_gadget__new ("High Freq:", high_f_string,
					     30, 23, 25, 5);
	high_f_gadgetp->UserData = "Workbench High-Frequency";

	no_smoothing_gadgetp = radio_button__new ("NO", 73, 5);
	no_smoothing_gadgetp->UserData = "Workbench Smoothing-No";

	if (SmoothingSegments != INVALID_SMOOTHING &&
	    SmoothingSegments != NO_SMOOTHING)
	{
	    sprintf (smoothing_string, "%ld", SmoothingSegments);
	}
	else 
	{
	    smoothing_string[0] = '\0';
	}
	smoothing_gadgetp = string_gadget__new ("Smooth:", smoothing_string,
						12, 17, 50, 5);
	smoothing_gadgetp->UserData = "Workbench Smoothing";

	sq_smoothing_gadgetp = radio_button__new ("Sq", 69, 5);
	sq_smoothing_gadgetp->UserData = "workbench Smoothing-Squared";


	/* Seventh Row */

	plot_gadgetp = radio_button__new ("Plot", 0, 6);
	plot_gadgetp->UserData = "Workbench Plot";

	combine_plots_gadgetp = radio_button__new ("&", 6, 6);
	combine_plots_gadgetp->UserData = "Workbench Plot-Combine";

	cut_plots_gadgetp = action_button__new ("X", 9, 6);
	cut_plots_gadgetp->UserData = "Workbench Plot-Cut";

	if (is_temp_file (WriteName))
	{
	    write_file_gadgetp = string_gadget__new ("Spectrm File:", 
						     NullString, MAX_PATH, 
						     42, 12, 6);
	}
	else
	{
	    write_file_gadgetp = string_gadget__new ("Spectrm File:", 
						     WriteName, MAX_PATH, 
						     42, 12, 6);
	}
	write_file_gadgetp->UserData = "Workbench Spectrum-File";

	spectrum_select_gadgetp = action_button__new ("S", 56, 6);
	spectrum_select_gadgetp->UserData = 
	  "Workbench Spectrum-File-Select";

	append_gadgetp = radio_button__new ("Open", 59, 6);
        append_gadgetp->UserData = "Workbench Spectrum-File-Open";

	cancel_write_gadgetp = action_button__new ("Can", 65, 6);
	cancel_write_gadgetp->UserData = "Workbench Spectrum-File-Cancel";

	def_write_gadgetp = action_button__new ("*.fft", 70, 6);
	def_write_gadgetp->UserData = "Workbench *.fft";


	/* Eighth Row */

	CLI_gadgetp = action_button__new ("CLI", 0, 7);
	CLI_gadgetp->UserData = "Workbench CLI";

	pink_gadgetp = radio_button__new ("Pink", 6, 7);
	pink_gadgetp->UserData = "Workbench Pink";

	amplitude_gadgetp = radio_button__new ("Ampl", 13, 7);
	amplitude_gadgetp->UserData = "Workbench Amplitude";

	power_gadgetp = radio_button__new ("Power", 19, 7);
	power_gadgetp->UserData = "Workbench Power";

	mean_gadgetp = radio_button__new ("Mean", 27, 7);
	mean_gadgetp->UserData = "Workbench Mean";

	db_gadgetp = radio_button__new ("dB", 34, 7);
	db_gadgetp->UserData = "Workbench dB";

	log_x_gadgetp = radio_button__new ("LogX", 39, 7);
	log_x_gadgetp->UserData = "Workbench Logx";

	log_y_gadgetp = radio_button__new ("LogY", 46, 7);
	log_y_gadgetp->UserData = "Workbench Logy";

#ifndef ONLY_OK_TALL
	re_plot_gadgetp = tall_action_button__new ("RePlot", 53, 7);
#else
	re_plot_gadgetp = action_button__new ("RePlot", 53, 7);
#endif
	re_plot_gadgetp->UserData = "Workbench RePlot";

#ifndef ONLY_OK_TALL
	re_output_gadgetp = tall_action_button__new ("ReOutput", 62, 7);
#else
	re_output_gadgetp = action_button__new ("ReOutput", 62, 7);
#endif
	re_output_gadgetp->UserData = "Workbench ReOutput";

	ok_gadgetp = tall_action_button__new ("OK", 73, 7);
	ok_gadgetp->UserData = "Workbench OK";


	/* Ninth Row */
	/* IMPORTANT!  LAST GADGET MUST APPEAR IN WINDOW INITIALIZATION */

	message_gadgetp = message_gadget__new (75, 0, 8);
	message_gadgetp->UserData = "Workbench Message";

    /*
     * Now, create the Window
     */
	dialog_window_p = window__new (Dialog_Window_Title);
    }

    CommandMode = WORKBENCH_MODE;

/*
 * Set up gadgets with current info
 */
    if (Overlap) radio_button__in (overlap_gadgetp, dialog_window_p);
    if (OneShotOnly) radio_button__in (one_shot_gadgetp, dialog_window_p);
    if (RepeatOnly) radio_button__in (repeat_only_gadgetp, dialog_window_p);
    if (SquaredSmoothing) radio_button__in (sq_smoothing_gadgetp, 
					    dialog_window_p);
    if (Plot != NO_PLOT) radio_button__in (plot_gadgetp, dialog_window_p);
    if (CombinePlots) radio_button__in (combine_plots_gadgetp, 
					dialog_window_p);
    if (Pink) radio_button__in (pink_gadgetp, dialog_window_p);
    if (Mean) radio_button__in (mean_gadgetp, dialog_window_p);
    if (Db) radio_button__in (db_gadgetp, dialog_window_p);
    if (LogX) radio_button__in (log_x_gadgetp, dialog_window_p);
    if (LogY) radio_button__in (log_y_gadgetp, dialog_window_p);
    if (NumberBins == MAX_BINS) radio_button__in (bins_max_gadgetp,
						  dialog_window_p);
    amplitude__set ();
    if (SmoothingSegments == NO_SMOOTHING)
    {
	radio_button__in (no_smoothing_gadgetp, dialog_window_p);
    }
    window_buttons__set ();
    octave_buttons__set ();

/* I've been driven to this by lack of support */
    workbench_nag_requester ();


    if (Tooltype_Errors && !Tooltype_Errors_Reported)
    {
	error_message (TOOLTYPE_ERROR);
	Tooltype_Errors_Reported = TRUE;
    }

    if (ReadName && strlen(ReadName))
    {
	read_parameters__set ();
	message__set (SELECT_PARAMETERS);
    }
    else
    {
	message__set (SELECT_READ_FILE);
    }

/* Handle events */

    while (TRUE)
    {
	chkabort ();
	Wait (1 << dialog_window_p->UserPort->mp_SigBit);
	while (message = (struct IntuiMessage *) GetMsg 
	       (dialog_window_p->UserPort))
	{
	    class = message->Class;
	    address = message->IAddress;
	    qualifier = message->Qualifier;
	    code = message->Code;
	    ReplyMsg ((struct Message *) message);
	/*
	 * IDCMP_CLOSEWINDOW doesn't have an IAddress
         * so must be handled here.
         */
	    if (class == IDCMP_CLOSEWINDOW) goto closewindow;
        /*
         * Finish unfinished string
         */

	    if (string_gadget_being_set &&
		string_gadget_being_set != address && !
		(string_gadget_being_set == read_file_gadgetp &&
		 (address == (APTR) select_read_gadgetp) ||
		 (address == (APTR) con_read_gadgetp)))
	    {
		next_address = address;
		next_class = class;
		next_qualifier = qualifier;
		next_code = code;

		address = string_gadget_being_set;
		class = IDCMP_GADGETUP;
		qualifier = NULL;
		code = NULL;
	    }
	    string_gadget_being_set = NULL;

	    while (address)
	    {
		CATCH_ERROR;
	    /*
             * Here begins massive compound if statement
             */
		if (class == IDCMP_RAWKEY)
		{
	        /* Test for HELP key on keyboard...
                 * At present, I'm not happy with the way this works.
		 * If a string gadget is activated, there is no response.
                 * So, I'm leaving it as undocumented, maybe it will
                 *   help someone anyway.  Meanwhile there is a help
                 *   button which does the same thing.
                 */
		    if (code == RAW_HELP_KEY)
		    {
			workbench_help_requester ();
		    }
		} /* end if class == IDCMP_RAWKEY */

		else if (qualifier & IEQUALIFIER_CONTROL)
		{
                /*
                 * CTRL and any gadget select gives help on that gadget
		 */
		    do_help ((struct Gadget *) address);
		}
	    /*
             * Check for string GADGETDOWN
	     */
		else if (class == IDCMP_GADGETDOWN && 
			 ((struct Gadget *) address)->GadgetType &
			 GTYP_STRGADGET)
		{
		    string_gadget_being_set = address;
		}
		else if (address == (APTR) help_gadgetp)
		{
		    workbench_help_requester ();
		}
		else if (address == (APTR) ok_gadgetp)
		{
		    ULONG check_frames = FileFrames;

		    message__set (PERFORMING_FFT);
		    CATCH_ERROR
		    {
#ifdef NO_PROGRESS
			ok (NullString);
			loop_time_message_done (LoopTimeElapsed);
#else
		        if (!progress_rp)
			  progress_rp = progress_requester__new 
			    (Attempting_to_Perform_FFT_S, 50);
			progress_requester__apply (progress_rp,
						   ok,
						   NullString,
						   dialog_window_p);
			loop_time_message_done (LoopTimeElapsed);
#endif
		    }
		    ON_ERROR
		    {
			message__set (REMEMBER_MESSAGE);
		    }
		    END_CATCH_ERROR;

		    if (check_frames != FileFrames)
		    {  /* A file scan has occurred */
			bins_gadget__update (FALSE);
		    }
		}
		else if (address == (APTR) CLI_gadgetp)
		{
		    next_action = INTERACTIVE_MODE;
		    goto closewindow;
		}
		else if (address == (APTR) copyright_gadgetp)
		{
		    copyright_requester ();
		}
		else if (address == (APTR) cal_gadgetp)
		{
		    calibration_requester ();
		}
		else if (address == (APTR) time3d_gadgetp)
		{
		    time3d_requester ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) rectangle_gadgetp)
		{
		    set_rectangle (NullString);
		    window_buttons__set ();
		}
		else if (address == (APTR) triangle_gadgetp)
		{
		    set_triangle (NullString);
		    window_buttons__set ();
		}
		else if (address == (APTR) parzen_gadgetp)
		{
		    set_parzen (NullString);
		    window_buttons__set ();
		}
		else if (address == (APTR) welch_gadgetp)
		{
		    set_welch (NullString);
		    window_buttons__set ();
		}
		else if (address == (APTR) hann_gadgetp)
		{
		    set_hann (NullString);
		    window_buttons__set ();
		}
		else if (address == (APTR) hamming_gadgetp)
		{
		    set_hamming (NullString);
		    window_buttons__set ();
		}
		else if (address == (APTR) b_h_74db_gadgetp)
		{
		    set_blackman_harris_74db (NullString);
		    window_buttons__set ();
		}
		else if (address == (APTR) b_h_92db_gadgetp)
		{
		    set_blackman_harris_92db (NullString);
		    window_buttons__set ();
		}
		else if (address == (APTR) one_shot_gadgetp)
		{
		    if (one_shot_gadgetp->Flags & SELECTED)
		    {
			set_no_one_shot_only (NullString);
			radio_button__out (one_shot_gadgetp,
					   dialog_window_p);
		    }
		    else
		    {
			set_one_shot_only (NullString);
			radio_button__in (one_shot_gadgetp,
					  dialog_window_p);
			radio_button__out (repeat_only_gadgetp,
					   dialog_window_p);
		    }
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) repeat_only_gadgetp)
		{
		    if (repeat_only_gadgetp->Flags & SELECTED)
		    {
			set_no_repeat_only (NullString);
			radio_button__out (repeat_only_gadgetp,
					   dialog_window_p);
		    }
		    else
		    {
			set_repeat_only (NullString);
			radio_button__in (repeat_only_gadgetp,
					  dialog_window_p);
			radio_button__out (one_shot_gadgetp,
					   dialog_window_p);
		    }
		    bins_gadget__update (FALSE);
		}
/*		else if (address == (APTR) pad_gadgetp) */
/*		{ */
/*		    radio_button__toggle (pad_gadgetp, set_pad,  */
/*					   set_no_pad, */
/*					   dialog_window_p); */
/*		    bins_gadget__update (FALSE); */
/*		} */
		else if (address == (APTR) channel_gadgetp)
		{
		    char *buffer = string_gadget__apply 
		      (channel_gadgetp, set_channel);
		    if (!strlen (buffer))
		    {
			sprintf (buffer, "%d", Channel);
			refresh_gadget (channel_gadgetp,
					dialog_window_p);
		    }
		}
		else if (address == (APTR) rate_gadgetp)
		{
		    char *buffer = string_gadget__apply 
		      (rate_gadgetp, set_rate);
		    if (!strlen (buffer))
		    {
			rate_gadget__update ();
		    }
		    high_f_gadget__update ();
		    message__set (SELECT_PARAMETERS);
		}
		else if (address == (APTR) bins_max_gadgetp)
		{
		    set_bins (NullString);
		    radio_button__in (bins_max_gadgetp,
				      dialog_window_p);
		    bins_gadget__update (TRUE);  /* Force */
		}
		else if (address == (APTR) bins_gadgetp)
		{
		    char *buffer = string_gadget__apply 
		      (bins_gadgetp, set_bins);
		    if (strlen (buffer))
		    {
			radio_button__out (bins_max_gadgetp,
					   dialog_window_p);
		    }
		    else
		    {
			radio_button__in (bins_max_gadgetp,
					  dialog_window_p);
		    }
		    
		    bins_gadget__update (TRUE);  /* Force */
		}
		else if (address == (APTR) no_smoothing_gadgetp)
		{
		    struct StringInfo *string_infop = 
		      smoothing_gadgetp->SpecialInfo;
		    char *buffer = string_infop->Buffer;
		    buffer[0] = '\0';
		    refresh_gadget (smoothing_gadgetp,
				    dialog_window_p);
		    radio_button__in (no_smoothing_gadgetp,
				      dialog_window_p);
		    set_smoothing_segments (NullString);
		}
		else if (address == (APTR) smoothing_gadgetp)
		{
		    char *buffer = string_gadget__apply 
		      (smoothing_gadgetp, set_smoothing_segments);
		    if (strlen (buffer))
		    {
			radio_button__out (no_smoothing_gadgetp,
					   dialog_window_p);
		    }
		    else
		    {
			radio_button__in (no_smoothing_gadgetp,
					  dialog_window_p);
		    }
		    
		}
		else if (address == (APTR) sq_smoothing_gadgetp)
		{
		    radio_button__toggle (sq_smoothing_gadgetp,
					   set_squared_smoothing, 
					   set_no_squared_smoothing,
					   dialog_window_p);
		}
		else if (address == (APTR) octave_low_gadgetp)
		{
		    Octave = 1;
		    octave_buttons__set ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) octave_2_gadgetp)
		{
		    Octave = 2;
		    octave_buttons__set ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) octave_3_gadgetp)
		{
		    Octave = 3;
		    octave_buttons__set ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) octave_4_gadgetp)
		{
		    Octave = 4;
		    octave_buttons__set ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) octave_5_gadgetp)
		{
		    Octave = 5;
		    octave_buttons__set ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) octave_6_gadgetp)
		{
		    Octave = 6;
		    octave_buttons__set ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) octave_7_gadgetp)
		{
		    Octave = 7;
		    octave_buttons__set ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) octave_hi_gadgetp)
		{
		    Octave = 0;
		    octave_buttons__set ();
		    bins_gadget__update (FALSE);
		}
		else if (address == (APTR) next_gadgetp)
		{
		    next_action = NEXT_FILE;
		    goto closewindow;
		}
		else if (address == (APTR) select_read_gadgetp)
		{
		    char *read_file = file_requestor 
		      ("Select Sample File");
		    if (read_file)
		    {
			string_gadget__reset (read_file_gadgetp, read_file,
					      dialog_window_p);
			name_string_gadget__apply (read_file_gadgetp,
						   set_read);
			read_parameters__set ();
		    }
		    else
		    {
			message__set (SELECT_READ_FILE);
		    }
		    gfree (read_file);
		}
		else if (address == (APTR) con_read_gadgetp)
		{
		    set_read ("con:");
		    string_gadget__reset (read_file_gadgetp, "con:",
					  dialog_window_p);
		    read_parameters__set ();
		}
		else if (address == (APTR) read_file_gadgetp)
		{
		    CATCH_ERROR
		    {
			name_string_gadget__apply (read_file_gadgetp, 
					      set_read);
			read_parameters__set ();
		    }
		    ON_ERROR
		    {
			message__set (SELECT_READ_FILE);
		    }
		    END_CATCH_ERROR;
		}
		else if (address == (APTR) low_f_gadgetp)
		{
		    char *buffer = string_gadget__apply 
		      (low_f_gadgetp, set_low_frequency);
		    if (!strlen (buffer))
		    {
			low_f_gadget__update ();
		    }
		}
		else if (address == (APTR) high_f_gadgetp)
		{
		    char *buffer = string_gadget__apply 
		      (high_f_gadgetp, set_high_frequency);
		    if (!strlen (buffer))
		    {
			high_f_gadget__update ();
		    }
		}
		else if (address == (APTR) write_file_gadgetp)
		{
		    if (wb_append_on)
		    {
			name_string_gadget__apply (write_file_gadgetp,
						   set_append);
		    }
		    else
		    {
			name_string_gadget__apply (write_file_gadgetp,
						   set_write);
		    }
		}
		else if (address == (APTR) spectrum_select_gadgetp)
		{
		    char *spectrum_file = file_requestor
		      ("Select Spectrum File");
		    if (spectrum_file)
		    {
			/* default now to append mode; usually helps */
			radio_button__in (append_gadgetp, dialog_window_p);
			wb_set_append (NullString);
			string_gadget__reset (write_file_gadgetp, 
					      spectrum_file,
					      dialog_window_p);
			if (wb_append_on)
			{
			    name_string_gadget__apply (write_file_gadgetp,
						       set_append);
			}
			else
			{
			    name_string_gadget__apply (write_file_gadgetp,
						       set_write);
			}
		    }
		}
		else if (address == (APTR) append_gadgetp)
		{
		    radio_button__toggle (append_gadgetp,
					   wb_set_append, wb_no_set_append,
					   dialog_window_p);
		}
		else if (address == (APTR) cancel_write_gadgetp)
		{
		    string_gadget__reset (write_file_gadgetp,
					  NullString, dialog_window_p);
		    if (wb_append_on)
		    {
			set_append (NullString);
		    }
		    else
		    {
			set_write (NullString);
		    }
		}
		else if (address == (APTR) def_write_gadgetp)
		{
		    struct StringInfo *string_infop = 
		      write_file_gadgetp->SpecialInfo;
		    char *buffer = string_infop->Buffer;
		    if (ReadName)
		    {
			strcpy (buffer, ReadName);
			strcat (buffer, ".fft");
		    }
		    else
		    {
			strcpy (buffer, ".fft");
		    }
		    string_infop->NumChars = strlen (buffer);
		    if (wb_append_on)
		    {
			name_string_gadget__apply (write_file_gadgetp,
						   set_append);
		    }
		    else
		    {
			name_string_gadget__apply (write_file_gadgetp,
						   set_write);
		    }
		    refresh_gadget (write_file_gadgetp, 
				    dialog_window_p);
		}
		else if (address == (APTR) amplitude_gadgetp)
		{
		    set_amplitude (NullString);
		    amplitude__set ();
		}
		else if (address == (APTR) power_gadgetp)
		{
		    set_power (NullString);
		    amplitude__set ();
		}
		else if (address == (APTR) overlap_gadgetp)
		{
		    radio_button__toggle (overlap_gadgetp,
					   set_overlap, set_no_overlap,
					   dialog_window_p);
		}
		else if (address == (APTR) db_gadgetp)
		{
		    radio_button__toggle (db_gadgetp, 
					   set_db, set_no_db,
					   dialog_window_p);
		}
		else if (address == (APTR) pink_gadgetp)
		{
		    radio_button__toggle (pink_gadgetp, set_pink, 
					   set_no_pink,
					   dialog_window_p);
		}
		else if (address == (APTR) mean_gadgetp)
		{
		    radio_button__toggle (mean_gadgetp, set_mean, 
					   set_sum, 
					   dialog_window_p);
		}
		else if (address == (APTR) plot_gadgetp)
		{
		    radio_button__toggle (plot_gadgetp, set_plot, 
					   set_no_plot,
					   dialog_window_p);
		    last_plot = Plot;
		}
		else if (address == (APTR) combine_plots_gadgetp)
		{
		    radio_button__toggle (combine_plots_gadgetp,
					   set_combine_plots,
					   set_no_combine_plots,
					   dialog_window_p);
		}
		else if (address == (APTR) cut_plots_gadgetp)
		{
		    cut_combined_plot (NullString);
		}
		else if (address == (APTR) re_output_gadgetp)
		{

		    extern double Ending_Progress; /* from ok_spectrum() */
		    if (!reout_progress_rp)
		      reout_progress_rp = progress_requester__new
			("Rewriting spectrum file...", 50);
		    Ending_Progress = 99.0;
		    progress_requester__apply (reout_progress_rp,
					       re_output,
					       NullString,
					       dialog_window_p);
		}
		else if (address == (APTR) re_plot_gadgetp)
		{
		    re_plot (NullString);
		}
		else if (address == (APTR) log_x_gadgetp)
		{
		    radio_button__toggle (log_x_gadgetp, set_logx, 
					   set_no_logx,
					   dialog_window_p);
		}
		else if (address == (APTR) log_y_gadgetp)
		{
		    radio_button__toggle (log_y_gadgetp, set_logy,
					   set_no_logy,
					   dialog_window_p);
		} /* end massive compound if*/
		END_CATCH_ERROR;

		last_address = address;
		address = next_address;
		class = next_class;
		qualifier = next_qualifier;
		code = next_code;

		next_address = NULL;
		next_class = NULL;
		next_qualifier = NULL;
		next_code = NULL;

	    } /* end while (address) */
	} /* end while (message...) */
    } /* end while (TRUE) */

closewindow:    
    CloseWindow (dialog_window_p);
    dialog_window_p = NULL;
    if (class == IDCMP_CLOSEWINDOW)
    {
	quit (NullString);  /* it all ends here, no matter where started */
    }
    CommandMode = last_command_mode;
    Plot = last_plot;  /* reset previous default, unless changed */
    return next_action;
}

static void amplitude__set (void)
{
    if (Amplitude)
    {
	radio_button__in (amplitude_gadgetp, dialog_window_p);
	radio_button__out (power_gadgetp, dialog_window_p);
    }
    else
    {
	radio_button__in (power_gadgetp, dialog_window_p);
	radio_button__out (amplitude_gadgetp, dialog_window_p);
    }
}


static void window_buttons__set ()
{
    switch (WindowType)
    {
    case RECTANGLE_WINDOW:
	radio_button__in (rectangle_gadgetp, dialog_window_p);
	radio_button__out (triangle_gadgetp, dialog_window_p);
	radio_button__out (parzen_gadgetp, dialog_window_p);
	radio_button__out (welch_gadgetp, dialog_window_p);
	radio_button__out (hann_gadgetp, dialog_window_p);
	radio_button__out (hamming_gadgetp, dialog_window_p);
	radio_button__out (b_h_74db_gadgetp, dialog_window_p);
	radio_button__out (b_h_92db_gadgetp, dialog_window_p);
	break;
    case TRIANGLE_WINDOW:
	radio_button__out (rectangle_gadgetp, dialog_window_p);
	radio_button__in (triangle_gadgetp, dialog_window_p);
	radio_button__out (parzen_gadgetp, dialog_window_p);
	radio_button__out (welch_gadgetp, dialog_window_p);
	radio_button__out (hann_gadgetp, dialog_window_p);
	radio_button__out (hamming_gadgetp, dialog_window_p);
	radio_button__out (b_h_74db_gadgetp, dialog_window_p);
	radio_button__out (b_h_92db_gadgetp, dialog_window_p);
	break;
    case PARZEN_WINDOW:
	radio_button__out (rectangle_gadgetp, dialog_window_p);
	radio_button__out (triangle_gadgetp, dialog_window_p);
	radio_button__in (parzen_gadgetp, dialog_window_p);
	radio_button__out (welch_gadgetp, dialog_window_p);
	radio_button__out (hann_gadgetp, dialog_window_p);
	radio_button__out (hamming_gadgetp, dialog_window_p);
	radio_button__out (b_h_74db_gadgetp, dialog_window_p);
	radio_button__out (b_h_92db_gadgetp, dialog_window_p);
	break;
    case WELCH_WINDOW:
	radio_button__out (rectangle_gadgetp, dialog_window_p);
	radio_button__out (triangle_gadgetp, dialog_window_p);
	radio_button__out (parzen_gadgetp, dialog_window_p);
	radio_button__in (welch_gadgetp, dialog_window_p);
	radio_button__out (hann_gadgetp, dialog_window_p);
	radio_button__out (hamming_gadgetp, dialog_window_p);
	radio_button__out (b_h_74db_gadgetp, dialog_window_p);
	radio_button__out (b_h_92db_gadgetp, dialog_window_p);
	break;
    case HANN_WINDOW:
	radio_button__out (rectangle_gadgetp, dialog_window_p);
	radio_button__out (triangle_gadgetp, dialog_window_p);
	radio_button__out (parzen_gadgetp, dialog_window_p);
	radio_button__out (welch_gadgetp, dialog_window_p);
	radio_button__in (hann_gadgetp, dialog_window_p);
	radio_button__out (hamming_gadgetp, dialog_window_p);
	radio_button__out (b_h_74db_gadgetp, dialog_window_p);
	radio_button__out (b_h_92db_gadgetp, dialog_window_p);
	break;
    case HAMMING_WINDOW:
	radio_button__out (rectangle_gadgetp, dialog_window_p);
	radio_button__out (triangle_gadgetp, dialog_window_p);
	radio_button__out (parzen_gadgetp, dialog_window_p);
	radio_button__out (welch_gadgetp, dialog_window_p);
	radio_button__out (hann_gadgetp, dialog_window_p);
	radio_button__in (hamming_gadgetp, dialog_window_p);
	radio_button__out (b_h_74db_gadgetp, dialog_window_p);
	radio_button__out (b_h_92db_gadgetp, dialog_window_p);
	break;
    case BLACKMAN_HARRIS_74DB_WINDOW:
	radio_button__out (rectangle_gadgetp, dialog_window_p);
	radio_button__out (triangle_gadgetp, dialog_window_p);
	radio_button__out (parzen_gadgetp, dialog_window_p);
	radio_button__out (welch_gadgetp, dialog_window_p);
	radio_button__out (hann_gadgetp, dialog_window_p);
	radio_button__out (hamming_gadgetp, dialog_window_p);
	radio_button__in (b_h_74db_gadgetp, dialog_window_p);
	radio_button__out (b_h_92db_gadgetp, dialog_window_p);
	break;
    case BLACKMAN_HARRIS_92DB_WINDOW:
	radio_button__out (rectangle_gadgetp, dialog_window_p);
	radio_button__out (triangle_gadgetp, dialog_window_p);
	radio_button__out (parzen_gadgetp, dialog_window_p);
	radio_button__out (welch_gadgetp, dialog_window_p);
	radio_button__out (hann_gadgetp, dialog_window_p);
	radio_button__out (hamming_gadgetp, dialog_window_p);
	radio_button__out (b_h_74db_gadgetp, dialog_window_p);
	radio_button__in (b_h_92db_gadgetp, dialog_window_p);
	break;
    }
}

static void fdep_buttons__enable (void)
{
    BOOLEAN changed_value = FALSE;
    BOOLEAN no_one_shot_frames = TRUE;
    BOOLEAN no_repeat_frames = TRUE;

    if (!ReadPtr) return;

    switch (FileOctaves)
    {
    case 7:
	gadget__enable (octave_7_gadgetp, dialog_window_p);
    case 6:
	gadget__enable (octave_6_gadgetp, dialog_window_p);
    case 5:
	gadget__enable (octave_5_gadgetp, dialog_window_p);
    case 4:
	gadget__enable (octave_4_gadgetp, dialog_window_p);
    case 3:
	gadget__enable (octave_3_gadgetp, dialog_window_p);
    case 2:
	gadget__enable (octave_2_gadgetp, dialog_window_p);
    }

    switch (FileOctaves)
    {
    case 1:
	gadget__disable (octave_2_gadgetp, dialog_window_p);
    case 2:
	gadget__disable (octave_3_gadgetp, dialog_window_p);
    case 3:
	gadget__disable (octave_4_gadgetp, dialog_window_p);
    case 4:
	gadget__disable (octave_5_gadgetp, dialog_window_p);
    case 5:
	gadget__disable (octave_6_gadgetp, dialog_window_p);
    case 6:
	gadget__disable (octave_7_gadgetp, dialog_window_p);
    }

    if (FileChannels > 1)
    {
	gadget__enable  (channel_gadgetp, dialog_window_p);
    }
    else
    {
	if (Channel > 1)
	{
	    set_channel (NullString);
	    string_gadget__reset (channel_gadgetp, "1", dialog_window_p);
	    changed_value = TRUE;
	}
	gadget__disable (channel_gadgetp, dialog_window_p);
    }

    if (FileFormat == ID_8SVX)
    {
	if (FileOneShotHiFrames)
	{
	    gadget__enable (one_shot_gadgetp, dialog_window_p);
	    no_one_shot_frames = FALSE;
	}
	if (FileRepeatHiFrames)
	{
	    gadget__enable (repeat_only_gadgetp, dialog_window_p);
	    no_repeat_frames = FALSE;
	}
    }
    if (no_one_shot_frames)
    {
	if (OneShotOnly)
	{
	    set_no_one_shot_only (NullString);
	    radio_button__out (one_shot_gadgetp, dialog_window_p);
	    changed_value = TRUE;
	}
	gadget__disable (one_shot_gadgetp, dialog_window_p);
    }
    if (no_repeat_frames)
    {
	if (RepeatOnly)
	{
	    set_no_repeat_only (NullString);
	    radio_button__out (repeat_only_gadgetp, dialog_window_p);
	    changed_value = TRUE;
	}
	gadget__disable (repeat_only_gadgetp, dialog_window_p);
    }

    if (changed_value)
    {
	error_message (CHANGED_FORMAT_DEP_VALUE);
    }
}


static void octave_buttons__set (void)
{
    switch (Octave)
    {
    case 0:
	radio_button__in (octave_hi_gadgetp, dialog_window_p);
	radio_button__out (octave_low_gadgetp, dialog_window_p);
	radio_button__out (octave_2_gadgetp, dialog_window_p);
	radio_button__out (octave_3_gadgetp, dialog_window_p);
	radio_button__out (octave_4_gadgetp, dialog_window_p);
	radio_button__out (octave_5_gadgetp, dialog_window_p);
	radio_button__out (octave_6_gadgetp, dialog_window_p);
	radio_button__out (octave_7_gadgetp, dialog_window_p);
	break;
    case 1:
	radio_button__out (octave_hi_gadgetp, dialog_window_p);
	radio_button__in (octave_low_gadgetp, dialog_window_p);
	radio_button__out (octave_2_gadgetp, dialog_window_p);
	radio_button__out (octave_3_gadgetp, dialog_window_p);
	radio_button__out (octave_4_gadgetp, dialog_window_p);
	radio_button__out (octave_5_gadgetp, dialog_window_p);
	radio_button__out (octave_6_gadgetp, dialog_window_p);
	radio_button__out (octave_7_gadgetp, dialog_window_p);
	break;
    case 2:
	radio_button__out (octave_hi_gadgetp, dialog_window_p);
	radio_button__out (octave_low_gadgetp, dialog_window_p);
	radio_button__in (octave_2_gadgetp, dialog_window_p);
	radio_button__out (octave_3_gadgetp, dialog_window_p);
	radio_button__out (octave_4_gadgetp, dialog_window_p);
	radio_button__out (octave_5_gadgetp, dialog_window_p);
	radio_button__out (octave_6_gadgetp, dialog_window_p);
	radio_button__out (octave_7_gadgetp, dialog_window_p);
	break;
    case 3:
	radio_button__out (octave_hi_gadgetp, dialog_window_p);
	radio_button__out (octave_low_gadgetp, dialog_window_p);
	radio_button__out (octave_2_gadgetp, dialog_window_p);
	radio_button__in (octave_3_gadgetp, dialog_window_p);
	radio_button__out (octave_4_gadgetp, dialog_window_p);
	radio_button__out (octave_5_gadgetp, dialog_window_p);
	radio_button__out (octave_6_gadgetp, dialog_window_p);
	radio_button__out (octave_7_gadgetp, dialog_window_p);
	break;
    case 4:
	radio_button__out (octave_hi_gadgetp, dialog_window_p);
	radio_button__out (octave_low_gadgetp, dialog_window_p);
	radio_button__out (octave_2_gadgetp, dialog_window_p);
	radio_button__out (octave_3_gadgetp, dialog_window_p);
	radio_button__in (octave_4_gadgetp, dialog_window_p);
	radio_button__out (octave_5_gadgetp, dialog_window_p);
	radio_button__out (octave_6_gadgetp, dialog_window_p);
	radio_button__out (octave_7_gadgetp, dialog_window_p);
	break;
    case 5:
	radio_button__out (octave_hi_gadgetp, dialog_window_p);
	radio_button__out (octave_low_gadgetp, dialog_window_p);
	radio_button__out (octave_2_gadgetp, dialog_window_p);
	radio_button__out (octave_3_gadgetp, dialog_window_p);
	radio_button__out (octave_4_gadgetp, dialog_window_p);
	radio_button__in (octave_5_gadgetp, dialog_window_p);
	radio_button__out (octave_6_gadgetp, dialog_window_p);
	radio_button__out (octave_7_gadgetp, dialog_window_p);
	break;
    case 6:
	radio_button__out (octave_hi_gadgetp, dialog_window_p);
	radio_button__out (octave_low_gadgetp, dialog_window_p);
	radio_button__out (octave_2_gadgetp, dialog_window_p);
	radio_button__out (octave_3_gadgetp, dialog_window_p);
	radio_button__out (octave_4_gadgetp, dialog_window_p);
	radio_button__out (octave_5_gadgetp, dialog_window_p);
	radio_button__in (octave_6_gadgetp, dialog_window_p);
	radio_button__out (octave_7_gadgetp, dialog_window_p);
	break;
    case 7:
	radio_button__out (octave_hi_gadgetp, dialog_window_p);
	radio_button__out (octave_low_gadgetp, dialog_window_p);
	radio_button__out (octave_2_gadgetp, dialog_window_p);
	radio_button__out (octave_3_gadgetp, dialog_window_p);
	radio_button__out (octave_4_gadgetp, dialog_window_p);
	radio_button__out (octave_5_gadgetp, dialog_window_p);
	radio_button__out (octave_6_gadgetp, dialog_window_p);
	radio_button__in (octave_7_gadgetp, dialog_window_p);
	break;
    }
}

static void read_parameters__set (void)
{
    if (!ReadName || ReadName == NullString) return;
    fdep_buttons__enable ();
    rate_gadget__update ();
    bins_gadget__update (FALSE);
/*    low_f_gadget__update (); now included in bins_gadget__update... */
    high_f_gadget__update ();
    if (FileFormat != UNFORMATTED)
    {
	message__set (SELECT_PARAMETERS);
    }
    else if (Rate == AUTO_RATE)
    {
	message__set (SET_RATE);
    }
    else
    {
	message__set (VERIFY_RATE);
    }
}

static void rate_gadget__update (void)
{
    double rate;
    struct StringInfo *string_infop = 
      rate_gadgetp->SpecialInfo;
    char *buffer = string_infop->Buffer;

    rate = (Rate == AUTO_RATE) ? FileRate : Rate;
    if (rate != AUTO_RATE)
    {
        sprintf (buffer,"%g",rate);
    }
    else
    {
	buffer[0] = '\0';
    }
    refresh_gadget (rate_gadgetp, dialog_window_p);
}


static void high_f_gadget__update (void)
{
    double rate;
    struct StringInfo *string_infop = 
      high_f_gadgetp->SpecialInfo;
    char *buffer = string_infop->Buffer;

    if (HighFrequency == DBL_MAX)
    {
        rate = (Rate == AUTO_RATE) ? FileRate : Rate;
	if (rate != AUTO_RATE)
	{
	    sprintf (buffer, "%g", rate / (2 * Interleave));
	    refresh_gadget (high_f_gadgetp, dialog_window_p);
	}
    }
}

static void low_f_gadget__update (void)
{
    double rate;
    struct StringInfo *string_infop = 
      low_f_gadgetp->SpecialInfo;
    char *buffer = string_infop->Buffer;
    BOOLEAN reset = FALSE;

    if (LowFrequency == LOWEST_FREQUENCY)
    {
        rate = (Rate == AUTO_RATE) ? FileRate : Rate;
	if (rate != AUTO_RATE)
	{

/*
 * Ahah, a beautiful divide by zero handling
 * if TRAP_TEST defined, just enter 0 into Bins gadget
 * Unfortunately, ffp math forces a trap on divide by zero, and
 * this cannot be intercepted without writing assembly code.  Damn.
 */

/* #define TRAP_TEST */

#ifdef TRAP_TEST
	    if (bins_used != DONT_KNOW)  /* May divide by 0 */
#else
	    if (bins_used != DONT_KNOW && bins_used > 0) /* Safe */
#endif

	    {
		double low_f = rate / (2.0 * bins_used * Interleave);
		sprintf (buffer, "%g", low_f);
		reset = TRUE;
	    }
	}
	if (!reset)
	{
	    buffer[0] = '\0';
	}
	refresh_gadget (low_f_gadgetp, dialog_window_p);
    }
}

static void bins_gadget__update (BOOLEAN force_update)
{
    struct StringInfo *string_infop;
    char *buffer;

    if (NumberBins == MAX_BINS || force_update)
    {
	string_infop = bins_gadgetp->SpecialInfo;
	buffer = string_infop->Buffer;
	bins_string__set (buffer);
	refresh_gadget (bins_gadgetp, dialog_window_p);
    }
    low_f_gadget__update ();
}

static void bins_string__set (char *buffer)
{
    BOOLEAN done = FALSE;

    if (NumberBins != MAX_BINS)
    {
	bins_used = NumberBins;
	sprintf (buffer, "%ld", NumberBins);
	done = TRUE;
    }
    else if (ReadPtr != NULL && ReadPtr != stdin)
    {
        BOOLEAN save_quiet = Quiet;
	Quiet = TRUE;

	bins_used = DONT_KNOW;
	CATCH_ERROR;
	bins_used = do_ok (FALSE);
	sprintf (buffer, "%ld", bins_used);
	done = TRUE;
	END_CATCH_ERROR;

	Quiet = save_quiet;
    }
    if (!done) buffer[0] = '\0';
}


static void message__set (int message_number)
{
    static int remember_message = SELECT_PARAMETERS;

    switch (message_number)
    {
    case SELECT_READ_FILE:
	message_gadget__write (message_gadgetp,
			       Please_Select_Read_File_S,
			       dialog_window_p);
	ActivateGadget (read_file_gadgetp, dialog_window_p, NULL);
	remember_message = SELECT_READ_FILE;

#ifdef DISABLE_OK_WHEN_NOT_READY
	gadget__disable (ok_gadgetp, dialog_window_p);
#endif
	break;

    case SELECT_PARAMETERS:

#ifdef DISABLE_OK_WHEN_NOT_READY
	gadget__enable (ok_gadgetp, dialog_window_p);
#endif

	message_gadget__write (message_gadgetp,
			       Set_Parameters_Then_Ok_S,
			       dialog_window_p);
	remember_message = SELECT_PARAMETERS;
	break;
    case PERFORMING_FFT:
	message_gadget__write (message_gadgetp,
			       Attempting_to_Perform_FFT_S,
			       dialog_window_p);
	break;
    case SET_RATE:
	message_gadget__write (message_gadgetp,
			       Set_Sampling_Rate_S,
			       dialog_window_p);
	remember_message = SET_RATE;
	ActivateGadget (rate_gadgetp, dialog_window_p, NULL);

#ifdef DISABLE_OK_WHEN_NOT_READY
	gadget__disable (ok_gadgetp, dialog_window_p);
#endif

	break;

    case VERIFY_RATE:
	message_gadget__write (message_gadgetp,
			       Verify_Sampling_Rate_S,
			       dialog_window_p);
	ActivateGadget (rate_gadgetp, dialog_window_p, NULL);
	remember_message = VERIFY_RATE;
	break;
    case REMEMBER_MESSAGE:
	message__set (remember_message);
	break;
    }
}

static void do_help (struct Gadget *gadgetp)
{
    if (gadgetp->UserData)
    {
	help_message ( (char *) gadgetp->UserData);
    }
    else
    {
	error_message (HELP_MESSAGE_UNAVAILABLE);
    }
}

static char *wb_set_append (char *arguments)
{
    wb_append_on = TRUE;
    name_string_gadget__apply (write_file_gadgetp, set_append);
    return arguments;
}

static char *wb_no_set_append (char *arguments)
{
    wb_append_on = FALSE;
    if (last_address != (APTR) spectrum_select_gadgetp)
    {
	string_gadget__reset (write_file_gadgetp, NullString,
			      dialog_window_p);
    }
    name_string_gadget__apply (write_file_gadgetp, set_write);
    return arguments;
}







/*
 * Obsolete Gadgets (not enough room; deemed less important)
 */
#if FALSE
    char ileave_string[20];

	no_interleave_gadgetp = radio_button__new ("NO", 73, 3);
	if (Interleave > 1 && Interleave != INVALID_INTERLEAVE)
	{
	    sprintf (ileave_string, "%ld", Interleave);
	}
	else
	{
	    ileave_string[0] = '\0';
	    if (Interleave != INVALID_INTERLEAVE)
	    {
		radio_button__in (no_interleave_gadgetp, dialog_window_p);
	    }
	}
	interleave_gadgetp = string_gadget__new ("Interleave:", 
						 ileave_string,
						 12, 20, 51, 3);

			else if (address == (APTR) no_interleave_gadgetp)
			{
			    struct StringInfo *string_infop = 
			      interleave_gadgetp->SpecialInfo;
			    char *buffer = string_infop->Buffer;
			    buffer[0] = '\0';
			    refresh_gadget (interleave_gadgetp,
					    dialog_window_p);
			    radio_button__in (no_interleave_gadgetp, 
					      dialog_window_p);
			    set_no_interleave (NullString);
			    bins_gadget__update (FALSE);
			}
			else if (address == (APTR) interleave_gadgetp)
			{
			    CATCH_ERROR
			    {
				string_gadget__apply (interleave_gadgetp,
						      set_interleave);
			    }
			    END_CATCH_ERROR;
			    radio_button__out (no_interleave_gadgetp,
					       dialog_window_p);
			    bins_gadget__update (FALSE);
			}

#endif /* obsolete section */


#endif  /* ifdef AMIGA */

[ RETURN TO DIRECTORY ]