head	1.21;
access;
symbols
	fontscreen:1.1;
locks; strict;
comment	@ * @;


1.21
date	94.12.07.02.33.27;	author jsshephe;	state Exp;
branches;
next	;


desc
@Actions when gadgets and menu items are pressed.
@


1.21
log
@Made a little correction in teh PREFS_DELETEClicked that remove a gcc warning.
@
text
@#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/gadtools.h>
#include <libraries/asl.h>
#include <stdio.h>
#include <stdlib.h>
#include "showprefs.h"

/* protos */
#ifdef __OPTIMIZE__
#include <inline/intuition.h>
#include <inline/gadtools.h>
#include <inline/exec.h>
#include <inline/asl.h>
#include <inline/dos.h>
#else
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/asl_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#endif

#ifdef __GNUC__
inline
#endif
struct SuffixList *FindNode(struct List *list, int number) {
    struct SuffixList *node= (struct SuffixList *)Suffix_List->lh_Head;
    int i;

    for (i=0; i < number; i++, node=(struct SuffixList *)node->sl_Node.ln_Succ) {};
    return node;
}

/* routine when gadget "Suffixes" in ListView is clicked. */
int PREFS_SUFFIXESClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
    struct SuffixList *node = FindNode(Suffix_List, msg->Code);

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIX],PrefsWnd,NULL,
	GTST_String, node->sl_Node.ln_Name,
	(TAG_DONE) );

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_COMMAND],PrefsWnd,NULL,
	GTST_String, node->command,
	(TAG_DONE) );

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_ASYNCH],PrefsWnd,NULL,
	GTCB_Checked, node->Asynch,
	(TAG_DONE) );

    /* GadgetID stores # in list of selected suffix */
    PrefsGadgets[PREFS_ASYNCH]->GadgetID =
    PrefsGadgets[PREFS_SUFFIX]->GadgetID =
    PrefsGadgets[PREFS_COMMAND]->GadgetID = msg->Code;

    #ifdef debug
	printf("Number put in  node is %d\n",PrefsGadgets[PREFS_SUFFIX]->GadgetID);
    #endif

    return TRUE;
}

/* routine when gadget "Save" is clicked. */
int PREFS_SAVEClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
    SavePrefs("env:show.prefs");
    SavePrefs("envarc:show.prefs");
    return FALSE;
}

/* routine when gadget "Suffix" is clicked. */
int PREFS_SUFFIXClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
    struct SuffixList *node;

   if (PrefsGadgets[PREFS_SUFFIX]->GadgetID != (UWORD)-1) {
	node = FindNode(Suffix_List, PrefsGadgets[PREFS_SUFFIX]->GadgetID);

	#ifdef debug
	    printf("Number of node is %d\n",PrefsGadgets[PREFS_SUFFIX]->GadgetID);
	    printf("previous suffix %s\n",node->sl_Node.ln_Name);
	#endif

	/* turn off the list first and then restore it */
	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	    (GTLV_Labels), ~0,
	    (TAG_DONE) );

	strcpy(node->sl_Node.ln_Name,GetString(PrefsGadgets[PREFS_SUFFIX]));

	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	    (GTLV_Labels), Suffix_List,
	    (TAG_DONE) );
    }
    return TRUE;
}

/* routine when gadget "Command" is clicked. */
int PREFS_COMMANDClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
    struct SuffixList *node;

    if (PrefsGadgets[PREFS_COMMAND]->GadgetID != (UWORD)-1) {
	node = FindNode(Suffix_List, PrefsGadgets[PREFS_COMMAND]->GadgetID);

	#ifdef debug
	    printf("Number of node is %d\n",PrefsGadgets[PREFS_COMMAND]->GadgetID);
	    printf("previous command %s\n",node->command);
	#endif

	/* turn off the list first and then restore it */
	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	    (GTLV_Labels), ~0,
	    (TAG_DONE) );

	strcpy(node->command,GetString(PrefsGadgets[PREFS_COMMAND]));

	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	    (GTLV_Labels), Suffix_List,
	    (TAG_DONE) );
    }

    return TRUE;
}

/* routine when gadget "Asynchronous" is clicked. */
int PREFS_ASYNCHClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
    struct SuffixList *node;

    if (PrefsGadgets[PREFS_ASYNCH]->GadgetID != (UWORD)-1) {
	node = FindNode(Suffix_List, PrefsGadgets[PREFS_ASYNCH]->GadgetID);

	#ifdef debug
	    printf("Number of node is %d\n",PrefsGadgets[PREFS_ASYNCH]->GadgetID);
	    printf("previous asynch is  %d\n",node->Asynch);
	#endif

	/* turn off the list first and then restore it */
	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	    (GTLV_Labels), ~0,
	    (TAG_DONE) );

	node->Asynch = (PrefsGadgets[PREFS_ASYNCH]->Flags & GFLG_SELECTED) ? TRUE : FALSE;

	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	    (GTLV_Labels), Suffix_List,
	    (TAG_DONE) );
    }

    return TRUE;
}

