
/*
 *  MAIN.C
 *
 *  FILES
 *
 *  A file catalog program by Matthew Dillon.
 *
 *  (c)Copyright 1987 Matthew Dillon, All Rights Reserved.
 *
 */

#include "files.h"
#include <local/xmisc.h>

short Deemu[] = {
    'ST','RT', 0, 0,
    'NW','  ', 0, 8, -16, -8, 320, 100,
    'TE','XT', 0,42, 'De','fa','ul','t\0','s:','ca','ta','lo','g.','db',0,0,0,0,0,0,0,0,0,0,0,
    'EN','D ', 0, 0
};

#define NWOFF	8
#define DEFFILE 16

NW Nw = {
    0, 0, 0, 0, -1, -1,
    NEWSIZE|MOUSEBUTTONS|MOUSEMOVE|GADGETDOWN|GADGETUP|MENUPICK|CLOSEWINDOW,
    WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|NOCAREREFRESH|ACTIVATE,
    NULL, NULL, (ubyte *)"V1.2 by Matthew Dillon, Catalog Utility.", NULL,
    NULL, 182, 66, -1, -1, WBENCHSCREEN
};

WIN *Win;
RP  *Rp;

char FileName[128];

main()
{
    char resized = 0;
    char notdone = 1;
    char movebox = 0;
    char moveslider = 0;
    char addactive = 0;
    char noload = 1;
    char dontquit = 0;

    char mmove = 0;
    short mmy;

    IMESS *im;
    SCR   Scr;

    openlibs(INTUITION_LIB|GRAPHICS_LIB);

    GetScreenData(&Scr, sizeof(Scr), WBENCHSCREEN, NULL);

    initslider(&Nw);

    Nw.LeftEdge = Deemu[NWOFF+0];
    Nw.TopEdge	= Deemu[NWOFF+1];
    Nw.Width	= Deemu[NWOFF+2];
    Nw.Height	= Deemu[NWOFF+3];
    if (Nw.Width <= 0)
	Nw.Width += Scr.Width;
    if (Nw.Height <= 0)
	Nw.Height += Scr.Height;
    if (Nw.LeftEdge < 0)
	Nw.LeftEdge += Scr.Width - Nw.Width;
    if (Nw.TopEdge < 0)
	Nw.TopEdge  += Scr.Height- Nw.Height;
    if (Nw.LeftEdge < 0 || Nw.TopEdge < 0 || Nw.LeftEdge + Nw.Width > Scr.Width || Nw.TopEdge + Nw.Height > Scr.Height) {
	Nw.LeftEdge = Nw.TopEdge = 0;
	Nw.Width = 320;
	Nw.Height= 100;
    }
    {
	register char *ptr = (char *)(Deemu + DEFFILE);
	strcpy(FileName, ptr + strlen(ptr) + 1);
    }

    Win = OpenWindow(&Nw);
    failfalse(Win, "Unable to open window");
    Rp = Win->RPort;

    addmenus();
    addgadgets();
again:
    for (; notdone || dontquit;) {
	if (dontquit)
	    notdone = 1;
	dontquit = 0;
	WaitPort(Win->UserPort);
	while (im = GetMsg(Win->UserPort)) {
	    switch(im->Class) {
	    case NEWSIZE:
		resized = 1;
		break;
	    case MOUSEBUTTONS:
		break;
	    case MOUSEMOVE:
		mmove = 1;
		mmy = im->MouseY;
		break;
	    case GADGETDOWN:
		{
		    char *str = NULL;
		    short sel;
		    switch(getgadget(im, &sel, &str)) {
		    case GAD_SLIDER:
			moveslider = 1;
			movebox = 0;
			sliderhit();
			break;
		    case GAD_BIGBOX:
			moveslider = 0;
			movebox = 1;
			bigboxhit(im->MouseY, 0);
			break;
		    }
		}
		break;
	    case GADGETUP:
		{
		    char *str = NULL;
		    short sel;
		    switch(getgadget(im, &sel, &str)) {
		    case GAD_INFO:
			{
			    long fh = Open("raw:10/24/600/150/INFO", 1006);
			    if (fh) {
				char buf[8];
				fhprintf(fh, "\n\r\n\rVersion 1.1  Written by Matthew Dillon\n\r");
				fhprintf(fh, "(c)Copyright 1987 Matthew Dillon, All Rights Reserved.\n\n\r");
				fhprintf(fh, "    dillon@ucbvax.berkeley.edu     (ARPANET)\n\r");
				fhprintf(fh, "    ...!ihnp4!ucbvax!dillon        (USENET)\n\r");
				fhprintf(fh, "Matthew Dillon, 891 Regal Rd. Berkeley, Ca. 94708\n\n\r");
				fhprintf(fh, "This software is freely redistributable only.  This\n\r");
				fhprintf(fh, "software is NOT shareware\n\n\r");
				fhprintf(fh, "Thanks to Peter Da Silva for providing the filerequestor\n\r");
				fhprintf(fh, "\n\n    Any key to continue\n\r");
				Read(fh, buf, 1);
				Close(fh);
			    }
			}
			break;
		    case GAD_DEL:
			rem_selected(Highlighted, 0);
			break;
		    case GAD_UNDO:
			undo();
			break;
		    case GAD_ALL:
			selectall();
			redisplay(0);
			break;
		    case GAD_VOLUME:
			if (str[0])
			    add_volume(str);
			activate_vol();
			break;
		    case GAD_PATTERN:
			if (str[0]) {
			    title("Wait");
			    select_pattern(str, 0);
			}
			activate_pat();
			break;
		    case GAD_COMMENT:
			mod_comment(str);
			break;
		    case GAD_SLIDER:
			moveslider = 0;
			sliderhit();
			break;
		    case GAD_BIGBOX:
			movebox = 0;
			bigboxhit(im->MouseY, 1);
			break;
		    }
		}
		break;
	    case MENUPICK:
		switch(getmenu(im)) {
		case MEN_SAVE:
		    {
			FILE *fi;
			if (noload && NumEntries == 0) {
			    title("Did I just save you from making a mistake?");
			    break;
			}
			fi = fopen(FileName, "w");
			if (fi) {
			    save_database(fi);
			    if (ferror(fi)) {
				title("File Error");
				dontquit = 1;
			    } else {
				title("Saved ok");
				Modified = 0;
			    }
			    fclose(fi);
			} else {
			    title("Unable to open file for write");
			}
		    }
		    break;
		case MEN_SAVEAS:
		    {
			FILE *fi;
			if (stdfile("SAVE DATABASE", FileName, "", FileName)) {
			    noload = 0;
			    if (fi = fopen(FileName, "w")) {
				save_database(fi);
				if (ferror(fi)) {
				    title("File Error");
				    dontquit = 1;
				} else {
				    title("Saved ok");
				    Modified = 0;
				}
				fclose(fi);
			    } else {
				title("Unable to open file for write");
			    }
			}
		    }
		    break;
		case MEN_LOADEF:
		    {
			FILE *fi = fopen(FileName, "r");
			long entries = NumEntries;
			if (fi) {
			    noload = 0;
			    load_database(fi);
			    if (!entries)
				Modified = 0;
			    fclose(fi);
			} else {
			    title("Unable to open file for read");
			}
		    }
		    break;
		case MEN_LOAD:
		    {
			FILE *fi;
			long entries = NumEntries;
			if (stdfile("LOAD DATABASE", FileName, "", FileName)) {
			    noload = 0;
			    if (fi = fopen(FileName, "r")) {
				load_database(fi);
				if (!entries)
				    Modified = 0;
				fclose(fi);
			    } else {
				title("Unable to open file for read");
			    }
			}
		    }
		    break;
		case MEN_QUIT:
		    notdone = 0;
		    break;
		case MEN_KILLPAT:
		    resetsort();
		    addentry(KILLNAME, "", 0);
		    select_pattern(KILLNAME, 0);
		    break;
		}
		break;
	    case CLOSEWINDOW:
		notdone = 0;
		break;
	    }
	    ReplyMsg(im);
	    if (resized) {
		fixgadgets();
		redisplay(0);
	    }
	    resized = 0;
	}
	if (mmove) {
	    if (moveslider)
		sliderhit();
	    if (movebox)
		bigboxhit(mmy, 0);
	    mmove = 0;
	}
    }
    if (Modified) {
	title("MODIFICATIONS MADE!  HIT CLOSE-BOX AGAIN TO VERIFY");
	Modified = 0;
	notdone = 1;
	goto again;
    }
    failfalse(NULL, NULL);
}

failfalse(val, str)
long val;
char *str;
{
    if (val == NULL) {
	if (str)
	    puts(str);
	if (Win) {
	    remmenus();
	    remgadgets();
	    CloseWindow(Win);
	    Win = NULL;
	}
	closelibs(-1);
	exit((str)? 1 : 0);
    }
}

failtrue(val, str)
long val;
char *str;
{
    if (val)
	failfalse(NULL, str);
}

