//*************************************************************************//
// Filename:    FreshLocale.cpp
// Autor:       Christian Taulien of Strange Intelligence
// Purpose:     common localizing Localizing FRESH-Software by SI
// Creation:    31. März 1998
//*************************************************************************//

#include "global.h"
#include "FreshLocale.h"

#include <string.h>

#include <clib/locale_protos.h>
#include <clib/utility_protos.h>

CatalogC *glob_poCatalog = NULL;

CatalogC::CatalogC(char *arg_sName, ULONG arg_ulVersion /*= NULL*/, struct Locale *arg_poLocale /*= NULL*/)
/*S*/
{ 
  TRACE("Entry");
  m_poCatalog = NULL;
  openCatalog(arg_sName, arg_poLocale,
      OC_Version, arg_ulVersion,
      TAG_DONE);
}
/*E*/
CatalogC::CatalogC(char *arg_sName, struct Locale *arg_poLocale, ULONG arg_eTags ...)
/*S*/
{ 
  TRACE("Entry");
  m_poCatalog = NULL;
  openCatalog(arg_sName, arg_poLocale, (struct TagItem *) &arg_eTags);
}
/*E*/
CatalogC::~CatalogC()
/*S*/
{
  TRACE("Entry");
  closeCatalog();
}
/*E*/
BOOL CatalogC::openCatalog(char *arg_sName, struct Locale *arg_poLocale /*= NULL*/, struct TagItem *arg_poTagList /*= NULL*/)
/*S*/
{
  TRACE("Entry");
  // Schließen, wenn Katalog noch offen
  closeCatalog();

  // einfach versuchen den catalog zu öffnen
  m_poCatalog = OpenCatalogA(arg_poLocale, arg_sName, arg_poTagList);
return isOpen();
}
/*E*/
BOOL CatalogC::openCatalog(char *arg_sName, struct Locale *arg_poLocale, ULONG arg_eTags ...)
/*S*/
{
  TRACE("Entry");
  // rufe die richtige methode auf
return openCatalog(arg_sName, arg_poLocale, (struct TagItem *) &arg_eTags);
}
/*E*/
void CatalogC::closeCatalog()
/*S*/
{
  TRACE("Entry");
  // wenn Catalog überhaupt offen
  if (m_poCatalog)
  {
    CloseCatalog(m_poCatalog);
    m_poCatalog = NULL;
  } // if
}
/*E*/
char CatalogC::getShortCut(int arg_iStringNum)
/*S*/
{
  TRACE("Entry");
  char *sString = getString(arg_iStringNum);
  char cShortCut = '\0';

  // wenn string gefunden
  if (sString)
  {
    int iLen = strlen(sString);
    for (int i=0; i<iLen; ++i)
    {
      // wenn underscore gefunden und noch min. ein zeichen danach
      // vorhanden
      if (sString[i] == '_' && (i < iLen-1))
      {
        // shortcut gefunden. Schleife verlassen
        cShortCut = sString[i+1];
        break;
      } // if
    } // for
  } // if

return cShortCut;
}
/*E*/
char CatalogC::getShortCutLowerCase(int arg_iStringNum)
/*S*/
{ 
  TRACE("Entry");
return ToLower(getShortCut(arg_iStringNum));
}
/*E*/
unsigned char *CatalogC::getString(int arg_iStringNum)
/*S*/
{
  TRACE("Entry");
  // wenn ungültiger string
  if (!(SIFC_BETWEEN(arg_iStringNum, FIRST_POSSIBLE_TEXT, LAST_POSSIBLE_TEXT)
     || SIFC_BETWEEN(arg_iStringNum, FIRST_POSSIBLE_ERROR, LAST_POSSIBLE_ERROR)))
  {
    arg_iStringNum = T_UNDEFINED;
  } // if

  // wenn catalog offen
  if (m_poCatalog)
  {
    return GetCatalogStr(m_poCatalog, arg_iStringNum, glob_asInternCatalog[arg_iStringNum]);
  }
  else
  {
    return glob_asInternCatalog[arg_iStringNum];
  } // if
}
/*E*/

