/*
 * Copyright 2011 Vincent Sanders <vince@netsurf-browser.org>
 *
 * This file is part of NetSurf, http://www.netsurf-browser.org/
 *
 * NetSurf 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; version 2 of the License.
 *
 * NetSurf 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, see <http://www.gnu.org/licenses/>.
 */

/** \file
 * System colour handling
 *
 */

#include "utils/utils.h"
#include "utils/log.h"
#include "desktop/gui.h"
#include "desktop/options.h"

struct gui_system_colour_ctx {
	const char *name;
	int length;
	css_color colour;
	colour *option_colour;
	lwc_string *lwcstr;
};

static struct gui_system_colour_ctx colour_list[] = { 
	{ 
		"ActiveBorder", 
		SLEN("ActiveBorder"), 
		0xff000000, 
		&nsoption_charp(sys_colour_ActiveBorder), 
		NULL 
	}, { 
		"ActiveCaption", 
		SLEN("ActiveCaption"), 
		0xffdddddd, 
		&nsoption_charp(sys_colour_ActiveCaption), 
		NULL 
	}, { 
		"AppWorkspace", 
		SLEN("AppWorkspace"), 
		0xffeeeeee, 
		&nsoption_charp(sys_colour_AppWorkspace), 
		NULL 
	}, { 
		"Background", 
		SLEN("Background"), 
		0xff0000aa, 
		&nsoption_charp(sys_colour_Background), 
		NULL 
	}, {
		"ButtonFace", 
		SLEN("ButtonFace"), 
		0xffaaaaaa, 
		&nsoption_charp(sys_colour_ButtonFace), 
		NULL 
	}, {
		"ButtonHighlight", 
		SLEN("ButtonHighlight"), 
		0xffdddddd, 
		&nsoption_charp(sys_colour_ButtonHighlight), 
		NULL
	}, {
		"ButtonShadow", 
		SLEN("ButtonShadow"), 
		0xffbbbbbb, 
		&nsoption_charp(sys_colour_ButtonShadow), 
		NULL 
	}, {
		"ButtonText", 
		SLEN("ButtonText"), 
		0xff000000, 
		&nsoption_charp(sys_colour_ButtonText), 
		NULL 
	}, {
		"CaptionText", 
		SLEN("CaptionText"), 
		0xff000000, 
		&nsoption_charp(sys_colour_CaptionText), 
		NULL 
	}, {
		"GrayText", 
		SLEN("GrayText"), 
		0xffcccccc, 
		&nsoption_charp(sys_colour_GrayText), 
		NULL 
	}, {
		"Highlight", 
		SLEN("Highlight"), 
		0xff0000ee, 
		&nsoption_charp(sys_colour_Highlight), 
		NULL 
	}, {
		"HighlightText", 
		SLEN("HighlightText"), 
		0xff000000, 
		&nsoption_charp(sys_colour_HighlightText), 
		NULL 
	}, {
		"InactiveBorder", 
		SLEN("InactiveBorder"), 
		0xffffffff, 
		&nsoption_charp(sys_colour_InactiveBorder), 
		NULL 
	}, {
		"InactiveCaption", 
		SLEN("InactiveCaption"), 
		0xffffffff, 
		&nsoption_charp(sys_colour_InactiveCaption), 
		NULL 
	}, {
		"InactiveCaptionText", 
		SLEN("InactiveCaptionText"), 
		0xffcccccc, 
		&nsoption_charp(sys_colour_InactiveCaptionText), 
		NULL 
	}, {
		"InfoBackground", 
		SLEN("InfoBackground"), 
		0xffaaaaaa, 
		&nsoption_charp(sys_colour_InfoBackground), 
		NULL 
	}, {
		"InfoText", 
		SLEN("InfoText"), 
		0xff000000, 
		&nsoption_charp(sys_colour_InfoText), 
		NULL 
	}, {
		"Menu", 
		SLEN("Menu"), 
		0xffaaaaaa, 
		&nsoption_charp(sys_colour_Menu), 
		NULL 
	}, {
		"MenuText", 
		SLEN("MenuText"), 
		0xff000000, 
		&nsoption_charp(sys_colour_MenuText), 
		NULL 
	}, {
		"Scrollbar", 
		SLEN("Scrollbar"), 
		0xffaaaaaa, 
		&nsoption_charp(sys_colour_Scrollbar), 
		NULL 
	}, {
		"ThreeDDarkShadow", 
		SLEN("ThreeDDarkShadow"), 
		0xff555555, 
		&nsoption_charp(sys_colour_ThreeDDarkShadow), 
		NULL 
	}, {
		"ThreeDFace", 
		SLEN("ThreeDFace"), 
		0xffdddddd, 
		&nsoption_charp(sys_colour_ThreeDFace), 
		NULL 
	}, {
		"ThreeDHighlight", 
		SLEN("ThreeDHighlight"), 
		0xffaaaaaa, 
		&nsoption_charp(sys_colour_ThreeDHighlight), 
		NULL 
	}, {
		"ThreeDLightShadow", 
		SLEN("ThreeDLightShadow"), 
		0xff999999, 
		&nsoption_charp(sys_colour_ThreeDLightShadow), 
		NULL 
	}, {
		"ThreeDShadow", 
		SLEN("ThreeDShadow"), 
		0xff777777, 
		&nsoption_charp(sys_colour_ThreeDShadow), 
		NULL 
	}, {
		"Window", 
		SLEN("Window"), 
		0xffaaaaaa, 
		&nsoption_charp(sys_colour_Window), 
		NULL 
	}, {
		"WindowFrame", 
		SLEN("WindowFrame"), 
		0xff000000, 
		&nsoption_charp(sys_colour_WindowFrame), 
		NULL 
	}, {
		
		"WindowText", 
		SLEN("WindowText"), 
		0xff000000, 
		&nsoption_charp(sys_colour_WindowText), 
		NULL 
	},

};

