/*

Directory Opus 4
Original GPL release version 4.12
Copyright 1993-2000 Jonathan Potter

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

All users of Directory Opus 4 (including versions distributed
under the GPL) are entitled to upgrade to the latest version of
Directory Opus version 5 at a reduced price. Please see
http://www.gpsoft.com.au for more information.

The release of Directory Opus 4 under the GPL in NO WAY affects
the existing commercial status of Directory Opus 5.

*/

#include "config.h"

void showcolourvals(pen,prop)
int pen,prop;
{
	int a,c;
	ULONG b,d,cbuf[3];

	SetAPen(rp,pen);
	RectFill(rp,
		x_off+252,y_off+34,
		x_off+287,y_off+45);
	if (version2>=OSVER_39) {
		GetRGB32(vp->ColorMap,pen,1,cbuf);
		for (a=0;a<3;a++) {
			scalecol(&cbuf[a]);
			lsprintf(palette_buf[a],"%ld",cbuf[a]);
			if (prop) FixSliderPot(Window,&palettegads[a],cbuf[a],1<<bpg,1,1);
			ShowSlider(Window,&palettegads[a]);
			RefreshGList(&palettegads[a+3],Window,NULL,1);
		}
	}
	else {
		b=GetRGB4(vp->ColorMap,pen);
		for (a=0,c=8;a<3;a++,c-=4) {
			d=(b>>c)&0xf;
			lsprintf(palette_buf[a],"%ld",d);
			if (prop) FixSliderPot(Window,&palettegads[a],d,1<<bpg,1,1);
			RefreshStrGad(&palettegads[a+3],Window);
		}
	}
}

void updatecolourvals(pen,show)
int pen,show;
{
	ULONG new[3],old[3];
	int a,b,ok=0;

	if (show==-1) {
		for (a=0;a<3;a++) {
			new[a]=atoi(palette_buf[a]);
			if (new[a]<0) new[a]=0;
			else if (new[a]>=(1<<bpg)) new[a]=(1<<bpg)-1;
			if (version2>=OSVER_39) scalecolup(&new[a]);
		}
		ok=1;	
	}
	else {
		if (version2>=OSVER_39) {
			GetRGB32(vp->ColorMap,pen,1,old);
			for (a=0;a<3;a++) {
				scalecol(&old[a]);
				if ((new[a]=GetSliderPos(&palettegads[a],1<<bpg,1))!=old[a]) ok=1;
				scalecolup(&new[a]);
			}
		}
		else {
			for (a=0,b=8;a<3;a++,b-=4)
				old[a]=(GetRGB4(vp->ColorMap,pen)>>b)&0xf;
			for (a=0;a<3;a++)
				if ((new[a]=GetSliderPos(&palettegads[a],1<<bpg,1))!=old[a]) ok=1;
		}
	}
	if (ok) {
		if (version2>=OSVER_39) SetRGB32(vp,pen,new[0],new[1],new[2]);
		else SetRGB4(vp,pen,new[0],new[1],new[2]);
	}
	showcolourvals(pen,show);
	get_palette(Screen,config->new_palette,1<<screen_depth);
}