/* routine when gadget "Cancel" is clicked. */
int PREFS_CANCELClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
    return FALSE;
}

/* routine when gadget "New" is clicked. */
int PREFS_NEWClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
    struct SuffixList *NewNode = MakeNode("(New Suffix)","",TRUE);

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	(GTLV_Labels), ~0,
	(TAG_DONE) );

    if (NewNode != NULL) {
	AddHead(Suffix_List,(struct Node *)NewNode);


	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIX],PrefsWnd,NULL,
	    GTST_String, NewNode->sl_Node.ln_Name,
	    (TAG_DONE) );

	GT_SetGadgetAttrs(PrefsGadgets[PREFS_COMMAND],PrefsWnd,NULL,
	    GTST_String, NewNode->command,
	    (TAG_DONE) );

	GT_SetGadgetAttrs(PrefsGadgets[PREFS_ASYNCH],PrefsWnd,NULL,
	    GTCB_Checked, NewNode->Asynch,
	    (TAG_DONE) );

	/* GadgetID stores # in list of selected suffix */
	PrefsGadgets[PREFS_ASYNCH]->GadgetID =
	PrefsGadgets[PREFS_SUFFIX]->GadgetID =
	PrefsGadgets[PREFS_COMMAND]->GadgetID = 0;
    }
    else {
	Error("New suffix not created. Low on memory.");
    }

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	(GTLV_Labels), Suffix_List,
	(TAG_DONE) );

    return TRUE;
}


/* routine when gadget "Copy" is clicked. */
int PREFS_COPYClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {

    struct SuffixList *NewNode;
    struct SuffixList *node;

    if (PrefsGadgets[PREFS_SUFFIX]->GadgetID != (UWORD)-1) {
	node = FindNode(Suffix_List, PrefsGadgets[PREFS_SUFFIX]->GadgetID);

	/* turn off the list first and then restore it */
	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	    (GTLV_Labels), ~0,
	    (TAG_DONE) );

	NewNode= MakeNode(node->sl_Node.ln_Name,node->command, node->Asynch);

	if (NewNode != NULL) {
	    AddHead(Suffix_List,(struct Node *)NewNode);

	    GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIX],PrefsWnd,NULL,
		GTST_String, NewNode->sl_Node.ln_Name,
		(TAG_DONE) );

	    GT_SetGadgetAttrs(PrefsGadgets[PREFS_COMMAND],PrefsWnd,NULL,
		GTST_String, NewNode->command,
		(TAG_DONE) );

	    GT_SetGadgetAttrs(PrefsGadgets[PREFS_ASYNCH],PrefsWnd,NULL,
		GTCB_Checked, NewNode->Asynch,
		(TAG_DONE) );

	    /* GadgetID stores # in list of selected suffix */
	    PrefsGadgets[PREFS_ASYNCH]->GadgetID =
	    PrefsGadgets[PREFS_SUFFIX]->GadgetID =
	    PrefsGadgets[PREFS_COMMAND]->GadgetID = 0;

	}
	else {
	    Error("Suffix not copied. Low on memory.");
	}

	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	    (GTLV_Labels), Suffix_List,
	    (TAG_DONE) );

    } /* if */
    return TRUE;
}

/* routine when gadget "Delete" is clicked. */
int PREFS_DELETEClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
    struct SuffixList *node;

    if (PrefsGadgets[PREFS_SUFFIX]->GadgetID != (UWORD)-1) {
	node = FindNode(Suffix_List, PrefsGadgets[PREFS_SUFFIX]->GadgetID);

	/* turn off the list first and then restore it */
	GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	(GTLV_Labels), ~0,
	(TAG_DONE) );

	Remove((struct Node *)node);
	ResetGadgets(PrefsGadgets);
    }
    return TRUE;
}

int PREFS_USEClicked( struct IntuiMessage *msg, struct Gadget **PrefsGadgets ) {
   /* routine when gadget "Use" is clicked. */
    SavePrefs("env:show.prefs");
    return FALSE;
}

/* routine when (sub)item "Open..." is selected. */
int PrefsPREFS_OPEN( struct Gadget **PrefsGadgets ) {

    struct FileRequester *fr;
    char file[MAX_LENGTH];

    if (fr = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
	    ASLFR_Window,	    PrefsWnd,
	    ASLFR_TitleText,	    "Load Show Preferences",
	    ASLFR_InitialDrawer,    "SYS:prefs/presets",
	    ASLFR_InitialFile,	    "show.presets",
	    ASLFR_InitialPattern,   "#?.(prefs|presets)",
	    ASLFR_Flags1,	    FILF_PATGAD,
	    TAG_DONE)) {

	if (AslRequest(fr,NULL)) {
	    strcpy(file,fr->rf_Dir);
	    AddPart(file,fr->rf_File,MAX_LENGTH);
	    LoadPrefs(file,PrefsGadgets,FALSE,NULL);
	}
	FreeAslRequest(fr);
    }
    else {
	Error("Cannot allocate filerequester. Low on memory.");
    }
    return TRUE;
}