#define colour_list_len (sizeof(colour_list) / sizeof(struct gui_system_colour_ctx))

static struct gui_system_colour_ctx *gui_system_colour_pw = NULL;


bool gui_system_colour_init(void)
{
	unsigned int ccount;

	if (gui_system_colour_pw != NULL) 
		return false;

	/* Intern colour strings */
	for (ccount = 0; ccount < colour_list_len; ccount++) {
		if (lwc_intern_string(colour_list[ccount].name, 
				      colour_list[ccount].length, 
				      &(colour_list[ccount].lwcstr)) != lwc_error_ok) {
			return false;
		}
	}

	/* pull in options if set (ie not transparent) */
	for (ccount = 0; ccount < colour_list_len; ccount++) {
		if (*(colour_list[ccount].option_colour) != 0) {
			colour_list[ccount].colour = *(colour_list[ccount].option_colour);
		}
	}

	gui_system_colour_pw = colour_list;
	
	return true;
}

void gui_system_colour_finalize(void)
{
	unsigned int ccount;

	for (ccount = 0; ccount < colour_list_len; ccount++) {
		lwc_string_unref(colour_list[ccount].lwcstr);
	}
}

colour gui_system_colour_char(const char *name)
{
	colour ret = 0xff00000;
	unsigned int ccount;

	for (ccount = 0; ccount < colour_list_len; ccount++) {
		if (strcmp(name, colour_list[ccount].name) == 0) {
			ret = colour_list[ccount].colour;
			break;
		}
	}
	return ret;
}

css_error gui_system_colour(void *pw, lwc_string *name, css_color *colour)
{
	unsigned int ccount;
	bool match;

	for (ccount = 0; ccount < colour_list_len; ccount++) {
		if (lwc_string_caseless_isequal(name, 
				colour_list[ccount].lwcstr,
				&match) == lwc_error_ok && match) {
			*colour = colour_list[ccount].colour;
			return CSS_OK;
		}
	}	

	return CSS_INVALID;
}