void showscreencolours(which,fg,bg,special)
int which;
char **fg,**bg;
int special;
{
	int a,x,y,h;
	char buf[2];

	if (which&COLOURS_3DBOXES) {
		do3dbox(x_off+151,y_off+88,203,41);
		do3dbox(x_off+394,y_off+88,203,41);
		Do3DStringBox(rp,
			x_off+153,y_off+143,
			163,8,
			screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
		Do3DStringBox(rp,
			x_off+432,y_off+143,
			163,8,
			screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
		solidblock(rp,
			coloursgadgets[COLBIT_3DBOXES],
			x_off+162,y_off+168,
			208,10,1,0,3+special);
		if (fg) {
			*fg=&config->gadgettopcol; *bg=&config->gadgetbotcol;
		}
	}		
	if (which&COLOURS_STATUS) {
		solidblock(rp,
			coloursgadgets[COLBIT_STATUS],
			x_off+151,y_off+68,
			446,8,config->statusfg,config->statusbg,3+special);
		if (fg) {
			*fg=&config->statusfg; *bg=&config->statusbg;
		}
	}
	if (which&COLOURS_SELDISKNAME) {
		solidblock(rp,
			coloursgadgets[COLBIT_SELDISKNAME],
			x_off+151,y_off+78,
			221,8,config->disknameselfg,config->disknameselbg,1+special);
		if (fg) {
			*fg=&config->disknameselfg; *bg=&config->disknameselbg;
		}
	}
	if (which&COLOURS_DISKNAME) {
		solidblock(rp,
			coloursgadgets[COLBIT_DISKNAME],
			x_off+376,y_off+78,
			221,8,config->disknamefg,config->disknamebg,1+special);
		if (fg) {
			*fg=&config->disknamefg; *bg=&config->disknamebg;
		}
	}
	if (!special) {
		if (which&COLOURS_SELDIRECTORY) {
			solidblock(rp,
				coloursgadgets[COLBIT_SELDIRECTORY],
				x_off+151,y_off+88,
				203,8,config->dirsselfg,config->dirsselbg,0);
			if (fg) {
				*fg=&config->dirsselfg; *bg=&config->dirsselbg;
			}
		}
		if (which&COLOURS_DIRECTORY) {
			solidblock(rp,
				coloursgadgets[COLBIT_DIRECTORY],
				x_off+151,y_off+96,
				203,8,config->dirsfg,config->dirsbg,0);
			if (fg) {
				*fg=&config->dirsfg; *bg=&config->dirsbg;
			}
		}
		if (which&COLOURS_SELFILE) {
			solidblock(rp,
				coloursgadgets[COLBIT_SELFILE],
				x_off+151,y_off+104,
				203,8,config->filesselfg,config->filesselbg,0);
			if (fg) {
				*fg=&config->filesselfg; *bg=&config->filesselbg;
			}
		}
		if (which&COLOURS_FILE) {
			solidblock(rp,
				coloursgadgets[COLBIT_FILE],
				x_off+151,y_off+112,
				203,8,config->filesfg,config->filesbg,0);
			solidblock(rp,
				NULL,
				x_off+151,y_off+120,
				203,9,config->filesfg,config->filesbg,0);
			solidblock(rp,
				NULL,
				x_off+394,y_off+88,
				203,41,config->filesfg,config->filesbg,0);
			if (fg) {
				*fg=&config->filesfg; *bg=&config->filesbg;
			}
		}
	}
	if (which&COLOURS_SLIDERS) {
		do3dbox(x_off+151,y_off+131,167,9);
		do3dbox(x_off+430,y_off+131,167,9);
		do3dbox(x_off+358,y_off+88,14,23);
		do3dbox(x_off+376,y_off+88,14,23);
		if (!special) {
			SetAPen(rp,screen_pens[config->sliderbgcol].pen);
			RectFill(rp,
				x_off+151,y_off+131,
				x_off+317,y_off+139);
			RectFill(rp,
				x_off+430,y_off+131,
				x_off+596,y_off+139);

			RectFill(rp,
				x_off+358,y_off+88,
				x_off+371,y_off+110);
			RectFill(rp,
				x_off+376,y_off+88,
				x_off+389,y_off+110);

			SetAPen(rp,screen_pens[config->slidercol].pen);
			RectFill(rp,
				x_off+153,y_off+132,
				x_off+259,y_off+138);
			RectFill(rp,
				x_off+432,y_off+132,
				x_off+540,y_off+138);

			RectFill(rp,
				x_off+360,y_off+89,
				x_off+369,y_off+102);
			RectFill(rp,
				x_off+378,y_off+89,
				x_off+387,y_off+102);
		}
		if (fg) {
			*fg=&config->slidercol; *bg=&config->sliderbgcol;
		}
	}
	if (which&COLOURS_ARROWS) {
		x=x_off+322; y=y_off+131;
		h=9;
		for (a=0;a<4;a++) {
			do3dbox(x,y,14,h);
			do3dbox(x+18,y,14,h);
			DoArrow(rp,x,y,14,h,
				screen_pens[config->arrowfg].pen,screen_pens[config->arrowbg].pen,3);
			DoArrow(rp,x+18,y,14,h,
				screen_pens[config->arrowfg].pen,screen_pens[config->arrowbg].pen,2);

			if (a==1) {
				x=x_off+322;
				y+=h+2;
				++h;
			}
			else x+=72;
		}

		for (a=0;a<2;a++) {
			do3dbox(x_off+358,y_off+113+(a*9),14,7);
			do3dbox(x_off+376,y_off+113+(a*9),14,7);
			if (!special) {
				DoArrow(rp,
					x_off+358,y_off+113+(a*9),
					14,7,
					screen_pens[config->arrowfg].pen,screen_pens[config->arrowbg].pen,a);
				DoArrow(rp,
					x_off+376,y_off+113+(a*9),
					14,7,
					screen_pens[config->arrowfg].pen,screen_pens[config->arrowbg].pen,a);
			}
		}
		if (fg) {
			*fg=&config->arrowfg; *bg=&config->arrowbg;
		}
	}
	if (which&COLOURS_TINYGADS) {
		buf[1]=0;
		buf[0]=cfg_string[STR_COLOURS_TINY_GADS][0];
		solidblock(rp,
			buf,
			x_off+358,y_off+131,
			14,9,config->littlegadfg,config->littlegadbg,3+special);
		buf[0]=cfg_string[STR_COLOURS_TINY_GADS][1];
		solidblock(rp,
			buf,
			x_off+376,y_off+131,
			14,9,config->littlegadfg,config->littlegadbg,3+special);
		buf[0]=cfg_string[STR_COLOURS_TINY_GADS][2];
		solidblock(rp,
			buf,
			x_off+358,y_off+142,
			14,10,config->littlegadfg,config->littlegadbg,3+special);
		buf[0]=cfg_string[STR_COLOURS_TINY_GADS][3];
		solidblock(rp,
			buf,
			x_off+376,y_off+142,
			14,10,config->littlegadfg,config->littlegadbg,3+special);

		for (a=0;a<6;a++) {
			buf[0]=cfg_string[STR_COLOURS_TINY_GADS][4+a];
			solidblock(rp,
				buf,
				x_off+493+(a*18),y_off+154,
				14,8,config->littlegadfg,config->littlegadbg,3+special);
		}
		if (fg) {
			*fg=&config->littlegadfg; *bg=&config->littlegadbg;
		}
	}
	if (which&COLOURS_CLOCK) {
		solidblock(rp,
			coloursgadgets[COLBIT_CLOCK],
			x_off+151,y_off+154,
			338,8,config->clockfg,config->clockbg,3+special);
		if (fg) {
			*fg=&config->clockfg; *bg=&config->clockbg;
		}
	}
	if (which&COLOURS_REQUESTER) {
		solidblock(rp,
			coloursgadgets[COLBIT_REQUESTER],
			x_off+378,y_off+168,
			208,10,config->requestfg,config->requestbg,3+special);
		if (fg) {
			*fg=&config->requestfg; *bg=&config->requestbg;
		}
	}
	if (which&COLOURS_STRINGS) {
		solidblock(rp,
			cfg_string[STR_COLOR_PATHNAME],
			x_off+153,y_off+143,
			163,8,version2?config->stringfgcol:1,version2?config->stringbgcol:0,0);
		if (fg) {
			*fg=&config->stringfgcol; *bg=&config->stringbgcol;
		}
	}
	if (which&COLOURS_SELSTRINGS) {
		solidblock(rp,
			cfg_string[STR_COLOR_SELPATHNAME],
			x_off+432,y_off+143,
			163,8,version2?config->stringselfgcol:1,version2?config->stringselbgcol:0,0);
		if (fg) {
			*fg=&config->stringselfgcol; *bg=&config->stringselbgcol;
		}
	}
	SetAPen(rp,screen_pens[1].pen);
	SetBPen(rp,screen_pens[0].pen);
}

void solidblock(r,txt,x,y,w,h,fg,bg,bord)
struct RastPort *r;
char *txt;
int x,y,w,h,fg,bg,bord;
{
	if (bord&1)
		Do3DBox(r,x,y,w,h,screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
	if (!(bord&4)) {
		SetAPen(r,screen_pens[bg].pen);
		RectFill(r,x,y,x+w-1,y+h-1);
		if (txt) {
			SetAPen(r,screen_pens[fg].pen);
			SetBPen(r,screen_pens[bg].pen);
			UScoreText(r,txt,(bord&2)?x+((w-(strlen(txt)*8))/2):x,y+((h-8)/2)+6,-1);
			SetBPen(rp,screen_pens[0].pen);
		}
	}
}

void showcolourscycle(fg,bg,sel)
int fg,bg,sel;
{
	SetAPen(rp,screen_pens[1].pen);
	DoCycleGadget(&coloursgad,Window,coloursgadgets,sel);
	if (sel==COLBIT_3DBOXES) showfuncob(rp,cfg_string[STR_EXAMPLE],1,0,CFG_GADGET,x_off+302,y_off+23);
	else showfuncob(rp,cfg_string[STR_EXAMPLE],fg,bg,CFG_GADGET,x_off+302,y_off+23);
}
