Metropoli BBS
VIEWER: wbenchm.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:        wbenchm.c
 * Purpose:     workbench GUI main functions
 * Author:      Charles Peterson (CPP)
 * History:     19-Nov-1993 CPP; Created.
 *              19-Jan-1995 CPP; (1.22) Make GFFT shell bigger & go away
 *              20-Jan-1995 CPP; (1.23) Use Icon Tooltypes
 * Comments:    Workbench GUI.  Amiga Dependent!
 */

#ifdef AMIGA

#include <stdlib.h>    /* exit()     */
#include <stdio.h>     /* sprintf() */
#include <string.h>
/*
 * Amiga includes
 */
#include <exec/types.h>
#include <exec/exec.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <workbench/startup.h>
#include <intuition/intuition.h>
#include <clib/intuition_protos.h>
#include <clib/exec_protos.h>
#include <proto/icon.h>
#include <proto/dos.h>
#include <dos/dos.h>

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

/*
 * Default console (Many thanks to SAS for making this possible.)
 */
char __stdiowin[] = "CON:0/000/640/200/GfftConsole";
char __stdiov37[]= "/AUTO/CLOSE";

extern struct WBStartup *WBenchMsg;

/*
 * Semi-static variables (used also by wbdialog)
 */
LONG num_files = 0;
LONG file_index = 0;
int Tooltype_Errors = 0;
extern BOOLEAN Tooltype_Errors_Reported;


/*
 * Statics
 */
static int within_workbench_loop = FALSE;
static void workbench_dialog_loop (void);
static void process_tooltypes (UBYTE *name);


void workbench_main (void)
{
    LONG olddir;
    open_libraries ();

/*
 * Process GFFT.info tooltypes, if any
 */
    if (WBenchMsg && WBenchMsg->sm_NumArgs && WBenchMsg->sm_ArgList)
    {
	struct WBArg *wbarg = WBenchMsg->sm_ArgList;

	olddir = CurrentDir (wbarg->wa_Lock);
	process_tooltypes (wbarg->wa_Name);
	CurrentDir (olddir);
    }
    Tooltype_Errors = Error_Count;

/*
 * Process project icons/files, if any
 */

    if (WBenchMsg && (num_files = WBenchMsg->sm_NumArgs - 1))
    {
    /*
     * Loop through selected project icon(s)
     */
	for (file_index = 0; file_index < num_files; file_index++)
	{
        /*
         * Change to directory containing selected object (file)
         * then, open it
         * then, change back
         * then, run dialog window
         * (if error, try next file)
         */
	    LONG i = file_index;
	    CATCH_ERROR
	    {
		olddir = CurrentDir (WBenchMsg->sm_ArgList[i+1].wa_Lock);
		set_read (WBenchMsg->sm_ArgList[i+1].wa_Name);
		process_tooltypes (WBenchMsg->sm_ArgList[i+1].wa_Name);
		CurrentDir (olddir);
		workbench_dialog_loop ();
	    }
	    END_CATCH_ERROR;
	}
    }
    else
    {
    /* 
     * No project files selected
     */
	CATCH_ERROR
	{
	    workbench_dialog_loop ();
	}
	END_CATCH_ERROR;
    }
}


/*
 * The following functions permit the CLI interactive mode to be activated
 * from the workbench, and the CLI to be started from the workbench, and
 * to return the the original mode.
 */

static void workbench_dialog_loop (void)
{
    int next_action = WORKBENCH_MODE;
    BOOLEAN help_displayed = FALSE;

    within_workbench_loop = TRUE;
    Plot = ANY_PLOT;
    while (next_action == WORKBENCH_MODE ||
	   next_action == INTERACTIVE_MODE)
    {
	switch (next_action)
	{
	case WORKBENCH_MODE:
	    next_action = workbench_dialog ();
	    break;
	case INTERACTIVE_MODE:
	    if (!help_displayed)
	    {
		printf ("This is the GFFT CLI-interactive interface...\n");
		printf ("Enter WORKBENCH to return to dialog window.\n");
 	printf ("Enter QUIT to quit without returning to dialog window.\n");
		printf ("Enter HELP to see a complete list of commands.\n");
		help_displayed = TRUE;
	    }
	    cli_interactive_loop (FALSE);
	    next_action = WORKBENCH_MODE;
	    break;
	}
    }
    within_workbench_loop = FALSE;
}
	      
char *workbench_command (char *arguments)
{
    int previous_command_mode = CommandMode;

    if (within_workbench_loop)
    {
	CommandMode = WORKBENCH_MODE;
	return arguments;
    /*
     * return to workbench through cli_interactive_loop
     */
    }
    else
    {
	workbench_dialog_loop ();
	CommandMode = previous_command_mode;
    }
    return arguments;
}

static void process_tooltypes (UBYTE *name)
{
    int starting_error_count = Error_Count;
    struct DiskObject *disk_obp;

    if (disk_obp = GetDiskObject (name))
    {
	int i;
	char *tool;
	int previous_command_mode = CommandMode;

	CommandMode = BATCH_MODE;

	for (i = 0; tool = disk_obp->do_ToolTypes[i]; i++)
	{
	    if (!ignore_tooltype (tool))
	    {
		execute_command_line (tool, NULL);
	    }
	}

	CommandMode = previous_command_mode;
    }
    if (Error_Count > starting_error_count)
    {
	Tooltype_Errors += Error_Count - starting_error_count;
	Tooltype_Errors_Reported = FALSE;
    }
}



#endif  /* ifdef AMIGA */

[ RETURN TO DIRECTORY ]