/******************************************************************************

    MODUL
	prefs.c

    DESCRIPTION
	Everything to set, edit, get, load and save settings !

    NOTES

    BUGS

    TODO

    EXAMPLES

    SEE ALSO

    INDEX

    HISTORY
	14. Nov 1992	ada created

******************************************************************************/

/**************************************
		Includes
**************************************/
#include "defs.h"


/**************************************
	    Globale Variable
**************************************/


/**************************************
      Interne Defines & Strukturen
**************************************/


/**************************************
	    Interne Variable
**************************************/


/**************************************
	   Interne Prototypes
**************************************/

Prototype int  test_arg      (char *, int);
Prototype void do_margin     (void);
Prototype void do_wordwrap   (void);
Prototype void do_global     (void);
Prototype void do_setparcol  (void);
Prototype void do_tabstop    (void);
Prototype void do_chfilename (void);
Prototype void do_savetabs   (void);
Prototype void do_setfont    (void);
Prototype void do_ignorecase (void);
Prototype void loadconfig    (ED *);
Prototype void do_saveconfig (void);
Prototype void do_fgpen      (void);
Prototype void do_bgpen      (void);
Prototype void do_hgpen      (void);
Prototype void do_tpen	     (void);
Prototype void do_modified   (void);
Prototype void do_autoindent (void);
Prototype void do_sizewindow (void);
Prototype void do_autosplit   (void);
Prototype void do_taskpri     (void);
Prototype void do_debug       (void);


int test_arg (char * arg, int old)
{
    int erg = 0;

    if (*arg == 'o') {
	if (arg[1] == 'n')
	     erg = 1;
    } else if (*arg == 'y')
	erg = 1;
    else if (*arg == 't')
	erg = (old ? 0 : 1);

    return (erg);
} /* test_arg */


void do_margin (void)
{
    Ep->Margin = atoi((char *)av[1]);
} /* do_margin */


void do_wordwrap (void)
{
    if (Ep->Wordwrap = test_arg (av[1], Ep->Wordwrap))
	title("Wordwrap ON");
    else
	title("Wordwrap OFF");
} /* do_wordwrap() */


void do_global (void)
{
    if (global_search = test_arg (av[1], global_search))
	title ("Global search ON");
    else
	title ("Global search OFF");
} /* global_search */


void do_setparcol (void)
{
    Ep->WWCol = atoi ((char *)av[1]);
} /* do_setparcol() */


void do_tabstop (void)
{
    Ep->Tabstop = atoi ((char *)av[1]);
} /* do_tabstop() */


void do_insertmode (void)
{
    if (Ep->Insertmode = test_arg (av[1], Ep->Insertmode))
	title ("Insert mode on");
    else
	title ("Insert mode off");
} /* do_insertmode() */


void do_chfilename (void)
{
    text_sync ();

    strncpy ((char *)Ep->Name, (char *)av[1], 63);
    Ep->Name[63] = 0;

    MForceTitle = 1;
} /* do_chfilename */


void do_savetabs (void)
{
    Savetabs = test_arg (av[1], Savetabs);
} /* do_savetabs() */


/*
 *  SETFONT font size
 */

void do_setfont (void)
{
    FONT * font;
    ED	 * ep	= Ep;
    ULONG  size;

    size = atoi ((char *)av[2]);

    if (size > MAX_FONT_SIZE) {
	error ("setfont:\nSize %ld too large !", size);
	return;
    }

    font = (FONT *)GetFont ((char *)av[1], size);

    if (font) {
	text_sync ();

	if (ep->Font)
	    CloseFont (ep->Font);

	ep->Font = font;

	SetFont (ep->Win->RPort, font);
	SetRast (ep->Win->RPort, 0);
	RefreshWindowFrame (ep->Win);
	set_window_params ();
	text_redisplay ();
    } else {
	error ("setfont:\nUnable to find font\n%s/%ld", av[1], size);
    }
} /* do_setfont */


void do_ignorecase (void)
{
    ED *ep = Ep;

    ep->IgnoreCase = test_arg (av[1], ep->IgnoreCase);

    if (ep->IgnoreCase)
	title("Case InSensitive");
    else
	title("Case Sensitive");
} /* do_ignorecase */