/* routine when (sub)item "About" is selected. */
int PrefsPREFS_ABOUT( struct Gadget **PrefsGadgets ) {
    static struct EasyStruct es = {
	sizeof(struct EasyStruct),
	0,
	"ShowPrefs About",
	"Prefs Version 1.0\n"
	"©1994 by Jeff Shepherd\n"
	"Send comments and suggestions to\n"
	"jsshephe@@undergrad.math.uwaterloo.ca\n"
	"Read my home page at: http://www.undergrad.math.uwaterloo.ca/~jsshephe/index.html",
	"OK"
    };

    EasyRequestArgs(PrefsWnd, &es, NULL, NULL);
    return TRUE;
}

/* routine when (sub)item "Quit" is selected. */
int PrefsPREFS_QUIT( struct Gadget **PrefsGadgets ) {
    return FALSE;
}

/* routine when (sub)item "Last Saved" is selected. */
int PrefsPREFS_LAST( struct Gadget **PrefsGadgets ) {
    LoadPrefs("envarc:show.prefs",PrefsGadgets,FALSE,NULL);
    return TRUE;
}

/* routine when (sub)item "Save as..." is selected. */
int PrefsPREFS_SAVEAS( struct Gadget **PrefsGadgets ) {

    struct FileRequester *fr;
    char file[MAX_LENGTH];

    if (fr = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
	    ASLFR_Window,	    PrefsWnd,
	    ASLFR_TitleText,	    "Save Show Preferences",
	    ASLFR_InitialDrawer,    "SYS:prefs/presets",
	    ASLFR_InitialFile,	    "show.presets",
	    ASLFR_Flags1,	    FILF_PATGAD | FILF_SAVE,
	    TAG_DONE)) {

	if (AslRequest(fr,NULL)) {
	    strcpy(file,fr->rf_Dir);
	    AddPart(file,fr->rf_File,MAX_LENGTH);
	    SavePrefs(file);
	}
	FreeAslRequest(fr);
    }
    else {
	Error("Cannot allocate filerequester. Low on memory.");
    }

    return TRUE;
}

/* routine when (sub)item "Restore" is selected. */
int PrefsPREFS_RESTORE( struct Gadget **PrefsGadgets )   {
    struct SuffixList *node, *NewNode;

    /* turn off the list first and then restore it */
    GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	(GTLV_Labels), ~0,
	(TAG_DONE) );

    Destroy_List(Suffix_List);
    for (node = (struct SuffixList *)Duplicate->lh_Head; node->sl_Node.ln_Succ;
      node=(struct SuffixList *)node->sl_Node.ln_Succ) {
	if (NewNode =MakeNode(node->sl_Node.ln_Name, node->command, node->Asynch)) {
	    AddTail(Suffix_List,(struct Node *)NewNode);
	}
	else {
	    Error("Suffix not copied. Low on memory.");
	}
    } /* for */

    ResetGadgets(PrefsGadgets);
    return TRUE;

}

/* Load preference file and reset gadgets */
void LoadPrefs(char *filename, struct Gadget **PrefsGadgets, BOOL Dup, struct List *DupList) {

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	(GTLV_Labels), ~0,
	(TAG_DONE) );

    Destroy_List(Suffix_List);
    Load(filename,Dup,DupList);

    ResetGadgets(PrefsGadgets);
}

/* reset suffix, command, Asynch gadgets */
void ResetGadgets(struct Gadget **PrefsGadgets) {

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIXES],PrefsWnd,NULL,
	(GTLV_Labels), Suffix_List,
	(TAG_DONE) );

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_SUFFIX],PrefsWnd,NULL,
	GTST_String, "",
	(TAG_DONE) );

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_COMMAND],PrefsWnd,NULL,
	GTST_String, "",
	(TAG_DONE) );

    GT_SetGadgetAttrs(PrefsGadgets[PREFS_ASYNCH],PrefsWnd,NULL,
	GTCB_Checked, FALSE,
	(TAG_DONE) );

    /* GadgetID stores # in list of selected suffix */
    PrefsGadgets[PREFS_ASYNCH]->GadgetID =
    PrefsGadgets[PREFS_SUFFIX]->GadgetID =
    PrefsGadgets[PREFS_COMMAND]->GadgetID = (UWORD)-1;
}
@
