/* Copyright 2010-2011 Fredrik Wikstrom. All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
**
** 1. Redistributions of source code must retain the above copyright
**    notice, this list of conditions and the following disclaimer.
**
** 2. Redistributions in binary form must reproduce the above copyright
**    notice, this list of conditions and the following disclaimer in the
**    documentation and/or other materials provided with the distribution.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
*/

#include "locale.h"
#include <proto/exec.h>

void InitLocaleInfo (struct LocaleInfo *li, CONST_STRPTR catalog) {
	struct LocaleIFace *ILocale;
	li->li_LocaleBase = OpenLibrary("locale.library", 52);
	li->li_ILocale = (struct LocaleIFace *)GetInterface(li->li_LocaleBase,
		"main", 1, NULL);
	if ((ILocale = li->li_ILocale)) {
		li->li_Catalog = OpenCatalog(NULL, catalog,
			OC_BuiltInCodeSet,	4,
			TAG_END);
	}
	li->li_CodeSet = li->li_Catalog ? li->li_Catalog->cat_CodeSet : 4;
}

void FreeLocaleInfo (struct LocaleInfo *li) {
	struct LocaleIFace *ILocale;
	if ((ILocale = li->li_ILocale)) {
		CloseCatalog(li->li_Catalog);
		DropInterface((struct Interface *)li->li_ILocale);
	}
	CloseLibrary(li->li_LocaleBase);
}

CONST_STRPTR GetString (struct LocaleInfo *li, LONG stringNum) {
	struct LocaleIFace *ILocale;
	LONG         *l;
	UWORD        *w;
	CONST_STRPTR  builtIn;

	l = (LONG *)CatCompBlock;

	while (*l != stringNum)
	{
		w = (UWORD *)((ULONG)l + 4);
		l = (LONG *)((ULONG)l + (ULONG)*w + 6);
	}
	builtIn = (CONST_STRPTR)((ULONG)l + 6);

	if ((ILocale = li->li_ILocale)) {
		return GetCatalogStr(li->li_Catalog, stringNum, builtIn);
	}
    return builtIn;
}

void TranslateHints (struct LocaleInfo *li, struct HintInfo *hi) {
	while (hi->hi_GadgetID != -1) {
		hi->hi_Text = (STRPTR)GetString(li, (int32)hi->hi_Text);
		hi++;
	}
}

void TranslateMenus (struct LocaleInfo *li, struct NewMenu *nm) {
	while (nm->nm_Type != NM_END) {
		if (nm->nm_Label != NM_BARLABEL)
			nm->nm_Label = (STRPTR)GetString(li, (int32)nm->nm_Label);
		nm++;
	}
}