void do_saveconfig (void)
{
    ED	 * ep = Ep;
    FILE * fi;
    WIN  * win = ep->Win;

   if (ep->iconmode) {
	ep->IWinx = win->LeftEdge;
	ep->IWiny = win->TopEdge;
   } else {
	ep->Winx      = win->LeftEdge;
	ep->Winy      = win->TopEdge;
	ep->Winwidth  = win->Width;
	ep->Winheight = win->Height;
   }

    if (fi = fopen("s:dme.config", "w")) {
	fwrite(&ep->BeginConfig, (char *)&ep->EndConfig - (char *)&ep->BeginConfig, 1, fi);
	fclose(fi);
    }
} /* do_saveconfig */


void loadconfig (ED * ep)
{
    FILE * fi;

    if (fi = fopen("s:dme.config", "r")) {
	fread(&ep->BeginConfig, (char *)&ep->EndConfig - (char *)&ep->BeginConfig, 1, fi);
	fclose(fi);
    }
} /* loadconfig */


void do_fgpen (void)
{
    Ep->FGPen = atoi((char *)av[1]);

    text_redisplay ();
} /* do_fgpen */


void do_tpen (void)
{
    Ep->TPen = atoi((char *)av[1]);

    text_redisplay ();
} /* do_tpen */


void do_bgpen (void)
{
    Ep->BGPen = atoi((char *)av[1]);

    text_redisplay ();
} /* do_bgpen */


void do_hgpen (void)
{
    Ep->HGPen = atoi((char *)av[1]);

    text_redisplay ();
} /* do_hgpen */


void do_modified (void)
{
    register ED *ep = Ep;

    if (av[1][0]) {
	switch(av[1][1] & 0x1F) {
	case 'n' & 0x1F:
	    ep->Modified = 1;
	    break;
	case 'f' & 0x1F:
	    ep->Modified = 0;
	    break;
	case 'o' & 0x1F:
	    ep->Modified = ep->Modified ? 0 : 1;
	    break;
	}
    }
} /* do_modified */


void do_autoindent (void)
{
    Ep->Autoindent = test_arg ((char *)av[1], Ep->Autoindent);

    if (Ep->Autoindent)
	title ("Autoindent ON");
    else
	title ("Autoindent OFF");
} /* do_autoindent */


void do_sizewindow (void)
{
    WIN * win = Ep->Win;
    struct NewWindow nw;
    int mdx, mdy;

    GeometryToNW (av[1], &nw);

    if (nw.LeftEdge + nw.Width <= win->WScreen->Width &&
	    nw.TopEdge + nw.Height <= win->WScreen->Height &&
	    nw.Width >= win->MinWidth &&
	    nw.Height >= win->MinHeight) {

	mdx = nw.LeftEdge - win->LeftEdge;
	mdy = nw.TopEdge - win->TopEdge;

	if (mdx > 0)
	    mdx = 0;

	if (mdy > 0)
	    mdy = 0;

	MoveWindow (win, mdx, mdy);
	SizeWindow (win, nw.Width - win->Width, nw.Height - win->Height);
	MoveWindow (win, nw.LeftEdge - win->LeftEdge, nw.TopEdge - win->TopEdge);
    }
}


void do_autosplit (void)
{
    Ep->Autosplit = test_arg (av[1], Ep->Autosplit);

    if (Ep->Autosplit)
	title ("AutoSplit is now ON");
    else
	title ("AutoSplit is now OFF");
} /* do_autosplit */


void do_taskpri (void)
{
    LONG pri;

    pri = atoi (av[1]);

    if (pri > 5 || pri < -5) {
	error ("taskpri:\nWrong TaskPri %ld. Taskpri must\nbe between -5 and 5 !", pri);
	return ;
    }

    SetTaskPri (FindTask(NULL), pri);
} /* do_taskpri */


void do_debug (void)
{
    debug = test_arg (av[1], debug);

    if (debug)
	title ("DEBUG is now ON");
    else
	title ("DEBUG is now OFF");
} /* do_debug */


/******************************************************************************
*****  ENDE prefs.c
******************************************************************************/
